XLA를 소개합니다.

최근 업무 관련해서 XLA를 알게 되었는데, 재밌는 프로젝트인데 반해 관련된 자료를 찾는게 쉽지 않길래 한번 소개를 해보면 좋을 것 같다는 생각이 들었습니다.

우선 XLA (Accelerated Linear Algebra)는 Tensorflow의 서브 프로젝트로 그래프 연산의 최적화 / 바이너리 사이즈의 최소화 등을 목적으로 하는 컴파일러입니다.

Continue reading XLA를 소개합니다.

slacker 기반 slackbot 만들기

재밌어보이길래 python으로 간단한 슬랙봇을 만들어볼까 하고 알아봤더니 slackbot이란 모듈을 사용하면 슬랙봇을 쉽게 만들 수 있을것 같아서 슬랙봇을 만들어봤다.

그런데 파이썬 프로세스는 멀쩡하게 살아있지만 하루 정도가 지나면 봇이 disconnected 상태로 바뀌는 문제가 지속적으로 발생하는 문제가 있었다. 관련해서 예제 코드들을 찾아봐도 별다른 부분이 없길래 며칠 동안 디버깅을 하면서 문제를 해결해봤다.

우선 인터넷에 떠도는 slacker 기반 echo 봇의 기본 골격은 아래와 같았는데…

Continue reading slacker 기반 slackbot 만들기

지멋대로의 영어를 더 자주 볼 수 있었음 좋겠습니다.

이 글은 More Bad English, Please란 글을 번역한 글입니다. 🙂
약간의 의역과 오역이 있을 수 있으니 양해 바랍니다.

메일링 리스트에서 어색한 영어를 더 많이 볼 수 있었음 좋겠습니다. 그리고 메일링 리스트에서 비영어권 사용자들의 어색한 영어에 대한 사과를 그만 볼 수 있었음 좋겠습니다. 제 2, 3, 4 외국어를 사용해서 대화를 시도해보는 것에 부끄러워하지 마시기 바랍니다. 만약 영어에 대한 두려움/당황감 때문에 비영어권 사람들이 참여하지 못하는 분위기를 만들었다면 그것이 바로 부끄러워해야할 점일 것입니다. 이런 사용자들의 질문이나 공헌들을 통해 FLOSS 프로젝트는 더욱 성공적으로 나아갈 수 있습니다.
오픈소스의 대단함 중 하나는 여러 나라의 사람들이 함께 작업을 한다는 것입니다. 누구나 찾을 수 있는 진정한 “잡탕 냄비”이죠. 오픈소스에 참여하는 사람들 중 공통으로 사용할 수 있는 언어가 영어이다 보니 메일링 리스트에서는 주로 영어를 사용합니다. 하지만 대부분의 경우 영어는 그들의 모국어가 아닙니다. 심지어는 그들이 구사하는 제 2, 3 외국어 조차 아니기도 할 정도이며, FLOSS 메일링 리스트에 참여하는 것이 영어로 글을 작성하는 유일한 경험인 사람들도 있습니다. 그러다보니 다양한 문화적 시각을 가지게 되고, 이들이 구사하는 영어들도 그리 완벽하지는 않습니다.
만약 내가 받는 메일 중 “poor English”에 대한 사과가 포함된 메일 각각에 따라 $1씩을 받았다면, 은퇴 후에도 아주 편안하게 살 수 있을 정도일겁니다. 하지만 이런 사과를 하실 필요는 없습니다. 오히려 더 목소리를 더 크게 내시기 바랍니다. 메일링 리스트에서 어색한 영어 표현을 더 많이 볼 수 있었음 좋겠습니다.
누군가와 생산적인 대화를 하기 위해 들이는 노력에 대해 당황스러워하거나 그 사람을 부끄럽게 생각하는 경우는 없습니다. 정신과 수련의 방(room for improvement)이 있다면 대부분 새로운 언어를 배우거나 자신의 언어 능력을 높이기 위해 지속적인 노력을 할 것입니다.
자신의 언어 능력에 부끄러움을 느끼는 사람들은 아무래도 더 적게 말하곤 합니다. 자신의 말을 못알아들을까봐 두려워 질문을 머금고만 있곤 하죠. 예전에 자신이 전하려고 했던 것이 전해지지 않았던 것이 기억나서 생각을 표현하지 못하기도 합니다. 제가 Novell에 있었을 때 가장 좋았던 것은 세계에 퍼져있는 오픈소스를 사랑하는 사람들을 만나 이야기해볼 수 있었고, 커다란 커뮤니티의 일부가 될 수 있었다는 점입니다. 아쉽게도 제가 만나봤던 사람들 중 많은 사람들이 자신의 영어가 능숙하지 못하다는 이유로 당황했었습니다. 함께 토론에 참여하길 유도했던 많은 공헌자들이 자신이 못알아들을 것을 두려워해서, 자신의 영어 부족한 영어가 부족하다는 이유를 내세우며 토론에 참여하기를 꺼렸습니다.
그저 두려움 뿐이었을 수도 있습니다. 자신의 영어 때문에 걱정이라고 표현했던 사람들 중 많은 사람들의 경우 아주 유창한 영어를 구사하지는 못했지만 우리가 알아듣는데는 별 지장이 없을 정도의 영어를 구사할 수 있었습니다. Even when there is a moderate language barrier, there should be no shame felt or conveyed for someone trying to participate in their non-native language. 누군가가 한 가지 언어 밖에 구사하지 못해서 다른 사람들에게 그 언어를 사용하게 한 경우라면 진정 부끄러워해야할 것입니다.
전 Seth Godin이 쓴 Linchpin을 읽어본 적이 있습니다. Seth는 좋은 일, 예술 등 그들이 할 수 있는 가장 생산적인 일을 하는 것을 막는 두려움에 대해서 아주 강력히 얘기합니다. 제가 생각하기엔 이런 두려움 때문에 사과를 하는게 아닐까 싶네요. 다른 사람들만큼 그 언어로 잘 이야기 하지 못한다는 이유로 거절당할까하는 두려움, 내 말을 못알아듣지 않을까 하는 두려움, 단순히 무시당하지 않을까 하는 두려움 말이죠.
하지만 이런 일은 없습니다 아니 최소한 있어서는 안될 것입니다. 대부분의 커뮤니티에서는 공헌자로써 시간을 써준 것을 가치있게 생각합니다. 그리고 누구나로부터 이야기를 듣기 위해 노력하고 있죠. 누군가 좋은 일을 하고 있거나 배우려 노력하고 있는 상황이라면 그걸 이해하기 위해 약간의 노력을 더 해야한다고 하더라도 누가 신경이나 쓰겠습니까? 가끔은 엉망인 영어에 가려져 있지만 함께 일하고 싶을 똑똑하고 재능있는 공헌자들을 찾을 수 있습니다. 그러니 메일링 리스트에서 엉망인 영어를 더 자주 볼 수 있었음 좋겠습니다. 그리고 아마 그래줄거라 믿습니다. 이 말을 여기저기 퍼트려주세요.

공개 서체: 네이버 나눔고딕_코딩

얼마전 네이버에서 고정폭 서체인 ‘나눔고딕_코딩’ 서체를 OFL(Open Font License)로 공개하였고, gd를 이용해서 뽑은 12pt 샘플은 다음과 같습니다.

나눔고딕_코딩 12pt 샘플

gd의 문제로 인하여 영문과 한글의 폭이 동일하게 출력되었는데, 맥이나 윈도우, 리눅스(약간의 설정 필요) 등에서는 영문과 한글의 폭이 2:1 이다보니 서체 이름에서와 동일하게 코딩용으로 사용하기에 딱이겠네요.
* http://dev.naver.com/projects/nanumfont
덧: 서체 이름에 사용된 언더바(‘_’) 때문에 맥에서 약간의 문제가 있었는데, 서체가 업데이트 되면서 이름이 ‘나눔고딕코딩’으로 바뀌었고, 맥에서도 문제 없이 사용할 수 있게 되었습니다.

YUVplayer for MS Windows

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

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

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

File 메뉴에서는 YUV file 을 열거나 원하는 프레임으로 가는 등의 동작이 가능하다.

File 메뉴에 있는 Go 버튼을 누르거나 단축키 ‘g’ 를 누르게 되면 위와 같은 창이 뜨게 되는데… frame no 필드에는 기본적으로 현재 플레이되고 있는 프레임 번호가 입력되어 있도록 만들었고, 저기에 원하는 프레임 번호를 입력하게 되면 바로 점프가 가능하다.

이건 마우스 오른쪽 버튼을 누르면 나오게 되는 컨텍스트 메뉴! 현재 보고 있는 프레임을 파일로 저장할 수 있는 메뉴들을 제공하고 있다. Luminance 성분은 raw 포멧, YUV* 은 YUV 포멧, RGB 는 32bit BMP 포멧으로 저장된다.


yuv file 은 header 가 없이 데이타만 주루룩 들어가 있는 형태이기 때문에 size 를 알 수가 없으므로 직접 사이즈를 지정해줘야 하는데, 기본 사이즈는 내가 제일 많이 사용하게 될 듯한 CIF (352×288) 사이즈로 지정해두었고, s(SD: 720×480), h(HD: 1920×1080), c(CIF: 352×288), q(QCIF: 176×144), u(Custum) 등의 단축키를 통해 다른 사이즈로도 쉽게 변경할 수 있도록 만들었다.

위에 나열해놓은 기본 사이즈가 아니더라도 Custum Size 를 입력할 수 있는 메뉴 또한 준비되어 있다.

color format 또한 yuv444, yuv422, yuv420, y(luminance only) 등의 포멧을 지원한다.

2배 확대, 1/2 축소 등의 기능까지도 제공 -_-v

학부 시절 ‘게임 프로그래밍’ 과목 수강 이후 오랫만에 MFC + openGL 프로그래밍이다보니 가끔 헤매기도 했지만, 잘 설계된 openGL 덕에 기능을 추가하는 것이 쉽게 쉽게 이루어지지 않았나 싶다.

툴도 Visual Studio 2005 로 갈아탔는데, 확실히 여러 면으로 IDE 가 진보했음을 느낄 수 있었다. 다만 Visual Stuido 2005 이거이거 꽤 무거운거 같다. Class Wizard 가 없어졌기 때문에 조금 혼란스럽기도 하지만 뭐 Code Definition Window 등 새로 추가된 기능들은 이런 점을 보완해주고도 남는 듯…

MFC 는 (지금도 잘 모르지만) 거의 초보였는데 요번 프로그램을 통해 좀 자신감이 붙는 것 같다. 원하는 기능을 구현하기 위해 어떤 검색어를 넣으면 될 지에 대한 노하우도 좀 생기는 것 같고, 하여튼 지난 이틀간 이 프로그램을 만들면서 참 재밌었던 것 같다.

이제 남은건 히스토그램을 그려주는 기능 뿐인가!!

다운로드:

Change Log:

2007년 7월 15일

  1. uyuv 포멧 지원 추가
  2. 소스 공개

2008년 8월 2일

  1. ::GetDC(hWnd) 후 ::ReleaseDC(hWnd,dc) 를 호출 하지 않아서 생기는 메모리 릭 제거
  2. gdTexImage2D 를 반복 호출해서 생기게 되는 메모리 릭 제거

p.s) Visual Studio 에서 만든 프로젝트는 버젼 관리 시스템등에 어떻게 넣어야할지 모르겠다. 하여튼 코드를 조금 더 정리하고, sourceforge 등에 오픈소스 프로젝트로 올려볼 생각!!

내가 참여했던 오픈소스

제가 참여했던 오픈소스 프로젝트들 (계속 업데이트 됩니다.)

Table of Contents

    Netron

    가장 널리 사용되는 Neural Network Viewer인 Netron 에서 ArmNN 포멧을 지원하지 않길래 ArmNN 디코더를 추가. PR을 보내고, 저자분이 요구하는 것들을 맞추는 것도 나름 재미있는 경험이었다고 생각한다.

    원 저자분이 hand-merge 를 진행해서 commit history 상에는 기록이 남지 않아서 조금은 아쉬운 PR

    PyDemux

    FFMpeg을 이용해서 video 를 Pillow Image 형태로 demux 해주는 Python Extension.

    OpenCV 를 이용해도 쉽게 video demuxing이 가능하긴 하지만, OpenCV는 아무래도 의존성도 복잡하고 하다보니 장점은 있다고 생각하지만 막상 존재를 아는 사람은 많질 않은 듯.

    YUV player

    대학원에 들어가서 비디오 코덱 관련 연구를 하다보니 raw YUV 데이터 파일을 자주 사용하게 되었는데, 맘에 드는 뷰어가 없어서 만들고 공개했던 프로젝트…

    나름 github에서 별도 많이 받고, 포크도 많이 받고 있는 프로젝트!

    얼마 전에 전 회사 동료 분이 리눅스 버전도 만들어주면 안되겠냐고 물어보시길래 기본 기능들만 Python으로 구현해서 추가로 공개 완료.

    X-Chat 2

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

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

    딩딩 바이러스의 경우 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 와 링크되고 싶어하지 않았기 때문에 어쩔 수 없었다고 생각한다.

    gimageview

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

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

    mod_autoindex hack

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

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

    proftpd: mod_codeconv patch

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

    mytrz-dviewer

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

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

    wordpress: korean trackback plugin

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

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

    gentoo ebuild

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

    websvn

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

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

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

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

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

    wordpress: korean trackback!

    어제 까날옹이 egloos 에서 가볍게 트랙백을 날려주셨는데, egloos 에선 trackback 인코딩을 euc-kr 을 사용하는지 트랙백이 깨져서 와버렸네요. 혹시나 관련된 plugin 을 찾아봤지만 plugin 으로는 아직 존재하지 않는 듯 하고, 관련해서 wind-like 님이 문제를 해결한 버젼의 wp-trackback.php 파일을 배포하시더군요.
    하지만 wordpress 기본 파일을 수정할 경우 업데이트를 할 때마다 다시 수정해줘야 하는 번거로움이 있기 때문에 그냥 plugin 을 작성해버렸습니다. 막상 plugin 을 작성하려고 보니 trackback_post 에 대한 action 은 글이 삽입된 이후에 실행되도록 되어 있더군요. 역시 그냥 wp-trackback.php 를 수정해서 사용해야 하는건가 하는 생각이 들었지만, 뭐 정도가 아니면 돌아가면 되는 법!! 이미 데이타베이스에 입력완료된 trackback 을 update 하도록 하는 hack 에 가까운 플러그인이 만들어져버렸습니다. -_-v
    혹시나 필요한 분은 아래 url 에서 받아서 사용하시면 되겠습니다.
    http://mytears.org/resources/distfiles/wp_korean_trrackback-1.0.zip
    p.s) wind-like 님이 수정하신 버젼과는 다르게 ‘트랙백을 받는 경우’ 하고만 관련이 있습니다.