나의 메일 관리 원정기

글을 쓰려고 마음을 먹으면 항상 먼저 떠오르는 할 말이 바로 시간이 너무 빠르게 흘러간다는 것이다. 그럴 때마다 내가 뭐 그리 바쁜 위인이라도 되는지 허탈한 웃음이 나오곤 한다. 그런데 요즘에는 정말 하는 일도 없이 시간이 흐르는 것 같다. 늦잠 자랴 아기 돌보랴 식사하고 한숨 돌리랴. 이런 삶의 사치를 누리다 보면 언젠가 이런 밑천도 바닥나는 게 아닌가 싶다. 가뜩이나 절약이라는 것을 잘 모르는 나에겐 그렇다.

그래도 아무 것도 하지 않은 것은 아니고, 남들이 보면 소소하다고 할만한 일들에 상당한 시간을 할애했다. 오늘은 완벽한 메일 체계 구축을 위한 나만의 여정에 대해 이야기하고자 한다.

어느 날 문득 2000년 부터 쌓인 11만여 통의 메일을 폴더를 나누지 않고 회사 내부 메일과 *함께* 관리하고 싶었다. 회사 보안 정책상 GMail과 같은 공용 서비스에 내부 메일을 담을 수 없으므로 자체적으로 메일 서버를 세팅해 IDC 에 입주시켰다. Dovecot IMAP 서버fetchmail을 사용해 하나의 계정에 모든 메시지를 긁어오도록 설정했다.

11만통의 메시지를 긁어 오는 모습을 멍하니 바라보다 보니 엔코딩이나 제목 포매팅에 문제가 있는 것들이 많이 보였다. 그래서 수십여개의 정규표현식과 문자셋 자동인식 모듈, JavaMail API을 이용해 Exim MTA 측에 필터를 설치했다. (처음에는 PERL로 했지만 나중에는 그 규칙이 너무 복잡해져서 Java로 전부 다시 작성했다.) 그 과정에서 메일을 대량으로 받아 오면서 실험하다 보니 일종의 트래픽 초과 덕택에 GMail 계정이 24시간 동안 막히는 사태가 발생했다. 처음엔 어찌나 당황했는지…

이렇게 우여곡절 끝에 받아 온 11만여 통의 메일을 주제나 연도별로 쪼개기가 싫어서 – 이걸 왜 사람이 해야 하나? – 검색 폴더 기능을 이용하기로 했다. 검색 폴더 기능이 지원되는 메일 클라이언트는 Evolution, Claws-mail (mairix를 통해), Thunderbird, Opera 9.5 베타인데, 모두 결격 사유가 있었다. Claws-mail은 mairix라는 외부 어플리케이션을 사용하기 때문에 한계가 있었고, 무엇보다도 IMAP 지원이 너무 부실해서 탈락. Thunderbird는 검색 폴더의 검색 조건이 너무 단순해서 탈락. Evolution은 조건식은 원하는 만큼 복잡하게 설정할 수 있었지만 11만개를 폴더를 열 때마다 다시 처리해서 탈락. 마지막 후보 Opera 9.5 베타는 극도로 강력한 실시간 검색, 검색 폴더, 메일링 리스트 관리 등을 제공하여 너무나 만족스러웠다. 브라우저와 메일 클라이언트, 그리고 IRC 클라이언트까지 하나로 통합되어 있는데다가 메모리 사용량도 적어 금상첨화였지만, 결정적으로 불안정했다. 아아… 지구에는 내 요구를 만족하는 메일 클라이언트는 *아직* 없었다.

한 가지 희망이 있다면 GNOME 2.22와 함께 딸려 오는 Evolution은 그래도 검색 폴더 기능의 성능에 향상이 있을 뿐만 아니라 오히려 메모리 사용량도 더 적다는 것이었다. 하지만 내가 사용하던 Fedora 8에서 GNOME만 2.20으로 유지하고 Evolution만 업그레이드하는 것은 불가능했다. 혹시나 하는 심정으로 Fedora 9 베타를 설치했지만 내 랩탑은 아직 지원이 제대로 되지 않아 많은 부분이 불편해 다시 Fedora 8을 설치하고 말았다.

이쯤 되서 포기했다면 어땠을까 하는 생각도 들지만 언제나 마음에 들 때까지 바꾸고 또 바꾸는게 내 성격인지라, 결국 GNOME 2.20을 쓰면서 Evolution 2.22도 쓸 수 있는 Gentoo Linux로 재설치를 하게 된다. Gentoo Linux는 10번 정도는 깔아 본 적이 있기 때문에 쉽게 세팅을 완료할 수 있었다. 내 속을 태우는 기나긴 컴파일 시간과 잘 잡히지 않는 무선랜 문제에 대한 해결책을 찾는 데 할애한 시간을 제외한다면…

하지만 Evolution 2.22는 기대만큼 빠르지 않았다. 역시 *아직* 지구의 메일 클라이언트들에게 11만통은 무리인 것 같다. Opera 9.5 안정 버전이 아직 나오지 않은 것을 못내 아쉬워하는 순간이었다.

결국 타협책으로, 볼일이 끝난 메일은 ‘Archive’라는 하나의 폴더로 전부 옮기고 나머지 메시지에 대해서만 검색 폴더를 생성하게 되었고, 나름 만족스러웠다. 내가 일일이 ‘Archive’ 폴더로 옮겨야 한다는 것만 제외한다면… 이걸 왜 내가 해야 되는건지.

그런데 이 검색 폴더라는 것에서 제시할 수 있는 검색 조건이라는 것이 우리가 일반적으로 사용하는 메일 필터 규칙 기능에서 제공하는 조건의 종류에 비교하면 그 수가 매우 적다. 예를 들어 Evolution에서는 정규 표현식을 메일 필터 규칙에서는 사용할 수 있지만 검색 폴더에서는 사용할 수 없다. 성능을 위한 나름의 궁여지책이겠거니 이해가 가지만, 근본적으로 인덱싱을 제대로 안해서 사용자에게 불편을 가하고 있는 게 아닌가? Opera 9.5 안정 버전이 아직 나오지 않은 것을 못내 아쉬워하는 *두 번째* 순간이었다.

정규 표현식을 통한 정교한 필터링이 필요했던 나는 결국 검색 폴더를 포기했다. Archive 폴더의 도입 이후 또 한 번의 타협이었다. 어쨌든 메일 필터 규칙을 작성하여 메일이 들어오는 순간 원하는 폴더에 쌓이게 하는 데 성공했고, 필터가 정교하니 나름 검색 폴더의 필요성을 느끼지 못하게 해 주어 그나마 아쉬움은 크지 않았다. 다만 지금까지 돌아온 나의 길이 너무나 멀었다는 사실을 뼈저리게 느끼지 않을 수 없었다.

그런데 여기서 이야기는 끝나지 않는다. Firefox 3 베타와 GNOME 2.22를 쓰고 싶어진 것이다. 여러 의존성 문제 때문에 Evolution 2.22나 GNOME 2.22의 일부 컴포넌트는 Firefox 2를 반드시 필요로 한다. GNOME 2.22의 일부 컴포넌트야 그냥 설치하지 않으면 그만이지만, 지금까지 힘들게 규칙을 설정한 Evolution은 어쩌란 말인가. 여기서 보통 포기하겠지만 나는 좀처럼 포기를 하지 않는 못된 버릇이 있다.

그래서 결국 sieve 라는 서버측에서 사용할 수 있는 메일 필터링 언어를 배웠다. 문법은 아주 간단하고 Dovecat IMAP 서버와 연동도 쉽지만 언어에 대한 깔끔한 문서를 찾기가 힘들고 정규 표현식 매칭 등의 기능을 사용한 예가 없어서 관련 RFC를 직접 읽어야 했다. 몇 번의 실수도 있었지만 결국에는 Evolution에서 작성했던 모든 규칙을 서버 측에서 처리할 수 있게 되었다. 즉, 어떤 메일 클라이언트를 써도 메일 필터링이 이미 다 된 상태로 계층화된 메일함을 열람할 수 있게 된 것이다. 여기까지 다다른

The Workarounds for Eclipse Crash with JDK 1.6.0.05+

Eclipse crashes almost always with SUN JDK 1.6.0.05 or above. There are two workarounds:

  • Use SUN JDK 1.5.
  • Prevent org.eclipse.core.internal.dtree.DataTreeNode.forwardDeltaWith() from being compiled by the hotspot engine:
    cd /usr/local/java/eclipse
    echo "exclude org/eclipse/core/internal/dtree/DataTreeNode forwardDeltaWith"
    > .hotspot_compiler

I prefer the second solution because JRE 1.6 outperforms JRE 1.5 in performance, which means better IDE responsiveness etc etc. However, it is also OK to choose the solution #1 when the second one doesn’t work for you.

Adding the latest beta SUN JDK to the Gentoo java-config VM list

Gentoo Linux has a very nice java integration; you can have more than one JDK distributions in your machine and switch the VM in system-wide and per-user manner. To switch your current VM, you can simply enter ‘java-config —set-user-vm=VM‘ and that’s all.

However, you need to know how java-config works if you want to add any JDK which is not in the portage. It’s pretty simple to add a JDK, but it can be tricky for a beginner. Please follow the following steps:

  1. Install your JDK somewhere. (e.g. 1.6.0.10-beta in /opt/sun-jdk-1.6.0.10)
  2. Add the profile of the newly installed JDK into /usr/share/java-config-2/vm/. Copy from an existing one and replace some version numbers. (e.g. cp sun-jdk-1.6 sun-jdk-1.6.0.10; perl -pi -e “s/1\.6\.0\.03/1.6.0.10/g” sun-jdk-1.6.0.10)
  3. Create a symbolic link to the JDK directory in /usr/lib/jvm/. (e.g. ln -s /opt/sun-jdk-1.6.0.10)
  4. Confirm that the new VM is recognized by java-config by typing ‘java-config -L‘.

슬픔에 대한 용기 (Mut zur Trauer) – 에리히 케스트너 (Erich Kästner)

요즘 SBS 에서 방영중인 그여자가무서워라는 드라마가 있다. 시청자 게시판에는 혹평 일색인듯 하지만, 나는 미우나고우나와 함께 아주 재미있게 보고 있다. 지난 110회에서는 비주얼 노벨의 한 장면처럼 시를 흘려 보내는 신선한 시도가 이루어졌는데, 그 시의 아름다움과 배경에 뿌려지는 최영림의 시선에 대해서는 누구라도 섣불리 혹평할 수 없을 듯 하다:

슬플 때는 거리낌 없이 울어라.
마음을 너무 감시하지 마라!
눈물이 흐르는 대로 슬퍼해도
죽는 일은 없다.

이렇게 되리라는 걸 첨부터 알았다.
아무래도 내일 아침까지 유쾌해질 까닭이 없다.
아무리 술독에 빠져 보아도
목구멍의 쓰디쓴 맛을 씻을 수 없다.

아무런 원인도 없이 왔다 가는 슬픔.
맘속은 텅 빈 허공뿐이다.
병은 아니나, 건강한 것도 아니다.
영혼이 매끈하지 못한 느낌.

외톨이가 되고 싶다.
닥치는 대로 사람들과 섞이고 싶다.
별안간 손을 올려 코를 꼬집어본다.
거울을 꼼꼼히 들여다본다.
이게 내 얼굴이야?

아기를 바라보며 느끼는 것들

밤이 깊었다. 오래 전 사진에서 느껴지는 조금씩 늙어 가는 나와 내 아내의 모습은 빠르게 흐르는 시간을 실감케 한다. 빠르게 흐르는 시간과는 대조적으로 나의 머리는 가끔씩 무엇을 해야 할 지 쉽게 잊고 만다. 이런 상황을 맞딱뜨리고 있자면 왠지 모를 불안이 엄습한다.

불안.

불안 장애로 신경 정신과 치료를 받아 온 지도 6개월이 넘었다. 치료를 받기 전 몇 달 간은 장염, 망막 열공, 이명 등으로 인해 극도로 예민한 상태가 지속되었었다. 하지만 지금은 많은 일들을 좀 더 편안한 마음으로 바라보고 다양한 타협의 방법들을 배워가고 있다. 치료가 언제 끝날지는 모르겠지만 특별히 악화되지도 않으니 지금 이 상태로도 만족스럽다.

하지만 반사적으로 스스로에 대해 초조한 마음을 갖게 되는 것은 어쩔 수가 없다. 더 전진해야 한다는 강박과 의지 사이에 위치한 미묘한 무언가가 나를 그 곳으로 몰고 간다. 극도의 집중력과 자제력을 잃기 직전까지 감내할 수 있는 참을성에는 다 이런 댓가가 있는 것 아니겠냐고 스스로를 위안해 본다.

그런데 이런 복잡할 뿐 도움이 크게 되지 않는 생각들을 잠재우는 새로운 친구가 하나 생겼는데, 바로 지난 2월 9일에 태어난 내 딸 채은이다. 채은이를 바라본다고 해서 생각들이 사라지는 것은 아니지만 조금 다른 성격의 생각을 하게 된다.

요즘 자주 생각나는 것은 ‘아기’라는 존재의 위대함이다. 아기가 위대한 이유는 무엇보다도 앞으로 될 무언인가에 대한 가능성 그 자체에 있다고 생각한다. 서서히 만들어져가는 존재, 그 존재의 시작은 보는 이로 하여금 하염없이 바라보아도 질리지 않는 즐거움을 선사한다. 이미 늙어버린 내가 될 수 없는 어떤 것이 될 수 있는 존재란 그렇게 경이롭다. 끝없는 상상력을 자극한다.

다른 한 편으로는 아빠의 역할은 무엇일까 고민스럽다. 딱히 떠오르는 것은 없다. 지금까지의 나와 마찬가지로, 그리고 다른 과거의 많은 아빠들처럼 실수를 거듭하며 한 사람의 아빠가 되어 가지 않을까? 항상 그렇지만은 않을 것임을 너무나 잘 알지만, 즐거운 무엇인가가 나를 기다리고 있지 않을까 막연히 기대해 본다.

Fujitsu S6510 + MTRON 30GB SSD = Cool!

I purchased a new laptop. I wanted something very light and high-performing one, which means I have few candidates. The candidates were Lenovo ThinkPad X61(s), Toshiba Portage R500 and Fujitsu S6510. Toshiba was excluded because of its infamous customer support in Korea. I almost chose X61, but I leaned toward S6510 finally because it has wider screen and is based on the Penryn processor which has 6MB L2 cache. One issue is that I can’t use the ‘red bean’ (i.e. TrackPoint) anymore, but I can live with that.

Another cool gear that filled my need was MTRON 30GB SSD. 30GB is very enough for Linux laptop users because installing most packages just takes several gigabytes. I still have plenty of free space for me as a developer. If I were going to install Windows Vista, I couldn’t make it. The performance of the SSD is pretty cool, especially when it comes down to random access due to its 0.1ms access time. Moreover, it is very shock-resistant, silent and durable.

In overall, I am really satisfied with my purchase both in terms of performance and silence. I’d recommend this setting to every developer:

  • Fujitsu S6510 – be careful; only one sub-model (VP2520BZ) comes with the Penryn processor, which might be available only in Korea and Japan.
  • MTRON 30GB SSD
  • Fedora 8

새 랩탑을 구입했습니다. 아주 가볍고 성능이 좋은 걸 원했기 때문에 선택의 폭이 좁았습니다. 후보로 레노보 씽크패드 X61(s)와 도시바 포티지 R500, 후지쯔 S6510을 꼽았습니다. 도시바는 한국에서 애프터 서비스가 나쁘다고 소문이 자자해 제외했습니다. 거의 X61을 고를 뻔 했지만 결국에는 S6510으로 기울었습니다. 스크린도 더 넓고 L2 캐쉬가 6메가나 되는 펜린 프로세서를 탑재하고 있었으니까요. 한 가지 문제는 더이상 소위 빨콩으로 불리는 트랙포인트를 못쓰게 되었다는 건데, 없어도 큰 지장은 없네요.

제 요구를 채워준 또다른 멋진 장치는 MTRON 30GB SSD입니다. 리눅스 사용자들은 각종 패키지를 대부분 깔아도 몇 기가밖에 공간을 차지하지 않기 때문에 30GB는 아주 충분한 용량입니다. 개발자로서도 아직 남은 공간이 많습니다. 만약 윈도우즈 비스타를 설치하려고 했다면 불가능했겠죠. SSD의 성능은 끝내줍니다. 특히 0.1ms 접근 시간 덕택에 랜덤 액세스 성능이 탁월합니다. 더군다나 충격에도 강하고 조용하면서 고장률도 낮습니다.

전반적으로 성능과 정숙성 면에서 이번 구매에 상당히 만족해 하고 있습니다. 모든 개발자에게 이 세팅을 추천하고 싶습니다:

  • Fujitsu S6510 – VP2520BZ 서브 모델에만 펜린 프로세서가 탑재되어 있으니 주의하세요.
  • MTRON 30GB SSD
  • Fedora 8

'Donate' button created

‘Donate (기부하기)’ 버튼을 만들었습니다.

I know I will never become a millionare by adding a single button to this very personal blog, but I’ve just added the PayPal ‘Donate’ button on the right side of this page. Please feel free to donate for whatever I did for your goodness. BTW, I didn’t hurt anyone, right? 🙂

이런 개인 용도의 블로그에 버튼 하나 달았다고 떼부자가 되는 건 아니겠지만 그래도 한 번 PayPal ‘Donate (기부하기)’ 버튼을 이 페이지 오른쪽에 달아 보았습니다. 제가 당신께 도움드린 게 뭔가 있다면 한 번 기부해 보는 것은 어떨까요? 그런데, 제가 설마 해를 끼치진 않았겠죠? 🙂

Turning off Radeon LCD backlight when GNOME screensaver is activated

I wrote a quick and dirty script that turns on and off ATI Radeon LCD backlight by monitoring DBUS events to detect the activation and deactivation of GNOME screensaver. It requires the radeontool package to be installed and it needs to be set with suid flag (i.e. chmod u+s /usr/sbin/radeontool). Please feel free to launch the following script when your GNOME session starts:

#!/bin/sh
if [ "x`pgrep -of 'radeon-watch'`" != "x$$" ]; then
exit 1
fi
radeontool dac on
radeontool light on
{
dbus-monitor --session --monitor "type='signal',path='/org/gnome/ScreenSaver',interface='org.gnome.ScreenSaver'" | while read -r EVT; do
echo "$EVT" | grep -qi "SessionIdleChanged"
if [ "$?" = '0' ]; then
read -r EVT_VAL
echo "$EVT_VAL" | grep -qi "true"
if [ "$?" = '0' ]; then
radeontool dac off
radeontool light off
else
radeontool dac on
radeontool light on
fi
fi

echo "$EVT" | grep -qi "AuthenticationRequestBegin"
if [ "$?" = '0' ]; then
radeontool dac on
radeontool light on
fi

echo "$EVT" | grep -qi "AuthenticationRequestEnd"
if [ "$?" = '0' ]; then
radeontool dac off
radeontool light off
fi
done
} &

Please note that I tested this script with my old ThinkPad X31, so you might not need this script if you have the recent laptop or you are using other video chipset.

Introduction to Open Source at Winter of Code Boot Camp, 2008

The following movie is the recording of my speech in the Winter of Code boot camp, 2008. I explain what open source is and what motivation lies behind the open source movement.

다음 영상은 2008년 윈터 오브 코드에서 제가 발표한 것을 녹화한 것입니다. 오픈 소스란 무엇이고 그를 뒷받침하는 동기에 대해 설명하고 있습니다.