이사했다.

7월 16th, 2010 by 1 comment »

사택 옮긴 지 몇 달 안됐는데 또 다시 이사했다. 소프트랑 완전히 분리되면서 사택도 분리됐다. 사택 사람들이랑 꽤 친해졌고 갈은 방 쓰는 동윤이랑도 잘 지내던 차라 좀 아쉬웠지만 어제 처음 새 사택 가서 짐 정리하고 보니 방이 꽤 아늑하고 맘에 든다. 침대도 있고… 룸메이트도 착해보이고 괜찮은 것 같다. 28층이라 왔다갔다 하기가 좀 불편하긴 하지만 창문도 열리고 나름 소음도 적고 해서 괜찮은 것 같다. 처음에 엘리베이터가 하나밖에 없어서 매우 놀랐는데 알고 보니 계단 중간으로 통하는 작은 엘리베이터가 하나 더 있었다. 매우 신기한 구조다.

늦은 부음(訃音)

5월 21st, 2010 by No comments »

오늘 인터넷으로 야구를 보고 있었는데 간만에 한 친구가 메신저로 말을 걸어왔다. 그런데 느닷없이 같은 동아리 1년 후배였던 녀석이 과로로 죽었다는 것이다. 그것도 몇 주 전에.. 그 녀석 홈페이지를 찾아가 보니 어느 순간 이후로는 글이 끊겨 있고 마지막 글에는 다른 사람들이 녀석을 떠나 보내는 글귀만 가득했다.

그 녀석은 나와 나이는 같지만 학교를 1년 늦게 들어왔고 내가 학부 중간에 병특을 가느라 함께 동아리 생활을 했던 날은 1년 남짓 되었던 것 같다. 처음 동아리에 들어왔을 때부터 말도 잘하고 뭔가 똘똘해보이면서도 프라모델이나 코스프레 따위에 심취해 있던 독특한 친구였다. 또, 항상 자신감에 차 있었던 것 같고 말도 많은 외향적인 녀석이었지만 술은 잘 못했던 것 같다. 그래서인지 나도 그 녀석도 동아리 방에서 거의 살다시피 했지만 선배들과 친했던 만큼은 친해지지 못했다. 지금 돌이켜 생각해 보면 같은 나이지만 선후배 관계였다는 게 조금 걸림돌이었던 것 같기도 하다. 그래도 함께 동아리방에서 라그나로크 게임을 미친듯이 하고 몇 시간씩 보드게임도 하고 밤이면 야식도 자주 시켜먹고 했던 게 생생하게 기억난다.

그리고 나서 병특을 다녀오는 동안 동아리가 유지되지 못해서 학교로 돌아온 이후로는 별로 만나지 못했지만 그래도 종종 지나가다 마주치면 사는 얘기는 조금씩 하곤 했다. 그렇게 내가 석사 마칠 때 까지는 종종 봤었다. 언제나 msn에 접속해 있었지만 내가 딱히 메신저든 전화든 사람들한테 연락하는 성격이 아니라 그냥 박사과정 잘 하고 있구나 라고만 생각했는데 이런 소식을 갑자기 접하니 마음이 심란하다. 더더욱 안타까운 것은 결혼을 약속한 사람이 있었고 결혼식을 불과 몇 주 앞둔 상태였다고 한다. 혹시 녀석의 다른 흔적이 있을까 싶어 검색해보니 그 여자분의 블로그가 검색됐다. 매일 슬픔을 참으며 써내려간 최근 글들을 읽어보니 내가 알고 있었던 녀석의 모습은 정말 빙산의 일각이었고 전혀 알지 못했던 모습들을 많이 알게 되었다. 너무나 안타깝다. 고인의 명복을 빈다.

Imagine

4월 4th, 2010 by No comments »

평소에 정말 명곡 중 하나로 생각하고 있던 존레논의 Imagine의 저작권을 오노요코씨가 국제앰네스티에 기증했다는 얘기를 읽었다. 마침 내가 읽고 있는 리차드 도킨스의 ‘The God Delusion’에서도 관련한 얘기가 머릿말 부분에 나오는데 인간 그 자체를 가장 중요하게 노래한 ‘Imagine’의 가사 중 ‘and no religion too’ 부분이 어떤 곳에서는 삭제되거나 심지어는 ‘and one religion too’로 바뀌어 불리기도 한다는 것이다. 참으로 어처구니 없는 일이 아닐 수 없다. ㅎㅎ

기프트,보이스,파워 – 어슐러 르귄

4월 4th, 2010 by No comments »

인터넷 서점을 어슬렁거리다가, 내가 좋아하는 두 작가 중 한 명인 어슐러 르귄의 책을 발견하고 닥본사(닥치고 원본 사수)했던 세 권의 시리즈다. 청소년용 소설로 분류되던데 분류 기준이 주인공의 성장을 그린 것인지 아닌지로 나누어진다고 하니 굳이 청소년용 딱지를 붙이는 것은 불필요하다고 생각한다. 하지만 표지 그림은 확실히 어린애들을 타겟으로 한듯 멋있고 예쁜 캐릭터가 그려져 있다. 고생하고 다니는 주인공들의 모습이라고 보기에는좀.. :)

그렇지 않아도 좋아하는 작가의 책인데다, 번역판이고, 결정적으로 매우 재밌어서 금방 금방 읽을 수 있었다. 다 읽은지는 한참 됐는데 어느 블로그에서 리뷰해 놓은 것을 보니 다시 기억이 났다. 저렇게 분석해놓은 글을 보니 나는 책을 대충대충만 읽었던 것 같다는 생각이 든다. 그렇다고 아예 생각 없이 읽었던 건 아니지만.. ㅎㅎ

내가 가장 좋았던 것은 결국에는 상식과 지식 그리고 자유가 있는 대학도시가 최종 도착점이라는 것이다. 그 도시는 다른 도시들보다 훨씬 다양한 사람들이 모여 있어서 번화하고 발전된 모습으로 그려졌던 걸로 기억하는데, 그러한 도시가 가장 이상적인 모습이라는데서 공감을 한다. 이 것은 르귄의 헤인시리즈의 헤인 공동체(?)도 결국은 비슷한 이상향을 그리고 있는 것 같다.(라고 하면 좀 비약인가 :)

원서 읽기 패턴

3월 30th, 2010 by No comments »

얼마 전에 ‘House of Many Ways‘ 읽기를 마치고 꽤 전에 사두었던 ‘The God Delusion’을 읽기 시작했다. 근데 조금 읽다보니 내가 읽은 원서들이 거의 다 영국 작가들 책이라는 걸 깨닫게 되었다.

Diana Wynne Jones(하울 시리즈), Richard Dawkins(The God Delusion), Charles Darwin(종의 기원을 좀 읽다 멈추긴 했지만), C.S.Lewis(나니아 연대기), Lewis Carroll(이상한 나라의 앨리스)

영국사람이 아닌 작가로는 Ursula K. Le Guin (어스시 시리즈, 헤인 시리즈) 밖에 없는 것 같다. 돌이켜보면 르귄의 책이 더 읽기 쉬웠던 것 같고 하울 시리즈나 나니아 연대기는 별로 어려운 내용은 아니지만 쓸데없이 어려운(내가 모르는 :) 단어가 너무 많이 나왔던 것 같기도 하다. 물론 다윈과 도킨스 책은 워낙 전문적인 책이고 고급 독자들을 위한 거고, 앨리스는 그 자체로 꼬여있는 내용이라 어쩔 수 없긴 했지만 말이다.

House of Many Ways

3월 9th, 2010 by No comments »

Howl’s Moving Castle, Castle in the Air 을 잇는 Diana Wynne Jones의 2008년에 나온 (비교적) 최근작 House of Many Ways을 다 읽었다.

역시나 앞의 시리즈들과 마찬가지로 전체적으로 유쾌하고 긴장감이 유지되면서 적당한 반전이 적절하게 갖춰진 모습이었다. 여기서 나오는 악당이 이전 시리즈들의 악당보다 훨씬 잔혹한 모습이라서 더욱 긴장이 컸던 것 같다. 책을 읽는 것에서 큰 행복감을 느끼는 주인공 소녀 차메인도 매우 독특한 성격을 가지고 있으며 주변에서 일어나는 여러가지 사건때문에 불평도 많지만 한편으로는 사람들을 도와주는데 전혀 망설임이 없어서 정말 마음에 드는 캐릭터이다. 중반 즈음 다시 모습을 드러내어 차메인에게 여러 도움을 주는 하울, 소피, 캘시퍼 역시 무척 반가운 얼굴들이다.

다음 시리즈가 또 빨리 나오기를 바라지만 이 Castle 시리즈는 18년만에 나온 책이고 게다가 2009년 여름에 폐암 수술을 받기도 해서 다음 시리즈가 금방 나올 것을 기대하기는 어려울 것 같다. T.T

좋은 Emacs 및 Elisp tutorial

2월 3rd, 2010 by No comments »

emacs에 관한 좋은 사이트가 있어서 링크해둔다.

http://xahlee.org/emacs/emacs.html

http://xahlee.org/emacs/elisp.html

Linux tcp keep alive

12월 9th, 2009 by No comments »

ssh는 keepalive 기능이 들어있지만 telnet에는 없어서 무척 짜증이 났는데 tcp의 keep alive를 이용하면 된다.

http://www.dslreports.com/faq/7792

The TCP KeepAlive value is stored in the “proc” filesystem (actually a virtual filesystem maintained by the kernel) under this path:

/proc/sys/net/ipv4/tcp_keepalive_time

The default just happens to be 7200 seconds (same as the BEFSR41 timeout). To defeat NAT it must be something smaller than that, like 1800. Setting it to a really small value like 60 is frowned upon as a bad network administration practice, especially if you are running a server.

So to change it all you need to do is this:

echo “1800″ > /proc/sys/net/ipv4/tcp_keepalive_time

You have to put this in a startup file like “rc.local” to make it permanent.

Beautiful Code Programming Praxis

9월 14th, 2009 by No comments »

Beautiful Code Programming Praxis.

  1. let match_re re text =
  2.  let len = String.length in
  3.  let get = String.get in
  4.  let remain str o = String.sub str o ((len str)-o) in
  5.  let next_ch ch o_re =
  6.   if len re > (o_re+1) then
  7.    if get re (o_re+1) = ch then true
  8.    else false
  9.   else false
  10.  in
  11.  let curr_ch ch o_re =
  12.   if len re > o_re then
  13.    if get re o_re = ch then true
  14.    else false
  15.   else false
  16.  in
  17.  let rec match_re_star c o_re o_text =
  18.   (* Printf.printf "match_re_star c:%c re:%s text:%s\n" c (remain re o_re) (remain text o_text); *)
  19.   if match_re_here o_re o_text then true
  20.   else if len text != o_text && ((get text o_text) = c || c = '.') then
  21.    match_re_star c o_re (o_text+1)
  22.   else
  23.    false
  24.  and match_re_here o_re o_text =
  25.   (* Printf.printf "match_re_here re:%s text:%s\n" (remain re o_re) (remain text o_text); *)
  26.   if len re = o_re then true
  27.   else if next_ch '*' o_re then
  28.    match_re_star (get re o_re) (o_re+2) o_text
  29.   else if get re o_re = '$' && len re = o_re+1 then
  30.    len text = o_text
  31.   else if len text != o_text && (get re o_re = '.' || get re o_re = get text o_text) then
  32.    match_re_here (o_re+1) (o_text+1)
  33.   else
  34.    false
  35.  and match_re_main o_re o_text =
  36.   (* Printf.printf "match_re_main re:%s text:%s\n" (remain re o_re) (remain text o_text); *)
  37.   if match_re_here o_re o_text then true
  38.   else if len text = o_text then false
  39.   else match_re_main o_re (o_text+1)
  40.  in
  41.  if curr_ch '^' 0 then
  42.   match_re_here 1 0
  43.  else match_re_main 0 0
  44.  
  45. let match_re_test () =
  46.   assert ((match_re "a" "a")=true);
  47.   assert ((match_re "a" "b")=false);
  48.   assert ((match_re "a" "ab")=true);
  49.   assert ((match_re "a" "ba")=true);
  50.   assert ((match_re "ab" "ab")=true);
  51.   assert ((match_re "ab" "ba")=false);
  52.   assert ((match_re "ab" "xab")=true);
  53.   assert ((match_re "ab" "aab")=true);
  54.   assert ((match_re "a.c" "ac")=false);
  55.   assert ((match_re "a.c" "abc")=true);
  56.   assert ((match_re "a.c" "xac")=false);
  57.   assert ((match_re "a.c" "xabcx")=true);
  58.   assert ((match_re "^ab" "ab")=true);
  59.   assert ((match_re "^ab" "ba")=false);
  60.   assert ((match_re "^ab" "aab")=false);
  61.   assert ((match_re "^ab" "abc")=true);
  62.   assert ((match_re "ab$" "ab")=true);
  63.   assert ((match_re "ab$" "ba")=false);
  64.   assert ((match_re "ab$" "aab")=true);
  65.   assert ((match_re "ab$" "abc")=false);
  66.   assert ((match_re "^ab$" "ab")=true);
  67.   assert ((match_re "^ab$" "ba")=false);
  68.   assert ((match_re "^ab$" "abc")=false);
  69.   assert ((match_re "^ab$" "aba")=false);
  70.   assert ((match_re "a.*c" "ac")=true);
  71.   assert ((match_re "a.*c" "abc")=true);
  72.   assert ((match_re "a.*c" "abbc")=true);
  73.   assert ((match_re "a.*c" "cbba")=false);
  74.   assert ((match_re "aa*" "x")=false);
  75.   assert ((match_re "aa*" "a")=true);
  76.   assert ((match_re "aa*" "aa")=true);
  77.   assert ((match_re "aa*" "ba")=true);
  78.   assert ((match_re "a*a*a" "a")=true);
  79.   assert ((match_re "a*a*a" "aaa")=true);
  80.   assert ((match_re "a*a*a" "xxxxx")=false)
  81.  
  82. let _ = match_re_test () (* no news is good news *)

OCaml translation of the regex match code in C.
I tried to beautify the code but it looks quite dirty due to the string operations. It will become more beautiful if we use a list of characters instead of native string as Scheme does in the suggested solution.

Insert increasing sequence of numbers in Emacs

8월 26th, 2009 by No comments »

When coding in Emacs, I needed to insert an increasing sequence of integers as follows.

  1.  pdriver_object->MajorFunction[0] = NULL;
  2.  pdriver_object->MajorFunction[1] = NULL;
  3.  pdriver_object->MajorFunction[2] = NULL;
  4.  pdriver_object->MajorFunction[3] = NULL;
  5.  pdriver_object->MajorFunction[4] = NULL;
  6.  pdriver_object->MajorFunction[5] = NULL;

It’s easy to copy and paste the lines. Inserting a sequence of integers was the problem and I wrote a small Emacs Lisp code for that.

  1. (defun f (n)
  2.  (let ((ns (number-to-string n)))
  3.   (if (<= n 30)
  4.     (progn
  5.      (insert ns)
  6.      (next-line)
  7.      (backward-char (length ns))
  8.      (f (1+ n))))))
  9. (f 30)

This was my first practical elisp code. It required more time than typing in numbers, it’s very satisfactory. :)