Browse Month: February 2012

MeCab-ruby on Lion

過去に Mecab-ruby on OSX 10.6 という記事を書いたけれど、Lion でもかなりはまったのでメモ。

環境は、Mecab バージョン 0.993 を Lion OSX 10.7.3。
mecab と mecab-ipadic は、homebrew でインストール済み、Ruby は RVM で REE 2012.01 をインストール済みとします。


$ rvm ree
$ wget "http://mecab.googlecode.com/files/mecab-ruby-0.993.tar.gz"
$ tar zxf mecab-ruby-0.993.tar.gz
$ cd mecab-ruby-0.993
$ ruby extconf.rb
checking for main() in -lmecab... no
checking for main() in -lstdc++... yes
checking for mecab.h... yes
creating Makefile
$ make
cc -dynamic -bundle -undefined suppress -flat_namespace -o MeCab.bundle MeCab_wrap.o -L. -L/Users/n0ts/.rvm/rubies/ree-1.8.7-2012.01/lib -L. -lstdc++ -L/opt/local/lib -ldl -lobjc
ld: warning: directory not found for option '-L/opt/local/lib'
$ ruby test.rb
0.993
dyld: lazy symbol binding failed: Symbol not found: __ZN5MeCab11createModelEPKc
Referenced from: /Users/Shared/w/prj/src/mecab-ruby-0.993/MeCab.bundle
Expected in: flat namespace

dyld: Symbol not found: __ZN5MeCab11createModelEPKc
Referenced from: /Users/Shared/w/prj/src/mecab-ruby-0.993/MeCab.bundle
Expected in: flat namespace

となって MeCab を使うことができません。原因は、察してのとおり -lmecab が no になっているからですので、extconf.rb を修正する必要があります。

もっとエレガントな方法がありそうですが、次のように修正しました。

--- extconf.rb-org 2012-02-22 16:44:15.000000000 +0900
+++ extconf.rb 2012-02-22 17:01:04.000000000 +0900
@@ -3,6 +3,7 @@
mecab_config = with_config('mecab-config', 'mecab-config')
use_mecab_config = enable_config('mecab-config')

+$LIBS += '-L/var/homebrew/Cellar/mecab/0.993/lib'
`mecab-config --libs-only-l`.chomp.split.each { | lib |
have_library(lib)
}

/var/homebrew とは、homebrew のインストール先のパスになりますので、環境に応じて書き換えてください。

毎度、MeCab を OSX 上で使うときは、かなりはまりますね。。。

Ruby で当月の何週目を求める方法

Ruby には、Date クラスの中に cweek プロパティがありますが、これは年ベースでの週数として取得できます。
当月の何週目かを求めるコードを書いてみました、たった 2 行でできました。


def get_week_num_of_month(date)
wday = (date.wday == 0) ? 6 : date.wday - 1
return (date.day - wday + 13) / 7
end

get_week_num_of_month 関数に Date クラスを渡すと、その日が当月の何週目か取得することができます。
なお、この関数は月曜日〜日曜日までを 1 週間としてカウントしています。

cobbler ではまったメモ

cobbler 経由で、CentOS 5.7 x86_64 を kickstart 経由でインストールしたとき、次のようなログは cobbler サーバ上の syslog に出力されていました。


Feb 7 21:43:23 10.0.4.3 ERROR insufficient disk space: installing
package initscripts-8.45.38-2.el5.centos.x86_64 needs 791MB on the /
filesystem
Feb 7 21:43:23 10.0.4.3 ERROR error running transaction:
installing package m2crypto-0.16-8.el5.x86_64 needs 823MB on the /
filesystem
...

正しく、100GB で ext4 でフォーマットしているのにもかかわらず、ディスク用不足というメッセージでインストールに失敗していました。
しばらく原因を探ってみると、cobbler のベースの distro の CentOS がバージョン 5.3 で、ext4 に対応する前のバージョンだったことが原因でした。CentOS 5 系では、ext4 がサポートされたのは 5.5 からでした。

ということで、次のような感じで、cobbler ベースの distro の CentOS をバージョン 5.7 に差し替えて無事インストールすることができるようになりました。hoge というプロファイルがある場合は、次のように distro を入れ替えることができます。


# cobbler import --path=rsync://ftp.jaist.ac.jp/pub/Linux/CentOS/5.7/os/x86_64/ --name=centos57-x86_64
# cobbler profile edit --name=hoge --distro=centos57-x86_64
# cobbler profile edit --name=hoge-xen --distro=centos57-xen-x86_64

すこしはまってしまったので、備忘録代わりにメモをしておきます。

YARD + Passenger

gems のヘルプを参照するとき、YARD server を使うと、とても便利です。

YARD server は、yard server –gems とすると、8808 ポート経由でローカルにインストールされているすべての gem のヘルプを参照することができます。
YARD server を、supervisor などで起動してもいいんですが、せっかくローカル開発環境では Passenger を使っているので YARD server を Passenger で動かしてみました。

やり方は、とても簡単で、この config.ru を使うだけです。

  1. YARD server 用の DocumentRoot を作成します(例えば、/tmp/yard/public とします)
  2. /tmp/yard/config.ru を、gist から取得します

 

YARD server 用の Apache の設定ファイルを、次のような感じにします。

<VirtualHost *>
ServerName yard
DocumentRoot /tmp/yard/public
</VirtualHost>

あとは、/etc/hosts に yard 127.0.0.1 を定義して、ブラウザで http://yard を開くだけです。

これで、かなり便利に YARD server を使うことができますね!