일상2016. 4. 16. 12:30

국립중앙도서관 '특별 견학'을 다녀왔습니다.


25명씩 2개팀으로 나뉘었는데, 저는 두 번째 팀이었어요. 두 번째 팀은 10여 명밖에 안되어 조금 더 잘 들을 수 있었습니다. 문헌정보학과같은 도서 관련 분야를 전공하는 여대생도 있는 것 같아요. 질문 내용상 느낌이. 견학은 1시간 20분 정도 걸렸어요. '문학상 수상 작품전' (본관 1층 왼편) -> 자료보존센터(자료수집과, 국가서지과) -> 자료 보존실(자료보존센터 2층) -> 문학실(본관 2층) -> 디지털 도서관 -> 지하 보존 서고(지하 3층만) 순으로 견학을 했습니다.


[ 국립중앙도서관 ][ 국립중앙도서관 ]



이번 견학 중 2번째로 흥미로웠던 곳이 '자료보존실'이었습니다. '복원'과정과 '보존 기한 늘리는 작업' 방법을 들을 수 있었거든요. 이 곳에 계신 학예연구사분들 존경스럽습니다. 책이 상하기 전에 생명 연장될 수 있도록 처리하시고, 상처가 나면 낫게 해주시는 분이잖아요. 책을 고치는 의사죠.


[자료보존센터][자료보존센터]


학예연구사 분의 말씀을 메모한 내용입니다.


  • 청나라에서 1800년대에 조선 왕에게 보낸 문서 등을 보존 처리.
  • 1년에 10만 권(?) 복원 처리.
  • CD, DVD도 보존 기한을 늘리는 처리를 한다.
  • 매체 변환 작업도 함께 진행한다.

  • 1970~1980년대 이전 책은 산성화가 되어 바스러지는 현상이 일어난다. 이 현상이 나타나기 전에 산성도(pH)를 측정해서 산성화 4정도(?)일 때 -> 알칼리를 스프레이 형태로 책에 뿌려준다. 보존 연한이 2~3배로 늘어난다는 연구 결과가 있다.
  • 이 처리는 한 번만 하면 더이상 하지 않아도 된다.
  • 1900년대 시작부터 70~80년대까지 '산성지'로 많이 만들어졌고, 90년대 이후 '중성지'를 주로 사용했다.
  • 책이 살기 좋은 환경 : 온도 20~22도, 습도 45~50%.
  • 가정에서 하는 좋은 책을 위한 환경 : 온습도의 급격한 변화와 직사광선은 산성화 가속. 이를 피한다. 책 윗부분 먼지를 청소기로 주기적으로 처리.

[ 책에 알카리를 뿌려 보존 수명을 2~3배 연장한다. ] (KBS 캡쳐)[ 책에 알카리를 뿌려 보존 수명을 2~3배 연장한다. ] (KBS 캡쳐)


  • 보존 및 복원 처리하시는 학예연구사분들은 문화재보존학과, 제지학과 등을 전공했다.
  • 용인대, 공주대 등에 이런 학과가 있고 전통학교에서도. 영국, 일본에서 보존 공부하고 오신 분도 있다.



이번에 일반인에 최초 공개한 '지하 보존 서고'를 볼 수 있는 기회를 가져서 정말 행복했습니다. 보존 서고는 책을 영구 보존하기 위한 곳입니다. 후대를 위해. 보존 서고는 여러 층인데 지하 3층만 공개했습니다. 들어가자마자 모두들 '우와~'라는 감탄사가 절로 나왔어요. 9단으로 된  레일식 책장에 책이 엄청나게 꽂혀 있었습니다. 보존 서고에 10분 가까이 있었어요.


지하 보존 서고 들어가는 과정부터 설명할게요.


지하 보존 서고는 사진 촬영이 불가능했고요, 가방은 입구에 놔두고 들어갔습니다. 긴 지하 복도를 걸어갔는데요, 걸어가는 동안에 CD와 DVD를 보존하는 '비도서서고'가 있었습니다. 이곳은 보여주지 않았어요. 조금 더 들어가니 천장에 컨베이어벨트를 볼 수 있어요. 도서관이 넓다보니 책은 컨베이어 벨트 시스템으로 서고로 들어온다고 하네요. 책에게는 이게 고속버스죠. 담당자들은 전동차로 이동을 합니다.



[ 지하 보존 서고로 들어가는 이중문 중 두 번째 문 ]  (보존 서고는 사진 촬영이 불가능해서 KBS 캡쳐)[ 지하 보존 서고로 들어가는 이중문 중 두 번째 문 ] (보존 서고는 사진 촬영이 불가능해서 KBS 캡쳐)



지하 복도 끝에 아주 두꺼운 이중문이 있어요. 이 문을 열고 들어가면 바로 아래 사진과 같은 보존 서고가 나옵니다. 이걸 보는 순간 입이 딱 벌어져요. 쭈욱 걸어가면 끝에서 다시 양쪽으로 갈 수 있도록 되어 있어요. 그러니깐 서고 내부는 T자 모양으로 걸을 수 있어요. 다른 통로가 있는지도 모릅니다.



[ 지하 보존 서고 ] (KBS 캡쳐)[ 지하 보존 서고 ] (KBS 캡쳐)



다음은 설명해주신 분의 말씀을 들으면서 급하게 메모한 것입니다. (※ 잘 못 들은 부분도 있을지 몰라요)


  • 비도서서고 : CD, DVD를 보존. 전자파 차단 시설이 되어 있음.

  • 보존 서고는 국내 최초 밀집형(?) 서고.

  • 보존 서고는 지하 3층에서 지하 5층까지.

  • 서고가 굉장히 넓은데 여러 개로 쪼개놨다. 30여 곳(?). 쪼개면 온도, 습도 등 관리가 좋기 때문.

  • 1,200만 권 보관 가능. 50%정도 찼음


  • 책이 살기 좋은 환경 : 온도는 18~22도, 습도 45~55%를 유지. 사무실에서 원격 조정. ('자료보존실'에서 설명하신 분은 온도는 22도 이하 20도 전후, 습도는 45~50%라고 말씀하셨습니다. 따라서 정확한 수치를 기억할 필요는 없을 것 같아요. 대략적 수치만 알면 될 듯. 실제 온습도계를 봤더니 21.?도, 습도는 50도가 조금 안되었습니다.)

  • 천장의 소화 시설은 스프링쿨러가 아니라 가스식 소화 설비

  • 평상시 전등 꺼짐. 서고에 들어올 때 불 켜짐. 책 보존을 위해.


  • 비닐로 싸진 책(비닐 봉투에 담겨있는 형태)은 일부분이 손상을 입은 책이다. 부스러질 수 있기 때문에 보존을 위해 비닐로 싸서 보관한다.

  • 여기 있는 책의 80%는 디지털화되어 있다.

  • 이곳의 책은 보존이 목적이므로 폐기는 절대 없다.

  • '납본'이라고 해서 출판사에서 국립중앙도서관으로 2권씩 보내온다. 한 권은 보존 서고에, 한 권은 열람실에. 만약 도서관에 한 권만 들어오면 이곳에 영구 보존한다.


※ 납본관련해서 자료수집과에서 들은 얘기를 간단히 적으면. 구입, 기증, '납본' 3가지 형태로 모든 책이 빠짐없이 수집된다. 하루에 적으면 500권, 많으면 1,000권이 들어온다. 2015년 46만 권 수집. 도서관법에 의해서 일정기간내에 2권을 반드시 납본해야 한다. 납본하지 않으면 벌금. 벌금은 책값의 10배. 논문도 납본하는데, 대학도서관에서 납본한다.


책장은 전동식으로 움직입니다. 사람이 책장과 책장 사이에 끼일 수 있잖아요. 책장에 안전바가 달려있어서 안전바가 사람을 탁 치면 멈추게 되어 있답니다.



[ 지하 보존 서고 ] (KBS 캡쳐)[ 지하 보존 서고 ] (KBS 캡쳐)



위 사진에서 책장 측면에 작은 화면 보이죠? 그게 전동식으로 이동하도록 조절하는 장치입니다. 부팅할 때 보니깐, Windows XP더군요. 그리고 책장에 안전바가 달려있다고 했잖아요. 왼쪽 책장의 3단 위쪽을 자세히 보면 빨간색 라인이 쭈욱 보일 거에요. 이게 안전바인 것 같아요. 추측입니다. ^^


실제로는 전동식을 잘 쓰지 않는다고 하네요. 에너지 절감도 있지만 수동으로 레버를 돌리면 가볍게 움직이더라고요. 정말 부드럽게 잘 움직입니다.



마지막으로 곁다리로 느낀 것. 자료수집과, 국가서지과에 근무하시는 분들의 상당수가 여자였고, 설명해주신 분도 모두 여자분이었습니다. 문학과 여자가 잘 어울리잖아요. 책과 함께 일하는 곳과 여자도 딱 맞나봐요.


하루 50명씩 총 200명(미참석자 감안하면 실제로는 150명이 안될 듯) 한정해서 최초 공개했습니다. 그래서 견학 경험을 공유해야 할 것 같더군요. 예상 질문이 있었는데 설명할 때 이미 다 하시더라고요. 또 함께 견학한 분들이 질문을 잘 해주셔서 많은 도움이 됐습니다.


견학 장소 별로 담당자 분들이 설명을 해주셨어요. 모두 정말 설명을 잘 해주셨고, 친절했어요. 소중한 시간이었고 정말 감사합니다. 다음에는 직장인들을 위해 주말 견학이 생겼으면 좋겠네요. 직장인이라 시간내는 게 쉽지 않아서.


Posted by 좋은진호
IT이야기2015. 12. 3. 12:30

IRC와 요즘 대세인 slack을 연동할 수 있다. slack에서 메시지를 쓰면 IRC에서 볼 수 있고, 반대도 마찬가지로 주고 받을 수 있다. 아주 간단하다. slack-irc( https://github.com/ekmartin/slack-irc )을 설치하면 끝난다.





node.js로 만들어져있으므로, node.js부터 설치힌다.


# curl -sL https://rpm.nodesource.com/setup | bash -

# yum install -y nodejs


$ npm install -g slack-irc


JSON형식의 config파일을 만든다. 확장자는 반드시 .json으로 한다.


[ config.json ]

{

  "server": "aoa.hanirc.org",

  "nickname": "coffeenix-slack",

  "token": "????-??????????-...생략...",

  "channelMapping": {

    "#irc": "#cnx"

  }

}


server는 IRC서버명, nickname은 IRC에서 사용할 닉네임이다. token은 https://api.slack.com/web 에서 확인할 수 있다. 만약 token이 외부에 유출되었다면 'Re-issue token'버튼을 클릭하여 새로 만든다. channelMapping에서 "#irc"는 slack의 채널명이고, "#cnx"는 IRC 방이름이다. slack 채널명은 일반 채널이면 '#채널명' 형태로, 비공개 채널(Private channel)이면 '채널명'으로 설정하면 된다.



Slack API 호출에 사용할 Token[ Slack API 호출에 사용할 Token ( https://api.slack.com/web ) ]



실행해보자. IRC에는 coffeenix-slack이라는 유저가 접속될 것이다.


$ slack-irc --config config.json



Slack과 IRC 연동[ Slack과 IRC 연동 ]


이상없다면, 스크립트를 만들어 백그라운드로 돌린다.


#!/bin/bash


nohup /usr/bin/slack-irc --config config.json &



Posted by 좋은진호
시스템이야기2015. 12. 2. 18:29


logstash


logstash를 통해 수집된 데이터를 elasticsearch에 쌓고 있다. 수집된 데이터를 elasticsearch에 넣지 않고 로그파일로 저장할 필요가 생겼다. lnav 같은 쉘용 로그분석툴을 사용하기 위해서.


output {

    file {

         path => "/data/log/%{+YYYY_MM_dd}.log"

         message_format => "%{message}"

    }

}


위와 같이 설정했을 때 2015_10_13.log 파일명으로 로그를 쌓는다. 그런데 한가지 문제가 있다. logstash 시간은 UTC기준이라서, 우리나라 시간 AM 9시 이전은 2015_10_12.log 파일명에 쌓고, 9시 이후는 2015_10_13.log 파일명에 쌓는다.


다음과 같이 설명하면 서버의 timezone 기준(KST)으로 날짜 파일명에 로그를 쌓을 수 있다.

filter {

    ruby {

        code => "event['date_index'] = event.timestamp.time.localtime.strftime('%Y_%m_%d')"

    }

}


output {

    file {

        path => "/data/log/%{date_index}.log"

        message_format => "%{message}"

    }

}



Posted by 좋은진호
일상2015. 10. 21. 02:12


위대한 탈출[ 위대한 탈출 ]


노벨경제학상 디턴 교수님의 책 <위대한 탈출>을 작년에 한국경제신문에서 출간했습니다. 한겨레경제사회연구원 한 분이 왜곡번역을 한 것으로 의심된다는 글( ‘위대한 왜곡’ ? 앵거스 디턴의 위대한 탈출 번역에 관하여 )을 올렸습니다.


한국경제신문이 펴낸 <위대한 탈출>은 단순히 마케팅만 자기들 입맛대로 한 것이 아니었다. 이 책은 ‘그들’의 입맛에 맞게…


o 부제목뿐만 아니라 부(part), 장(chapter), 절(section)의 제목이 대부분 바뀌었고,

o 절의 경우, 원문의 절 구분을 빼는 동시에 없던 절 제목을 집어넣기도 했고,

o 원문의 내용 중 일부를 자기들 멋대로 생략했을 뿐만 아니라

o 심지어 자리를 옮기기도 했으며,

o 어떤 경우엔 원문에 없는 것을 집어넣은 것으로 보이기까지 한다.

[ 출처 : 위 블로그 ] 



<위대한 탈출>의 한줄평[ 책<위대한 탈출>의 한줄평. 별 5개로 도배되어 있다. ]


그런데 아직 반성하지 않는 것 같습니다. YES24에 갔더니 한줄평은 별 5개로 도배되어 있습니다. 의심이 갈 수 밖에 없어요. 총 107개의 한줄평 중에 왜곡번역 의심을 제기(10.18일)한 뒤인 19일 ,20일에 105개가 올라와 있습니다.


★★★★★ 101개

★★★★☆ 2개

★★☆☆☆ 1개

★☆☆☆☆ 3개


105개 중


- 직접 구매한 사람 1명

- 왜곡 번역을 알고 별 1개를 준 사람 3명

- 그리고 별 2개를 준 1명


이렇게 5명을 빼면 총 100명이 됩니다. ^^ 같은 닉네임이 몇 개 보이고, 그들의 블로그에 가보면 같은 이벤트에 참여한 글이 보입니다. 왜곡된 책을 빨리 완판하려고 애를 쓰는 것 같네요.


저에게는 읽고 싶지 않는 출판사가 한 곳 더 늘었네요.


[ 관련기사 ]


* 노벨경제학상 수상자 앵거스 디턴의 '위대한 탈출' 한글판에는 '범죄 수준'의 왜곡번역 있었다 (허핑턴 포스트, 10.20)

* 노벨경제학상 디턴 교수의 <위대한 탈출> 어떻게 오역이 됐나 (T TIMES, 10.20)

* 노벨상 수상자 저서도 제멋대로 번역..디턴의 '위대한 탈출' 왜곡 의혹 (경향신문, 10.20)

* 한경PB "디턴 교수에게 사과, 개정판 낼 것" (미디어오늘, 10.20, 한경PB측의 입장에 대한 기사)


Posted by 좋은진호
시스템이야기2015. 6. 29. 13:16

왜 FreeBSD는 2015년 7월의 윤초(Leap Second)에 대한 얘기가 없을까 싶을 것이다. 얼마전에 쓴 '2015년 윤초(Leap second) 삽입 관련 서버 점검사항'(2015.6.22.)에서도 리눅스(Linux)만 언급했다. 얘기가 없는 건 문제가 없기 때문이다.



2012년 윤초 삽입 때, 저는 FreeBSD서버에서 아무 것도 한 것이 없다.

윤초로 발생하는 문제가 없기 때문에 서버는 단지 1초의 시간차만 맞춰주면 된다.
이미 서버들은 시간동기화가 셋팅되어 있기 때문에 1초는 자동으로 맞춰진다. 따로 할 것이 없는 것이다.


(1) 상위 NTP 서버들(당신의 서버 아님) <-> (2) 내부 NTP서버 (당신이 관리하는 서버) <-> (3) ntpdate를 실행하는 다수의 서버들


위에서 나와 관련된 서버는 2번과 3번.


(2) ntpd 데몬을 돌리는 서버는 자동으로 상위 NTP 서버로 부터 윤초 삽입이 되어 시간동기화된다.
(3) 나머지 서버들은 내부 NTP서버를 통해 자동 동기화된다. (ntpdate 명령)


FreeBSD에서 윤초는 신경쓰지 말고, 편히 운영하세요.

FreeBSD 문서에 윤초를 다룬 'FreeBSD Support for Leap Seconds' 글이 하나 있는데 참고로 읽어보세요.


We believe and expect that FreeBSD, if provided correct and stable NTP service, will work as designed during this leap second, as it did during the previous ones.
... 생략 ...
In practice, leap seconds are usually not a problem on FreeBSD. We hope that this overview helps clarify what to expect and how to make the leap second event proceed more smoothly.



Posted by 좋은진호
IT이야기2015. 6. 24. 12:36

등록한 사람이 없겠지라는 생각으로 확인했는데, 등록되어 있다. 5월 등록이면 '아몰랑'이 언론에 나올 시점일텐데, 이렇게 발빠른 분들이 있다니, 놀랍다. 제가 등록하고 싶은 맘은 없고, 그냥 궁금해서.


$ whois_list.sh amolrang
amolrang.co.kr       => Registered Date : 2015. 06. 09.
amolrang.or.kr       => No match
amolrang.re.kr       => No match
amolrang.pe.kr       => No match
amolrang.go.kr       => No match
amolrang.kr          => Registered Date : 2015. 06. 09.
amolrang.com         => Creation Date: 11-may-2015
amolrang.org         => No match
amolrang.net         => Creation Date: 09-jun-2015


한글 도메인도 확인해봤다.


$ whois_list.sh 아몰랑
아몰랑.co.kr         => No match
아몰랑.or.kr         => No match
아몰랑.re.kr         => No match
아몰랑.pe.kr         => No match
아몰랑.go.kr         => No match
아몰랑.kr            => Registered Date : 2015. 05. 13.
아몰랑.com           => Creation Date: 15-may-2015
아몰랑.org           => No match
아몰랑.net           => Creation Date: 15-may-2015


아몰랑.com, 아몰랑.net은 도메인 정보가 블라인드 처리되어 있다. 도메인 정보가 모두 등록기관 정보로 되어 있고, 메일주소도 admin_AT_whoisblind.com 로 되어 있다. 의심은 간다. '아~몰라~몰라~몰랑~~~'


Registrant Name: Whois Domain Admin.
Registrant Organization: Whois Domain Admin.
Registrant Email: admin_AT_whoisblind.com


* 관련글

2011/08/13 - [IT이야기] 쥐박이와 명박이 도메인 (현재는 이 도메인들 모두 등록되어 있지 않음)

Posted by 좋은진호
시스템이야기2015. 6. 19. 12:17

zabbix 를 오래 운영하면 zabbix DB가 무럭무럭 자라서 용량이 상당히 커지고 속도도 느려진다.
수집한 데이터는 오래될수록 필요가 없으므로 이 데이터는 제외하고, 'zabbix 설정값만' 뽑아서 zabbix DB를 새로 구축하려고 한다.


[ 조건 ]
- 수집한 데이터는 버린다.
- 설정값(호스트, 템블릿, ...)만 받는다.
- zabbix DB를 새롭게 시작한다.

zabbix


1. 설정값만 백업하기

Zabbiz 2.0, 2.2, 2.4를 지원하는 zabbix-mysql-dump 라는 간단한 스크립트가 있다.
https://github.com/maxhq/zabbix-backup/wiki 에서 셀스크립트를 다운 받는다.

스크립트에서 zabbix DB 접속 정보와 mysqldump 경로(스크립트내에서는 /usr/bin/mysqldump로 되어 있음)를 확인한다.


DBHOST="127.0.0.1"
DBNAME="zabbix"
DBUSER="..."
DBPASS="..."


스크립트를 실행하면 현재디렉토리 dump 파일이 생겼을 것이다.


# sh zabbix-mysql-dump
# ls
zabbix_localhost_20150526-1347.sql.gz


스크립트로 dump 받은 것 외에 trigger에 의해 발생한 event정보를 옮기고 싶다면, zabbix 데이터 중에 2가지가 추가로 필요하다.


1) trigger에 의해 발생한 event를 담고 있는 'events' 테이블 데이터
2) 각 event에 대해 코멘트가 담긴 'acknowledges' 테이블 데이터


[ zabbix : trigger에 의해 발생한 event 정보 ]


# mysqldump --opt --single-transaction --skip-lock-tables --extended-insert=FALSE -u zabbix -p zabbix \
  acknowledges events > zabbix_acknowledges_events.sql



2. zabbix DB를 새롭게 구축하기


1) zabbix server 데몬을 내린다.
2) MySQL 서버를 내린다.
3) 기존 zabbix innodb파일을 다른 이름으로 임시 백업해둔다.
   zabbix 스키마( MySQL DATA DIR/zabbix/) 는 그대로 둔다.


4) MySQL 서버를 실행한다.
5) 조금 전에 dump받은 셋팅값을 넣어준다.
   gunzip zabbix_localhost_20150526-1347.sql
   mysql -u zabbix -p zabbix < zabbix_localhost_20150526-1347.sql


   기존에 있던 zabbix 테이블을 drop하고 -> 새로 create -> 셋팅값 insert


6) 별도로 백업받은 acknowledges 테이블의 데이터를 insert한다.
   acknowledges 테이블의 데이터를 기준으로 해당된 event만 뽑아 insert한다.


7) zabbix server를 올린다.

Posted by 좋은진호
IT이야기2015. 5. 25. 11:00

'실리콘밸리 견문록'의 저자 이동휘씨는 구글 본사 검색팀에서 소프트웨어 엔지니어로 일하고 있다. 구글 본사에 몇 분의 한국인이 있는지는 모르겠다. 그러나 구글 본사 한국인이 쓴 구글 경험담 책은 몇 권인 줄 안다. 이 한 권 뿐이다. (찾아보니 더 있었다. '이준영'씨가 쓴 '구글은 SKY를 모른다')


책 '실리콘밸리 견문록'


어떤 남자가 자기 집의 보일러가 고장나 서비스를 요청했다. 서비스센터 기술자는 몇 분 만에 그 문제를 해결했다. 수리비를 청구하자 서비스 요청한 사람은 몇 분 수리한 것도 없는데 왜 이리 비싸냐고 따졌다. 그 기술자는 이렇게 말했다.

"이 수리비는 몇 분 걸린 것에 대한 비용이 아니라 몇 년 간의 경험을 통해 알게 된 시간에 대한 비용입니다."


이 책이 바로 그런 책 같다. 이동휘씨는 이 책을 몇 달 동안 썼다고 한다. 몇 년간의 경험을 몇 달 동안 썼고 독자는 몇 시간 만에 읽는다. 그러니깐 몇 년 간의 경험을 몇 시간에 얻을 수 있는 책이다. 책이 가벼운 건 사실이다. IT인이라면 앞 몇 십페이지의 실리콘밸리 역사, 마지막 몇 십페이지를 읽으면 아쉬울 수도 있다. 하지만 실리콘밸리 역사는 체계적으로 정리하는 계기가 되었다. 그리고 어디서 구글 엔지니어의 몇 년 간의 경험을 들을 수 있겠는가?


이 책은 3부로 구성되어 있다.

1부 ‘왜 실리콘밸리인가?’는 실리콘밸리의 역사와 문화를,

2부 ‘구글은 어떻게 일하는가?’는 구글 문화를,

3부 ‘좌충우돌 미국생활 적응기’는 저자가 느낀 미국 문화를 다룬다.




1부는 IT인이라면 아는 내용이 많이 등장한다. 실리콘밸리의 대표적 아이콘인 스티브 잡스의 일화를 시작으로 실리콘밸리가 어떻게 탄생했는지 역사를 살펴본다.


잡스의 일화 중 하나만 살펴보자.

"서서히 기력을 잃어가던 어느날 스티브 잡스가 아들을 창고로 부른다. 아꼈던 그의 오토바이를 아들에게 선물한다. 아들이 빚을 갚겠다고 말한다. 이 때 스티브 잡스가 아들에게 말한다. '넌 빚이 없어. 내 핏줄이니까.' "

아~ 감동이다.


HP에서 탄생한 ‘옆자리증후군’이라는 말이 있다. 옆자리 동료에게 도움이 될 기술이면 개발할 가치가 있다는 뜻인데, 휴대용계산기는 이렇게 탄생했다. 기술 개발의 시작은 멀리 있는 게 아니라, 바로 내 옆사람에게 도움이 된다면 그 걸 만드는 것부터 시작한다.




실리콘밸리 역사와 함께한 인텔과 AMD는 어떻게 탄생했을까?


이 회사들의 탄생하기 2단계를 거슬러 올라가면,

벨연구소에서 트랜지스터를 발명한 ‘쇼클리’라는 인물이 있다. 그는 ‘쇼클리 반도체 연구소’를 설립한다. 벨연구소 시절에 그는 자기 밑에 있던 연구자들의 연구 논문과 특허에 자기 이름을 공동으로 올렸다. 그리고 이 회사를 설립하고 로버트 로이스, 고든 무어 등 최고의 인재들을 유치원생 다루듯이 했고 허드렛일을 맡기기도 했다. 노벨물리학상까지 받았으니 분명히 최고의 과학자인 것은 맞지만 인물 됨됨이는 낙제점이다. (개인적으로 쇼클리를 상당히 싫어한다. 그는 ‘우생학’ 지지자다. 심리학자 아서 젠슨이 흑인이 백인보다 선천적으로 IQ가 낮다는 주장했다. 그 기사를 본 후 쇼클리는 흑인과 백인의 상대적 IQ를 대대적인 조사를 시행하자고 촉구했다.)


결국 이 연구소의 8명은 회사를 그만둔다. 이들이 바로 ‘배신자 8인’이라고 불리는 인물들이다. 셔먼 페어차일드와 배신자 8인(로버트 로이스, 고든 무어, ...)은 페어차일드 반도체를 만들면서 실리콘밸리 역사는 시작되었다. 그 이후 로버트 로이스와 고든 무어, 그리고 페어차일드 직원인 앤디 그로브는 인텔을 창업한다. 페어차일드의 제리 샌더스 등은 AMD를 창업했다. 그러니깐 인텔과 AMD의 공통 조상은 바로 페어차일드 반도체가 되는 셈이다. 그리고, 페어차일드 반도체를 만들게 된 것은 배신자 8인이 쇼클리 반도체 연구소를 뛰쳐나오게 만든 악역(?) ‘쇼클리’ 박사가 있었다.


쇼클리 반도체 연구소 -> 페어차일드 반도체 -> 인텔, AMD



1부의 가장 핵심 부분은 실리콘밸리의 정신이다. 사회환원 정신인 ‘Pay it forward’문화가 있다. 되돌려준다는 뜻이다. 내가 다른 사람에게 도움을 받았으니 나는 또 다른 사람을 도와주는 것이다.

100만권이 팔린 ‘강아지 똥’, 그리고 ‘몽실언니’의 작가 ‘권정생’님은 이런 말씀을 하셨다. “가진 것을 '준다고' 하지 말고, '되돌려준다고' 해야 할 것입니다." 권정생 작가님이 말씀하신 것이 실리콘밸리 정신과 일치할 것이다.

사회환원정신, 오픈소스 문화가 없었다면 실리콘밸리는 지금의 모습은 몇 년, 몇 십년 뒤에나 볼 수 있었을지도 모른다.



실리콘밸리의 사회환원 정신


하지만 실리콘밸리의 어두운 면도 있다. 소득 불평등이 이렇게 심한지는 이 책을 통해 처음 알았다.

실리콘밸리에서 유일하게 24시간 운행하는 22번 버스가 있다. 이 버스는 노숙자에게는 단돈 2달러로 하룻밤을 묵을 수 있는 곳이다. 거리를 떠돌 수 밖에 없는 노숙자들은 잠자는 동안에도 사실상 거리를 떠돌고 있는 셈이다.  너무 가슴 찡했다.

나는 22번 버스 대목을 읽으면서, 윌 스미스 주연의 '행복을 찾아서'이 떠올랐다. 주인공과 그의 아들이 화장실 등에서 노숙했다. 실화를 바탕으로 한 영화인데, 영화 전반부에 해당되는 부분이 여전히 세계 최고의 기술이 모인 실리콘밸리에서는 진행형이다.



[ 영화 '행복을 찾아서' ]


(※ 2부가 핵심인데, 1부를 너무 길게 썼다. 여긴 간단히 쓰려고 했는데)




2부를 통해 구글 내부로 들어가보자.


실리콘밸리 회사들은 직원은 가려뽑고 한번 뽑으면 신뢰한다(실리콘밸리 모든 회사가 그런 것은 아닐테지만). 구글의 채용의 핵심은 좋은 사람을 떨어뜨리는 한이 있어도 나중에 후회할 사람을 뽑지 않는다고 한다. 채용 과정에서 조금이라도 의심스럽다면 뽑지 말아야 한다는 뜻이다.


  • 현실화는 어렵지만 성공하면 세상을 바꿀 일에 골몰할 인재를 찾는다.

  • 사람이 모자라더라도 기준을 낮춰서 뽑지 않는다. 반대로 좋은 인재라면 자리에 관계없이 모두 뽑는다.


저자가 구글 입사 후 초기에 받는 훈련 중 하나가 ‘면접 훈련’이었다. 그러니깐 직원 모두가 스스로 훌륭한 면접관이 되도록 훈련시키는 것이다.

상당히 놀랬다. 우리 나라에서도 이런 문화가 필요할 것 같다. 면접관 능력이 부족한 사람이, 사람 볼 줄 모르는 사람들이 새로운 사람들을 뽑다보니 제대로 뽑지를 못한다. 그러니깐 직원을 가려뽑지도 못하고 한번 뽑고 나서도 의심을 하게 된다. 면접관이 된 자신도 신입 때 그렇게 뽑혀 들어왔을 것이다. 내 자신이 면접관이 되는 훈련을 한다면, 보다 나은 회사 문화와 기술을 만들어나갈 수 있지 않을까?


슈퍼 인턴과의 만남은 흥미롭다. 이 부분은 책을 읽는게 나을 것 같다. 여기에 조각내서 옮겨 놓는 것보다 온전한 상태로, 날 것 그대로 읽는게 나을 것 같아서.


구글 인터뷰팁도 흥미롭다. 그 중 면접관이 하지 않는 질문 부분만 얘기해보겠다.

“앞으로 10년 후 자신은?”, “구글에서 어떤 일을 하고 싶은가?”같은 부류의 질문은 하지 않는다. 후보자의 진목면을 알 수도 없고 변별력도 없다. “미국에서 주유소가 몇 개 있습니까?” “골프공의 홈은 몇 개 입니까?”같은 질문도 하지 않는다. 번뜩이는 재치를 평가할 수는 있겠지만 좋은 엔지니어를 드러내는 평가로 보기 힘들다.

난 '돈오점수(頓悟漸修)'라는 말을 좋아한다. 내 폰의 바탕 메모에 써 둘 만큼. ‘문득 깨달음을 얻고, 점점적으로 수행한다.’라는 뜻이다. 저자는 돈오(頓悟)보다는 점수(漸修) 질문이 좋다고 말한다. 즉, 번뜩이는 재치를 평가하는 질문보다 꾸준히 수행한 사항을 평가할 수 있는 질문을 던지라는 말일 것이다


구글 직원은 회의 약속이나 다른이와 약속을 구글 캘린더로 조정한다고 한다. 본인이 집중하고 싶을 때는 구글 캘린더에 ‘Do not schedule’이라고 적어둔다. 그러면 상대는 이 때를 피해서 일정을 잡는다.

우리는 이런 문화가 약하다. 일정은 통보다. 일정을 선택하는 할 수 있는 경우는 '조율 가능한 사소한 일정'이거나 '자신이 상사일 때 뿐'이다.


사고발생시 실패을 통해 교훈을 얻도록 ‘사후보고서’를 쓴다고 한다. 보고서 내용 중에 ‘제대로 동작하지 않았던 사항’이나 ‘개선 의견’은 보편적으로 적는데, ‘제대로 동작했던 사항’은 특이했다. 사고는 났지만 분명 잘 동작한 부분도 있을 것이고 더 큰 사고를 막았던 이유도 있을 것이다. 이런 부분도 사후보고서에 쓰는 것이다.

사후보고서는 모든 실무자, 책임자가 공유하고 검토하다. 이들이 보고서를 인정하면 사내 모든 사람이 볼 수 있도록 공유(구글 닥스로 작성함)한다. 실패의 교훈은 모든 직원이 함께 나눌 수 있는 것이다.

반면 우리 나라는 '실패의 교훈'보다는 '실패의 고통'을 함께 당한다. 그리고 책임자를 찾아 '실패의 책임'을 묻는다. 실패를 인정하지 않는 문화에서는 발전도 어렵다.


저자는 개발자로서 성장하는 좋은 방법으로 ‘코드 리뷰’를 추천했다.

코드 체크인하기 전에 동료들의 승인을 받아야 한다. 구글의 뛰어난 동료들이 얼마나 많겠는가. 그 동료들이 코드를 검토하고, 코멘트를 달아준다. 더 나은 코드를 배울 수 있게 되고, 본인이 발견 못한 문제점도 알게 될 것이다. 리뷰한 사람은 함께 책임을 지기 때문에 절대 대충 보지는 않는다.
또한 원 개발자가 휴가를 떠나거나 퇴사를 하더라도 이미 리뷰한 동료가 있기 때문에 공백을 최소화할 수 있을 것이다.



※ 나화영님의 댓글을 보고 도서 검색을 해봤더니 '미키 김'씨가 쓴 '꿈을 설계하는 힘' 외에 엔지니어로 근무하시는 '이준영'씨가 쓴 책이 한권 있었습니다. '구글은 SKY를 모른다'(자기계발서)라는 책입니다. 엔지니어가 쓴 책은 없는 줄 알았습니다. (5.27(수) 09:00 추가)

Posted by 좋은진호
일상2015. 5. 13. 18:56

그림자 찍는 것을 좋아한다.

그림자는 장비를 탓하지 않는다. 좋은 카메라가 아니어도 그림자는 제 모습을 충실히 보여준다.

지금까지 샀던 카메라는 똑딱이 뿐이다. 평상시에 스마트폰으로 그림자를 찍는다.

가까운 곳에 여행갈 때만 똑딱이 카메라로 찍는다.


정약용은 국화의 빼어난 점 5가지를 얘기했다.
늦게 꽃을 피우는 것, 오래 견디는 것, 향기로운 것, 어여쁘지만 요염하지 않고 깨끗하지만 차갑지 않은 것 그리고,
마지막 하나가 등불 앞의 국화 그림자를 꼽았다.

정조시대의 간서치(看書痴) 이덕무는 흰국화 꽃이 창호지에 그림자를 만들자,
묽은 먹을 묻혀 창호지 위에 베꼈다. 한 쌍의 나비가 꽃 가운데 앉자, 꽃 그림에 나비도 그렸다.
또 참새 한 마리에 가지를 잡고 매달리길래 참새가 놀라 날아갈까봐 급히 참새까지 보탰다.
그리고 붓을 던져버리고 한마디 말을 던졌다. “나비를 얻었는데 참새를 또 얻었구나”

그림자는 매 분마다 조금씩 변한다.
그림자의 하루 생활은 기울어졌다가 똑바로 섰다가 또다시 다른 쪽으로 기울기도 하고,
줄어들었다가 다시 자라나기도 한다. 바람이 불면 그림자는 바닥을 따라 이리 갔다 저리 갔다 한다.
그림자의 사진은 그래서 순간이 중요한 것 같다.
이덕무가 참새를 그릴 때 급히 그렸던 것처럼 그림자에게는 가장 좋은 자세를 취할 때 사진을 찍어줘야 한다.
그림자는 말한다. “지금이 내 자세가 가장 좋은 것 같아. 빨리 찍어줘”

그래서 찍었다. 그림자가 사진을 찍어달라고 해서.

5살 아이가 어른을 그린다면 (2015.5.)



개발자는 개발을. 그림자는 그림을. 그림이 그려지는 계절. 수묵화. (2015.4., 2014년에도 같은 나무 아래에서 비슷한 사진을 찍었다)



수묵담채화 (2015.5.)



햇볕이 강하게 내리 쬐네. 선캡 하나만 내 머리 위에 올려놓고 한낮을 버티라고 하기엔 너무 가혹해. 나도 더울 땐 그늘에서 쉬고 싶다. - 신호등 7형제 올림 - (2015.5., 2014년에 같은 사진을 찍었다)


펜싱중 (2015.4.)


그림자도 여름 준비. 시원하게 포즈를 취한 그림자 여인 (2015.5.)


Posted by 좋은진호
시스템이야기2014. 10. 15. 13:24

메신저 검열로 '텔레그램(Telegram)' 광풍이 불고 있다. 개인적으로 카톡을 자주 사용하지 않아, 텔레그램이 절실(?)하게 필요하지 않다. 하지만 텔레그램을 사용해야할 이유가 생겼다. 텔레그램이 서버에서 사용할 수 있는 CLI를 제공하고 있고, lua나 python으로 손쉽게 메신저와 연동할 수 있다.


그래서 텔레그램용 lua스크립트를 만들어서 서버 상태를 폰에서 받아볼 수 있다. 예를 들어 특정 서버의 MRTG/RRD를 메신저로 요청하면 그 이미지를 받아 볼 수 있다. 서버의 load값도 같은 방식으로 return받을 수 있다. 서버장애 문자를 텔레그램으로 받을 수 있도록 하신분도 있다. (※ 개인적으로는 이미 SMS로 받고 있는 것을 다시 텔레그램용으로 만들 필요는 없었다.)


텔레그램 CLI설치는 '리눅스에 텔레그램(Telegram) CLI 설치' (글 좋은진호)를 참고하고, 이 글은 서버 모니터링용 텔레그램 스크립트와 실제 사용 예를 보여줄 것이다.



1. 텔레그램 lua 스크립트 기본 구조


메시지를 수신하면 on_msg_receive 함수가 호출된다. 이 함수내에서 send_msg, send_photo, send_text 등의 함수를 이용해서 메시지를 상대에서 보낼 수 있다. 다음은 'hello'를 수신하면, 결과를 보내준다.


[ 스크립트 기본 구조 : hello.lua ]

function on_msg_receive (msg)

if ( msg.text == 'hello' ) then

send_msg(msg.from.print_name, "world", ok_cb, false)

return

end

end

function ok_cb(extra, success, result)

end


$ bin/telegram-cli -s hello.lua

... 생략 ...

[14:21]  Jinho >>> aa

User Jinho is typing

[14:22]  Jinho >>> bb

User Jinho is typing

User Jinho is typing

[14:22]  Jinho >>> 헬로우

User Jinho is typing

[14:22]  Jinho >>> hello

[14:22]  Jinho <<< world

User Jinho marked read 1 outbox and 0 inbox messages



telegram-cli 실행화면[ telegram-cli 실행화면 ]


스마트폰 어플 화면[ 스마트폰 어플 화면 ]



2. 서버모니터링용 스크립트 살펴보기


[ 모니터링용 스크립트 일부 : server_mon.lua ]

now = os.time()


dir_cmd = "/home/cnx/cmd"

cmd_ping = "cd ".. dir_cmd .."; sh ping.sh"

cmd_load = "cd ".. dir_cmd .."; sh load.sh"

cmd_netlog = "cd ".. dir_cmd .."; sh show_netlog.sh"

cmd_mrtg = "cd ".. dir_cmd .."; perl mrtg.pl"

cmd_404 = "cd ".. dir_cmd .."; perl 404.pl"


mrtg_res = {"load", "swap", "public_if", "private_if", "disk_io", "memory_free", "memory_inactive"}

auth_phone = {["821012345678"] = true, ["821087654321"] = true }


-- 메시지 수신 처리

function on_msg_receive (msg)

if msg.date < now then

return

    end

if msg.out then

return

end


-- command

local recv_msg = ""

if ( msg.text ~= nil ) then

recv_msg  = string.gsub(msg.text,"[;|<>]","") -- 받은 msg중에 ;, |, <, > 등의 문자는 지움

end

local cmd, arg  = split(recv_msg) -- exam : ping a b c d => cmd = "ping", arg = "a b c d"

local file_name = ""

cmd = string.lower(cmd)

print("receive : ", cmd, "\n")


-- user_info

print("Name    : ", msg.from.print_name) -- 메시지 보낸사람 real name (Jinho)

print("Phone   : ", msg.from.phone) -- 메시지 보낸사람 전화번호  (8210AAAABBBB)

print("Msg Num : ", msg.id) -- 메시지 번호

print("to.Name : ", msg.to.print_name)


-- 일반대화, 비밀대화 구분해서 메시지 전송

if (msg.to.id == our_id) then

user_id = msg.from.print_name -- 일반대화창

else

user_id = msg.to.print_name -- 비밀대화창

end


-- auth (지정한 폰번호만 인증)

if auth_phone[msg.from.phone] then

print "auth    : OK "

else

print "auth    : invalid user"

return

end

mark_read(user_id, ok_cb, false) -- 읽은 메시지로 표시


-- ping

if ( cmd == 'ping' ) then

os.execute(cmd_ping .. arg)

send_text(user_id, dir_cmd ..'/result_ping.txt', ok_cb, false)

return

end


-- load

if ( cmd == 'load' ) then

... 생략 ...

end


-- netlog

if ( cmd == 'netlog' ) then

... 생략 ...

end


-- MRTG

if ( cmd == 'mrtg' ) then

os.execute(cmd_mrtg .. arg)

arg = trim(arg)

for i=1, table.maxn(mrtg_res) do

file_name = dir_cmd .."/".. arg .."_".. mrtg_res[i] .."-day.png" -- DIR/FILE

-- print (file_name)

if ( file_exists(file_name) ) then

send_photo(user_id, file_name, ok_cb, false)

end

end

return

end


-- web 403/404 status

if ( cmd == '404' ) then

... 생략 ...

end


-- help

-- if ( cmd ~= '' ) then

if ( cmd == 'help' ) then

send_text(user_id, dir_cmd ..'/help.txt', ok_cb, false)

end

end


... 생략 ...


주요부분을 살펴보자.

if ( cmd == 'ping' ) then

os.execute(cmd_ping .. arg)

send_text(user_id, dir_cmd ..'/result_ping.txt', ok_cb, false)

return

end


모니터링용 스크립트에서는 각 명령어마다 외부 명령을 호출하고 결과를 text파일로 저장했다. 그리고, 그 text파일 내용을 메시지로 뿌려지도록 했다. 명령어 추가는 if ( cmd == '명령어 ' ) then 형태로 확장해주고, 외부 명령 처리할 스크립트만 만들어주면 된다.

 

if (msg.to.id == our_id) then

user_id = msg.from.print_name -- 일반대화창

else

user_id = msg.to.print_name -- 비밀대화창

end


secret chat을 지원한다. msg.to.id == our_id 라면, 즉 받는 사람과 CLI 메신저 유저가 같다면 일반대화창으로 대화중이고, 그렇지 않는 것은 비밀대화이다. 비밀대화는 msg.from.print_name이 아닌 msg.to.print_name 에게 메시지를 보내야 한다. 아래 루틴이 없다면 폰에서 비밀대화로 메시지를 보냈더라도 CLI에서는 응답을 일반대화창으로 보낸다.


if auth_phone[msg.from.phone] then

print "auth    : OK "

else

print "auth    : invalid user"

return

end


auth_phone 에서 지정한 휴대폰에서만 명령을 처리한다.


mark_read(user_id, ok_cb, false)


메시지를 읽은 것으로 표시한다.


※ lua스크립트를 처음해봤다. lua 매뉴얼을 보면서 스크립트를 하루에 만들고, 그 이후에 한번 기능을 추가한 정도다. 그래서 스크립트 lua개발자들이 보기에는 좋지 않은 부분도 있을 것이다. lua고수에게는 연필깍는 칼처럼 뻑뻑하게 보일 수 있겠지만, 누군가 다듬어 사용하면 생선회감용 칼처럼 휼륭(?)하게 쓰일 수 있을 것 같다.


※ ping.sh, load.sh 등의 외부 호출 스크립트는 공개하지 않겠다. 내부 서버들의 데이터를 추출하는 부분이라서 공개하기가 쉽지 않고, 이 글을 읽는 분들의 서버상황이 저와는 다를테니 스크립트 내용보다는 호출 방식만 눈여겨 보면 좋을 것 같다.



3. 텔레그램 CLI 실행


$ bin/telegram-cli -s server_mon.lua

또는

$ bin/telegram-cli -s server_mon.lua -d &


테스트위해서는 -s 옵션만, 추후 운영하기 위해서는 -d 옵션으로 넣어 데몬형태로 실행한다.



telegram-cli 화면[ telegram-cli 화면 : help를 보내주고, ping 결과를 보내준 화면 ]


텔레그램 스마트폰 어플 화면[ 스마트폰 어플 화면 : 아무키나 입력해서 도움말을 확인, 서버그룹별 ping과 개별 IP별 ping 결과 요청 ]

※ 스크립트를 수정해서 'help'명령을 내렸을 때만 도움말을 보여주도록 바꿨다. 스크립트 수정 전에 캡쳐한 것임.



telegram-cli 화면[ telegram-cli 화면 : load 결과, MRTG 그래프 7개를 보내준 화면 ]


텔레그램 어플 화면[ 스마트폰 어플 화면 : load 결과, MRTG 그래프를 받은 화면 ]




4. 참고자료


* 텔레그램 CLI 소스에 들어있는 test.lua

* 텔레그램 README-LUA

* Lua check if a file exists

* Telegram Messenger Client



Posted by 좋은진호