Ruby軽量WebフレームワークRamaze2012.12.08版

RubyベースのWebアプリケーションのフレームワークとしてRuby on Rails | A web-application framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern.Sinatraがありますが、RamazeRubyらしさを重視して見通しの良いプログラミングができるのが特長です。配布物に同梱されているサンプルやテンプレートを元に、多数用意されているヘルパーモジュールなどを活用して、一通りの機能を持ったアプリが簡単に作れます。また、HTMLのテンプレートエンジンやデータベースのマッパーは自分で好みのものを選ぶことが出来ます。デバッグモードでアプリを起動すれば、ソースコードに対する変更が即座に動作や画面に反映されるため、アプリの操作や見た目の改善作業がとても楽に行えます。日本語の情報としてgihyo.jpの紹介記事とその著者のWikiがあります:
第11回 自由なWebフレームワーク,Ramaze:Ruby Freaks Lounge|gihyo.jp … 技術評論社
第12回 Ramazeを使って120行で作る単語帳アプリ:Ruby Freaks Lounge|gihyo.jp … 技術評論社
http://route477.net/ramaze/

Ramazeは類似のフレームワークと比較すると処理速度にやや難があるようでしたが、大幅に速度が向上した2012.12.08版が公開されました。今回の更新でそれまでと互換性が一部なくなるようですが、数年に渡って継続的にバージョンアップされているのが素晴らしいです。

BSD/LGPL/GPLのトリプルライセンスで公開された日本語形態素解析用辞書UniDic

UniDicは比較的短い単位で語を分割する形態素解析システム用の日本語辞書です。標準的な表記や音声言語処理に適した発音の情報などが付けられていて、例えば「すもも」に対して標準的な表記である「李」、「言う」の発音として「ユウ」ではなく実際の発音に近い「ユー」が記述されています。以前から再配布できない形では公開されていましたが、最近、BSD/LGPL/GPLのトリプルライセンスでMeCab用の辞書unidic-mecabがリリースされました:
UniDic プロジェクト日本語トップページ - OSDN

unidic-mecabのバイナリ版をMacPortsのportにパッケージして、MeCabで使えるようにしてみました:

$ sudo port selfupdate
$ sudo port clean mecab-utf8
$ sudo port install mecab-utf8 +unidic
$ mecab
すもももももももものうち
すもも スモモ スモモ 李 名詞-普通名詞-一般
も モ モ も 助詞-係助詞
もも モモ モモ 桃 名詞-普通名詞-一般
も モ モ も 助詞-係助詞
もも モモ モモ 桃 名詞-普通名詞-一般
の ノ ノ の 助詞-格助詞
うち ウチ ウチ 内 名詞-普通名詞-副詞可能
EOS

ちなみに、MacPortsのbuildbotとしてSnow LeopardとLion用に引き続き、Mountain Lion用も稼働しています。これでboostのような、うんざりするほど長いコンパイル処理はなくなりますね:
http://lists.macosforge.org/pipermail/macports-announce/2012-December/000025.html

日本語係り受け解析器のCaboCha v0.65と係ろっとv0.2

日本語係り受け解析器CaboChaの最新版0.65が公開されました。学習の素性が追加されて精度が向上していたり、KNBCが学習データに入っていたり、と強化されているようです:
Taku Kudo on Twitter: "cabocha 0.65 を公開しました。最近の素性を入れることでかなり精度が向上しました。またトーナメントモデルもサポートしました。(デフォルトはSRです) http://t.co/l51qZIkR"
元々使いやすくて機能も豊富でしたが、係り受け学習が高速化されて、再学習ができるようになるなど、さらに進化しています。

一方、「係ろっと(kakarot)」は、全域木探索を行う実験的な日本語係り受け解析システムです。精度はCaboChaに及ばないようですが、作者のブログを見ると、構想から調査、設計、実装、公開までがとても短期間にされていて、精力的に改善されている様子です。最新版はv0.2ですが、係り受け解析の前処理にCaboChaのモジュールを使っていて、CaboCha v0.64のソースへのパッチと追加ファイルの形で実装されています。

最新版のcabochaとkakarotのMacPortsを登録しました。係ろっとをビルドするとcabochaコマンドが生成されますが、このままだと通常のCaboChaと共存できないので、バイナリやライブラリ、必要なファイルのパスの名称を変更してあります。Macの場合、install_name_toolコマンドを使って参照するライブラリを指定できるので利用しました:

install_name_tool -change /opt/local/lib/libcabocha.4.dylib /opt/local/lib/libkakarot.dylib /opt/local/bin/kakarot

cabochaとkakarotは次のようにして試すことができます:

$ sudo port selfupdate
$ sudo port install cabocha kakarot
$ cabocha
太郎は花子が読んでいる本を次郎に渡した (+改行 +CTL-D)
太郎は---------D
花子が-D |
読んでいる-D |
本を---D
次郎に-D
渡した
EOS
$ kakarot
options: EDBG 0 CMP_CABOCHA 0 REGR_MODE 0 CMPONLY 0
太郎は花子が読んでいる本を次郎に渡した (+改行 +CTL-D)
太郎は---------D
花子が-D |
読んでいる-D |
本を---D
次郎に-D
渡した
EOS
$ cabocha -v
cabocha of 0.65
$ kakarot -v
cabocha of 0.64

驚異的な解析速度を誇る日本語係り受け解析器J.DepP

日本語の係り受け解析器といえば、KNPCaboChaが有名ですが、J.DepPは線形分類器を用いて大規模な対象を非常に高速に、また高精度に解析できることが特長です。2009年末に公開されてから着実にバージョンアップされていますが、ビルドの方法が簡単になって、モデルの学習機能が追加されたことで大変使いやすくなっています。また、J.DepPは線形分類器のpeccoopalを利用していますが、ベースの分類器が高速化されたことが、そのまま解析器の性能向上につながっているようです:
ソフトウェアの更新も一人旅になってきた - ny23の日記

このJ.DepPをMacPortsとして登録しました。デフォルトの状態でjdeppをインストールすると、jumandicを参照するMeCabを組み込んだ解析器と、解析済みのブログコーパスであるKNBコーパスを対象とした学習モデルが利用できるようになります:

$ sudo port selfupdate
$ sudo port install jdepp

MeCabの辞書としてはjumandicの他に、IPAdicやNAIST-jdicも利用可能で、それぞれ+ipadicまたは+naistjdicをインストール時に指定すると組み込まれます。また、学習モデルの対象に京都コーパスを指定することもできます。毎日新聞データが使える方であれば、/tmp/KyotoCorpus4.0にコーパスデータを参照できるようにしておいて、+kyotoを指定してインストールできます。例えば、ホームディレクトリに置いてある京都コーパスを学習データとして、IPAdicを利用する場合は、次のコマンドを実行します:

$ ln -s ~/KyotoCorpus4.0 /tmp
$ sudo port install +kyoto +ipadic

なお、CaboChaでの話ですが、京都コーパスKNBコーパスを使った場合の性能評価が次のブログに書かれていて参考になります:
CaboChaでKNBコーパスを使う | 関口宏司のLuceneブログ

ざっくりと動作の様子をみるために、KNBコーパスのテキスト(約252KB)を対象として係り受け解析を実行してみます(※コメントに、解析速度に関して作者の方からの説明がありますのでご覧ください):

$ sudo port install nkf KNBC
$ nkf -w /opt/local/share/KNBC/corpus2/Kyoto.tsv > Kyoto.tsv
$ time jdepp -v -1 < Kyoto.tsv > kyoto.jdepp
(input: STDIN [-I 0])
J.DepP profiler:
io : 0.0196 ms./trial (58.69402665/2997)
dict : 10.3510 ms.
preproc : 3.8375 ms./sent. (5748.59597486/1498)
chunk : 0.0594 ms./sent. (88.98891755/1498)
depnd : 0.0452 ms./sent. (67.65351785/1498)


real 0m8.720s
user 0m0.345s
sys 0m0.219s
$ time jdepp -v -1 < Kyoto.tsv > kyoto.jdepp
(input: STDIN [-I 0])
J.DepP profiler:
io : 0.0162 ms./trial (48.47844897/2997)
dict : 0.5021 ms.
preproc : 0.0969 ms./sent. (145.11098944/1498)
chunk : 0.0428 ms./sent. (64.17484213/1498)
depnd : 0.0436 ms./sent. (65.25766264/1498)


real 0m0.413s
user 0m0.298s
sys 0m0.106s

参考までにCaboChaで同じことをさせてみます:

$ sudo port install cabocha
$ time cabocha -f 1 < Kyoto.tsv > kyoto.cabocha

real 0m14.948s
user 0m4.235s
sys 0m0.314s
$ time cabocha -f 1 < Kyoto.tsv > kyoto.cabocha

real 0m4.484s
user 0m4.227s
sys 0m0.184s

どちらも係り受け解析の前にMeCabによる形態素解析を行っていますが、J.DepPの係り受け解析の速度はMeCab形態素解析とそれほど大きく変わらず、桁違いに遅いということはないようです:
J.DepP - C++ implementation of Japanese Dependency Parsers

CaboChaも相当速いと思っていましたが、こうなると前処理であったり、後処理の意味的な解析や索引化の処理が全体のボトルネックになってきそうです。

Java分散計算基盤HadoopのMac用ネイティブライブラリ

分散計算プラットフォームのHadoopは基本的にJavaで実装されていますが、外部のC/C++で実装されているモジュールと連携するためにネイティブのライブラリが提供されています。具体的には、zlibやsnappyを利用したファイル圧縮機能があります。snappyはGoogleが開発した高速な圧縮伸張速度を特長とするライブラリです:
http://news.mynavi.jp/column/tool/052/index.html

HadoopLinuxをターゲットに開発されているので、提供されているネイティブライブラリはLinux用のみで、Macでは該当するソースをそのままではコンパイルすることも出来ません。幸いなことに、MacコンパイルするためのパッチがHadoopのプロジェクト管理システムのJIRAに登録されていて、最新版のソースにそのまま適用することはできませんが参考になります:
[HADOOP-3659] Patch to allow hadoop native to compile on Mac OS X - ASF JIRA

MacPortsのプロジェクト管理システムのTracに、Hadoopのネイティブライブラリを含めることが要望としてあげられていたので、hadoopのportを対応させました:
#35902 (hadoop is missing native libs) – MacPorts

ネイティブライブラリをビルドするとき、Javaのライブラリとのリンク方法がLinuxMacとでは異なっています。Linuxの場合、ldに対して”-L$JAVA_HOME/jre/lib/$OS_ARCH/server -ljvm"を渡しています。一方Macの場合、Java開発環境のファイルが/System/Library/Frameworks/JavaVM.framework/ 以下にあり、ldに"-framework JavaVM"とだけ指定すれば適切なJavaのライブラリがリンクされます。Mac OS XにはSystem Frameworksと呼ばれる枠組みが用意されていて、JavaVM以外にも様々なFrameworkがあります:
Mac Technology Overview: OS X Frameworks

また、MacPortsでは、OSやインストールされているXcodeのバージョンに応じて適切なコンパイラや引数を利用する仕組みがあります:
UsingTheRightCompiler – MacPorts

通常、configure実行時に自動的に設定されますが、Hadoopのビルドはantを通してconfigureが実行されて、これらの設定が無効になってしまいます。そこで、antが参照するbuild.xmlに変更を加えて、設定が有効になるようにしました。

Hadoopには、FUSE (File-system in USEr space) APIを利用してファイルシステムHDFSをマウントする機能がオプションとして含まれています。MacPortshadoopにfusedfsオプションを指定すると、必要なライブラリや実行ファイルなどがインストールされます:

$ sudo port self update
$ sudo port install hadoop +fusedfs

MacPortsのemacs-app@24.1にパッチを当てました

MacPortsにはアプリケーション版Emacsのパッケージemacs-appがありますが、最新版の24.1だと、画面共有などのVNCを通してEmacsを使おうとしてもコントロールキーが認識されないという問題がチケットとして上げられていました。Emacsのtrunkには、この問題に対応したパッチがすでに取り込まれているということで、emacs-appにも同じパッチを適用するように修正しました。
#35797 (emacs-app needs to be upgraded to latest trunk) – MacPorts

また、emacs-appのパッケージでは、+patchesを指定したときに、フルスクリーンとインラインのパッチがあたります。こられのパッチによって、ts-toggle-fullscreenを実行すると、Emacsの全画面表示が切り替わり、ディレクトリを表示するDired画面などで日本語入力になっていてもnやpなどの移動キーがそのまま利用できるように使い勝手が改善されます。

今回からデフォルトでこれらのパッチをあててビルドするように変更しました。Snow Leopard(64ビット)やLion OSの場合、ソースをコンパイルすることなく、パッチの適用されたバイナリがインストールされるので、すぐに使い始めることができます。

$ sudo port selfupdate
$ sudo port -u upgrade emacs-app
# インストールされてないときは、
# $ sudo port install emacs-app
$ open /Applications/MacPorts/Emacs.app

なお、Emacsの次のバージョン24.2は近日中にリリースされる模様なので、MacPortsも追随していきたいと思います。

フリーのプログラミング用テキストエディタTextMate2

Ruby on Railsが世に出た頃、紹介ビデオで使われていたテキストエディタTextMateですが、GNUライセンスのフリーソフトとして公開されていました。Railsのscaffoldやconvention over configurationの設計思想と、TextMateの優れた入力補完機能、Mac OS Xの先進性と視覚的センスの良さが合わさって、MacTextMateを使ってRailsを組むのがとても格好がよく、Mac OS XでWebプログラミングすることを一般に広めるきっかけになったのではないかと思います。

さっそくtextmate2のportがMacPortsにも登録されていました。あいにく32ビットのアプリケーションであるため、依存ライブラリもuniversalビルドする必要があって、コンパイルに時間がかかります。githubにビルドされたバイナリのアプリケーションが置いてあるので、ここから最新版をダウンロードするのが簡単です。

TextMateは元々日本語の扱いに難があって、githubで公開された直後の状態では日本語が正しく表示されていませんでした。しかしその後、オープンソース化が良い方向に働いたということか、急速に改善されて問題がなくなったようです。今後にさらに期待です。