2009-02-25

なにかの購入ページだか登録ページだかで、規約に同意する必要があって、規約へのリンクをクリックすると別ウインドウで規約のページが開いた。それを読んで、元のウインドウに切り替えて「同意する」というリンクをクリック。すると……

「セッションがタイムアウトしました」

……。

規約を読む人がいるとははなから思ってないらしい。21世紀ってさあ、どんどん滑稽になってきてるよね。

MeCab の Python バインディングを Windows で使う話の続き

先日、Windows で MeCab の Python バインディングを使うインストーラを作ったけど、このライブラリで、たとえば次のようなコードを書いて、test_mecab.py foo.txt のように適当なテキストファイルを食わせると、特定の行で python.exe が落ちることがある。(Windows での話で、たとえば Leopard では落ちなかった。)

# test_mecab.py

import sys
import MeCab

t = MeCab.Tagger()

for filename in sys.argv[1:]:
    for line in open(filename):
        sys.stdout.write(t.parse(line))

落ちる時はいつも同じ行で落ちる。が、その行の内容で決まるわけではないらしい(同じ内容の行でも別の場所にあるものは問題なかったりする)。C/C++ で libmecab.dll を使った同様のプログラムを書いて実行した場合は落ちない。また Python からでも、ctypes モジュールを使って libmecab.dll の C 関数を直接呼んで同様の処理をするスクリプトなら落ちない。

MeCab_wrap.cxx のどこで落ちているかまでは追いかけたけど、よくわからない。これ以上原因を探る気力もないし、ctypes モジュールを使って自分でラッパを書いたほうがいいだろうか……。

それにしても、今までよく知らなかったけど ctypes ってすごいですね。