어느 프로그래머의 기록

core.egloos.com

포토로그



본성과 양육

본성과 양육 - 매트 리들리

도서관에서 빌려 읽은 책. 사 두어도 좋을 듯.

nature와 nurture는 두운에 의해서 쌍이 된 단어들이다.

'빈 서판'이라든가 다른 책들도 많지만, 본성이 양육을 거쳐 인간에게 발현되는 과정을 잘 설명하고 있는 책이다.
 

무지개를 풀며.

도서관에서 빌려 읽은 책.

무지개를 풀며. 리차드 도킨스.

눈먼 시계공, 이기적인 유전자에 비해서 크게 감흥이 오진 않았다.




브레인 섹스 - 일하는 뇌와 사랑하는 뇌의 남녀 차이 미분류

도서관에서 빌려 읽은 책.

염색체의 차이, XX, XY만으로 남녀는 완전히 결정되는 것이 아니다.
태어나기도 전에 염색체의 차이에서부터 시작해서 외면적인 차이가 발생되지만,
호르몬의 작용에 의해서 남녀의 뇌의 차이가 발생하며,
뇌의 남녀 차이는 정도의 차이가 발생하는 부분이 있다. 
그리고 동성애에 대해서도 어느 정도는 태어나기 전에 호르몬의 작용에 의해서 설명될 수 있는 부분이 있다.


티코와 케플러

도서관에서 빌려 읽은 책.

책의 대부분은 '티코 브라헤'에 대해 촛점이 맞추어져 있다.
1546~1601. 16세기 사람인데, 그의 성실한 관측이 케플러의 법칙으로 이어진다.


한권으로 읽는 브리태니커

도서관에서 빌려서 읽은 책.

생각이 많은 밤. 일상

그래 솔직히 말해서 그의 임기 동안에 그를 그다지 지지한 편은 아니었다.

그리고, 그의 임기의 5년이 성공보다는 실패 쪽에 가까웠다고 생각하고,
그렇게 된 이유가 환경 뿐만 아니라 그에게도 있다고 생각한다.

그렇지만, 전두환과 노태우 이후에, 김영삼 정부의 약간의 성과와,
그 이후 김대중, 노무현 정부를 거치면서 이 나라의 정치가 어느 정도는
제대로 된 방향으로 가고 있다고 생각했었던 것이 완전히 잘못된 생각이었다는 것을,
최근 1년 반의 MB 정권에서 알게 되고 나서는,

그의 임기 동안의 그에게 보내는 불평보다 더 큰 불평을 자신에게 보냈어야 하는 것이
아닌가 하는 생각이 든다.

생각이 많아지는, 답답한 밤이다.

리들 - 비즈니스 창의성을 깨우는 부와 성공의 수수께끼

리들 - 비즈니스 창의성을 깨우는 부와 성공의 수수께끼

창의성의 논리
수면(잠)
호기심
제약
연관성
관습
코드


컬처코드

도서관에서 빌려온 책.

컬처코드
"미국의" 컬처코드라고 해야 할 듯.
네슬레. 일본에서의 전통차와 커피.
자동차. 무의식적인 코드들. 감정. 메시지. 의미.
미국의 청년기적 특징. 폭력이 쉽게 용인됨.
미국에서는 비만이 문제가 아니라 해결책이다? 과체중 = 퇴행.
젊음에 대해 매달림.
조국, 가정, home
직업, 정체성, 의미
돈은 성공의 척도
품질에 대한 코드. 그냥 작동한다. 완벽함은 아님.
음식. 패스트푸드. 연료.
쇼핑. 고립에서 세상으로 나가는 것.
성공. 사치품. 일종의 계급장


행복경영, 조영탁/정향숙

구입해서 읽고 있음

나는 정말 너를 사랑하는 걸까?

김혜남 지음
구입해서 읽고 있음.

China Inc 차이나 주식회사

도서관에서 빌려온 책

제조업. 모든 제조업이 중국으로 간다.
농업. 팔 수 있는 것들.
사금융. 수많은 민간기업(향진기업)
에너지 문제, 환경 오염

후발 주자이나, 조립 산업과 같이 따라잡을 수 있는 산업에서 시작
그 다음으로 산업 전체를 복제해 낸다.
세계적인 수준의 달러 보유.

경제적 측면에서 현재의 중국의 상황을 잘 설명하고 있는 책.

영어의 대모험

도서관에서 빌려온 책

BBC에서 했던 다큐멘타리를 기본으로 하여 쓴 책이라고 함.
북유럽의 변방의 언어에서 출발한 영어의 역사.
중간에 여러 언어와 부딪히고 다듬어지면서,
명사, 동사 등에서 '격'이 없어지고, 전치사가 중요한 역할을 담당하게 되어,
다른 언어로부터 각 단어들이 원형으로 들어와서 쉽게 확장 가능한 언어가 됨.

언어 오덕인 아저씨가 영어의 기원과 발전에 대해 추적하면서 쓴 책인데, 뭐, 어쩔 수 없이 영어 만세 기질이 드러나긴 하지만, 무척 흥미롭다. 곰곰이 생각해 보면 당연한 사실일텐데 미처 생각하지 못했던 것들도 있다. 예를 들어 룬 문자가 쐐기나 선 모양이었던 이유 같은 것들. 새길 것도 쓸 재료도 변변치 않았던 때라 (붓이나 종이가 없었음) 별 볼 일 없는 정 따위로 바위에 새기려면 그런 모양이 편할 수 밖에 없었던 것이다. 
 

블루프린트 컴퍼니

도서관에서 빌려온 책

7가지 블루프린트 법칙은 기업의 핵심 가치를 수립 및 공유하는 것, 고성장 시장의 분할 논리를 활용하는 것, 매출 성장에 영향을 미치는 대형 고객을 확보하는 것, 새로운 시장 개척을 위해 합종연횡을 시도하는 것, 기하급수적 수익 창출의 마스터가 되는 것, 최고의 매니지먼트 팀을 구성하는 것, 그리고 마지막으로 적절한 외부 전문가들을 충분히 활용하는 것으로 구성된다. 아울러 필자는 이러한 법칙들 간의 상호 유기적 조화를 달성하고, 시너지가 충분히 발휘될 수 있도록 조정하는 것도 필요하다고 강조하고 있다.

항해의 역사, 베른하르트 카이

도서관에서 빌려 온 책.

기원전의 과거 항해사가 흥미진진하다.
과학은 사용되지 않으면 (효용이 없으면) 잊혀진다.
과거의 기록을 긍정적으로 해석하여, 과거에도 많은 항해가 있었다고 해석.
항해기술의 발전
항해한 지역 위주의 설명
제임스 쿡 선장. 당시의 기술 수준에 비추어, 최대한의 준비와 규율을 통해 안정적인 항해 프로젝트를 진행함.

저우언라이 평전 (주은래 평전)

도서관에서 빌려서 읽은 책.

중국 공산당의 역사에서 모택동처럼 어떤 면에서 그 의미가 반감되지 않은 인물.
중국 공산당이 집권할 때까지도 공로가 컸으며,
중국 공산당이 문화대혁명 등 우여곡절을 겪는 과정에서도,
2인자인 총리로서 공과가 큰 인물. 

'그룹 지니어스'

도서관에서 빌려서 읽은 책.

팀의 창의성.

산악 자전거의 발전 과정이라든가, 비행기의 발전 과정 등.

특허, 발명 등이 어떤 천재가 단기간에 이루어낸 것이 아니라,
여러 사람들의 손을 거친 과정의 결과라는 것.

팀에서도 function, feature 등을 저런 과정을 거쳐서 발현시킬 수 있도록
장려해야 한다는 얘기도 보이고.

1215 마그나카르타의 해

도서관에서 빌려서 읽은 책.

1215년, 영국의 존 왕은 귀족과의 전쟁에서 굴복하여 마그나카르타를 승인한다.

마그나카르타에 대한 분석을 하고 있는 책이라기 보다,
1215년이라는 해에 대해서, 당시 영국의 여러가지 모습을 설명하고 있는 책인데,
영국 귀족에 의한 상업의 발전이 시작된 시대라고 해야 하나,
먼 훗날의 산업혁명의 씨앗이라고 해야 할까,
귀족에 의해 승인된 자유시 (그리고 세금을 받는) 형태가 인상깊었다.

미국에 대해 알아야 할 모든 것, 미국사

도서관에서 빌려서 읽은 책.

미국사를 꽤 읽기 쉽게 쓴 책이다.
인디언과의 전쟁, 남북전쟁 등 전쟁도 많았고,
동에서 서로 확장의 역사가 이어진다.


큐리어스 총서 '싱가포르'

도서관에서 빌려서 읽은 책.

싱가포르는 중국계, 말레이계, 인도계 등으로 구성된 다민족 국가이다.

정치적으로 억압이 있다고는 하지만, 경제적으로 부유하다.

각 민족의 언어보다도 영어가 가장 공용어로 사용되는 나라.

각 민족에 대한 조금씩 다른 묘사에도 불구하고,
저자인 서양 사람의 입장에서는 참 신기하게 보일지 몰라도,
아시아계의 공통점을 느낄 수 있는 부분이 있다.

최근에 읽은 책

Release It! 읽음

조엘 온 소프트웨어 시즌 2 - 다시 읽음

똑똑하고 일 잘하는 개발자 모시기 읽음

미학 오딧세이(진중권) 1권 읽고, 2권 읽는 중

'프로젝트 관리의 해법' 읽음

'Head First Software Development' 읽음

'프로그래밍 심리학' 읽음

이희수, '세계 문화 기행'

익스트림 프로그래밍 2판

실용주의 프로그래머 (pragmatic programmers) 번역판으로 다시 읽음

큐리어스 총서 '싱가포르'

미국에 대해 알아야 할 모든 것, 미국사

1215 마그나카르타의 해

'그룹 지니어스' 팀의 창의성

'저우언라이 평전'


수많은 단계. 그리고 중간 과정의 확인... 컴퓨팅

제목을 좀 멋지게 붙일 수 있었으면 좋겠는데,
멋진 제목이 생각나면 고치기로 하고...

다른 복잡한 시스템을 다루는 분야도 마찬가지이겠지만,
IT 시스템도 무척이나 복잡하고, 수많은 단계로 이루어져 있다.

그리고 항상 그 수많은 단계 안에서 어디선가 문제가 발생한다.
문제를 해결하기 위해서는 먼저 현재의 시스템의 동작을 정확하게 파악할 수 있어야만 하고,
이를 위해서 수많은 중간 모니터링 도구들이 등장하게 된다.
예를 들어 보자면 memory dump, tcpdump, 디버거, Fraps, 등등...
(shared memory에 현재 프로세스의 동작을 별도로 기록하여,
별도의 모니터링 프로그램이 이를 지켜볼 수 있도록 하는 툴도 있다...)

tcpdump 같은 경우에는 TCP/IP라는 표준화된 프로토콜에 대한 모니터링이니
뭐 별도의 TAP을 내어 줄 필요는 없겠지만서도...

이런 도구들을 잘 붙일 수 있도록 시스템 설계 단계에서부터 고려할 필요가 있고,
또 가능하면 데이터 포맷도 쉽게 해석할 수 있는 포맷이면 더욱 좋다.



"온라인 게임 기획 이렇게 한다" 책에 대한 간단한(?) 소개

"온라인 게임 기획 이렇게 한다".

이 책에서 얘기하는 온라인 게임은 리니지, 월드 오브 워크래프 등의 MMORPG이며,
이 책에서 얘기하는 기획은, 기획팀의 기획이 아니다.

이 책이 얘기하는 범위는 온라인 게임을 만들기 위해 어떤 일들을 해야 하는지,
온라인 게임을 만들고 라이브 서비스 단계에서 어떤 일들을 해야 하는지 등이다.

온라인 게임을 만들고자 하는 사람이면 꼭 읽어 보아야 할 책이라고 생각한다.

C, C++, Java 다음에 배울 만한 언어... 컴퓨팅

C, C++, Java 다음에 배울 만한 언어...

'언어는 사고를 지배한다'는 말이 있다. 마찬가지로 프로그래밍 언어도 프로그래머의 사고를 지배한다.
C 언어를 사용하고 있다면 C 언어로 쉽게 표현할 수 있는 코딩 방식 근처에 머물게 되고,
Lisp을 사용한다면 Lisp으로 쉽게 표현할 수 있는 코딩에 익숙하게 된다.

그래서 사실 1년에 새로운 언어를 하나씩 배우자는 얘기도 있는데,
한편으로 생각해 보면, 가능하면 다음 두 가지 조건을 만족하는 언어를 배우는 것이 좋지 않을까 싶다.

1. 프로그래밍을 다른 관점에서 바라볼 수 있는 언어여야 한다.
2. 어느 정도 실질적으로 사용이 가능한 언어를 배운다.

당장 생각나는 프로그래밍 언어군으로서 다음과 같은 것들을 들 수 있겠다.

1. P로 시작하는 스크립트 언어 중에 하나를 배운다.
Perl, Python, PHP 등이 있을 것 같은데, 이 중에서 새로 배운다면 Python이 가장 좋을 것이다.
이 중에서는 언어의 문법이 가장 깔끔하다고 생각한다. Dynamic Typing을 제대로 느껴볼 필요가 있다.
P로 시작하지는 않지만, Ruby도 이 범주에 넣을 수 있겠다.

2. Functional Programming 언어를 배운다.
LISP부터 시작하여 한 계보를 형성하고 있는 언어군이다.
LISP보다는 Scheme 혹은 Haskell이 어떨까 싶은데,
이 중에서 새로 배운다면 Haskell이 좋을 것이다.
개인 취향일 수 있겠으나 LISP 계열의 언어의 괄호는 그닥 취향이 아닌 듯 하다.
어쩌면 Haskell보다 쉽게 구해서 쓸 수 있는 것은 F#일지도 모르겠다.

3. 중요하고 무척 실질적인 언어를 하나 빼먹었다.
SQL. 단지 SQL이 무엇인지 맛만 보는 수준이 아니라,
SQL을 실제 작업에 사용하면서 일반 프로그래밍 언어에서 느끼지 못하는 많은 것을 느낄 수 있다고 생각한다.

* 뱀다리:
가끔은 언어에 대해서 말 많은 사람을 보면,
과연 C, C++, Java로 프로그래밍을 얼마나 해 본 사람인지 의심이 들 때가 있다.
아니, 꼭 C, C++, Java가 아니어도 좋다.
몇 페이지 분량의 프로그램 코드나, 학교 숙제 정도의 분량의 코드를 작성한 수준으로
어떤 언어를 안다고 얘기하는 것은 아닌가 하는 의심이 드는 것이다...

미스트리스. 영화

2008.7.31

휴가 중 하루를 짬을 내어서, 시네큐브 광화문엘 가서 미스트리스를 보고 왔다.
19세기 중반쯤을 배경으로 하는 성인용 영화이기는 한데,

'스캔들-조선남녀상열지사'를 떠올리게 되었고,
스캔들 쪽이 좀 더 낫지 않았나 하는 생각을 했다.

아시아 아르젠토의 광기 어린 매력은 이 영화에서도 빛이 났지만,
다른 두 주인공은 남자와 여자 모두 참 예쁘게 생겼지만서도,
어떤 마력이랄까, 그런 느낌을 주지는 못했다.

이 영화에서는 애를 잃는 장면이 두 번 나오는데,
(한번은 전갈에 물려 죽고, 한번은 유산)
작가나 감독이 이런 부분을 광기의 원인으로 삼은 것이 아닌가 싶다.

3년마다 MMORPG 오픈하는 조직은? (가칭) 컴퓨팅

3년마다 MMORPG 오픈하는 조직은 어떤 사이클로 어떻게 움직여야 하는가.
사람들은 어떻게 재배치될 수 있는가.

Branch와 Hot Fix 컴퓨팅

주기적인 릴리즈를 고려할 때는 Branch 한다.
다음 릴리즈 때에 Merge는 하지 않더라도, Branch는 해야 한다.
특히 코드에 대한 Branch는 꼭 해야 한다.
코드 외의 리소스에 대해서는 어떻게 할 것인가.
가능하면 Branch를 시도해 본다.
그러나, Branch가 불가능하거나 너무 번거로운 상황이라면,
리소스에 대한 수정은 다음 릴리즈 때까지 없는 것으로 생각하라.
그리고, 어떻게 하든 코드를 수정해서 해결하라.


GetTickCount()의 49일 후 오버플로우. 컴퓨팅

GetTickCount() 함수.
OS부팅할 때부터 지나간 시간을 msec 단위로 돌려주는 함수이다.

뭔가 기준 시간을 잡을 때 무척 중요하게 사용되는 함수인데,
문제는 32비트 unsigned 값이다 보니 약 49일, 즉 7주 정도가 지나면 오버플로우가 발생한다.

프로그램 실행 도중에 이 경계를 넘어가면, 대소비교 등에서 문제가 생겨서 이상 동작을 하게 되므로,,
서버의 경우에 아예, OS 부팅 후 4주 넘어가면 처음부터 아예 안 뜨게 만들어 놓기도 한다.
 
하지만 다시 생각해 보니 다음과 같은 단순한 방법이 가능할 듯.

프로그램 시작할 때 GetTickCount를 읽어서 T0에 저장해 둔다.
프로그램 내에서 사용하는 모든 GetTickCount를 (GetTickCount - T0)로 대체한다.
프로그램을 7주동안 띄워놓지만 않으면, 굳이 OS를 부팅할 필요는 없지 않을까...

프로그램을 중단하고 다시 실행하는 것과, OS의 리부팅은 좀 다르다...

Themida, nProtect 컴퓨팅

프로그램 코드의 Reverse Engineering을 막기 위해 Themida를 사용한다.


Low Fragmentation Heap 컴퓨팅

윈도우 XP/2003에 들어간 Low Fragmentation Heap은,
작은 크기의 메모리 할당에 대해 비슷한 크기의 할당들을 한 곳에 모아서 처리함으로써
결과적으로 Fragmentation을 줄이고자 하는 기법이다.

많이 알려져 있는 부분은 위와 같이 Fragmentation을 줄이는 것에 대한 부분이나,
더 중요한 것은 Low Fragmentation Heap의 대상이 되는 작은 크기의 메모리 할당에 대해
매우 빠른 속도로 처리를 해 준다는 사실이다.

http://msdn2.microsoft.com/en-us/library/aa366750.aspx


우선순위 큐(Priority Queue)와 힙(Heap) 컴퓨팅

우선순위 큐을 비교해 봄으로써 추상적 데이타 타입자료구조의 차이를 명확하게 이해할 수 있다.

우선순위 큐는 추상적 데이타 타입(ADT)의 하나로서, ADT가 정의하는 것은 어떤 블랙 박스 같은 것으로,
그 안에 무엇이 어떻게 들어 있는지에는 관심이 없고, '어떤 일을 할 수 있다'에 초점을 맞춘다.
심지어 그 어떤 일을 할 때 얼마의 시간이 걸리는지에 대해서도 별로 관심이 없다.

우선순위 큐는 다음과 같은 일을 할 수 있다.

1. 큐에 '무엇인가'를 넣을 수 있다. 여기에 숫자로 된 우선순위를 꼬리표로 해서 함께 넣는다.
2. 큐에서 가장 높은 우선순위의 꼬리표가 붙은 '무엇인가'를 꺼낼 수 있다.
3. 2번의 변형으로, 가장 높은 우선순위에 무엇이 있는지 볼 수 있다. (꺼내지 않는다)

  • add an element to the queue with an associated priority
  • remove the element from the queue that has the highest priority, and return it
  • (optionally) peek at the element with highest priority without removing it  

  • 왜 가장 높은 우선순위의 것만 꺼낼 수 있고, 다른 것을 임의로 꺼낼 수도 없는,
    그렇게 제약이 많은 것을 생각하느냐고 할 수도 있겠지만,
    ADT에서 중요한 개념은 이것이다.
    시간이나 공간 같은 제약을 고려하지 않고, 한정된 수의 요구사항을 명확히 하는 것.
    요구사항이 한정되어야 그 다음에, 어떤 방법으로 구현하는 것이 효율적인지 생각할 수 있기 때문이다.

    '배열로 구현하지'라고 먼저 생각해 버리면, 배열에서 효율적으로 동작하는 새로운 기능을 추가할 수도 있겠지만,
    일의 순서가 그런 것이 아니기 때문이다.

    이렇게 우선순위 큐의 기능을 정의하고 나서, 우선순위 큐를 효율적으로 구현하기 위한 자료구조를 생각해 보자.
    메모리에 저장된 형태에 대해서 다음과 같은 것을 생각해 볼 수 있다.

    1. 배열 - 여기에는 다시 임의 배열과, 정렬된 배열
    2. 리스트 - 역시 임의 리스트와, 정렬된 리스트
    3. 그리고 다음에 설명할 힙(Heap)

    배열과 리스트가 별도의 자료구조인 것은 명확하지만, 임의로 넣은 것과, 정렬된 상태인 것이 다른 것인 이유는,
    배열과 리스트에 대한 연산이 다르듯이, 정렬되었는지 여부에 따라 연산의 구현이 확연하게 달라지기 때문이다.

    임의 배열을 사용할 경우 우선순위 큐의 구현은 다음과 같이 이루어진다.
    1. 넣을 때 - 현재 들어 있는 것들 뒤에 넣는다. O(1)
    2. 꺼낼 때 - 우선순위 값을 비교하여 가장 큰 것을 꺼낸다. O(n)

    정렬되어 있는 배열을 사용할 경우 우선순위 큐의 구현은 다음과 같이 이루어진다.
    1. 넣을 때 - 정렬된 순서에서의 위치를 찾아서 넣는다. O(n)
    2. 꺼낼 때 - 맨 앞의 것을 꺼내면 된다. O(1)

    n개를 넣고 꺼낼 때 걸리는 시간은, 둘 다 O(n * n)이 된다.

    n개를 다 넣고 나서 - 정렬하고 - n개를 순서대로 꺼내는 것은, 우선순위 큐를 쓰고자 하는 목적에도 맞지 않으며,
    우선순위 큐의 정의에 정렬 같은 것은 없다.
    다만 이렇게 했을 때 걸리는 시간은 정렬에 걸리는 시간인 O (n log n)으로 낮출 수 있다.

    이제 에 대해 얘기해 보자.
    힙이라는 자료구조를 가지고 얻고자 하는 것은 임의로 넣고 꺼내는 것을 지원하면서, O(n * n)보다 빠른 방법이다.

    이를 위해서 힙이라는 자료구조는 개념상으로 바이너리 트리에서, '부모 노드는 자식 노드보다 크다'라는 가정만
    유지한다. 당연히 최상위 루트 노드의 값이 가장 크다.
    이를 배열에 저장했을 때 유지되는 내부 형태는, n번째 항목의 자식 노드는 n * 2와, n * 2 + 1 번째에 위치한다. 
    그리고 배열에 들어있는 값들은 정렬된 형태도 아니고, 임의 형태도 아니지만,
    맨 앞에는 가장 우선순위가 큰 값을 갖고 있게 된다.

    1. 넣을 때 - 맨 뒤에 넣는다. 그리고 형제 노드, 부모 노드와 비교해서 셋 중에 큰 값을 부모 노드로 만든다.
    그리고 위로 전파한다. O(log n)에 수행 가능하다.

    2. 꺼낼 때 - 맨 앞의 것을 꺼낸다. 그리고 이 자리에는 자식 노드 둘 중에 큰 값을 갖고 올라온다.
    그리고 아래로 전파한다. 역시 O(log n)에 수행 가능하다.

    따라서 n개를 넣고 꺼낼 때 걸리는 시간은, O(n log n)이 된다.
    전체적으로, 정렬에 걸리는 시간과 같은 복잡도를 갖게 되었다. 

    여기서 얘기하는 힙은 정확하게는 Binary Heap의 array implementation 이다.

    이와 같이 추상적 데이타 타입이 문제에 초점을 둔다면, 자료구조는 해결에 초점을 두고  있다.
    인터페이스임플리멘테이션도 이와 비슷하게 생각할 수 있을 것이다.

    좀 더 자세한 것은 위키피디아에서 Priority Queue와 Heap을 검색해 보기 바란다.

    (C) 이글은 직접 작성한 글입니다. 출처와 링크를 명시하시기 바랍니다.


    1 2 3 4 5 6 7 8