리눅스는 주로 까만 화면의 터미널로 사용하지만, 가끔은 X Window 응용프로그램을 사용해야할 때가 있다. (xcalc 랄지...) 난 리눅스를 데스크탑으로 사용하지 않으므로, X System 전체를 설치하지 않는다. 이런 상황을 해결하기 위해서 맥북에 X Window를 설치하고 ssh X portforwarding을 하면 되는데, 다음과 같은 방법으로 한다.

Linux 에서

1. sshd의 X11 포트포워딩을 허용한다.

$ sudo vim /etc/ssh/sshd_config

확인!


X11Forwarding yes

설정 파일 내용중 X11Forwarding yes 가 아니라면 고쳐주고 sshd를 재시작한다. 요즘 systemctl로 관리하므로,

systemctl restart sshd

MacOSX에서

1. X Window를 설치한다.

$ brew cask install xquartz

2. XQuartz의 tcp 접속을 허용한다.

$ defaults write org.macosforge.xquartz.X11 nolisten_tcp 0

3. DISPLAY 환경 변수를 설정하여 맥 터미널에서도 쉽게 접속할 수 있도록 한다.

export DISPLAY=:0

4. 접속!

$ ssh -X targethost




센서로부터 측정되는 데이터는 전압,전류,저항 값들이다. 그 값을 온도, 기압, 광량, 풍속 등에 매핑하여 각종 의미를 부여한다.

어느 한 순간에 모든 센서의 데이터를 측정한다고 해보자. 이것을 하나의 프레임이라 정한다면 하나의 프레임은 동일 시간대의 모든 센서의 값의 모음이다.

만약 프레임을 벡터로 나타낸다면, (현재 시각, 온도, 습도, GPS 위도, GPS 경도, 빛의 세기, 지구 자기) 이런 식으로 하나의 벡터는 하나의 시간에 표현할 수 있는 모든 데이터의 집합으로 나타낼 수 있다.

또한 만약 1초에 100번의 측정이 일어난다면 저 벡터가 1초에 100개가 생성된다고 할 수 있겠다. 조금 더 나아가서 각 센서 마다 측정되는 주기가 다르다면 어떤 데이터는 비어 있을 수 있는데 이것은 연속량이라고 가정했을 때 대략 측정되는 중간 값을 추정하면 해당 시각의 값을 추정하여 얻을 수 있다. (인터폴레이션, 혹은 보간 이라는 방법으로 알려져있다)

이런 데이터를 저장할 수 있는 가장 좋은 형식은 어쩌면 멀티미디어 파일 아닐까? mkv, mp4 등의 컨테이너들은 내부에 여러 채널을 두고 있다. 또한 각 데이터들은 시간의 흐름에 따른 데이터를 저장하기에도 충분하다.

시간 흐름에 따른 데이터를 적절한 codec을 두어 저장한다면, 굳이 보간법을 이용하여 추정하여 기록하지 않아도 측정 데이터만 넣어두고 codec을 이용하여 특정시간에서의 값을 추출할 수 있게 된다.

이도 저도 아니면, 평면 이미지의 흐름을 저장하는 데이터만으로도 가능하다. 이미지의 각 점을 특정 센서의 측정값으로 저장하면 640x480 짜리 동영상은 30만개나 되는 센서의 흐름을 표현할 수 있기 때문이다.

노회찬의원의 죽음을 애도하며.

오늘 스스로 목숨을 끊으셨다는 말을 듣고, 한동안 충격이 가시지 않았다. 아마 애정의 정도가 강한 공인이었기 때문에 더욱 그러했던 것 같다. 하루 종일 지인들의 애도와 여러 또 다른 진보지식인들의 추모의 글 혹은 정의당원들의 글들을 보면서, 심정적으로 지지했던 많은 사람들의 감정이 무너져 내렸음을 보게 되었다.

나 또한 그러하다. 무슨 말을 더 할 수 있을까. 아무리 그가 잘못했을지라도 그간 내가 지지해 온 사람이라는 이유만으로 그 잘못의 크기보다 기대의 크기가 더 크기 때문에 안타깝다.

그 동안 내가 좋아하는, 심정적 지지를 하는 사람들의 잘못에 대해 어떻게 볼 것인가에 대한 생각을 이 기회에 좀 더 해야겠다. 잘못을 인지하는 순간 내면에서는 일종의 방어기제가 작동한다. 믿어온 대상으로부터 상처 받지 않기 위해서, 면죄부를 주고 일상을 회복하는 것을 보아야 내 내면의 충격이 완화되기 때문에 그런 것이다.

우리는 노 의원에게도 기회를 얼마든 줄 수 있었다. 그의 지지자들 중에 반성하는 모습에도 불구하고 기회를 박탈할 사람이 얼마나 될까. 아마 반대편에 있는 사람들은 끊임없이 이용하려들겠지만, 기회가 될 때마다 사과하고 진정성있는 모습을 계속 보이면 그간의 쌓아온 신뢰를 저버리지는 않을 것이다.

실수하지 않는 인간은 없다. 다만 비겁한 인간만 있을 뿐이다. 내가 잘못의 당사자가 되었을 때, 난 비겁하지 않을 수 있을까 반문해야한다. 타인의 시선이 내 인생의 전부인 것처럼 살다가 돌이킬 수 없는 결정을 하지는 말아야한다.

난, 오늘 그냥 당신의 선택에 대해 계속 반문하고 싶다. 꼭 선택을 그렇게 하셔야만 했느냐. 잘못의 당사자가 된 것이 그렇게 견딜 수 없으셨냐. 당신은 늘 유쾌하게 호통할 수 있는 사람아니었느냐. 왜 당신에게 내리는 선택은 그렇게 가혹하셨느냐.

오늘을 잊을 것같아 오늘을 박제해 둔다.



Promise 기반의 fetch 라이브러리의 최대 단점은, json으로 예상하고 parsing했는데, 오류가 생겨서 원문 text를 구해야하는 상황에서, 한 번 사용된 body라 다시 쓸 수 없다고한다.


그렇다.

서사라는 것은 시간의 흐름에 따라 떠오르는 생각을 표현하는 것이다. 그것이 말이 되기도하고 말이 되지 않기도 한다. 생각이 몇 단어 혹은 몇 장면으로 매핑이 되는 정보 손실은 일어 날 수 밖에 없다. 그럼에도 불구하고 두 개의 지점에서 (뇌 혹은 데이터 저장소) 같은 '것'을 공유하기 위해서는 어떤 식으로든 서사적으로 표현된다. 손실을 최소화하는 방향으로 서로가 합의하게 되면서 시간을 단축할 수 있고, 시간 효율성을 높일 수 있다.

무작위 시도와 효율적인 것의 취사 선택의 누적은 자연의 진화에서 일어 났듯이, 매 일상에서 반복되는 것이며, 모든 독립 개체간에 발생하는 것이다.

인간이 꿈을 꾼다는 것은 일종의 무작위적인 시도의 결과이다. 그나마 근사하게 전달의 효율이 높은 방향에서의 전개를 선택했기 때문에 뭔가 말이 되는듯 되지 않는 것이다. 이런 무작위의 말도 되기도하고 되지않기도하는 꿈이 뇌리에서 사라진다는 것은 때론 원치않는 상황이기도하다. 하지만 취사선택에 빠른 두뇌 신경망은 중요도에 대한 판단을 심각하게하지 않으며, 곧 망각하게 된다. 꿈을 오래 간직하고 싶다면 기록을 하는 정도의 영구 보존 영역으로 옮겨야한다.

말이 되는 장면만 최대한 선택해서 말이 되는 표현으로 최대한 기록해야한다.

퇴근, 변명, 얼굴

딸에게 해주고 싶은 말이 하나 떠 올랐다.

친하려고 다가오는 사람 중에서 피해야 할 사람이 둘 있는데, 하나는 위선자이며 다른 하나는 자기가 바보인지 모르는 사람이다.

물론 그 다가오는 사람이 남자라 가정하고 생각난 말인데, 이 말은 반대입장으로 누군가에게 다가갈 때 자신에게도 적용할 만한 말이다.

이제 곧 스무살이 되면(2년뒤) 자취시키려 내보내겠다는 말을 하니 제발 그렇게 해달라는 말을 듣고나서, 사무실로 출근하고 나서도 여운이 남아 떠오른 생각이다.

생각하면 우습기는 하지만, 자취하는 젊은 여인에 대한 남자들의 환상을 알려줘야하지 않나 싶어서다. 

하나는 문제가 생길 것이 뻔한 결론으로 진행 될 것같고 다른 하나는 아무 일도 없고 귀찮은(?) 존재가 되기 싶기 때문에라는 얕은 경험의 결과이다.

그래도 될 수 있으면, 뭔가 솔직한 사이, 좀 더 건설적인 주제가 오고 갈 만한 사람을 만났으면 좋겠고, 또한 딸도 그런 사람이 되길 바라는 마음에서랄까.

.

.

.

이 생각 끝에 갑자기 이종학이 떠 올랐다. 별 이유가 없이. (피식) 언제 술 한 잔 해야지.

한동안 블로그를 하루에 하나씩은 쓰려고 노력한 적이 있었는데, 어느 순간에서부터 멈추게 됐다.

이제는 그 이유마저 희미해진채 습관하나를 잃어 버린채 살고 있다. 


문득 나도 모르게 자투리 시간마저 쓸어 담아 어딘가로 버리며 산다. 

틈틈이 쉬지 않고 뭔가를 본다. 짬짬이 쉬지 않고 뭔가를 듣는다.

말하기 쓰기보다 듣기와 보기를 반복하는 것은 내면이 허전하기 때문이다.


평생을 배우다가 사라지는 아무 의미 없는 존재가 되고 싶지는 않다.

뭔가를 어설프게 실행하는 아마추어가 되고 싶지도 않다.


감정에 솔직할 수도 없고,

생각대로 살 수도 없고,

눈치보며 살고 싶진 않고,

마음대로 살 수도 없다.


조급한 여유로움이 정신을 휘감고

부러워하는 나태함이 마음을 억누른다.


生의 列車는 멀고 먼 消失點을 향해 끝내는 사라지려고 달려간다.

노래하는 고속도로를 지날 때 언젠가는 한 번 정리해봐야겠다고 도로의 홈 간격에 대한 생각.

일단 속도마다 다른 음이 날테니까 기준되는 속도를 100km/h로 정해보자.

100km/h는 초속으로 100*1000m/3600sec 이므로 1000/36 m/s = 27.7777 m/s


100km/h = 27.7777 m/s

시속 100km를 달리면 1초에 28m를 간다.


기준음 '라'는 진동수가 440Hz라는 것은 그냥 알고 있다. 즉, 1초에 440번 두드리면 '라' 소리가 난다.

옥타브가 하나 올라가면 진동수가 배가 된다. 즉 한 옥타브 높은 '라'는 880Hz다.

한 옥타브는 12개의 반음이 있다. 

평균율 음계에서의 음의 증가는 주파수를 log를 취했을 때 일정한 간격으로 증가하는 것을 알고 있다.

즉,


880Hz = 2 * 440Hz

log 880 = log (2 * 440) = log 2 + log 440

한 옥타브가 올라가면 주파수의 로그값은 log 2 만큼의 증가가 일어난다. 그러면 12개 들어 있으므로 하나의 반음은  log2의 1/12만큼 증가한다.


피아노 건반을 보면 도는 라부터 반음 3개를 더한만큼의 주파수를 가지게 된다. 따라서, 도의 주파수를 X라고 한다면


log X = log 2 * (3 / 12) + log 440

X = 10 ^ (log 2 * (3 / 12) + log 440)

X = 10 ^ (log 2 * (3 / 12)) * 440 = 523.2511 (Hz)


즉, 1초에 523번 두드리면 '도' 음이 난다.
만약 시속 100km로 달린다면 1초에 28m (27.7777m)를 간다.
28Hz의 소리를 낸다면, 1m 마다 한번씩 홈을 내면 되는 것이고,
280Hz라고 한다면 0.1m (10cm)마다 한번씩 홈을 내면 된다.
즉 계산식을 만들자면, 100km/h로 달릴때는,
28m 혹은 2800cm를 원하는 진동수로 나누면 될 것 같다.


만약 도, 레, 미, 파, 솔을 연주한다면, 


도 = 라 + 반음 3개

레 = 라 + 반음 5개

미 = 라 + 반음 7개

파 = 라 + 반음 8개

솔 = 라 + 반음 10개


이므로, 각각의 Hz를 구하면

10 ^ (log 2 * (3 / 12)) * 440 = 523.2511

10 ^ (log 2 * (5 / 12)) * 440 = 587.3295

10 ^ (log 2 * (7 / 12)) * 440 = 659.2551

10 ^ (log 2 * (8 / 12)) * 440 =  698.4564

10 ^ (log 2 * (10 / 12)) * 440 = 783.9908


각각을 시속 100km/h인 초속 27.7777m/s, (2777 cm/s)에 대해서 나누면

2777 / 523.2511 = 5.3 cm (도)

2777 / 587.3295 = 4.7 cm (레)

2777 / 659.2551 = 4.2 cm (미)

2777 / 698.4564 = 4.0 cm (파)

2777 / 783.9908 = 3.5 cm (솔)


간격으로 홈을 내면 연주할 수 있다. 그리고 28m가 1초이므로 대략 9m 홈을 내면 는 0.3초정도 지속 될 것 같다.



리눅스의 실행프로세스의 환경변수는 /proc 파일시스템을 통해서 알 수 있다. 예를 들어 pid 1000번의 환경변수는 


cat /proc/1000/environ


로 확인 할 수 있다. 하지만, 이 결과는 변수간 구분이 잘 확인이 안된다. 변수간 구분을 '\0'으로 분리시켜 놓았기 때문이다. 실제 프로세스 메모리에서도 '\0'으로 구분되어 있고 이를 그대로 화면에 출력하는 것이다. 다음을 보자.


cat /proc/1000/environ | xargs -0 -n 1 echo


xargs 는 표준 입력을 명령의 argument로 전달해 실행해주는 함수인데, 이때 기본값은 공백을 사용하여 표준입력을 분리한다. 하지만 위와 같이 '-0' (zero) 옵션을 주면 구분자를 '\0'으로 하라는 뜻이며, '-n 1' 을 주어 하나의 인자마다 하나의 명령을 실행(여기서는 echo)하라는 의미가 된다.


사족으로 xargs의 -0 옵션은 find 의 -print0 옵션과 같이 사용하여 출력결과를 실행시에 적절하게 처리하는데 사용한다.

vimscript로 실행 파일을 만든다면, python이 흔히 그러하든 #!을 맨 앞에 두어


#!/usr/bin/env vimscript


echo 10 + 20


이런 식이 될 수 있다. 그럼 vimscript는 기존의 vim을 이용하도록 만들 수 있는데, 몇가지 옵션을 줘야한다.


  • Swap file (.sw*) 파일을 만들지 말 것 (-n)
  • 고전의 vi 모드로 동작하지 말 것 (-N)
  • Visual mode가 아닌 ex 모드로 시작할 것 (-E)
  • 시작시 조금 조용하게 시작할 것 (-s)
  • .viminfo 파일을 읽지 말 것 (-i NONE)
  • vim option 중 verbose 는 1로 두어 출력을 완전 끄지 말 것 (-c 'let &verbose = 1')
  • 본문을 source 하여 실행 할 것 (-c 'source %')
  • 맨 마지막에 개행을 두고 종료할 것 (-c 'echo ""', -c 'qa!')

#!/bin/bash


exec /usr/bin/env vim -n -N -E -e -s -i NONE -c 'let &verbose=1' -c 'source %' -c 'echo ""' -c 'qa!' -- $@


위와 같이 두 줄짜리 ~/bin/vimscript 파일을 만들어 실행 속성을 주면 되겠다.

+ Recent posts