WAS란

 WAS (Web Application Server)는 웹 애플리케이션 및 웹 서비스를 호스팅하는 서버입니다. 백엔드 개발의 일부분을 포함하긴 하지만, "백엔드" 자체를 의미하는 것은 아닙니다. WAS의 주요 기능은 다음과 같습니다: 1. **HTTP 요청 처리**: 클라이언트 (웹 브라우저나 다른 클라이언트 앱)로부터의 HTTP 요청을 수신하고 적절한 응답을 반환합니다. 2. **비즈니스 로직 실행**: WAS는 데이터베이스 연결, 비즈니스 로직 처리, 데이터 처리 등의 서버 측 로직을 실행합니다. 3. **애플리케이션 생명 주기 관리**: WAS는 웹 애플리케이션의 생명 주기를 관리하고, 필요한 리소스 (예: 데이터베이스 연결)를 할당하거나 회수합니다. 4. **보안**: WAS는 웹 애플리케이션의 보안을 지원하는 기능, 예를 들어, 인증과 인가, SSL/TLS를 제공합니다. 보통 백엔드 시스템은 다음과 같은 주요 컴포넌트로 구성됩니다: 1. **Web Server (예: Apache, Nginx)**: HTTP 요청을 수신하고 정적 파일 (HTML, CSS, JS, 이미지 등)을 제공하는 서버입니다. 2. **Web Application Server (예: Tomcat, WebLogic, JBoss, Node.js)**: 동적 콘텐츠 처리와 비즈니스 로직을 실행하는 서버입니다. 3. **Database Server (예: MySQL, PostgreSQL, MongoDB)**: 데이터 저장, 검색, 수정, 삭제 등의 데이터베이스 작업을 처리합니다. WAS는 이 중에서 웹 애플리케이션의 동적 콘텐츠와 비즈니스 로직을 처리하는 역할을 합니다. 그러나 "백엔드"는 WAS 뿐만 아니라 웹 서버, 데이터베이스 서버, API 서버 등 전체 시스템을 포함하는 더 넓은 개념입니다.

python join

 Python의 `"".join(test)` 구문은 문자열 리스트를 하나의 문자열로 결합하는데 사용됩니다. 이 구문이 처음에는 다소 직관적이지 않게 느껴질 수 있습니다, 특히 다른 프로그래밍 언어의 접근 방식에 익숙한 경우에는 더욱 그렇습니다. 예를 들면, JavaScript에서는 문자열 배열의 `join` 메서드를 사용하여 문자열을 결합하므로, 그것이 좀 더 직관적일 수 있습니다: ```javascript let test = ["a", "b", "c"]; let result = test.join(""); ``` 반면 Python에서는 다음과 같이 작성됩니다: ```python test = ["a", "b", "c"] result = "".join(test) ``` Python에서의 `join` 메서드는 문자열 객체에서 호출되며, 인자로 주어진 리스트나 반복 가능한 객체의 항목들을 해당 문자열로 결합합니다. 이 구문의 장점 중 하나는 다양한 구분자를 사용하여 문자열을 결합할 수 있다는 것입니다. 예를 들어, 쉼표와 공백을 사용하여 문자열을 결합하려면: ```python result = ", ".join(test)  # 결과: 'a, b, c' ``` 이런 방식이 Pythonic이라고 여겨질 수 있으며, Python 커뮤니티에서는 꽤 흔하게 사용됩니다. 그렇지만, 처음 접하면 이 구문이 다소 낯설게 느껴질 수 있습니다. ## 왜 이렇게 생기지 않은 거지? test.join(""); Python의 `str.join()` 메서드의 디자인 선택에 대한 정확한 이유를 알려면 언어의 설계자와 초기 개발자들의 의도와 고려 사항을 파악해야 합니다. 그러나 일반적으로 알려진 몇 가지 이유와 특징을 바탕으로 이 설계 선택에 대해 이해할 수 있습니다: 1. **타입 안정성...

python sort() vs sorted()

 `sort()`와 `sorted()`는 둘 다 파이썬에서 리스트나 이터러블 객체를 정렬하는 데 사용되는 함수/메서드입니다. 그러나 사용법과 반환값, 적용 대상에 차이가 있습니다. 1. **`sort()`**:     - `sort()`는 리스트 자료형의 메서드입니다. 그렇기 때문에 리스트에서만 사용됩니다.     - 원본 리스트를 직접 수정하며, 반환 값은 `None`입니다.     - 사용 예:       ```python       numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]       numbers.sort()       print(numbers)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]       ``` 2. **`sorted()`**:     - `sorted()`는 파이썬의 내장 함수로, 모든 이터러블(리스트, 튜플, 딕셔너리, 문자열 등)에 사용될 수 있습니다.     - 원본 객체를 수정하지 않고, 정렬된 새로운 리스트를 반환합니다.     - 사용 예:       ```python       numbers = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)       sorted_numbers = sorted(numbers)       print(sorted_numbers)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]       ``` 주요 차이점을 요약하면: - `sort()`는 리스트에서만 사용되며 원본을 직접 수정합니다. - `sorted()`는 모든 ...

react props

 React에서 `props`는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는 메커니즘입니다.  다음은 `props`를 사용하여 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는 기본적인 방법입니다: 1. **자식 컴포넌트 정의**: 먼저, 자식 컴포넌트를 정의하고 `props`를 사용하여 전달받은 데이터를 활용합니다. ```jsx function ChildComponent(props) {   return <div>{props.message}</div>; } ``` 2. **부모 컴포넌트에서 자식 컴포넌트 사용**: 부모 컴포넌트에서 자식 컴포넌트를 사용하면서 `props` 값을 설정하여 전달합니다. ```jsx function ParentComponent() {   return <ChildComponent message="Hello from Parent!" />; } ``` 또한, 비구조화 할당 (destructuring)을 사용하여 `props`를 더 깔끔하게 활용할 수 있습니다: ```jsx function ChildComponent({ message }) {   return <div>{message}</div>; } ``` 이렇게 하면 `props` 내부의 특정 속성만을 직접적으로 접근할 수 있어 코드가 간결해집니다. 추가적으로, `props`를 사용하여 함수나 이벤트 핸들러도 자식 컴포넌트로 전달할 수 있습니다. 이를 통해 부모-자식 컴포넌트 간의 상호작용을 구현할 수 있습니다. React의 `props`는 읽기 전용입니다. 즉, 자식 컴포넌트 내에서 `props`의 값을 직접 변경할 수 없습니다. 값을 변경해야 할 경우, 부모 컴포넌트로부터 상태 변경 함수 (예: `setState` 또는 `useState`의 상태 업데이트 함수)를 함께 전달받아 사용합니다.

react component 반복되는 패턴을 최적화

 ## react component 반복되는 패턴을 최적화 같은 구성이 반복된다면 여러 방법으로 최적화를 고려할 수 있습니다. 주요 목적은 코드의 중복을 줄이고, 확장성과 유지 보수성을 향상시키는 것입니다. 1. **컴포넌트 팩토리 생성**:    - 컴포넌트를 동적으로 생성하는 함수나 클래스를 만듭니다. 이를 통해 `props`를 기반으로 필요한 컴포넌트를 반환하도록 설계할 수 있습니다. 2. **Higher Order Component (HOC)**:    - HOC는 컴포넌트를 받아서 새로운 컴포넌트를 반환하는 함수입니다. 이를 통해 공통적인 로직을 재사용할 수 있습니다. 3. **Hooks 사용**:    - React의 `useEffect`, `useState`와 같은 기본 Hooks 또는 커스텀 Hooks를 사용하여 반복되는 로직을 분리하고 재사용할 수 있습니다. 4. **Context API 활용**:    - React의 Context API를 사용하면 컴포넌트 트리 전체에서 데이터를 쉽게 전달하고 접근할 수 있습니다. 이를 통해 매번 `props`를 통해 데이터를 전달하는 대신, 필요한 컴포넌트에서 데이터를 직접 읽어올 수 있습니다. 5. **컴포넌트 분리 및 모듈화**:    - 재사용 가능한 작은 컴포넌트로 분리합니다. 각 컴포넌트가 하나의 역할만 수행하도록 설계하면, 코드의 중복성을 줄이고 가독성을 향상시킬 수 있습니다. 6. **메모이제이션**:    - `React.memo` 또는 `useMemo`를 사용하여 컴포넌트의 불필요한 렌더링을 방지합니다. 이는 특히 성능 최적화에 유용합니다. 구체적인 최적화 방안은 해당 코드나 구조의 세부 사항에 따라 달라질 수 있습니다. 위의 방법들 중 일부 또는 복합적으로 사용하여 반복되는 패턴을 최적화하면 좋습니다. 컴포넌트 팩토리(Component Factory)는 React 자체의 공식...

클릭 재킹이란

 클릭재킹(Clickjacking)은 사용자가 의도한 것과 다른 작업을 수행하게 만드는 공격 방식입니다. 이 공격자는 투명한 레이어나 숨겨진 프레임을 사용하여 사용자가 클릭하려고 의도한 웹 페이지 위에 다른 웹 페이지를 겹칩니다. 사용자는 자신이 클릭하려고 했던 버튼을 클릭하는 줄 알지만 실제로는 공격자가 의도한 다른 버튼이나 링크를 클릭하게 됩니다. 이로 인해 사용자는 무의식적으로 위험한 행동을 할 수 있게 됩니다. 클릭재킹을 막기 위한 몇 가지 방법은 다음과 같습니다: 1. **X-Frame-Options (XFO) 헤더 사용**: 웹 서버의 응답 헤더에 X-Frame-Options를 설정하여 페이지가 iframe 내에서 로드되지 않도록 할 수 있습니다. 예를 들면, `X-Frame-Options: DENY` 또는 `X-Frame-Options: SAMEORIGIN` 설정을 사용하면 됩니다. 2. **Content Security Policy (CSP)**: CSP의 `frame-ancestors` 지시문을 사용하여 특정 소스에서만 페이지를 임베드 할 수 있도록 제한할 수 있습니다. 3. **프레임 버스팅 스크립트**: 자바스크립트를 사용하여 웹페이지가 iframe 내에서 로드되었는지 확인하고, 로드된 경우 웹페이지를 전체 브라우저 창으로 재로드하는 기술입니다. 4. **시각적 확인**: 웹 사이트에서 중요한 행동을 수행하기 전에 추가적인 시각적 확인(예: CAPTCHA 또는 슬라이더)을 요구함으로써 사용자의 의도된 행동을 확인할 수 있습니다. 5. **사용자 인식 훈련**: 사용자에게 클릭재킹 공격에 대한 정보를 제공하여 그들이 의심스러운 웹사이트나 행동을 발견할 때 조심스러워하게 만드는 것도 중요합니다. 이러한 방법들 중 일부 또는 모두를 조합하여 클릭재킹 공격으로부터 웹사이트를 보호할 수 있습니다.

markdown test

#Woo hoo! [Markdown](http://daringfireball.net/projects/markdown/) is cool! ```javascript // Verify code highlighting if (today==rainy) { return false; } ``` html 보기에서 작성해주면 된다

capacitor.js

A cross-platform native runtime for web apps. https://capacitorjs.com/

pixijs

가장 빠르고 유연한 2D WebGL 렌더러를 사용하여 아름다운 디지털 콘텐츠를 제작하세요. https://pixijs.com/

Docker vs Docker compose

Docker와 Docker Compose는 모두 컨테이너화된 애플리케이션의 배포와 실행을 도와주는 도구입니다. 하지만 주요 사용 용도와 기능에서 차이가 있습니다. ### Docker: 1. **컨테이너 플랫폼**: Docker는 애플리케이션과 그 의존성을 컨테이너에 패키징하여, 어디에서든 동일한 환경으로 실행할 수 있게 해줍니다. 2. **도커 명령어**: Docker CLI를 통해 이미지를 빌드, 실행, 중지하고 컨테이너를 관리할 수 있습니다. 예를 들어 `docker build`, `docker run`, `docker stop` 등의 명령어가 있습니다. 3. **Dockerfile**: 애플리케이션과 의존성을 포함하는 Docker 이미지를 생성하기 위한 설명서입니다. 간단하게 말하자면 개별 상자: 하나의 프로그램 또는 서비스를 독립적으로 실행할 수 있는 작은 상자(컨테이너)를 만드는 도구입니다. 명령어 예: docker run 이미지이름으로 상자(컨테이너)를 열 수 있습니다. ### Docker Compose: 1. **다중 컨테이너 애플리케이션**: Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 관리하는 도구입니다. 예를 들면, 웹 서버, 데이터베이스, 캐시 서버 등 여러 서비스로 구성된 애플리케이션을 한번에 관리할 수 있습니다. 2. **YAML 파일**: `docker-compose.yml` 파일에 여러 서비스, 네트워크, 볼륨 등을 정의합니다. 이 파일을 사용하여 전체 애플리케이션 스택을 시작, 중지, 빌드할 수 있습니다. 3. **명령어 간소화**: `docker-compose up` 명령어 하나로 `docker-compose.yml`에 정의된 모든 서비스를 시작할 수 있습니다. 이와 유사하게 `docker-compose down`으로 모든 서비스를 중지할 수 있습니다. 간단하게 말하자면 상자 세트: 여러 개의 상자(컨테이너)를 동시에 다루기 위한 도구입니다. ...

MAC (Media Access Control) 주소

MAC (Media Access Control) 주소는 네트워크 장치들이 통신을 할 때 해당 장치를 구분하기 위한 고유의 주소입니다. MAC 주소는 보안 정보라기보다는 장치의 고유 식별자로 볼 수 있습니다. 그러나 MAC 주소는 다음과 같은 이유로 보안 측면에서 중요할 수 있습니다: 1. **트래픽 분석 및 추적**: MAC 주소가 알려지면, 공격자가 네트워크 내에서 해당 장치의 통신을 추적하거나 분석하는 데 사용될 수 있습니다. 2. **MAC 필터링 우회**: 많은 무선 네트워크에서는 MAC 필터링을 사용하여 특정 장치만 네트워크에 접근할 수 있게 제한합니다. 만약 공격자가 허용된 장치의 MAC 주소를 알면, 그 주소를 스푸핑하여 네트워크에 접근을 시도할 수 있습니다. 3. **장치 식별 및 위치 추적**: MAC 주소는 장치의 유형이나 제조사에 대한 정보를 포함할 수 있습니다. 이를 통해 공격자는 특정 유형의 장치를 대상으로 한 공격을 수행하거나 장치의 위치를 추적하는 데 활용할 수 있습니다. 4. **네트워크 망 분리**: 일부 고급 네트워크 설정에서는 MAC 주소를 기반으로 다른 네트워크 세그먼트와의 통신을 허용하거나 제한합니다. 잘못된 설정이나 MAC 주소의 노출은 네트워크의 망 분리 기능을 약화시킬 수 있습니다. 그렇지만, MAC 주소 자체만으로는 직접적인 공격을 수행하기는 어렵습니다. 다만, 공격자가 다른 정보와 결합하여 활용할 경우 보안 위협이 될 수 있습니다. 따라서 MAC 주소는 공개적으로 공유되지 않도록 주의하는 것이 좋습니다. MAC 주소는 전 세계에서 각 네트워크 인터페이스 카드 (NIC)에 고유하게 할당됩니다. MAC 주소는 일반적으로 48비트로 구성되며, "xx:xx:xx:xx:xx:xx"와 같은 형식으로 표현됩니다. 여기서 각 'xx'는 16진수로 된 두 자리 숫자입니다. MAC 주소의 할당 방법은 다음과 같습니다: 1. **OUI (Organiza...

react useRef

useRef는 프로그래밍에서의 "포인터" 개념과 유사한 방식으로 동작합니다. 다른 언어에서의 포인터는 메모리의 특정 주소를 가리키는데, JavaScript와 React에서의 useRef는 특정 DOM 요소나 변수를 "가리키는" 역할을 합니다. 즉, useRef를 사용하면: 특정 DOM 요소에 직접 접근할 수 있습니다. 렌더링 사이에서 변하지 않는 값을 저장하고 유지할 수 있습니다. 이를 통해 우리는 특정 요소나 값에 "포인터"처럼 직접 접근하고 작업을 수행할 수 있습니다. `useRef`는 React에서 특정 요소(예: 버튼, 입력란)를 "가리키고" 관리하려 할 때 사용합니다. "가리킨다"는 말은 그 요소에 대한 참조를 갖는다는 의미입니다. `useRef`를 사용하면: 1. 특정 요소에 직접 접근할 수 있습니다. (예: 입력란에 자동으로 커서를 위치시키기) 2. 값이 바뀌더라도 컴포넌트가 다시 그려지지 않도록 값을 저장할 수 있습니다. 간단한 예시로, 웹 페이지에 버튼이 있고, 버튼을 누르면 텍스트 입력란에 자동으로 커서를 위치시키고 싶다고 가정해봅시다. 이 작업을 위해서 `useRef`를 사용하여 입력란을 "가리킵니다". 그리고 버튼을 눌렀을 때, 그 "가리킨" 입력란에 커서를 위치시킵니다. ```html import React, { useRef } from 'react'; function MyApp() { // 입력란을 가리키기 위한 참조를 생성합니다. const myInput = useRef(); // 버튼을 누르면 입력란에 커서를 위치시킵니다. const handleClick = () => { myInput.current.focus(); }; return ( <div> <i...

html 하위 요소의 하위 요소... 접근하기

하위 요소의 하위 요소에 접근하려면, 연속적으로 `querySelector`나 `querySelectorAll`을 사용하면 됩니다. CSS 선택자 문법을 활용하면 다양한 방식으로 요소를 선택할 수 있습니다. 예를 들어, 아래와 같은 구조의 HTML이 있다고 가정합니다: ```html <div id="parent"> <div class="child"> <span class="grandchild">Text</span> </div> </div> ``` 1. **직접 CSS 선택자로 접근**: 직접적으로 `#parent .child .grandchild`와 같은 CSS 선택자를 사용해 원하는 요소에 접근할 수 있습니다. ```javascript let grandchild = document.querySelector("#parent .child .grandchild"); ``` 2. **단계적으로 접근**: 단계적으로 각 요소를 찾아 나갈 수도 있습니다. ```javascript let parent = document.getElementById("parent"); let child = parent.querySelector(".child"); let grandchild = child.querySelector(".grandchild"); ``` 이렇게 원하는 하위 요소에 접근하는 방법은 여러 가지가 있으며, 상황에 따라 적절한 방법을 선택하면 됩니다.

react className 여러개

원래 HTML에서 `class` 속성은 공백으로 구분된 여러 개의 클래스 이름을 가질 수 있습니다. 예를 들면: ```html ... ``` React의 `className`도 마찬가지로 여러 개의 클래스 이름을 가질 수 있습니다. 위에서 제시한 방법은 React에서 여러 개의 클래스 이름을 가진 문자열을 생성하는 방법입니다. 예제로, `styles.diary_page`가 `"diary_page"`이고, `className`이 `"another_class"`라고 가정해봅시다. 이 두 클래스 이름을 합치기 위해 문자열 연결을 사용하여 최종적으로 `"diary_page another_class"`와 같은 형태의 문자열을 만들어야 합니다. 이렇게 만든 문자열을 `className`에 전달하면 React는 해당 요소에 두 클래스 이름을 모두 적용합니다. `className`을 여러 개 설정하려면 문자열을 결합해야 합니다. 지금 작성하신 방식은 JavaScript의 쉼표 연산자를 사용한 것으로, 이는 첫 번째 표현식 (`styles.diary_page`)을 평가하고 그 결과를 무시한 후 두 번째 표현식 (`className`)의 결과를 반환합니다. 따라서, `className`에 두 개 이상의 스타일을 적용하려면 문자열을 결합해야 합니다. 문자열 템플릿이나 `+` 연산자를 사용하여 결합할 수 있습니다. 예시: 1. **문자열 템플릿을 사용하는 방법**: ```jsx className={`${styles.diary_page} ${className}`} ``` 2. **`+` 연산자를 사용하는 방법**: ```jsx className={styles.diary_page + " " + className} ``` 두 번째 방법은 조금 더 전통적인 방법입니다. 하지만 문자열 템플릿 (첫 번째 방법)은 E...

react google font 사용

구글 폰트를 웹사이트나 React 프로젝트에 적용하려면 몇 가지 단계를 따라야 합니다. 아래는 구글 폰트를 사용하는 방법에 대한 기본 지침입니다. 1. **구글 폰트 웹사이트 방문**: [Google Fonts](https://fonts.google.com/) 웹사이트에 접속하세요. 2. **폰트 선택**: 원하는 폰트를 검색하고 선택하세요. 3. **폰트 스타일 선택**: 폰트를 클릭하면 여러 스타일이 표시되며, 필요한 스타일을 선택합니다. 4. **Embed 링크 가져오기**: 선택한 폰트의 스타일을 모두 선택한 후, 오른쪽 패널의 "Embed" 섹션에서 `<link></link>` 태그를 복사합니다. 예시: ```html < link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap"> ``` 5. **프로젝트에 적용**: - **HTML 프로젝트**에서는 `<head >` 섹션 내에 복사한 `<link ></link >` 태그를 붙여넣기 합니다. - **React 프로젝트**에서는 `public/index.html` 파일의 `<head>` 섹션에 복사한 `<link gt;</link>` 태그를 붙여넣기 합니다. 6. **CSS에서 폰트 사용**: 가져온 폰트를 CSS에서 사용하려면 `font-family` 속성을 적용하면 됩니다. 예시: ```css body { font-family: 'Roboto', sans-serif; } ``` 7. **오프라인 사용**: 오프라인에서도 폰트를 사용하려면...

package.json vs package-lock.json

`package.json`과 `package-lock.json` 두 파일 모두 npm을 사용하여 프로젝트의 의존성을 관리할 때 생성되고 사용되는 파일들입니다. 그러나 두 파일의 목적과 내용은 다르기 때문에 차이점을 이해하는 것이 중요합니다. 1. **package.json**: - **프로젝트 메타데이터**: 프로젝트의 이름, 버전, 설명, 스크립트, 라이센스 등의 기본 정보가 포함됩니다. - **의존성 목록**: 프로젝트에서 사용하는 외부 패키지들의 목록과 해당 패키지들의 "버전 범위"가 명시됩니다. 이 버전 범위는 `^`, `~`와 같은 특수 문자를 사용하여 표시되며, 이를 통해 특정 패키지의 어느 버전까지 허용할 것인지 결정합니다. - `npm install` 명령어를 사용하면 `package.json`에 명시된 의존성 버전 범위에 따라 패키지를 설치합니다. 2. **package-lock.json**: - **의존성 트리의 정확한 스냅샷**: 프로젝트의 모든 의존성과 해당 의존성의 **정확한 버전**, 그리고 그 의존성들이 의존하는 다른 패키지들에 대한 정보까지 포함합니다. - `package-lock.json`은 프로젝트의 의존성 트리를 "잠금"하여 동일한 의존성 구조가 항상 복원될 수 있도록 보장합니다. 이는 다양한 환경에서 일관된 설치를 보장하기 위한 목적으로 사용됩니다. - `npm install` 명령어가 실행될 때 `package-lock.json`이 있으면 이 파일에 기술된 정확한 버전의 패키지가 설치됩니다. 만약 이 파일이 없다면, `package.json`의 버전 범위에 따라 패키지가 설치되며, 이 과정에서 새로운 `package-lock.json`이 생성될 수 있습니다. **요약**: - `package.json`은 프로젝트의 의존성을 **선언**하는 파일입니다. - `package-lock.json`은 프로젝트의 의존성 트리의 정확한...

CSS를 사용하여 자식 요소를 부모 요소의 중앙에 배치

 CSS를 사용하여 자식 요소를 부모 요소의 중앙에 배치하려면 여러 가지 방법이 있습니다. 여기에서는 가장 일반적으로 사용되는 두 가지 방법을 소개하겠습니다: 1. **Flexbox 사용**:        Flexbox는 요소를 쉽게 중앙에 배치할 수 있는 방법을 제공합니다. 부모 요소에 대한 `display: flex` 및 `align-items: center; justify-content: center;` 속성을 설정하여 자식 요소를 수직 및 수평 중앙에 배치할 수 있습니다.        ```css    .parent {        display: flex;        align-items: center;        justify-content: center;        height: 100%; /* 또는 원하는 높이 */    }    ``` 2. **Absolute Positioning 사용**:        절대 위치 지정을 사용하려면 부모 요소에 `position: relative;`를 설정하고 자식 요소에 `position: absolute;`와 `top`, `left`, `transform` 속성을 설정하여 중앙에 배치합니다.        ```css    .parent {        position: relative;        height: 100%; /* 또는 원하는 높이 */    }    .child {        posit...

javascript에서 mod 연산은 음수가 나온다

수학에서 "modulo" 연산의 정의에 따르면, 나머지는 항상 양수여야 합니다. 예를 들어, -7을 5로 나눌 때의 나머지는 3입니다. 이러한 정의는 다양한 프로그래밍 언어에서 구현되기도 합니다. 그러나 JavaScript에서 제공하는 % 연산자는 나머지 연산자로 동작하며, 피연산자 중 하나가 음수라면 결과가 음수가 될 수 있습니다. 이는 특정 상황에서는 불편할 수 있으므로, 항상 양수의 결과를 원할 경우에는 추가 처리가 필요합니다. 요약하면, JavaScript의 % 연산자는 나머지 연산자로 동작하며, 수학적인 "modulo" 연산과는 결과가 다를 수 있습니다. 양수의 결과를 원하면 추가 처리가 필요합니다. JavaScript의 `%` 연산자는 "나머지 연산자"로서, 피연산자 중 하나가 음수일 경우 결과도 음수가 될 수 있습니다. 이는 일부 다른 프로그래밍 언어에서의 동작과 다를 수 있습니다. 예시를 들면: ``` console.log(7 % 5);   // 2 console.log(-7 % 5);  // -2 console.log(7 % -5);  // 2 console.log(-7 % -5); // -2 ``` 만약 항상 양수의 결과를 원한다면, 결과가 음수일 경우에 모듈로 (modulus) 값을 더해줄 수 있습니다: ```javascript function positiveMod(a, b) {     return ((a % b) + b) % b; } console.log(positiveMod(-7, 5)); // 3 ``` `positiveMod` 함수는 먼저 `%` 연산을 수행하고, 그 결과가 음수일 경우 `b`를 더해줌으로써 결과를 양수로 만들어 줍니다.

create-react-app의 index.js vs App.js

 `create-react-app` (CRA)은 React 기반 프로젝트를 시작할 때 주로 사용하는 도구입니다. CRA를 사용하여 새 프로젝트를 생성하면, 기본적으로 `App.js`와 `index.js` 두 개의 주요 파일이 생성됩니다. 각 파일의 용도는 다음과 같습니다: 1. **index.js**:     - **진입점**: 프로젝트의 진입점(entry point) 역할을 합니다. 여기서 React 코드는 실제 웹 페이지의 DOM에 렌더링됩니다.     - **ReactDOM.render()**: 이 함수는 React 컴포넌트를 DOM에 연결하는 역할을 합니다. `index.js`에서는 `<App />` 컴포넌트가 `root`라는 DOM 요소에 연결되도록 설정됩니다.     - **Service Worker**: CRA는 Progressive Web App(PWA) 지원을 위해 service worker 설정을 포함할 수 있습니다. 이는 `index.js`에서 설정되거나 제거될 수 있습니다.     ```jsx     import React from 'react';     import ReactDOM from 'react-dom';     import './index.css';     import App from './App';     ReactDOM.render(<App />, document.getElementById('root'));     ``` 2. **App.js**:     - **주요 컴포넌트**: 프로젝트의 주요 React 컴포넌트입니다. 초기에는 간단한 화면을 출력하도록 설정되어 있지만, 대부분의 개발자는 이 파일을 애플리케이션의 주요 레이아웃 및 로직을 포함하도록 확장합니다.     - **기본 레...

JavaScript - Default export, Named export

JavaScript에서 모듈을 다른 파일로부터 가져올 때, 내보내기(export)와 가져오기(import)의 방식에는 두 가지 주요한 유형이 있습니다: **기본 내보내기 (Default export)**와 **명명된 내보내기 (Named export)**입니다. 1. **기본 내보내기 (Default export)**     - 한 파일에 하나의 기본 내보내기만 가능합니다.     - 가져올 때 중괄호 `{ }`를 사용하지 않습니다.     ```javascript     // routes.js     const routes = [...];     export default routes;     // 다른 파일에서 가져올 때     import routes from './routes.js';     ``` 2. **명명된 내보내기 (Named export)**     - 한 파일에 여러 명명된 내보내기가 가능합니다.     - 가져올 때 중괄호 `{ }`를 사용합니다.     ```javascript     // routes.js     export const routes = [...];     export const anotherVariable = ...;     // 다른 파일에서 가져올 때     import { routes, anotherVariable } from './routes.js';     ``` 여러분의 코드에서 `routes.js` 파일에서 `routes`를 **기본 내보내기**로 내보냈습니다. 그래서 다른 파일에서 가져올 때는 `import routes from './routes.js';`와 같이 중괄호 없이 가져와야 합니다...

css에서 element의 디스플레이 특성

**block-level 요소:** 페이지 상에서 새로운 줄에서 시작하고, 다음 요소는 이 요소 다음의 새로운 줄에서 시작합니다. 즉, 전체 가로 너비를 차지합니다. 기본적으로 가로 너비는 부모 요소의 전체 너비를 차지하게 됩니다 (width 값이 명시적으로 설정되지 않았다면). width, height, margin, padding 등의 속성을 모두 적용할 수 있습니다. 예: div, h1, p, form 등. **inline-level 요소:** 페이지 상에서 새로운 줄을 시작하지 않고, 텍스트나 다른 인라인 요소와 동일한 줄에 연속해서 표시됩니다. 내용의 너비만큼만 영역을 차지합니다. 즉, 필요한 만큼의 너비를 차지하게 됩니다. width와 height 속성이 적용되지 않습니다. 그러나 padding, margin (오른쪽과 왼쪽만), border는 적용될 수 있습니다. 상하단의 margin과 padding은 적용되지만, 다른 요소를 밀어내지는 않습니다. 예: &lt;span&gt;, &lt;a&gt;, &lt;img&gt;, &lt;strong&gt;등. **inline-block:** inline과 block의 특성을 조합한 디스플레이 속성입니다. 요소는 인라인 수준에서 표시되지만, block처럼 width와 height 속성을 적용받을 수 있습니다. <span>과 같이 인라인 요소에 블록 레벨의 스타일링을 적용하고 싶을 때 유용합니다. **flex:** 요소를 유연한 박스 모델 레이아웃의 컨테이너로 설정합니다. 이렇게 설정하면 자식 요소들은 flex 아이템으로서 표시됩니다. flex 레이아웃은 복잡한 레이아웃과 정렬 문제를 쉽게 해결할 수 있도록 도와줍니다. 주요 관련 속성: flex-direction, justify-content, align-items, flex-wrap 등. **grid:** 요소를 그리드 레이아웃의 컨테이너로 설정합니다. 그리드는 행과 열의 2차원 레이아웃 시...

ipad 마우스 모션

ipad 마우스 모션 https://support.apple.com/ko-kr/guide/ipad/ipada39e5184/ipados  

js의 Element.tagName 은 반환 값이 대문자이다

 js의 Element.tagName 은 반환 값이 대문자이다 XHTML (또는 여느 XML 방식) 문서의 경우, 정의한 태그 명 그대로 가져오기 때문에, "span" 같은 소문자 태그명을 가져오게 될 것이다.그에 반해 HTML 문서에서는, 원본 문서에 정의된 태그명과 달리 대소문자를 무시하면서 대문자로만 이루어진 "SPAN" 값을 가져오게 된다. https://developer.mozilla.org/ko/docs/Web/API/Element/tagName

flutter drift vs hive

`Hive`와 `Drift`는 Flutter에서 로컬 데이터를 저장하기 위한 두 가지 인기있는 패키지입니다. 각각의 특징과 장단점을 알아보겠습니다. ### Hive #### 장점: 1. **성능**: Hive는 빠른 읽기 및 쓰기 연산을 제공합니다. 2. **간단함**: Hive의 API는 매우 간단하며, 객체를 빠르게 저장하고 검색할 수 있습니다. 3. **타입 안정성**: Hive는 Dart의 strong typing을 지원합니다. 4. **Zero Serialization**: Hive는 런타임 시 객체 직렬화가 필요 없습니다, 빠르게 데이터를 읽고 쓸 수 있습니다. 5. **다양한 데이터 유형 지원**: Hive는 간단한 키-값 스토어로도, 복잡한 JSON 객체로도 사용할 수 있습니다. 6. **크로스 플랫폼**: Android, iOS, 데스크톱 및 브라우저에서 사용할 수 있습니다. #### 단점: 1. **SQL 미지원**: Hive는 SQL 쿼리를 지원하지 않습니다. 따라서 복잡한 쿼리나 조인을 실행할 수 없습니다. 2. **데이터베이스 관계 미지원**: Hive는 관계형 데이터베이스가 아니므로, 테이블 간의 관계를 설정할 수 없습니다. ### Drift (moor) #### 장점: 1. **SQL 지원**: Drift는 SQLite를 기반으로 하므로 SQL 쿼리를 지원합니다. 2. **강력한 쿼리**: 조인, 서브쿼리, 복잡한 WHERE 절 등을 사용할 수 있습니다. 3. **타입 안전성**: Drift는 컴파일 타임에 쿼리 검사를 지원하여 타입 안전성을 제공합니다. 4. **반응형 프로그래밍**: Drift는 `Stream`을 이용한 반응형 프로그래밍을 지원합니다. 5. **데이터 마이그레이션**: 스키마 변경을 안전하게 관리할 수 있습니다. #### 단점: 1. **복잡성**: SQL과 스키마 마이그레이션 등을 관리해야 하므로 Hive보다 초기 학습 곡선이 높을 수 있습니다. 2. **성능**: Hive가 직렬화가 필요 없는 반면, Drift...

firebase 대용?

firebase 대용?  https://pocketbase.io/ 모바일에 특화된 듯? 자세히는 안봄 appwrite supabase nhost aws amplify mongoDB의 realm 도 비슷한 듯

HTML5 Canvas, Phaser, Three.js, Babylon.js, CreateJS

 이 라이브러리와 기술은 웹 기반 그래픽과 게임 개발에 주로 사용됩니다. 각각의 특징은 다음과 같습니다: ### HTML5 Canvas - **언어**: HTML/CSS/JavaScript - **특징**: HTML5 표준의 일부로, 2D 그래픽을 그리기 위한 API를 제공합니다. - **용도**: 간단한 그래픽, 애니메이션, 게임 개발. - **장점**: 브라우저 지원이 넓고, 추가 라이브러리 없이 사용 가능. - **단점**: 3D 그래픽 지원이 없고, 복잡한 기능은 직접 구현해야 함. ### Phaser - **언어**: JavaScript - **특징**: 2D 게임 개발을 위한 프레임워크. - **용도**: 브라우저 기반 2D 게임. - **장점**: 풍부한 기능, 활발한 커뮤니티. - **단점**: 3D 지원이 제한적. ### Three.js - **언어**: JavaScript - **특징**: WebGL을 쉽게 사용할 수 있게 해주는 3D 라이브러리. - **용도**: 3D 모델링, 애니메이션, 게임. - **장점**: 강력한 3D 기능, 높은 유연성. - **단점**: 상대적으로 높은 학습 곡선. ### Babylon.js - **언어**: TypeScript/JavaScript - **특징**: 3D 그래픽을 위한 라이브러리, WebGL과 WebXR을 지원. - **용도**: 복잡한 3D 시뮬레이션, 게임, 가상 현실. - **장점**: 뛰어난 성능, 풍부한 기능. - **단점**: 학습 곡선이 다소 가파름. ### CreateJS - **언어**: JavaScript - **특징**: Adobe Flash와 유사한 경험을 제공하는 2D 그래픽 라이브러리. - **용도**: 2D 애니메이션, 게임. - **장점**: Flash에서의 경험을 쉽게 웹으로 옮길 수 있음. - **단점**: 3D 지원이 없음, Flash의 영향을 받아서 현대적이지 않을 수 있음. 이들 각각은 서로 다른 목적과 필요에 따라 선택할 수 있으며, 특정 프로젝트에 ...

리액트의 빈 태그 <> </>

 React에서 빈 태그인 `<>`와 `</>`를 사용하는 것을 "Fragment"라고 부릅니다. Fragment는 여러 개의 자식 요소를 그룹화할 때 사용합니다. 일반적으로 여러 개의 요소를 반환할 때에는 그 요소들을 하나의 부모 요소로 묶어야 합니다. 그러나 때로는 불필요한 DOM 요소를 추가하고 싶지 않을 수 있습니다. 이런 경우 Fragment를 사용하면 유용합니다. ### 일반적인 예: ```jsx function App() {   return (     <div>       <Child1 />       <Child2 />       <Child3 />     </div>   ); } ``` 위의 예에서는 모든 자식 컴포넌트가 `<div>` 태그로 묶여 있습니다. 이로 인해 불필요한 `<div>` 태그가 DOM에 추가됩니다. ### Fragment를 사용한 예: ```jsx function App() {   return (     <>       <Child1 />       <Child2 />       <Child3 />     </>   ); } ``` 이 예에서는 `<>`와 `</>`로 자식 요소들을 묶었습니다. 이렇게 하면 불필요한 DOM 요소 없이 여러 자식 요소를 반환할 수 있습니다. Fragment는 컴포넌트가 여러 개의 요소를 반환해야 하지만, 추가적인 DOM 요소를 만들고 싶지 않을 때 유용하게 사용됩니다. React의 Fragment (`<> ... </>`)는 Reac...

플러터 version: 1.0.0+1 뜻

Flutter에서 `version: 1.0.0+1`과 같은 표시는 앱의 버전 정보를 나타냅니다. 이 문자열은 두 부분으로 나뉩니다: 1. **Semantic Version (시맨틱 버전)**: `1.0.0` - 이 부분은 앱의 "시맨틱 버전"을 나타냅니다. 일반적으로 `[Major].[Minor].[Patch]` 형식을 따릅니다.     - `Major`: 주요한 변화가 있을 때 증가시킵니다.     - `Minor`: 새로운 기능이 추가되었지만 하위 호환성이 유지될 때 증가시킵니다.     - `Patch`: 버그 수정과 같은 작은 변화가 있을 때 증가시킵니다. 2. **Build Number (빌드 번호)**: `+1` - 이 부분은 앱의 "빌드 번호"를 나타냅니다. 이 번호는 앱의 각 빌드를 구별하는 데 사용됩니다. 일반적으로 새로운 빌드가 생성될 때마다 이 번호를 증가시킵니다. ### Android에서 - `versionCode`는 빌드 번호에 해당합니다. 이 값은 정수여야 하며, 이전 버전보다 커야 합니다. - `versionName`은 시맨틱 버전에 해당합니다. ### iOS에서 - `CFBundleShortVersionString`은 시맨틱 버전에 해당합니다. - `CFBundleVersion`은 빌드 번호에 해당합니다. 따라서, Flutter의 `version: 1.0.0+1` 설정은 Android의 `versionCode`를 1로, `versionName`을 "1.0.0"으로 설정하고, iOS의 `CFBundleVersion`을 1로, `CFBundleShortVersionString`을 "1.0.0"으로 설정합니다.

creat()

 creat() 자연스럽게 쓰다보니 영어 문법적으로 틀렸다는 것을 까먹었다

URL (Uniform Resource Locator)과 URI (Uniform Resource Identifier)의 차이

### URL (Uniform Resource Locator)과 URI (Uniform Resource Identifier)의 차이 #### URL (Uniform Resource Locator) - URL은 인터넷 상의 자원의 위치를 나타내는 주소입니다. - URL은 자원이 어디에 있는지, 그리고 어떻게 접근할지에 대한 정보를 제공합니다. - 구성 요소: `스킴(scheme)://호스트(host):포트(port)/경로(path)?쿼리(query)#프래그먼트(fragment)` - 예: `https://www.example.com:8080/page?id=1#section2` #### URI (Uniform Resource Identifier) - URI는 인터넷 상의 자원을 식별하는 식별자입니다. - URI는 URL과 URN (Uniform Resource Name)을 포괄하는 더 넓은 개념입니다. - 예: `mailto:example@example.com` (URL 아님, URI임), `https://www.example.com/page` (URL이면서 URI임) ### URL과 URI의 관계 - 모든 URL은 URI이지만, 모든 URI가 URL은 아닙니다. - URL은 자원의 위치와 접근 방법을 모두 지정하는 반면, URI는 자원을 단순히 식별만 할 수 있습니다. ### 비슷한 용어 #### URN (Uniform Resource Name) - URN은 자원의 이름을 제공하는 URI의 하위 집합입니다. - URN은 자원의 위치가 아닌, 자원의 이름을 고유하게 식별합니다. - 예: `urn:isbn:0451450523` (책의 ISBN 번호) #### Endpoint - API나 서비스에서 특정 작업을 수행하기 위한 URI 또는 URL을 의미합니다. #### Base URL - API나 웹 서비스에서 공통된 부분의 URL을 의미합니다. - 예: `https://api.example.com/v1` 이후에 특정 경로가 추가됩니다. (`/users`, `/prod...

TLD (Top-Level Domain)와 gTLD (Generic Top-Level Domain)

TLD (Top-Level Domain)와 gTLD (Generic Top-Level Domain)는 도메인 네임 시스템 (DNS)에서 사용되는 용어들입니다. 이 두 용어의 차이와 의미에 대해 살펴보겠습니다: ### TLD (Top-Level Domain): - **정의**: TLD는 인터넷 주소의 마지막 부분 (예: .com, .org, .net)을 나타냅니다. TLD는 도메인 네임 시스템 (DNS)의 가장 높은 수준의 계층 구조에 있습니다. - **종류**:   1. **gTLD (Generic Top-Level Domain)**: 일반적인 목적으로 사용되는 TLD (예: .com, .org, .net).   2. **ccTLD (Country Code Top-Level Domain)**: 특정 국가나 지역을 대표하는 TLD (예: .us for the United States, .kr for South Korea, .jp for Japan).   3. **sTLD (Sponsored Top-Level Domain)**: 특정 커뮤니티나 단체에 의해 후원되는 TLD (예: .edu for educational institutions, .gov for U.S. government entities).   4. **iDNS (Internationalized Domain Names)**: 비영어 스크립트를 사용하는 TLD (예: .中国, .рф). ### gTLD (Generic Top-Level Domain): - **정의**: gTLD는 일반적인 목적으로 사용되는 TLD를 나타냅니다.  - **특징**: gTLD는 일반적으로 조직의 성격이나 목적에 따라 분류됩니다. 가장 흔하게 알려진 gTLD에는 .com, .net, .org 등이 있습니다. - **확장**: 최근에는 많은 새로운 gTLD가 추가되었으며, 이러한 확장으로 인해 브랜드, 도시, 취미 등 다양한 주제의 gTLD를 선택할 수 있게 되었습니다 (예: .app...

wine 툴

당장 필요하지는 않아서 설치는 안하지만 그냥 이름이 마음에 들어서 Wine (Wine Is Not an Emulator)은 유닉스와 유닉스 계열 운영 체제 (예: Linux, macOS)에서 Microsoft Windows 응용 프로그램을 실행하기 위한 소프트웨어 레이어입니다. 이름에서 알 수 있듯이 Wine은 실제로는 "에뮬레이터"가 아니라, Windows API를 유닉스 및 유닉스 계열 운영 체제에 구현한 것입니다. macOS에서의 Wine: 용도: macOS 사용자가 Windows 전용 소프트웨어를 실행할 수 있게 합니다. 동작 방식: Wine은 Windows 응용 프로그램이 원래 사용하려는 Windows API와 DLL을 유닉스 환경에서 실행 가능한 형태로 "번역"합니다. 성능: 일반적으로, Wine을 통해 실행되는 응용 프로그램은 네이티브 Windows 환경에서 실행되는 것에 비해 성능 저하가 적습니다. 그러나 모든 Windows 응용 프로그램이 완벽하게 작동하는 것은 아닙니다. 설치: Homebrew와 같은 패키지 관리자를 사용하거나 공식 Wine 웹사이트에서 바이너리를 직접 다운로드할 수 있습니다. 주의사항: 호환성: 모든 Windows 응용 프로그램이 Wine에서 잘 작동하지는 않습니다. 일부는 문제 없이 작동할 수 있지만, 일부는 오류가 발생할 수 있습니다. 64비트 지원: 최근 macOS 버전은 64비트 응용 프로그램만 지원하며, 이로 인해 Wine의 일부 버전과 기능이 제한될 수 있습니다. 그래픽과 사운드: 고급 그래픽 또는 사운드 기능을 사용하는 게임 또는 응용 프로그램은 Wine에서 제대로 작동하지 않을 수 있습니다. Wine은 무료와 오픈 소스이며, 다양한 커뮤니티와 상업적 지원이 있습니다. 예를 들어, "CrossOver" 같은 상업적 솔루션은 Wine을 기반으로 하며, 추가 기능과 사용 편의성을 제공합니다. --- 왜 mac에는 homebrew 나 wine 처럼 술과 관련된 패키...

Mac 숨김 파일

  shift +command + .

netlify로 react 배포

이미지
<img alt="" data-original-height="1172" data-original-width="1180" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjFiLkIXEf5QnE8PVmVYXV9ivxfH9oBzY6HNPOF--9hNcdM2XSEravQR-Lz4ccE5VcYhmKTJSJBw05aK5qytq3MNmQhya7XX6qJ-3L0vR0LWBnu2Jb7TVTWoY62qDogo1lFmS_j63_4TMKhzS4q2CIQG2eca_RiyLt7pZadj1nSA7yxt3VERzKOdwplxF60" width="242" /> create react app으로 보일러 플레이트 생성해서 시작했고 빌드 설정 이렇게 해놨더니 됨

Xcode 저장공간

 iOS Device Support 용량 너무 커서 지움. 필요할 때 다시 생성되는듯? 캐시도 그냥 지움 거의 합쳐서 10gb

mac에서 cmd로 파일 구조 tree 확인하기

  Homebrew로 tree를 다운 받아서 사용 brew install tree 윈도우에도 tree 기능이 있는 듯? 해보지는 않음

브라우저별 html css 사용 가능 범위 확인 사이트

  can i use 사이트에 검색하면됨 https://caniuse.com/

코랩 결제하는 법

 미국 주소 넣어야하는데 그냥 아무주소 넣으면 됨

코랩 팁

 줄번호 보이기: 컨트롤(cmd) M L

플러터 factor