모든 게 멈추었다.

급한 불 앞에선 불끄는 것외엔 집중할 여유가 없다. 불끄다 잠시 눈돌려서 할 수 있는 것이라고는 눈에 들어오는 것에 시선을 잠시 고정시켜 따라가는 것일 뿐.

문득문득 나이듦이 머리를 들고, 잃어버린듯한 기회에 대한 아쉬움도 머리를 들고, 할 수 있을 것 같은 자신감은 외면을 한다.

 

지킬 박사와 하이드씨

지킬이 정상이고 하이드가 살인자, 우리 말 어감상 지킬이 강해 보이므로 이름을 한국식으로 바꾼다.

박재권과 하익두씨라고 하면 좀 더 강한 것 같기도 하고...

객체의 생성이란 무엇인가, 플라톤의 이데아처럼 어딘가에 존재하는 것으로부터 현실에 필요한 속성을 부여하며 만들어지는 것인가, 아니면 옆에 있는 다른 객체를 복사하여 속성을 원하는 대로 고쳐쓰는 것인가?

개발자가 철학적인 사고를 하기 쉬운 것들은 이런 사고가 설계에 도움이 되기 때문아닌가?

c/c++의 struct, class를 생각하면, 텅빈 설계도 같은 것에서 메모리를 차지하면 만들어지는 것은 플라톤의 이데아 같은 것이 생각나고, prototype 객체를 우선만들고 복사한 다음 속성을 변경하여 쓰는 Javascript 같은 것은 후자와 같은 모양 아닐까?

몇 년 된 간단한 생각을 일단 적어 둠.

과거에 BASIC을 배울 땐 서브루틴과 함수가 분리되어 있었다. 포트란도 그러했다. 그러다가 C 언어를 배울 땐, return 유무에 따라 성질이 달라질 뿐 모두 함수로 통합이 됐다. 그러다가 JavaScript를 배울 땐, _객체_로서 함수 개념을 배우게 된다. 이 말은 함수와 자료가 통합되었다라고 말할 수 있다.

Javascript가 구현하는 함수객체는

function func1 ( ) {
  /* code */
}
  • func1()으로 쓰면 { ... } 안의 내용이 실행된다.
  • func1.abc = "def" 로 쓰면 func1를 객체 취급하여 'abc'라는 키를 추가한다.

이런 발상의 전환이 통합의 구체적인 모습이다.

  • func1.apply
  • func1.call
  • func1.bind

이런 함수는 func1 이라는 함수 객체가 만들어질 때 추가되는 속성이라고 생각하면된다.

짧은생각

Javascript와 python에서 제공하는 배열/리스트에서 특정 값의 위치를 찾는 비슷한 명령어로 각각 indexOf, index 라는 메소드가 있다. 이 둘은 찾지 못했을 때의 특성이 다른데,

  • Javascript: -1 을 return 한다.
  • Python: ValueError 예외를 발생한다.

언어를 다루다보면 이 둘은 묘한 선택의 순간을 만드는데, 전자는 매번 return 값을 확인해야하고, 후자는 앞 뒤로 예외 처리 구문을 넣어야한다.

Javascript/Java/C++ 계열에 익숙하다보면 정상적인 처리를 해야하는 상황을 예외를 발생시켜 점프하는 것에 약하지만 부담을 느낀다. 스택을 되돌리는 백그라운드 작업에 원하는 모든 리소스 해제는 잘 일어나는 것일까랄지, 단순히 값 하나만 비교하면 되는데 굳이 예외를 위해 백그라운드로 일어나는 작업을 컴파일러에게 맡겨야하나라든지 아무래도 부담스럽다.

Python 쪽에서는 없는 인덱스로 -1을 return 하는 순간 list[-1] 접근하는 것은 마지막 원소에 접근하는 방법이 되므로 아무래도 오류가 아닌 값처럼 인식될 수 있다. Javascript에서도 Array.slice(음수값)으로 python의 음수값 처럼 사용가능하지만 어쨌거나 기본적인 인덱스 연산으로는 접근이 불가능하므로 -1을 return 해도 큰 문제는 없다. python의 인덱스 연산은 -1에 대해 정상 작동하기 때문에 예외를 일으키는 방법밖엔 선택지가 없어 보인다.

추신

이 생각은

 50 function get_attrs(filter) {
 ...
 60   var attrs = [ 
 61       {name:"charset-configured", value: "utf-8"},
 62       {name:"charset-supported", value: "utf-8"},
          ....
 70   ];
 ...
 85   return attrs.filter(function (attr) {
 86     return ~filter.indexOf(attr.name)
 87   })
 88 }

이런 코드를 읽다가 86줄의 -1 에 대한 negate (~) bit operation을 보다가 꼬리를 문 생각임.

python dictionary 의 update 함수는 return 값으로 None을 되돌린다. 이거 dict 자신을 return 하면, copy와 더불어 더 간단한 method-chain으로 쉽게 쓸 수 있는 일이 많았을텐데, 왜 None인것이야?

요샌 일부러 마크다운편집이 가능하면 그걸 써보려고 노력한다. 오래 알아왔지만, 글 쓰는 일이 줄어들어 마크업이 할 일이 줄어 드니 영 느리다. 그래서 간단한 의식의 흐름대로 기술을 할 때, 쓰는 나와 읽는 당신의 관계에서 단순히 글의 연속으로 전달되는 것이 아닌, 강약이 전달되려면 강조 혹은 병렬적 정보전달은 필요한 것 아닌가 싶다.

머라고 주절 주절 쓰는 것은 사실 마크다운 문법을 테스트하기 위함이지 그 ^이상^도

이하

도 아니다. 어떤 문법은 것은 지원되지 않을 수도 있음을 고려해서 테스트해 본다.

문법을 익히는데 쓰는 글은

  1. 의미가 없어도 상관없고,
  2. 표현이 거칠거나
  3. 맥락을 뛰어 넘는 전개

가 이루어지기도 한다.

그래도 글의 모양을 갖추려면,

  • 가독성이 고려되어야하고
  • 적당한 길이어야하며
  • 무엇보다 독자가 실망하는 일이 없어야한다.

당신은 문법 연습을 하는 것이지, 실제 의미 있는 글을 쓰는 것이 아니기 때문이다.

오늘은 여기까지 연습하자.

'밀리-마이크로-나노-피코'로 이어지는 1/1000 단위의 스케일을 내 주위에서 느껴보는 것을 도와주는 명상법이며, 1분도 안 걸리며 세상과 잘 감응하는 방법이다. 숨을 거칠게 쉬거나 참으면 오히려 예상치 못한 교란이 일어날 수 있으므로, 마음을 잡아주는 용도로 사용한다.

각 단계에 숫자를 붙여서 0) 미터, 1) 밀리, 2) 마이크로, 3) 나노, 4) 피코의 단계로 점점 내려간다고 생각하면, 우리는 의식하지 않아도 0단계 규모의 사물을 인식하면서 산다.

우리의 주의 집중을 0 단계로 하면서, 엘레베이터를 탄다. 네 개의 사물을 보거나 상상한다. 1초에 하나씩.

거울, 긴 막대 손잡이, 모서리에서 모서리, 외부에서 엘레베이터 탄 내 모습을 상상한다. 

이들은 0단계에서 관찰되는 1미터 언저리의 사물들이다.

곧바로 우리의 주의 집중을 1 단계로 내린다. 우리 머리속에선 1미터를 100개의 조각으로 나누고 다시 10조각으로 나눠 그 중 하나를 상상하면된다. 여기엔 밀리미터의 세계이며, 대략 1~10mm 정도의 사물들을 본다. (중간에 0.5 단계로 센티미터단계를 둘 수도 있으나 갈 길이 멀다) 여기에 기록한 크기는 암기를 위해 해당 구간에서 선택한 숫자이며, 엄밀성을 위해서는 다시 찾아 볼 것을 권한다. (인간을 170센티미터라고 말할 때, 그것은 모든 인간의 크기가 아니라 스케일의 크기이므로 당신의 감정 변화가 없는 것과 같은 이치이다.)

엘레베이터 버튼의 점자 기호(2mm), 거울의 얼룩(10mm), 공지사항 작은 글씨들(1mm),
눈에 띄는 무늬의 끝(1mm), 미세플라스틱(5mm), 물곰(1mm)

우리는 이제 맨눈으로 보기엔 어렵거나 불가능한 2단계로 내려간다. 1 mm를 100조각 그리고 다시 10조각으로 나눈다.

머리카락(100µm), 거미줄(10µm), 미세먼지(10µm), 적혈구(6µm), 기침 비말(5µm),
초미세먼지(2.5µm), 대장균(1µm), 유산균(1µm)

앞 사람의 머리카락은 대략 20~120 마이크로미터 정도로 우리눈에서 쉽게 관찰 될 수 있는 마이크로 단위의 굵기이다. 혹 어딘가에 거미줄이 있다면 그것도 마이크로 단계의 사물이다. 이 마이크로단계에서는 박테리아(세균)의 세상이며, 버튼을 누르는 순간 손끝에 묻어 있는 세균들은 잠시 기름과 함께 버튼에 머물 수 있다. 마이크로 단계는 우리가 주의하면 직접 혹은 간접적으로 느끼며 살 수 있는 한계선이다.

다시 한 단계 더 내려간 3단계 나노의 세계로 들어간다. 1000조각으로 또 나눈다.

 빨간색파장(700nm)~보라색 파장(400nm), 코로나 바이러스(100nm), 노로 바이러스(40nm),
 반도체의 크기(7nm), 적혈구안의 헤모글로빈(6nm), 회전 나선 DNA의 두께 (4nm)

코로나 바이러스는 세균인 대장균보다 1/10정도 작다. 바이러스는 빛의 파장보다도 작다. 빛의 파장은 400-700nm이며, 이 때문에 광학현미경으로 볼 수 있는 한계가 수백 나노이다.

이제 더 깊은 단계로 내려가자 다시 1000조각을 만들어 본다. 내가 내쉬는 숨 속에 이산화탄소, 물 분자인 수증기들이 섞여 있다. 엄청난 양이 입속에서 쏟아져 나온다.

수소 원자(25pm), 물분자(200pm)

이들은 반 데르 발스의 힘이 적용되는 범위의 크기인 분자의 크기를 생각하면된다. 분자들은 서로 밀쳐내면서 자기만의 공간을 만든다. 이것은 피코세계에서 상상할 수 있다. 물분자를 생각하다가 갑자기 레드썬!

1mm = 1/1000 (1/10-3; 천분의 일)
1µm = 1/1000000 (1/10^-6; 백만분의 일)
1nm = 1/1000000000 (1/10^-9; 10억분의 일)
1pm = 1/1000000000000 (1/10^-12; 1조분의 일)

1Å = 1/10000000000 (1/10^-10; 100억분의 일) = 0.1nm = 100 pm

npm, yarn을 설치했다면, bootstrap theme 변경을 위한 초간단 테스트를 할 수가 있다.

#!/bin/bash  
mkdir bootstrap-customizing  
cd bootstrap-customizing  
yarn init -y  
yarn add bootstrap node-sass  
mkdir -p public/css  
yarn node-sass --recursive --output public/css \  
  --source-map true --source-map-contents true \  
  node_modules/bootstrap/scss

bootstrap은 scss로 관리되고 있으므로 yarn(npm)으로 받아다가 바로 컴파일 해 볼 수가 있다. 위의 예는 directory 만들고, 빠르게 node package 를 초기화한 다음, bootstrap과 node-sass 컴파일러를 받은 후 directory to directory로 scss 파일을 css로 바꾸는 방법이다.

헛소리

반려동물은 키우지 않지만, 의외로 매일 영상을 보게 된다.

고양이가 몇 천년 동안 사람과 같이 살면서도, 불로 고기를 구워 먹으면 소화가 빠르다는 사실은 모르는 것 같다. 모르겠지.

이 색, 혹시.... 정말 아는데 귀찮아서?

  1. 심쓴 2020.04.08 15:42

    집사를 시키지요.

+ Recent posts