근황
솔직히 요즘 좀 놀았다. 그래서 의도치 않게 오픈소스로 공개한 것들이 많아졌다. 생각해보니 블로그에 소개도 안한 것들이 태반이라 소개해본다.
Wand
- 프로젝트 웹사이트
- http://dahlia.github.com/wand/
- GitHub (Git 저장소)
- https://github.com/dahlia/wand
- Travis (Continuous Integration)
- http://travis-ci.org/dahlia/wand
- 메일링 리스트
- wand@librelist.com
- 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에서도 쓸 수 있게 만들어놨을 거라는 생각을 했다. 하지만 찾아봤더니 있긴 몇개 있는데 다들 몇가지 조건을 만족하지 못했다.
- PyPy에서 쓰려면 cpyext로 빌드가 되거나 ctypes로 엮어야 하는데(참고로 PyPy는 후자가 더 빠르다!) 이걸 만족 못하거나
- 일단 대부분 문서화가 개판 5분 전이었고
- 결정적으로 나는 distribute로 의존성 관리를 하고 싶은데 PyPI에 등록은 커녕 패키징도 안되어있는 것들이 태반
- 마지막으로 PyPy은 CPython과 달리 참조 카운팅을 하는 대신 가비지 컬렉션을 하니까 소멸자 호출 시점이 결정 불가능한데 여기에 의존해서 리소스 해제 처리를 해둔 것들이 대부분
하여간 죄다 빡치게 만들어서 그냥 새로 만들기 시작한게 Wand다. 마법봉 로고는 여자친구가 그려줬다. 목표는 위에서 빡치게 했던 것들을 모두 만족하는 것이다:
- CPython/PyPy 양쪽에서 잘 돌아야 함. (마일스톤에 Jython 2.7 릴리즈에 맞춰서 호환성 추가하는 것도 있긴 한데 Jython 메인테이너가 혼자라 거기도 힘들듯… ctypes 호환성 맞춰줘야함. 필요한 패치는 보내서 리뷰하고 문제 없으면 받아들여줄지도…)
- 문서화. 잘좀 하자…
- 21세기인데
pip install Wand
로 설치 가능해야지 - Wand는 Python 2.5에 추가된
with
문(RAII)으로 편하면서도 명시적으로 리소스 관리를 한다
딱 1년 정도 관리했고 슬슬 쓰는 사람들도 많아지는 모양이다. 심지어 요즘에는 나보다 다른 사람들이 추가한 기능이 훨씬 많다.
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으로 하게 되어 있다. 지정된 저장소에 접근 가능한 사람만 볼 수 있다.