리액트가 타입스크립트로 생성이 안될 때(CRA + typescript not working)

create-react-app <project> –template typescript

리액트+타입스크립트로 새 프로젝트를 생성하고자 create-react-app –template typescript를 실행해도 App.tsx가 아닌 App.js로 생성되는 경우가 있습니다.

cra-template-typescript 패키지가 없어 발생하는 문제일 가능성이 있으므로 해당 패키지를 설치해주고 실행해 봅니다.

npm install cra-template-typescript -g

설치 후 다시 create-react-app <projectName> –template typescript를 실행한 결과입니다.


또 다른 원인 중 하나는 캐쉬에 남아있는 이전 버전으로 설치가 되어 적용이 안될 가능성도 있으므로 npm uninstall -g create-react-app를 통해 삭제 후 재설치를 진행해보는 것도 좋을 것 같습니다.

CSS, 알면 쉬운 display 속성(inline, flex, …others)

inline, block, inline-block, flex, inline-flex, grid, inline-grid, none

display는 요소를 보여주고 숨기거나 위치를 설정하기 위한 옵션으로, display만 잘 알아도 레이아웃의 많은 부분을 해결할 수 있습니다.

이번 포스팅에서 display의 속성인 inline, flex, inline-flex, block, inline-block, grid, inline-grid, none의 구현을 통해 각각의 표시 방식을 알아보도록 하겠습니다.

알아보기 편하도록 배경은 블랙, 요소는 각각 레드, 오렌지, 그린으로 표현하겠습니다.

inline : inline으로 표시(width는 요소 크기)
block : block으로 표시
inline-block : inline + block으로 표시
flex : 자식 요소를 모두 inline-block으로 설정
inline-flex : inline + flex(전체 width는 자식 width의 합)
grid : flex처럼 한 방향이 아닌 가로, 세로로 설정 가능한 레이아웃
inline-grid : inline + grid(전체 width는 자식 width의 합)
none : 표시하지 않음(공간을 차지하지 않음)


줄바꿈 없이 태그를 표시하는 요소를 inline 요소, 태그마다 줄바꿈이 되는 요소를 block 요소라고 합니다.

대표적인 inline 요소는 <span>, <a> 등이 있으며, block 요소는 <div>,<p>,<h1>,<h2> 등이 있습니다.

먼저 아무 속성도 설정하지 않은 div를 확인해 보겠습니다.

.setContainer{
  background-color:black;
}

.setOne{
  background-color: red;
}

.setTwo{
  background-color: orange;
  width:95%;
}

.setThree{
  background-color: green;
  width:90%;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

div의 default 설정은 width 100%입니다.

기본 설정을 확인하기 위해 setTwo와 setThree에 width를 설정한 결과입니다.

먼저 display의 inline 속성을 확인해보죠.


1. inline

위 속성은 말 그대로 요소를 일렬로 늘어선 방식으로 표시하며 줄바꿈을 하지 않습니다.

각 요소마다 설정하며 width는 자동으로 크기에 맞게 변형됩니다.

.setContainer{
  background-color:black;
  display:inline;
}
.setOne{
  background-color: red;
  display:inline;
}
.setTwo{
  background-color: orange;
  display:inline;
}
.setThree{
  background-color: green;
  display:inline;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

inline은 위와 같이 문자열처럼 일렬로 늘어선 상태로 표시됩니다.


2. block

block은 inline 요소를 block으로 표시합니다.

block 요소 div 대신 inline 요소 span을 사용하면 다음과 같은데요.

위에서 div에 display:inline을 설정한 것과 같은 모양입니다.

그러므로 span에 display:block을 설정하면 반대로 div를 사용한 것과 같은 결과가 나오는 것을 알 수 있습니다.

.setContainer{
  background-color:black;
}
.setOne{
  background-color: red;
  display:block;
}
.setTwo{
  background-color: orange;
  display:block;
}
.setThree{
  background-color: green;
  display:block;
}

<div class='setContainer'>
  <span class='setOne'>red</span>
  <span class='setTwo'>org</span>
  <span class='setThree'>grn</span>
</div>

block 속성은 inline 요소를 block 요소처럼 표현하는 것을 알 수 있습니다.


3. inline-block

그렇다면 inline-block은 언제 사용할까요?

display:block이 필요하지만 표시는 inline으로 표시를 하고 싶은 상황입니다.

그러면 그게 그냥 span의 default 아닌가라고 생각할 수도 있지만 span에는 width, height 등 속성이 적용되지 않기 때문에 block으로 설정을 해야 합니다.

위의 코드에서 첫 번째 요소에 width:300px, height:200px를 설정하면 다음 그림과 같은 모습이 됩니다.

위 요소를 inline으로 설정하기 위해 inline-block를 사용할 수 있습니다.

.setContainer{
  background-color:black;
}
.setOne{
  background-color: red;
  display:inline-block;
  width:300px;
  height:200px;
}
.setTwo{
  background-color: orange;
  display:inline-block;
}
.setThree{
  background-color: green;
  display:inline-block;
}

<div class='setContainer'>
  <span class='setOne'>red</span>
  <span class='setTwo'>org</span>
  <span class='setThree'>grn</span>
</div>

div를 사용해 위와 같이 나타내려면 어떻게 해야 할까요?

.setContainer{
  background-color:black;
}
.setOne{
  background-color: red;
  display:inline-block;
  width:300px;
  height:200px;
}
.setTwo{
  background-color: orange;
  display:inline;
}
.setThree{
  background-color: green;
display:inline;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

위와 같이 사용하면 됩니다.

만약 위와 같이 사각형 사이 사이에 빈공간이 들어가는 경우가 있다면 <div> 태그 사이의 띄워쓰기나 줄바꿈을 확인해봐야 합니다.

보기에는 안좋지만 다음과 같이 태그 사이를 모두 붙여쓰면 공백이 발생하는 것을 제거할 수 있습니다.

<div class='setContainer'><div class='setOne'>red</div><div class='setTwo'>org</div><div class='setThree'>grn</div></div>

4. flex

flex는 새로운 속성 중 하나로 부모 요소에서만 설정을 합니다.

display:flex를 설정하면 모든 자식 요소에 display:inline-block을 설정한 것과 같은 효과를 줍니다.

따라서 모든 자식 요소는 display를 설정할 필요 없이 width, height 등의 속성이 사용 가능합니다.

.setContainer{
  background-color:black;
  display:flex;  
}
.setOne{
  background-color: red;
}
.setTwo{
  background-color: orange;
  width:200px;
}
.setThree{
  background-color: green;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

개별 요소에 모두 display를 설정할 필요 없이 부모 요소에서만 편하게 설정이 가능합니다.

만약 자식 요소를 가운데 정렬하고 싶으면 부모 요소에서 justify-content:center;를 사용하면 됩니다.


5. inline-flex

flex는 이미 inline-block의 기능을 갖고 있는데 그럼 inline-flex의 기능 무엇일까요?

바로 inline 특징 중 하나인 자동 크기 조절입니다.

inline-flex는 자식 요소를 합친 크기 만큼만 크기를 설정하므로 width는 100%가 아닌 자식 크기의 합입니다.

flex의 결과와 비교해보면 알 수 있듯이 부모 요소를 의미하는 블랙이 공간을 차지하고 있지 않습니다.


6. grid, inline-grid

이 grid는 무엇일까요?

그리드는 flex처럼 가로나 세로 한 방향으로만 레이아웃을 설정하는 것이 아니라 가로, 세로 두 방향 모두 설정할 수 있는 속성입니다.

grid 역시 부모 요소에서 설정을 하며 자식 요소를 block으로 표현합니다.

다양한 속성을 통해 레이아웃을 구성하는데 효과적이지만 내용이 많아 다른 포스팅을 통해 좀 더 알아봐야 할 필요성이 있을 것 같습니다.

.setContainer{
  background-color:black;
  display:grid;  
  grid-template-columns: 100px 100px 100px;
}
.setOne{
  background-color: red;
}
.setTwo{
  background-color: orange;
}
.setThree{
  background-color: green;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

inline-grid 역시 inline-flex 속성과 마찬가지로 width를 자식 요소에 맞게 조절하는 기능을 합니다.


7. none

none은 해당 요소를 표시하지 않으며 공간도 차지하지 않는 방식입니다.

.setContainer{
  background-color:black;
}

.setOne{
  background-color: red;
  display:none;
}

.setTwo{
  background-color: orange;
}

.setThree{
  background-color: green;
}


<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

이렇게 없는 놈 취급을 합니다.

이와 반대되는 속성이 visibility로 이는 공간은 차지하되 표시만 하지 않는 속성입니다.

visibility, display 사용 관련 포스트

display:none을 visibility:hidden으로 변경한 결과입니다.

있는데 없는 척을 합니다.

물론 visibility도 공간만 차지할 뿐 할 수 있는 일은 없습니다.



CSS의 기본이지만 모든 기능을 다 이해하고 사용하기까지는 어느 정도의 시간과 경험이 필요한 것 같습니다. 무작정 외우기보다는 사용하면서 답답함이 쌓였을 떄 한번씩 소화제 느낌으로 설명을 삼켜주면 조금 더 와닿는 설명이 되지 않나 싶습니다..🧔

템플릿 리터럴(template literal)과 쉬운 응용(feat.`)

`로 시작해서 `로 끝나는 템플릿 리터럴

템플릿 리터럴(template literal)은 ES6부터 도입된 기능으로 문자열 다루기에 특화된 기능인데요.

` (backtick, grave accent)

템플릿 리터럴은 ` 기호로 시작해 ` 기호로 끝나며, 문자열과 변수를 함께 전달하거나 태그를 편리하게 사용할 수 있습니다.

또한 다음과 같은 방식도 사용도 가능한데요.

const printData = (text) => {
    console.log(text[0]); // 'Hello everyone!'
}

printData`Hello everyone!`;

함수에 템플릿 리터럴을 전달할 수도 있습니다.

이를 태그드 템플릿(tagged template)이라고 하는데요.

호출된 함수는 템플릿 리터널 내 문자열 조각이나 표현식 등을 매개변수로 받습니다.

styled-components에서 사용되는 방식도 태그드 템플릿입니다.


1. 템플릿 리터럴(template literal)

템플릿 리터럴은 시작과 끝에 반드시 `(backtick)을 붙여야 하며, ‘(홑따옴표), “(쌍따옴표)와 반드시 구분해야 합니다.

const name = 'clint Eastwood';
const age = '92';
const city = 'San Francisco';
const occupation = 'director';

// 표현식
console.log('His name is '+name+ '\n' + 'and '+age+'.');

// 템플릿 리터럴
console.log(`He was born in ${city}
and he is a ${occupation}`);

템플릿 리터럴에서 ${ }를 사용하면 블록 내 변수 또는 함수에 접근이 가능하며, \n 등 이스케이프를 사용하지 않고도 입력한대로 출력할 수 있습니다.

템플릿 리터럴은 쉽게 응용이 가능하니 태그드 템플릿에 대해 알아보겠습니다.

2. 태그드 템플릿(tagged template)

const TextBox = styled.div`
  display: inline-block;
  color: gray;
  margin: 0 auto;
`;

const StyledInput = styled.input`
    font-size: 1rem;
    border: none;
    border-bottom: 1px solid gray;
    outline: none;
    width: 100%;
`;

위와 같이 styled-components에서 태그드 템플릿이 밥 먹듯이 사용됩니다.

템플릿 리터럴로 함수를 호출하면 어떻게 사용할까요?

함수를 호출하면 매개변수로 문자열과 변수가 전달됩니다.

const name = 'clint';
const age = '92';
const city = 'LA';

const showString = (text, ...args) => {
    console.log(text);
    console.log(args);
    console.log(text[2]);
    console.log(args[2]);
}

showString`He is ${name} and ${age}. From ${city}`;

전달된 매개변수는 텍스트와 ${ }에 넣은 변수이며, 각각 확인할 수 있습니다.

텍스트와 변수에 접근하려면 인덱스를 사용하면 됩니다.

텍스트의 경우 ${ }이 들어간 부분에서 끊어주므로 ‘He is’, ‘ and ‘, ‘. From ‘, ”이렇게 네 부분으로 나뉘어지며, 순서대로 0, 1, 2, 3의 인덱스를 갖습니다.

태그드 템플릿을 사용하는 이유는 문자열을 원하는 형식으로 재가공하여 사용할 수 있는 장점이 있기 때문입니다.



styled-components를 무턱대고 사용하는 것보다 구조를 알고 사용하면 더 도움이 될 것 같아 태그드 리터럴에 대해 알아보았습니다. 템플릿 리터럴은 이제 너무 유용하고 편리한 기능이므로 꼭 알아두어야 할 기능 중 하나인 것 같습니다.

CSS transition, 작동 원리 이해하기(왜 작동을 안할까?)

transition의 작동원리와 transition 대체할 수 있는 방법

transition은 애니메이션 효과를 주는 CSS입니다.

transition 하나만으로도 투박한 느낌을 지우고 부드러운 느낌을 줄 수 있는데요.

메뉴가 부드럽게 열리고 닫히거나 화면에 fade-in 효과 등을 줄 수 있습니다.

CSS의 대표적인 애니메이션 처리는 transition와 animation이 있는데요.

transition은 변경이 발생하는 순간 작동하고, animation은 transition보다 더 자유롭고 다양하게 사용이 가능한 친구입니다.

그럼 transition을 작성하는 코드부터 확인해 보겠습니다.

1. transition 사용하기

.setBox{
  background-color:pink;
  width:200px;
  height:200px;
  transition:all 1000ms linear 500ms;
}

위와 같은 방식으로 사용하며, 한 줄 표기의 의미는 다음과 같습니다.

transition: property duration timing delay;

property : color, background-color, border, position, all 등의 속성

duration : 완료까지 걸리는 시간. ms(밀리초) 또는 s(초)로 설정

timing : linear(동일), ease(느림->빠름->느림), ease-in(느림->빠름), ease-out(빠름->느림)

delay : 딜레이 시간(ms 또는 s로 설정)

물론 property나 delay 는 생략도 가능합니다.

이를 풀어 쓰면 다음과 같이 작성할 수 있습니다.

transition-property : property
transition-duration : duration
transition-timing-function : timing
transition-delay: delay

transition을 사용해 마우스를 올리면(hover) 박스가 부드럽게 커졌다가 줄어드는 코드를 확인해 보겠습니다.

.setBox{
  background-color:pink;
  width:100px;
  height:50px;
  transition:all 1000ms linear 500ms;
}

.setBox:hover{
  background-color:gold;
  width:200px;
  height:100px;
  transition:all 300ms ease;
}

<div class='setBox'></div>

박스가 커질 때는 .setBox:hover{}의 transition 설정에 따라 300ms, 줄어들 때는 .setBox{}의 transition 설정에 따라 1000ms동안 움직입니다.

그럼 이제는 요소 숨기기&표시하기 기능을 확인해 보겠습니다.

.setBox{
  background-color:gray;
  color:white;
  width:100px;
  height:50px;
  text-align:center;
  line-height:50px;
}
.showMenu{
  visibility:hidden;
  height:150px;
  width:100px;
  background-color:lightgray;
  opacity:0;
  color:black;
  border-radius:5px;
  transition:linear 500ms;
}
.setBox:hover .showMenu{
  visibility:visible;
  transition:linear 500ms;
  opacity:1;
}

<div class='setBox'>MENU
    <div class='showMenu'>
        <div class='menu'>
          메뉴 A
        </div>
        <div class='menu'>
          메뉴 B
        </div>
        <div class='menu'>
          메뉴 C
        </div>
    </div>
</div>

위 코드의 실행 결과는 아래와 같습니다.

마우스를 올리면 숨겨둔 div를 표시하거나 숨기면서 transition이 작동하는 것을 볼 수 있습니다.

위 코드에서 visibility가 아닌 display를 사용하면 결과는 어떨까요?

display를 사용하면 transition이 작동하지 않는 것을 볼 수 있습니다.

이유는 바로 display와 visiblility의 작동 방식에 차이가 있습니다.

transition은 위에서 이야기한 것처럼 변경이 발생하는 순간 작동합니다.

예를 들어 A 모양에서 B 모양으로 변경될 때 작동을 하는데요.

visibility는 공간은 그대로 두고 설정에 따라 요소를 숨기거나 나타내므로 A에서 B로 변경을 적용할 수 있습니다.

다음 그림과 같은 느낌입니다.


2. transition 작동하지 않는 이유

그렇다면 display가 작동하지 않는 이유도 추측할 수 있습니다.

display:none은 요소의 표시 뿐만 아니라 표소가 있는 공간도 비워버리는 설정입니다.

따라서 ‘A모양 -> B모양’으로의 변형이 아니라 ‘없음 -> B모양’ 이 되므로 transition이 작동하지 않는 것입니다.

그러므로 transition은 ‘모양의 변형‘만 기억하면 됩니다.

그렇다면 같은 효과를 내는 animation은 어떻게 사용할까요?

코드만 봐도 이해하기 쉬운 구조이므로 코드로 확인해 보겠습니다.

.setBox:hover .showMenu{
  visibility:visible;
  animation:setMotion 3s;
}
@keyframes setMotion{
  0%{
      opacity:0;
    }
  100%{
      opacity:1;
    }
}


CSS3는 아주 다재다능한 친구라 기존에는 jquery를 사용해 복잡하게 구현할 수 있던 애니메이션 효과들을 이제는 한 행의 코드만으로 해결할 수 있게 되면서 CSS3는 조금만 배워 둬도 아주 유용하게 사용할 수 있는 친구가 되었네요. CSS에 조금 더 관심을 갖고 포스팅을 늘려 가야겠습니다.

does not have a commit checked out 에러(Git)

git add 시 발생하는 에러를 해결하자

git add 명령어 실행 시 does not have a commit checked out 에러가 발생하는 경우가 있습니다.

이는 레포지토리에 있는 폴더 내 .git 파일이 존재하기 때문이며 이 파일을 모두 제거해주면 문제 없이 git add 실행이 가능합니다.

파일이 숨겨져 있기 때문에 간단하게 폴더나 탐색기를 열고 해당 폴더 내 숨겨져 있는 .git 파일을 찾아 모두 삭제해주고 다시 git add를 실행하면 됩니다.

위와 같이 폴더에서 ‘숨긴 항목’을 체크하여 표시한 다음 .git으로 된 폴더를 제거해주면 됩니다.

  1. git add를 하려는 폴더로 이동
  2. 숨긴 항목 해제 후 .git 폴더 삭제
  3. git add <파일> 실행

간단하게 에러가 해결된 것을 볼 수 있습니다.



기록의 힘을 믿고 간단한 것이라도 기록하는 습관을 기르도록 노력 중입니다!

target으로 부모 요소, 자식 요소 접근하기(자바스크립트,target)

event와 target으로 부모 요소와 자식 요소에 접근하는 방법

자바스크립트는 보통 이벤트와 target을 통해 요소에 접근합니다.

그리고 <div>와 같은 요소를 중첩해서 사용하다 보면 이벤트 발생 시 부모 요소 또는 자식 요소에 접근이 필요한 경우가 있습니다.

예를 들면 다음과 같이 id=2인 div 요소의 이벤트가 발생했을 때 부모 div 요소 id=1에 접근하고 싶은 경우가 있습니다.

const check = (event) => {
    console.log(event.target.id);
}

<body>
  <div id=1>    
        <div id=2 onClick=(check(event))>click
            <div id=3></div>
            <div id=4></div>
        </div>
  </div>
</body>

그렇다면 어떻게 접근을 해야 할까요?

1. 이벤트를 통해 부모 요소 속성 접근하기

현재 이벤트가 발생한 요소를 감싸고 있는 부모 요소에 접근하기 위해서는 target과 parentElement를 사용하여 접근할 수 있습니다.

부모 요소의 id 속성에 접근하는 코드는 다음과 같습니다.

const check = (event) => {
    console.log(event.target.parentElement.id);    // 1
}

<body>
  <div id=1>    
        <div id=2 onClick=(check(event))>click
            <div id=3></div>
            <div id=4></div>
        </div>
  </div>
</body>

실행해보면 콘솔에 1을 프린트합니다.

만약 id가 아닌 다른 속성에 접근하고 싶은 경우에는 id 대신 해당 속성명을 그대로 사용하면 됩니다.

구조를 확인하고 싶은 경우에는 console.log(event.target.parentElement)을 입력하여 확인할 수 있습니다.

console.log(event.target.parentElement)결과

현재 요소를 기점으로 접근을 진행하므로 target을 사용하며, 이벤트가 기점이 되는 경우 currentTarget를 사용합니다.

관련 포스트 : target, currentTarget 차이가 뭘까?


2. 이벤트를 통해 자식 요소 속성 접근하기

위 코드에서 보면 <div id=2>의 자식 요소는 <div id=3>과 <div id=4>입니다.

자식 요소는 target과 children을 통해 접근하는데요.

부모 요소는 하나밖에 없지만 자식 요소는 여럿 존재할 수 있습니다.

따라서 자식 요소는 인덱스를 통해 접근해야 하며, 리액트 코드를 통해 자식 요소의 구조를 살펴보겠습니다.

const accessChildren = () => {

const check = (e) => {
    console.log(e.target.children)
}

    return (
        <div id={1}>    
            <div id={2} onClick={check}>click
                <div id={3}>I'm a first child</div>
                <div id={4}></div>
            </div>
        </div>
    )
}

export default accessChildren;

콘솔에 찍히는 children의 구조는 다음과 같이 두 개의 object를 갖습니다.

따라서 첫 번째 자식 요소의 id에 접근하기 위해서는 다음과 같이 사용하면 됩니다.

const check = (e) => {
    console.log(typeof(e.target.children[0].id)) // 3
}

그렇다면 첫 번째 자식 요소의 텍스트인 I’m a first child는 어떻게 접근할까요?

간단하게 위 children 구조를 열어서 살펴보면 답이 나옵니다.

textContent를 사용해서 접근할 수 있습니다. (innerHTML은 XSS에 취약)

const check = (e) => {
    console.log(e.target.children[0].textContent) //I'm a first child
}


특정 요소가 속한 속성 전체(예를 들면 e.target)를 콘솔에 출력하면 다양한 하위 속성을 확인할 수 있으므로 원하는 속성을 찾거나 에러를 해결할 때 유용하게 사용할 수 있습니다.

Address – Barack Obama Keynote 2004

2004 Democratic National Convention Keynote Address


On behalf of the great state of Illinois, crossroads of a nation, Land of Lincoln,
let me express my deepest gratitude for the privilege of addressing this convention.

Tonight is a particular honor for me because, let’s face it,
my presence on this stage is pretty unlikely.
My father was a foreign student, born and raised in a small village in Kenya.
He grew up herding goats, went to school in a tin-roof shack.
His father, my grandfather, was a cook, a domestic servant to the British.

But my grandfather had larger dreams for his son.
Through hard work and perseverance my father got a scholarship to study in a magical place, America,
that shone as a beacon of freedom and opportunity to so many who had come before.

While studying here, my father met my mother.
She was born in a town on the other side of the world, in Kansas.
Her father worked on oil rigs and farms through most of the Depression.
The day after Pearl Harbor my grandfather signed up for duty.
Joined Patton’s army, marched across Europe.
Back home, my grandmother raised a baby and went to work on a bomber assembly line.
After the war, they studied on the G.I. Bill, bought a house through F.H.A.,
and later moved west all the way to Hawaii in search of opportunity.

And they, too, had big dreams for their daughter.
A common dream, born of two continents.

My parents shared not only an improbable love,
they shared an abiding faith in the possibilities of this nation.
They would give me an African name, Barack, or blessed,
believing that in a tolerant America your name is no barrier to success.
They imagined, They imagined me going to the best schools in the land,
even though they weren’t rich, because in a generous America
you don’t have to be rich to achieve your potential.

They’re both passed away now.
And yet, I know that on this night they look down on me with great pride.
They stand here, and I stand here today, grateful for the diversity of my heritage,
aware that my parents’ dreams live on in my two precious daughters.
I stand here knowing that my story is part of the larger American story,
that I owe a debt to all of those who came before me, and that,
in no other country on earth, is my story even possible.

Tonight, we gather to affirm the greatness of our Nation.
Not because of the height of our skyscrapers,
or the power of our military,
or the size of our economy.
Our pride is based on a very simple premise,
summed up in a declaration made over two hundred years ago.


We hold these truths to be self-evident,
that all men are created equal,
that they are endowed by their Creator with certain inalienable rights,
that among these are Life, Liberty and the pursuit of Happiness.


That is the true genius of America.
a faith, a faith in simple dreams, an insistence on small miracles.
that we can tuck in our children at night and know that they are fed and clothed and safe from harm.
that we can say what we think, write what we think, without hearing a sudden knock on the door.
that we can have an idea and start our own business without paying a bribe.
that we can participate in the political process without fear of retribution,
and that our votes will be counted, at least most of the time.

This year, in this election we are called to reaffirm our values and our commitments,
to hold them against a hard reality and see how we’re measuring up to the legacy of our forbearers
and the promise of future generations.

And fellow Americans, Democrats, Republicans, Independents, I say to you tonight.
We have more work to do, more work to do for the workers I met in Galesburg, Illinois,
who are losing their union jobs at the Maytag plant that’s moving to Mexico,
and now are having to compete with their own children for jobs that pay seven bucks an hour.

More to do for the father that I met who was losing his job and choking back the tears,
wondering how he would pay 4500 dollars a month for the drugs his son needs
without the health benefits that he counted on.
More to do for the young woman in East St. Louis, and thousands more like her,
who has the grades, has the drive, has the will, but doesn’t have the money to go to college.

Now, don’t get me wrong.
The people I meet in small towns and big cities, in diners and office parks,
they don’t expect government to solve all their problems.
They know they have to work hard to get ahead, and they want to.
Go into the collar counties around Chicago,
and people will tell you they don’t want their tax money wasted by a welfare agency or by the Pentagon.

Go in, Go into any inner city neighborhood,
and folks will tell you that government alone can’t teach our kids to learn.

They know that parents have to teach,
that children can’t achieve unless we raise their expectations and turn off the television sets
and eradicate the slander that says a black youth with a book is acting white.
They know those things.

People don’t expect, people don’t expect government to solve all their problems.
But they sense, deep in their bones, that with just a slight change in priorities,
we can make sure that every child in America has a decent shot at life,
and that the doors of opportunity remain open to all.
They know we can do better.
And they want that choice.

In this election, we offer that choice.
Our Party has chosen a man to lead us who embodies the best this country has to offer.
And that man is John Kerry.

John Kerry understands the ideals of community, faith, and service because they’ve defined his life.
From his heroic service to Vietnam, to his years as a prosecutor and lieutenant governor,
through two decades in the United States Senate, he’s devoted himself to this country.

Again and again,
we’ve seen him make tough choices when easier ones were available.

His values and his record affirm what is best in us.
John Kerry believes in an America where hard work is rewarded.
So instead of offering tax breaks to companies shipping jobs overseas,
he offers them to companies creating jobs here at home.

John Kerry believes in an America where all Americans can afford the same health coverage
our politicians in Washington have for themselves.

John Kerry believes in energy independence,
so we aren’t held hostage to the profits of oil companies,
or the sabotage of foreign oil fields.

John Kerry believes in the Constitutional freedoms
that have made our country the envy of the world,
and he will never sacrifice our basic liberties,
nor use faith as a wedge to divide us.

And John Kerry believes that in a dangerous world war must be an option sometimes,
but it should never be the first option.

You know, a while back, a while back I met a young man
named Shamus in a V.F.W. Hall in East Moline, Illinois.
He was a good-looking kid, six two, six three, clear eyed, with an easy smile.
He told me he’d joined the Marines and was heading to Iraq the following week.
And as I listened to him explain why he’d enlisted,
the absolute faith he had in our country and its leaders,
his devotion to duty and service,
I thought this young man was all that any of us might ever hope for in a child.

But then I asked myself,
‘Are we serving Shamus as well as he is serving us?’
I thought of the 900 men and women,
sons and daughters, husbands and wives, friends and neighbors,
who won’t be returning to their own hometowns.

I thought of the families I’ve met who were struggling to get by without a loved one’s full income,
or whose loved ones had returned with a limb missing or nerves shattered,
but still lacked long-term health benefits because they were Reservists.

When we send our young men and women into harm’s way,
we have a solemn obligation not to fudge the numbers or shade the truth about why they’re going,
to care for their families while they’re gone, to tend to the soldiers upon their return,
and to never ever go to war without enough troops to win the war, secure the peace,
and earn the respect of the world.

Now,. Now let me be clear.
Let me be clear.
We have real enemies in the world.
These enemies must be found.
They must be pursued.
And they must be defeated.

John Kerry knows this.
And just as Lieutenant Kerry did not hesitate to risk his life to protect the men
who served with him in Vietnam,
President Kerry will not hesitate one moment to use our military
might to keep America safe and secure.

John Kerry believes in America.
And he knows that it’s not enough for just some of us to prosper,
for alongside our famous individualism, there’s another ingredient in the American saga,
a belief that we’re all connected as one people.
If there is a child on the south side of Chicago who can’t read,
that matters to me, even if it’s not my child.

If there is a senior citizen somewhere who can’t pay for their prescription drugs,
and having to choose between medicine and the rent, that makes my life poorer,
even if it’s not my grandparent.
If there’s an Arab American family being rounded up without benefit of an attorney or due process,
that threatens my civil liberties.

It is that fundamental belief.
It is that fundamental belief.
I am my brother’s keeper.
I am my sister’s keeper that makes this country work.
It’s what allows us to pursue our individual dreams and yet still come together as one American family.

E pluribus unum: “Out of many, one.”

Now even as we speak,
there are those who are preparing to divide us the spin masters,
the negative ad peddlers who embrace the politics of anything goes.
Well, I say to them tonight,
there is not a liberal America and a conservative America,
there is the United States of America.

There is not a Black America and a White America and Latino America and Asian America.
There’s the United States of America.

The pundits,
the pundits like to slice-and-dice our country into red states and blue states.
Red states for Republicans, blue states for Democrats.
But I’ve got news for them, too.
We worship an awesome God in the blue states,
and we don’t like federal agents poking around in our libraries in the red states.

We coach Little League in the blue states and yes,
we’ve got some gay friends in the red states.
There are patriots who opposed the war in Iraq
and there are patriots who supported the war in Iraq.
We are one people,
all of us pledging allegiance to the stars and stripes,
all of us defending the United States of America.

In the end,
In the end, In the end, that’s what this election is about.
Do we participate in a politics of cynicism or do we participate in a politics of hope?
John Kerry calls on us to hope.
John Edwards calls on us to hope.

I’m not talking about blind optimism here the almost willful ignorance
that thinks unemployment will go away if we just don’t think about it,
or the health care crisis will solve itself if we just ignore it.
That’s not what I’m talking about.

I’m talking about something more substantial.
It’s the hope of slaves sitting around a fire singing freedom songs.
The hope of immigrants setting out for distant shores.
The hope of a young naval lieutenant bravely patrolling the Mekong Delta.
The hope of a millworker’s son who dares to defy the odds.
The hope of a skinny kid with a funny name who believes that America has a place for him, too.
Hope, Hope in the face of difficulty.
Hope in the face of uncertainty.
The audacity of hope!

In the end, that is God’s greatest gift to us,
the bedrock of this nation.
A belief in things not seen.
A belief that there are better days ahead.
I believe that we can give our middle class relief and provide working families
with a road to opportunity.

I believe we can provide jobs to the jobless,
homes to the homeless,
and reclaim young people in cities across America from violence and despair.
I believe that we have a righteous wind at our backs and that as we stand on the crossroads of history,
we can make the right choices, and meet the challenges that face us.

America!
Tonight,
if you feel the same energy that I do,
if you feel the same urgency that I do,
if you feel the same passion that I do,
if you feel the same hopefulness that I do,
if we do what we must do,
then I have no doubt that all across the country,
from Florida to Oregon,
from Washington to Maine,
the people will rise up in November,
and John Kerry will be sworn in as President,
and John Edwards will be sworn in as Vice President,
and this country will reclaim its promise,
and out of this long political darkness a brighter day will come.

Thank you very much everybody.
God bless you.
Thank you.


빅오 표기법(Big O notation)을 알아보자

알고리즘의 효율성을 나타내는 빅오 표기법

빅오(Big O) 표기법은 점근적 표기법(Asymptotic Notation)의 하나로 Landau symbol이라고 부르기도 하며, 알고리즘의 효율성(시간 복잡도)를 나타낼 때 사용합니다.

그렇다면 점근적 표기법이란 무엇일까?

점근적 표기법은 중요하지 않은 상수와 계수를 제거하여 알고리즘의 복잡도를 단순화하여 나타낼 때 사용하는 표기법입니다.

점근적 표기법은 빅 세타(Big-θ), 빅 오(Big-O), 빅 오메가(Big-Ω)가 있으며 대략적인 의미는 다음과 같습니다.

빅 오(Big-O)점근적 상한에 대한 표기ex) O(n²)
빅 세타(Big-θ)상한과 하한의 평균에 대한 표기ex) θ(n²)
빅 오메가(Big-Ω)점근적 하한에 대한 표기ex) Ω(n²)

빅 세타와 빅 오메가는 원하는 효율성을 정확하게 나타내지 못하는 관계로 빅 오 표기법이 주로 사용됩니다.

알고리즘의 대략적인 실행 시간만 알면 되므로 빅 오 표기법은 차수가 가장 높은 항만 사용해 수행 시간의 상한(최악의 경우)을 나타냅니다.

예를 들어 f(n)=3n²+2n+1일 때, 빅 오 표기법을 사용하면 O(n²)로 나타낼 수 있습니다.

입력값이 작을 때는 문제가 없지만 입력값이 무한대에 가까워지는 경우에는 기하 급수적으로 복잡도가 증가하며 주요 증가율은 다음과 같습니다.

시간 복잡도n이 2배가 될 경우
O(1)변함 X
O(log n)약간 증가
O(n)2배 증가
O(n log n)2배보다 약간 증가
O(n2)4배 증가
O(n3)8배 증가
O(nk)2k배 증가
O(kn)kn배 증가
O(n!)nn배 증가

증가율을 그래프로 보면 다음과 같습니다.

그래프 기울기가 완만할수록 효율이 좋은 것을 나타내며 기울기가 가파를수록 효율성이 나쁜 것을 의미합니다.

출처 : https://en.wikipedia.org/wiki/Big_O_notation

위 그래프를 통해 상수->로그->선형->다항->지수->팩토리얼의 순으로 효율이 떨어지고 있는 것을 알 수 있습니다.

[BOOK] 다정한 것이 살아남는다

사람답게 살기 위한 한 달에 한 권(2021/11)

우리의 삶은 얼마나 많은 적을 정복했느냐가 아니라 얼마나 많은 친구를 만들었느냐로 평가해야 한다.

책 제목이 눈길을 끌었다.

‘사이좋게 지내자’, ‘다정함이란’, ‘호모 사피엔스는 다정하다’ 같은 이름보다는 확실히 무언가가 있다.

사회화는 남을 이해하는 것에 지나지 않는다는 말은 어찌보면 굉장히 간단한 진리같다.


아기는 생후 9개월부터 상대방의 생각을 이해하기 시작한다고 한다.

그 것을 알아내는 방법이 실로 놀랍다.

‘저길 봐 저길 보라고! 저기!!’ 내가 손가락질을 하는데 대부분의 동물은 내 손끝만 바라본다.

하지만 아기는 9개월이 지나면서부터는 손가락이 가리키는 가상의 선을 따라간다고 한다.

마음 이론(Theory of Mind)이라고 하는 타인의 마음을 읽는 능력을 시작되는 부분이다.

우리는 호모 사피엔스지만 아주 먼 조상은 네안데르탈인과 같은 시대를 살았다.

호모 사피엔스보다 훨씬 근육도 많고 두뇌도 큰 네안데르탈인은 왜 21세기까지 살아 남지 못했을까?

이는 호모 사피엔스가 네안데르탈인보다 힘이 약한 대신 살아남기 위해 협력을 많이 한 결과라고 이야기한다.

곰을 만나면 네안데르탈인은 맞짱을 뜨고 호모 사피엔스는 다구리…..를 친 것으로 보면 될 것 같다.

그리고 사회연결망의 확장을 통해 강력한 피드백 순환 고리가 시작되어 더 나은 기술을 갖게 되면 더 많은 양식을 구하게 되고 이는 또 더 밀도 높은 집단을 이루는 선순환을 통해 현재의 사피엔스가 존재한다고 보는 것이다.

또한 자기가축화 가설을 통해 자연 선택이 다정하게 행동하는 개체들에게 우호적으로 작용하여 유연하게 협력하고 의사소통하는 능력을 향상 시켰으리라 본다.

하지만 이 다정함이 가족, 집단, 민족만을 향하게 되면 다른 사피엔스를 배제하는 위험성도 갖고 있다.

인종 차별이나 전쟁, 테러 등도 지구 상에서 유일하게 문명을 가진 인간만이 행하는 문명의 비극이다.



나도 따뜻한 느낌의 사람이 좋고 항상 그런 사람이 되고자 노력한다.
진화된 사람일수록 다정한 것 같은 생각이 들어서 나도 더욱 진화할 수 있도록 노력해야겠다.
나도 살아남고 싶다.

전복된장국 가볍고 맛있게 만들기

손쉽게 만드는 전복 된장국

재료(2인분): 전복 3개, 양파 반개, 마늘 3알, 부추 1/4줌, 물 500ml, 된장 1스푼, 멸치5마리, 다시다2조각

1. 멸치와 다시다, 물 400ml을 넣고 멸치 국물을 우러내줍니다.
(저는 안옥남 멸치다시팩 하나를 사용했어요.)

2. 다시가 우러나 국물이 노래지고 물이 끓으면 마늘 3개를 아주 잘게 썰어서 넣습니다!

3. 그리고 손질한 전복 3개를 껍질과 함께 투입하고 된장을 한 스푼 넣어줍니다.

4. 그 후 양파를 썰어서 넣고 5분 보글보글 끓이다가 부추를 넣어줍니다!

5. 부추를 넣고 간을 보면 조금 짠데요. 끓이면서 간을 맞추기 위해 국물을 적당량 떠내고 떠낸 만큼 새로운 물을 넣어서 간을 봅니다.

6. 이 과정을 본인의 입맛에 맞을 때까지 하여 간을 맞추면 끝입니다.


간단 설명

  1. 멸치, 다시다 넣고 국물 내기
  2. 마늘 3개를 썰어 넣고 멸치, 다시다 빼기
  3. 전복 3개 투입, 된장 한 스푼 투입
  4. 양파 넣고 5분 끓이기
  5. 부추 넣고 2분 끓이기
  6. 국물을 떠낸 만큼 물을 넣고 간 맞추기