CSS selector 우선순위, 명시도(specificity)

요소 선택자(Element Selector) 점수 계산하기

CSS에서는 요소의 선택자에 따라 우선순위가 나뉜다.

우선순위 가중치를 통해 스타일을 적용할 순서를 결정하지만 현재는 가중치 계산 방식이 브라우저별로 다르기 때문에 선택자의 상대 우선순위를 알아두는 것이 더 좋다.

예를 들어 기존에는 가중치가 class:10, id:100으로, class 10개가 1개의 id와 동등한 가중치를 가졌지만 현재는 가중치가 달라져 일부 브라우저에서는 256개의 class가 1개의 id와 동등한 우선 순위를 가진다. (참고:stackoverflow)

선택자는 다음과 같은 우선순위를 가진다.

!important > inline style > id > class (pseud0) > element (pseudo)

따라서 선택자별로 상대적인 가중치를 판단하여 높은 순서에 따라 왼쪽부터 comma로 구분하여 계산하는 것이 좋다.

높음inline style , id , class (pseud0) , element (pseudo) <낮음
Ex1) 0 , 1 , 2 , 1
Ex2) 0 , 0 , 200 , 10
👉 Ex1이 Ex2보다 가중치가 높음

예를 들어 다음과 같이 id, class 선택자가 모두 사용되는 경우 우선순위에 따라id 스타일이 적용된다.

.myMenuClass{
  color:green;
}

#myMenuId{
  color:red;
}

<h1 id="myMenuId" class="myMenuClass">This is it</h1>

그리고 가중치의 합산은 다음과 같다.

#myMenuId{
  color:red;
}

.myMenuClass{
  color:blue;  
}

h1#myMenuId{
  color:orange;  
}

<h1 id="myMenuId" class="myMenuClass">This is it!</h1>

우선 순위를 계산해보면,

#myMenuId : 0,1,0,0 / .myMenuClass : 0,0,1,0 / h1#myMenuId : 0,1,0,1

따라서 마지막 orange color가 적용된다.

!important는 모든 가중치를 무시하고 최우선적으로 적용하는 치트키와 같다. !important가 요소에 중복되는 경우 가장 뒤에 선언된 !important가 적용된다.

하지만 !important의 사용&남용은 평화로운 생태계를 위협하는 존재가 될 수 있으므로 최대한 사용하지 않는 것이 정신 건강과 코드 구성에도 좋다.

마지막으로 예외 사항도 알아보자.

우선순위 없음: *,:where()
가중치 포함하지 않음: >, ~, +
가장 높은 가중치 하나만 선택: :is(), :not()
ex) :is(#menuId, .menuId, span) -> 가중치 가장 높은 #menuId만 카운트

맥에서 localhost 접속 시 dns_probe_finished_nxdomain 에러 처리

맥(Mac)에서 사용자 지정 localhost 호스트 도메인 수정하기

localhost를 기본 설정으로 사용하면 문제없이 로컬 서버에 접속이 가능하지만 local.page.com 등과 같이 임의로 주소를 설정하게 되면 위와 같이 사이트에 연결할 수 없다는 DNS 에러가 발생합니다.

기본적으로 localhost의 주소는 127.0.0.1으로 설정되어 있으므로 localhost를 주소로 사용하면 문제없지만 localhost의 주소명이 바뀐다면 별도의 설정을 통해 알려주어야 합니다.

맥에서 설정 파일은 다음 위치에 있습니다.

/private/etc/hosts

이 파일을 vi 에디터를 통해 설정해보겠습니다(관리자 권한 필요).

% sudo vi /private/etc/hosts

명령어를 실행하고 패스워드를 입력하면 다음과 같은 화면이 나옵니다.

여기에 임의의 주소명과 이 주소명이 찾아갈 IP를 넣어주면 됩니다.

i 키를 누르면 편집이가능하며 앞에는 host 주소 127.0.0.1, 뒤에는 사용할 임의의 주소명을 넣어보겠습니다.

입력 후 저장을 위해 ESC를 누른 뒤 :를 입력, 다시 콘솔에 qw! 를 입력하고 엔터를 치면 저장이 완료됩니다.

완료 후 로컬 서버를 실행하고 local.page.com에 접속하면 문제없이 접속되는 것을 확인할 수 있습니다.

[BOOK] 엄마 나는 자라고 있어요(The Wonder Weeks)

사람답게 살기 위한 한 달 한 권(2022/08)

사람답게 살기 위해 한 달에 한 권씩 읽고자 했지만 환경이 나를 사람답게 살게 해주지 않았다(?). 하지만 그렇다고 책을 안읽은 것은 아니니 뒤늦은 후기.

출생 후 20개월까지 아기는 10번의 정신적인 도약과 함께 어려운 시기가 찾아오고 정도의 차이만 있을 뿐 모든 아기는 예외없이 이 시기를 겪으면서 성장한다.

도약 시기는 다음과 같다.

5주 (35일-42일)
8-9주 (56일-70일)
12주 (84일-91일)
15-19주 (105일-140일)
23-26주 (161일-189일)
34-37주 (238일-266일)
42-46주 (294일-329주)
51-54주 (357일-385일)
60-64주 (420일-455일)
71-75주 (497일-532일)

도약 단계에서는 친숙한 세계가 뒤죽박죽이 되면서 불안해진 아기는 엄마에게 더 붙어있으려 하고 자신의 생명이 시작된 곳으로 돌아가려 한다.
생존을 위한 반사행동(손바닥을 자극하면 주먹을 쥐거나 세우면 걷거나 하는 등)을 지속적으로 자극하면 발달이 진전되는 것을 방해할 수 있어 반사 행동을 유발시키는 것은 좋지 않다.

그리고 도약기를 맞이하는 아기를 위해 필요한 부모의 마음가짐은 다음과 같다.

– 모든 아기는 같은 월령에 도약을 한다.
– 아기가 모든 것을 처음부터 완벽하게 하지는 못한다.
– 운동 능력에만 주안점을 두지 않는다.
– 도약기는 엄마에게 붙어있기, 울기, 칭얼대기, 이 외에도 몇 가지 증상이 더 있을 수 있다.
– 도약하는 아기를 능동적으로 돕는다.
– 도약으로 인한 새 능력 획득 시기는 아이마다 다르다.
– 완벽보다 하려는 사실이 중요하다.
– 외적 상황으로 도약기에 접어들었음을 모를수도 있다.
– 도약 = 스트레스 = 저항력 저하
– 도약은 긍정적인 것이다.

아기에게 필요한 수면의 양은 월령과 연령에 따라서도 다르며 개인에 따라서도 차이가 난다. 아기가 어른보다 수면 리듬이 빠르고 수면 주기가 훨씬 짧다.
그리고 아기는 성인과 다르기 때문에 어른의 수면 욕구와 리듬을 아기에게 투사하는 것은 옳지 않다.
아기는 어른과 같은 패턴으로 잠을 자는데 필요한 두뇌 속 중추가 아직 성숙하지 않은 상태이기 때문이다.

성인은 어두워지면 멜라토닌이 생성되고 코르티솔(주의력 호르몬)이 줄어들어 긴장이 풀어지고 잠들기 쉬운 상태가 된다. 즉 잠을 푹 자려면 특정 물질이 분비되어야 하는 것이다.

그러나 신생아는 아직 수면 각성 리듬이 존재하지 않고 호르몬 대사도 성인과 다르기 때문에 생물학적으로 밤낮 리듬을 가질 수 없다. 따라서 밝기에 상관없이 불규칙적인 리듬을 갖게 되는 것이다.

신생아는 체온에서 밤낮 리듬이 시작된다.
생후 7주부터는 차츰 혈액 속에서 옅은 멜라토닌이 확인된다. 생후 2개월에는 수면 각성 리듬의 전 단계에 도달하고 3개월 차에는 낮잠이 줄어들고 밤잠이 늘어나게 된다. 생후 15주부터는 24시간으로 이루어지는 아기의 수면 패턴을 확인할 수 있다.

그러나 모든 아기는 개성이 다르므로 통계에 너무 연연할 필요는 없다.

신생아 시기의 특징은 다음과 같다.

– 20cm 이내의 사물을 볼 수 있다.
– 음악을 좋아하고 사람들의 목소리를 좋아한다. 목소리는 아기에게 안정감을 준다.
그러나 갑작스럽고 시끄러운 소음은 좋아하지 않고 쉽게 놀란다.
– 체온 조절을 잘하지 못하므로 체온이 쉽게 떨어진다.
따라서 오래 산책하는 것은 좋지 않다.
– 신체접촉을 좋아한다. 신체 접촉은 아기를 달래는 최상의 방법이자 최고의 놀이다.
– 아기와 함께 집구경을 하면서 설명하여 엄마의 목소리를 들려준다.
– 모든 것을 보고 듣고 냄새맡고 만져보게 한다. 
– 엄마 목소리 듣기를 좋아한다. 티비는 엄마의 목소리에 집중할 수 없어 불안해할 수 있다.
– 깨어있을 때 시야에 재미있는 것을 둔다.
– 아기는 음악을 좋아한다. 부드러운 배경 음악은 아기에게 안정감을 줄 수 있다.
– 신체 접촉은 엄마의 뱃속을 기억나게 하고 안정감을 준다. 

아기는 키우는 것은 놀랍도록 신비하면서도 인간이라는 존재에 대한 놀라움을 매번 깨닫게 해주는 것 같다.
힘들지만 즐겁고 뿌듯하지만 알 수 없는 묘한 기분은 무엇일까.

유모차에 달기 좋은 아기용 호빵맨 인형 구입기(일본 직구)

촉감과 두뇌 발달을 위한 호빵맨 인형 직구의 기록

살짝 술취한 아저씨처럼 보이기도 하지만 그래도 귀엽기만 한 호빵맨.

유모차에 달고 다니기 위해 일본 직구로 구매하였다.

일본명 앙빵만アンパンマン。

크기는 30cm정도로 작지는 않지만 알차다.

반다이(BANDAI) 사의 제품으로 배송비까지 30,000원 가량이 들었지만 호빵맨을 찬찬히 뜯어보면(뜯지 말고 살펴보면..) 정말 돈이 아깝지 않다.

대상 연령은 3개월부터~

아가의 뇌 발달을 목표로 하는 인형으로 외형이 범상치 않다.

우선 발이 짝짝이다. 진짜 술취한 건가 싶지만..

촉감을 위해 의도적으로 한 쪽은 수건 촉감, 한 쪽은 매끄러운 유사한 촉감을 낸다고 한다.

턱받이 밑에는 세균맨도 숨어있다.

진짜 깜찍하지 않을 수 없다.

거울도 달려있고 거울 옆부분은 헝겁책처럼 바스락거리는 소리를 내기도 한다.

물론 몸 속에도 딸랑이를 지니고 있다.

실리콘밸리에서 영감을 받은 것 같은 사과 모양의 치발기도 함께다.

양쪽 어깨에도 색상과 촉감이 다른 끈이 달려 있어서 아기가 가지고 놀 게 많다.

크기치고 비싸긴 하지만 만듦새가 좋아 계속 우와~를 감탄한 인형이라 센스있는 선물로도 좋을 것 같다.

다만, 해외 배송은 2주 정도 걸리더라구요.

rgba를 사용해 opacity의 상속 문제 해결(투명도 조절)

자식 노드에 상속되는 opacity와 단독적인 rgba

부모 노드에 opacity 효과를 주면 자식 노드에도 상속되어 투명 효과가 함께 적용됩니다.

자동으로 상속이 되므로 다음과 같이 표시됩니다.

아래 설정으로 색상을 지정한 결과입니다.
배경 black
opacity:0.5
background:yellow
background:red

보다시피 yellow, red에 opacity가 적용되어 색상이 흐려진 것을 볼 수 있습니다.

그렇다면 이 상속 문제를 해결하기 위해서는 어떻게 해야 할까요?

간단하게 opacity 대신 rgba를 사용하면 됩니다.

투명도를 포함하는 색상의 지정은 다음과 같습니다.

rgba(R, G, B, opacity);

다음과 같이 사용할 수 있습니다.

위 박스에 해당하는 색상인 #9ADFFD을 rgba 방식으로 표현해보겠습니다.

16진수를 10진수로 변형한 값인 9A=154, DF=223, Fd=253을 각각 R, G, B 위치에 넣어주고 마지막 인수는 0~1 사이의 값을 넣어주면 됩니다.

background : rgba(154, 223, 253, 0.5);

이제 자식 노드는 opacity가 적용되지 않으므로 색상이 선명해진 것을 확인할 수 있습니다.

검은 배경을 사용해도 자식 노드에 선명도가 살아난 것을 확인할 수 있으며 이를 통해 상속되지 않는다는 것을 알 수 있습니다.

테스트에 사용한 코드는 다음과 같습니다.

<div class="div0">
    <div class="div1">
      modify
    </div>
    <div class="div2">
      delete
    </div>
</div>

.div0{
  height:100px;
  background : rgba(0, 0, 0, 0.5);
  display:flex;
  justify-content:center;
  align-items:center;
}

.div1{
  width:200px;
  height:50px;
  background-color:gold;
  display:flex;
  justify-content:center;
  align-items:center;
  color:white;
}

.div2{
  width:200px;
  height:50px;
  background-color:red;
  display:flex;
  justify-content:center;
  align-items:center;
  color:white;
}

웹스톰(Webstorm)에서 prettier 활성화하기

웹스톰에서 prettier를 설정하는 방법

웹스톰(webstorm)에는 기본적으로 prettier가 설치되어 있습니다.

그러므로 npm 또는 yarn을 통해서 node_modules에 prettier를 설치해주고 prettier관련 설정만 해주면 됩니다.

npm install --save-dev --save-exact prettier

위와 같이 설치해준 뒤 File -> Settings -> Languages & Frameworks -> JavaScript -> Prettier에 들어가서 다음과 같이 설정해줍니다.

Prettier package에는 node_modules/prettier가 위치하는 주소를 지정하고 아래 체크 박스를 모두 체크해주면 저장 시에도 prettier가 작동이 됩니다.

작동이 안될 때는 웹스톰을 재시작.

prettier 작업의 단축키는 alt+ctrl+shift+p 입니다.

청계산곤드레집에서 건강한 한끼

청계산에서 지나칠 수 없는 곳

청계산 입구에 위치한 곤드레 밥집입니다.

하산 후 막걸리와 함께 먹는 그 맛이야 말할 필요도 없고 그렇지 않더라도 산뜻하고 기분 좋은 맛을 느낄 수 있습니다.

기본 메뉴인 곤드레밥과 도토리묵을 주문한 상차림입니다.

‘추가밥 주세요!’하면 밥도 계속 리필이 가능하고 반찬도 물론입니다.

오랜만에 너무 맛있다고 와이프가 두 번이나 밥을 추가해서 먹는 그 맛!

또 다른 날 찍은 그 맛!

시간이나 요일에 따라 대기가 있는 날도 있는 것 같지만 저희는 바로 들어가서 자리를 잡을 수 있었습니다.

메뉴는 이런 느낌!

주차는 발렛이고 비용은 1,000원입니다.

현금을 내거나 식사 후 발렛 비용을 함께 결제하고 영수증과 발렛 키를 주면 차가 돌아옵니다.

집으로 오는 길의 양재천 메타세콰이어길은 언제 봐도 따뜻합니다.

[BOOK] 돈으로 살 수 없는 것들(What Money Can’t Buy)

사람답게 살기 위한 한 달 한 권(2022/07)

사고 판다는 경제학의 논리가 더 이상 물질적 재화만이 아닌 현대인의 삶 전체를 지배하기 시작했다.

1980년대 초에 시작된 시장지상주의(market triumphalism)는 번영과 자유를 향한 열쇠가 정부가 아닌 시장에 있다는 로널드 레이건(Ronald Reagan)과 마가렛 대처(Margaret Thatcher)의 신념에 따라 탄생하였다.

그 후 시장(market)은 공익을 달성하는 주요 수단이라는 신념이 강화되었다.

하지만 오늘날 이 신념은 강하게 의심받고 있고, 시장지상주의의 시대가 막을 내리고 있는 것으로 보인다.

시장에서 금융 위기가 발생하면서 시장과 도덕이 분리되고 있다는 인식이 강해졌다.

탐욕이 금융 위기에 큰 역할을 했지만 더 큰 원인은 시장 가치가 원래 속하지 않던 삶의 영역으로 팽창한 것으로 볼 수 있다.

이러한 상황에서 돈으로 사서는 안되는 것이 있을까?

이제는 탄소배출권, 대리모 출산, 이민 권리, 명문대 입학 허가 등 30년 전에는 상상하지도 못했던 것들을 거래하는 시대가 되었다.

그렇다면 무엇이 문제일까?

돈으로 모든 것을 사고 팔 수 있을 때 발생하는 문제점은 불평등과 부패, 즉 거래가 차별의 근원이 되기 때문이다.

요트와 스포츠카, 휴양지 등 부수적인 즐거움을 누릴 수 있는 것이 빈부 차의 전부라면 큰 문제가 되지 않는다.

하지만 정치 영향력, 의료, 주거지 안정, 교육 기회 등 부에 따라 다른 기회와 혜택이 주어지기 때문에 근원적인 문제가 발생한다.

많은 경제학자들이 말하길 시장은 교환되는 재화에 영향을 미치지 못한다고 생각한다.

하지만 이는 사실이 아니며 시장은 언제나 흔적을 남긴다.

벌금과 요금을 통해서도 초래하는 문제를 확인할 수 있다.

벌금은 도덕적으로 승인 받지 못하는 행동에 대한 비용이고, 요금은 도덕적 판단이 배제된 단순한 가격이다. 

하지만 벌금을 요금으로 취급하면 어떻게 될까?

벌금을 요금으로 대하면 벌금이 나타내는 규범을 무시하게 된다.

공공의 이익에 가장 부합하는 것은 스스로 참여할 수 있게 하여 스스로 정할 수 있는 권리를 부여하는 것으로 돈으로 사는 것보다 다 더 큰 지지를 이끌어낼 수 있는 방법이다.

도덕적 신념이나 흥미와 같은 내재적 동기와 돈과 보상과 같은 외재적 동기는 차이가 있다.

내재적으로 가치를 두는 활동에 참여하는 사람에게 돈을 지급하면 흥미와 헌신을 밀어내고 가치를 떨어뜨려 동기유발을 약화시키는 결과를 낳는다.

사회, 경제적으로 이타주의를 무모하게 사용하면 다른 공공의 목적을 위해 쓸 ‘이타주의’의 공급량이 고갈된다고 하지만 이타주의, 관용, 결속, 시민정신은 사용할수록 고갈되는 상품이 아니라 오히려 운동하면 발달하고 더욱 강해지는 근육에 가깝다고 봐야 한다.

시장과 상업이 재화의 성질을 바꾸는 상황을 목격했다면 시장에 속한 영역은 무엇이고 시장에 속하지 않은 영역은 무엇인지도 의문을 던져야 한다.

재화의 의미와 목적, 재화를 지배하는 가치를 두고 깊은 사고 없이는 이러한 질문에 대답할 수 없다. 

우리는 반대에 부딪힐까바 두려워 자신의 도덕적, 정신적 확신을 공공의 장에 내보이기 주저하고 시장이 대신 결정을 내리도록 허용하게 된다. 

사회 전반에도 불평등이 심화하면서 모든 것이 시장의 지배를 받는 현상은 부유한 사람과 그렇지 못한 사람들의 삶을 점차 분리하게 된다.

배경, 사회적 위치, 태도, 신념이 다른 사람들이 매일 생활하며 서로 마주하고 부딪히게 되면 서로의 차이를 견뎌내고 협상하게 되고 공공의 선에 관심을 쏟게 된다고 한다. 

결국 우리가 마주하는 시장의 문제는 어떻게 함께 살아가고 싶은가에 관한 문제가 된다.

개발자의 일본어 사전(開発の辞書)

開発者がよく使う単語コレクション

일본어 서적을 번역하면서 정리하는 개발 용어.

영어 단어를 그대로 쓰는 카타카나가 많지만 장음이나 표기법 등의 참고를 위해 함께 정리.



上書き [うわがき] – 덮어쓰기(overwrite)
受け取る [うけとる] – 받다(receive)
アクセス [あくせす] – 액세스(access)
値 [あたい] – 값(value)



コンポーネント [こんぽーねんと] – 컴포넌트(component)
コールバック [こーるバック] – 콜백(callback)
切り替え [きりかえ] – 전환(convert)
環境 [かんきょう] – 환경(environment)
組み合わせ [くみあわせ] – 조합(combination)
関数 [かんすう] – 함수(function)



実装 [じっそう] – 마운트(mount)
疎結合 [そけつごう] – 소결합(loose coupling)
設計 [せっけい] – 설계(design)
スキル [すきる] – 스킬(skill)
座標 [ざひょう] – 좌표(coordinate)



トリガー [とりがー] – 트리거(trigger)
デプロイ [でぷろい] – 배포(deploy)
ツール [つーる] – 툴(tool)
データ [でーた] – 데이터(data)
テキスト [てきすと] – 텍스트(text)



認証 [にんしょう] – 인증(identification)



振る舞い [ふるまい] – 동작(behavior)
ヘッダー [へっだー] – 헤더(header)
ボディ [ぼでぃ] – 바디(body)
引数 [ひきすう] – 인수(argument), 함수 호출 시 전달 값
パラメータ [ぱらめーた] – 파라미터(parameter), 함수 정의 시 전달 값
フロントエンド [ふろんとえんど] – 프론트엔드(frontend)
フロー [ふろー] – 흐름, 플로우(flow)



マイグレーション [まいぐれーしょん] – 마이그레이션(migration)



やりとり – 주고 받음
呼び出す [よびだす] – 호출(call)



ルーティング [るーてぃんぐ] – 라우팅(routing)
レンダリング [れんだりんぐ] – 렌더링(rendering)


interface, type 차이점이 뭘까(Typescript)

비슷하지만 동일하지 않은 interface vs type

타입스크립트에서 타입을 선언하기 위해서는 interface 또는 type 키워드를 사용합니다.

각각의 선언 방식은 다음과 같으며 =의 유무만 다릅니다.

// interface
interface Team{
  name : string
}

// type
type Team = {
  name : string
}

그리고 타입의 확장 방법은 다음과 같습니다.

// interface
interface City extends Team {
  city : string
}

// type
type City = Team & {
  city : string
}

interface와 type의 가장 큰 차이점은 바로 선언적 확장(Declaration Merging) 기능인데요.

선언적 확장이란 이미 선언된 타입 선언에 필드를 추가하는 것입니다.

하나는 가능하고 하나는 가능하지 않은데 interface만 가능한 것이 특징입니다.

사용 방법은 다음과 같습니다.

interface Team {
  name : string
}

interface Team {
  manager : string
}

위와 같은 방법으로 이미 선언된 interface에 다시 필드를 선언할 수 있습니다.

하지만 type을 다음과 같은 방법으로 사용하면 에러가 발생합니다.

type Team = {
  name : string
}


// Error 발생 -> 'Duplicate identifier 'Team'
type Team = {
  manager : string
}

추가로 type은 원시형(number, string 등) 데이터를 다른 이름으로 지정해서 사용할 수 있지만 interface는 불가능합니다.

자세한 내용은 다음 코드와 같습니다.

//type으로 원시형 데이터의 이름을 지정
type NameDataType = string;

const printName = (name : NameDataType ) => {
  console.log(name);
}

//interface는 불가
interface NameType extends string {
}

차이점을 신경써도 되지 않을 상황이라면 취향에 따라 선택하면 되지만 기본적으로는 interface를 쓰면 큰 문제가 없다고 합니다.

참고 : typescript 공식 문서