Archive for the 'Project' Category

정태영

마무리 해줘야할 일이 있어서 눈코뜰새 없이 바쁜 하루하루를 보내고 있습니다. 좀 미리 해놓을걸 하는 생각이 아주 절실히 드네요. 1월 한달간 풀타임으로 놀아준게 이렇게 타격이 될 줄은 몰랐습니다. -_-;

하여튼! 뭐 어떤 일을 하고 있었는지는 끝나고 얘기하기로 하고, (연애는 아니니 걱정마시길 후훗!) 이상하게 해야할 게 쌓여있을 땐 다른 일이 유독 재밌게 느껴지는 것 같아요. 어제는 스팸 필터가지고 이래저래 장난치다가 포스트도 두 개나 썼고 오늘 새벽엔 오랫동안 방치해놨던 웹메일 코드를 고치고 있었네요. 캬캬캬

http://mail_dev.unfix.net/list.php

이게 바로 그건데요. mail-test@unfix.net 주소를 고정시켜놓고 작업 중이라 수정한 코드를 바로 커밋하기가 좀 그렇네요. 그런데 저걸 처음 만들 때가 언픽스를 처음 시작했을 때였으니 벌써 한 7년 가까이 완성하지 않고 방치해두고 있는 것이었어요! 짬짬히 작업을 해서 한 번쯤 릴리즈해줄 때가 된 것 같습니다.

그나저나 코드를 수정하고 있으려니 이 간단한 걸 왜 예전엔 이해하지 못했을까 하는 자괴감이… ㅠ.ㅠ 지저분하게 작성해놨던 뗌빵 코드들을 하나하나 수정하다 보니 벌써 밤이 다 지나버렸습니다.

코드와 프레젠테이션을 분리하는 작업도 끝났으니, 로그인이나 메일 상자 선택 기능 정도를 만들고 css 를 살짝 입혀주면 다람쥐 메일 따위는 지워버려도 될 것 같아요. 캬캬캬

대강 어느정도 작동하게 만들고나면 디자인은 또 누군가가 도와줄거라 믿어요. 하여튼 얼렁 일을 마무리하고 쭈우우욱 다리 뻗고 자야겠습니다. -_-! 꺄홋! 다들 뜨거운 밤 야한꿈요~!

p.s) 도움을 주시고 싶으신 분은 mail_test@unfix.net 으로 다양한 형식의 메일을 쏴주세요~

p.s2) 사실 저 위에 있는 Remarkable 페이지도 업데이트 했는데, 워낙 인기없는 곳이라 ㅠ.ㅠ

정태영

예전 포스트에서 얘기한 적이 있던 제 yuvplayer 를 svn repository 에 추가했습니다. 관심이 있으신 분은 아래 링크를 따라가보시면 되겠네요.

http://trac.unfix.net/browser/yuvplayer

사실 한 달쯤 전에 올려뒀는데, 제 svn repository 는 저조차 잘 가보질 않기 때문에 아무도 몰랐을거라 생각합니다;; 흐흣~ Mac 용 버젼도 있는데, 이건 아직 넣고 싶은 기능들 중 구현을 안한 것들이 많아서 추가해두지 않았습니다.

visual studio 2005 기반으로 작업하다보니 프로젝트 파일등이 모두 vs2005 용이네요. 하여튼 uyuv, yuv444, yuv422, yuv420 등으로 된 파일을 플레이할 수 있고, 마우스 오른쪽 버튼을 누른 후 현재 프레임을 다른 포멧으로 저장하는 것도 가능합니다.

관련 포스트:
mac 버젼 - http://b.mytears.org/2007/06/541
windows 버젼 - http://b.mytears.org/2007/06/544

정태영

지난 이틀간 작업한 내 YUVPlayer for windows~! MFC + OpenGL 기반으로 작성되었고, 정말 아무 문제 없이 사용할 수 있을만큼 완성도 높게 작업해보기는 처음이 아닐까 싶다. (CUI 기반으로는 공개를 하고 있지는 않았지만 혼자 유용하게 쓰는게 몇 가지 있는데… GUI 기반으로는 정말 처음인 것 같다.)

단축키를 통해 모든 액션을 취할 수 있고, 드래그앤 드롭을 통한 파일 오픈 또한 가능하다. 게다가 _lseeki64 같이 64bit offset 을 사용하는 시스템 콜을 사용하고 있기 때문에 2GB 를 넘어가는 파일들도 문제 없이 플레이가 가능하다. (31GB 짜리 파일도 문제 없이 플레이가 가능한 것을 확인했음.)

위 스크린 샷은 기본적인 플레이 화면! CBitmapButton 을 통해 이쁜 플레이어 버튼을 만들었고, 여러가지 편법을 통해 –;; 사이즈가 조절되더라도 저 레이아웃이 그대로 유지되도록 만들었다.

(more…)

정태영

저번 주에 개인적으로 de-interlacing 관련된 발표를 준비하느라 논문에 있는 de-interlacing 기법들을 구현해서 실험을 했었는데, 맥에서 돌아가는 yuv player 를 못찾는 바람에 결과는 윈도우로 옮겨서 확인해야하는 불편이 있었다.

랩에 이미 충분히 쓸만한 yuvplayer 가 있기는 하지만 윈도우 전용이고, 내가 예전 신입생 과제를 하면서 만들었던 플레이어 역시 윈도우용;; 뭐 하튼 플레이어를 구현하는데 필요한 기반 테크닉은 다 갖추고 있었기 때문에 MFC + OpenGL 로 구현해봤던 것을 똑같이 Cocoa+OpenGL 로 구현해봤다.

메뉴를 이용해서 size 와 color format, frame rate 등을 준비할 수 있도록 만들었는데, size 와 frame rate 를 사용자가 직접 입력하는 것은 귀찮은 관계로 나중에 -_-;;

뭐 하튼 Zoom 하고 Drag And Drop 과 관련된 코드만 추가하고 나면 내가 구현하고 싶었던 모든 기능이 다 들어가는 거 같다. (Zoom 이야 glPixelZoom 을 사용하면 한방에 오케이니 흐흣)

XCode + Interface Builder 를 이용한 첫 결과물인데, 굉장히 오래전에 이미 나와있던 프로그래밍 인터페이스인데도 불구하고 굉장히 편리하게 프로그래밍이 가능해서 감탄을 해버렸다. 물론 MS 진영도 Visual Studio 2005 로 오면서 편리한 기능들이 꽤 많이 추가되긴 했지만, GUI Application 을 만들기 위한 IDE 로는 XCode + 인터페이스 빌더 쪽이 한 수 위인 듯…

MFC 나 Cocoa 나 진입 장벽이 꽤 높지만… 기본적인 테크닉을 익히고 나면 굉장히 강력하게 사용이 가능한 것 같다. 그리고 C 에 능숙하다면 다른 언어를 접하는 데도 그리 큰 어려움을 느끼지 않는 것 같다. 학부 시절 C++, Java 등에 눈길을 뺐기지 않고 주력 언어로 C 를 선택했던 게 탁월한 선택이었던 듯…

p.s) 코드를 좀 정리하고 sourceforge 등에 자리를 틀어볼까 싶네요. :)

정태영

세이군님이 자신이 참여했던 오픈소스 활동을 정리하신 걸 보고 저도 따라해 봅니다. 하하핫

  1. X-Chat 2
  2. 거의 제일 처음으로 해본 패치이자 가장 의미 있었던 패치가 아니었나 싶다.

    딩딩 바이러스 라고 불리던 멀티바이트 닉 컴플리션 관련된 버그와 노틸러스에서 한글 파일을 드래그 앤 드롭했을 때 생기는 문제를 해결하기 위한 패치들을 작성했었다. 하지만 원인을 해결한다기보다 약간의 추가코드로 버그를 피해갈 수 방법만을 제공한 것 같아 조금 아쉬움이 든다. -_-;; (패치 리포트는 류창우님이 하셨지만 제가 만든 패치입니다 -_-v)

    http://gnome.or.kr/wiki/GnomeTips?a…on=highlight&value=xchat#s-2.5

    http://sourceforge.net/tracker/inde…&group_id=239&atid=100239
    http://sourceforge.net/tracker/inde…&group_id=239&atid=100239

    딩딩 바이러스의 경우 utf-8 로 표현된 한글에서 앞의 첫 혹은 두 바이트만이 매칭되는 경우에 생기는 문제로 for ( i = 0 ; i < strlen(str) ; i++ ) ... 식으로 된 코드를 while( utf8_get_next_char(str, &pos) ) ... 정도로 수정하는 게 훨씬 훌륭한 방법이었다고 생각하나 그러기엔 손델 곳이 너무 많았다. 현재는 관련된 부분이 재작성되서 내 패치가 필요없게 되어 버렸다. (그래도 한동안 X-chat 메인 스트림에 포함되어 있던 패치 -_-v)

    그리고 nautilus 에서 drag and drop 을 할 때 문제가 생기는 것은 file 의 경로가 file:///home/aqua/%EA%B0%80 식으로 url_quote 되서 오기 때문이었는데, 이를 해결하기 위해선 fopen/fread/fwrite 등의 stdio 계열 api 대신 gnome_vfs api 를 사용하면 되는 것이겠지만! 당시 X-chat 은 gnome lib 와 링크되고 싶어하지 않았기 때문에 어쩔 수 없었다고 생각한다.

  3. gimageview
    정확히는 기억나지 않지만 gtkmmviewer 라고도 불리는 gimageview 는 xinerama 에서 최대창 모드를 했을 때 약간의 문제가 있었던 것 같다. 이건 문제를 정말 깔끔하게 해결하는 패치였는데, 아직도 받아들여지지 않고 있다.

    이 패치를 적용해본 다른 분이 ‘완전 최고에요. 얼렁 적용해주세요!’ (내가 보기에만 저렇게 보인 걸지는 모르겠다.) 정도의 메시지를 남겼는데, 메인테이너가 확인을 안하는 것 같다. 흑흑…

    http://sourceforge.net/tracker/inde…038;group_id=39083&atid=424295

  4. mod_autoindex hack
  5. 아파치의 기본 모듈인 mod_autoindex 의 프레젠테이션 관련해서 약간의 수정을 가했던 작업! 내가 제일 유용하게 사용하고 있는 기능 중 하나!

    처음에는 테이블 기반이었고, Quick and Dirty 가 무엇인지를 보여주는 코드였다. 하지만 백업 하드를 날리면서 패치를 잃어버리게 된 후, kukie 씨의 도움을 받아 css/xhtml 로 변경했고 사용자가 cssfile, encoding 등을 설정할 수 있도록 기능을 확장했다.

    결과물: http://mytears.org/resources/
    관련 포스트: http://b.mytears.org/2005/08/233

  6. proftpd: mod_codeconv patch
  7. 서버에 파일이름이 모두 utf-8 로 저장되기를 바라면서 mod_codeconv 를 적용해 보았지만, mod_codeconv 는 global 영역에서 밖에 설정을 할 수가 없길래 scope 관련해서 했던 작업. 패치를 원 저작자에게 보내주려 했지만, 메일주소가 변경되었는지 메일이 전부 반송되서 피드백을 하는데는 실패!

    관련 포스트: http://b.mytears.org/2005/08/234

  8. mytrz-dviewer
  9. 주위 사람들이 내 mod_autoindex 를 보고 자신도 쓸 수 없는지 물어보길래… 비슷한 역할을 하는 스크립트를 작성해서 BSD License 로 공개를 했다. 나름 구현하고자 했던 기능을 전부 구현했고, 사용자들의 피드백도 더 이상 없어서 버젼업이 멈춰있다. -_-;

    mod_rewrite 를 사용가능한 경우를 위한 패치를 할까 말까 고민 중…

    결과물: http://mytears.org/tmp/dir/
    관련 포스트: http://b.mytears.org/2005/08/227

  10. wordpress: korean trackback plugin
  11. 까나리 옹이 이글루스에서 날려준 euc-kr 트랙백을 제대로 받기 위해 만든 hack! 관련 논의가 wordpress trac 에서 이루어지고 있지만, 이틀정도 반짝 관심을 가지고 있다가 요새 좀 정신이 없는 관계로 관심을 가지지 못하고 있다. -_-;;

    wordpress 에는 trackback 을 다 받고나서 저장하기 전까지 plugin 이 간섭할 수 있는 포인트가 전혀 존재하지 않으므로, 이미 저장된 포스트를 update 하는 방식으로 구현해야만 했다.

    관련 포스트: http://b.mytears.org/2006/09/396

  12. gentoo ebuild
  13. 간간히 gentoo bugzilla 에서 한글 관련 문제라거나, 새로운 패키지 등을 리포트 하는 작업을 하고 있다. (나름 대게 많이 참여했던 거 같은데 검색해보니 별로 많이 안나오네요 -_-;; )

    http://bugs.gentoo.org/buglist.cgi?…038;type0-0-0=noop&value0-0-0=

  14. websvn
  15. websvn 의 템플릿 파일을 svn repository 에 저장하고 websvn 을 통해 보게 되면, 무한 룹에 빠지게 되버리는 버그가 있었습니다. 버그를 리포트하고 해결책까지 제시했지만, 뒷북이었다는 걸 나중에 알게 되었습니다.

    저런 중요한 버그는 정식 릴리즈 버젼에 패치를 백포트 한 뒤 얼른 새 버젼을 릴리즈 해줘야 했었다고 생각하는데… 뭐 하튼 지금 생각해보면 그런 얘기를 전혀 하지 않았던 게 약간은 아쉽네요.

    http://websvn.tigris.org/issues/show_bug.cgi?id=97

그 외에도 gd 의 gdImageCopyResampled 에서 x, y offset 을 제대로 적용하지 못하는 버그, unalz 파일이름 인코딩 변경 관련해서 패치를 보냈었지만… 이미 기록은 찾을 수가 없다. 그리고 막상 이것저것 많이 했었던 거 같은데 정리하려고 보니까 생각이 안납니다. ㅠ_ㅠ

대게 정식 i18n 패치라거나, 범용성 있는 그런 패치를 만들기보다는 현재의 문제를 해결하려한다거나 나만이 필요한 기능을 hack 으로 구현해버리는 작업을 많이 해서 더 보여줄 게 없는지도 모르겠네요 ㅠ_ㅠ

정태영

금요일이 프로젝트 미팅이라 뭔가 성과를 보여줘야 하기 때문에 이틀동안 열혈 코딩한 결과 btree 가 대강 완성되었습니다.

원래 btree 의 api 대로라면 insert, search, delete, range retrieve 등을 구현해야겠지만… 제가 쓰려는 곳에서는 값이 있으면 업데이트 (+1), 없으면 삽입… 이 두 가지 동작만이 필요하기 때문에 저 두 가지 만을 구현했습니다. (사용 용도상으로는 hash index 가 더 맞았을 겁니다.)

이제 남은 건 btree 에 삽입된 결과를 토대로 inverted btree index 를 구축하는 부분인데 이건 range search 를 할 일이 많을 듯 싶어서 b+-tree 로 구현을 할까 싶기도 한데… 일정 보고 결정해야겠네요.

새 노드가 만들어지는 경우는 split 이 일어날 경우 뿐이고 split 이 일어난 후에는 원래 값을 넣으려던 노드, 새로 만들어진 노드, 상위 노드 순으로 디스크에 write 가 일어나기 때문에… 마지막 블럭이 루트 노드라는 전제를 깔고 테스트를 하다가 완전 삽질했습니다. 실제로 사용될 땐 데이타 파일에 offset 이 저장되기 때문에 상관이 없었을테지만… 뭐 하튼 테스트 하는데 문제 없도록 살짝 고쳐놓았습니다.

뭐 하튼 b-tree 의 insert 시에 어떤 식으로 흐름이 진행되는지 보고 싶으신 분은 제 소스를 참고해보시길… 캬캬캬

url: http://trac.unfix.net/browser/btree/src/

나중에 disk cache 를 구현하기 위해 read, write, EOF 를 구하는 부분은 추상화 시켜놓았습니다. 캬캬캬

p.s) b*-tree 의 prev, next 노드로의 값 분산도 구현을 해볼까 싶었는데 별로 큰 도움은 안될 듯 해서 과감히 제거해버렸습니다 -_-v

참고: b+-tree 는 실제 데이타는 leaf node 에만 저장하는 자료구조이며 (non leaf node 는 key 와 child node 로의 포인터만을 가집니다.), b*-tree 는 값을 넣으려는 노드까지 갔는데 노드가 가득 찬 경우 앞 혹은 뒤쪽 노드로 값을 분산시키고… 만약 앞/뒤 모두 가득 차 있다면 2개의 노드를 3개로 split 하는 식으로 동작하며 노드가 70% 이상 채워져있음을 보장해줍니다. (b-tree, b+-tree 는 50% guarantee)

정태영

프로젝트 발표가 11월 초라는 소문을 듣고 발등에 불이 붙어버렸다. 핵심이 되는 btree 의 경우 대부분 구현을 한 듯 싶기는 한데… 디스크에서 block 단위로 읽고/쓰기를 매번 하게 되면 아무래도 성능 상의 문제가 있을 듯 해서 디스크 캐쉬를 구현하기로 했더니 작업할 게 갑자기 불어나 버렸다. (이러다가 귀찮아지면 커널의 디스크 캐쉬에 의존하게 될지도 모르겠다 -_-)

첫째로 캐쉬에 있는지를 체크하는 부분을 binary search tree 로 구현을 할까 싶었는데 skewed tree 가 될 경우 o(n) 이라는 극악한 time complexity 가 나오므로 AVL 을 이용하도록 방향을 수정했다. 둘째로 cache replacement algorithm 을 위해 min heap 을 추가로 구현해야 할 듯 싶다. 그리고 마지막으로 btree 에서 block 이 free 가 될 경우가 생기는 데 (delete, merge), 이 경우에는 block pool 을 만들어서 관리를 해야할 지도 모르겠다. 점점 할 게 많아지고 프로젝트가 커져간다.

뭐 하여튼 bst 는 예전 자료구조 시간에 작업했던 게 있기 때문에 그걸 기반으로 코드를 정리하는 중… 요번 주 내로 bst, min heap, b-tree (b*-tree 에 가까워졌지만) 를 모두 구현하고 다음 주에 있을 프레젠테이션 자료를 만들어야겠다.

코드를 구경하고 싶으신 분은 아래 url 을 참조하시길 (곧 libavl, libheap 이 추가될 예정)
http://trac.unfix.net/browser/libbst
http://trac.unfix.net/browser/btree

p.s) 꼭 자료구조 과제하는 기분이다 -_-; 코드 정리가 끝나면 혹시나 가져다 쓰고 싶으신 분들이 있을 지 모르니 라이센스나 정해서 명시해놔야겠다.