漸くHaskellに慣れてきたが、Pythonの方が使い勝手が良いと感じることに変わりはない。
互いの良さを取り、上手く使い分けるために、HaskellとPythonのFII(Foreign Function Interface)を用いる。
Haskell/GHCでForeign.Cを用いてC共有ライブラリを作成し、Pythonからctypesで使用する。
まず、Haskellで関数を格納したモジュールを書く(hstopy.hs)。
module Htop where import CString fact :: Int -> Int fact n = if n == 1 then 1 else (n * fact (n - 1)) factorial :: Int -> IO Int factorial n = return (fact n) mystring :: IO CString mystring = newCString "hello haskell world!" foreign export ccall factorial :: Int -> IO Int foreign export ccall mystring :: IO CString
FIIの性質上、色々をIOモナドで包む必要がある。
次に、ランタイム初期化と脱初期化のためのエントリィポイント用コードを書く(必要最小限、hstopy_init.c)。
static void __attribute__ ((constructor)) mylib_init(void)
{
hs_init(0, 0);
}
GHCでコンパイルする。
$ ghc -c hstopy.hs -fglasgow-exts $ ls hstopy.hi hstopy.hs hstopy.o hstopy_init.c hstopy_stub.c hstopy_stub.h hstopy_stub.o
GHCで共有ライブラリを作成する。
$ ghc -package unix -optl "-shared" -o libhstopy.so hstopy_init.c hstopy.o hstopy_stub.o # -package unix は今回は不要? $ ls hstopy.hi hstopy.hs hstopy.o hstopy_init.c hstopy_init.o hstopy_stub.c hstopy_stub.h hstopy_stub.o libhstopy.so
ctypesで共有ライブラリの関数を用いるために、関数ラッパを書く(hstopy.py)。
#!/usr/bin/python import ctypes _lib = ctypes.CDLL( './libhstopy.so') _lib.factorial.argtypes = [ctypes.c_int] _lib.factorial.restype = ctypes.c_int _lib.mystring.argtypes = [] _lib.mystring.restype = ctypes.c_char_p factorial = _lib.factorial mystring = _lib.mystring
Pythonから使用する。
$ python Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import hstopy >>> hstopy.mystring() 'hello haskell world!' >>> hstopy.factorial(4) 24 >>> hstopy.factorial(5) 120
Foreign.Cでもctypesでもポインタも扱えるので、もう少し手の込んだことも出来る(はず)。
最近HaskellのParsecで遊んでいて、Pythonの方のパーサライブラリが気になったのでGoogleで検索したら、ビンゴなページがあった。2004年9月に作成して、2008年7月に更新している。偉い。
Pythonで書かれているもの、多言語インタフェースを持っているもの、古いもの当たらしいもの列挙状態で、選択は利用者に委ねられている。
ブログ他参考文献が割と豊富な [1] [2] VideoCapture - A Win32 Python Extension for Accessing Video Devices (e.g. a USB WebCam, a TV-Card, ...) はWindows専用ライブラリなので、Linuxでは使えない(これさえ使えれば簡単なのに)。
| [1] | gumuz’ devlog » Blog Archive » Python webcam fun - motion detection: http://web.archive.org/web/20070520024828/http://gumuz.looze.net/wordpress/index.php/archives/2005/06/06/python-webcam-fun-motion-detection/ |
| [2] | code and martial arts: motion capture in python: http://janto.blogspot.com/2006/01/motion-capture-in-python.html |
Search results for python VideoCapture linux - MarkMail で調べると、やはり気にしていた人は居たみたい。
で、メーリングリストで示された代替案としては、以下のものがある。
libfgは Video4Linux のAPIを操作するためのライブラリ。Video4Linux2には未対応の様だ。
ならば GStreamer: open source multimedia framework [3] を使えば出来るかとも考えたが、いまいち情報が足りない。
| [3] | GStreamer - Wikipedia: http://ja.wikipedia.org/wiki/GStreamer |
WebCamSpyはWebカメラを操作するためのライブラリ。wxPython、pyParallel、pySerialを外部ライブラリとして必要とする(面倒臭い)。
| [4] | OpenCV - Wikipedia: http://ja.wikipedia.org/wiki/OpenCV |
通称、OpenCV。画像処理等に使われる、Intel製ライブラリ。Ubuntuのパッケージにpython-opencvってのがある。参考文献が多いし、これだな。
最近、日本語版も始まった OpenStreetMap のデータを解析して、 A* アルゴリズムを用いて任意の2地点間が最短距離となるような経路を発見するための、Pythonライブラリ。
画像出力機能付きという余裕っぷり。
Python 2.5以降には標準モジュールとして搭載されているelementtree。
minidomを使うのも面倒、というかXPathでXMLを処理したい、と考えたときはこれが役立つ。
少し前からは、 lxml のetreeやobjectifyを用いる方が人気という噂も目にする。
Silverlight 2とIronPythonで、Webブラウザ上で動作するPythonシステムを作ったらしい。
Web OS云々も、Windowsの悪いところを全て取り除いて、かつ、Pythonが動作すれば問題無いかも。
PythonのGUIライブラリとして、Tkinter、wxPython、.NET with IronPython、PyQT、Pyglet、Win32 with ctypes、Venster、PyGTK の、"Hello World"比較。
付け加えるとしたら、Swing with Jython、 pygame 、 Rabbyt 、 uxPython くらいかな。 Pyui は2003年に1.0出して止まっているし。
PythonのGUIライブラリは豊富過ぎて、電池が過充電状態。選択時に将来性とか書き易さとかで結構迷う。因みに現在はPyGTK。
YAMLファイルからBeamer(LaTeX)プレゼンテーションスライドを生成するPythonスクリプト。
YAMLが見易いかとか、書き易いかとか、プレゼンテーションスライドを記述するのに向いているのかとか、思う事は色々あるけれど、こうやって、ユーザ側の入力形式が限定されても出力形式が多様にあるのなら、便利と言えるんだろう。
reStructuredTextで記述して、 pyglet で出力する、Python製プレゼンテーションソフトウェア。
同様のソフトウェアであるpyslide(公式ページは404 Not Found)はXMLで記述してpygameで出力していた。
ところで、pygletがダウンロード出来るようになっていた事に今更気付いた。忙しい時期だったからスルーしてたな。これからは各所でpygletが台頭してくるかもしれない。
Provides a minimal interface between Ruby and Python via TCP/IP
RubyからPythonのコードを扱うためのインタフェースを提供するらしいが、どこからダウンロード出来るのか分からないので、とりあえずメモだけ。XML-RPCとか、既存分散プログラミング環境とどう違うのか見たいのだけれど。
PythonかRubyか、なんて事がよく言われている様だけど、プログラミング言語の信条が違うのだから、合うやつを使えば良いと思う。電池を使うか手回し発電器を使うか、みたいな。