FreeBSD 개발자 Ruslan을 도와주세요

FreeBSD 사용자 중에 경제적인 여유가 되시는 분들은 Ruslan을 도와주세요 페이지를 한 번 봐 주세요~

Ruslan Ermilov(ru@)는 우크라이나에 사는 FreeBSD 소스/포트 커미터입니다. 주로 베이스 툴과 라이브러리, 네트워크 관련 부분에서 FreeBSD에서 빼놓을 수 없는 중요한 개발자로 오랫동안 활동해 왔습니다. 그런데, Ruslan의 배우자가 오랫동안 암 투병 생활을 하다가, 결국 모스크바에 가서 수술을 받기로 했지만, 비용이 많이 들어서 심각한 걱정이 많다고 합니다.

FreeBSD 개발자들은 대부분 현업 개발자나 엔지니어들이다 보니, 현실 세계에서 어려운 사람도 드물지 않게 있습니다. 그동안 문제를 주변의 도움으로 극복한 사람도 있었고, 결국은 탈출하지 못하고 안 좋은 결과가 있었던 사람도 있었지만, 여러 헌신적인 노력을 보여주었던 그들의 노력에 힘을 주는 의미에서 경제적인 여유가 있으신 FreeBSD 사용자 분들은 약간의 도움을 부탁드립니다~

좋은 결과 있기를~ ^^

FreeBSD에서 rrdtool에서 한글 쓰기

rrdtool은 버전 1.2로 올라가면서 트루타입 글꼴을 직접 그리는 것으로 완전히 전환을 하는 덕에, 라틴이 아닌 글자를 그릴 수 있는 기능이 들어갔습니다. 그렇지만, 이 기능이 mbstowcs(3)
이용해서 멀티바이트 문자열을 와이드캐릭터 문자열로 바꿨기 때문에,
와이드캐릭터가 유니코드가 아닌 플랫폼에서는 엉뚱한 글자가 출력되는
버그가 있었습니다.

POSIX 표준에서는 wchar_t에 글자를 유니코드로 저장하는 것을 강제로 하지 않고 있기 때문에, FreeBSD나 MacOS X 같은 플랫폼들은 wchar_t에 각 인코딩에서 가장 표현력이 높은 단순한 내부 형태로 저장하고 있습니다. 예를 들어 EUC-KR에서 ‘한’은 C7 D1인데, 이것을 리눅스와 솔라리스에서는 ‘한’의 유니코드 표현인 D55C로 저장하지만, FreeBSD에서는 C7D1로 저장합니다. 따라서, mbstowcs를 유니코드가 출력이 된다고 가정하고 쓰는 것은 잘못된 사용이라, FreeBSD에서 한글을 못 쓰게 된 것입니다.

그래서, 마침 그냥 주말에 시험전증후군의 영향으로 산만해진 틈을 타서, 학교 중도 잔여좌석 그래프를 그리는 rrd 그래프를 하나 그려 보면서, 제목과 범례에 한글로 나오게 패치를 해 봤습니다. –;

흐흐.. 패치는 그냥 일단은 mbstowcs를 매크로로 덮어버리는 방법으로;;
업스트림하기 위해서는 automake에 iconv 검출하는 부분을 넣어 줘야하는데.. 이거 참 automake를 오랜만에 보려니 머리가 아찔한게 –;;;; ㅠ.ㅠ.ㅠ

— 그러나 — 패치를 다 하고 보니, FreeBSD에서도 UTF-8 로캘을 쓰면 wchar_t에 유니코드로 저장을 하기 때문에, 알고 보면 setlocale만 제대로 하게 패치하면 되는 것이었는데.. 괜히 오바해서 엉뚱한 것까지 해버렸네요 -O-;; 그래도 혹시나 euc-kr 쓰시는 분들을 위해;; _-_

구글 Summer of Code 2006

작년에도 굉장한 인기를 끌었던 Google Summer of Code가 올해도 더욱 더 커진 규모로 시행될 계획이라고 합니다. 이미 FreeBSD 프로젝트나 파이썬 소프트웨어 재단같은 멘터 기관들은 내부적으로 멘터들을 모으고 프로젝트 아이디어들을 모으느라 부산하게 움직이고 있습니다.

올해도 작년과 같이 각 단위당 학생 4500달러, 멘터 500달러로 상금을 주고 둘에게 각각 구글 티셔츠를 1벌씩 준다고 합니다;; 작년에도 프로젝트들이 대다수가 성공해서 상금을 받아간 것을 보면, 올해도 결과들이 무척 기대가 됩니다. 올해는 한국에서도 많이 참가해서 커밋로그에서 많이 보게 되었으면 좋겠네요~ 5월 1일 부터 참가 접수가 시작되고, 5월 8일에 참가 접수 완료해서 5월 22일에 멘터-학생 매치가 완료된 뒤에 발표가 나서 시작한다고 합니다.

약간 좀 거시기한 것은, 6월 말까지 중간까지 진행해서 중간 보고를 하기 때문에 한국의 학사일정하고는 안 맞아서 정작 설렁설렁 다니는 학생이 아니면 일정 맞추기가 쉽지가 않긴 한데.. 흐흐.. 아쉽네요~ (저도 7월까지 빡시게 여름학기를;;;)

최근 얼마 간의 데이터 쌓기

예전에 회사에서 일할 때, 초당 30만건 정도 들어오는 자료의 빈도를 세서 누적 데이터를 기준으로 5분, 1시간, 1일, 1주, 1달, 1년 최다 순서로 100개 정도씩을 보여주는 루틴을 만들 일이 있었습니다. 그 때는 뭐 회사 프로젝트도 검수 기간도 다 끝나고 영 제값 못 받고 한다고 생각하는 프로젝트였기 때문에, 그냥 대충 가장 단순하게 막 구현을 했더니 오방 느려서 하드웨어빨로 버티고 있었습니다. 나중에는 각 샘플링 별로 상위 10배수를 뽑아서 나머지를 버리는 등의 튜닝을 약간 해서, 처리속도가 데이터 들어오는 것을 못 따라가는 문제를 약간 해결해야하긴 했습니다. 🙂

물론 이렇게 하면, 정확한 이산 데이터를 합해서 하기 때문에 아주 정확한 자료를 얻을 수 있다는 장점은 있지만, 통계 기간에 들어가는 샘플의 수가 워낙 많기 때문에 속도의 문제나 기간의 제한 등 여러가지 문제가 산적해 있었습니다. 특히 가장 문제는, 샘플 저장 수를 줄이기 위해서 장기간의 통계용 샘플들은 정밀도를 줄여서 5분 데이터를 모두 모아서 1시간 데이터로 만드는 등의 작업을 거치기 때문에, 업데이트가 바로바로 되지 않는 문제가 있었습니다. 그래서, 그때는 그냥 뭐 병특도 끝나가고 해서 대충 넘어 갔는데 -ㅇ-, 얼마전에 여자친구 숙제를 도와주다가, 커널에서 load average 계산하는 방법을 보고서 이것을 게시판의 “최근 뜨거운 글 100개 목록”이나, 네트워크 장비들의 “최근 다발 접속 IP 100개” 같은 통계에 쓰면 좋겠다는 생각이 들었습니다. +_+ 벌써 다른 데서는 다 쓰고 있었는지도 모르겠지만; 이렇게 되면 보통 하듯이 하루 단위로 리셋되지 않고 부드럽게 꾸준히 업데이트되기 때문에 비교적 부하를 줄이면서도 쓸만한 데이터를 얻을 수 있지 않을까 싶네요~

그래서, 그 방법이 무엇이냐!
간단히 요약해서 다음 수식으로~

커널 소스코드에서는 sys/kern/kern_synch.c 부분에 있습니다.
x가 로드이고, s가 새로 들어오는 샘플, window가 원하는 통계 기간의 샘플 수 입니다. 이렇게 하게 되면, 새로 들어오는 샘플은 1-1/exp(1/window) 의 비율로 들어가고 그 다음부터는 1/exp(1/window)가 계속 곱해져서 살짜쿵씩 사그라듭니다. 적당히 원하는 보존 기간을 지나가면 무시할 수 있을 만큼의 비율로 없어지기 때문에, 데이터 값 1개만 유지하고서도 이산형 데이터 모두를 저장하는 부담을 줄일 수 있다는 점에서 그런대로 쓸만한 방법인 것 같네요. +_+

그래서, 과연 이 놈이 진짜로는 어떻게 없어지나 그래프를 한 번 그려 봤습니다. (x 축이 축적 횟수, y축이 최종 데이터의 반영 비율, 샘플 누적 목표는 10으로 했을 때)

그래서 대략 계산해 보면, 10개까지의 데이터들의 반영 비율이 63% 정도 되고, 2배수인 20개까지의 비율의 합이 86%정도 됩니다.
정확한 데이터는 아니지만, 데이터 계산을 연속적으로 할 수 있고 연산/저장량이 많이 줄어든다는 점이 장점이겠습니다.

그런데, 커널에서는 부동소수점 연산을 피하기 때문에, 이런 계산을 좀 더 재미있는 방법으로 하고 있는데, 이것도 한 번 눈여겨 볼 만합니다. 🙂 커널 소스의 cexp라는 fixpt_t형 배열에는 exp(-1/샘플수)의 값이 미리 계산이 되어 있어서 그냥 곱하기만 하면 되게 되어있기 때문에 e 계산이나 나누기를 하지 않아도 됩니다. 그리고, 사실은 이놈이 부동소수점형이 아니라, CPU에서는 정수형으로 취급되는 고정소수점형이라는 것~ 32비트 중에서 왼쪽 21비트를 정수영역, 나머지 11비트를 소수점영역으로 쓰는데, 1<<11 * 소수 이렇게 하면 간단하게 소수점 이하라도 쉽게 변환이 되고, 덧셈 뺄셈도 생각해 보면 그냥 정수 덧셈,나눗셈 인스트럭션으로 될 것을 알 수 있습니다. 그리고, 곱셈도 가능한데 둘을 곱한 다음에 소수 영역 길이인 11비트만 오른쪽으로 시프트 해주면 고정소수점 곱하기 한 것처럼 됩니다. (물론, 손으로 써보면 쉽게 증명이 됩니다. 🙂 후배한테 자랑했더니 요새는 학교에서 이런 것도 가르쳐 준다는군요 -.-;)

뭐 하여간.. 전에 회사에서 바쁘던 와중에 검색을 할 때는 좋은 아이디어가 딱히 안 떠오르고, 검색을 해 봐도 딱히 좋은 알고리즘이 안 떠올랐는데, 계속 곱하기만 해도 줄어든다는 것을 떠올리지 못한 것은.. 아무래도 수학 공부를 안 해서일까요 -.-a 그래서 이번 학기에 공수 불끈! +_+

파이썬 2.4.3 포트 업데이트 완료

어제 릴리스된 파이썬 2.4.3으로 lang/python 포트를 업데이트 했습니다. 이번에는 얼마 전에 lang/python-devel 포트에서 시험적으로 적용했던 pkg-plist 줄여쓰기를 메인 포트에서도 한 번 적용해 봤습니다. 원래 py, pyc, pyo를 모두 pkg-plist에 적어 두고 있었는데, 용량이 너무 커져서 파이썬 포트들만 모두 합쳐도 이제 1MiB가 넘어가는 판국이 되어서 pyc와 pyo를 빼고 awk로 중간에 처리를 하도록 해버렸더니 60KiB정도가 줄었습니다. 🙂 그리고, NO_NIS는 있으면서도 PORTMAP은 안 끈 시스템에서 설치하다가 파일이 없다고 에러나는 것도 rpcgen 대신 ypcat을 체크하도록 해서 고쳤습니다.

파이썬 2.4.3은 아주 마이너한 버그 패치들만 들어가 있기 때문에, 기능적으로는 특별히 볼 만한 것은 없지만, Coverity와 refleak check, buildbot 등 파이썬 개발팀에서 최근에 사용하기 시작한 완성도 높이기 덕택에, 자잘한 버그들이 정말 많이 수정되었습니다. (예를 들어 PyObject_Unicode(NULL) 하면 세그폴트 나버리는 문제라던지..) 완성도 관련이나 릴리스 자동화, 막판의 버그 픽스와 하위 호환성의 충돌과 관련해서 좀 더 깊숙히 할 얘기가 있는데 2.4.3 릴리스와 관련된 뒷얘기들은 다음 기회에 다시 자세히~

그나저나, 지금 확인해 보니 아직 넷비, 우분투, 젠투, 데비안, 페도라에는 2.4.3이 안 들어간 걸 봐서는 이번엔 프비가 대략 1등? ^_^;; =3=33 (시험 전날 공부는 안 하고 이런거나 –;;)

FreeBSD 6.1 무엇이 바뀌었나~

오랜만에 FreeBSD 관련해서 뭔가를 쓰는군요. ^.^
지금 열심히 릴리스 엔지니어링 막바지 작업이 진행되고 있는
FreeBSD 6.1에 관심이 많으실 듯 합니다. 유명무실했던
5.x대 릴리스를 딪고 일어서서 이제 본격적으로 안정버전 대열로
들어갈 6.1은 FreeBSD의 역사에서 매우 중요한 역할을 할 듯 합니다.

정적 링크한 darcs 패키지

그동안 버전 관리를 안 하고, 저자의 하드디스크를 rsync하는
방식으로 희한하게 배포를 해 왔던 Io가 엊그제부터 분산 버전 관리 시스템인 darcs를 쓰기 시작했습니다. (그동안 소스코드 버전관리를 안 한 이유는 여기에 적힌 까다로운 조건을 만족하는 것을 찾느라 그랬답니다.) darcs는 haskell로 작성되어 있고, 엄청나게 속도가 느린 것을 제외하면 기능상으로는 흠잡을 것 없이 아주 뛰어난 버전 관리 시스템인 것 같은데, 개인적으로 너무 불편한 것이 아직 ghc가 FreeBSD/amd64로 포팅이 안 되는 바람에, 제 컴퓨터에서는 쓸 수 없다는.. 그런 문제가 있었습니다. 흑흑 Y_Y 다들 커밋한거 받아보고서는 좋다~ 느리다~ 걱정된다~ 하고 있는데 amd64쓰는 죄로 소스도 못 받아보고 완전 왕따가 돼서..

그래서 amd64의 32비트 에뮬레이션 기능을 이용해 보려고 이렇게 저렇게 한참 노력해 봤지만, 동적 링킹에서는 도저히 어떻게 하는지 감이 잘 안 와서.. 결국은 포기하고 i386 머신에서 정적 링크를 해서 만든 패키지를 그냥 amd64에 까는 방법으로 했습니다.
그래서 결과로 나온 darcs-1.0.5.tbz 으흐흐.. 혹시 저처럼 또 왕따당하는 분이 있으실까봐 올려 봅니다. 그런데, ghc가 -static을 넣으면 정적 링크를 해 주는 것처럼 매뉴얼에는 써 있는데, 한참을 해 봐도 정적 링크를 안 해주더군요. 그래서 결국에는 ghc를 verbose mode로 돌려서 나오는 링크 커맨드를 그대로 쳐서 -static만 추가해서 하는 방법으로.. =.=

IoLanguage 포트 추가

중간고사도 끝나고, 이제 막 조발표와 프로젝트의 시즌이 다가왔습니다. 원래 바쁠 때 딴짓이 더 많이 생각나는 법이라, 올해가 가기 전에 실용주의 프로그래머 권고안의 “1년에 새로운 언어 1개씩 배우기”를 실천해볼까 하는 생각이 갑자기 들었습니다. -,.-; 그래서 io를 한번 보자하는 생각이 들어서 다운로드를 찾아봤는데, 배포하고 있는 바이너리 중 FreeBSD용이 4.x용에다가 i386용이라 7.0에 amd64인 제 컴퓨터에서는 아무리 호환성 라이브러리를 설치해 봐도 돌아가지를 않아서, 그렇게 난해하다는 io 직접 빌드하기를 한번 시도해 봤습니다.

한참동안 “이야.. 자연으로 돌아갔구나”하는 심정으로 Makefile을 수정해보면서 빌드하고 나니 그냥 다른 사람들 삽질도 줄여줄 생각으로 포트로 만들어 버렸습니다. lang/io로 등록했으니, 혹시 io 빌드의 압박으로 접해보지 못한 분은 한번 설치해 보셔도 좋을 듯~ -O- 기본 타입 튜토리얼만 한번 쳐 봤는데 색다른 맛이 있어서 기분 전환에 많은 도움이 되는군요. 🙂

FreeBSD 소식

오랫동안 진행됐던 새로운 FreeBSD 로고 투표 결과가 공식적으로 발표 되었군요. 8월초부터 초기 선정 패널로 참가하면서 800개 정도 되는 후보군에서 고르다보니까 저 로고가 상당히 그래도 예쁘게 보이는데, 처음부터 저 로고를 보는 분들은 좀 맘에 안 드는 경우도 있는 모양입니다. 그래서, 개발자들 사이에서도 로고 싫다 그냥 데몬만 쓰자 하는 사람도 있고.. 흐흐.. 그래도 일단 선정이 된 이상은 웹페이지, CD 디자인 등에서 많이 쓰이게 될 것 같군요. 저도 이제 명함을 붉은색 계열로 바꿔야겠군요 -O-;;

그리고, 방금 FreeBSD 6.0 릴리스 CVS 태그가 완전히 찍혔습니다.
이제 별 이변이 없는 한은 FreeBSD 6.0-RELEASE가 2~3일 안에 나오게 되었습니다. 🙂 5.0이 개발 브랜치에서의 릴리스가 좀 빛을 못 받았던 것을 생각해 보면, 6.0은 그 부분을 만회한 4.0 처럼 성숙하고 사랑받는 릴리스가 되기를 기원합니다.