laclefblog logo

Sun, 16 Nov 2008

Haskellで作成した関数をPythonから使う

漸く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でもポインタも扱えるので、もう少し手の込んだことも出来る(はず)。

Sat, 11 Oct 2008

パーサライブラリ

最近HaskellのParsecで遊んでいて、Pythonの方のパーサライブラリが気になったのでGoogleで検索したら、ビンゴなページがあった。2004年9月に作成して、2008年7月に更新している。偉い。

Pythonで書かれているもの、多言語インタフェースを持っているもの、古いもの当たらしいもの列挙状態で、選択は利用者に委ねられている。

Sat, 23 Aug 2008

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ってのがある。参考文献が多いし、これだな。

Sun, 06 Jul 2008

OSM解析

最近、日本語版も始まった OpenStreetMap のデータを解析して、 A* アルゴリズムを用いて任意の2地点間が最短距離となるような経路を発見するための、Pythonライブラリ。

画像出力機能付きという余裕っぷり。

Mon, 30 Jun 2008

ElementTree

Python 2.5以降には標準モジュールとして搭載されているelementtree。

minidomを使うのも面倒、というかXPathでXMLを処理したい、と考えたときはこれが役立つ。

少し前からは、 lxml のetreeやobjectifyを用いる方が人気という噂も目にする。

Python in Web browser

Silverlight 2とIronPythonで、Webブラウザ上で動作するPythonシステムを作ったらしい。

Web OS云々も、Windowsの悪いところを全て取り除いて、かつ、Pythonが動作すれば問題無いかも。

Thu, 26 Jun 2008

PythonのGUIライブラリ比較

PythonのGUIライブラリとして、Tkinter、wxPython、.NET with IronPython、PyQT、Pyglet、Win32 with ctypes、Venster、PyGTK の、"Hello World"比較。

付け加えるとしたら、Swing with Jython、 pygameRabbytuxPython くらいかな。 Pyui は2003年に1.0出して止まっているし。

PythonのGUIライブラリは豊富過ぎて、電池が過充電状態。選択時に将来性とか書き易さとかで結構迷う。因みに現在はPyGTK。

Wed, 25 Jun 2008

YAMLからスライドを作る

YAMLファイルからBeamer(LaTeX)プレゼンテーションスライドを生成するPythonスクリプト。

YAMLが見易いかとか、書き易いかとか、プレゼンテーションスライドを記述するのに向いているのかとか、思う事は色々あるけれど、こうやって、ユーザ側の入力形式が限定されても出力形式が多様にあるのなら、便利と言えるんだろう。

Tue, 03 Jun 2008

Bruce

reStructuredTextで記述して、 pyglet で出力する、Python製プレゼンテーションソフトウェア。

同様のソフトウェアであるpyslide(公式ページは404 Not Found)はXMLで記述してpygameで出力していた。

ところで、pygletがダウンロード出来るようになっていた事に今更気付いた。忙しい時期だったからスルーしてたな。これからは各所でpygletが台頭してくるかもしれない。

Sun, 01 Jun 2008

pyRuby-Python-Bridge

Provides a minimal interface between Ruby and Python via TCP/IP

RubyからPythonのコードを扱うためのインタフェースを提供するらしいが、どこからダウンロード出来るのか分からないので、とりあえずメモだけ。XML-RPCとか、既存分散プログラミング環境とどう違うのか見たいのだけれど。

PythonかRubyか、なんて事がよく言われている様だけど、プログラミング言語の信条が違うのだから、合うやつを使えば良いと思う。電池を使うか手回し発電器を使うか、みたいな。