洪民憙 (홍민희) 블로그

근황

솔직히 요즘 좀 놀았다. 그래서 의도치 않게 오픈소스로 공개한 것들이 많아졌다. 생각해보니 블로그에 소개도 안한 것들이 태반이라 소개해본다.

Wand

프로젝트 웹사이트
http://dahlia.github.com/wand/
GitHub (Git 저장소)
https://github.com/dahlia/wand
Travis (Continuous Integration)
http://travis-ci.org/dahlia/wand
메일링 리스트
http://librelist.com/browser/wand/
PyPI
http://pypi.python.org/pypi/Wand
easy_install Wand
pip install Wand

Python에서 쓰려고 만든 ImageMagick 바인딩으로 시작했는데 지금은 PIL의 대체품 정도로 생각하고 있다. 바인딩이긴 한데 얇은 추상화를 목표로 하는 것은 아니고 일반적인 Python 스타일의 API와 좋은 문서화(중요)를 목표로 하고 있다.

배경을 설명하자면 좀 길다. 원래 Python에는 C로 작성된 유일무이한 이미지 처리 확장 모듈이 있는데 그게 바로 Python Imaging Library이다(이하 PIL). 근데 문제는 이게 관리가 안된지 너무 오래된 데다가 Python 1.x 시절 스타일로 추상화가 되어 있다는 거다. 뉴 스타일 클래스는 커녕 올드 스타일 클래스도 안 쓰고 그냥 모듈이 곧 클래스… 자세한 설명은 생략한다. 게다가 PyPy가 나름대로 cpyext를 제공하고 또 CPython C API 호환성도 쓸만하지만 어찌됐건 PIL은 그 당시에 빌드가 안됐다. 참고로 지금은 누가 빡쳐서 PIL을 포크하여 Pillow라는 이름으로 패키지를 관리하고 있는데 낡은 걸 열심히 보수하는 형국이라…

당시 나는 크롭이랑 리사이즈만 하면 됐기 때문에 간단히 ctypes를 써서 ImageMagick C API를 호출하기로 했다. 근데 바퀴를 재발명하면 안되니까 분명 다른 누군가도 ImageMagick 바인딩을 PyPy에서도 쓸 수 있게 만들어놨을 거라는 생각을 했다. 하지만 찾아봤더니 있긴 몇개 있는데 다들 몇가지 조건을 만족하지 못했다.

하여간 죄다 빡치게 만들어서 그냥 새로 만들기 시작한게 Wand다. 마법봉 로고는 여자친구가 그려줬다. 목표는 위에서 빡치게 했던 것들을 모두 만족하는 것이다:

딱 1년 정도 관리했고 슬슬 쓰는 사람들도 많아지는 모양이다. 심지어 요즘에는 나보다 다른 사람들이 추가한 기능이 훨씬 많다.

최근에 FreeBSD에 패키징되어 들어갔다.

libsass-python

프로젝트 웹사이트
http://dahlia.github.com/libsass-python/
GitHub (Git 저장소)
https://github.com/dahlia/libsass-python
Travis (Continuous Integration)
http://travis-ci.org/dahlia/libsass-python
PyPI
http://pypi.python.org/pypi/libsass
easy_install libsass
pip install libsass

전에 libsass 관련 포스팅을 한 적 있는데, 원래 있던 기존 바인딩의 빌드 스크립트가 구렸다. libsass 자체는 따로 make를 돌린 다음에 setup.py install을 하게 되어 있는데… 당연하지만 이렇게 해두면 easy_install로 설치가 안된다. 패치를 2번인가 보냈고 잘 받아주긴 했는데 가만 보니 성능이 중요한 것도 아니고 Windows를 생각하면 그냥 바이너리 egg까지 배포하는 게 맞겠다 싶은 생각이 들었다. 그래서 ctypes 쓰지 않고 이번에는 Wand와 반대로 CPython C API를 써서 확장을 만들었다. 그래도 cpyext와 호환되기 때문에 PyPy에서도 잘 돌아간다. 오랜만에 C 코딩을 했는데 역시 C는 ‘생각보다 나쁘지 않았어’라고 생각하려는 순간 날 짜증나게 만들더라. C에 goto는 꼭 있어야 한다. ㅠㅠ

결국 첫번째 목표는 SASS/SCSS 컴파일을 하는 거였고 잘 되서 첫번째 릴리즈를 했다. 두번째 목표는 distribute/distutils 지원 및 WSGI 지원이었는데 그것도 구현을 잘 해서 두번째 릴리즈도 했다. 그 뒤에 Windows 호환성 등을 해결해서 마이너 릴리즈를 한두번 더 했다. Windows는 아예 빌드가 되어 있는 바이너리 egg를 함께 배포하고 있다.

(Haml의 창시자이기도 한) Hampton Catlin이 libsass-python 소개 트윗을 해주기도 했다.

Wow! Finally. Sass in Python! Love it! dahlia.kr/libsass-python/

— Hampton Catlin (@hcatlin) August 25, 2012

Sider

프로젝트 웹사이트
http://sider.dahlia.kr/
GitHub (Git 저장소)
https://github.com/dahlia/sider
Travis (Continuous Integration)
http://travis-ci.org/dahlia/sider
PyPI
http://pypi.python.org/pypi/Sider
easy_install Sider
pip install Sider

Redis의 고수준 추상화를 목표로 한 라이브러리이다. 올해 초에 어디 쓰려고 만들다가 필요 없어져서 손 놓고 있는 상태. 기본적인 아이디어는 Python의 빌트인 자료구조 인터페이스를 흉내내는 Redis 영속 객체를 만들자는 것이었다. 이를테면 set이나 dict는 Redis에도 있는 set, hash 연산으로 구현할 수 있다.

그냥 설명만 봐서는 잘 감이 안 잡히므로 예제 튜토리얼을 읽어보길 바란다.

궁극적인 목표는 (관계형 데이터베이스가 아니니 용어는 부적절하지만 굳이 비교하자면) ORM 수준까지 제공하는 것인데 지금은 상당히 동기를 잃어버린 상태라 나중에 정말 심심해지면 그때나 다시 잡을 것 같다. 그래도 일단 지금 있는 것만 해도 쓸 구석은 꽤 있다.

Okydoky

PyPI
http://pypi.python.org/pypi/Okydoky
easy_install Okydoky
pip install Okydoky
GitHub (Git 저장소)
https://github.com/crosspop/okydoky

RTD의 비공개 프로젝트용 미니 클론이다. Sphinx(검색엔진 아님)로 문서화된 프로젝트를 GitHub으로부터 커밋 훅을 받아 자동으로 최신 버전으로 빌드해주는 간단한 웹 애플리케이션이다. 정확히는 매 리비전의 문서는 영원히 유지되게 해놨다. 인증은 GitHub으로 하게 되어 있다. 지정된 저장소에 접근 가능한 사람만 볼 수 있다.