사용자 권한으로 CVS 레포지트리 옮기기

py-rrdtool 프로젝트를 호스트하고 있던 사바나가 데비안과 같은 방법으로 뚫리는 바람에 서비스가 아직도 완전히 정상복구 되지 않고 있습니다. 그런데, 어떤 개발자가 py-rrdtool 프로젝트에 개발자로 참여하고 싶다고 해서 (제 개인 프로젝트 최초로 외국인 개발자가! -ㅇ-;) 그래서 그냥 소스포지로 옮기기로 했습니다.

그런데, 옮겨다닐 때 마다 리비전도 잃어버리고 CVS 로그들도 다 잃어버리는게 좀 그래서, 관리자한테 요청을 할 까 생각도 해봤는데, 처리도 엄청 느리고 귀찮을 것 같아서, 그냥 손으로 임포트를 해버렸습니다. (cvs import가 아니라 rcsfile레벨 import)

우선, 임포트를 준비하기 위해서, 사바나에서 RCS파일들을 받아와야하는데, ftp://ftp.gnu.org/savannah/ 에 고스란히 다 보관이 되어있어서 거기서 바로 받아왔습니다. 흐흣. 거기서 임포트할 py-rrdtool 모듈 레포지트리만 뽑아서 우선 [FreeBSDMan]shar 명령을 이용해서 쉘 아카이브를 만듭니다.

요렇게 해서 생성된 쉘 아카이브는 권한 조절이 안 되기 때문에 끝에 chmod를 적당히 넣어서, CVS에서 쓰는 퍼미션인 디렉토리 775, 파일 664 퍼미션으로 맞춰줘야합니다. 그 다음에는, savannahimport 스크립트를 CVSROOT에 넣고 임포트합니다.

이렇게 되면 CVS서버에서 $CVSROOT/savannahimport 스크립트만 실행해주면 바로 임포트되는 상태가 되는데, 요걸 실행하기 위해서 loginfo 꽁수로 다음 줄을 CVSROOT/loginfo 끝줄에 넣습니다.

이렇게 하면, 그냥 loginfo가 커밋되고 실행은 안 되는데, 아까 그 줄을 지우고 다시 커밋하면 짠! 하고 임포트 스크립트가 실행됩니다.

흐흐흐. 그리고, 아까 임시로 썼던 savannahimport 스크립트를 지우고 checkoutlist에서 빼주면 간단히 임포트는 완료!

그런데, 이건 커밋 스크립트에서 /bin/sh 실행이 허용된 CVS 서버들에서만 가능하기 때문에, [WWW]사바나[WWW]OSS에서는 사용이 불가능하고, KLDP.net, 소스포지, BerliOS같이 모든 스크립트 실행이 허용된 곳에서만 사용할 수 있습니다.

열린 한글 프로젝트 개설

http://kldp.net/projects/hangul

X 한글입력기 “나비”, 윈도우용 IME방식 한글 입력기 “새나루”, GTK+2 한글 입력기 imhangul에서 공동으로 사용할 오토마타 엔진을 위해 “열린 한글 프로젝트”를 개설했습니다. 사실 이전에도 [WWW]사바나에 프로젝트가 있었지만, 사바나는 거의 망해가는 추세로 보이고 해서.. –;;

우선은 한글 조합, 분해와 기본 오토마타 구조를 내년초 릴리즈를 목표로 [WWW]박원규님과 [WWW]최환진님과 같이 할 예정입니다. :)

[WWW]한글 해커 메일링 리스트도 내부에 개설되어 있으니 한글 처리에 관심이 많으신 분들은 가입해 주세용~

char이 8비트가 아닌 세상

엊그제 [WWW]gcc 워닝을 제거하는 커밋을 하나 했는데, 여기에 unsigned char이 256보다 클지도 모르니 체크해봐야된다는 MAL의 답글이 올라왔습니다. 그래서 의아하게 생각하던 와중, Fredrik Lundh가 ANSI C 스펙을 참고해 보라고 해서 찾아봤더니.. char의 크기는 “각 기계에서 주소 지정이 가능한 최소 단위”라고 정의되어 있어서, char은 H6070에서는 9비트이고 Cray에서는 64비트, TI의 DSP칩에서는 16비트라는군요.. (….)

10년간의 char에 대한 믿음이 허물어지는 순간 흑흑 ㅡ.ㅜ char는 int8_t가 아니구나.. 아니였던 것이구나. ㅡ.ㅜ

Univac 시절부터 메인프레임을 써 왔다는 Tim Peters의 [WWW]답변에 따르면 Univac은 이런 char크기 싸움에 휘말리지 않기 위해서 char을 6비트, 9비트 또는 36비트로 쓸 수 있게 했다는군요.. (웃음)

여하간, 귀도와 팀이 char를 8bit로 파이썬 전반에서 사용하는 것에 대해서 괜찮다고 답변을 줬기 때문에, 뭐 더 걱정할 일은 없겠습니다. ^^; 그리고 이번 기회로 역시 20년 이상 경력을 가진 개발자들의 깊은 지식에는 역시 감탄을…

(ANSI C의 세계는 멀고도 험난하구나~~;;)

CVS 전용의 제한된 SSH 환경 만들기

developer.oss.or.kr 서버의 cvs 환경을 세팅한 얘기를 조금 흐흐~

소스포지나 BerliOS, 사바나 같은 곳에서는 개발자들을 위해서 ssh기반의 CVS_RSH를 제공해 주고 있는데, 소스포지와 BerliOS는 chroot된 ssh로 cvs를 돌리고 있고, 사바나는 subversion로 직접 ssh1 프로토콜을 제공해 주고 있습니다. oss에서는 그냥 소스포지 스타일로 간단하게 하기로 했습니다.

우선 기본은 openssh에 [WWW]chroot패치를 했고, (요건 pkgsrc로 깔았습니다. 므흐흐) 요 sshd는 [FreshPorts]security/pam_ldap 을 이용하도록 설정했습니다. LDAP은 다른 머신에 OpenLDAP을 깔아둔 걸로 썼는데, 2.1이 무지 빠르군요. 와와~ pam_ldap의 유저 관리는 [FreshPorts]sysutils/cpu 를 쓰도록 했는데, FreeBSD의 [FreeBSDMan]pw 를 기반으로 한 거라서 사용법도 무지 쉽고. 유저 넣고 고치는 것도 모두 1줄로 쉽게 되네요~

그리고, 이제 실제 서버 안에는 cvs를 몽창 static으로 컴파일해서 chroot안의 /bin에 넣고, cvswrap이라는 간단한 래퍼를 만들어서 쉘 대신 쓸 수 있도록 했습니다. 그래서 사용자의 홈 디렉토리는 /jail/./home (중간에 /./가 들어가는 부분에서 chroot)로 되어있고 쉘은 /bin/cvswrap으로 지정했는데, 하나 문제는 openssh가 원래 chroot를 지원하는 게 아니다보니, 쉘이 없으면 끊겨버려서 바깥쪽에도 /bin/cvswrap을 만들기는 해야하는군요;;

cvswrap 소스는 일단 [WWW]요렇게 짜 놓았는데, 헛점이 있지 않을까 혹시 심심하신 분은 함 봐주세용 므흐;; 그래서, 최종적으로는 cvsroot는 jail안에 존재하고, jail 안에는 바이너리는 cvs와 cvswrap만 있도록 하고, libc같은 것들은 전혀 없도록 하였습니다. (말은 jail이지만 레드햇 7.2이기 때문에.. [FreeBSDMan]jail 과는 다름 =3) rsync도 이런식으로 제공할까 고민 중입니다~ 므흐;

그나저나, 레드햇 gcc는 static으로 컴파일만 하면 libc를 전부 다 들고 들어가는 바람에 바이너리 크기가 너무 크군요 –;;

레드햇 7.2에서는

프비 5.1에서는

한글 푸티 0.53b.h3

윈도우용 오픈소스 SSH 터미널 [WWW]PuTTY의 다섯번째 한글 지역화 릴리즈인 0.53b.h3을 릴리즈했습니다. :)

이번에는 메시지까지 몽땅 지역화를 했습니다. PuTTY가 원래 다국어지원이 가능한 구조가 아니기에 직접 문자열을 교체하는 방법을 썼는데, 문자열 교체하는 방법으로 gettext처럼 번역할 수 있게 gottext.py란 걸 만들긴 했는데, 소스가 정리되는 대로 이것도 공개하도록 하겠습니다. 므흐흐;;

이번엔 인스톨러 패키지와 zip으로 실행파일만 몽땅 묶인 것, putty.exe, pscp.exe, psftp.exe 셋의 실행파일 압축버전 세가지로 바이너리를 배포합니다. 소스는 CR/LF 문제 때문에 지금 diff를 뜨면 전체가 다 떠져버리고 있어서.. 좀 손봐서 diff만 배포하도록 하겠습니다. 으흐흐

전체 인스톨러는 언인스톨도 간단하고, 레지스트리도 특별히 더럽히는 것이 없으니 되도록이면 전체 인스톨러로 사용해 주세요 :)

Py-RCS를 만들던 중에…

요즘은 대구에 와서 파이썬에서 바로 RCS파일에 접근할 수 있도록 하기 위해 RCS 라이브러리 바인딩을 하고 있습니다. 제대로만 되면, 모인모인이나 ViewCVS 같은 곳에 활용할 수 있기에 정말 좋을텐데요.. 으흐

일단, Paul Eggert가 메인테인하는 RCS는 지나친 추상화와 전역변수의 과도한 사용, 자승자박 형태의 레이어 넘나들기로 인해서, 별도로 떼어 내기 매우 힘든 상태였습니다. 이 점은 CVS의 소스에서도 지적하고 있는데, Paul Eggert도 인정했다는군요.. -O-;

그리고, 그 외의 오픈소스 RCS라이브러리로 있는 것이 CVS와 Perl에 있는 VCS-RCS가 있는데 Perl은 이번 목적이 아니니 제쳐두고, CVS의 RCS Library는 비교적 깨끗한 설계 구조가 괜찮았는데, 여기서는 모두 struct RCSNode로 RCS파일 하나씩을 추상화해서 처리하고 있고, 부분파싱, 전체파싱, 부분쓰기, 전체쓰기 같은 기능을 지원하고, diff를 RCS처럼 외부 호출로 부르는 것이 아니라 직접 GNU diff를 내장 호출해서 부르기 때문에 오버헤드를 최소화했다는 점이 장점입니다.

그런데, 여기서 나타난 문제 -.-;

CVS는 일반적으로 프로그램이 곧 실행되고 끝나는 구조이기 때문에, 프로그램의 곳곳에서 에러가 나는 경우에 그냥 프로그램을 종료하는 것으로 에러를 처리하고 있습니다. 그러나, 이번에 만들 것은 파이썬 바인딩이므로 에러가 났을 때도 단지 익셉션만 내야지 프로그램을 끝내면 큰일 나겠죠;; 그래서 처리한 방법은, CVS가 GNU diff를 내장하기 위해서 사용한 방법인 “호출전에 setjmp하고 exit하는 부분에서 longjmp하기” 무공을 사용해서 처리했습니다. 우선은 그 방법으로 잘 돌아가는 듯 했으나.. 문제는 메모리, 리소스 -_-;; exit하는 판에 메모리까지 해제할 필요가 없으니.. CVS는 그냥 프로그램을 끝냈던 것.. 그러니 longjmp로 그냥 빠져나오면 메모리가 철철철새서, 1분만 열심히 돌리면 200메가짜리 덩치가 됐었습니다. 으흐.. 메모리 문제 뿐이라면 그냥 Boehm GC로 한 번 해결해 보려고 했는데, 파일을 열고 안 닫는 등 몇가지 추가적인 문제가 있어서;; (파일 디스크립터용 gc라도 만들어야할 판;)

그래서 찾은 또 다른 방법은.. RCS Library에서 exit를 호출하는 부분을 모두 패치해버리기인데, 지금 RCS Library에서 exit로 빠져나가는 부분(정확히는 error함수의 첫째 인자에 0아닌 값을 주는 곳)이 grep해보면 무려 109군데나 되어서.. 그 부분을 모두 메모리와 파일디스크립터를 해제하고 빠져나오게 고치려면.. (꾸에엑~~~)

그리고, 이 문제를 해결하더라도 CVS가 GNU diff를 호출하는 부분 역시 메모리와 파일 디스크립터를 질질 흘리고 다니는 문제점은 여전히 있어서, diff를 할 때 마다 에러가 나면 메모리가 새는 문제는 여전하게 됩니다. 앗싸아~; CVS로 큰 디렉토리 커밋하거나 체크아웃할 때 메모리를 엄청 먹는게 사실은 정당하게 먹는 게 아니라 GNU diff호출하는 부분에서 abort대신 longjmp해 버리는 바람에 메모리가 철철 새는 것이었던 것이었던 것입니다;; 무엥~

좋은 아이디어 있는 분은 꼭 알려주세요 @@~

지금까지 구현된 소스는 http://cvs.berlios.de/cgi-bin/viewcvs.cgi/yogurt/py-rcs/ 에 있습니다.

RFC를 PDF로!

IETF RFC 인쇄할 일이 많은 분들 이제 인쇄 걱정 끝!;;

그냥 맨날 RFC 행간 맞춰서 페이지 맞추는게 귀찮아서 RFC2PDF 스크립트를 한번 만들어 봤습니다. 퍼블릭 도메인이니 마음대로 쓰세요~ 참. 이 스크립트를 쓰기 위해서는 [FreshPorts]print/enscript[FreshPorts]print/ghostscript-afpl 이 필요합니다. (gs-GPL도 상관은 없지만~)

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

이런 바보 -.-;;

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

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

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

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

한일동시채팅

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

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

0308-autotranslation.png

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