■2006-03-02
* [Perl][メモ] Inline::CでMeCabのXSモジュール
Advanced Perl Programming (2nd ed)を読んでInline::C経由でXSモジュールをつくるのを試してみたくなりました。で、MeCabをWindowsでSWIGなしで動かすのにXSモジュールをつくってみることにしました。まずはText::MeCabにInline::Cを使ってガリガリコードを書いて、コンパイルが通ったらnocleanオプションで削除されずに残ったXSファイルをほぼそのまま利用します(Inline.hを移したりMODULE名とかは書き換えたり)。
できたのがこちらText-MeCab-0.03.tar.gz Text-MeCab-0.04.tar.gz(追記:2006-05-02 CPANに牧さんがちゃんとしたText::MeCabをアップしてくれましたので、公開を停止します)。完全にwindows用です。あしからず。MeCab Windows用バイナリをインストールしたときについてくるsdk/mecab.h、sdk/libmecab.lib、それとbin/libmecab.dllを利用します。mecab-0.90rc9&Visual C++ toolkit 2003でのみ確認しています。ついでにblibに生成されたファイルも用意しておきましたので、こちらはあとblib/arch/auto/Text/MeCabにlibmecab.dll(mecab-0.90rc9)を置けばそのまま動くでしょう。
# 使い方はswig版とだいたい同じ感じ my $mecab = new Text::MeCab "-l1", "-Ochasen"; print $mecab->parse($text); my $node = $mecab->parseToNode($text); # 次のnodeを得るにはメソッドnextを使います。
追記:Win32用ならppmにしてくれればいいのに やり方知らないので。きっと誰かがやってくれるんじゃないかしらと…… 折をみてやってみるかもしれません。
■2006-03-06
* [Perl][メモ] Text::MeCabのppm化
浅倉さんに教わったので、Text-MeCabをppm化してみました(追記:2006-05-02 CPANに牧さんがちゃんとしたText::MeCabをアップしてくれましたので、公開を停止します)。ローカルマシンをリポジトリに指定してあげたら入れることができました。でも、dllだけで動くのか(辞書入れないと動かないと思うので)は確認していません。
最新版はマルチスレッドでText::MeCabを使うとperlがクラッシュするのを回避(DESTROYメソッドでmecab関連をfreeするのですが、スレッドを生成するとオブジェクトがコピーされて、それがスレッド毎にDESTROYするものだから、存在しないポインタをfreeしようとしてクラッシュに。結局スレッドidを記録させて1回しかfreeしないように修正しました)。
■2006-03-27
* [Perl][メモ] Thread::State
前回書いてからまたずいぶんと空いてしまいました。なんかあれやこれやで日誌書く気にならないやら、FsWikiのメンテナなのに昨年末から何にもやってないやら(すいません)…… せめてithreads関連のメモだけでも。
threadsはCOREとは別系統のがCPANにアップされるようになってCPAN版はスレッド生成時のスタックサイズを設定できるように。これで無駄にたくさんのメモリを使わないですむようです。
あと始めてXSモジュールをCPANにアップしました。スレッドの状態を調べるメソッドを提供するThread::Stateです。これまでもThread::Runningというモジュールがありましたが、そちらはcreate、detach、joinメソッドに細工をすることでスレッドの状態を保持しています。Thread::Stateは直接ithread構造を覗いてスレッドの状態をチェックします。
* [メモ] 今年も
東京の将軍様のもと、年々統制が厳しくなってるようで。教員むしばむ『君が代神経症』
* [メモ] YAPC
YAPCに行こうとチケットとっておいたのですが、先日酔っぱらわれたねねさんからお電話いただいて、懇親会の申し込みをしてもらいました。そのようなものがあるとは全然知りませんでした。
* [Perl] iスレッドのプライオリティ
Thread::Stateにpriorityメソッドを追加。生成したスレッド毎にプライオリティを取得・設定できます。もっともWindowsスレッドで実装されているithreadsでしか効果を発揮しません。pthread
実装のものはスケジューリングポリシーにSCHED_OTHERが設定されるので、たいていの環境で設定できないでしょうし。
use threads; use Thread::State; my $thr1 = threads->create(\&something); my $thr2 = threads->create(\&something); $thr2->priority(2); # $thr2の方により多くCPUが割り当てらる $thr1->join; $thr2->join;
_ b0SamueL0b [+z$8frZdyL%68pSU/:>w<:E3.lG-!XIB]
_ asakura-t [ 基本的にはnmakeしたあとにblibの中身を.tar.gzに固めて、nmake ppdとかすればいいだけみたいで..]
_ まかまか [なんとか出来ました。 ありがとうございます。]