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

우리말 도우미

예전에 올렸던 우리말 도우미를 한동안 잊고 있었는데 불여우 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 개 | 트랙백 5 개 (보낼곳) | 태그 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다~)