연도 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2008 2 8 3 10 6 3 4 6 6 2 1
2007 3 13 10 2 4 4 6 2 3 4 3
2006 15 12 24 7 11 9 11 5 14 6 7 5
2005 5 8 17 14 13 16 10 12 11 17 9 13
2004 26 23 20 22 26 24 20 24 12 19 18 10
2003 4 27 38 32 35 36 29

2003년 08월

다윈포트 체험기

OpenDarwin 프로젝트에서 진행 중인 포트 스타일의 패키징 시스템인 DarwinPorts 을 드디어 좀 해봤습니다. 음훗훗. DarwinPorts 개발자 중 상당수가 FreeBSD 쪽에서 건너가거나 겸하고 있는 사람들이다보니, 상당수의 포트들이 FreeBSD도 지원하고 있었습니다. 체크아웃 한 dports 트리를 보면

sbtm(perky):/usr/dports% grep -r '^platform.*darwin' .|wc -l
     482
sbtm(perky):/usr/dports% grep -r '^platform.*freebsd' .|wc -l
      99

현재, DarwinPorts에는 darwin을 지원하는 포트가 482개, freebsd를 지원하는 포트가 99개가 있습니다. :) 뭐 그런대로 주요 유틸리티 포트들은 FreeBSD도 지원하고 있어서 쓸만합니다. (python포트가 freebsd를 지원하지 않는 것은 좀 =3 =33)

DarwinPorts는 port라는 tcl로 작성된 별도의 툴을 이용해서 설치하는데, 요것 make 보다는 아무래도 포트에 특화된 것이라 속도도 그런대로 쓸만하고 좋은 듯합니다. textproc/cowsay 포트를 설치하면 요렇게 됩니다.

sbtm(perky):/usr/dports/textproc/cowsay% sudo port
--->  Fetching cowsay
--->  Attempting to fetch cowsay-3.03.tar.gz from ftp://tony/cowsay/
--->  Verifying checksum for cowsay
--->  Extracting cowsay
--->  Configuring cowsay
--->  Building cowsay with target all
sbtm(perky):/usr/dports/textproc/cowsay% sudo port install
--->  Staging cowsay into destroot
--->  Installing cowsay
sbtm(perky):/usr/dports/textproc/cowsay% /opt/local/bin/cowsay \
"Hello, DarwinPorts"
 ____________________
< Hello, DarwinPorts >
 --------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
sbtm(perky):/usr/dports/textproc/cowsay% sudo port uninstall
--->  Uninstalling cowsay-3.03

요건 darwin이 아니라, freebsd에서 설치해본 것인데, 사용자 편의를 위해서인지 기본으로는 컴파일 중 메시지를 전부 숨겨서 빌드가 오래 걸리는 툴들은 상당히 지루합니다. (뭐라도 화면에 나와야 -ㅁ-;; 한 줄에 . 한 개씩이라도 찍던가;;) 단, -v 옵션을 주면 FreeBSD나 NetBSD 처럼 안 감추고 보여줍니다.

그런데, DarwinPorts에서 가장 주목할 것은 바로 variants 시스템인데, OpenBSD에서 처음 시작되어 Gentoo에도 전해진 FLAVOR와 비슷한 역할을 하는데, 빌드시에 여러가지 옵션을 FreeBSD 처럼 난잡하게 포트 파일을 안 보고도 시스템에서 받쳐주는 것들을 on/off할 수 있게 되어, 자동으로 바이너리 패키지 빌드에서도 적용될 수 있도록 한 것인데, 정말 멋있습니다. :) 예를 들면, lang/python 포트의 Portfile은 요렇게 되어있습니다.

# $Id: Portfile,v 1.9 2003/08/05 21:02:22 jkh Exp $

PortSystem 1.0
name            python
version         2.2.2
categories      lang
maintainers     pat@ekman.cx
description     An interpreted, object-oriented programming language
platforms       darwin
master_sites    ftp://ftp.python.org/pub/python/${version}/
distname        Python-${version}
extract.sufx    .tgz
checksums       md5 1c1067396e5aa0299978486eb5bd1a5c
patchfiles      patch-unixccompiler.py
destroot.destdir prefix=${destroot}${prefix}


variant nothreads {
        configure.args-append   --without-threads
}

variant puredarwin {
        configure.args-append  --disable-toolbox-glue
}

요렇게 해놓으면, 설치할 때 port install +nothreads나, port install +puredarwin -threads 요런 명령으로 조절을 할 수 있고, GUI 툴로도 선택을 할 수있게 버튼이 나온답니다. 으흐흐흐 멋있군요~~

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 computer


행복이란..

이것만은 기억해 두세요
살아간다는 것은 기쁜 일이 반, 괴로운 일이 반이랍니다.
사람이 행복한 것은, 그 사람이 축복받았기 때문이 아니라
그저 그 사람이 행복해지려고 하기 때문인 겁니다.
고통을 잊으려는 노력, 행복해지는 노력.
그것만이 사람을 진정으로 행복하게 만들어주는 것이랍니다.

-- 『12국기』 27화에서 사이오(采王)

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 quotes


유럽 소프트웨어 특허법 투표 연기

그동안 많은 수의 오픈소스 프로젝트들과 오픈소스 해커들이 참가해 왔던 [WWW]유럽 소프트웨어 특허법 항의 시위의 영향으로 투표가 연기되었다고 합니다.

일단 연기가 돼서, 많은 수의 오픈 소스 구성원들의 뜻은 대충 전달되었다고 생각되어 지지만, 완전히 취소된 것은 아니기에, 오픈소스에 대한 심각한 위협은 아직 남아있습니다. 앞으로 좀 열심히 시위에 참여해서 유럽 소프트웨어 특허법을 꼭 막는데 보탬이 되야겠다는 생각이 드는군요. :)

댓글 3 개 | 트랙백 0 개 (보낼곳) | 태그 computer


여자에 관한 부드러운 메아리

목동 내 생각에 메아리가 숲 속에서 대답해 줄거야.
그리고 희미하게나마 내 물음에 대답해주겠지. 메아리님, 물어볼까요(Shall I try)? 메아리 해보렴(Try). 목동 우리의 정열을 나타내려면(to express) 무얼 해야 하죠? 메아리 껴안으렴(Press). 목동 결코 날 사랑하지 않는(never loved before) 그녀를 어떻게 하면 기쁘게 해줄 수 있을까요? 메아리 뱃머리가 되렴(Be fore). 목동 우리가 여자에게 구애할 때(address) 여자를 가장 감동시키는 것은 무엇일까요? 메아리 옷 한 벌 (A dress). 목동 대답해 주세요. 내가 사랑하는(adore) 그녀를 순결하게 지켜줄 수 있는 것은 무엇인가요? 메아리 문을 만들어 달아야지(A door). 목동 음악이 바위를 무르게 한다면, 사랑은 리라(lyre)를 울려주겠죠? 메아리 거짓말이야(Liar). 목동 그럼, 가르쳐 주세요. 메아리님, 어떻게 하면 제가 그녀를 얻을 수 있을까요(come by her)? 메아리 그녀를 사렴(Buy her).

-- 조너던 스위프트, <여자에 관한 부드러운 메아리>

댓글 1 개 | 트랙백 0 개 (보낼곳) | 태그 quotes


간단한 RDF/RSS 리더 - liferea

GTK2기반의 RDF 리더가 몇 종류 좋은 것이 나왔지만 (straw나 syndigator..) 뭔가 펄이나 파이썬이 두려워서 흐흐;; 그냥 C로 된 것 중에 liferea가 있다는 소식을 [WWW]iolo님께 들었는데, 마침 딱 해보고 싶어져서 깔아봤습니다. 전반적으로 깔끔하고 좋기는 한데, 아직 UI가 상당히 많이 불안하고.. 제법 불편하네요. 크.. 뭐 아직 0.3밖에 안 되었으니 언젠가는 제대로 될 날이 있겠죠 -ㅁ-;

포트에 [FreshPorts]net/liferea 로 등록되었습니다.

0308-liferea.png

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 computer


DotGNU WinForm 대회!

Mono에 밀려 불쌍한 신세가 되고 있는 [WWW]DotGNU 프로젝트에서 첫번째 코딩대회를 한다고 합니다. 이번 대회에서는 .NET GUI의 가장 중요한 요소이자 MS.NET 호환성을 위한 가장 삽질부분이라고 생각되는 WinForm 호환성 구현을 목표로 한다고 합니다. 8월 26일에 시작해서 4개월간 진행하게 되는데, WinForm의 완벽한 구현이 안 나올 경우에는 나올 때까지 한다고 하는군요.

그리고 상금은 1등이 2000달러, 2등이 600달러.. 해서 5등은 200달러입니다. 별로 다른 대회들에 비해 상금이 큰 편은 아니지만, 그래도 명목상 :) 에헤헤. 과연 이번 대회로 WinForm 오픈소스 구현이 나올 수 있을까요? GPL로 선언해야 한다는 강제 규정이 붙긴했지만.. 뭐 쓸 수만 있다면야;;;

참고: http://www.gnu.org/projects/dotgnu/competition.html

댓글 2 개 | 트랙백 0 개 (보낼곳) | 태그 computer


Cursed GTK+!

헉~ GTK+가 저주를!! 꺄아~*

GTK+ 2의 cursed 바인딩인 gtk+-cursed가 대략 베타가 나왔군요. 역시나 [FreshPorts]graphics/aalib 만큼이나 변태짓이긴 하지만.. 뭐 이런 재미로.. ;; 으흐흐

gdk쪽 패치는 gtk-linux-fb를 뜯어 고쳐서 만든 녀석이라 리눅스 fb쪽 헤더파일과 상수를 여기저기 엄청 많이 쓰고 있습니다. 그래서, 프비에서 컴파일하려면 헤더파일 인클루드를 지워주고 함수 쓰는 부분 주석처리 해버리고 해야하는데.. 이것 뭐 대충 뜨기만 하면 되는 거고 실제로는 안 쓸 거니깐 -ㅁ-;

컴파일이 끝나면 LD_PRELOAD로 gdk와 gtk를 엎어버리면 gtk애플리케이션들이 모두 cursed 기반으로 뜨게됩니다. 몇가지 테스트해보니 [FreshPorts]audio/liteamp 는 콘솔에 아무것도 안 나오고 곡이 단축키로 플레이는 됩니다. 그리고 [FreshPorts]www/mozilla 는 신비롭게도 그냥 X용이 퍽 떠버립니다. 그 외에 [FreshPorts]net/gaim 이나 [FreshPorts]x11/xffm4 같은 것도 시도는 해 봤는데 전부 segfault나버립니다. 그리고 한글이 제대로 안 나오고 전부 ?로 나오는데 이건 어디쪽 문제인지는 잘 모르겠네요.

그럼 기념으로 gtk-cursed에서 잘 돌아가는 애플리케이션 [FreshPorts]korean/gdick 의 원래 모습과 저주받은 모습 =3 =333

0308-cursed-gdick.png

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 computer


오늘의 FreeBSD~*

와와 오늘의 늬우쓰~

  • 드디어 한다한다 하고 여태까지 안 하고 있었던 Java for FreeBSD가 공식적으로 발표되었습니다. 이제 Sun에서 공식적으로 인증받은 자바 플랫폼으로 1.3.1을 쓸 수 있게 되었습니다. 1.4 포팅 작업은 아직 좀 많이 남았기 때문에, 좀 더 기둘려야겠네용. 흐흐. 코드 명이 JRE가 Latte Diablo, JDK가 Caffe Diablo ... -O- [WWW]FreeBSD Foundation 웹페이지에서 받을 수 있습니다. (포트 엔트리는 [FreshPort]java/diablo-jre13 [FreshPort]java/diablo-jdk13 입니다.)

  • 4.9 코드 프리즈 시작: 9월 중에 릴리즈될 4.9를 위해 오늘부터 코드 프리즈가 시작되었습니다. 지금부터 -STABLE 트리에 커밋되는 내용은 전부 릴리즈 엔지니어의 허락을 받은 주로 치명적인 보안 패치들입니다. 그래서 지금 -STABLE을 업데이트하시면 이제 4.9-PRERELEASE로.. 흐흐;; 포트 프리즈는 9월 첫째주에 있을 예정입니다. 포트 프리즈 전에 꼭 고쳐야 될 것이 있으면 지금 즉시 알려주세요~ :)

  • sendmail 보안버그: 보안버그의 대명사(--;;) sendmail에서 또 버그가 발표됐습니다. 이번 버그는 DNS 맵을 처리할 때 라운드로빈 테이블을 초기화하지 않아서 쓰레기값을 통해 외부 공격이 유입될 수 있다는 것 같군요. 4.6, 4.7, 4.8, -STABLE, 5.0, 5.1, -CURRENT 트리에 지금 고쳐져 있습니다. 참고: http://www.sendmail.org/dnsmap1.html

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


비 온다!

0308-nopay.jpg -- 도움이 안되는 진료 [ISBN-8941316170] 중에서

비오면 모든 식당이 공짜면 얼마나.... ;;; (두둥)

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 life


msdosfs utf-8 성공!

으히히.. 순전히 mp3를 들으려고 시작한 작업인 msdosfs 유니코드 지원 작업.. 중간에 2 나누기를 안 해서 한참 커널 패닉을 만나서 고생하긴 했지만, 크게 어렵지 않게 성공했습니다! 짠짠~~

mango:/d/Music Library/ㅈㅊㅋ)$ grep ad0s5 /etc/fstab
/dev/ad0s5              /d              msdos   rw              0       0
mango:/d/Music Library/ㅈㅊㅋ)$ cd 진주/
mango:/d/Music Library/ㅈㅊㅋ/진주)$ ls
진주 - 가니.mp3*               진주 - 에브리바디.mp3*  진주 - 해바라기.mp3*
진주 - 가지 말라고.mp3*     진주 - 전설속으로.mp3*
진주 - 언젠가 그대를.mp3*  진주 - 찜.mp3*

프프프.. 주로 Apple쪽의 소스를 그냥 갖다 붙이기를 했기 때문에, 사실 뭐 만든거라고는 함수 2개 밖에 없지만.. ;; 이제 libiconv로 utf-8을 떼내고 msdosfs가 iconv를 쓰도록 한 뒤에, PR을 보내려고 합니다. :)

댓글 6 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


우유 속에 진짜 망고 과즙 ^듬뿍

요즘 효리누님의 영향으로 망고 열풍이 엄청난 가운데~ (어제는 신촌에 지나가다가 어떤 40대 아줌마가 50대로 보이는 아저씨한테 델몬트 망고 캔을 주면서 "야 난 이게 젤 맛있더라☆ 너도 먹어봐~♡"라고 아주 아양떨면서 얘기하는 것을 봤습니다. -ㅁ-;;;;;;;) 드디어, 가난한 망고팬들을 위해 "우유 속에 진짜 망고 과즙 ^듬뿍" 이 나왔네용~ 0308-mangomilk.jpg

아히히 근데 소감은?

별로;; 뭔가 너무 진짜 망고라서 그런지 약간 신 비린내랄까.. 델몬트 망고의 가식적인 달콤한 그 맛이 없더군요;; 역시 델몬트 망고가 최고 (*⌒.^)^

댓글 2 개 | 트랙백 0 개 (보낼곳) | 태그 life


아론 키보드 새로 삼

저번주에 [WWW]장호언니와 마지막 밤을 새다가 커피를 쏟는 바람에 아론 키보드를 망가뜨린 이후에.. 우울하게 삼성키보드를 쓰고 있다가, 드디어 아론키보드를 새로 샀습니다. 으흐.. 삼성키보드는 아무래도 너무해서 --;;; (아래 키보드를 자세히 보세요 히히히)

0308-keyboard1.jpg

원래 스크롤락 색깔이 촌스러운 노란색이었는데, 초록색으로 바뀌었더군요 :) 에헤헤 아이좋아~~

0308-keyboard0.jpg

댓글 5 개 | 트랙백 0 개 (보낼곳) | 태그 life


Guido와의 인터뷰

얼마전 OnLamp[WWW]Guido van Rossum과의 인터뷰가 올라왔습니다. 얼마전에 귀도가 Zope를 떠나서 다른 회사로 간다고 발표한 것도 있고, 2.3과 2.3.1얘기도 있고 해서 인터뷰 내용이 아주 재미있는 게 많네요 :) 그동안 파이썬 문법이 계속 복잡해지면서(관점에 따라..) CP4E를 포기한 것인가! 하고 주장하는 사람도 있었는데, 아직 Guido는 CP4E가 어느 정도는 지금도 말이 된다는 입장이군요 으흐흐;;

If you say, "Why should a programmer learn Python",
I could say, "Because it's the most fun of all the available languages".
--- ''Guido van Rossum''

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 python


우리가 별이다!

http://eyehead.net/sfx/banner.gif http://eyehead.net/sfx/

[WWW]hey님께서 소개해주신 SFX를 요즘 자주 봅니다. (사실 업데이트가 잦지 않아서 처음부터 다시 계속;;)

아즈망가 만큼이나 재미있네요. :D 에헤헤

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 life


FreeBSD Dynamic Root

엊그제 블로그에서 언급되었듯이, 예전부터 논의되어 왔던 Dynamic Root가 이제 커밋되었습니다. 흐흐 근데 디폴트는 아니기 때문에 WITH_DYNAMICROOT=yes 를 /etc/make.conf를 넣고 make world를 해주면 Dynamic World로 갑니다. 흐흐 그런데 주의할 점이.. 그냥 마구 했다가는 인스톨하는 도중에 cp나 install같은 바이너리가 동적으로 바뀌어버려서 인스톨이 뻑나면서 시스템 쫑나는 -_- 문제가 생기니까, 최근에 /rescue 생기기 전에 make world하신 분들은 반드시 /usr/src/rescue가서 make install을 먼저 해 주고나서 make installworld를 해야합니당. 에.. 혹시나 벌써 rescue 인스톨하기 전에 installworld해서 이미 쫑난 상태다 싶으신 분들은, 다음 명령으로 우선 응급 처치해 놓으면 그 rescue를 make install할 수 있을 정도로는 됩니다.

mkdir /libexec /lib
/usr/obj/usr/src/rescue/rescue/rescue cp /usr/lib/*.so /lib/
/usr/obj/usr/src/rescue/rescue/rescue cp /usr/libexec/*.so /libexec/

예. 이렇게 해서 Dynamic Root를 만들고 나면 이제 다음과 같이 /bin에 있는 것들이 동적으로 나옵니다.

alice(perky):~% ldd /bin/sh
/bin/sh:
        libedit.so.4 => /lib/libedit.so.4 (0x2808a000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x2809f000)
        libc.so.5 => /lib/libc.so.5 (0x280df000)
alice(perky):~% ldd /bin/ls
/bin/ls:
        libm.so.2 => /lib/libm.so.2 (0x28076000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x2808f000)
        libc.so.5 => /lib/libc.so.5 (0x280cf000)
alice(perky):~% ls /lib
/lib:
libalias.so.4   libcrypt.so.2    libipsec.so.1  libncurses.so.5   libz.so.2
libatm.so.2     libcrypto.so.3   libipx.so.2    libreadline.so.4
libbsdxml.so.1  libdevstat.so.4  libkvm.so.2    libsbuf.so.2
libc.so.5       libedit.so.4     libm.so.2      libufs.so.2
libcam.so.2     libgeom.so.2     libmd.so.2     libutil.so.3

Dynamic Root가 도입되었을 때의 장/단점은..

  • 장점

    • 디스크 용량을 조금 먹는다: 원래 /bin /sbin은 크런치 바이너리가 아니므로 따로따로 static 바이너리라서 엄청나게 먹었습니다. 그런데, 이제 동적 라이브러리로 링크됐기 때문에, libc부분이 공유돼서 줄어들었고, /rescue의 바이너리들도 전부 크런치된 바이너리 라서, 디스크 용량을 전체적으로 훨씬 적게 먹습니다. NO_RESCUE=yes 하면 더 줄일 수 있지만 요것만은 하지 맙시다 =3 =33

    • 플러그인 형태의 공유 라이브러리를 쉽게 쓸 수 있다: nss(dns 캐쉬), pam(Pluggable Authentication Module) 같은 플러그인 형태의 모듈들을 쉽게 쓸 수 있게 됩니다. 그동안 pam같은 경우에는 /bin/login 같은 곳에서 쓸라면 아주 힘들었는데, 이제 pam을 붙일 수 있는 형태로 만들 수 있으니 만세입니당.

    • 휴지통이나 libfsxlat같은 라이브러리를 쓸 수 있다: LD_PRELOAD 흑마법을 기반으로 한 시스템콜 가로채기 라이브러리인 trashcan이나 libfsxlat같은 것들을 이제 /bin /sbin에 있는 녀석들 한테도 쓸 수 있겠죠.

  • 단점

    • 업글 잘못하면 클난다: 리눅스 사용해 보신 분들은 몇 번 겪으셨겠지만, Dynamic Root는 업글 잘못하면 난리가 나서.. 아주 고생을... 그래서 FreeBSD에서는 /rescue에 원래 /bin과 /sbin에 있던 바이너리 전체를 크런치해서 넣어두었습니다.

    • 실행 속도가 느려진다: 공유 라이브러리들을 쓰면 프로그램이 뜰 때마다 리로케이션하느라 힘들어져서, 뜨는 속도가 제법 느려지고, PIC(Position-Independent Code) 생성때문에 최적화에서 불리해져서, 또한 별로 좋은 효과가 들어가지는 않습니다.

흐물~ 뭐.. 5.2에서 너무 많이 바뀌고 있는 것 같아서 좀 불안하긴 하지만, NetBSD도 그랬듯, 뭐 좀 지나면 괜찮아 지겠죠 -ㅁ-;

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


오늘의 포트질~*

오늘은 엊그제 얘기했던 [FreshPorts]korean/gdick 을 포트에 집어넣었습니다. 흐물.. 이제 프비에서도 쉽게 사전을!

그 외에 잡다구리 주인 없는 포트들 파이썬 버젼 올라가면서 깨진 것들을 고쳤습니다. (자꾸 고치라고 메일 보내서 -.-)

  • [FreshPorts]graphics/py-opengl : tk8.4 지원이 안 들어가 있어서 tk8.3용으로 되어있는 헤더를 이름 바꿔서 써버림. -.-;

  • [FreshPorts]devel/fnorb: Makefile.pre.in에서 @DEFS@ 를 빼야 제대로 컴파일되는 문제.

  • [FreshPorts]biology/pymol: fnorb랑 같은 문제

  • [FreshPorts]devel/pybibliographer: fnorb랑 같은 문제

  • [FreshPorts]math/scigraphica: exec 안에 네스티드 스코프성 변수를 써버리는 바람에 2.3에서는 신택스 에러나서, eval로 바꿔버림.

뿡뿡 =3

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


오늘의 FreeBSD~!

<에헴>오늘의 간추린 FreeBSD 소식을 말씀드리겠습니다.</에헴> -;;

  • 며칠 전 포트에 dns와 polish 카테고리가 생기고, xfce4 가상 카테고리가 생겼습니다.

  • 드디어 /bin, /sbin을 동적 컴파일을 하는 DYNAMICROOT가 Gordon Tetlow의 작업으로 커밋되었습니다. WITH_DYNAMICROOT=yes를 make.conf에 넣고 make world하면 되는데, 요건 할 얘기는 많지만 내일의 블로그 거리를 남겨두기 위해 자세한 것은 내일;;; _-_

  • 오는 8월 24일 4.9 릴리즈를 위한 -STABLE 트리 Freeze에 들어갑니다. (9월말에 릴리즈 예정)

  • Colin Percival의 새로운 프로젝트로 binup 프로젝트가 교체되었습니다. 그동안 BSDi가 넘어간 이후에 중단되어 있었는데, 이제 앞으로는 혹시나 새로운 Colin의 프로젝트가 성공한다면, 보안성 있고, 빠르고, 적은 대역폭을 사용하는 바이너리 업데이터를 가질 수 있게 될 것입니다. :)

그리고.. 곁다리로 Python 소식 하나... Python 2.3.1이 9월 두째주 쯤에 릴리즈될 예정입니다. 이번 버전의 릴리즈 짜르(Czar)은 마침 9월 첫째주에 휴가인 py2exe와 ctypes로 유명한 Thomas Heller가 맡는 다는군요. 기대가 됩니다.! :D

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


xfce4로 이주하다.

갑자기 마음이 동해서, 오랫동안 함께했던 [WWW]KDE를 버리고 [WWW]xfce4로 이사해버렸습니다. 으흐흐.. 물론 이쁘기야 KDE가 좀 더 이쁘긴 하지만 -.-; KDE가 아무래도 리소스도 많이 먹고 요즘 쓰는 프로그램이 거의 다 GTK2기반인데다, KDE 트레이에 gtk 프로그램들을 도킹한 상태에서 kde 프로그램들이 도킹해버리면 X가 얼어버리는 이상한 사태가 벌어지는 바람에.. 요즘 뜨고 있는 xfce를 한번 깔아봤습니다.

흐흐 생각보다 아주 깔끔하고 속도도 빨라서, 앞으로 xfce를 쓰기로 마음 먹었습니다. ~.~;; xfce는 GTK+-2.0 기반으로 되어있어서 풍부한 GTK2 테마들을 쓸 수 있고, 환상의 한글 입력기 [WWW]imhangul을 쓸 수 있다는 점도 아주 마음에 들구요.. 단순한 디자인 때문에 리소스를 아주 적게 먹는다는 것도 아주 마음에 드는군요. 흐흐.. 그리고, 주요 개발자 중의 몇 명은 BSD라이센스파라서 몇몇 컴포넌트는 BSD라이센스로 되어있고, 코어쪽도 대체로 GPL이 아닌 LGPL로 되어있다는 점도 마음에 쏘옥 듭니다. 으후훗;;

Everybody loves screenshot, we're no exception! 0308-xfce4-thumbnail.png [WWW]전체보기

스크린샷 출연 프로그램: gnome-terminal, xchat2, liteamp, gaim, nabi(독 안에), mozilla(다른 데스크탑에;;)

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 computer


msdosfs fun

요즘 윈도우 파티션에 들어있는 mp3들을 우찌 잘 들어볼 방법이 없을까. 이런 저런 고민을 하다가, msdosfs.ko를 libiconv.ko를 쓰게 하는 게 아무래도 구조상 무리라서 (현재 libiconv.ko는 CES가 제대로 지원될 수 없는 구조..) msdosfs.ko에 직접 UTF-8패치를 해보려고 시도를 해 봤습니다.

그래서, 이런 저런 닭짓끝에, 기본적인 인코딩/디코딩은 성공했는데.. 두둥.. 웬걸~ 글자가 앞쪽만 잘려서 나오는 겁니다. 으흐.. 이게 무슨 일이냐 해서 보니.. UTF-8 시퀀스가 유니코드 글자 개수만큼 바이트로 잘려서 나오는... 그러니까.. '한글'이라는 파일 이름은 '\xed\x95\x9c\xea\xb8\x80' 인데, 이게 앞에 2바이트만 잘려서 '\xed\x95'가 되는 것.. 왜 그런지 여러모로 뒤져보니.. 이런! msdosfs.ko가 글자 길이를 그냥 원래 유니코드 시퀀스 길이로 계산해버리는.. 그러니, 사실상 256:256 컨버트가 가능한 ISO-8859 쓰는 녀석들만 msdosfs를 정상적으로 쓸 수 있다는.. 그런 구조로 되어있던 것이었습니다.

그래서, 제대로 계산하게 좀 패치를 했는데(좀 미심쩍은 부분이 있긴 했지만..), 또 웬걸~ 좀 파일 이름만 길어지면 또 뒤가 잘리는.. 그 문제는 이번에는 또 윈도우의 파일 시스템 구조 특성상 13글자 단위로 뒤에서부터 엔트리가 시작돼서.. 긴 파일 이름이 여러 슬롯으로 나뉜다는 것입니다. 그러니.. 결국 파일 이름이 좀 길어지면 13글자 단위로 쪼개서 뒷 블럭부터 변환이 일어나서.. 가변폭 인코딩인 UTF-8로서는 도저히 길이 계산을 할 방법이 없어진다는... 도식적으로 그려보자면 "1234567890123에헤라디여바람분다창문닫아라" 라는 파일이 있다면

  • ATTR_WIN95 엔트리: '라'를 들고 있고 WIN_CNT가 2

  • ATTR_WIN95 엔트리: '에헤라디여바람분다창문닫아'를 이름으로 들고 있고 WIN_CNT가 1

  • ATTR_WIN95 엔트리: '1234567890123'을 이름으로 들고 있고 WIN_CNT가 0

  • 일반 파일 엔트리: '123456~1 123'을 이름으로 들고 있음. (짧은 이름이 123456~1.123이 됨)

이렇게 돼서.. 순서대로 파싱하려면 맨 끝에있는 '라'가 먼저 나와버리기 때문에, 현재 msdosfs.ko처럼 ATTR_WIN95 엔트리를 처리하면서 변환까지 같이 하는 구조에서는 가변폭 인코딩을 처리할 방법이 전혀 없습니다. 그래서 궁리를 좀 해보니, WIN95 길이의 최대길이인 256글자를 스택에 들고 있으면서 거기에 버퍼링을 해 뒀다가 그걸 한꺼번에 전체를 인코딩하는 방법 밖에는 없겠다 싶었습니다. 그래서 좀 찾아보니.. 으허허 역시 Apple Darwin에서는 벌써 그런 방법으로 고쳐놓았더군요. 그래서 결국은 FreeBSD의 win2unixfn 함수가 없어지고 getunicodefn이 msdosfs_conv에 들어가서, msdosfs_vnops에서는 win2unixfn으로 일일이 엔트리마다 변환해서 dp->d_name에 직접 쓰는 것이 아니라, getunicodefn으로 각 엔트리별 유니코드 스트링을 스택에 버퍼한 다음에 그걸 사용하는 것으로 되어있었습니다. 그런데, Darwin은 원래 파일시스템이 유니코드 기반이라 변환이 필요없지만, FreeBSD는 8bit byte sequence형태이므로 변환할 필요가 있기 때문에 Darwin것 그대로 수용은 불가능했지만, 그래도 뭔가 좀 빌려 쓰면 될 것 같네요.

음.. 그래서.. 결론은? 에.. 며칠 삽질 더 해야겠다는.. 크크;;

이렇게 하고 나면 뭐 거의 libiconv.ko에도 바로 붙을 수 있는 수준 --;;;;;

댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


GDick for Win32

ddt님이 만드신 GTK+2용 사전 클라이언트 [WWW]GDick의 윈도우용 인스톨러를 만들었습니다. 흐흐흐. 사실 [WWW]SpamBayes가 그렇듯, 윈도우용 인스톨러가 나와야 쓰는 사람이 많아지는 것은 자명한 사실이라 --;;

0308-gdickwin32.png

[WWW]py2exe[WWW]NSIS를 사용해서 패키징했는데, 둘 다 아주 멋지게 쏙 되네요. :) 사전 자주 찾을 일이 있으신 분들은 한 번 시험을.. :)

다운로드 ==> http://openlook.org/distfiles/GDick-0.5.3.exe

댓글 6 개 | 트랙백 0 개 (보낼곳) | 태그 happyhacking


이런 바보 -.-;;

어제랑 엊그제는 회사 일이 좀 바빠서 밤을 샜습니다. 요즘은 DynaWLAN이라는 윈도우용 무선랜 인증 클라이언트를 만들고 있어요. 현대기아자동차에 8월말까지 납품해야 하는거라.. ... -_-;;

중간에 다른 사람 컴퓨터에서는 다 잘 되는데, 제 컴퓨터에서만 인증이 다 끝나고 DHCP로 IP를 받아오는 [WWW]IpRenewAddress라는 함수가 먹통이 되면서 "파일이 없습니다"에러가 나는 아주 희한한 현상을 만나면서.. 거의 6시간을 왜 안되나 왜 안되나 삽질을 복잡하게 하다가, 커널 디버거를 띄워볼까 하는 생각까지도 했는데 --;

결국 마지막으로 윈도우를 새로 깔아볼 까 하는 생각에 백업이나 해두려고 제어판을 둘러보는데... ....... 두두둥!! 서비스에서 DHCP Client서비스가 "사용 안 함"으로 체크되어 있...... 허허헉!!

뭔가 문제가 생기면 다음부터는 바닥부터 끝까지 구조를 그려놓고 한 번씩 짚어봐야겠습니다 --;

댓글 10 개 | 트랙백 0 개 (보낼곳) | 태그 happyhacking


[경] 병역특례 2개월 단축! [축]

드디어, 어제 오후 2시에 있었던 임시국회 본회의에서 산업기능요원 특례가 2개월 줄었습니다.

꺄아아아~~~

[WWW]국회 병역법 개정안 내용에 따르면

구체적으로 살펴보면, 복무기간 단축 조항의 시행시기를 2003년 10월 1일로 함으로써 금년 10월 1일 입영하는 사람들부터 단축 혜택을 보도록 하였고(안 부칙 제1조) 복무중인 현역병 등에 대해 서는 특례를 규정하여 금년 9월 30일 이전에 입영 또는 소집․편 입되어 복무중인 자도 혜택을 받도록 하되 구체적인 기간은 국방 부장관이 정하도록 하였음(안 부칙 제6조).

. 공익근무요원 산업기능요원 전문연구요원 . 행정관서요원 예술체육요원 국제협력요원 현역 보충역 전문연구요원 현행 28월 36월 32월 36월 28월 5년 개정안 26월 34월 30월 34월 26월 4년

그래서 병역법 39조가 다음과 같이 개정되었습니다.

第39條(專門硏究要員및 産業技能 要員의 服務) ①전문연구요원 및 산업기능요원은 해당 분야에 서 다음 각호의 구분에 의한 기 간동안 의무종사를 하여야 하며, 그 기간을 마친 때에는 공익근 무요원의 복무를 마친 것으로 본다. 이 경우 제37조제2호의 규정에 의한 전문연구요원의 경 우 박사학위과정의 수학기간은 의무종사기간에 산입하지 아니 한다.

  • 전문연구요원은 4년

  • 산업기능요원은 2년 10월. 다 만, 공익근무요원소집대상보충 역에서 편입된 산업기능요원은 2년 2월로 한다.

  • 만세!

    댓글 3 개 | 트랙백 0 개 (보낼곳) | 태그 life


    머리 염색 새로 하다☆

    0308-newhair.jpg

    이히히, 상쾌한 재충전 효과를 위해 머리를 새로 했습니다. 뭐 늘 하던 그 스타일 그대로지만;;; 므흐흐 그런데, 미용실의 에센스가 뭔가 특별한 것인지 냄새가 아주 좋습니다;; 다음에 가면 물어봐야지~~ * 아 그런데, 5년째가고 있는 [WWW]주노헤어 이대3호점에서 뭔가 행사를 하는 중인지, 행운권 비스무리한 것 응모하라고 해서 쓰기는 썼는데.. 뭔가 대단한 것 주는 것처럼 얘기하던데~ 막 파마약 같은 것 주는 것 아닌지 -.,-;;;

    위에 사진은 살이 꺼매서 머리색이 죽었기에, 머리만 하이라이트한 사진을 -.-..

    0308-hair.jpg

    댓글 2 개 | 트랙백 0 개 (보낼곳) | 태그 life


    한일동시채팅

    [WWW]인조이재팬을 보고 감명받은 게 참 많아서, 예전에 메일링리스트를 잠시 두개를 병행 운영하면 어떨까 생각하고 만들어보긴 했는데, 실제로 쓸 일이 없어서 묵혀두고 있었는데 흐흐..

    어제는 한 번 IRC를 자동번역으로 연결해 봤습니다. #autotr-ja 에서는 일본어로 말하고 #autotr-ko 에서는 한국어로 말하면, 서로 번역돼서 상대방 채널로 가는 것이지요.. 기존에 번역 코드는 만들어 둔 것이 있었기 때문에 (천리안 기반..) 별로 어렵지는 않았는데, 하여간 재미있었습니다~ 아직 진짜 일본인하고 얘기는 못 해봤지만;; _-_ 0308-autotranslation.png

    ( 위는 xchat win32로 일본어 채널을 iso-2022-jp로 쓰고 있고, 아래는 putty안에 irssi로 한국어 채널을 euc-kr로 접속하고 있는 것) --- 요즘 win32 스크린샷이 유난히 많은 것은 회사에서 윈도우 기반 일만 하는 중이라 --;;

    댓글 3 개 | 트랙백 0 개 (보낼곳) | 태그 happyhacking


    Thanks a million!

    히히히 ~.~ [Blog]happyhacking/0308MonoCP949 패치 보낸 것이 어제 통과되어서 곧 모노 CVS에 들어갈 것이라고 합니다. Miguel이 직접 메일을 보내줬군요. (히히 너무 좋아서 자랑~;;;)

    From: Miguel de Icaza <miguel.at.ximian.com>
    To: perky.at.FreeBSD.org
    X-Mailer: Ximian Evolution 1.4.3
    Date: 11 Aug 2003 10:58:32 -0400
    
    Hello!
    
        Thanks a lot for the new Codec, we will integrate it shortly into
    the build.  And thanks for the script ;-)
    
    Miguel.
    --
    Miguel de Icaza <miguel.at.ximian.com>
    

    IRC에도 보면 들어오는 사람마다 이름 불러 주며 인사하고, 그러면 사람들이 막 반갑게 패치도 주고 그러는 것으로 보아 역시 이 사람은 정말 엄청난 프로젝트 리더인 듯 ~.~ 모노 프로젝트가 괜히 진행이 빠른 게 아닌 듯 하군요.. 크크.. (자동 메일 스크립트로 1줄로 "뻑났으니 고치세요" 뭐 이런식으로 보내는 k모씨의 메일과 비교하면 --;) FreeBSD쪽에서는 코어팀 중에서 인간적으로 감명을 받을 만한 사람은 Peter Wemm 밖에 없었는데.. 훌륭한 오픈소스 프로젝트 리더가 되기 위한 조건들을 좀 생각해 보아야겠습니다. :)

    Thanks a million!

    댓글 13 개 | 트랙백 0 개 (보낼곳) | 태그 happyhacking


    James Watson의 "권리"에 대한..

    신성함과 같은 용어는 나에게 동물의 권리를 연상시킨다. 누가 개에게 권리를 주었는가? 권리라는 이 단어는 매우 위험하다. 여성의 권리, 아동의 권리가 등장했으며, 이제 권리의 목록은, 끝없이 이어지고 있다. 그렇다면 도롱뇽과 개구리의 권리도 있지 않겠는가. 터무니 없는 일이다. 나는 권리나 존엄과 같은 말은 사용하고 싶지 않다. 인간은 욕구를 가지며, 사회적 종으로서 그러한 욕구(음식이나 교육, 건강 등)에 반응할 따름이다. 사이비 신비주의적인 방식으로 의미를 부풀리려는 것은 스티븐 스필버그와 같은 사람들에게 적당하다. 내 말은 허황된 소리에 지나지 않는다는 뜻이다.

    --- 제임스 왓슨, 2000년 회의 기록문 Stock and Campbell p.85

    원래 Francis Fukuyama의 책에 인용된 내용이지만, 그의 책에서는 이 말을 인용한 뒤에 부분적으로 반박하는 말이 따르기 때문에, 재인용이라고 저것만 똑 따기에는 좀 억울한 면이 있습니다. :) 인권에 대해 많은 것을 생각해주게 하는군요~ (James Watson의 말에 100%동의한다고 하면 뭔가 사회적 인간이기를 적당량 포기한다는 말을 하는 것 같아서, 적당히 얼버무리고 도망.. =3 =33)

    댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 quotes


    Python.NET

    [WWW]ActiveState에서 만든 구리구리한 Python.NET 말고 Zope에서 만들고 있던 PythonNet이 Preview 2가 발표가 됐군요~. 아직까지는 MS.NET CLR하고만 제대로 돌아가지만, Mono로도 곧 되지 않을까 싶습니다. 흐흐

    타볼을 풀어보면 빌드하기는 좀 아리송 하고 (뭔가 싸인을 하려면 인증서가 있어야 한다는데, 배포는 같이 안 하는군요) 바이너리가 들어있어서 그걸로 실행해 보면 됩니다.

    짠 실행해 보면

    >>> from CLR import System
    >>> System.Console.WriteLine("우헤헤헤 {0} 짜짠짠 {1}", 100, "oops!")
    우헤헤헤 100 짜짠짠 oops!
    >>> from CLR.System import Text
    >>> Text.Encoding
    <class 'CLR.System.Text.Encoding'>
    >>> import sys;sys.platform
    'win32'
    

    흐흐 Jython 처럼 뭐 플랫폼이 바뀌는 것은 아니고, 그냥 일반 CPython과 CLR의 중간 연결고리만 만들어 놓은 녀석이라, 플랫폼은 그냥 네이티브로 나옵니다. 그리고, 파이썬 바이트 코드들은 .NET 어셈블리로 바뀌어서 실행되는 게 아니라, 전부 CPython VM이 실행하고 중간 데이터 교환만 PythonNet이 담당해서 CLR에게 전해지게 됩니다.

    WinForm도 벌써부터 잘 되네요 흐흐..

    0308-pythonnet.png

    댓글 2 개 | 트랙백 0 개 (보낼곳) | 태그 python


    모노 CP949 코덱 완성

    오픈소스 닷넷 프레임웍인 [WWW]Mono를 위한 CP949 코덱을 완성했습니다. 크크크~~ (사실 뭐 별 건 아니지만;;;)

    그동안 I18N.CJK.dll이라고 이름 붙은 것이 K를 지원 안해서 아주 좀 보기가 그랬지만 그래도 이제는 진짜 CJK~ 근데, 막상 버그질라에 보내려고 접속해 보니 버그질라가 죽었는지 접속이 안 되네요 --;

    코덱이 없으면 이렇게 나오던 것이~ (윈도우에서는 UTF-8로 나오고, 리눅스와 FreeBSD에서는 요상 야릇해서 도저히 해독할 수 없는 것으로 나옵니다 ;;)

    0308-mono-wocodec.jpg

    코덱이 있으면 이렇게 나옵니다.

    0308-mono-withcodec.jpg

    최근 CVS 버젼에 대해서 작업했는데, 바이너리 파일이 하나 끼여있기 때문에 패치는 못 만들고 그냥 풀어서 덮어씌우는 타볼을 만들었습니다. http://openlook.org/distfiles/mono-cp949.tar.gz 에서 받을 수 있습니다.

    보통 디코더로 byte[]를 char[]로 변환할 때 이런 방법으로 쓸 수 있습니다. (어렵게 알아낸 것 --;;;;;;; 코덱을 만들긴 했는데 시험을 못해보니 어찌나 답답하던지요 -ㅁ-;)

    // Hello1.cs
    using System.Text;
    
    public class Hello1
    {
        public static void Main()
        {
            Decoder x = Encoding.GetEncoding(949).GetDecoder();
            byte[] orig = {0xc0, 0xe5, 0xc8, 0xa3, 0xc1, 0x64, 0x97, 0xcd};
            char[] output = {(char)0, (char)0, (char)0, (char)0};
    
            System.Console.WriteLine(x.GetChars(orig, 0, 8, output, 0));
            System.Console.WriteLine(output);
        }
    }
    

    댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 happyhacking


    망고, 모노, 코어

    0308-mango.jpg

    요즘 심취해 있는 델몬트 망고 --;;

    망고와 함께라면 모노 코어 덤프도 즐겁지 -ㅁ-;

    댓글 3 개 | 트랙백 0 개 (보낼곳) | 태그 life


    ko_KR.CP949 등록!

    "쀍"과 "햏"같은 글자를 쓰기 위한, 필요악 인코딩인 CP949(CodePage 949)를 기반으로 한 한국어 인코딩이 FreeBSD에 추가되었습니다. (이 블로그는 UTF-8을 쓰기 때문에 그렇게 나쁜 편은 아닙니다 히히~)

    그냥 터미날같은 데서 적당한 프로그램들을 쓰면, 이제 확장완성형 글자들도 특별히 깨져서 나오지는 않을 것입니다. 완전하지 못한 점이 하나 있다면, 아직 FreeBSD가 multibyte collation을 지원하지 않아서 collation에 대한 고려가 전혀 되어있지 않다보니, 한글 정렬이 제대로 안 될 것입니다.

    그리고, screen에서는 원래 한국어를 쓸 수 있는 인코딩이 euc-kr과 UTF-8밖에 없어서, CP949패치를 따로 해서 넣으려고 하고 있습니다.

    [WWW]CVSWEB

    댓글 2 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


    「사기열전」중에서..

    하규의 책공은 이렇게 말했다. 처음 내가 정위가 되었을 때는 빈객이 문 앞에 가득 찼지만, 파면되자 문밖에 참새 잡는 그물을 쳐도 될 정도였다. 내가 다시 정위가 되자 빈객들은 예전처럼 모여들려고 했다. 그래서 나는 문에 이렇게 크게 써서 붙였다.

    한 번 죽고 한 번 사는데 사귀는 정을 알고, 한 번 가난하고 한 번 부유함으로써 사귀는 모습을 알며, 한 번 귀했다가 한 번 천해짐으로써 사귀는 참된 정을 알게 된다.

    "사기열전"中에서

    (박카스를 좋아하시는 [WWW]ddt님의 홈페이지에서 재인용)

    댓글 3 개 | 트랙백 0 개 (보낼곳) | 태그 quotes


    ktrace(1)를 이용한 자동 plist 생성

    포트를 만들거나 업글할 때 가장 귀찮은 과정 중의 하나인 plist를 자동으로 만드는 방법은 [WWW]mtree기반으로 된 것이 있었지만, 뭔가 다른 프리픽스로 한 번 깔아보는 게 대략 귀찮은 관계로.. [FreeBSDMan]ktrace 를 이용한 방법을 한 번 생각해 봤습니다. 흐흐흐.. open 시스템 콜을 모두 추적해서 O_WRONLY나 O_CREAT로 열린 녀석들 목록을 자동으로 plist로 만들어주는 것인데, 대충 만들어 본 소스는..

      1 
      2 
      3 
      4 
      5 
      6 
      7 
      8 
      9 
     10 
     11 
     12 
     13 
     14 
     15 
     16 
     17 
     18 
     19 
     20 
     21 
     22 
     23 
     24 
     25 
     26 
     27 
     28 
     29 
     30 
     31 
     32 
     33 
     34 
     35 
     36 
     37 
     38 
     39 
     40 
     41 
     42 
     43 
     44 
     45 
     46 
     47 
     48 
     49 
     50 
     51 
     52 
     53 
     54 
     55 
     56 
     57 
     58 
     59 
     60 
     61 
     62 
     63 
     64 
     65 
     66 
     67 
     68 
     69 
     70 
     71 
     72 
     73 
     74 
     75 
     76 
     77 
     78 
     79 
     80 
     81 
     82 
     83 
     84 
     85 
     86 
     87 
     88 
     89 
     90 
     91 
     92 
     93 
     94 
     95 
     96 
     97 
     98 
     99 
    100 
    101 
    102 
    103 
    104 
    105 
    106 
    107 
    108 
    109 
    110 
    111 
    112 
    113 
    114 
    115 
    116 
    117 
    118 
    119 
    120 
    121 
    122 
    123 
    124 
    125 
    126 
    127 
    128 
    129 
    130 
    131 
    132 
    133 
    134 
    135 
    136 
    137 
    138 
    139 
    140 
    141 
    142 
    143 
    144 
    145 
    146 
    147 
    148 
    149 
    150 
    151 
    152 
    153 
    154 
    155 
    156 
    157 
    158 
    159 
    160 
    161 
    162 
    163 
    164 
    165 
    166 
    167 
    168 
    169 
    170 
    171 
    172 
    173 
    174 
    175 
    176 
    177 
    178 
    179 
    180 
    181 
    182 
    183 
    184 
    185 
    186 
    187 
    188 
    189 
    
    #!/usr/bin/env python
    #
    # autoplist.py - Automatic pkg-plist generator based on ktrace
    #
    # ----------------------------------------------------------------------------
    # "THE BEER-WARE LICENSE" (Revision 42, (c) Poul-Henning Kamp):
    # Hye-Shik Chang <perky@FreeBSD.org> wrote this file.  As long as you retain
    # this notice you can do whatever you want with this stuff. If we meet some
    # day, and you think this stuff is worth it, you can buy me a beer in return.
    #
    # Hye-Shik Chang
    # ----------------------------------------------------------------------------
    # $FreeBSD$
    
    import os, random
    import sys, re
    import time
    
    random.whseed()
    TMPNAM = '.autoplist.%d.%x' % (os.getpid(), random.randrange(65536))
    KTRACECMD = 'ktrace -f %s -id -t cn %%s' % TMPNAM
    KDUMPCMD = 'kdump -f %s' % TMPNAM
    O_WFLAGS = os.O_WRONLY | os.O_RDWR | os.O_CREAT
    PREFIX = '/usr/local'
    IGNOREPREFIX = ['/dev/', '/tmp/']
    PLIST_SUBS = (
        'PYTHON_INCLUDEDIR', 'PYTHON_LIBDIR', 'PYTHON_SITELIBDIR',
        'SITE_PERL', 'SITE_RUBY', 'DOCSDIR', 'EXAMPLESDIR', 'DATADIR',
    )
    PLISTREPLACE = []
    
    def errorexit(msg):
        print >> sys.stdout, "autoplist.py:", msg
        sys.exit(-1)
    
    def cleanup_tmpfiles():
        try:
            os.unlink(TMPNAM)
        except:
            pass
    
    def getmakeenv(envname):
        return os.popen('make -V "%s"' % envname).read().strip()
    
    def echo_msg(msg):
        print '===>  ', msg
    
    class InstallState:
    
        procs = {}
        lastforker = 0
    
        def __init__(self, pid, procname):
            self.pid = pid
            self.procname = procname
            if not self.lastforker:
                self.curdir = os.getcwd()
            else:
                self.curdir = self.procs[self.lastforker].curdir
            self.procs[pid] = self
            self.files, self.dirs = {}, {}
            self.trackatom = {}
    
        def feed(self, args):
            if self.trackatom:
                if args[2] == 'NAMI':
                    self.trackatom['nami'].append(eval(args[3]))
                elif args[2] == 'RET':
                    rtok = args[3].split()
                    if rtok[1].isdigit() or rtok[1].startswith('0x'):
                        self.trackatom['exit'] = eval(rtok[1])
                    else:
                        self.trackatom['exit'] = rtok[1]
                    if len(rtok) >= 3:
                        self.trackatom['errno'] = eval(rtok[3])
                    self.newsyscall(**self.trackatom)
                    self.trackatom = {}
            elif args[2] == 'CALL':
                syscall, ignore, args = re_syscallargs.findall(args[3])[0]
                self.trackatom['syscall'] = syscall
                self.trackatom['args'] = args and args.split(',') or []
                self.trackatom['nami'] = []
                if syscall in ('fork', 'vfork', 'rfork'):
                    InstallState.lastforker = self.pid
    
        def getabspath(self, path):
            if path.startswith('/'):
                return path
            else:
                return os.path.realpath(os.sep.join([self.curdir, path]))
    
        def newsyscall(self, syscall, args, nami, exit, errno=0):
            if syscall == 'open':
                if eval(args[1]) & O_WFLAGS:
                    self.files[self.getabspath(nami[0])] = None
            elif syscall == 'mkdir':
                self.dirs[self.getabspath(nami[0])] = None
            elif syscall == 'chdir' and exit == 0:
                self.curdir = self.getabspath(nami[0])
            elif syscall in ('execve',) and exit == 0:
                self.procname = nami[0]
    
    def filterfilelist(files):
        filelist = []
        warnlist = []
        prefix = PREFIX + os.sep
        for f in files:
            for pfx in IGNOREPREFIX:
                if f.startswith(pfx):
                    continue
            if f.startswith(prefix):
                filelist.append(f[len(prefix):])
                for var, repl in PLISTREPLACE:
                    if filelist[-1].startswith(repl):
                        filelist[-1] = filelist[-1].replace(repl, '%%'+var+'%%')
            else:
                warnlist.append(f)
        return filelist, warnlist
    
    re_syscallargs = re.compile('([A-Za-z0-9_-]+)(\(([^)]*)\))?')
    def getwfiles():
        entry = {}
        istate = InstallState.procs
        echo_msg('Analyzing installation syscall logs')
        for l in os.popen(KDUMPCMD):
            ltok = l[:-1].split(None, 3)
            pid = int(ltok[0])
            if not istate.has_key(pid):
                proc = istate[pid] = InstallState(pid, ltok[1])
            else:
                proc = istate[pid]
            proc.feed(ltok)
    
        echo_msg('Generating auto plist')
        fo = open("pkg-plist.autogen", "w")
        print >>fo, "@comment Generated by autoplist.py", time.asctime()
    
        files = {}
        dirs = {}
        for pid, data in istate.iteritems():
            files.update(data.files)
            dirs.update(data.dirs)
    
        files = files.keys()
        files.sort()
        files, warnfiles = filterfilelist(files)
        for file in files:
            print >>fo, file
    
        dirs = dirs.keys()
        dirs.sort()
        dirs.reverse()
        dirs, warndirs = filterfilelist(dirs)
        for dir in dirs:
            print >>fo, "@dirrm", dir
    
        return istate
    
    def main():
        try:
            err = os.system('make build')
            if err != 0:
                errorexit("`make' exited with error code %d" % err)
            err = os.system(KTRACECMD % 'make install')
            if err != 0:
                errorexit("`make' exited with error code %d" % err)
            getwfiles()
        finally:
            cleanup_tmpfiles()
    
    def buildenvironment():
        global IGNOREPREFIX, PREFIX, PLISTREPLACE
    
        IGNOREPREFIX.append(os.path.abspath(getmakeenv('WRKDIRPREFIX')))
        IGNOREPREFIX.append(os.path.abspath(getmakeenv('DISTDIR')))
        IGNOREPREFIX.append(os.path.abspath(getmakeenv('PKG_DBDIR')))
        PREFIX = getmakeenv('PREFIX')
    
        for var, raw, stripped in re.findall('([A-Za-z_0-9]+)=("([^"]*)"|[^"]\S*)',
                                    getmakeenv('PLIST_SUB')):
            if var in PLIST_SUBS:
                PLISTREPLACE.append((var, stripped or raw))
        PLISTREPLACE.sort(lambda x,y: -cmp(x[1], y[1]))
    
    if __name__ == '__main__':
        buildenvironment()
        main()
    
    # ex: ts=9 sts=4 sw=4 et

    흐흐.. 그런데, 대충 만들고 나서 보니, 속도가 너무 느리고 (좀만 대형 포트로 가면 엄청난 양의 kdump가 나와버려서 그것 파싱하는데 십분이 넘게 걸립니다 --;) mtree기반의 녀석에게 특별한 장점이 없다는 결론이.. 흐흐흐... (그리고, 위 구현에서는 디렉토리를 인스톨 도중에 mv 해 버린다던지 하는 것에 대해서 무방비 --;)

    그래서, 이 녀석을 좀 변모시켜서 plistlint 정도의 이름으로 인스톨하면서 plist에 없는 프로그램 건드리지는 않나, 빼먹은 파일 없나, /tmp에 이상한 파일 남기지 않나 등등을 검사하는 걸로 만들어 볼 까 합니당. 크크

    댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


    파이썬 2.3의 공유 라이브러리 지원

    이미 해본 분들은 아시다시피 ~.~, 파이썬 2.3에서는 --enable-shared를 주면 공유 라이브러리로 사용이 가능하도록 돼서, libpython2.3.so가 1메가짜리가 나오고 python은 3천 바이트짜리가 나옵니다.

    그래서, 이야 멋지다 하고 메모리 절약에 도움이 되지 않을까 하는 생각에, FreeBSD포트 [FreshPorts]lang/python 에는 덥썩 shared를 디폴트로 해 버렸는데, 다행히도 python-dev 메일링에 누가 "왜 --enable-shared가 디폴트가 아닌가요"하는 질문에 Martin v. Löwis가 좋은 대답을 해 주어서, 덕분에 잘못 알고 있었던 것을 바로 잡게 되었습니다. 으흐흐 (다들 알던 것인가;;)

    웬지 공유 안 할 것 같아 보였던, static 바이너리도 inode가 같은 경우에는, text 이미지를 메모리에서 모두 공유한다는군요 (두둥!) ~.~;;

    Löwis의 가르침(!)을 요약하면..

  • 파이썬 바이너리가 1개만 있으면, 걔네들은 모두 공유라이브러리 만큼 전부 메모리나 디스크 공간을 공유한다. 그런데, 거의 대부분의 파이썬 애플리케이션들이 파이썬 바이너리를 따로 쓰는 게 아니기 때문에, 대부분의 파이썬 애플리케이션들은 실행 파일 이미지를 메모리에서 공유한다고 볼 수 있다. 특별한 예외라면 [WWW]mod_python이 있는데, mod_python은 아파치 바이너리를 통해서 공유돼서, 다른 파이썬 바이너리와는 공유하지 않지만, 아파치 바이너리들 끼리 공유해서 같은 효과를 얻는다.

  • 공유 라이브러리를 유지하는 것은 상당한 관리상 문제점이 따른다. 어떤 경우에는 인스톨이 제대로 안 될 수도 있고, 공유라이브러리 링커에 따라 못 찾게 될 수도 있다.

  • 공유 라이브러리를 사용하면, 시작하는 시간이 길어진다. 또한, [WWW]ld.so에 디렉토리가 몇 개 더 추가되어야 하고, 빌트인 모듈로 컴파일되지 않은 파이썬 모듈까지 모두 공유라이브러리 패스에 들어가야 한다. (퍼키 주: 이 부분은 적어도 FreeBSD에서는 사실이 아닙니다. FreeBSD에서는 그냥 [WWW]dlopen(3)으로 절대경로찾도록 되기 때문에, 정적 컴파일한 것이나 같습니다.)

  • 공유 라이브러리를 사용하면, 실행 시 효율성이 떨어진다. PIC (Position-Independent-Code)는 일반적으로 non-PIC 바이너리보다 최적화에서 불리하다. ([WWW]블루님 주: 현실적으로는 거의 차이가 없다고 합니다. ;)

  • 공유 라이브러리를 들고 있으면, 관리 비용이 더 많이 든다. 컴파일러, 링커, 다이내믹 링커 등등 거의 모든 개발 툴에서 기존에 없었던 문제가 발생될 수 있고, 이에 대해서 일일이 고려해야한다.

  • 흐흐흐. 그래서, FreeBSD의 [FreshPorts]lang/python 포트도 별도의 공유 라이브러리 포트를 분리해 내고, 정적 컴파일로 다시 돌리려고 합니다. 만세 \(-.-)/

    (Martin v. Löwis의 원문은 [WWW]http://mail.python.org/pipermail/python-dev/2003-August/037472.html)

    댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 python


    4-STABLE의 PAE 지원

    FreeBSD의 물리적 주소 범위를 4GB이상으로 넓히는 Jake Burkholder의 PAE 옵션이 Luoqi Chen의 포팅 작업으로 4.x에 성공적으로 포팅돼서 그동안 많은 테스트가 있었는데, 이제 이번 주 금요일에 PAE가 4에 임포트가 된다고 합니다. PAE를 사용하는 드라이버같은 것들이 따로 아직 많은 편은 아니기 때문에 직접적인 영향은 없으리라 생각되지만, 그래도 안정적인 시스템 운용이 필요한 분들은 다음 주까지는 좀 미루시는 것이 좋겠군요. :)

    PAE가 들어오면 이제 FreeBSD 4에서도 4GB이상의 메모리를 쓸 수 있고, 2테라 이상의 단일 스토리지를 쓸 수 있게 됩니다. :) 그리고, 이것을 포함한 다음 릴리즈는 9월 예정인 FreeBSD 4.9! ~.~

    댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


    FreeBSD의 python2.3에서 py-xml문제

    python2.3의 _xmlplus 최소 버전이 0.8.2로 되어있어서, FreeBSD 포트 [FreshPorts]textproc/py-xml 으로는 python2.3에서 쓸 수 없었던 문제가 있었습니다. (사실은 그 문제 때문에, openlook도 잠시 cgitb 판이 됐었;; ~.~) 메인테이너인 wjv가 지금 직장을 옮기느라 바쁜 상태라서, 그냥 방금 0.8.3으로 업그레이드해 버렸습니다. 혹시 파이썬 2.3에서 py-xml이나 pyblosxom쓰시는 분은 이제 업글하시면 제대로 될 겁니다. ;)

    댓글 0 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


    나비!

    그동안 ami가 특별한 경쟁자없이 주도하고 있던 XIM 세계에, 드디어 경쟁자가 나타났습니다. 바로 오픈소스 소리바다 클라이언트인 [WWW]소리받아와 GTK+2용 한글 입력기인 [WWW]imhangul로 유명하신 크리스나님께서 '나비'라는 이름의 예쁜 입력기를 공개하신 것!

    '나비'는 GTK+2기반으로 되어있지만 표준 XIM 인터페이스를 제공하기 때문에 OpenOffice나 KDE, xterm같은 곳에서도 쓸 수 있기에, ami나 hanIM같은 기존 XIM들을 완전히 대체할 수 있을 뿐더러, imhangul에서 보아왔던 유니코드 기반 오토마타를 내장하고 있기 때문에, 옛 한글 지원 같은 진보적인 기능들을 지원할 수 있는 기반을 갖추고 있습니다.

    또한, KDE와 GNOME에 도킹이 되는데, ami가 KDE3에 도킹이 제대로 안 되고 있었던 점을 감안하면 (ami는 KDE3보다 나중에 떠야지만 도킹이 됨) KDE사용자들에게도 이제 축복이~~ :) 그러나, NumLock 이 켜져있는 상태에서는 한글이 입력 안 된다거나, xterm에서 한글입력 중에 스페이스를 누르면 스페이스가 먼저 커밋되는 것 같은 사소한 몇가지 문제점이 있는데, 아직 0.1이기 때문에 개선의 여지는 충분히 많이 있겠죠~

    FreeBSD 포트 [FreshPorts]korean/nabi 에 등록되어 있습니다.

    댓글 7 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


    파이썬 richrepr 아이디어

    지난 번에 string repr과 string print를 로켈에 맞게 수정한 버젼이 pickle같은 몇 가지 곳에서 문제가 발견되어 CVS에 들어갔다가 빠졌는데, 새로운 방법을 여러 모로 생각해 봤지만, 적당한 방법이 생각이 안 나서, 결국은 type object에 tp_richrepr 이라는 메쏘드를 새로 만드는 방법을 한 번 생각해 봤습니다.

    파이썬에서 오브젝트가 출력되는 방법은 두 가지인데,

    • PyFile_WriteObject에서 출력하는 오브젝트가 진짜 파일인 경우에는 PyObject_Print로 직접 FILE *fp에다가 출력. PyObject_Print는 재귀적 탐색을 해서 String의 경우에는 PyString_Print가 내부 함수인 string_print를 호출해서 최종적으로 출력하는 데, 이 때에 flags에 Py_PRINT_RAW가 세팅되는 경우에는 그냥 fwrite를 하기 때문에 한글이 제대로 나오는데, 0인 경우에는 한글이 모두 이스케이프되어 버림.

    • PyFile_WriteObject에서 출력하는 오브젝트가 StringIO같은 가짜 파일인 경우에는 PyObject_Repr로 일단 String으로 만든 뒤에 그 녀석을 인자로 해서 출력 오브젝트의 write를 호출.

    여기서, 첫번째 방법으로 출력이 되는 경우에는 그다지 어렵지가 않은 것이, Py_PRINT_RICH라는 플래그를 하나 만들어 줘서, 그 녀석을 계속 끝의 flags에 달아 다니다가, PyString_Print와 PyUnicode_Print에서만 적당히 처리해서 뿌려주면 될 것 같습니다.

    그런데, 이제 두번째 경우에는 repr()이 호출되어서 PyObject_Repr에 들어온 것인지, 출력하려고 PyObject_Repr에 들어온 것인지 하위 오브젝트들에게 전달해 줄 수 있는 방법이 전혀 없기 때문에, 결국은 새로 오브젝트 프로토콜 메쏘드를 하나 만들어 주는 수 밖에 없는 걸로 보입니다. 그래서, 결국 typedef PyObject *(*richreprfunc)(PyObject *v, const char *encoding); 타입으로 하나 만들어서 typeobject의 제일 끝에 추가하고 PyObject_RichRepr을 PyFile_WriteObject에서 사용하도록 하려고 생각하고 있습니다.

    아직은 가능성을 위해서 이것 저것 테스트해 보고 있구요 ~.~; 우선, CJKPython 2.3final에서 표준 2.3과 호환성을 유지하기 위해서는 타입 오브젝트의 크기가 변할 수 없기 때문에, SJIS 패치에서만 그냥 원래 일본식 repr을 쓰고 표준 타입에서는 sys.displayhook만 교체하는 방법을 쓰려고 합니다.

    파이썬 2.4에서는 다국어 문제가 말끔히 해결되었으면 좋겠네요. :) 혹시 좋은 아이디어 있으신 분들은 꼭 알려주세요~

    댓글 2 개 | 트랙백 0 개 (보낼곳) | 태그 python


    파이썬 포트 2.3 업그레이드

    [FreshPorts]lang/python 을 파이썬 2.3으로 업그레이드하고, [FreshPorts]lang/python22 에 파이썬 2.2를 레포카피한 뒤에 altinstall로 바꿔두었습니다. 대충 파이썬 포트들 한 20개 정도 테스트해 보니 호환성에는 별 문제가 없는 듯 하네요. ~.~

    자자 모두들 portupgrade python 때리시고.... 흐흐흐 =3

    [FreshPorts]lang/python-devel 포트는 2.4a0 오늘자 스냅샷을 뽑아서 올릴 생각입니다. 참 그리고, 오늘 [FreshPorts]lang/jython 이 드디어 [WWW]2.2a0이 발표되었더군용. Jython 팬들은 꼭 확인을 ~.~

    댓글 4 개 | 트랙백 0 개 (보낼곳) | 태그 freebsd


    누구?

    장혜식 (Hye-Shik Chang)
    내일을 사랑하는 소년(!)

    최근 댓글