Friday, May 10, 2013

The Myth of the Genius Programmer -- Google IO


http://www.youtube.com/watch?v=0SARbwvhupQ


요약.

많은 사람들이 똑똑해 보이고 싶어한다. 갑자기 엄청난 코드를 짜서 세상을 놀라게 하고 싶어한다. 그래서 혼자 일하려고 한다.
완전 혼자 일하는 극단과 아니면 계속 남들Ignore warning에게 얘기하는 극단 사이에 tension이 존재한다. 하지만 결론적으로 훌륭한 일을 위해서는 사람들과 함께 일해야 한다.

첫번째 원칙. Ego를 버려라. 아파치가 한 예다. 커뮤니티가 중요하지, 자신의 존재만을 드러내려고 하지 마라.
두번째. 비판이 나쁜게 아니다. 건설적 비판을 하고 받아들이는 것은 학습을 통해 이뤄지는 것이다. 코드 리뷰의 제안을 좀 받아들여라.
세번째. 실패를 인정하고 살아라. 똑같은 실수를 계속하는 건 문제지만, 실패는 중요한 학습의 기회다. postmortem이 중요하다. 문제가 생기면 왜 그 문제가 생겼는지 분석해라. "실패해도 돼. 실패를 통해 배우잖아"라는 느낌으로 일하는게 중요하다.
네번째. 빨리 실패해라. (Iterate quickly)
다섯번째: 연습해라. 연습하면 빨리 실패할 수 있고, 성공하는 확률을 더 높일 수 있다.
여섯번째: 주변에 너보다 나은 사람들로 채워라. 잘하는 사람이 많으면 무서울 수 있지만, 많은 것을 배울 수 있다.
일곱번째: 주변의 영향을 받아라. (Be Influenced.) 내가 잘못했다는 것을 인정한다는 것을 주변에 보여라.

둘이나 셋이 처음에 디자인하기 좋은 사람 수다. 6명 이상이 같이 여행하면 아무데도 못간다.

감상.

요새 내 사고 구조에 따르면 당연한 얘기다. 하지만 당연한 얘기가 항상 실천이 어렵다.

Tuesday, August 2, 2011

ranlib

.a 파일을 만들 때 보통 ar을 이용해 만든 뒤 ranlib을 이용한다.

ar뒤의 파일 format은 정말 별 거 없다. 그냥 파일들과 그 속성들을 뭉쳐놓은 것이다. global header는 signature가 전부고.. 파일별 header 역시 크기/access control/timestamp 등만을 가지고 있다.

ranlib은 여기에 object 파일들에 대한 symbol table을 더하는거다. "무슨 파일이 어디있냐?" 같은 질문에 대한 대답을 빨리 찾고 싶을 때 쓸만한 index를 만든다고 하면 되겠다.

ranlib은 random library의 준말이다. archive를 random access가 가능하게 해주고 싶은 마음을 잘 드러내주고 있다.

Saturday, March 26, 2011

linux kernel debugging with gdb: show me the current task

The problem of getting the current task bothered me for a while when debugging with gdb.


define show_current
  set $thread_info = ((int)$sp) &0xffffe000
  set $current_task = (((struct thread_info *)($thread_info))->task)
  printf "current = %08x\n", (int)$current_task
  printf "current pid = %d\n", (int)($current_task->pid)
  printf "current mm = %08x\n", (int)($current_task->mm)
end


Thursday, March 3, 2011

thunderbird segmentation fault

최근 thunderbird가 ubuntu 에서 실행시 segfault로 죽는 경우가 있다.

https://bugs.launchpad.net/ubuntu/+source/thunderbird/+bug/526667

에따르면
sudo apt-get install nscd

가 이걸 해결한단다.

Sunday, December 5, 2010

몸에 익히고 싶은, 그러나 잘 안 익혀지는 emacs 단축키/function 모음

광활한 emacs의 세상. 그리고 그 emacs의 단축키 중에 지금은 잘 쓰지 않지만, 앞으로는 잘 쓰게 되길 바라는 기능들이 꽤 많다. 여기에다 정리해놓는다.

Bookmark 관련
C-x r m (bookmark-set)
C-x r b (bookmark-jump)

Text editing 관련
M-q (fill-paragraph)

Saturday, October 16, 2010

ubuntu 내가 하는 세팅

ubuntu에서 내가 따로 하는 세팅 모음. 각종 dot files는 포함하지 않음.

차후 생각나는대로 업데이트 됨.

gnome-terminal
 - Edit ▸ Keyboard Shortcuts, deselect "Enable all menu access keys"

package install
sudo apt-get install emacs libboost-dev

remove applications from application indicators
/usr/share/indicators/messages/applications

thunderbird
install firetray, toggle word wrap, gnome integration

~/.ssh/config  setting
Host my_alias
HostKeyAlias mojah
Hostname xx.xxx.xx.xx
User username
Port xxxx

Tuesday, September 14, 2010

리눅스(우분투)의 init이 하는 일들

Ubuntu의 upstart 0.6.5 버전을 기준으로 한다.

1. 자기가 맨 처음 실행된 애가 아니면(pid != 1) telinit을 실행시킨다.
2. setsid()로 새로운 session을 시작한다.
3. system_setup_console에서는 tcsetattr()을 이용해 tty를 설정하고, file descriptor를 모두 /dev/null에 연결시킨다. 여기서 tty설정을 통해 특수키 등을 설정할 수 있다.
4. PATH를 bin과 sbin등의 디렉토리로 설정한다.
5. proc과 sys를 mount한다.

6. 여기부터 NIH 라이브러리가 사용된다. Ubuntu에서는 apt-get source libnih-dbus-dev를 통해 받을 수 있다.

참고로 NihOption은 getopt_long에서 쓰이는 struct option과 비슷한 역할을 한다. (restart는 이 구조체를 이용해 setting된다.)

7. SIGSEGV, SIGABRT (둘 다 crash), SIGCHLD, SIGALRM(둘 다 handling만, no response) 에 대한 handler를 등록한다.
8. reboot() syscall에 RB_DISABLE_CAD를 건네줌으로써 Ctrl+Alt+Del 를 누르면 init에게 SIGINT가 건네지도록 한다.
9. SIGWINCH, SIGPWR, SIGHUP, SIGUSR1에 대한 핸들러를 등록한다. (SIGHUP은 configuration reload, USR1은 d-bus reconnection에 대한 시그널)
10.  nih_child_add_watch를 통해 다른 프로세스가 exit, kill등을 하는 경우 detect한다.
11. polling하는 loop에서 불려질 event_poll을 등록한다.
12. configuration directory(/etc/init) 또는 file(/etc/init.conf)를 등록하고 configuration을 reload한다.
13. dbus를 통해 연락할 server를 열고 connect시와 disconnect시에 사용될 callback을 저장한다. 서버의 주소는 unix:abstract=/com/ubuntu/upstart 이다.
13-1. control_bus_open은 fail한다고 하니 넘어가자.
14. system log에 로그하기 위해 openlog를 부른다.
15. STARTUP_EVENT를 만들어 event queue에 등록시키고 nih_main_loop_interrupt()를 부른다
16. main loop은 event를 /etc/init에 저장된 configuration대로 event-driven loading을 해준다.