군집이룬 자료의 비모수 두 표본 차이 검정 (C 구현)

두 표본 집단의 차이가 의미가 있나 알아볼 때 보통 t-검정을 많이 씁니다. t-검정에서는 값의 분포가 정규분포라는 가정이 있어서, 자료의 분포를 모르거나 정규분포로 바꾸기 매우 난감한 경우에는 t-검정을 할 수 없어서 비모수 검정을 사용하는데요, 이쪽으로 가장 인기있는 검정법은 아무래도 Mann-Whitney U test입니다.

어느날 MW-U로 재미나게~♪ 통계를 하다가~ 아니!! 결과가 엄청 편향되어 나오는 것입니다! 비모수라더니!! 마이크로RNA 마이크로어레이로 나온 결과를 분석하고 있었는데, 마이크로RNA가 염색체에서 떼로 몰려 있어서 한 놈이 올라오면 같이 우루루 올라오는 특성이 있다보니 군집이 엄청 큰 놈들에 의해 전체가 흔들려서, 아 무슨 좋은 방법이 없을까! 하다가 군집을 이룬 자료들에 쓸 수 있게 변형한 것 (Rosner and Grove, 1999, Datta and Satten, 2005, Haataja et al., 2009) 들을 발견했습니다. +_+

오.... 다 괜찮아 보이지만, 결국은 코드가 공개돼 있는 Datta와 Satten의 것으 로 해서 일단 결과를 뽑았습니다. 매우 만족스럽군요! ^_^

그런데 문제는 순수 R로 구현되어 있다보니 속도가 엄청나게 느려서, 자료가 별로 크지도 않은데 거의 2시간씩 돌려야 돼서 시험삼아 돌려볼 때도 마음을 크게 먹고 돌려야 해서, 바로바로 결과를 확인하는 재미가 없었습니다.

그래서 쭉 벼르고 있다가, 주말에 여자친구가 기말고사 공부해야 해서, 같이 공부하는 척 하느라 짬이 난 김에 C로 새로 코딩했습니다 (다운로드). R이나 SciPy같은데서 쉽게 쓸 수 있게 외부 의존성을 없애려고, Z-통계치에서 p-value구하는 부분은 빼서 의존성을 줄였습니다. 그냥 libm만 있으면 됩니다. (파이썬에서는 scipy.stats.norm.pdf를 써서 Z에서 p-value를 구할 수 있습니다.) 대략 돌려봤더니 2시간 걸리던게 30초로 줄었군요! 이히히 ^__^* 간단하게 컴파일한 다음에 파이썬에서 쓰려면 이렇게 쓸 수 있습니다~

import ctypes
cranksum = ctypes.cdll.LoadLibrary('./cranksum.so')
crs = cranksum.clustered_rank_sum
crs.restype = ctypes.POINTER(ctypes.c_double * 4)
freecrs = cranksum.free_clustered_rank_sum_result

def clustered_rank_sum(X, grp, cluster):
    N = len(X)
    ret = crs((ctypes.c_double * N)(*X), (ctypes.c_int * N)(*grp),
              (ctypes.c_int * N)(*cluster), N).contents
    r = {'S': ret[0], 'E.S': ret[1], 'Var.S': ret[2], 'z.stat': ret[3]}
    freecrs(ret)
    return r

X = [1,4,2,4,6,7,4,7,8]
grp = [0,1,0,0,1,1,1,0,1]
cluster = [1,1,2,2,2,2,0,0,0]
print clustered_rank_sum(X, grp, cluster)

으음.. R에 붙이는 것은... 아직 잘 몰라서... (나중에..;)

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


정수선형계획법으로 팀 짜기

2006년의 한 워크숍을 진행하면서 팀을 짜는데, 모든 팀이 비슷한 조건을 갖도록 잔기술을 썼던 적이 있습니다. 기준은 평균 실력, 평균 연령, 성비 같은 것들을 모두 비슷하게 맞추고 가능한 다른 곳에서 온 사람들이 섞이도록 했는데요. 이게 손으로 대충해도 되지만 문제는 신청을 한 분이 모두 오는 게 아니라, 몇몇 분들이 빠지거나 지각해서 미리 팀을 짜도 헛수고라 빨리빨리 모두 고려해서 좋은 팀 구성을 해야해서 자동화를 해야 했습니다.

그래서 당시에는 학교에 사이트 라이선스가 있어서 ILOG OPL정수계획(IP)을 했었는데요. 얼마 전에 창준형이 그 소스를 참고하고 싶어 하셔서 찾았는데 소스가 없어졌더군요. 크흐. 그래서 생각난 김에 한 번 오픈소스 선형계획 툴킷인 GLPK용으로 만들어 봤습니다.

모델 코드, 데이터 예제

예제는 누구나 쉽게 데이터 성질을 해석할 수 있도록(;;) 소녀시대, 브라운 아이드 걸스, 원더걸스를 모아놓고 수학캠프를 하는 것을 가정하고(;;;) 최대한 다른 그룹끼리 섞이게, 팀 간 평균 나이, 수학실력, 성비는 비슷하게 하도록 하는데, 수학실력은 몰라서 관련이 있을리는 만무하지만 epg 스타정보에서 인기순위로 대충 매기고, 성비는 모두 여자라 제 맘대로 다수를 남자로 바꿨습니다. ^.~

자 그러면 시험삼아 예제 데이터를 한 번 해 볼까요! 팀은 6개로 나누는 것으로 하고, 우선 제대로 돌아가는지 보기 위해 멤버 수만 같게 맞추는 걸 조건으로 해 보면 결과가..

구성 성비(가상) 평균 나이 평균 EPG 인기
A 제시카 써니 티파니 1:2 21.0 4.33
B 가인 제아 선미 2:1 22.7 2.7
C 태연 윤아 예은 2:1 20.7 5.0
D 수영 서현 선예 2:1 20.0 3.0
E 효연 미료 소희 2:1 22.0 3.0
F 유리 나르샤 유빈 3:0 23.3 3.0

팀 안의 인원 수만 맞지, 어느 하나도 비슷하게 흩어진 게 없습니다. 특히 B, C팀은 여러모로 차이가 많이 나서 비슷한 팀구성 목표에 맞지 않고요, A팀은 소녀시대만 있죠. 그럼 앞에서 언급한 4가지 조건 모두를 맞춰서 최적화한 결과는.. (120초 제한으로 풀어서 최적해는 아님)

구성 성비(가상) 평균 나이 평균 EPG 인기
A 제시카 가인 예은 2:1 21.7 3.7
B 태연 서현 유빈 2:1 20.7 3.7
C 티파니 제아 선미 2:1 22.0 3.7
D 유리 나르샤 소희 2:1 22.0 3.3
E 효연 수영 선예 2:1 20.7 3.3
F 써니 윤아 미료 2:1 22.7 3.3

그런대로 비슷비슷한 팀들로 구성이 됐습니다~ 재미있는 수학시간이 될 것 같네요. -ㅇ-;

사실 이 문제 같은 경우에는 결정하는 변수가 모두 정수라서 (정수가 적을수록 쉽게 구할 수 있음) 사실 전수조사에 주먹구구 좀 넣어서 돌리는 거나 큰 차이는 안 납니다만.. 그래도 재미로~ ^.^;;

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


자주 보는 논문 저자 찾기

저는 논문 관리를 Papers로 하고 있습니다. 순전히 이 프로그램 때문에 맥을 사는 사람이 있을 정도로 정확하게 타게팅을 해서 나온 놈이라 정말 편리합니다. 다만 DevonThink같이 정보를 자동으로 모아서 못 보는 패턴까지 파악하게 해 주는 기능이 많이 아쉬운데요. 그래서 갑자기 자주 보는 저자들의 PubMed 자동 알리미 설정을 한 번 해 볼까하고 저자를 생각해 봤는데, 아무래도 빼먹은 게 있을 것 같아서 Papers에 등록해 놓은 논문 전체에서 가장 많이 쓴 사람들을 찾아봤습니다.

소스코드 - 다행히도 CSV 출력을 지원해서 BibTex 파싱 같은 것은 안 해도 됐고요. 이름은 중간이름을 간혹 생략하는 경우도 있어서 그냥 성과 이름 첫 글자만 가지고 비교를 했습니다. 하는 김에 가장 많이 보는 잡지 이름도 출력했습니다. 결과를 보니까 오! 간단하게 알리미 설정할 사람들 목록이 나왔습니다. :)

제 상위 저자, 잡지는 이렇게 나오는군요.

===== Authors =====
  1   21 David P Bartel
  2   18 Gregory J Hannon
  3   11 Eric C Lai
  4   11 Thomas Tuschl
  5   10 Nikolaus Rajewsky
  6   10 Alexander Stark
  7   10 Alexei A Aravin

===== Journals =====
  1   96 Nature
  2   89 Science
  3   49 Proceedings of the National Academy of Sciences
  4   48 Bioinformatics
  5   40 Cell
  6   39 Nucleic Acids Research
  7   36 Genome Research
  8   36 Nature biotechnology
  9   31 PLoS Computational Biology
 10   30 Nature Genetics

여러분의 Papers 책꽂이는 누가 많이 차지하고 있나요!

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


MacOS X에서 들리는 것 녹음하기

종종 컴퓨터에서 들려주는 소리를 녹음하고 싶을 때가 있습니다. 구체적인 용도를 노골적으로 얘기하기엔 부적절하지만 (ㅎㅎ;;;)... 제가 쓰는 iPod 셔플 1세대 는 국내에 음악을 사기가 매우 어려운 장비인 관계로, 어쩔 수 없지요!

원래는 WireTap이라는 아주 깔끔한 프로그램을 썼는데, 시험사용기간이 다 돼서 이제 녹음하면 친절한 여자가 리듬에 맞춰 "트라이얼 버전으로 녹음한 곡입니다." 이렇게 읽어주더군요. 크흐. 기능에 비해서 가격이 좀 비싼 것 같아서, 그냥 공짜로 할 수 있는 방법을 없나 좀 찾아보니, 역시 있네요!

이 조건을 만족하는 분들은 한 번 시도해 보세요~

  1. 내가 쓰는 MP3 플레이어가 국내 DRM들하고 호환이 잘 안 된다.
  2. 무슨 녹음기 프로그램이 FotoMagico Pro랑 가격이 같고 VMware Fusion보다 거의 두 배 값이라니 말이 되냐!
  3. MacPortsfink 중 하나는 깔아 뒀다.
  4. 삽질은 언제나 즐겁다.

먼저 들리는 걸 녹음하는 기능을 지원하는 사운드 드라이버를 깔아야하는데요, 소리꽃 (Soundflower)이라는 예쁜 이름의 GPL 가상 사운드 장치가 있습니다. 자기가 가짜 사운드 장치로 잡혀서 들어오는 소리를 다른 프로그램에 보내주거나 다른 사운드 장치에 보내주는 일을 합니다. Nicecast라는 맥용 icecast 오디오 방송 프로그램이 내부적으로 Soundflower를 씁니다. Soundflower 원저자가 올린 버전은 최근 MacOS X에서 약간 문제가 있다고 합니다. 다른 사람이 개선한 버전이 따로 배포되고 있습니다. 그냥 드라이버만 설치하면 소리가 안 나서 좀 답답한데, 원본에서 Soundflowerbed라는 관리 프로그램을 따로 받아서 깔면 출력을 내장 사운드 카드로 바꿀 수 있습니다.

Soundflowerbed

이제 스파이 노릇을 하는 드라이버가 마련이 됐으니, 녹음을 하면 됩니다. 관련 프로그램으로 역시 소리 관련된 놀이에는 EsounD가 빠지지 않는군요. 다른 팁 두 개 (macosxhint, heynberg)를 참조해서 요새 버전에서도 되게 좀 고쳐보면 이렇게 하면 되더군요.

% esd -unix &
% sleep 1 # avoid esound operations before esound's done its initialization
% esdrec -s localhost | sox -t raw -s -w -r 44100 -c 2 - -t wav - | lame -h -V 3 --ignore-tag-errors - output.mp3

짠! 이 셸 스크립트를 돌리면 아무 프로그램이나 (vmware를 포함해서~) 들리는 소리가 모두 녹음됩니다. MacPorts에서 esound, sox, lame 을 깔아 둔 상태여야 합니다. sox를 안 쓰고 바로 lame에서 받아보려고 했는데, 옵션을 조절해 봐도 잘 안 되더군요.

기왕 녹음한 것 자르는 것도 자동으로 되면 좋겠지 하고 찾아보니 역시 mp3 잘라 주는 프로그램도 좋은 게 있네요. Mp3splt는 재인코딩 하지 않고도 원하는 범위에서나, 자동으로 조용한 부분을 찾아서 여러 개로 나눠줍니다.

% mp3splt -sf output.mp3

모아서 셸 스크립트 하나로 만들어 두면 편합니다. :)

기왕 하는 김에, 옛날에 많이 하던 윈앰프 방송들처럼 다른 사람들이 들을 수 있게 보내는 것도 쉽게 할 수 있는데요, icecast의 libshout 안에 들어있는 "example" 프로그램을 쓰면 편합니다.

% esdrec -s localhost | sox -t raw -s -w -r 44100 -c 2 - -t wav - | lame --ignore-tag-errors - - | ./example

또 하나 보통 흔히 하는 소리가지고 장난이, 다른 기계를 스피커로 쓰는 AirTunes 같은 기능이 있는데, 공유기 중에 개조해서 사운드카드를 달 수 있는 놈에다가 돌리면 아주 쓸모있겠죠~

# on the Mac desktop computer
% esd -tcp -public

# on a remote machine which is capable of playing sound
% esdcat -s {server address}

사무실에 esd를 띄워두고 새벽 2시에 집에서 접속해서 귀신 소리를 낸다거나... 집에서 영화보거나 WoW하면서 회사로 소리를 들려준다거나... (;;)

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


이어폰 꽂고 몰래 미투데이

종종 뭔가를 읽고 있거나 공부하고 있을 때, 미투가 궁금해서 컴퓨터를 켜고 잠깐 둘러보고 또 아아 이러면 안 돼 하고 끄고 그러는데요. 아흐. 역시 또 켜면 온 동네를 한바퀴 돌고 와서 정작 딴짓만 한참~~

그래서, 문제는 키보드와 모니터다! 하고, 키보드와 모니터가 없을 때도 미투를 할 수 있게 하는 방책을 만들어 봤습니다. "미투에 새 글이 올라오면 읽어주기!"

대충 TTS는 옛날에 보이스웨어라는 회사에서 웹 데모가 있는게 품질이 괜찮았던 것 같고 해서 테스트해보니 그런대로 알아들을 만 하네요. 그래서 간단하게 이렇게 만들어 봤습니다. :)

미투 친구들은 방송듣기 (hyeshik) - 플레이 버튼을 누르세요. 글이 새로 올라올 때만 소리가 나기 때문에 보통은 조용합니다.

구성은 이렇게 됐습니다.

미투 친구들은 방송듣기

다행히도 방송 소스를 보내주는 프로그램인 ices0가 파이썬 스크립팅을 지원해서 쉽게 됐네요~

소스코드는 여기에 올려 뒀습니다. (svn으로 받으세요~)

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


Firefox용 우리말 도우미 1.0.1 업데이트

최근에 신종훈님브루펜시럽님께서 불여우용 우리말 도우미가 돌아가지 않는다는 제보를 해 주셔서 오랜만에 업데이트 했습니다. 제가 사실은 한동안 pdf 플러그인 때문에 사파리만 쓰다 보니 정작 우리말 도우미를 전혀 못 써서 몰랐네요;; -O-;

이번 문제는 신종훈님께서 디버깅을 모두 마치고 패치를 보내주셨기 때문에, 제가 할 일은 따로 없었는데요. 서비스를 제공하는 사이트에서 결과로 body 태그를 2개를 보내는 바람에 생겼던 문제입니다. 여러 방법을 고려해 보다가 그냥 HTML 전체를 innerHTML 로 밀어 넣는 방법을 썼습니다. 좀 거시기하긴 하지만, 앞으로 레이아웃이 계속 바뀔 걸 생각해 보면 별 수가 없네요.. 크흐~

여전히 모래통 안에 있기 때문에, 개발자 사이트에 가입하신 분들만 설치하실 수 있습니다. 우리말 도우미 설치 페이지에서 로그인한 다음에 설치를 눌러 주세요~

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


2009년 공휴일은 과연 특이하게 저주받은 것일까?

블로그에 돌아다녀보면 공포의 2009년 달력에 대한 글들이 많이 올라와 있는데요. 공포다, 저주다! 다들 공휴일이 어떻게 이렇게 토, 일요일과 겹칠 수가 있느냐에 대한 분노(!)를 드러내고 있습니다. ^.^;;

공돌이가 이런 상황을 보면 처음 떠 오르는 것은 역시 "과연 p-value가 얼마나 되길래 저렇게 호들갑이야?" 므흐흐;;; 그래서 음력 계산이 간단하게 가능한 1882년부터 2050년까지 2008년에 시행 중인 공휴일을 기준으로 해서 얼마나 공휴일이 겹치는지 봤습니다. 물론 시행 당시의 공휴일로 계산할 수도 있겠지만, 이번에는 다른 변인은 빼고 순수하게 공휴일끼리 겹치는 것이 이정도로 일어나는게 특이한 것인지 보는 것만 하기 위해서!

그런데 마침 찾아보니 토끼군님이 만들어 두신 양음력 변환 모듈이 있어서 생각보다 훨씬 쉽게 일이 되었네요. 2009년이 이렇게 떠들썩 한 것은 추석과 개천절이 겹친 것도 원인 중 하나라서, 토/일이 아닌 공휴일 수가 며칠이나 되는지로 계산했습니다. 2009년은 신년, 설날 2일, 어린이날, 추석 1일, 크리스마스 해서 6일 밖에 안 됩니다. 자 그렇다면 1882년부터 2050년까지 중에서 평일이 공휴일이 되는 날 수의 분포는 어떻게 될까요~

1882~2050년 월~금 공휴일 횟수 분포

2009년이 6일인데, 6일이 무려 1882년부터 2050년 사이에 딱 2년 밖에 없습니다. p-value로는 0.012정도 되는데, 샘플이 169밖에 안 되는 데서 0.012라면 제법 재수가 없는 셈입니다. 쉽게 말해서 85년에 한 번 정도 일어나는 일인 것 +_+ 사람들이 저주받은 해 운운할 만하군요~ 2009년 말고는 1914년이니까 공휴일 계산에서는 의미없는 해입니다. 그러니까 2050년까지는 다시는 이런 일은 없을 거라는거죠. -ㅇ-;

위 분포를 보면 보통 11일 근처에서 많이 걸리는데 공휴일이 기가 막히게 흩어져서 무려 13일이나 쉬는 해도 3년이나 됐는데, 1960, 2031, 2042년입니다.. 까마득하네요. ㅡㅡ;

자 그럼 최근 연도들이나 머지않은 연도들에서 토/일을 제외한 공휴일 수 (2008년 시행 공휴일 기준)가 어떻게 변하는지 한 번 살펴봅시다.

2003~2029년 월~금 공휴일 횟수 변화 (2008년 공휴일 기준)

2009년만 6일로 푹 떨어진 것 외에는 대체로 9일~11일 사이에서 안정적이군요. 그런데 2010년도 8일로 그다지 많은 편은 아니라는.. 2년 연속으로 공휴일이 적네요. 크흐. 2001년이 공휴일이 상당히 많았다고 나와 있는데, 2001년은 사실 놀았던 기억밖에 없어서 일년 내내 공휴일이었던 것 같은 느낌이 -

자 통계적으로도 2009년은 공휴일이 엄청 겹친 무서운 해입니다. 힘내서 연차 씁시다. -.-b

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


비슷한 글에는 비슷한 친구들이 댓글을 달까?

인터넷에서 글을 쓰다보면 "왠지 이 글에는 누구 누구가 댓글을 달겠구나."하고 느낌이 강하게 올 때가 있습니다. 글 올리고 나서 열심히 10분마다 리프레시 하다가 (;;;) 누가 댓글을 딱 달면 "역시 낚였구나!" 하기도 하고.. -ㅇ-; 그렇다면 댓글을 누가 썼는지만 봐도 대략 글 내용을 추정할 수도 있지 않을까요? 그래서 오늘은 미투데이에서 댓글 쓴 친구 목록만 가지고 비슷한 글끼리 묶고 각 친구들의 성향을 분석해 봤습니다. (이제 점점 무슨 인터넷통계 블로그로 변신을 --;)

분석대상은 여러가지 요인들을 고려할 볼 겨를도 없이 그냥 한국 IT블로그계의 여왕벌 이지님의 최근 2달 글로 했습니다. :) (미리 이지님과 댓글을 쓰신 친구분들께 양해를 구하지 못한 점 죄송합니다~)

분석 과정

우선 가설은 "비슷한 글에는 비슷한 친구들이 댓글을 단다."로 세웠습니다. 그 후의 분석과정은 생략하고 Orange의 플로우 그림으로 대체합니다. 최초 입력은 친구가 각각 해당 글에 댓글을 썼는지 여부를 0/1로 표시한 큰 행렬에서 몇 종류의 노이즈를 제거했습니다.

댓글 경향 분석 과정 (Orange)

비슷한 댓글을 다는 친구 묶음

이렇게 해서 나온 결과로 각 친구들끼리 얼마나 비슷한 글에 댓글을 달고 있는지를 보여주는 다음 그림이 나왔습니다.

비슷한 댓글을 다는 친구 클러스터 큰 그림

비슷한 경향의 친구들끼리 같은 클러스터(색깔)로 묶였는데, 파란색(1) 묶음은 다른 묶음에 비해 다양한 친구들이 묶여있고, 다른 묶음들은 각기 독특한 경향이 있습니다. 위 그림은 7가지 글에서 댓글을 달았는지 여부를 가지고 각 친구들 경향을 눈으로 잘 보이게 그림으로 그린 것인데요. 각 글(회색점, 글 내용은 흰색 네모)에 댓글을 쓴 경우에 점에 가깝게 표시되어 있습니다. 14, 39번 글에 파란색 친구들이 많이 몰려있고, 83번 글에는 빨간색 친구들이 많이 몰려 있습니다.

파란색 친구들은 대체로 누구나 쉽게 글을 달 수 있는 글에 댓글을 단 경우가 많았고요, 빨간색, 초록색 친구들은 각기 독특한 성향이 있었는데, 윗 그림에서는 잘 나타나지는 않았지만, 빨간색은 학술적인 글이 많이 포함되어 있었고, 초록색은 친한 친구들이 댓글을 달 만한 글들이 많았던 것 같네요.

비슷한 친구들이 댓글을 다는 글들의 묶음

실제 위에서 나타난 친구묶음들의 분포를 기준으로 다시 글의 분포를 구성해 보면

비슷한 친구들이 댓글을 다는 기준으로 글을 분류

그림이 글을 표시하기는 좀 빽빽해서 각 친구묶음들이 선호하는 글의 대표적인 사례 몇 가지를 뽑으면 이렇습니다. (전체 텍스트 목록)

친구묶음 1(파란색)이 좋아하는 글

친구묶음1친구묶음2친구묶음3친구묶음4 댓글수 내용
0.640.200.250.00 44 <다찌마와 리> 시사회 티켓 득템~♬ (근데 너무 바빠서 갈 수 있을지…)
0.430.200.000.00 87 (삼계탕 말고) 보양식으로 무엇이 있나요?! 몸이 좀 허해진 것 같아서… 내일 좀 챙겨먹으려구요.
0.360.200.000.00 27 (집에서는 커피 금지령이 내린 관계로) 밤샘 작업을 위해 할 수 없이 커피를 사왔는데, 이렇게 맛이 없을 수가… 야식 배달 전문점 말고, 밤샘 커피 배달 전문점이 있다면 얼마나 좋을까…
0.140.000.000.00 46 이제 미투사무실 왔어요~♥

친구묶음 2(빨간색)이 좋아하는 글

친구묶음1친구묶음2친구묶음3친구묶음4 댓글수 내용
0.00 1.000.000.17 40 미투데이 사례로 논문 쓰려니 힘들어요. 왜냐구요?! 자료가 너무 없어~ 조만간 미투 사무실 습격해야겠다~ 요구하는 정보 다 내놔라!
0.14 0.400.000.00 33 어떤 논문에서, “(…) frequent IM users tend to exchange shorter messages over a longer period of time, and they are more likely to engage in multitasking.”
0.07 0.400.000.17 24 어떤 논문을 보니, dodgeball 창업자는 자사 서비스에 대해 “facilitating serendipity”라고 말했더라. 이 대목에서 난 너무 웃었다. 이쯤되면, 만박 님도 한말씀 하셔야죠? 미투에 커플이 몇인데! ^-^
0.07 0.400.250.00 21 한국언론재단의 2008년도 수용자 의식조사에 따르면, 매체 영향력 및 매체신뢰도 조사 결과가… 1위 KBS, 2위 MBC, 3위 NAVER라고. (오늘 각각 1위부터 10위까지 봤는데 좀 놀라웠어요. 조사를 어떻게 했는지…)

친구묶음 3(초록색)이 좋아하는 글

친구묶음1친구묶음2친구묶음3친구묶음4 댓글수 내용
0.140.00 0.750.17 48 어제 득템한 노트북~ 잘되네~♬
0.070.20 0.750.00 22 무언가를 반드시 쟁취하고자 하는 욕망, 이라는 것이 없는 사람.
0.140.20 0.750.00 37 A Grammar of the Multitude. 나에게는 이 책이 두 권 있다. 나머지 한 권으로 무엇을 하면 좋을까~?!
0.070.00 0.500.00 9 시간은 왜 항상 부족할까…

친구묶음 4(주황색)이 좋아하는 글

친구묶음1친구묶음2친구묶음3친구묶음4 댓글수 내용
0.000.000.00 0.50 17 이 책을 편의점(!)에서 파는 것을 보고, “이 정도로 베스 트셀러야?!”하며 경악했던 적이 있는데. 정말 많이 팔렸구나. 울 엄마 말씀으로는, 외숙 모들도 다 읽으셨단다. (엄마도 요즘 읽고 계신다…)
0.000.000.00 0.50 19 1976년 생인 이 책의 저자는 도쿄대학교 대학원 박사과정을 “수료 후 자퇴”했다. 꾸준히 논문과 저서를 발표하고 있고, 박사논문을 포기할 상황도 아니고, 후속 연구도 정했고, 다른 직장으로 외도한 적도 없고, 지도교수와의 관계도 좋은데… 왜?!
0.570.000.50 0.83 68 2년 동안 함께 만든 책인데, <문화관광부 우수학술도서>로 선정되었어요!!! 글 쓰고, 편집하고, 섭외하고… 열심히 뛴 보람이 있구나~ㅠ_ㅜ ( “보람”이라는 단어는 이럴 때 쓰는 건가봐~)
0.140.000.25 0.50 24 이 책의 원제는 [불안형 내셔널리즘의 시대]. 그런데 역서 제목이 이렇게 뽑혀버려서~ 마치 가벼운(!) 시사평론집처럼 느껴진다. (사실은 그렇지 않 은데~ 한번쯤 읽어봐도 괜찮은 책인데~ 주위에서 이 책 구입한 사람 나밖에 없어~ㅠ_ㅜ)

각 친구묶음의 각 글에 대한 경향

위 결과에서 보면, 2, 4 묶음은 비교적 뚜렷한 경향이 있는데, 1과 3은 아주 눈에 띄지는 않습니다. 그래서, 각 친구묶음이 다른 친구들이 더 좋아하는 글들에도 댓글을 쓰는 경향이 얼마나 되는지 봤습니다. 즉, 자기 취향의 글에 대한 일편단심 충성도(?)라고 볼 수도 있겠죠.

친구묶음들이 각 다른 취향의 글에 댓글을 다는 경향

이렇게 보면 뚜렷하게, 첫번째 묶음 (파란색)은 뚜렷한 경향없이 평균적으로 모든 취향의 글에 댓글을 달고, 다른 친구묶음의 친구들은 뚜렷한 취향을 가지고 "책 관련 된 글" 또는 "행사/학술 관련된 글"에만 댓글을 달고 있다는 것을 볼 수 있습니다. (그래프의 수치는 해당 친구묶음 내의 관련 글묶음 댓글 빈도 %) 그리고, 또 특이한 것은 파란색과 초록색은 모두 일상생활 또는 사적인 감정에 대한 글들 취향이었는데, 초록색은 누구나 댓글을 쉽게 다는 파란색 취향에는 오히려 댓글을 더 적게 달았군요. ^^;

정리

대략적으로 가설에서 세웠던 것대로, 적지 않은 친구들이 뚜렷한 자기 취향을 갖고 관심 글에만 댓글을 달고 있다는 것을 확인할 수 있었고요, 이를 토대로 댓글을 단 친구의 구성만 봐도 대략적인 글 내용이나 성향을 파악할 수 있다는 것을 알게 되었습니다.

사실 뭐 누구나 이미 감으로 알고 있는 것이지만.. 그냥... 진짜 그런지 확인해 보고 싶었어요 ^^;;

덧붙임: 여기서는 k-means clustering과 빈도수 샘플링 같은 간단한 것들만 사용했는데, 실제로 이 모델을 제대로 묘사하려면 MCMC EM같은 숨은 확률을 반영할 수 있는 도구를 써야할 것 같습니다.

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


플레임에서 승리하는 자의 선택 [우리말 도우미], 지뢰밭용 업데이트

우리말 도우미

예전에 올렸던 우리말 도우미를 한동안 잊고 있었는데 불여우 3.0 지뢰밭 출시가 임박해서 많은 분이 요청해 주셔서 3.0 용으로 갱신했습니다.

우리말 도우미 1.0 (불여우 부가 기능) 설치

3.0 지원 외에는 아주 사소한 레이아웃 관련 변경이 몇 개 있었지만 별로 눈에 안 띌 것 같네요 -ㅇ-;

아직 모래통 안에 들어 있어서 쉽게 설치가 안 되고, 사이트에 로그인해야지만 됩니다. 므흐흐.. 언젠가는 모래통을 탈출하여 쉽게 설치할 수 있는 날이 오겠죠. -ㅇ-;

이번 업데이트에 큰 도움을 주신 신종훈님께 감사드립니다.

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


"내 이름 어때" 만든 이야기~

며칠 전에 올렸던 "내 이름 어때?"를 만들면서 썼던 여러 가지 기술적인 부분에 대해서 간단하게 정리해 봅니다. 물론 django로 만들었습니다! 이히히

Django 템플릿에서 한글 조사 처리

이름 뒤에 은/는 이/가 같은 것들을 제대로 붙이려면 아무래도 템플릿에서 처리를 해 줘야하는데, django에서는 애플리케이션에서 직접 템플릿 태그나 필터를 정의하는 걸 매우 장려하는 분위기라서 "필터"를 따로 정의해서 처리했습니다.

템플릿에서 이렇게 쓰려고 하는 부분이 있다면:

이름을 뒤집으면 {{ rev_last_name|attach_korean_suffix:"이가" }}
되어서..

필터 정의를 이렇게 해 줬습니다.

@register.filter
def attach_korean_suffix(string, suffixes):
    if hangul.ishangul(string[-1]) and hangul.split(string[-1])[2]:
        return suffixes[0]
    else:
        return suffixes[1:]

마지막 줄에서 1:로 굳이 잡아준 이유는 이름 뒤의 ~이 처럼 받침이 없으면 끝에 안 붙는 경우도 처리해 주려고요..

추세 해석

이름의 인기가 늘고 있는지 줄어드는지를 글자로 판단해서 표현해 주기 위해서, 간단한 계산식을 사용했습니다. 우선 원 데이터 자체는 샘플수가 적어서 노이즈가 많기 때문에 보통 많이 쓰이는 9개 윈도우 평균으로 했고, 이렇게 하면 18개 포인트가 나와서 세 부분으로 나눠서 앞 중간 뒤의 평균을 다시 구해서 3가지 값이 나왔습니다. 그래서 눈으로 딱 보면 값이 계속 증가하는지, 올라갔다 내려갔다 하는지를 볼 수 있는데요, 그냥 값으로 볼 수는 없으니 앞/중간 과 중간/뒤의 각각의 변동폭을 0에서 1사이로 정량화해서 봤습니다. 변동폭은 이름마다 절대량이 다르기 때문에 상대량으로 비교해야해서 아래와 같은 식으로 썼습니다.

\delta = {{\arctan {\log {N_B \over N_A}}} \over \pi} + 0.5

보기엔 약간 쓸데없이 복잡하긴 하지만, 그냥 상대비율을 (0, 1) 사이로 넣어주는 일 밖에 안 합니다;;;

이렇게 나온 값으로 앞 뒤가 모두 (0.4, 0.6) 구간에 들어오면 "꾸준한 추세입니다."라고 하거나, 앞-중간은 (0.0, 0.3), 중간-뒤는 (0.0, 0.5) 구간에 들어가면 앞 반쪽에서 감소세가 강하고 뒷 반쪽에서 감소세가 둔하다는 의미이므로 "확 줄어들다가 잦아드는 추세입니다."라고 보여주는 식으로 주된 패턴들을 "대충" 느낌으로 나열하는 방법으로 코딩했습니다. 크흐;

구글 차트

이름 전체의 성별 성향이나 이름의 시대적 경향, 이름 글자의 시대적 경향을 보이는 부분에서 구글 차트를 불러서 사용했습니다. 구글 차트는 직접 URL을 코딩하는 방법은 아니고, pygooglechart를 사용했는데요, 이게 의외로 그런대로 잘 만들어서 웬만한 기능은 불편없이 쓸 수 있게 돼 있더군요. :)

다만, 하나 기술적인 문제가 있었던 부분은 이름 글자의 시대적 경향 같은 경우에는 글자마다 실수값 18개씩(경향)이 저장돼야 하기 때문에, 이걸 그냥 저장하는 건 여러모로 번거롭고 해서 구글 차트 API에서 쓰는 0~4095 사이 인코딩하는 방법으로 썼습니다. (base64와 거의 같은 방법입니다.) 그래서, 저장은 바로 구글 차트 API URL에 쓰면 되는 형태가 돼서 다시 불러올 때 매우 빠르게 불러올 수 있긴 한데, 문제는 한 이름 안에 이름 앞자와 뒷자의 경향을 모두 보여줘야하기 때문에 둘의 그래프 크기를 제대로 조절해 주지 않으면 각 글자의 크기가 잘못 나온다는 점이었습니다.

그래서 결국 선택한 방법은 보여줄 때 앞자 뒷자 인코딩된 값을 다시 풀어서 큰 쪽의 스케일로 맞춘 다음에 다시 인코딩하는 -.,-; 약간 노가다성 방법을 썼습니다. 역시 이런 부분은 numpy의 array의 도움을 많이 받을 수 있었습니다.

확장코드 인코딩/디코딩 부분을 따로 떼서 쓸 일이 좀 있을 것 같아서..

encmap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'
decmap = [(encmap.index(chr(c)) if chr(c) in encmap else 0) for c in range(128)]
def decode_ggenc(encoded):
    return [decmap[ord(hi)] * 64 + decmap[ord(lo)]
            for hi, lo in zip(encoded[::2], encoded[1::2])]
def encode_ggenc(data):
    return ''.join(encmap[int(v//64)]+encmap[v%64] for v in data)

통계치가 적은 이름의 성별 추정

역시 통계 샘플 크기가 작아서 주요 이름들을 빼고는 제대로 된 통계치를 낼 수 없어서 주요 이름들의 성별 경향으로 학습한 걸로 예측하는 부분이 필요했습니다. 이번에는 아예 사용된 적 없는 글자까지도 어떻게 좀 해 보려고 통계치에 전혀 의존하지 않고 그냥 자소별로 분해해서 이름만 피처로 사용하기로 했습니다. 그래서 보통 SVM을 쓰는 것이 여러모로 대세이기는 하지만, 카테고리성(이산) 피처값에 매우 유리한 random forest을 썼습니다. (물론 제가 수학을 워낙 못하는 것도 큰 요인으로;;;;)

Random forest는 아무래도 쓸 수 있는 구현이 적다는 게 큰 문제인데요. 파이썬에서 쓸 수 있는 orange를 쓰면 정말 좋겠지만, 아쉽게도 이 구현은 리그레션은 지원하지 않고요. Y.Y R용 패키지인 partyrandomForest 중에 선택해야하는데, party를 먼저 했으나 메모리 3기가를 먹더니 죽었고 (-_-) randomForest는 안정적으로 대략 200메가 정도 먹고 그런대로 쓸 만한 결과를 줬습니다. :)

학습 기법 측면에서는 남자 샘플이 2배 정도 되기 때문에 편향 문제가 있어서 샘플링 조절을 좀 해야했는데요, 그냥 복잡한 것 쓰지 않고 대략 0.3 밑을 반 다운 샘플링하니까 전체적으로 분포가 윗쪽하고 아랫쪽이 그런대로 맞았습니다. 중성적인 이름이 수가 훨씬 적은 것도 또한 중성적 이름 쪽에서 오차를 많이 발생시킬 수 있는 요인이 될 수 있는데, 이쪽에서 오버샘플링을 하려고 하다가 "될 거 같으면 대충해도 돼야 하는거지" 하는 교수님 말씀이 귓가를 스치며 놀이인데 대충하자 하고 -ㅇ-;; 크흐; 그래서 결국 10-fold cross validation으로 평균 피어슨 연관성이 0.97 정도 나왔습니다. (만... 역시 사람 느낌하고 좀 다른 사례가 개별적으로는 제법 많이 발견되긴 하네요;)

페이지 내용 캐시

서비스를 공개한 다음 날 점심시간이 좀 지나고 나서는 접속이 폭주해서, 실시간 계산이 상당히 있었던 구현 특성상 앞으로 어떻게 될 지 참 고민이 있었는데요; 그래서 마침 전혀 필요없겠다 싶어서 꺼놨던 django의 캐시 프레임워크를 살려서 해 봤습니다. 백엔드를 선택할 수 있는데, 역시 제일 잘 나가는 memcached를 썼습니다. 이거 소문대로 깔끔하고 잘 돌아가네요. ^_^;

Django는 다행히도 템플릿에서 일부만 특정 변수에 따라서 캐시하는 기능이 있어서 이름에 따라 바뀌는 부분, 성에 따라 바뀌는 부분을 따로 따로 캐시하도록 3조각으로 따로 캐시해서 생각보다 훨씬 간단하게 쉽게 캐시로 넣었고요, 지금은 CPU부하가 전보다 같은 요청에서 거의 1/10로 줄어들었습니다! 이히히.

다른 사소한 것들..

몇 분께서 물어보셨던 게 자료처리나 통계처리는 어떤 걸 썼느냐가 있는데, 특별히 쓴 것은 없구요, 파이썬 하나면 다 해결됩니다. -ㅇ-; 물론 numpy, matplotlib도 아주 큰 도움이 됐습니다. collections.defaultdict를 전에는 그렇게 자주 쓰지는 않았는데, 이번에 좀 과격하게 3~4 단계 쑥쑥 defaultdict를 겹쳐서도 써 봤더니 pickle이 잘 안 되는 문제만 빼고는, 코드를 아주 많이 줄여준다는 점에서 아주 사랑스러웠습니다.

후속편으로는 이번에 들어온 로그를 한 번 분석해 보려고 하고 있습니다. ^^;

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


내 이름 어때? -- 한국인의 이름 2탄!

전에 올렸던 한국인의 이름 통계를 많은 분들이 관심있게 봐 주셔서, 본인 이름은 얼마나 많은가요, 얼마나 중성적인가요 같은 질문을 많이 받았습니다. 그래서 직접 확인하실 수 있게 통계에서 나온 여러 자료들을 모아서 한 페이지에 보이도록 서비스를 만들어 봤습니다.

내 이름 어때!

대부분은 이전 글에서 소개해 드렸던 내용이고요, 이번에 추가된 부분은 통계에서 자료가 충분하지 않을 때 자동으로 추정하는 것과 이름이나 글자가 시대가 바뀌면서 어떤 빈도 변화가 있는지 그래프로 나타내는 부분입니다.

자동 성별 추정 부분은 통계 수치없이도 단순하게 바로 이름에서 예측할 수 있게 하기 위해 피처는 그냥 이름을 자소로 쪼갰고, random forest를 사용했습니다. (옵션은 리그레션, 500그루, mtry=3, R randomForest 패키지 사용) 10배 교차검정에서 피어슨 연관성이 0.97이 나와서 대략 결과는 좋긴 한데, 실제로 보다 보면 얼토당토않은 결과가 심심찮게 나옵니다;; 나중에 제대로 쓰려면 글자 단위 통계도 피처로 좀 추가해야할 것 같네요.

그리고, 역시 이름도 시대별 흐름이 있는데요. 예를 들어 미자, 혜자, 경자 같이 -자로 끝나는 이름은 60년대생까지 매우 흔한 여자 이름이었지만 70년대부터 급속히 사라지는데 그래프로 직접 이런 경향을 확인할 수 있도록 했습니다. 데이터셋이 그렇게 크지 않기 때문에 그냥 생데이터를 쓰지는 못하고, 9년 단위 슬라이딩 윈도우 평균으로 했기 때문에 갑자기 튀는 최고점 같은 것은 좀 무시되었습니다. (이 분석을 위해 "생년"만 추가로 데이터를 받아서 보충했습니다.)

자 그럼 본인 이름을 넣어보세요~ ----> 내 이름 어때! <----

댓글 23 개 | 트랙백 7 개 (보낼곳) | 태그 happyhacking life


채팅할 때 많이 쓰는 한글

갑자기 궁금해서 한 번 조사해 봤습니다. ;; 채팅할 때 주로 쓰는 글자는 몇 개나 되고 전혀 쓰이지 않는 KS X 1001 완성형 글자도 있을까!

그래서 대상은 2004년 12월 27일부터 오늘까지 HanIRC의 #perky, #tokigun 등 제가 들어갔던 채널들의 채팅 로그를 가지고 분석해 봤습니다. 분석 대상 한글 글자 수는 모두 54,723,296 글자였습니다. (많이도 떠들었다;;) 가장 많이 쓰이는 글자 20개는 다음과 같이 나왔군요.

누적비율 글자수 글자
  2.99% 1636236 이
  4.87% 1026920 는
  6.70%  999776 요
  8.44%  951349 군
 10.18%  948018 다
 11.78%  875232 고
 13.37%  872547 가
 14.94%  858935 아
 16.49%  842846 나
 17.92%  784908 하
 19.27%  735143 에
 20.47%  657522 리
 21.65%  644259 어
 22.81%  638026 사
 23.96%  627557 지
 25.06%  597604 서
 26.14%  594294 로
 27.17%  560550 그
 28.18%  554750 도
 29.20%  553821 기

~는 ~군요. ~이 ~고.. 역시 조사가 압도적이네요. "하"나 "아"는 조사가 아닌데도 명사나 기타 다른 곳에서 많이 쓰인 모양입니다. 저걸로 뭔가 문장을 만들 수도 있을 것 같았는데 해 봐도 잘 안 돼서 일단 ;;

반면에 한 번도 안 쓰인 KS X 1001 완성형 글자들도 몇 개 있었는데 다음과 같습니다.

흽횝혤퓜푭폘틥틜튱튁툿턺쵭쵬촁쳰쬈쫬쫠쩽쥣줆죌좼졺욀얩씐쐽쐼쐴썲쇘쇔쇌솖섕섐섈섄뺙빎붊묑묍묄묀룅뢨롑띳띕뙨똴덖늚뇝뇜뇔꾈꾄괩괆

저 글자들을 활용해서 아이디를 만들면 아이디 겹칠 일은 없겠네요~ \o/

그럼 확장완성형 중에 무슨 글자가 많이 쓰였을까 생각해 보면, "뷁", "횽" 같은 게 압도적으로 앞에 나올 것 같은데요~

누적비율 글자수 글자
 12.36%    7108 뤂  ☆
 18.59%    3585 횽  ◎
 22.52%    2263 떄  ◆
 26.36%    2205 뷁  ◎
 29.79%    1977 됬  ◆
 32.74%    1696 봣  ◆
 35.69%    1694 햏  ◎
 37.50%    1041 쵝  ◎
 38.36%     496 썻  ◆
 39.18%     470 뵬  ☆
 39.96%     452 핳  ◎
 40.71%     432 졋  ◆
 41.42%     408 췟  ◎
 42.06%     365 쩄  ◆
 42.67%     355 뺴  ◆
 43.28%     349 휏  ◎
 43.88%     343 뮹  ☆
 44.45%     330 앜  ◎
 44.99%     310 훍  ◎
 45.52%     306 젋  ☆

대충 경향을 보면 닉네임을 줄여서 부르는 것(☆)이 4개, 독립적인 인터넷 언어(◎)가 9개, 오타(◆)가 7개로, 생각보다 닉네임 줄여서 부르는 것의 비율도 꽤 되고, 오타도 다양하군요~

그래서, 과연 자주 쓰는 글자들이 얼마나 비중을 차지하는지 살펴보면

위의 파란 곡선은 완성형, 빨간 곡선은 확장완성형 글자이고, 세로축은 비중이 많은 순서로 정렬한 누적 글자수 입니다. 파란 곡선에 비해 빨간게 훨씬 가파른게, 확장완성형에만 있는 글자들이 일부에 대한 편중이 심하다는 걸 볼 수 있고요, 당연히 KS X 1001 완성형 글자들이 편중이 좀 덜 되어 있는게 영 발로 만든 건 아니구나 뻔한 사실을 한 번 확인해 봅니다 --;

몇 글자만 있으면 90%를 쓸 수 있을까도 보통 많이 하는 조사인데요, 완성형은 90%까지 351자(최~복 사이), 95%까지 511자(효~착 사이), 99%까지 903자(깜~벼 사이) 입니다. 아무래도 자주 쓰이는 글자를 뽑아놓은 문자셋이라서 생각보다 골고루 쓰이고 있네요.

혹시나 이 자료를 어디에 쓰실 분이 있을까봐 조사 결과를 공개합니다. --;;;;; (KS X 1001 완성형, 확장완성형 확장한글)

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


과학저널 레몬펜으로 같이 읽기

돌아다니다가 레몬펜이라는 서비스가 있길래 보고 호오 신기하다 생각하던 중, 저널 사이트에 붙여놓고 온라인 저널클럽 하는 것 비슷하게도 되지 않을까 생각나서, 한 번 그리스몽키 스크립트를 만들어 봤습니다. 같이 읽으면서 메모도 쓰고 재미있을 것 같아서~

설치하시려면 그리스몽키를 먼저 설치하신 다음에 >>여기<<를 클릭하세요~

등록해 놓은 사이트는 다음과 같습니다.

  • Nature와 NPG 발행 저널 전체
  • Science
  • Cell, Structure, Molecular Cell
  • Elsevier (Science Direct) 발행 저널 전체
  • Bioinformatics, Protein Engineering, Nucleic Acids Research
  • PLoS Biology, PLoS Computational Biology, PLoS Genetics, PLoS Medicine
  • BMC 발행 저널 중 자체 도메인 쓰는 것 빼고 전체
  • Genome Research, RNA, Genes & Development
  • JBC, JMB, Proteins
  • PNAS

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


웹페이지에서 자동으로 RSS 만들기

지난 달에 봤던 뮤지컬 《헤어스프레이》가 너무 좋아서 마지막 회차 공연 때 또 보려고 3차 티켓 오픈 소식을 들으려고 웹페이지를 감시하고 있었습니다. 아 그런데 예약페이지를 Update Scanner로 감시해 놓으니까, 정작 보고싶은 예약가능일 변경은 잘 안 보이고, 사이트 전체 예약순위 같은 것만 보이고 그래서, 아 이럴 때 RSS가 있었으면! 하고 무척 답답했었는데요. 그래서 결국 뭔가 다른 방법이 없을까 찾다가 인터파크 티켓 공지사항에 티켓오픈 며칠 전에 공지가 올라온다는 것을 알고 저걸 변경사항 보려니 그것도 좀 그래서 예전에 까나리님 블로그에서 본 적 있는 RSS 자동 만들어주기 사이트가 생각났습니다.

게시판같은 것을 RSS로 자동으로 만들어 주는 feedity.com을 써 봤는데, 치명적인 문제가 인터파크에서는 공지사항을 <제목> 이렇게 <>로 감싸서 올리는 와중 < >를 그냥 써버려서 태그로 인식되어 feedity에서 다 잘라버리는 것입니다. 그래서 결국 제목에서 중요한 부분만 다 없어지는 효과가;; 그리고 본문 요약이 잘 안 되는지 글 내용도 이렇게 다 빈걸로 올라오고 광고만 떨렁 올라오더군요.

그래서 아 이거 재미있겠다 갑자기 호기심이 생겨서 직접 만들어보자 하고 마음을 먹었습니다. -ㅇ-; 우선 요구사항은

  • <제목> 같이 개떡같이 HTML을 써도 대충 알아듣자
  • 본문 요약을 어떻게든 만들어서 넣자. (요렇게)
  • 레이아웃이 바뀌어도 동작할 수 있게 DOM이나 HTML 레이아웃은 생각하지 말자.

로 정하고 대략적으로 실행 단계는 이렇게 정했습니다. (아마도 대부분의 자동 RSS 사이트들이 이렇게 동작하지 않을까 예상 -ㅇ-)

  • 게시판 목록이 있는 HTML을 들고 와서 링크를 모두 뽑아낸다.
  • 뽑아낸 링크들을 자기들끼리 비교해서 서로 간의 (차이) 거리를 잼. 예를 들어 숫자 1개 차이는 1점, 알파벳 1개 차이는 2점
  • 링크 간의 거리 행렬(distance matrix)을 가지고 계층적 군집화(hierarchical clustering)를 해서 떼로 만듦.
  • 여러 군집 간에서 적당한 기준으로 "게시판 글 목록" 군집을 골라 냄. (여기서는 군집 내 최대 거리, 군집의 크기, 군집 내 링크들의 본문 길이를 기준으로)
  • 골라낸 군집의 링크들의 문서를 모두 가져옴
  • 링크를 2개씩 짝지어서 HTML을 비교해서 차이점이 각 링크의 본문이라고 가정해서 뽑아냄
  • 뽑아낸 본문들과 제목 등을 이용해서 RSS 생성

그렇게 해서 autorss라는 이름으로 하나 만들었습니다. 처음엔 간단할 것 같아서 스크립트 파일 1개로 50줄 안에 끝내야지 했는데, 하다보니 모듈 import가 17개인 거대 스크립트가 돼 버렸네요 --;;

생각보다 잘 돌아네요.. ^.^;; 이제 편하게 티켓 오픈 소식을;;; 다른 RSS 제공해 주지 않는 답답한 사이트를 보고 싶을 때 한번 적용해보세요~ (아직 그렇게 소스가 일반화돼 있지 않아서 좀 고칠 부분이 많을 수도 있습니다. 다른 사이트에는 적용해 보니까 DC인사이드 갤러리에도 그런대로 잘 동작하네요. :)

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


제주대 "오픈소스 개발 방법론"

지금은 제주도에 와 있습니다. ^^; 처음으로 제주도에 왔는데 나무도 다르고 바닷가 바위들도 희한하고 정말 신기하네요 ㅎㅎ; 올해 처음 개설된 제주대 컴퓨터공학전공의 오픈소스 개발 방법론 과목에 초청받아 버그, 패치, 스타일에 대해서 얘기를 하고 왔습니다.

전반적으로 작년에 했던 KLDP 10주년 행사의 오픈소스 프로젝트에 참여하기 내용과 비슷하게 실제 오픈소스 프로젝트에서 일어나는 여러 과정에 대해서 다루었는데, 수업에서 쓸 수 있게 좀 정상적인 포맷으로 바꿨습니다. [강의자료 받기] 저작권이 있는 그림들은 pdf에서 제거해서 좀 썰렁한 것은 양해 바랍니다;

제주대에는 처음 들어가면서도 우람한 나무들이 엄청나게 심겨있는 걸 보고 깜짝 놀랐는데, 학생들의 열의도 정말 대단했습니다. 수업시간에 그렇게 열심히 듣는 학생들을 본 건 학부, 대학원 다닌 경험 합해도 없었던 것 같아요. 거의 다른학교들에서 2000년대 들어서 순식간에 사라져버린 공대 학생들의 순수한 열정을 다시 볼 수 있어서 정말 감동적이었습니다. (나중에 들은 말로는 열의있는 학생들만 듣는 과목이어서 그랬을지도 모른다더군요 ^^;) 졸업한 청강생도 있고 출석률도 늦게 수강신청한 경우를 제외하고는 전체 인원이 25명인데도 100%! 이 과목으로 많은 대학생들이 오픈소스에 뛰어들 수 있게 될 것 같아서 무척 기대가 됩니다. :)

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


오늘의 단어

Google 개인화 홈이나 애플 대시보드 위젯같은 곳에 보면 "Word of the Day"라고 매일 하나씩 (외국인이 보기에는) 잘 안 쓰는 영어 단어를 보여주는 부분이 있습니다. 요새 한국어로 글을 쓰다보면 너무 매일 쓰는 말만 쓰고, 이미 있는 새로운 단어나 좀처럼 써본 적이 없는 단어를 새로 쓴 경험이 별로 없는 것 같아서, 국어 단어 아무거나 보여주는 서비스가 없나 한참 찾아봤는데, 잘 안 보이더군요. 으흐~

그래서 마침 국립국어원에서 표준국어대사전 표제어 목록을 공개했던 것이 생각나서, 이걸 RSS로 한 번 만들어 봤습니다. 그냥 아무거나 뽑는거라 보통 사람들은 못 알아들을 말도 나오고, 늘상 쓰는 말도 나오고 해서 1개로는 별로 건질 게 없을 것 같아서 5개로 늘렸습니다. 종종 "아!" 하는 까먹고 있었던 언젠가 본 단어도 나오는 것 같네요. :)

참, 단어의 뜻을 설명한 부분은 표준국어대사전의 검색 결과에서 무단으로 추출한 것이라 저작권 문제가 있습니다. 되도록이면 짧고 아주 간단하게 보여주고 있긴 하지만 여러모로 다른 곳에 재활용하시는 것은 좀 위험하고 개인적으로만 몰래 쓰세요. -ㅇ-;

혹시 관심있는 분들을 위해 표제어 부분을 설명드리자면, 표제어 목록은 Microsoft Access 데이터베이스인 mdb포맷으로 올라와 있는데, 윈도우에서 pywin32를 이용해서 ODBC로 데이터를 뽑아왔습니다. mdbtools라는 플랫폼 독립적 툴도 있긴 하지만, 국제화가 제대로 안 돼 있어서 테이블 이름이 한글인 것은 못 뽑아오더군요. --;; 뽑아온 표제어에는 원어, 6개 사전 각각의 수록여부, 합성어 구분, 장음표시 등 여러가지 정보가 들어있습니다. 그런데 자료실에 설명되어 있는 대로, 진짜로 깨진 글자가 많아서 대략 80만 정도 되는 표제어 중 9000개 정도가 깨져서 그냥 싹 버렸습니다. 동음이의어는 검색에서 따로 따로 구분하기가 힘들어서 그냥 각각을 하나로 다 합쳐서, 최종적으로 나오는 데이터는 52만단어 정도 중의 5개 씩을 보여줍니다.

일단은 국립국어원에 한번 저작권과 관련해서 문의를 해 보려고 하는데, 아무래도 사전의 저작권을 두산동아와 같이 공유하고 있는 듯해서, 간단하게 해결은 안 될 것 같군요. 크흐;

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


리눅스에 SEED가 들어갔습니다.

예전에 올린 적 있는 리눅스 SEED 구현이 오늘 드디어 git 보관소에 들어갔습니다.

전에도 말씀드린대로, 커널에 들어간 것이기 때문에 웹브라우저나 전자결제 같은 것과는 거의 관련없고, IPsec, crypt-fs 같은 커널에서 사용하는 보안 레이어에만 실제로 적용됩니다. 몇가지 사용 예를 더 생각해보면, 커널 모듈로 뜨는 키보드 보안(해주는 척 하는) 모듈이 유저랜드를 거쳐서 통신하는 경우라던지 그럴 때도 어떻게 잘 하면 쓸 수 있을 것 같기도 하네요;; 어떻게 봐도 사실 일반 최종사용자들이 직접적으로 사용할 일은 거의 없습니다;; ^^;;

FreeBSD에도 넣으려고 했는데, 뭔가 손이 잘 안 가는 것이.. 흐흐 드라마보는 시간 조금만 줄이면 정말 많은 일을 할텐데, 큰일이네요 -ㅇ-;;;

아마도 리눅스 2.6.23은 벌써 RC가 진행 중이라 못 들어갈 것 같고, 2.6.24에는 들어갈 수 있지 않을까 싶네요~

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


불여우용 맞춤법 검사 확장 기능

예전에 미투데이에서 맞춤법 검사하기를 만든 적이 있었는데요, 그 이후에 종종 다른 곳에서 글 쓰면서 이거 맞춤법 검사하려니 상당히 불편하지 않은가! 하는 생각이 들어서, 아무 데서나 쓸 수 있게 불여우 확장기능으로 만들어 봤습니다.

물론, 전에 만들었듯, 그냥 그리스몽키 스크립트로 만들었으면 설치도 쉽고 더 좋았겠지만, 그리스몽키 스크립트로는 UTF-8과 CP949 사이 인코딩 변환을 할 방법이 도저히 없어서 결국 그냥 깔끔하게 직접 요청할 수 있도록 확장기능으로 만들 수밖에 없었네요.

간단하게, textarea 태그나 input 태그 중 텍스트 박스에서 오른쪽 클릭 하면 거기서 검사할 수도 있고, 아니면 본문 중 일부를 긁어서 오른쪽 클릭 하면 긁은 만큼만 검사를 할 수도 있습니다.

설치는 임시 위치로 [우리말 도우미 설치]를 클릭하시면 설치하실 수 있습니다. 라이선스는 원래 확장기능 소스 템플릿으로 쓴 프로그램이 GPL이라 GPL로 했습니다.

앞으로 계속 좀 더 정상적으로 보일 수 있게 불여우 애드온 사이트에 등록했는데 아직 공식적으로 인정받지 못했기 때문에, 많은 분의 평가가 필요합니다. 관심 있으신 분들은 사용해 보시고 아래쪽에 평가를 추가해 주셔서 나중에 공개 애드온이 될 수 있도록 성원해 주세요 +_+ (아직 모래통에 들어 있어서 반드시 자기 프로필 설정에서 show sandbox를 체크해야만 보입니다.)

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


계산과학포럼을 소개합니다.

그동안 파이썬 마을에서 간간이 올라오는 생물, 지리, 물리, 화학 등 여러 분야의 과학 분야 질문들을 보고, 대덕단지의 여러 연구소에서 파이썬을 쓰는 분들을 만나뵈면서 급하게 뭔가를 하긴 해야하는데, 컴퓨터는 뜻대로 안 움직여주고 이런 경우를 겪는 연구자분들이 많이 계신 것을 느꼈습니다. 그렇지만, 아무래도 프로그래밍 언어를 전문적으로 하는 커뮤니티 같은 곳에서 계산 알고리즘이나 자료 처리 방법 자체에 대해서 설명하는 것도 애매하고, 오히려 의사소통이 더 어려워져서 서로 오해하는 경우도 생기고 하는 경우가 많았습니다.

그래서, 필요를 느끼고 계산과학포럼 이라는 커뮤니티 사이트를 새로 개설했습니다. 기존의 여러 프로그래밍 커뮤니티에서 뭔가 하고 싶은 걸 설명은 해야하는데, 설명하자니 배보다 배꼽이 더 크다고 느끼셨던 분들이나, 나와 비슷한 방법으로 다른 분야에서 일하는 사람들은 어떻게 하고 있는지 궁금한 분들은 오시면 좋은 자리가 되지 않을까 싶네요~ 주변에 관심이 있으실만한 분이 있으시면 소개해주세요 +_+

질문이 나올 것 같은 몇가지 사항에 대해서 미리 언급해 드리자면,

  • 게시판 소프트웨어는 Vanilla라는 것을 썼습니다. 설치에 조언주신 BSDForum의 후회님 감사!
  • TeX나 BBCode, 테마 같은 것은 따로 공식 홈페이지에서 찾아서 깔면 됩니다.
  • 파이썬 포럼을 쓰려고 찾아보기는 했는데, 서버를 전용으로 쓸 게 아니라서 고정적으로 메모리 먹고 있기가 애매해서 결국 php로 된 것으로 썼습니다.
  • 지금 분류에 나타난 분야 외에도 IT분야를 제외한 프로그래밍을 사용하는 분야라면 포용하면 좋겠다고 생각하고 있습니다.
  • compsci가 원래 컴퓨터과학을 줄여 쓴 말로 더 많이 쓰이기는 하지만, 뭐 아무려면 어떻습니까. :-)

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


웹앱스콘에 오세요~

6월 21일(목요일)에 삼성동 코엑스에서 웹앱스콘 2007이 열립니다. 주제는 요새 흔히 있는 웹2.0의 종합선물세트이지만, 아마도 참가비도 매우 싸고 프로그램도 오랜 시간동안 업계의 많은 분들이 노력해서 조절한 덕에 알찬 행사가 될 것 같습니다. :)

저는 프레임워크 2.2 워크샵 트랙에서 김창준님과 함께 전반적인 진행을 맡을 예정인데, 지난번 프레임워크 2.1에서 예고했던 대로, 이만용이사님의 TurboGears, 김승범군의 Seaside 가이드가 있을 예정이고, 덧붙여서 김창준님과 여러 분들이 분산 프로그래밍 언어인 Erlang으로 실시간으로 웹 프레임워크를 만들어가는 과정을 보여드릴 예정입니다.

전반적인 흐름은 지난번과 비슷하지만, 이번에는 전체가 따라해보기로 실습할 예정이기 때문에 모두 노트북을 지참하셔야하는 제한이 있고요~ 이제 인원 제한이 얼마 안 남았으니 참여하실 분들은 얼른 신청하세요~ :)

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


대화하는 사람들의 닉네임으로 현재 시간 추측하기

평소에 IRC를 항상 켜놓고 생활하다보면 종종 굳이 시계를 보지 않아도 IRC에서 어떤 사람들이 떠들고 있는지만 봐도 대충 시간이 얼마쯤 되었겠구나 생각할 때가 있습니다. 창문과 가까이 자리가 있는 사람들은 밖에 사람들이 지나가는 방향만 봐도 대충 시간을 알 수 있고, 차가 많이 보이는 곳에 자리가 있는 사람들은 교통 상황을 봐도 대략 짐작할 수 있는 거나 마찬가지로요~

그래서, 과연 이게 그냥 기분탓인지 실제로 경향이 강해서 쓸만한 지표인지 시험해 보려고 지난 몇 개월간의 IRC로그를 분석해서 떠든 사람 이름(!)과 횟수를 가지고 시간을 1시간 단위로 추측하도록 한번 통계내어 보았습니다.

우선, 예측 방법은 요새 인기가 하늘을 날고 있는 random forest를 사용했는데, R에 들어있는 randomForest 모듈을 사용하기로 했습니다. party 패키지가 좋다는 얘기도 있지만.. 매뉴얼이 허술해서 사용법을 터득하지 못한 관계로 --;;

데이터는 HanIRC의 #perky에서 우선 IRC 데이터를 1시간 단위로 각 닉네임 별로 대화한 횟수(줄 단위)를 해당 시간에 모든 사람이 말한 횟수에서 나눈 값을 뽑았는데, 이 방법으로 과열된 상황과 심심한 상황을 대략 평준화를 할 수 있을 것 같고.. 해당 시간의 입력 벡터에 해당 시간의 데이터 뿐만 아니라 이전, 이후 시간의 것도 넣어서 연속성으로 추측할 수 있게 했습니다. 그래서 총 20명의 데이터를 이전, 현재, 이후 3가지 해서 60개 + 전체 대화량 3개 해서 63개의 실수 벡터가 들어갔습니다.

채널에 참여하는 인원이 비정기적으로 들어오는 분들을 포함하면 200명이 넘기 때문에, 여기서 입력 샘플로 20명만 추려서 사용했습니다. 물론 그 기준은 어느 정도 생활 패턴이 일정하면서 대화량이 적지 않고, 대상 기간에 생활리듬이 급격하게 변할만한 사건이 없었던 것으로 추정되는 분들을 골랐지요. :-)

그래서, 이제 간단한 스크립트(로그파서, 데이터 가공)로 데이터 가공을 끝내고 이제 R에서 읽어서 쭈욱 처리했습니다. 노트북에서 했는데도 그다지 오래 안 걸리네요. (트리 수는 디폴트가 500개)

irc <- read.table('traindata', header=TRUE)
irc.rf <- randomForest(HR ~ ., data=irc, importance=TRUE, proximity=TRUE)
pfile <- read.table('testdata', header=TRUE)
pfile.pred <- predict(irc.rf, pfile)
hist2d(as.numeric(pfile$HR), as.numeric(pfile.pred), nbins=24)

3,5월 자료로 트레이닝해서, 4월 자료로 테스트를 해 보면 다음과 같은 예측값 히스토그램을 얻을 수 있었습니다.

이것 보면 대략 오전은 거의 2시간 내외 오차로 썩 잘 맞히는 것 같고, 오후는 제법 오류가 많습니다. 특히 실제로는 늦은 오후 자료인데, 그걸 새벽 데이터로 오인한 경우가 많네요. 그리고 한낮 자료를 늦은 오후로 오인한 경우도 많고요. 역시 IRC사람들이 오전엔 아주 일정한 생활을 하는 반면에 오후에는 많이 바뀌는 것이 아닌가 싶군요!

각 시간에서 누가 얼마나 떠드는지가 더 의사 결정에 많은 기여를 했는지 알아보면 재미있을 것 같아서~ 그래프를 뽑아 봤더니 이렇게 나오는군요.

대충, 전체적으로 사람들이 얼마나 얘기하는가를 나타내는 prev, next, curr이 높고, 몇 명 평소에 상당히 규칙적인 생활을 하거나, 말을 많이 하는 분들이 상당히 점수가 높습니다. 시간별로 나눠서 보면, 새벽 0~6시 시간대에는 sakura님과 wooil님의 중요도가 아주 중요한데 패턴을 살펴보면 Sakura님이 말을 많이 하면서도 wooil님이 조용하면 새벽0~6시일 확률이 높다는 것을 알 수 있겠죠. 그리고 오전 9~10시 출근시간 무렵은 cocas님과 mithrandir님의 중요도가 높은데 일찍 일어나서 학교 가기전에 채팅하는 착실한 학생들(?)의 패턴이 아주 주효한 것 같습니다. -ㅇ-; 그리고 대략 저녁 6시 대의 중요도(variable importance)를 보면 퇴근시간이 일정한지 여부를 알 수 있을텐데요, 저녁 6시대에는 거의 높은 사람 없이 골고루 다 낮고, 정확도도 상당히 떨어지는 걸로 봐서는, IRC 사람들은 다들 불규칙한 저녁식사를 하는 모양입니다. -ㅇ-;

그 외의 또 다른 재미있는 지표로, outlier이라고 일반적인 패턴에서 벗어나는 샘플들을 골라내는 방법을 사용해서 상당히 평소와는 다르게 진행된 대화가 있나 한번 살펴보았는데, 3월과 5월에 대해서 outlier 지표를 그려보면 다음과 같이 나옵니다.

피크가 뚝뚝 떨어진 부분이 몇 군데 있는데, 이 부분이 평소와는 상당히 다른 일이 벌어진 경우를 의미합니다. 그래서 그 날짜를 구체적으로 로그를 살펴보면 정말로 평소하고는 아주 다른 일이 발생한 것을 알 수 있는데, 200주변(3월 12일)에는 평소에 밤에는 꼭 주무시는 wooil님이 새벽에 한참 대화를 하시는 이변이 발생한 날이고, 1200주변(5월 20일)에는 평소와는 달리 낮에 3시간동안 아무도 한 마디를 안 한 일이 발생했던 것입니다. :-)

이제 대충 어느 정도는 정말 누가 말하는 지만 봐도 시간이 감이 오긴 한다는 것이 정량화가 되었는데요, 혹시 대화 패턴과 시간을 알면 요일도 알 수 있지 않을까 생각이 들었습니다. 그러니까.. 평소에는 낮에는 대화 잘 안 하다가 주말만 되면 S모 다방에 가셔서 하루 종일 IRC하시는 jachin님만 보면 일요일인지 당연히 알 수 있다던지 이런 것들도 정보가 되지 않을까 생각했는데, 의외로 통계를 내 보니까 거의 예측을 제대로 못하는게, 역시 IRC사람들은 주말과 평일 구분이 별로 없는 모양입니다;;

이 자료를 토대로 IRC 클라이언트 입력창 옆에 시계를 붙여 볼까 생각을 해 봤지만.. 너무 삽질같아서 포기.;; -ㅇ-;

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


미투데이에서 한국어 올바로 쓰기

terra님의 글에서 갑자기 생각이 떠 올라서 한 번 만들어 봤습니다. :) 맞춤법 검사기를 직접 만든 건 아니고요, 그냥 부산대학교 정보컴퓨터공학부 인공지능연구실과 (주)나라인포테크가 만든 것에 웹 요청을 해서 받아온 결과를 뿌려줍니다. ^_^;;

사용하시려면 GreaseMonkey를 깔고 다음 링크를 클릭하시면 됩니다~

==> "만박사님의 한국어 시간" 플러그인 설치

자바스크립트에서 인코딩을 변환할 방법을 도저히 못 찾아서, 결국엔 제 서버에 있는 cgi를 거쳐서 euc-kr로 변환해서 보내게 했습니다. 혹시 좋은 방법을 아시는 분은 알려주세요 +_+

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


KLDP 사용자들이 필요할 만한 스크립트

KLDP BBS에 종종 가시는 분들이라면 필요할 것 같아서 만들어 봤습니다. Greasemonkey안에 플러그인으로 넣는 것이니, 먼저 Greasemonkey를 깔고 아래 URL을 누르시면 됩니다.

imyejinfree.user.js 설치 (greasemonkey)

뭐 하는 스크립트인지 설명하자면, 특정인을 언급할 수 밖에 없어서, 그 분께 폐가 될 것 같아서 설명은 생략합니다. (다른 분들만 쓰세요~)

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


ActiveX없이 보안메일청구서 읽어보기

전화요금이나 인터넷요금, 카드요금 등등 요즘은 많은 청구서들이 이메일로 청구서를 발송하면서 이른바 "보안메일"이라는 것으로 보냅니다. 그런데, 하필이면 보안까지는 좋은데, 보안 솔루션이란게 윈도우 전용이라 다른 곳에서는 읽을 방법이 없죠. 카드 얼마 썼는지도 모르고.. 전화요금이 나와도 뭐가 얼마 나왔는지 모르고.. 무지 답답합니다. 으이구~

그래서 간단하게 읽어볼 방법이 없을까 해서 보안 메일을 열어봤더니, base64로 인코딩되어 있어서 아.. 이때부터 삽질이 시작되었습니다. "어떻게든 프비에서 보안메일 한번 읽어보자!"

우선은 보안메일의 base64부분만 풀어도 상당한 힌트가 들어있는데, SEED/CBC/PKCS5Padding이라는 헤더가 있기 때문에, 중간 어딘가부터 분명 SEED/CBC가 시작될 것이라는 걸 강하게 암시하고 있습니다. 대략적으로 00이 많이 나오는 지역을 제외하면 첫 100~200바이트 내에서 CBC코딩이 시작된다는 것을 알 수 있는데, CBC는 그 특성상 시작부분을 정확하게 안 맞추면 뒷부분도 모두 어긋나기때문에 100~200사이에서 모두 시도해 보는 것으로 시험해 봤습니다.

주민등록번호 뒷자리를 입력하기 때문에, 주민등록번호 뒷자리에 0을 채운것, 진짜 PKCS5 패딩을 한 것, MD5한 것 세 가지를 해 봤는데, 혹시나 했는데 역시나 전혀 안 보이는군요. 크흐.. 그래서, 그 이후로 주민등록번호를 숫자로 코딩한 것, sha1로 해시해서 자른 것, sha1 해시한 것을 또 md5한 것 등등 상상할 수 있는 온갖 것들을 다 시도해 봤는데, 맞는게 없더군요..

하도 안 되니까, 속임수로 SEED/CBC라고 해놓고 실제론 SEED/CTR이나 AES/CBC같은 것 쓰는게 아닌가 해서 이놈들도 다 시도해 봤는데, 전혀 안 되네요.. 결국에는 디버거의 도움을 받아 장시간의 트레이스 끝에 키를 생성해 내는 방법을 알아내서 풀어 내긴 했습니다;;;; (함수 하나가 뭐 이리 긴지;;)

아.. 저 노이즈 속에 진주처럼 반짝반짝 빛나는 HTML이여.. -ㅇ-;;; 이제 본문을 풀어보면!! (이번 달에 만든 카드라 얼마 안 썼습니다 =3)

그런데, 하나 재미없고 곤란하게 된 것은 컴퓨터프로그램보호법 제 12조의 2항 "프로그램코드의역분석"에서의 제약사항 때문에, 지금까지 해서 메일 보는 것까지는 합법적이지만, 공개하는 것은 불법이기 때문에, 코드를 공개하거나 바이너리로라도 배포하는 것이 불가능하다는 점입니다. 아이고.. 공개를 안 하면 무슨 재미로 개발을 하나.... 그런데, 보안메일에서 쓰고 있는 방법은 엄청나게 기이한 과정을 거치기 때문에 역공학없이 메일 내용만 보고 풀어보는 것은 매우 힘들 것 같아서.. 해당 프로그램을 배포하는 쪽에서 직접 만들지 않는 한은 다른 호환 솔루션이 나오는 것은 매우 어려울 것 같군요.

파이썬 소스로 SEED부분을 제외하고 2줄이면 풀리는 간단한 방법인데, 앞으로 이니텍에서 Firefox용 플러그인도 좀 배포를 해 주던지, 아니면 자바스크립트나 플래시로라도 좀 해 줬으면 좋겠네요. 그거 만드는데 얼마나 걸린다고..~

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


mechanize로 인트라넷 공지사항 RSS로 만들기

보통 학교나 회사에서 알려주지도 않고 뭘 진행해 놓고서 나중에 왜 인트라넷에 공지 올렸는데 안 봤냐고 그러는 경우가 종종 있습니다. 옛날에 있던 학교에서는 그래도 과사에서 여러 방법으로 알려주려고 시도를 많이 했었는데, 새로 온 학교는 이거 거의 알아서 찾아봐야 먹고 사는 분위기네요. 으흐흐. 게다가 인트라넷은 Firefox로는 로그인도 안 돼서 FreeBSD에서는 도대체 볼 수가 없어서, 애로사항이 여간 아닙니다. 으흐~

그래서, 요새 절정의 인기를 구가하고 있는 mechanize로 게시판 긁어오는 스크립트를 만들어서 전에 식당 메뉴 만들듯 RSS로 만들어 보기로 마음 먹었습니다. 요새는 웬만하면 정보가 사람을 찾아와야지 사람이 정보를 찾으러 다니는 시대는 지났응께~

우선, mechanize는 아시다시피 쿠키와 참조URL 처리, 폼 처리를 자동으로 해 주기 때문에, 간단한 홈페이지를 따라가는 데는 더없이 편합니다. 그래서 웬만한 웹 스크래핑에는 항상 따르는 괴로운 순간 (스트레스가 슬슬 머리 위로 올라오면서, 계속 발생하는 예외상황과 이상한 HTML에 내가 이 일을 해서 뭐가 좋다고.. 하는 번뇌 등등..)이 거의 없이 한 페이지 보고 토닥토닥 해서 한 페이지 지나가고 리듬감을 잃지 않고 정보 수집이 끝났습니다. 역시 개발에는 리듬을 깨는 요소가 최대의 적입니다.

그리고, RSS는 지난번에는 손으로 짜서 print했더니 아침놀군이 HanRSS에서 이상하게 나온다고 하여서, 이번엔 제대로 된 RSS제너레이터를 사용했습니다. 훨씬 쉽고 좋네요~

그리하여, 만들어진 것이 이렇게(svn) 되었습니다. :) 이제 윈도우 들어가서 ActiveX와 씨름하지 않고도 학교 공지사항을 보고 장학금 신청을 할 수 있게 되었군요. -ㅇ-; (그러나 학점 미달로 인해 장학금 신청 자격이;;;)

혹시 회사나 학교 인트라넷에 불만이 있으시면 직접 한번 RSS로 만들어 보세요~

필요하신 분들을 위한 링크 (1시간 간격 업데이트): 전체 학생 교수 직원 세미나/행사 컴퓨터/네트워크 연구프로젝트 외국인

댓글 8 개 | 트랙백 1 개 (보낼곳) | 태그 happyhacking python


오늘의 장난: 아미노산으로 문장 만들기

오늘도 뭔가를 만들다가, 아미노산을 문자열에 쭉 입력해 놓고, 숫자를 세 보고 20개 맞군! 하고 지나가면서 뭔가 "이걸 문장을 만들어서 외워 놓으면 맨날 하나 하나 생각하면서 20개 맞나 세 볼 필요가 없지 않을까!" 하는 생각에 아미노산을 모두 1번 씩 쓰는 문장을 만들면 정말 재미있겠다는 생각을 했습니다. 마치 폰트셋 볼 때 잽싼 여우가 게으른 개를 뛰어 넘는 것 같이 말이죠~ --; 그냥 'ACDEFG...VWY'를 메모 프로그램에 적어두거나 모듈로 만들어 저장해 둬도 되겠지만, 이미 재미있는 놀이가 생각난 판에, 다른 좋은 방법이 눈에 들어오지 않았지요;

결과만 올리면 너무 오래 뻘짓만 한 것 같아서 과정을 상세히 써 봅니다. -O-;;

우선 단어 후보를 한번 추려보기로 했습니다. FreeBSD에서 항상 뭔가 장난할 때 쓰이는 webster 단어 목록을 써서 추려봤습니다. 우선 다 읽어서, 아미노산 알파벳만 쓰고 있는 단어를~

>>> words = open('/usr/share/dict/web2').read().split()
>>> aa = 'acdefghiklmnpqrstvwy'
>>> m = re.compile('^['+aa+']+$')
>>> words = [w for w in words if m.match(w.lower())]

한 단어에 같은 알파벳이 들어있다거나, 너무 짧거나 너무 긴단어를 뺐습니다.

>>> words = [w for w in words if len(set(w.lower())) == len(w)]
>>> words = [w for w in words if 2 <= len(w) <= 7 or w in 'Ia']
>>> len(words)
9863

지금까지 걸러낸 조건에 맞는 단어가 9863개가 있군요~ 뭔가 나올 것 같아서 벌써 기분이 좋습니다 ㅎㅎ;

자 이제 겹치지 않는 단어를 골라야하는데, 각각의 알파벳이 중복되지 않게 조합하는 문제이기 때문에, 정수계획법 (IP)으로 간단하게 풀릴 것 같아서, glpk로 안 겹치는 조건을 프로그래밍 했습니다.

set W; /* Words */
set A; /* Alphabets */
param aw{W,A}, integer; /* # alphabets in each word */
var used{w in W} >= 0, integer; /* words selected */

s.t. alphasmin{a in A}: sum{w in W} aw[w,a] * used[w] >= 1;
minimize aused: sum{a in A} sum{w in W} aw[w,a] * used[w_];

end;

이제 아까 골라낸 파일에서 데이터를 glpk에서 읽을 수 있게 변환~

>>> import sys; sys.stdout = open('data.txt', 'w')
>>> print 'set W :=', ' '.join(words), ';'
>>> print """\
... set A := %(aas)s;
... param aw default 0
... :              %(aas)s :=""" % {'aas': ' '.join(aa)}
>>> for w in words:
...     wlow = w.lower()
...     print w, ' '.join(str(int(a in wlow)) for a in aa)
... 
>>> print ";\nend;"

자 그럼 이제 준비가 다 되었으니 돌려봅시다 -ㅇ-

% glpsol --first -m solword.mod -d data.txt -o found.txt
Reading model section from solword.mod...
(중략)
INTEGER OPTIMAL SOLUTION FOUND
Time used:   1.0 secs
Memory used: 37.2M
lpx_print_mip: writing MIP problem solution to `found.txt'...

으흐흐.. 결과가 나왔군요! (사실은 나오는 데 꽤 걸렸지만 제약조건 다 풀어서 처음 나온 것이 바로 feasible solution이 나온 척 해 봅니다; )

자.. 이제 결과를 해석해 보면.. 단어가 cwm fed glyph qintar skiv 라는군요.. (덜덜덜) 아미노산이 모두 들어있기는 하지만.. 과연 이게 철자 검사기를 통과하기나 할까 싶은 단어들이 막 나오는군요.. 으흐.. webster 단어들은 대단해~ 이걸 뭔가 좀 쉬운 단어들로 바꿔서 해 보고 싶지만, 쉬운 단어를 골라놓은 사전을 쉽게 찾을 수가 없어서 일단은 여기서 중단; 자.. 이제 저걸 외워볼까요 glyph fed cwm qintar skiv~ (곡도 붙여서..) 흑흑흑..

앞의 결과는 너무 쓸모없는 것 같아서 --; 다른 데 하나 응용해 봤습니다. 해리포터에 보면 Tom Marvolo Riddle이름이 볼드모트로 바뀌는 장면이 있길래, 볼드모트랑 철자 구성이 같은 놈을 하나 만들어 보니까.. dom revolt가 나오는군요.. 역시 짧으니까 그다지 문장으로 만들 수가 없는.. 크흐..

오늘의 결론: 여우가 게으른 개 위로 뛰어 넘는다는 문장은 정말 대단하다!

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


식당 메뉴 받아보기

매일 밥먹을 때 어느 식당을 갈까 엘리베이터에 서서 고민을 하게 되는데, 메뉴를 알게되면 좀 더 현명한 선택을 할 수 있지 않을까 해서, 학교 홈페이지에서 식단 제공되는 곳이 있나 찾아봤습니다. 오오. 생각보다 간단한 인터페이스로 2주 뒤의 메뉴까지 다 제공해 주고 있군요. +_+

그래서, 한번 파이썬 API로 만들어 봤습니다. 늘 쓰던 BeautifulSoup으로~

>>> from kaistfood import *
>>> menu = getmenu(u'동측')
>>> print ', '.join(menu[1])
쌀밥, 강낭콩밥, 감자양파국, 제육춘장볶음, 닭안심야채볶음, 고등어구이, 소시지전, 옥수수크로켓, 어묵야채볶음, 양배추쌈장, 참나물무침, 열무나물, 참치샐러드, 김구이
, 알타리김치, 배추김치
>>> menu = getmenu(u'학부', u'세트', 2007, 3, 29) 
>>> print ', '.join(menu[1])
김치햄볶음밥, 북어채계란국, 맛탱야채볶음, 숙주나물, 깍두기
>>> print ', '.join(menu[2])
오징어덮밥, 얼갈이된장국, 시금치겉절이, 마늘쫑건새우볶음, 깍두기
>>> for (pos, opt), menu in itermenus(2007, 3, 29):
...     if u'과일탕수육' in menu[1]:
...             print pos, opt, '==> 탕수육 발견!'
... 
동측 카페테리아 ==> 탕수육 발견! 
서측 카페테리아 ==> 탕수육 발견!

매일 파이썬 띄우고 누르고 있을 수도 없고, 학교 홈페이지 들어가기도 귀찮으니 매일 보는 RSS로 띄워놓으면 좋겠다 싶어서 RSS로도 만들어 봤습니다. 흐흐 (동측, 학부, 서측) 매일 새벽 3시에 업데이트될 예정이니 필요하신 분 등록해서 쓰세요~

소스는 svn 곳간에서 받으실 수 있습니다~

Google 개인화 홈페이지에 추가한 화면

리더에 추가하기 버튼 모음

  • 동측: Add to Google Add to Hanrss
  • 학부: Add to Google Add to Hanrss
  • 서측: Add to Google Add to Hanrss

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


리눅스 2.6을 위한 SEED 패치

한국정보보호진흥원(KISA)의 지원으로 리눅스 2.6을 위한 SEED 패치를 만들었습니다.

커널에 넣는 패치이기 때문에 주 목적은 파일시스템을 암호화하는 경우와 IPsec같이 커널에 스택이 있는 네트워크 프로토콜을 사용하는 경우입니다. 항상 이슈가 되어왔던 인터넷 클라이언트로써의 접근성 문제와는 거의 전혀 상관없다고 보셔도 무방합니다. ^^;

그런데, 사실 IPsec이나 cryptfs 양쪽 모두 SEED가 AES에 비해 성능이 좋은 편이 아니기 때문에, 개인이 SEED를 쓸 일은 거의 없을 것 같고, 금융결제원이나 국정원과 관련된 뭔가를 할 때 쓰일 것 같네요. (VPN업체들에서 SEED기반 IPsec을 주로 쓴다고 합니다.)

여하간, 리눅스에 익숙하신 분들은 한번쯤 컴파일하실 일이 있으시면 패치를 해서 해봐주세요~ :) modprobe seed; modprobe tcrypt하고 나서 dmesg를 봐서 seed 관련된 부분에서 모두 pass 했다고 하면 정상동작하는 것입니다. 특히 빅엔디안 머신이나 64비트, 쿼드코어 등등 독특한 환경을 쓰시는 분들 꼭 한번 도와주세요 -ㅇ-; (패치 리뷰도 대환영!)

리눅스에 첫 패치 보내서 들여보내는 작업이 끝나면, 지금 갖고 있는 어셈블리 코드도 적용해서 다시 패치를 보내고 그 다음에는 FreeBSD에도 넣어 볼 생각입니다~

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


미투에 관한 몇 가지 재미있는 사실~

미투에서 요즘 유행하는 me2app 분위기에 휩쓸려서 뭔가 나와야 할 것 같은 걸 하나 만들어버렸습니다. -ㅇ-; 처음엔 뭔가 재미있을 것 같아서 우다다다 코딩을 했는데, 알고보니 wooil님께서 미리 예견하셨던 것! (제 미래를 다음에 한 번;)

미투에서 제공하는 friends.xml을 이용해서 전체 회원들의 친구 관계를 분석했습니다. 긁은 것은 어제 오후 5시쯤이었으니, 그 이후에 가입하셨거나 친구가 되셨으면 이 글의 통계에서는 무효입니다. 흐흐;

우선 친구 관계에 있어서는 전에 링크 같은 책에서 전세계를 기준으로 했듯이, 다들 알고보면 가까운 사이죠. 미투 친구들은 평균적으로 4.39명 건너 친구들로 묶여져 있고, 가장 먼 친구들까지 해도 6명 안에서 친구입니다. 그러니까, 나-친구1-친구2-친구3-친구4-친구5-그친구 이렇게 하면 다 아는 사람이라는 것인데.. (써놓고 보니 꽤 먼 친구군요;;) 작은 사이트이지만 아직 이 정도 거리로 있는 것을 보면, 아직 친구가 그렇게 많지 않은 분들이 꽤 있는 모양입니다. :)

역시 미투 회원은 누구든 예상할 수 있듯, charlz님은 2다리만 건너면 모든 회원과 친구인데, 이건 charlz님이 유일하고, 역시 평균 거리 1.479, 친구의 친구수 627명, 친구 수 346명으로 모두 1위입니다. -ㅇ-

친구 수도 흥미로운데, 미투 친구들은 친구가 평균 13.27명, 친구의 친구까지는 평균 255.63명이 있습니다. 역시나 가장 많은 것은 charlz님이시지만, 친구의 친구까지 포함해도 3명밖에 안 되는 분도 있었습니다. :)

친구 수의 분포로 보면, 100명 이상인 분이 charlz, cn_, sumanpark, s2day, ncsoft, djsol, codian 모두 7분이 있군요. 그리고, 그 밑은 분산된 분포로 고루 내려오다가 15~22명 사이인 분이 집중적으로 많고, 친구가 1명이거나 2명인 분도 전체 회원의 35%가 넘었습니다.

자, 그럼 마케팅이나 고객 분석에서 널리 쓰이는 "이 시스템의 평균적인 사용자"를 뽑을 수도 있겠는데요. 통계를 계산한 모든 값에서 가장 평균에 가까운 값을 보인 분은 widyou님입니다. 활동이 많아서 매일 답글에 보이는 회원 외에 다른 분들이 서비스에 대해 어떻게 생각하고 있을지 엿볼 수 있는 분이 아닐까 싶네요~

마지막으로 여기서 사용된 통계 자료를 바탕으로 보통 제공되는 친구 경로 검색 서비스를 하나 웹에서 접근할 수 있게 올려 놓았습니다. ---> 미투 친구 찾아가기

알려두기: 혹시 통계 자료에서 본인의 자료가 원치않게 언급된 분들은 제게 알려주시면 삭제해 드리겠습니다.
알려두기2: 저는 미투 초대장이 없답니다~ -O-
알려두기3: CGI에서 css는 ikspres님의 것을 몰래 훔쳐다가 썼습니다. -ㅇ-;

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


파일 이름으로 다운받기

"아.. BeautifulSoup.py가 필요한 데 웹 브라우저 열기는 귀찮고.. 이걸 어쩌나.." 이런 비슷한 경험이 한 번쯤은 다들 있으실 겁니다. 저도 특히 BeautifulSoup.py랑 rename.pl 같은 것들이나, Python-2.5.tgz 이런 것 괜히 파일이름은 아는데 다운받으려면 검색하고 귀찮아서, 왠지 1줄이면 될 것 같아서 오늘은 작정을 하고 스크립트로 만들었습니다.

#!/bin/sh
USERAGENT='Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.8) Gecko/20050609 Firefox/1.0.4'
wget -U "$USERAGENT" -O "$1" 'http://www.google.com/search?btnI=1&q='"$1"

썰렁~ 흐흐.. 그런데, 바이너리 파일들은 구글이 운좋은 예감으로 안 튕겨주기 때문에, 결국 그 파일이 링크가 달려있는 페이지로 가는 덕분에 저런 간단한 방법으로는 안 돼서 결국은 또 BeautifulSoup의 도움을 받아서 이렇게 만들었습니다. --; (일이 점점 커지네~)

대충 써 보자면~

% luckget Python-2.5.tgz
Feeling lucky with Python-2.5.tgz ...
Fetching from http://www.python.org/ftp/python/2.5/Python-2.5.tgz ...
done
% luckget BeautifulSoup.py
Feeling lucky with BeautifulSoup.py ...
Fetched from http://www.intertwingly.net/code/BeautifulSoup/BeautifulSoup.py
done
% luckget 1GNF.pdb
Feeling lucky with 1GNF.pdb ...
Fetching from http://www.rcsb.org/pdb/files/1gnf.pdb ...
done

그러나, 이름에서도 눈치챌 수 있듯, 재수없으면 안 되는 수가 있으니 너무 기대하고 쓰지는 마세요~ :->

% luckget rename.pl
Feeling lucky with rename.pl ...
No luck. :-P

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


me2day RSS에서 제목에 본문 나오게 하기

예전 orkut 유행을 생각나게 하는 요즘 me2day 광풍에 저도 우일님께서 초대해 주셔서 가입했습니다. ^_^

마침 짧게 쓰는게 오픈룩 오른쪽에 예전에 붙어있던 "싹둑싹둑~" 자리에 대신 넣으면 좋겠다 생각이 들어서, 구글 리더에 등록하고 짠! 하고 봤는데, 글쎄 me2day의 RSS에는 제목에 날짜가 들어가 있어서, 제목만 봐서는 무슨 내용인지 전혀 모르겠더군요.. 흐흐.. 그래서 좀 고민을 하다가 RSS를 받아다가 제목만 넣어주는 CGI를 만들어서 구글리더에게 그 CGI를 바라보도록 했습니다.

혹시 필요하신 분들을 위해 소스를 올립니다~

#!/usr/local/bin/python
from BeautifulSoup import BeautifulSoup
import urllib

print "Content-type: text/xml; charset=utf-8"
print

soup = BeautifulSoup(urllib.urlopen('http://me2day.net/hyeshik/rss'))
for incident in soup('item'):
        descr = incident('description')[0].contents[0]
        incident('title')[0].contents[0] = descr

print soup

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


TextMate 한글 반쪽으로~

요즘 웹 프로그래밍을 종종 할 일이 있어서 한꺼번에 파일을 많이 열어놓고 보려니 TextMate를 종종 쓰고 있습니다. 그런데, 역시 다 좋은데 한글이 대략 난감하게 나오는 문제로 HTML 편집할 때 매우 난감한데, 그래도 한글이 별로 없는 파이썬 파일을 고칠 때는 쓸만 해서 그런대로 만족하고 있습니다. ^_^

어제 일본사람들은 그렇다면 어떻게 쓰고 있는지 궁금해서 검색을 해 봤더니, 역시 지난 11월 초에 글꼴을 가로로 반으로 줄이는 방법으로 우선 피해가는 방법을 올린 사람이 있었습니다. 오! 마침 fontforge용 스크립트도 제공되어 있길래 은글꼴의 한글과, Bitstream Vera Sans Mono를 가지고 똑같은 방법으로 줄여서 써 봤습니다.

TextMate + 반쪽짜리 한글 글꼴

으흐흐. 좀 거시기하긴 하지만, 나중에 정식으로 지원되기 전까지는 답답하게 나마 쓸 만 하겠네요. 사용한 글꼴 둘 다 오픈소스로 공개되었기 때문에, 얘네들로 만든 글꼴도 fontforge깔기 귀찮은 분들을 위해 올려둡니다.

은고딕 반쪽+VeraMono TTF 내려받기

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


(가짜) 한글 Lorem ipsum

Apple iWork를 포함한 많은 워드프로세서/조판 시스템들이 Lorem ipsum을 레이아웃을 보여주기 위한 가짜 텍스트로 사용하고 있습니다. 이거 한글로 뭔가 문장이 많이 필요한데, 무궁화 꽃이 피었습니다만 반복하기도 그렇고.. 그렇다고 제대로 한글 빈도, 문장 구조 만들기도 힘들고 해서 그냥 라틴어 읽기 방법을 대충 구현해서 lorem ipsum을 초등학교 영어 자습서처럼 한글로 읽게 했습니다. --;

E-coli(perky):~/tmp/hipsum% python hipsum.py 
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Quisque eu leo a justo consequat dictum. Lorem ipsum dolor
sit amet, consectetuer adipiscing elit. Maecenas consectetuer
arcu id velit.Mauris sed pede. Duis dignissim. Proin ut
auris eu turpis sodales (중략)

로렘 입숨 돌로르 싯 아멧, 콘섹테투에르 아디피슁 엘릿.
쿠이스쿠에 에우 레오 아 유스토 콘 세쿠앗 딕툼. 로렘 입숨 돌로르
싯 아멧,콘섹테투에르 아디피슁 엘릿. 메체나스 콘섹테투에르
아르쿠 읻 벨릿.마우리스 섿 페데. 두이스 디니스심. 프로인 웃
마우리스 에우 투르피스 소달 레스 (후략)

혹시 한국어 정보처리에 조예가 깊으신 분들은 진짜 한국어 문장처럼 보이게 완벽한 한글판 Lorem ipsum을 만들어 주시면 감사 -O-;;

제 가짜 한글 lorem ipsum은 http://openlook.org/svnpublic/snippets/hipsum/에 올려 두었습니다.

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


오-게임 테크트리 그리기

IRC에서 얘기를 하다가, 샤샤님이 테크트리를 graphviz로 그리기 위해서 고생하고 계시길래, 스크립트로 자동으로 만들게 해 봤습니다. (오게임 게시판 글)

저야 이제 삶에 충실하기 위해 오게임을 끊었지만, 게임 하시는 분들은 한 번.. 흐흐.. 테크트리 그리기해 보세용.. (Firefox로 보세요~)

관례적으로 소스는 svn에 공개 합니다. ^.^;;

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


아미노산 외우기

역시 연속되는 시험 전 증후군의 영향으로.. 세포생물학 시험공부를 하다가, 아미노산 외우기 괴로워서 으어어 하다가 정신을 차리고 보니 저도 모르게 아미노산 외우는 프로그램을 만들어놓았군요.. =.=

작년에 생화학 시험 칠 때 아미노산을 대충 외웠다가 피를 봤는데, 올 해는 꼭 다 맞아 보일테다 하는 각오를 하며 클릭클릭 해 봅니다; _-_

write-only 스타일 코드로 만들어서 부끄럽긴 하지만, 관행상 소스를 공개합니다.;;

그나저나, JME라는 분자구조 그리는 애플릿 괜찮네요. ^^;

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


OpenSSL SEED 패치 업데이트

지난 1월에 올렸던 OpenSSL SEED 패치업데이트하였습니다. 그런데, 지난 6월에 일본의 표준 블럭 싸이퍼인 Camellia가 지난 6월 OpenSSL에 들어갔습니다. SEED와 마찬가지로 새로운 사이퍼를 추가하는 것이다 보니 대부분의 위치에서 패치가 겹쳐서, 결국 지난 번 패치 대부분 파일이 충돌이 있어서 수정할 게 산더미더군요;; -- OpenSSL RT #1273번 참조

얼마 전에 패치했던 libgcrypt에 대한 SEED패치는 일단 개발자들이 적극적으로 작업의사를 밝혀와서, GNU에 저작권 할당 과정만 끝나면 거의 바로 적용될 수 있을 것 같습니다. 국제우편으로 문서가 오는거라 그런지 몇 주일씩 걸리는군요 -.-;

최근에 SEED를 개발한 한국정보보호진흥원(KISA)에서 OpenSSL등 오픈소스 소프트웨어에 SEED 지원을 넣는 것에 대해서 정치적 작업을 포함해 적극적인 대응을 하기로 했다고 합니다. 그래서 OpenSSL 패치가 앞으로 힘을 받아서 빨리 등록될 수 있지 않을까 기대해 봅니다. ^_^;

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


libgcrypt SEED 패치

지난 번에 OpenSSL SEED 패치를 했었는데, 아직 개발자들의 관심을 끌지 못해서 들어가지 못했습니다. 그래서 우선 다른 암호 라이브러리들에도 집어 넣어려고 OpenSSL, nss에 이은 오픈소스 암호 라이브러리 인기순위 3위쯤 되는 녀석인 libgcrypt패치를 만들어서 제출했습니다.

libgcrypt는 아무래도 나중에 나온 것이다보니, 처음부터 디자인을 상당히 현대적인 모양으로 구성을 해서 OpenSSL에 비해서는 거의 작업할 곳이 5분의 1정도로 적었습니다. 한가지 작업을 할 때 고쳐야 하는 곳이 얼마나 흩어져 있느냐가 역시 중요한 소프트웨어 디자인 수준의 척도인 것 같군요. libgcrypt는 LGPL이기 때문에 완전히 자유롭게 쓸 수는 없지만, 그래도 gnupg에서도 쓰고 생각보다 GNU 계열의 프로그램들에서 많이 쓰고 있는 듯 합니다. 이 패치를 넣으면 gnupg에서 SEED로 싸인하는 것도 어쩌면 될지도 모르겠습니다. (? 안 해봐서 장담은.. ^^;;)

단지 하나 걱정되는 것은 libgcrypt도 별로 요새 개발이 활발한 편이 아니라.. 대충 예상하기에 들어가자면 6개월 이상은 걸릴 것 같네요 --;;

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


시간표 짜는 프로그램 업데이트~

지난 학기에 만든 시간표 프로그램을 좀 더 업그레이드 했습니다. 흐흐 이번에는 편집 기능을 약간 강화하고;; 플러그인 구조로 다른 학교 지원을 쉽게 넣을 수 있게 했습니다. +_+

HaveAGoodTime 실행화면

원래는, 5~6개 정도 학교 플러그인을 넣어서 올리려고 했는데, 아무리 찾아봐도 2학기 시간표를 로그인 안 하고 검색할 수 있는 학교가 더 없어서 일단은 경상대, 고대 안암/서창, 연대 신촌학부, 대학원(신촌/원주) 지원을 넣었습니다. plugins/ 디렉터리에 플러그인을 넣으면 쉽게 다른 학교 지원도 할 수 있게 했으니, 혹시 필요하신 학교의 2학기 시간표가 공개되면 한 번 해 보세요~ ^.^; 찾다보니까, 어떤 학교는 엑셀 파일로 올리는 곳도 있고, HWP로 올리는 곳도 있던데, 그런 곳은 엑셀파서나 HWP 파서를 플러그인에서 쓰도록 하면 되겠네용;;;; 혹시 플러그인 만드시면 저에게 소스를 보내주시면 감사~ 으흣~

다운로드

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


겨울에 태어나면 진짜로 뭔가 있을까?

얼마 전에 월드컵 대표선수 중에 대체로 겨울 출생자가 많다는 것을 라디오에서 들었습니다. 그런데, 옛날에도 그런 말을 몇 번 들은 적이 있어서, 정말로 기존에 알려져 있던 "겨울에 태어난 아기가 천재성과 예술성이 높다."라는 말이 사실인지 궁금해졌습니다.

자 그래서, 바야흐로 시험철.. 이런 것이 궁금해 보면 직접 계산을 해보는 것! -.- 옛날에 FreeBSD 커미터 생일 통계가 몇 번 나온 적이 있었습니다. 그 때도 1,2,3월생이 유독 많았던 기억이 있어서, 우선 비교적 포매팅이 잘 되어 있는 FreeBSD 커미터 생일로 해 봤습니다. 뭐 물론 FreeBSD 커미터라고 다 똑똑하다는 것은 아니지만, 그래도 일정 노력이 있어야 하는 것이니까 한 번;;;

자.. 결과는 생각보다 별로 유의미한 결과는 아닌 것으로 보입니다. 10~12월이 적은 것이 뚜렷하긴 하지만, 원래 10~12월은 날짜가 다른 달보다 이틀 적으니까(?) ;; 음.. 아직 확률 통계론을 안 배워서 이게 가설을 지지하는 범위 안에 들어가는지는 잘 모르겠네요.. --; (역시 사람이란 배워야..;)

표에는 안 드러났지만, 하나 독특했던 것은, 5월이 굉장히 수가 많았고, 4, 6, 10, 11, 12월이 아주 적었는데, 제일 수가 많은 5월은 28명인데 비해, 11월은 11명 밖에 안 됩니다.

FreeBSD 커미터보다는 좀 더 신뢰도가 있는 것으로 알려져 있는 노벨상 수상자를 대상으로도 한번 통계를 내 봤습니다. 자료는 위키백과 영어판의 노벨상 수상자 목록 페이지에 링크된 수상자 중 기관이 아닌 개인을 대상으로 했습니다. 그렇지만, 2005년 노벨 물리학상 수상자인 John L. Hall은 아무리 둘러봐도 생년월일을 알 수가 없어서 못 넣었습니다. (그 외의 수백명은 열심히 파싱해서 다 넣었지요. ^.^)


Phys: 물리학, Chem: 화학, PhMed: 생리/의학, Lit: 문학, Econo: 경제학

음.. 노벨상 수상자를 대상으로 한 통계에서는 오히려 1/2/3월 태생이 수가 다른 계절들에 비해서 적었습니다. 특히나 경제학상은 12.28% 밖에 안 되긴 하는데, 경제학상은 수상자가 별로 많지 않기 때문에 대상이 작아서 상대적으로 정규화가 덜 된 것으로 해석할 수도 있습니다.

음.. 뭔가 유의미한 결과가 나왔으면 좋았을텐데.. 적어도 과학이나 오픈소스에서는 탄생월이 큰 관련은 없다는 것 같습니다. 으흐흐. 다음에 역대 올림픽 메달리스트를 대상으로도 한번 통계를 내 봐야겠네요;;; (다음 시험이 언제더라 =3)

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


샤프 계산기용 숫자야구

시험 때만 되면 다가오는 시험전증후군의 영향으로.. -.-;;

물리화학 공부를 하다가, 계산기로 곱셈 나눗셈만 하기가 지겨워진 나머지, 계산기의 다른 기능을 학습 하다가.. (-.-;) 1학년 때 잠깐 해봤던 프로그래밍 기능을 다시금 발견하여, 숫자야구를 만들어 보았습니다. 으흐흐~ 나름(?) 재미있어요;;; (샤프의 2만원짜리 모델입니다. 보통 1학년 때 많이 쓰는 것..)

혹시 샤프 계산기 쓰시는 분은 90년대 초반에 컴퓨터랜드 같은 잡지 보고 소스 일주일 쳐서 갤러그 게임 해보던 추억을 떠올리며 한번 ;;;

Rem NUMERIC BASEBALL
Rem FOR SHARP EL-5250 BY HYE-SHIK

Print"HELLO
Label INIT
X=random×1000
If X<100 Goto INIT
A=ipart(X÷100)
C=fpart(X÷10)×10
B=(X-100A-C)÷10
Label MAIN
Input G
D=ipart(G÷100)
F=fpart(G÷10)×10
E=(G-100D-F)÷10
S=0
R=0
If A≠D Goto NS1
S=S+1
Label NS1
If B≠E Goto NS2
S=S+1

전체 소스코드

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


한글PuTTY에 PLaunch 추가

그냥.. 시험치고 모르는게 많이 나와서 울적한 마음을 달래고자.. ^^;; 러시아에서 날리는 PuTTY 변종인 TuTTY에 들어있는 세션 관리자인 PLaunch를 윈도우용 한글 PuTTY에 넣어서 배포판만 새로 꾸려 봤습니다.

PLaunch말고는 바뀐 파일이 없으니, 그냥 설치 프로그램을 다시 덮어서 깔아주시면 됩니다. 그러면, 프로그램 그룹서 찾아보시면 PLaunch라는 게 생기는데, 그걸 실행하면 트레이에 PuTTY 아이콘이 생기고요. 그리고 그 다음부터는 윈도우키+P 를 누르시면 PuTTY 세션 목록이 뜹니다.

저는 뭐 세션 몇개 안 저장해두니까 별 차이는 없는데, 가끔 수백대 세션에 넣어 놓고 헤메는 분들이 쓰시면 편할 것 같아서 ㅡ.ㅡ;;;; (그런데, 폴더 편집 기능이 좀 이상해서 제대로 안 됩니다. 살살 쓰셔야 할듯 -O-)

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


한글 PuTTY 0.58 릴리스

오랜만에 한글 PuTTY 새버전을 릴리스 했습니다. 원래는 커서 패치를 업스트림하고서는 더 이상 안 건드리려고 했는데... 정치력 부족으로 아직 패치를 밀어넣지 못해서 -.-;; ㅠ.ㅠ

이번 릴리스의 변동점은.. 아무래도 새 버전이니까 기분이 좋은데.. 뭐가 바뀌었는지는 잘 모르겠네요 하하하.. -ㅇ- 궁금하신 분은 릴리스 노트를 보세요. +_+

그나저나 버전 올라갈 때마다 코드가 엄청 많이 바뀌어서, 매 버전마다 매번 새로운 방식을 연구해서 패치하는 게 무척 귀찮아서.. 얼른 정치력 연마를 좀 더 해야겠네요..

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


이글루스 블로그 이전 프로그램, Blogyltransferase

알림: 이 글은 이전 스크립트 자체에 대한 글이며, 이글루스나 다음 등 사이트 자체에 대한 어떠한 선호도 의도된 것이 아닙니다. 저는 둘 다 안 쓰기 때문에 별로 신경쓰지 않습니다. ^^

Blogyltransferase 1.0

어느 분의 부탁으로 이글루스에서 다른 사이트로 블로그 이사를 하는 스크립트를 만들었습니다. ==> Blogyltransferase 1.0 다운로드 (win32용), 소스 코드 및 타 플랫폼 (svn)

두 번째로 만들어 본 wxPython 프로그램인데, 이제 그런대로 익숙해 져서 크게 불편하지 않네요. 하하하.. (그새 배신을;;) 이글루스의 기본 스킨이 워낙 잘 되어 있어서 스크린 스크래핑 하기에 굉장히 좋았습니다. BeautifulSoup의 특성을 만끽할 수 있는 최고의 실험 재료가 아닐까 하네요. +_+

앞으로 다른 API도 적당한 것이 있다면 다음 블로그 API외에 다른 것도 지원할 수도 있겠습니다. (MetaWeblogAPI같은 것은 코멘트나 트랙백을 옮길 방법이 마땅찮더군요.)

사용 방법은 http://xxxx.egloos.com/ 의 xxxx를 블로그 이름에 넣고, 다음 블로그로 옮기는 경우에는 다음 블로그를 먼저 개설하고, 다음넷 사용자 이름과 비밀번호를 입력하고 "전송 시작!"을 누르면 됩니다.

이사가 잘 되었으면 이 글에 트랙백을 보내주세요. :)

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


시간표 최적화 프로그램 (이번엔 GUI다~)

지난 학기에 복학하는 기념으로 좋은 시간표를 만들어보고자 시간표 최적화 프로그램을 만들어서 열심히 돌려서 한 학기를 널럴한 시간표에 즐겁게 보냈습니다. 그래서 이번 학기도 어떻게 좀 더 삶을 이롭게 하고자 한번 돌려 봤는데, 글쎄 학교에서 웹 디자인 수정을 하나도 안 하는 바람에 연도만 바꾸니까 바로 돌아가는!.. 한편으로는 너무 시시하게 끝나서 실망한 나머지, 괜시리 일거리를 만들어서 GUI 공부를 한번 해 봤습니다. 그래서 이번에는 wxPython 버전으로 껍데기를 씌웠습니다. ^^ (기왕이면 누구나 쓸 수 있는 윈도우용 GUI 프로그램으로~)

OptiTT wxPython GUI

사실 파이썬은 오랫동안 해왔지만, 그동안 GUI에는 관심이 전혀 안 생겨서, wxPython이고 Tkiner이고 "Hello, World!" 버튼 1개 있는 것 말고는 만들어 본 적이 없는데~ GUI 툴킷을 배워서 써먹어 보고 싶은 마음에 둔 곳이 하나 있어서, 간단한 것 해보려고 해봤습니다. 그런데, 생각보다 훨씬 삽질이네요. -O-; 파이썬이라고 간단하다더니 이런 삽질을!!!

시간표 프로그램으로 돌아가서ㅡ. 저기 보이는 그리드 박스에 학정번호와 선호도, 그룹을 입력해 주면, 자동으로 학교 홈페이지에서 시간표와 학점을 긁어와서 가능한 모든 시간표 배치를 시도하여 최고 점수의 시간표를 HTML로 뽑아주는 프로그램입니다. 컴과 학생들은 다들 한번씩은 생각해봤음직한~ 으흐;;

앞으로도 되도록이면 GUI 하는 일을 줄여야겠다고 굳게 다짐해 봅니다. -O-;

다운로드:

힌트: optitt.py에 있는 get_subjectinfo() 함수를 각 학교 수강편람 홈페이지에 맞게 고치시면 다른 학교에서도 쓸 수 있습니다.

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


OpenSSL SEED 패치

대표적인 오픈소스 보안 툴킷인 OpenSSL에 금융전산쪽에서 강제적으로 쓰도록 하고 있어서 국내에서 굉장히 많이 쓰이고 있는 SEED (RFC4009) 지원을 넣은 패치를 만들었습니다. (<- "패치"를 누르면 다운로드)

원래는 재작년 쯤에 OpenSSL에 SEED넣는 프로젝트를 소프트웨어진흥원이 발주해서 i모 보안회사와 ㄱ모 대학이 같이 진행한 것이 있었습니다. 이 결과물을 자세히 보면 소스의 원저작자의 저작권을 무시한 심각한 문제가 있고, 업스트림을 바로 하기에는 부족한 점이 꽤 있습니다. 그래서, 저작권 문제를 해결하고, 업스트림을 할 수 있도록 OpenSSL에서 이전에 새로운 싸이퍼가 들어갔을 때의 상황과 거의 똑같은 범위의 작업을 했습니다. 그리고, NexG사에서 지원해 준 x86 어셈블리 구현도 추가해서 속도도 400% 정도로 향상시켰습니다. :) (민수형/미쓰옹 감사합니다! -O-)

이제, 오픈소스에서 가장 중요한 작업인 정치적 문제가 남았는데.. 마침 OpenSSL 홈페이지가 다운됐는지 접속이 전혀 안 돼서 보낼 수가 없군요.. 흐흐. 언제 살아나면 0.9.8b나 0.9.9부터는 SEED를 볼 수 있도록 힘 좀 써 봐야겠습니다. -O-

OpenSSL API에 익숙한 분들께서는 꼭 테스트를 한번씩 해봐주세용; 제가 SSL에는 익숙하지가 않아서 이게 제대로 도는지 알 수가 없네요. 크흐 _-_

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


Io 파이썬 바인딩

으흐흐.. Io가 주류 언어들에 비해서 워낙 라이브러리가 부실하다보니 뭔가 하려고 하면 항상 꼭 몇개씩 발목잡는 부분이 있었습니다. 파이썬의 str에 해당하는 Sequence와 String같은 경우에도 대충 다 있는 것 같이 보이면서도, 꼭 뭔가 하려면 한 개씩 없고.. List나 Map도 참 답답할 때가 많고.. 그래서 그냥 파이썬 브릿지가 있으면 어떨까 생각하다가 우선 파이썬 바인딩을.. :) 한 30줄 짜니까 금방 되네요~

Io 20060104
Io> Python

==>  Python_0xa4f380:
  runString = CFunction_0xa49500

Io> Python runString("import sys\nprint sys.platform\nfor i in 1,2,3:\n print 'yay!'")
Running
freebsd6
yay!
yay!
yay!

==>  Python_0xa4f380:
  runString = CFunction_0xa49500

Io>

이제 오브젝트 매핑도 좀 하고, 브릿지 역할을 할 수 있게, Io 객체도 파이썬에 그대로 넘겨줄 수 있게 여러가지 수정을 해 봐야겠습니다. ^_^;

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


답글 남기기 방법 변경

많은 분들이 오픈룩을 RSS 리더로 읽으시기는 하지만, 그래도 가끔 홈페이지에 웹브라우저로 직접 들어오시는 분들의 편의를 위해서 답글 남기는 방법을 다른데서 보통 유행하는 방식으로 바꿔봤습니다. 목록 화면에서도 [답글] 버튼을 누르면 화면 안에서 현재 답글 목록이 나오고 거기서 바로 쓸 수 있는 방식으로요~

리프레시나 다른 페이지로의 이동 없이 답글을 남길 수 있기 때문에 좀 더 쉽게 답글을 쓰실 수 있지 않을까 생각이 됩니다. 아하하; -ㅇ-; 그리고 버튼 순서를 약간 바꾸었고, 메일과 홈페이지 입력하는 칸은 평소에는 숨겨뒀다가 버튼을 누르면 나오게 했습니다.

대체적으로 자바스크립트가 작동하지 않거나 텍스트 브라우저인 경우에도 동작하도록 고려를 했는데, 혹시나 쓰시는 브라우저에서 제대로 안 보이시는 경우에는 알려주세요~ (이 글에다가 답글 테스트를.. :) -- 그나저나 이것하느라 coreblog 프러덕트에 직접 무식한 패치를 해버리는 바람에 업그레이드가 골치아프게 생겼군요;;

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


파이썬은 왜 빌트인 타입의 메쏘드를 못 바꾸는가

Io의 asString, asCharacter 같은 것 덕분에 앞뒤로 왔다갔다 하지 않고도 계속 쓸 수 있다는 점이 참 와닿아서, 파이썬에서는 그렇게 할 수 없을까 하다가, 전에 어떤 분이 파이썬에서 왜 베이스 타입에서는 메쏘드를 못 갈아치우냐 하시길래, "엇 안되나! (뻘쭘)" 했던 기억이 나서 좀 더 연구를 해 보았습니다. 으흐흐

파이썬의 타입 오브젝트의 플래그 중에 Py_TPFLAGS_HEAPTYPE이라는 것이 있는데 이것은 힙에 할당된 타입에만 들어가는 플래그라서, 즉, 런타임에 상속된 타입들은 이 플래그가 설정이 되지만, 컴파일할 때 스택에 할당된 타입 객체들은 이 플래그가 설정되어 있지 않아서 결국 "can't set attributes of built-in/extension type"라는 에러를 뱉어냅니다. 그런데, 파이썬은 타입 오브젝트가 비록 스택에 있긴 하지만 const가 아니기 때문에 실제로 딕셔너리도 할당을 하는 등 변조를 하고 gc로 관리까지 하고 있어서 변경한다고 문제가 생길 것은 없었습니다. 그래서 그 부분을 패치해서 실험해 보면, (Object/typeobject.c의 type_setattro함수의 첫 if 블럭을 주석처리)

>>> object.asInt = lambda x: int(x)
>>> object.size = lambda x: len(x)
>>> [1,2,3].size()
3
>>> 'hehehee'.size()
7
>>> '123'.asInt()
123

요렇게 잘 돌아갑니다~

과연.. 잘 되는데 왜 파이썬에서는 막아놓은 것일까! 그 이유는 메일링리스트를 한참 뒤져본 결과 귀도의 적극적인 의도로 막아놓은 것인데, 귀도의 설명에 따르면 빌트인 타입 오브젝트들은 여러 쓰레드에 걸친 것 같은 공유되는 컨텍스트에서 같이 사용되는 경우가 많기 때문에 문제를 발생시킬 소지가 높은 핵이라서 이런 걸 공식적으로 허용해 줄 수가 없다고 하네요. 뭔가 수긍이 가는 것 같기도 하면서도.. 파이썬의 다른 면들은 과연 그렇게 깨끗했나 의심이.. 흐흐흐.. -O- 하여간 약간 아쉽군요~

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


한글로 Io 프로그래밍

요즘 Io로 시간날 때 이것 저것 장난치며 놀고 있는데, 모든 것이 다 교체가 가능하다는 말에, 한글로 프로그래밍도 제법 가능할까 하는 생각이 들어서, 한번 쑥 바꿔봤습니다. 흐흐. 우선, 기본적으로 Io는 한글이 식별자로 쓰이지 못하기 때문에 패치를 해야하는데, IoLexer.c에서 글자 읽는 부분을 패치를 했습니다. (아직은 임시로 테스트해보기 위한 흉악한 패치입니다. =3)

그래서 이제 코드가 어떻게 보일지 무척 궁금해서 얼마 전에 코드 레이스 관객 문제를 Io로 풀었던 것을 고쳐 봤습니다. 우선, 원래의 Io코드는 이렇게 됐습니다. (창준형이 수정해 줌)

Sequence applyByGroup := method(msg,
    rechar := self at(0)
    repeats := 0
    self asMutable append(0) foreach(ch,
        if(rechar != ch,
            msg(rechar, repeats)
            repeats = 0; rechar = ch)
        repeats = repeats + 1
    )
)

current := "1"
(Lobby args at(0) asNumber - 1) repeatTimes(
    next := Sequence clone
    current applyByGroup(block(ch, repeats,
        next appendSeq(ch asCharacter, repeats asString)))
    current = next
)
current linePrint

이제 한글로 프로그래밍하려면, 기본 객체들이나 메쏘드들 이름을 일일이 바꾸는 초기화 루틴이 필요한데, 그 부분을 이렇게 넣어 봤습니다.

// 기본 오브젝트 메쏘드
슬롯 := getSlot("getSlot")
만약에 := 슬롯("if")
메쏘드 := 슬롯("method")
복사 := 슬롯("clone")
코드뭉치 := 슬롯("block")

// 오브젝트
연속열 := Sequence do(
    의 := 슬롯("at")
    추가 := 슬롯("append")
    하나씩 := 슬롯("foreach")
    숫자로 := 슬롯("asNumber")
    덧붙이기 := 슬롯("appendSeq")
    한줄로출력 := 슬롯("linePrint")
    변경가능하게 := 슬롯("asMutable")
)
입구 := Lobby do(
    인자 := 슬롯("args")
)
숫자 := Number do(
    번반복 := 슬롯("repeatTimes")
    글자로 := 슬롯("asCharacter")
    문자열로 := 슬롯("asString")
)
목록 := List do(
    의 := 슬롯("at")
)

// 지역객체
Locals 자신 := 메쏘드(self)

번역은 대충 일단 간단하게만.. 흐흐;; 그러면 위의 개미수열 소스가 이렇게 됩니다.

연속열 같은것끼리 := 메쏘드(추가명령,
    반복글자 := 자신 의(0)
    반복횟수 := 0
    자신 변경가능하게 추가(0) 하나씩(글자,
        만약에(반복글자 != 글자,
            추가명령(반복글자, 반복횟수)
            반복횟수 = 0; 반복글자 = 글자)
        반복횟수 = 반복횟수 + 1
    )
)

개미 := "1"
(입구 인자 의(0) 숫자로 - 1) 번반복(
    다음개미 := 연속열 복사
    개미 같은것끼리(코드뭉치(코드, 반복횟수,
        다음개미 덧붙이기(코드 글자로, 반복횟수 문자열로)))
    개미 = 다음개미
)
개미 한줄로출력

이히히. 아무래도 대/소문자 구분이 없다보니 약간 코드가독성이 떨어지는 것 같기도 하고.. 한데, 나름대로 교육용 언어로는 괜찮을 것 같기도 하고... 띄어써야 할 부분이 문법과 다른 게 좀 거시기하고... (애매하군요 -.-;;)

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


Mono CP949 코덱 무려 2년 묵은 버그 수정

2003년 10월에 Mono에 CP949 코덱을 넣고서는 C# 문법도 다 까먹고 그냥 무관심하게 있었는데, 얼마 전에 어떤 한국분이 영어로 잘 안 돌아간다고 메일을 보내셔서 2년만에 오래간만에 C# 코드를 좀 보게 되었습니다.

아직 디버거에 익숙하지 않아서 그냥 System.Console.WriteLine 으로 열심히 돌아다녀보니까, 으하하하. copy & paste 버그를 하나 발견했습니다. Mono CJK 코덱들은 공유 dll에 들어가 있는 정적 바이트 배열 데이터를 가지고 디코드를 하는데, 한국어 코드페이지인 CP949는 데이터를 쓰는 영역이 KSX1001 영역, UHC 레벨 1 영역, UHC 레벨 2 영역 이렇게 3가지로 나뉘어 있습니다. 그런데, UHC 레벨 2 영역이 첫 번째 바이트가 0xA1로 시작하는 것으로 돼 있는데, 코드 안에서는 레벨 1 것을 붙여넣기 해서 수정하다보니 0x81에서 시작하는 계산식이 그대로 남아있어서;; -ㅇ-;;;

아마 그때 테스트해 봤을 때는 인코딩 하는 것은 열심히 다 테스트를 했는데, 디코드는 확장완성형 부분은 글자가 터미널에서 안 써져서 귀찮아서 테스트를 안 했더니만 이렇게 돼 버렸네요;; 흐흐.. 그래서 방금 패치를 제출했습니다. 간단한 문제이니까 Mono 다음 버전에는 아무래도 고쳐지겠죠?

참, 그리고 11월 1일에 지미안의 에노모토 아쯔시씨가 CP949에서 EUC-KR도 제대로 지원하게 수정했더군요~ 다음 버전엔 EUC-KR도 쓸 수 있게 되었습니다. :)

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


collections.rbtree

2004년 여름쯤에 파이썬 2.4가 릴리스되기 전에 collections 모듈에 타입이 1개 밖에 없는데 이름이 복수로 붙어서, 피보나치 힙을 넣자는 얘기가 있을 때 한 3주일 고민을 해서 피보나치 힙을 구현 했었습니다. 그런데, 피보나치 힙이 워낙 괴짜스러운 자료구조라서 복잡하고 편리한 것들을 추가하기에는 영 불편해서 결국은 그냥 중단했었습니다.

올해 초에는, 피보나치힙과 비슷한 용도에 사용할 수 있지만, 바이너리 트리의 특징을 유지하고 있기 때문에, 구현이 훨씬 쉬운 레드블랙 트리를 한번 구현을 해 볼까 생각을 했었습니다. 그런데~ 훈련소 다녀오고 나니까 머리가 안 돌아가서.. 이히히 ^_^;; 결국은 한참을 벼르던 레드블랙 트리 구현을 마침 숙제하기가 너무 귀찮기도 하고 파이썬 2.5도 곧 피쳐프리즈가 되지 않을까 해서 밀어넣어보려고 한번 집중해서 구현해 봤습니다. 기본적으로 제공되는 메쏘드는

  • T.insert(v): 값을 트리에 넣음
  • T.remove(v): 값을 트리에서 뺌
  • T.clear(): 트리를 비움
  • T.has_key(k): 키가 있는지 검사
  • T.values(): 값의 리스트를 리턴
  • T.keys(): 키의 리스트를 리턴
  • T.items(): (키, 값) 페어의 리스트를 리턴
  • T.nfirst(n): 작은 값부터 순서대로 n개를 리턴
  • T.nfirstitems(n): 작은 값부터 순서대로 n개를 (키, 값) 페어의 리스트로 리턴
  • T.nlast(n): 큰 값부터 순서대로 n개를 리턴
  • T.nlastitems(n): 큰 값부터 순서대로 n개를 (키, 값) 페어의 리스트로 리턴
  • T.popleft(v): v보다 작은 값을 모두 빼내고 리스트로 리턴
  • T.popleftitems(n): v보다 작은 값을 모두 빼내서 (키, 값) 페어의 리스트로 리턴
  • T.popright(v): v보다 큰 값을 모두 빼내고 리스트로 리턴
  • T.poprightitems(n): v보다 큰 값을 모두 빼내서 (키, 값) 페어의 리스트로 리턴
  • 그 외에 __setitem__, __getitem__, __len__, __contains__ 이 지원됩니다.

아무래도 레드블랙트리나 피보나치힙류는 세션 테이블같이 정렬 순서에 따라서 빠르게 작업을 해야 하는 경우에 프리어러티 큐로 활용하는 것이 가장 대표적인 용례인데, 피보나치힙으로 구현을 한다면 순위를 뽑으려고 할 때 매번 extractmin을 해야하는 반면에, 레드블랙트리는 그냥 트리에서 돌아다니는 것으로 구할 수 있다는 것이 장점이라고 할 수 있겠습니다. (속도는 완전한 C 타입으로 구현하면 피보나치힙이 훨씬 빠르지만, 파이썬의 비교연산 특성상 파이썬 확장 모듈이 되면 별 차이가 안 납니다.)

소스는 오픈룩 trac 작업실안에도 있고, 소스포지 패치 리뷰 트래커에 Patch #1324770으로 올렸습니다. 이히히. 잘 돼서 파이썬 2.5에 들어가면 좋겠군요.

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


시간표 정도는 자동으로

복학 준비를 하면서, 어제 신촌으로 이사도 하고 준비가 착착 되어가고 있습니다~ 이제 내일부터는 수강신청인데, 항상 할 때마다 과목끼리 충돌 검사도 하고, 주4를 만들려면 어떻게 해야하나 항상 고민을 하는게 참 귀찮았습니다. 그래서, 아무래도 이런 작업은 사람이 할 일이 아닌 것같아서 자동으로 선호도를 입력하면 시간표를 만들어 주는 스크립트를 하나 만들었습니다. 으흐흐~

우선 입력값으로 들어가는 것은, 후보 과목들의 기본 정보들과 각 수업의 대체 그룹 (같은 그룹에서는 1과목만 신청하게)을 CSV로 지정해서 그것을 프로그램에서 읽어옵니다. 그리고, 그 외의 정보로 따로 들어오는 것은

  • 신청 학점 (최소, 최대)
  • 주4일 선호 가중치
  • 주3일 선호 가중치
  • 학교에 있는 시간 가중치 (-로 주면 가급적이면 공강을 줄임)
  • 이른 아침 시작 가중치 (-로 주면 아침 수업을 피함)
  • 저녁 수업 가중치 (-로 주면 저녁 수업을 피함)
  • 과목별 선호도 (학점에 곱함)
  • 수업 과집중 가중치 (-로 주면 수업이 너무 많이 몰리는 것을 피함)

으흐흐 그래서 시간표를 몇 개 뽑아 봤더니 직접 손으로 짠 것보다 만족스러운 것이 몇개 나오는군요~ 수강신청 하다가 몇개 꽉 찼을 때도 대안 시간표를 쉽게 새로 생성이 가능!

CSV 파일 형식은 이런 식으로 입력합니다. (그룹,가중치...,학점 순)

C,0.8,ENG1104-01-00,수치해석,"화1/목3,4(화5)",공A004/공A019(과232),서보윤,3

소스는 snippets/aratt에 있습니다. (프로그램 이름은 Arranger for the Relaxed Assembly of TimeTable 에서 따왔습니다. -_-;) 라이선스는 언제나 그렇듯 libpng/zlib license를 적용합니다.

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


메가박스 취소표를 노려 보자

최근에 BeautifulSoup이 정말 HTML에서 부분 뜯어내기에 좋다는 소리를 듣고, 오늘 영화 예매를 하려고 보던 차에, 주기적으로 취소표 보기가 너무 귀찮은 나머지 아름다운 수프를 마셔버렸습니다. 꿀꺽~ 역시 이름대로 생각보다 훨씬 쉽게 잘 만들었네요.

$ python boxwatch.py
0) 로봇 - 더빙
1) 로봇 - 디지털
... (중략) ...
15) 친절한 금자씨
16) 친절한 금자씨 - 한글자막
17) Mr.and Mrs. 스미스

>> 15
== Available ==
        13:50 (9관)     16:15 (9관)     18:40 (9관)     21:05 (9관)
... (중략) ...
== Unavailable for now ==
        08:00 (3관)     08:20 (1관)     09:00 (9관)     10:25 (3관)
... (중략) ...
        20:25 (1관)
>> 17:15 17:40 18:00
polling...
polling...
polling...

대략 이렇게 나오다가 표가 뜨면 예매 페이지를 웹 브라우저로 띄워줍니다. (파이썬의 webbrowser 모듈에서 지원하는 브라우저이거나 cygwin이면 제대로 뜹니다.)

므흐흐.. 소스는 여기서 받으실 수 있고, 늘 그렇듯 libpng/zlib 라이선스입니다. (파일 인코딩이 euc-kr이니, 소스 브라우저에서는 약간 깨져서 보입니다.

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


사내 상용 솔루션을 위한 빌드

제가 다니고 있는 회사에서는 조엘식 분류에서 "사내 소프트웨어"에 들어가는, 중규모 솔루션을 주로 만듭니다. 고객사에서 원하는 대로 플랫폼도 바뀌고, 소스 1줄을 수정하려고 해도 고객사에 작업내역서를 보내고 승인받은 뒤에 직접 들어가서 작업을 해야하는데다가 일요일 새벽에만 작업이 가능한 곳도 있고, 문제가 생기면 손해배상도 들어오고 그러다보니, 아무래도 디펜던시가 우찌됐건간에 시스템 기본 라이브러리를 빼고는 모두 직접 옵션 조절해서 컴파일한 것을 깔게 됩니다. 리눅스에서만 돌던 소프트웨어를 갑자기 AIX에서 돌려보자고 하루 전에 연락이 오기도 하고 -_-; 하여간~ 흐흐

그냥 빌드해 놓고 그냥 tar을 들고 댕기던 시절에는, 빌드도 다 손으로 해야하다보니, 밤마다 자동빌드는 커녕, 업그레이드 한번 하려고 해도, 수시간씩 걸리고, 새 플랫폼이 나와도 포팅하는데 하루종일 별의 별 삽질을 다 하게 됩니다. 그래서, 상태를 좀 개선해 보고자 새로 하는 프로젝트에서는, POSIX 플랫폼이면 무난하게 돌아가는 형태의 빌드를 구성해 봤습니다. 흐흐흐.

처음엔 GNU make 기반의 makefile 문법으로 하려고 했었는데, GNU make에서는 for루프와, target 함수 같은 것을 제공하지 않아서, 아무래도 m4같은 것의 도움 없이는 10개 이상의 디펜던시가 있는 패키지를 모두 한꺼번에 빌드하는 게 꽤 힘들었습니다. 그래서 결국은 NetBSD pkgsrc에서 BSD make를 가져다가 자동 빌드하고 그걸로 프로젝트를 빌드하는 방식으로 바꿨는데.. 이러쿵 저러쿵 만들다 보니까 결국은 포트같이 돼 버렸습니다. 그러니까.. 으흐흐. 예를 들면 이렇게~

# Berkeley DB build
# $Id: dep.bsddb.mk 864 2005-06-17 07:22:34Z perky $

NAME=           bsddb
FANCYNAME=      BerkeleyDB
VERSION=        4.3.28
SITE=           http://downloads.sleepycat.com/
DISTFILE=       db-${VERSION}.tar.gz
SRCDIR=         ${WRKDIR}/db-${VERSION}/build_unix

CONFIGURE_SCRIPT=../dist/configure
CONFIGURE_ARGS= \
        --prefix=${PREFIX} \
        --disable-cxx \
        --disable-debug \
        --disable-java --disable-mingw \
        --disable-tcl --enable-static \
        --disable-shared

NO_INSTALL=     yes

.include "submodule.mk"

요걸로 프로젝트를 매일 밤과 점심시간에 자동으로 빌드해서 에러가 나면 메일로 알려주도록 세팅해 두었습니다. 이제 기능을 좀 추가해서, 바이너리 인스톨러 스냅샷 만드는 것과 인스톨 스크립트로 자동으로 인스톨해서 유닛테스트 돌리는 것도 해보려고 합니당. 지금까지 만든 것은 여기에 올려 두었습니다. 디펜던시도 많고 플랫폼도 많은 내부 프로젝트 관리하는 분은 써 보세요. :)

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


한글 PuTTY 주요 기능 업스트림

그동안 3년정도 관리해 왔던 한글 PuTTY를 이제 관리하기도 귀찮고, 업데이트도 자주 올라오고 해서 이제 주요 기능을 그냥 다 업스트림 패치를 만들어서 올려버리고 그만둘까 생각을 하게 되었습니다. :)

우선, 현재 한글 PuTTY의 주요 변경점을 보면,

  • 한글 위에 커서가 올라가는 경우 커서 크기를 키움
  • 한글 입력 도중에 입력창이 별도로 뜨지 않고 현재 위치에서 입력
  • 환경 설정창이 한글로 나옴
  • 한글 윈도우 98에서 입력이 전혀 안 되는 문제점 수정
정도가 들어가 있습니다.

여기서 커서 크기가 늘어나는 것은 Hung-Te Lin이라는 사람이 업스트림한 패치가 3월말에 들어가서, 이제 PuTTY에서 별도의 패치 없이도 커서 크기가 자동으로 한글 위에서 늘어나게 되어서 다행히도 이제 한글 PuTTY에서 패치를 안 해도 되게 되었습니다. :)

그 다음, 입력창을 안 띄우는 것은 사실 IME을 쓰는 곳 중에서 창이 걸리적거리는 곳은 거의 한국어가 유일하기 때문에, 아무래도 직접 패치를 할 수 밖에 없었는데, 지난 번에 좀 삽질해서 패치한 위치를 출력단에서 터미널단으로 옮긴 덕분에, 업스트림 패치를 비교적 단시간에 만들 수 있었습니다. :)

한글로 나오는 설정창과 윈98 문제는 현재 업스트림이 가능할 만한 것들이 아니기 때문에, 우선은 업스트림에서는 빼고, PuTTY를 선택적으로 gettext와 빌드할 수 있도록 하는 것을 넣어서 그것을 통해서 넣는 게 나을 것 같네요. 그래서 일단은 차후로~

그래서 일단 업스트림할 것은 제자리 입력 패치 (이른바 onthespot 패치)인데, 패치는 오픈룩에도 올려 두었습니다. 곧 들어가게 되면 이제 한글 PuTTY 다운 받지 말고 그냥 오리지날을~ :)

Hi,

I have been maintained Korean l10n fork of PuTTY for couple of
years.  Seeing the recent cursor-width change in svn head, I decided
to upstream some features of the fork.

The feature is "on-the-spot" input and it's very specific to Korean
IMEs because incremental dictionary searching is required for Chinese
and Japanese but Korean doesn't require any dictionary-based input
interactions nor IME composition window at all.  And many Korean
users feel uncomfortable for that composition windows hide terminal
context.  So I attached the patch that fixes the behavior and it
currently applies only for Korean IMEs on windows systems.

Thanks,
Hye-Shik

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


서울 지하철 모듈

IRC 봇 SugarCube의 주요 플러그인 중의 하나였던 지하철 플러그인이 최근에 정보 싸이트로 쓰고 있던 WebSubway가 개편을 하는 바람에 안 돌아가게 돼 버렸습니다. 한동안 고치기 귀찮아~~~을 외치며 우어우어 거리고 있다가, 휴가 중 짬을 내어 봇에서 따로 쓸 수도 있게 그냥 일반화 클래스를 만들어버렸습니다.

사용법은 대충 이런식..

>>> import pprint, SeoulSubway
>>> pprint.pprint( SeoulSubway.shortest_path(u'서울대입구', u'여의나루') )
{'bare_time': 31,
 'charge': 900,
 'distance': 12.4,
 'nummoves': 12,
 'path': [<Route path="서울대입구 (2호선) => 영등포구청 (2호선)" etime=17>,
          <Transfer station="영등포구청 (2호선)" etime=6>,
          <Route path="영등포구청 (5호선) => 여의나루 (5호선)" etime=13>],
 'total_time': 37}
>>> SeoulSubway.last_train(u'서울대입구', u'선릉')
(24, 41)

흐흐 일단 SugarCube에 적용해 놓았는데, 다른데 msnm 봇이나 웹사이트 같은 데 활용하실 분들은 마음껏 사용하세용~ (라이선스는 libpng/zlib 라이선스) 소스는 OpenLook Trac에서 받으실 수 있고, 소스코드 문서도 있습니다. (크크~)

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


모든 것이 새롭다 - rrdtool 1.2

압도적인 인기의 오픈소스 라운드 로빈 데이터베이스인 RRDTool이 1.2가 릴리스 되었습니다. 그동안의 버전이었던 1.0에서 상당히 오래 머물러 있었는데, 갑자기 1.2로 올라오고 나서는 요새 유행하는 모든 것이 새롭다 스타일이군용~ 쿠쿠~

  • 베이스 그래픽 라이브러리가 바뀌었습니다. 원래 gd 라이브러리를 사용했었기에, 국제화에 한계가 있었으며 비트맵 그래픽만 가능했었지만, 이제는 기반 라이브러리가 libart로 바뀌고, freetype으로 폰트 렌더링을 하기 때문에, 이제 anti-alias 벡터 그래픽이 가능해졌고, 트루타입 폰트 (한글도 가능!)도 지원됩니다. 와와!
  • 새로운 출력 포맷: 이제 기존 포맷 외에도 SVG, PDF, EPS가 지원됩니다.
  • VDEF 지원: 기존에 CDEF와 DEF와 LINE등을 써서는 최대값이나 평균값 같은 것을 무척 단순하게 밖에 표현할 수가 없었는데, 이제 VDEF로 그래프 전역에 있는 다른 값들을 다룰 수가 있게 되었습니다.
  • 예상값 밖으로 튀는 것 검사: Holt-Winters Forecasting 라는 것을 사용해서, 이제 원래 진행되던 것 외로 데이터가 튀는 것에 대해서 표시를 할 수 있게 되었습니다.
  • COMPUTE 데이터 타입: 이제 로깅 남길 때 데이터 타입을 지정해서 로그를 남길 때 미리 계산해서 RRD에 넣을 수 있게 되었습니다.
  • 외부 라이브러리 별도 배포: rrdtool에서는 그동안 gd라이브러리, png, jpg같이 외부 라이브러리들을 모두 소스에도 같이 묶고 static 링크를 하는 방식으로 배포하고 있었는데, 동적 라이브러리를 최대 활용하는 최근 트렌드에 맞춰서 이제 모두 외부 소스를 쓰며, 동적 링크를 하게 되었습니다. 그래서, 이제 컴파일하기가 간단하지가 않습니다. 으흐흐 -ㅇ-; 포트 없으면 이제 컴파일도 못하겠 -.,-;
  • mmap 지원: 이제 파일 I/O를 할 때 mmap을 씁니다. mmap은 lazy on-demand I/O를 하다보니 아무래도 rrd 파일을 관리할 때 좀 더 시간을 절약할 수도 있을 것 같군요.

rrdtool 1.2로 만든 anti-alias 이미지

한편, 마티즈같이 바뀌지 않은 것이 하나 있는데.. 바로 이것! :)

checking in... and out again
ordering CD from http://people.ee.ethz.ch/~oetiker/wish .... just kidding ;-)

그런데, 오늘 어떤 사람이 py-rrdtool을 rrdtool 안에 넣으려고 Oetiker씨와 얘기를 하고 있다고 라이선스에 대해서 저에게 문의를 해 왔는데, 잘 되면 다음 1.2버전 부터는 rrdtool만 깔면 파이썬에서도 쓸 수 있게 되겠군용.~

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


coreblog 트랙백을 똑똑하게 받자

어제 뽀빠이님께서 보내주신 트랙백이 장렬하게 깨져서 한참 보였었는데, 그 부분을 수정하기 위해서 코드를 좀 들여다 봤습니다. 이 부분은 아주 유명한 프로토콜 디자인 상의 오류인 트랙백의 인코딩 문제로 인해서 발생합니다. 아시다시피 트랙백을 전송하는 HTTP GET 리퀘스트에는 특별히 인코딩을 쓸 수 있는 방법이 없는데, URI/URL의 원초적인 한계성으로 인해서 HTTP GET에는 뭐가 들어오던 간에, 인코딩 이름을 직접 주지 않고서는 뭐 해결할 방법이 전혀 없는.. 참으로 답답한 경우 중의 하나입니다. 으흐~ (이 부분은 트랙백의 기반 표준을 IRI로 바꿔버리면 해결되긴 합니다.)

그래서, 결국은 아직까지는 euc-kr인가 utf-8인가를 구분하기 위해서는 그냥 디코딩해 보는 방법 외에는 딱히 방법이 없는데, 많은 블로그 소프트웨어들이 이런 경우는 고려하지 않고 작성되어 있어서~ ~ 코어블로그도 마찬가지라서.. 그냥 깨져버리고 말았네요.. 흐.. 그래서 일단은 우선 긴급 상황을 패치하기 위해 양쪽 다 시도하는 코드를 우겨넣어 보았습니다. 주말에 환경 설정에서 읽도록 바꿔야겠네요.. :)

--- COREBlog.py.orig    Wed Apr 27 21:36:03 2005
+++ COREBlog.py Wed Apr 27 21:45:49 2005
@@ -1117,6 +1117,12 @@
         #Append a Comment object to self.entries
         if not self.trackbacks.has_key(id):
             self.trackback_list.insert(id)
+        for attrname in ('title', 'excerpt', 'url', 'blog_name'):
+            try:
+                getattr(obj, attrname).decode('utf-8')
+            except UnicodeDecodeError:
+                newval = getattr(obj, attrname).decode('cp949').encode('utf-8')
+                setattr(obj, attrname, newval)
         self.trackbacks[id] = obj

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


mono의 한국어 DateTimeFormatInfo

FreeBSD에서 mono가 여전히 잘 안되는 부분이 많기에.. 고치기도 힘들고 해서 깔아놓고는 별로 안 쓰고 있었는데, 창우옹께서 날짜가 이상하게 나오는 문제가 있다기에, 주말에 날씨도 화창한데 집에서 문제를 고쳐 봤습니다.

우선, 문제는 System.DateTime.ToShortTimeString()의 결과가 "오 5:12"같이 오전/오후가 표시가 안 되는 생뚱맞은 것이었는데, MS.NET CLR에서는 "오후 5:12"로 제대로 나왔는데, mono에서만 짤려서 나오는 것이었습니다. 그래서 무슨 문제인지 추적을 해 봤는데.. 역시 구조는 여기 저기 많이 거친거라.. 한참을 "그건 우리 담당이 아니니 다른 데 가서 알아보세요"를 겪고 찾아버렸습니다. 으흐.

  • 일단은 corlib의 System.DateTime 클래스: 여기서는 ShortTimeString 메쏘드가 ToString 메쏘드를 호출하고, ToString에서는 내부적인 다른 메쏘드에서 System.Globalization.DateTimeFormatInfo 클래스의 ShortTimePattern을 참조하고 있었습니다.
  • System.Globalization.DateTimeFormatInfo을 보니까, 별다른 내용은 없고, 그냥 다른 곳에서 construct해 준 값을 그냥 단순히 받아만 주는 것 같아서, 다시 System.DateTime으로~
  • System.DateTime 구현을 자세히 보니까 System.Globalization.CultureInfo 클래스의 인스턴스를 가져오도록 되어있었는데, 그놈이 TLS에 저장되는 전역 인스턴스를 가져오도록 되어있었습니다. 그런데, 데이터를 로딩하는 부분은 construct_datetimeformat_info()라는 정의되지도 않은 메쏘드를 쓰고 있었는데, [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern void 라는 데코레이트 되는 타입으로 되어있어서, 아 이게 뭔가 하고 한참을 고민했습니다. ;;
  • 결국 mono 소스 전체에서 저 메쏘드 이름을 grep해 보니까, 와와! monoruntime의 mono/mono/metadata/locale.c에서 C함수를 그 메쏘드로 매핑하고 있었던 것.. 자세히 보니까 culture-info-table.h라는 자동 제너레이트된 파일에 datetime 포맷이 기록되어 있었습니다. 근데 그놈은 또 다른 프로그램이 만든 것;
  • 휴.. 결국은 목적지에 도착! mono/tools/locale-builder라고 하는 C#으로 작성된 프로그램이 locale과 culture관련 XML파일들을 모아서 monoruntime의 C 헤더파일로 변환을 해 주고 있었습니다. mono에서는 ICU의 데이터들을 그대로 쓰고 있는데, ICU LDML와 CLI의 포맷이 다른 점을 supp/ 디렉터리 아래의 xml 파일들로 오버라이드하고 있는 바로 그 부분에서 잘못된 포맷이 있었던 것! 그래서 잽싸게 쓱싹 수정해서..
  • 버그를 질렀습니다. 으흐.. 버그질라는 왜이리 복잡하지~

그런데, 이번에 이 작업을 하면서, mono의 System.Globalization 지원 부분의 내부 구조를 잘 알게 되었는데, 생각보다는 역시 디자인이 괜찮은 것이, 파이썬에도 CultureInfo같은 것을 하나 만들어 넣고 싶어졌습니다. 지금 있는 locale 모듈은 시스템 의존적이라, 안 되는게 너무 많아서.. 으흐.. 그런데, 구글에서 찾아보니 Zope X3의 zope.i18n 쪽에서 ICU를 기반으로 한 국제화 지원이 들어가고 있었는데, 아직 구체적으로는 안 봤지만 뭔가 기대가 됩니다!

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


fastcgi에서 php를 chroot 안에서 구축하기

오늘부터 OpenLook은 새로운 서버에서 돌아가게 되었습니다. 옵테론 242 듀얼이라 무지 빨라졌지요~ (사실 별로 돌아가는 게 없어서 그다지 체감 속도는;;) 이번에 옮기는 김에, 기존에 쓰던 아파치에서 lighttpd로 바꿨습니다. 요새 lighttpd가 워낙 인기가 있어서, 한번 도전을 해 봤는데, 환경 설정이나 속도나 소모되는 자원이나 여러모로 아주 마음에 듭니다. :)

OpenLook서버에서 돌아가고 있는 웹 사이트 중에 동아리 홈페이지와 파이썬마을이 php를 쓰고 있기 때문에, php를 설정하는 방법을 고심하다가, 심심하면 터지는 php 애플리케이션의 보안 버그에도 좀 대비를 하고자 각각의 php 사이트를 별도의 fastcgi 프로세스로 분리를 해서 setuid/chroot 해버리기로 마음을 먹었습니다. 그래서, lighttpd에서 기본으로 제공해 주는 spawn-fcgi 유틸리티를 이용해서 일단은 만들어 봤는데, spawn-fcgi는 소켓을 만든 다음에, setuid, setgid, chroot를 한 다음에 php를 띄우는 순서로 하다보니, php바이너리는 물론이고 관련 라이브러리까지 모두 chroot 디렉토리 안에 넣어야 제대로 돌아가는 문제점이 있었습니다.

그래서, 아무래도 원하는대로 하려면, chroot를 하기 전에 php의 초기화를 모두 끝내고 나서 chroot를 해줘야하기 때문에, 알고보면 spawn-fcgi에서는 아무리 별짓을 해 봐야, 방법이 없고, 결국은 php 내부에서 해결을 해야 하는 문제로 판단이 됐습니다.

그래서 결국은 패치를 만들었습니다. 으흐.. php-cgi-sapi는 fastcgi와 cgi를 동시에 지원하느라 코드가 상당히 지저분하긴 했지만서도;; 하여간 패치하고 나니까, pear를 사용하지 않는 대부분의 php 프로그램들은 그럭저럭 잘 돌아가는 것이, 제로보드를 돌려도 안전할 것 같은 느낌이 드는군요 -ㅇ-;; 가급적이면 명령행 옵션으로 만들어서 메인스트림에 올렸으면 좋았을텐데, 명령행옵션이 이미 너무 많이 들어가있어서, 옵션들을 더 넣을라니 알파벳도 마땅찮고 --; 그래서 결국은 그냥 환경변수로 그냥 혼자 쓰는 패치로;; 으흐~ 포트 유저는 패치를 /usr/ports/lang/php5/files에 넣으시고 www/php5-cgi를 WITH_FASTCGI=yes옵션을 주고 깔으시면 됩니다~!

명랑하고 발랄하고 경쾌한 lighttpd 세상으로 오세요~ -O-

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


간단한 국어사전

#gentoo의 바둥옹이 웹 아닌 국어사전 없냐고 물어보셔서.. 원론적으로 말 그대로 해석해서 하나 만들어 봤습니다.

function kdic { w3m -dump 'http://kr.dic.yahoo.com/search/kor/search.html?p='$1 | awk 'BEGIN {d=0;} /검색결과/ {d=1;} /브라우저에/ {d=0;} { if(d) print $0; };' | less }

흐흐흐.. zsh사용자는 위에 대로 쓰시면 되고, bash 사용자는 {뒤와 } 앞에 다른 줄로 띄어 줘야합니다. 이렇게..

function kdic {
w3m -dump 'http://kr.dic.yahoo.com/search/kor/search.html?p='$1 | awk 'BEGIN {d=0;} /검색결과/ {d=1;} /브라우저에/ {d=0;} { if(d) print $0; };' | less
}

UTF-8 터미널 사용자는 $1을 `echo $1|iconv -f utf-8 -t euc-kr`로.. 결과는 이렇게 나옵니다.

miffy(perky):~% kdic 바보
 # 국어사전에서 검색결과 (총 10개중 1 - 10)

 바보

 바보 [바ː―] <명사> ①어리석고 멍청하거나 못난 사람. ¶그는 ~ 같지만 ~는
 아니다. <동의어> 치매(癡\ig21839).
 ②사람을 얕잡는 놀림말.


 쪼다

 쪼다^1 <명사> '바보'의 변말.

흐흐.. 자꾸 한줄 쓰고 그러면 토끼군처럼 되는데.. =3=3

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


한글 PuTTY 0.57 릴리스

exman님의 결혼을 축하드리는 기념으로 한글 PuTTY 0.57을 방금 릴리스 했습니다. -O-;

작년 10월쯤에 발표된 PuTTY 보안 버그패치도 적용하지 않고 있었는데, 2월에 또 하나 더 나와서 좀 더 버티기는 무리라고 생각하고.. 흐흐; 이번에 겉으로는 이런 것들이 바뀌었습니다.

  • IPv6 지원이 들어갔습니다.
  • 포워딩 같은 용도로 사용하기 위해 셸이나 명령어 실행 안하기 모드가 추가되었습니다.
  • 여러개의 SSH관련 보안 버그가 수정되었습니다.
  • 접속이 끊긴 창에서 새 창을 안 띄우고 그자리에서 다시 접속할 수 있게 되었습니다.
  • SOCKS 5 프락시를 위한 CHAP인증 기능이 추가되었습니다.
  • X포워딩과 리모트 포트 포워딩에 관련된 여러가지 버그들이 수정되었습니다.

늘 그랬듯이 이번에 외부적으로 크게 변한 것은 없는 반면에, 내부적으로 소스 코드에서는 상당히 많이 바뀌었는데, 특히 그동안 주 코드에 붙어 있었던 win32 지원 코드가 모두 windows/ 하위 디렉토리로 내려가는 바람에 이제 소스 레이아웃에서도 멀티 플랫폼의 냄새가 납니다. :) 그리고, 터미널 제어 코드들이 성능을 위해서 여기저기 많이 고쳐놔서, 성능이 나쁜 컴퓨터에서도 스크롤 속도가 그다지 느리지 않을 듯 합니다. 덕분에 기존에는 대충 근처만 invalidate하면 새로 그려져서 커서 패치가 쉬웠는데, 이번엔 정확하게 커서 위치를 맞춰서 그려야 제대로 그려지는 바람에, 한 이틀밤을 디버거 들고 씨름했네요.. 흐흐;; (바보~) ㅠ.ㅠ

특히 작년 초부터 시작된 PuTTY의 전역변수 제거 작업은 이제 어느 정도 단계까지 진행되어서, 터미널과 접속 관련된 대부분의 변수가 전역변수에서 벗어났고, 설정과 관련된 일부 변수들만 전역으로 남아있어서, SDI 인터페이스로 감싼다던지 하는 것도 쉽게 될 것처럼 보입니다.

그럼, PuTTY와 함께 즐거운 작업~ (;;)

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


자바스크립트에서 다른 프레임의 함수 호출하기

고객의 꿈을 실현하려는 도중에.. (.. 우어~) 자바스크립트로 도배가 되어 있는 웹 화면에서 숨은 프레임을 통해 서버와 통신해서 숨은 프레임이 또 상위 프레임을 제어해야 할 일이 생겼습니다. 양쪽에 모두 코딩을 하자니, 몇가지 전역변수에도 접근을 해야하기에 js를 양쪽에 모두 포함하기도 그렇고.. 여러모로 딱히 대책이 없어서 한참을 고민 끝에 하나 해결책을 만들었습니다. -O-

// parent 프레임에서 정의된 자바 스크립트 함수를 가져온다. 
function getFunctionFromParent(funcname, nargs)
{
  var expplace = parent.document.getElementById('funcexport_allowed');
  var proxyname ='_funcproxy_exported_'+ funcname;
  var fun = parent.document.getElementById(proxyname);
  if (fun)
    return fun.onclick;

  var argspec ='';
  for (var i = 0; i< nargs; i++) {
    if (i)
      argspec +=',';
    argspec +='arguments['+i+']';
  }

  expplace.innerHTML += (
'<input type="text"id="'+proxyname+'"'+
'onclick="return'+funcname+'('+argspec+');">');
  fun = parent.document.getElementById(proxyname);
  if (fun)
    return fun.onclick;
  else
    alert("자바스크립트 내부 에러입니다: 함수"+funcname+"이 정의 되지 않았음");
}

므흐흐.. 빈 구멍에 input 태그를 하나 넣고 거기서 onclick을 통해서 호출을~ 아아.. 깔끔하게 document.getScriptFunction 뭐 이런 것 있으면 참 좋을텐데 말이죠.

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


공중 무선랜 공짜로 쓰기

무선랜 서비스 AP가 요즘 지나다니다보면 정말 많이 잡힙니다. -o- 아 이거 등록을 해서 쓰기는 또 너무 쓸 일이 없고.. 가끔가다가 한번 쓰면 정말 좋은데.. 하고 참 아쉬운데, 언젠가 미국의 어느 호텔에서 IETF 회의가 있었을 때 IP over DNS 같은 ㅂㅌ 프로토콜들이 마구 만들어져서 단체로 돈을 안 내고 인터넷 했다는 얘기가 생각나서 해 봤습니다. 므흐흐

원리

원래 무선랜은 이런 과정을 통해서 접속하도록 되어 있습니다.

  • 서플리컨트(고객측 기계)가 AP를 스캔한 뒤에 접속할 AP에 접속(Associate)요청.

  • AP가 서플리컨트에 EAP-Start 보냄.

  • 서플리컨트가 원하는 인증 프로토콜과 껍데기 ID를 적어서 EAP-Response를 보냄.

  • AP가 받은 EAP-Response를 AAA(인증/과금서버)에 전송해서 답을 서플리컨트로 전송.

  • 인증이 완전히 끝날 때까지 3-4를 반복. (EAP-MD5는 2회, EAP-TLS류는 8~10회)

  • AAA측에서 EAP-Success가 오면 서플리컨트에 EAP-Success를 보내주고, 접속을 완전히 열어 줌.

  • 서플리컨트가 DHCP요청.

  • 정식으로 라우팅돼서 해당 망을 담당한 DHCP 서버가 IP 할당.

  • 끝.

  • 그런데, 우리나라 무선랜 서비스들은 사용자 가입 페이지를 보여주게 하기 위해서 자동 접속하게 하는 편법을 이용하느라 이런 방식으로 되어 있습니다.

  • 서플리컨트가 AP에 접속 요청.

  • AP는 가인증 상태로 서플리컨트의 접속을 열어 줌.

  • 서플리컨트가 DHCP서버에 IP 할당 요청.

  • DHCP서버에서 IP 할당.

  • CM(접속관리자)를 띄워서 AAA와 EAP 인증을 함. (물론 중간에 AP는 거침.)

  • AAA에서 EAP-Success를 보내주면 중간에 막아 놨던 포트들을 모두 열어 줌.

  • 끝.

  • 여기서 바로 문제가 되는 것은, 완전히 인증도 되기 전에 IP를 주고, CM 다운로드나 가입 신청 페이지같은 것을 제공해 주기 위해서, 몇몇 포트를 열어준다는 것인데, 국산 AP들은 대부분 53 udp, tcp를 그냥 열어버리고 80번은 투명 프락시로 어떤 호스트에 접속하던 ISP의 가입 페이지로 리다이렉트하도록 하고 있습니다. 여기서 바로 53번 포트가 열려 있다는 점에 주목! +_+

    응용

    53번 포트가 열려있으니 이제는 뭐 거기로 나가는 방법만! 우선 제일 세팅이 간단한 방법은 sshd를 53번 포트에 열어서 쓰는 방법.ssh -p 53 -L 8080:127.0.0.1:8080 대상호스트이런 식으로 하면 로컬 호스트의 8080번 포트가 sshd가 띄워져 있는 서버측의 8080로 포워딩되기 때문에, 서버측에 HTTP 프락시가 띄워져 있다면 웹도 다 쓸 수 있게 됩니다. 물론 좀 다르게 응용해서 53번 포트에 VNC나 rdesktop을 띄워놓는 방법도 있겠고.. 아예 L2TP를 어떻게 엮어버리면 완전히 VPN 터널로 응용도 가능하겠죠. 믓흥;

    현실적인 한계현실적으로는 53번 TCP 포트에 뭔가 터널에 응용할 수 있을만한 서버를 띄울 수 있는 사람을 대상이 제한됩니다. 따라서, 거의 대부분의 일반인은 사용할 수가 없고, 자기 서버를 갖고 있고, DNS 서비스를 안 하고 있는 경우에만 이런 방법이 사용이 가능하겠죠.

    해결책

    이런 방법을 막기 위해서는 53번을 모두 열어버리는 것이 아니라, AP의 기본 설정 DNS로 리다이렉트해버리는 방법을 접속을 허용하기 전에 사용해야 합니다. 그렇게 되면 53번을 아무리 열심히 시도를 해도 결국은 ISP측 네임 서버로 갈 것이기 때문에 딱히 방법이 없어집니다..:)

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


    RRD 다이어트!

    이제 슬슬 기나긴 솔로 생활도 탈출하고.. 정상인으로 돌아가기 위한 계획의 일환으로 몸무게 정상화 작전을 조금씩 해보려고 생각을 하고 있습니다. 그래서, 좀 더 과학적인 모니터링을 위해서 [WWW]rrdtool로 몸무게 그래프를 만들었습니다.

    http://openlook.org/cgi-bin/rrdfat/fat-monthly.png

    이 그래프를 이용해서 심각하게 분석을 해 보니까, 회사에서 밤새는 날 집중적으로 체중이 불어서 그 이후에 슬금슬금 내려오다가 또 밤새면 팍~ 오르고 그런 패턴이군요.. 결과적으로는 회사에서 밤을 안 새던가.. 밤새면서 뭘 먹지를 말던가 해야겠습니다. ㅠ.ㅠ

    아직은 직접 몸무게를 재서 rrdupdate를 수동으로 해 줘야 하지만.. 앞으로는 크론으로 하루에 한번 자동으로 자는 사이에 몸무게와 체지방을 재서 기록해주는 날이 오기를~ 혹시 관심있는 분은 [WWW]OpenLook CVS에서 다운 받아서 설치해 보세용~

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


    프로젝트 na0 시작

    프로젝트 [WWW]"수정"에서 동기를 얻어, 프로젝트 [WWW]"나영"을 시작했습니다. (우히히히) "나영"은 "수정"과 마찬가지로 또 다른 넘쳐나는 블로그 시스템 중의 하나로, 파이썬 기반의 MT클론을 목표로 느슨하게 벽돌쌓기식으로 개발될 예정입니다.

    아직은 구조 및 기능 디자인 중이고, 회사에서 휴일에 놀게 해 주면 진행이 좀 더 빨리 될 예정입니다.

    시작 기념 인터뷰~

    질문 왜 굳이 MT나 수정같은 좋은 블로그가 많이 있는데 또 파이썬으로 만들려고 그러나요? 답 그냥 만들고 싶어서요. -ㅇ- 질문 그것 참.. 뭐 하고 싶어 하는 일이니 말리지는 않겠습니다. --; 그런데 왜 프로젝트를 BerliOS에 열으셨나요? Sourceforge도 있고 KLDP.net도 있고 좋은 곳이 많은데요. 답 그것은!! 그것은!!! BerliOS가 현재 대형 프로젝트 사이트 중에서는 유일하게 SVN을 지원하기 때문입니다. svn mv에 맛들린 사람은 아무래도 CVS로 돌아가기가 곤란하죠? ㅋㅋ 질문 아.. 그렇다면, 프론트엔드 구조는 어떤 식으로 갈 건가요? 혹시 Zope로 만들어서 자기 혼자 쓰려는 건 아닌가요? 답 프론트엔드 계층 뒤에 Quixote를 붙일 예정입니다. Quixote는 프론트 엔드에 mod_python, twisted, cgi를 모두 지원하기 때문에 당근 "나영"도 다 지원을~ 이히힝 질문 오.. 쌈빡하군요. 그럼 데이터베이스는 어디에 저장되는 건가요? 기존에 하던 대로 파일에 다 저장해버릴 심산인가요? 답 흐흐흐. 아.. 최근에 PostgreSQL을 해 보면서 RDBMS에 필을 받았습니다.;; 그래 사람들이 이런거 쓰는 이유가 있었군! :) 그래서, MT처럼 퍼시스턴스 계층을 추상화해서 파일DB뿐만 아니라 PostgreSQL과 MySQL, 그리고 요즘 인기가 하늘을 찌르는 SQLite도 지원할 작정입니다. 질문 아아.. 당신도 이제 성격이 많이 죽었군요. 그렇다면 페이지 테마는 어떤 식으로 지원할 예정인가요? pyblosxom이나 MT처럼 간단한 치환 정도로? 답 아뇨. 원래는 ZPT로 밀어붙일 계획이었는데, Quixote를 프론트엔드로 쓰자면 아무래도 위젯 기반으로 가게 될 것 같아서. Quixote를 쓰는 다른 프로젝트를 좀 더 연구해 본 다음에 그냥 대세를 따를 작정입니다. 흐흐흐 질문 역시 별 수 없군요 ㅎㅎㅎ. 블로그 시스템들은 대충 정적 페이지를 만들어주는 녀석들과 동적으로 서비스하는 걸로 나뉘는데, 요즘은 아무래도 동적으로 서비스하는 게 우세인 듯 하죠? "나영"은 어떤 방식을 채택할 것인가요? 답 얼마전에 MT를 깔아보고 참 감동 받은 것이 정적 페이지 제너레이션이었습니다. 제 블로그만 해도 스팸 메일 주소 긁어가는 봇들이 한번 닥치면 아주 거의 서버가 죽을 지경으로 CGI가 뜨는데.. ㅠ.ㅠ 정적 페이지라면 이런 문제가 없어질텐데 말이죠 흑흑.. 가급적이면 정적페이지로도 웬만한 기능은 동작하도록 하고, 전부 동적으로 생성할 수도 있는 MT방식 그대로를 따를 작정입니다. 질문 아아.. 대단하군요. 지금까지 들은 말을 종합해 보면 아무래도 10년짜리 프로젝트를 시작하려는 것같은 분위기가 물씬 나는데, 당신의 전적으로 과연 릴리스나 한 번 할 수 있을지 걱정 되는데요? 답 하하하.. 네.. (.. 다소곳 --;) 질문 그나저나 왜 프로젝트의 unix name이 na0입니까? 나-제로라고 읽으라는 뜻인가요? 답 nayeong 하면 아무래도 좀 길어서 mt같이 짧은 애칭을 써보자 하고 na0로 했습니다. 앞으로 홈페이지에 열심히 써 놓아야죠. 흐흐 "How to pronunciate na0?": Say, "Nah-Young"! You must remember that it's not pronunciated "Nah-Zero". .... (문법이 맞는지는 모른다 --;) 질문 예. 부디 아무쪼록 10년 안에 프로젝트를 꼭 완성하시길 바랍니다. 답 고맙습니다. (_ _)

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


    한글 PuTTY 0.55.h1 릴리스

    다운로드 6000의 인기 소프트웨어 :) [WWW]한글 푸티 0.55.h1이 릴리스 됐습니다. 메인스트림 PuTTY의 예전 버전에서 발견된 보안 버그로 인해 조급해 하시는 분들이 많아서 좀 일찍 작업을 했습니다. 이번 업데이트는 그래도 비교적 벤더 임포트 이후에 머지하는데 컨플릭트가 하나밖에 안 나서 간단한 것이었지만 그래도 awkn`n님께서 많이 도와주셔서.. 이히히

    이번 한글푸티 릴리스부터는 ssh.c의 한글 번역을 모두 제거했습니다. 여기 ssh.c에서는 터미널에 직접 출력을 하게 되는데 푸티는 자체적으로 다국어 지원이나 실시간 인코딩 번역같은 프레임웍을 전혀 갖추고 있지 않기 때문에 한글 번역을 해 봐야, 터미널 인코딩이 CP949가 아니면 제대로 안 돼서 어쩔 수 없었습니다. 0.55의 주요 기능을 보니 아랍어 지원과 오른쪽에서 왼쪽으로 쓰는 언어 지원 (bidi)가 추가되고 있는게 다국어를 제외한 다른 다국어 지원은 정말 대단하네요... 다음 한글 패치버전부터는 꼭 멀티 플랫폼도 꼭 지원하도록.. (..)

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


    gDesklets-irc 국제화 패치~

    fender옹의 뽐뿌질에 혹해서 뽀대 데스크탑의 결정체 [WWW]gDesklets의 IRC 디스플레이 국제화 패치를 했습니다;; HanIRC는 utf-8이 아니라 cp949를 쓰다보니 아무래도 서양사람이 만든 gDesklets-irc가 제대로 돌아가기는 힘들었는데, 아무래도 gdesklets 센서가 파이썬이다보니 제법 쉽게 패치할 수 있었습니다. :D

    gDesklets의 좋은 점은 배경에 녹아있다보니 아무래도 회사원을 위한 플러그인이 아닐까하는! (배경을 한참 보고 있어도 뭔가 채팅하는 것임을 눈치채기가 쉽지가 않다 -.-!!) 입력 창도 마우스가 위로 올라가야지만 나오고.. 아무래도 원 저자도 회사에서 몰래 IRC하는 사람이 아닌가 싶군요 -o-

    0405-gdeskletsirc.jpg 전체 보기

    고친 것은~

    • 서버 인코딩 설정, 변환 지원 추가: 요 부분은 Twisted가 lineReceived, sendLine 메소드를 오버라이드 할 수 있게 만들어 놔서 다행히 쉬웠습니다~

    • 유저네임 바꿀 수 있게: HanIRC는 유저네임에 한글 쓰는 것을 허용하지 않는데, Twisted의 IRC 프로토콜은 유저네임에 닉네임을 그대로 쓰게 되어있어서, 한글 닉네임을 쓰면 접속을 거부하는 문제가 있었습니다.

    • 패스워드 지원: irssi proxy같은 것에 붙으려면 아무래도 패스워드 입력할 수 있게 해야~

    • 다국어 지원: 누가 어느 방에 들어갔습니다. 같은 메시지가 gettext처리가 안 돼 있었는데 고쳤습니다~

    • 이스케이프 버그 수정: 토픽에 <>가 들어가면 pango 태그 에러가 와장창 뜨는데 escape하도록 고쳤습니다. 외국 사람들은 토픽에 <>를 안 쓰는 것일까요? ;;

    • 글자 제대로 짜르게: 몇몇 부분에서 utf-8 문자열을 그냥 막 짜르게 했는데. str.split()을 하면 0xa0으로도 짜르게 되기때매 UTF-8에서 0xa0이 들어가는 부분에서 utf-8 문자열이 망가집니다. 요 부분은 유니코드로 쓰도록 고쳤습니다.

    • 한국어 번역추가: 흐흐흐

    패치는 업스트림 했으니 곧 반영 되겠죠? [WWW]패치 받기 [WWW]한국어 번역 받기

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


    Vim 끝나면 화면이 깨지는 문제

    요즘따라, [FreshPorts]x11/gnometerminal 에서 [FreshPorts]editors/vim 을 쓰다가 나오면 터미날 그러면서 그 다음부터 글자들이 다 깨져버리는 현상이 있었습니다. (흐흑 나만 그런건가 ㅠ.ㅠ)

    0405-gnometerm.png

    그래서 늘 vim갔다가 오면 reset; stty erase '^?' 해줘야하는데.. 어찌나 불편한지.. 그러나, 귀찮아서 그냥 늘 그렇게 쓰다가.. 드디어 더는 못 참겠다 해서 [FreeBSDMan]script 로 로깅을 해봤습니다. 그랬더니 바로 ISO-2022의 KS X 1001을 GL에 매핑하는 코드인 ESC $ ( C EM9L3N 을 출력하고서는 다시 GL을 ASCII로 안 돌려놓은 것.. 흐흑 그래서 그 다음부터 나오는 코드를 전부 그놈터미날이 KS X 1001이라고 가정해버려서 그런건데.. EM9L3N은 GL을 GR로 올려놓으면 '터미날'이 됩니다. 그런데, 그놈 터미날 문제인지, vim문제인지.. 아니면 또 다른 녀석의 문제인지 추적하기가 귀찮은 나머지.. ;; -ㅇ-; 그냥 임시 땜빵으로 alias vi=$HOME/bin/vimwrap하고서는 vimwrap에 다음 스크립트를 넣어버렸습니다.

    #!/bin/sh
    /usr/local/bin/vim $*
    echo '^[(B'

    (^[는 ctrl-v ctrl-[)

    으흐.. 일단 되기는 하는데.. 나중에 시간날 때 다시 자세히 해 봐야겠네요;;

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


    마그마 TV~

    지지난주에 갑자기 TV를 보고싶어져서, 시그마 TV라는 TV 카드를 샀습니다. 흐흐 덕분에 거의 TV 중독증세가 슬슬 --;

    그런데, 기본 프로그램을 좀 써보니 이게 원래 쓰던 사람과셈틀 것 보다 몇개가 상당히 불편한 것입니다. 항상 맨위에가 볼륨조절만 하면 풀리고 (정확히는 OSD 윈도우를 메인 윈도우 위로 임시로 올리고 내리다가 풀림) 리모콘으로 컴퓨터를 못 꺼서, 꼭 누워서 TV보다가 컴퓨터 끄러 와야해서.. 어찌나 불편한지.. 흐흐; 그리고 채널 돌릴때도 채널이 수십개 되다보니 돌리려면 참;;

    그래서, 필요함은 삽질의 어머니.. [WWW]마그마TV를 간단하게 만들어 봤습니다. 주요 기능은

    • 리모콘으로 리부팅, 윈도우 끄기 가능

    • 리모콘으로 채널 메모리 가능 (바로가기)

    • 리모콘으로 프로그램 실행 가능 (외부 스크립트 연결)

    • 시그마TV 항상 맨위에 풀림 방지 기능

    0404-magmatv.png

    므흐흐. 일단 1.0에서는 이정도로 하고, 나중에 시간날 때 다음 버전에서는 SigmaTV를 안 띄우고도 동작할 수 있도록 하는 것이나, 훌륭한 오픈소스 TV프로그램인 DScale 지원, 메신저창 임시로 확대해서 보여주기 등 기능을 넣어볼까 합니다. 므흐흐~;

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


    Mozex에서 한글 TextArea 고치기

    [WWW]Zope코드를 웹에서 좀 고치다 보니까 textarea에서 코딩하기가 너무 번거로워서 [WWW]Mozilla의 URL 클릭이나 textarea 수정을 외부 에디터로 빼주는 장난감인 [WWW]Mozex로 한번 써 봤습니다. 와와 gvim이 뜨고 아주 좋군! 하는데 한글이 우루루 다 깨지는 것.. 그러니까.. "한글"은 바이너리로 5C 00 이 되는데 즉, D55C AE00이 lower 8bit로 짤린 것이지요. 흐흐흑. 그래서, 모질라 자바 스크립트를 한참 삽질을 할까 해보다가, 역시 구글님에게 물어보기로 했습니다.

    역시나 [WWW]벌써 해결한 사람이 있군요.. 으흐흐.. 저기 있는 대로 해보니 한글이 잘 나옵니다.

    0404-mozexhangul.png

    기왕 고치는 김에 mozex 서브 메뉴로 안 내려가고 바로 메뉴가 뜨게 XUL도 좀 고쳐서 jar를 묶어 봤습니다. 필요하신 분은 써보세용~

    • [WWW]X11용 (인코딩은 UTF-8로 되어있음)

    • [WWW]Win32용 (인코딩은 EUC-KR로 되어있음)

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


    브랜치 확률로 최적화하기

    얼마전에 파이썬을 이리저리 컴파일하고 놀다가, 얻은 팁을 하나 씁니다. :)

    일반적으로 뻔히 나오는 NULL 포인터 체크나, 범위 검사 같은 조건절 같은 경우에 한쪽으로 가는 확률은 극도로 적습니다. 따라서, 이런 경우에는 분기가 많이 되는 쪽이 더 빨리 실행되도록 최적화를 하는 편이 좋은데, C 언어에서 뭔가 이런 걸 정해주는 문법적인 도구가 없기때매 컴파일러가 제 멋대로 판단을 하죠. 그런데, 언제 생겼는지 (아마 꽤 됐겠지만;;) gcc에도 브랜치 통계를 기반으로 한 최적화가 있더군요. 아주 간단합니다. -fprofile-arcs를 주고 컴파일을 한번 해서 실행하고, 그 옵션을 빼고 -fbranch-probabilities 를 주고 다시 컴파일하면 됩니다. 먼저 한번 실행하는 건 통계 자료를 모으기 위한건데 .da 확장자를 가진 파일들이 우두두둑 생성됩니다.

    파이썬을 컴파일할 때에는 OPT="-fprofile-arcs -O3" ./configure 해서 한번 컴파일하고 pystone을 한번 실행한 다음에, OPT="-fbranch-probabilities -O3" ./configure 해서 또 컴파일하면 대충 모듈 빼고는 그냥 다 됩니다. 므흐흐 그래서, 이렇게 컴파일한 결과! pystone이 17210에서 21057로 올라갔습니다. 공짜로 22% 향상! 꺄아. 히히

    아무래도 OpenSSL이나 아파치 같은 것들도 브랜치 확률 정보를 줘서 컴파일을 하면 좀 더 빨라질 것 같은 예감이 듭니다.. 근데 이건 아무래도 컴파일도 두번 해야 하고, .da 다루기가 까다로워서 바이너리 패키지 같은 데 쓰기는 좀 어렵지 않을까 하는 생각이 드는군요. ^_^

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


    에고서핑의 진수를 보여주마!

    ;;;; (앗;;)

    에고서핑([FOLDOC]egosurfing)을 늘 즐기는 퍼키군... (구글에서 자기 이름치고 낄낄낄거리는 ㅂㅌ모습을 상상하지 마세요;; ㅠ.ㅠ ) 급기야.. 자동으로 에고서프 검색 결과 개수를 그래프로 그릴 수는 없을까 고민하던 와중.. rrdtool을 붙잡고 해보기로!;; 결국 그렸습니다 으흐~; 6시간에 한번씩 크론이 떠서 검색하고 그래프를~

    여기-> GoogleStatistics

    소스도 올라가 있으니 심심하신 분 같이 해봅시다; -O-;

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


    ANSI/ISO/IEC C 타입의 실체

    지난 [WWW]8비트가 아닌 char 사건 때 C 타입이 그동안 알아왔던 것과는 다르구나 하는 느낌이 있었는데.. 새로 다른 쓰레드에서 IPv4 어드레스같은 용도를 위해 고정된 크기의 표준 타입이 있으면 좋겠다는 제안에 답변을 받으면서 C 타입을 새로 공부해야겠다는 생각이 들었습니다. 으흐흐;;

    [NoSmoke]원전의중요성에서도 누차 강조됐듯, 백날 C 책을 읽어봐야.. ANSI/ISO C 문서를 안 읽고서는 C를 안다고 말하기가 부끄러운 것인 것을 이제서야 깨닫게 되었다는.. ㅡ.ㅜ (진짜 원전이야 K&R white book이기는 하지만, 아직까지 K&R 문법만 지원하는 컴파일러는 대형 메인프레임/유닉스 서버에서나 볼 수 있는 것이니까;;)

    하여간, 찾아서 본 ISO C 문서에서의 바이트 정의는 이런 것이었습니다.

    byte addressable unit of data storage large enough to hold any member of the basic character set of the execution environment (실행 환경의 기본 문자 세트 전체를 담을 수 있을 만한 충분한 크기를 가진 주소 지정이 가능한 데이터 저장 공간의 크기)
    • NOTE 1 It is possible to express the address of each individual byte of an object uniquely. (각각의 바이트는 주소로 표현될 수 있다.)

    • NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit. (바이트는 연속된 비트들로 조합되어있는데 그 수는 구현에 따라 정의된다. 가장 낮은 비트를 low-order bit라고 부르고 가장 높은 비트를 high-order bit라고 부른다)

    즉, 그동안 수많은 입문서, 교과서, C 관련 서적, 상식서적, 수험서적에서 나왔던 "바이트는 8비트를 묶은 것을 1바이트로 부르는 단위다." 이런 것은 쌩판 거짓말이었던 것입니다. ;; 그리고, int, short, long등의 정의도 "16비트 컴퓨터에서는 16비트임" 뭐 이런 것과는 차원이 다른, 그냥 char 크기의 n배이다. 뭐 이런 정의 밖에 없다는 것을 발견할 수 있습니다. (크기는 구현하는 사람 맘대로..) 그런데, 진짜 크기를 구체적으로 지정할 수 있으면 얼마나 좋을까하는 생각에, 좀 더 찾아보니 POSIX 확장 헤더인 줄로만 알고 있었던 stdint.h와 inttypes.h가 ANSI/ISO/IEC C99에도 있는 것을 발견! (stdint.h는 7.18, inttypes.h는 7.8에) stdint.h와 inttypes.h에 있는 타입들은 extended integer types라고 부른다는데, stdint.h에는 int16_t uint32_t 이런 타입들이 정의되어있고, inttypes.h에는 [FreeBSDMan]fprintf 류 함수를 위한 PRI 시리즈와 [FreeBSDMan]fscanf 류 함수들을 위한 SCN 시리즈 매크로가 있는데, PRIdLEAST32 (fprintf의 %d에서 사용 가능한 가장 작은 32비트 타입), SCNuFAST16 (fscanf의 %u에서 사용 가능한 가장 빠른 16비트 타입) 이런식이네요..

    ANSI/ISO/IEC C 문서는 ANSI 홈페이지에서 30달러에 파는데, ISO 워크그룹 홈페이지에서 [WWW]마지막 드래프트를 공짜로 받을 수도 있습니다. 흐흐;;

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


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

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

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

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

    % shar `find py-rrdtool` > savannahimport 
    

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

    CVSROOT% cvs add savannahimport 
    CVSROOT% echo "savannahimport" >> checkoutlist
    CVSROOT% cvs ci

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

    DEFAULT (cd $CVSROOT;/bin/sh $CVSROOT/CVSROOT/savannahimport) 
    

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

    Checking in loginfo; 
    /cvsroot/py-rrdtool/CVSROOT/loginfo,v  <--  loginfo
    new revision: 1.3; previous revision: 1.2
    done
    c - py-rrdtool
    x - py-rrdtool/ACKNOWLEDGEMENT,v
    x - py-rrdtool/AUTHORS,v
    중략..
    x - py-rrdtool/src/_rrdtoolmodule.c,v
    x - py-rrdtool/src/rrd_extra.h,v
    x - py-rrdtool/src/rrd_format.h,v
    cvs server: Rebuilding administrative file database

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

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

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


    열린 한글 프로젝트 개설

    http://kldp.net/projects/hangul

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

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

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

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


    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의 세계는 멀고도 험난하구나~~;;)

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


    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에서는

    www(perky):~/cvswrap% size cvswrap 
       text    data     bss     dec     hex filename
     382062    8068    3944  394074   6035a cvswrap

    프비 5.1에서는

    sbtm(perky):~/cvs/snippets/cvswrap% size cvswrap 
       text    data     bss     dec     hex filename
       2155     264      36    2455     997 cvswrap

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


    한글 푸티 0.53b.h3

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

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

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

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

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


    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/ 에 있습니다.

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


    RFC를 PDF로!

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

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

    #!/bin/sh
    #
    # RFC -> PDF converter
    # by Hye-Shik Chang <perky@FreeBSD.org>
    #
    # This script is distributed as public domain.
    #
    # $Id$
    
    WGET=wget
    ENSCRIPT=enscript
    PS2PDF=ps2pdf
    TMP=/tmp/rfc2pdf.$$.
    
    if [ ! "$1" ]; then
            echo "Usage: $0 rfc# ...";
            exit 0;
    fi
    
    for num in $@; do
            echo "==> Retrieving RFC$num ..."
            $WGET -O "$TMP$num.txt" -q http://www.ietf.org/rfc/rfc$num.txt
    
            echo "==> Converting to PDF format ..."
            $ENSCRIPT --no-header --indent=7 --baselineskip=3 \
                    -o $TMP$num.ps < $TMP$num.txt
            $PS2PDF $TMP$num.ps rfc$num.pdf
    
            rm -f $TMP$num.ps $TMP$num.txt
    done
    

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


    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


    한일동시채팅

    [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


    모노 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


    CJKCodecs 1.0 릴리즈!

    와! 드디어 첫 번째 일반 공개 버전인 CJKCodecs 1.0을 릴리즈했습니다. 음훗훗~

    지난 1.0b1에 비해서 변한 부분은:

    • UTF-16 코덱이 삭제되었습니다. (속도도 표준 코덱에 비해서 딸리고, 별로 따로 있을 만한 이유가 없어서..)

    • UTF-7 코덱이 UCS4 파이썬에서 Surrogate Pair를 제대로 못 디코드하는 문제를 고쳤습니다.

    그 전의 0.9에 비해서 변한 부분은:

    • 새로 인코딩들이 추가됐습니다: SHIFT-JISX0213, EUC-JISX0213, ISO-2022-JP-2, ISO-2022-JP-3, UTF-7

    • Microsoft 코드 페이지들의 Windows 호환성 부분을 수정하였습니다.

    • StreamWriter가 미완성 문자떼(byte sequence)를 버퍼할 수 있게 되었습니다.

    • 몇 가지 자잘한 버그가 수정되었습니다.

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


    CJKCodecs 1.0b1 공개!

    그동안 심혈을 기울여 (--;;;) 제작하고 있던 CJKCodecs 1.0의 첫번째 베타 버젼을 공개했습니다.

    http://mail.python.org/pipermail/i18n-sig/2003-July/001607.html

    바뀐 점은 일본어 코덱 쪽의 버그를 대폭 고쳤고, 새로 JIS X 0213 계열의 인코딩들을 추가했습니다. 그리고, CJKCodecs에서 가장 구현이 어려웠던 코덱인 UTF-7코덱을 비롯한 UTF-16 코덱도 추가되었습니다.

    눈에 띄는 버그가 있는지 한 1~2주일 눈치를 좀 보다가, 1.0으로 정식 릴리즈를 하려고 생각하고 있습니다. :)

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


    쌔끈 굴림을 위하여!

    올해 초 LCD 모니터를 산 이후에 MS 윈도우 XP의 Clear Type (sub-pixel rendering)에 감동을 무진장 받았었습니다. "우와 이것이 바로 MS 기술의 승리! -_-;;"

    http://openlook.org/images/wiki/0307/timesnewroman-cleartype.jpg
    겨우 12픽셀 높이에서 나오는, 이 고아하기 까지한 초깔쌈 Times New Roman을 보라!

    그래서 한동안 영문 사이트만 즐겨 다니다가, "도저히 한글만 구리구리하게 나오는 것을 참을 수 없다!"하고 결심을 하고, 굴림체에서 sbit를 제거해서 MS의 위대한(!);;; Clear Type의 혜택을 받아 보고자, Just van Rossum의 [FreshPorts]print/py-fonttools 를 깔고, 굴림체 안에 들어있는 폰트를 모두 뽑아 보니 각각 90메가 씩 해서 총 400메가가.. -.-;;

    그래서, 덤프된 xml을 vim으로 근근히 EBDT, EBLC 테이블을 제거해서 우선 4개의(굴림,굴림체,돋움,돋움체) ttf를 얻었습니다. 이제 요걸 윈도우로 가져가면 되는데~ 아무래도 귀찮아서, makettc를 한 번 프비 베이스에 있는 doscmd로 돌려봤는데, 오오오!! 별 문제 없이 돌아가는 것이었습니다! (사실은 디렉토리 이름에 대문자가 들어가 있으면 실행이 안 되는 버그가 있었지만;;) 하여간, makettc로 딱 합쳐서, 긴장되는 순간 두구두구두~ 긴장되는 순간 윈도우에 딱 띄우자.. 털썩 털썩.. 꽥 꽥 꽥 야옹... 역시 고질적인 CJK 트루타입의 작은 크기 렌더링 문제가 발생하는..

    http://openlook.org/images/wiki/0307/gulim-sbit.jpg
    좀 밋밋해서 별로 정은 안 가지만, 그래도 봐줄 만 한 sbit먹은 굴림체 http://openlook.org/images/wiki/0307/gulim-cleartype.jpg
    MS는 얼른 Clear Type 엔진을 AA 짝퉁이 아닌 진짜 sub-pixel rendering으로 만들라!

    이렇게 되는 것이었습니다. 이런 대실망~

    으흐흑~ 아무리 봐도, Windows XP는 Clear Type에서 초기 렌더링부터 제대로 2x2를 충분히 활용한 게 아니라, 그냥 2x2크기로 AA를 한 게 아닌가 하는 인상을 지울 수가 없군요~ 무엥. (아니면 sbit에 알파 채널을 넣던가!)

    (오늘 놀이시간에 만든 일명 "LCD굴림"은 http://openlook.org/distfiles/lcdgulim.ttc.bz2 에 있습니다.)

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


    CJKCodecs, 젠투 입성!

    FreeBSD, Fink에 이어 Gentoo에 CJKCodecs가 패키지로 등록되었습니다. 므흐흐흐~~ 역시 iconvcodec 발표했을 때는 반응이 싸늘하던 것을 생각해보면 이름이 중요하다는 것을 깨닫게 됩니다. -O-;;

    CJKCodecs 다음 버젼인 1.0은 일본어 인코딩에서의 버그를 잡고, JIS X 0213 인코딩들을 추가해서 다음 주 중에 발표할 예정입니다.

    이제 데비안과 레드햇을 향하야~! =3

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


    파이썬 파일 오브젝트 버그 결과

    FILE *로 착각해서 다운되는 버그인 줄 알고 한참 디버거로 뒤졌으나 찾지 못해서, 그냥 버그 보고를 했더니만 Neil Norwitz가 ceval.c에서 파일 오브젝트의 레퍼런스 카운트를 들어가기 전에 1증가 시키고 나올 때 1 빼는 걸로 해결을 했습니다. 어쨌건 적용해보니 아주 잘 됩니다~! ^.^

    크흐~~ 역시 ceval에 대한 공부를 좀 더 해야겠습니다. (이 버그에 대한 픽스는 2.3b2부터 적용된다고 합니다.)

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


    파이썬 파일 오브젝트의 다운되는 버그

    홈페이지에 모인모인을 넣으려고 하다가 자꾸 파이썬이 세그폴트를 내고 죽기에 좀 삽질해서 여기저기 print를 넣어 자세히 살펴봤더니 파이썬 2.2이상에서 sys.stdout을 다른 클래스로 교체해서 그 클래스의 __getattr__ 안에서 sys.stdout을 교체해 버리면, sys.stdout이 정규 FILE *인 줄 알고 거기가 fprintf를 해버려서 다운되는 현상이 있었습니다.

    버그 재현을 위해 간추린 소스:

      1 
      2 
      3 
      4 
      5 
      6 
      7 
      8 
    
    #!/usr/bin/env python
    import sys
    class StdoutGuard:
        def __getattr__(self, attr):
            sys.stdout = sys.__stdout__
            raise RuntimeError("Premature access to sys.stdout.%s" % attr)
    sys.stdout = StdoutGuard()
    print "Oops!"

    에.. 디버깅해 볼까, 아니면 그냥 버그 보고만 하고 말까 생각 중~~ 히히 .

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


    누구?

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

    최근 댓글