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

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

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

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

오늘의 단어

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

웹앱스콘에 오세요~

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

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

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

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

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

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

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

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

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

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

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 클라이언트 입력창 옆에 시계를 붙여 볼까 생각을 해 봤지만.. 너무 삽질같아서 포기.;; -ㅇ-;

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

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

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

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

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

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

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

imyejinfree.user.js 설치 (greasemonkey)

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

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용 플러그인도 좀 배포를 해 주던지, 아니면 자바스크립트나 플래시로라도 좀 해 줬으면 좋겠네요. 그거 만드는데 얼마나 걸린다고..~