macirb が起動できない

論文を投稿して一眠りして突如、Ruby に目覚めました。一度も使ったことはなかったのですが、しばらく前に MacRuby の紹介記事を読んで、それからもう少し前に増井さんが Ruby で書いた ScreenSaver *1が面白かったので、長いこと気にはなっていたのです。

MacRubyの開発元にでかけていって、チュートリアルがあるからやってみようと思ったわけです。<code>macirb</code>というのが対話環境のインタプリタらしい。とりあえず起動してみると、何も表示しない。「案外、無愛想なインタプリタだね」と思っていたら、なにやら警告らしきものを表示します。さらに、MacBook Airのファンが唸りをあげ始める。暴走じゃないの。キーボード割り込みも効かないし!

さんざん調べた挙句にようやく対処法がわかったのでまとめておきます。

まず、最初のサンプルがこれです。

$ /usr/local/bin/macirb --simple-prompt
>> framework 'Cocoa'
=> true

「可愛いじゃないの」と思いつつ実行すると、「なんと!」

wakita$ macirb

dyld: lazy symbol binding failed: Symbol not found: _rb_enc_find_index
  Referenced from: /Library/Frameworks/MacRuby.framework/Versions/0.2/
      usr/lib/ruby/1.9.0/universal-darwin9.0/nkf.bundle
  Expected in: flat namespace

dyld: Symbol not found: _rb_enc_find_index
  Referenced from: /Library/Frameworks/MacRuby.framework/Versions/0.2/
       usr/lib/ruby/1.9.0/universal-darwin9.0/nkf.bundle
  Expected in: flat namespace

「まだ、起動しただけなのに。なんにもやってないよ。」

一時は RubyCocoa にひよろうかとも思ったのですが、「ここで負けてはいけない」と思い直して、ひたすら Google 先生と問答を繰り返すのですが、MacRuby の情報は少ないようですね。チュートリアルのとおりに起動すれば、エラーがでるのに、みなさん自己解決してそのまんまなのかな?ちょっと謎。

結局、参考になったのはご本家のバグのデータベースです。

ともかく今のバージョンでは NKF は利用できなくって、利用しようとするとリンカが怒るというのが最初の記事です。NKF は日本語の漢字コードを変換するためのソフトウェアなので、Ruby のインタプリタは実行する環境が日本語だと検知すると自動的に NKF を起動して、入力コードによらずに日本語が利用できるようにする仕組みなんでしょうか。便利かもしれないけれど、ちゃんと動いてくれないと困るよなぁ。。。

次の記事は、Ruby (YARV) が暴走したときに、キーボード割り込みでそれを停めることができないというものです。よく分らないのですが、macirb は Ruby で書かれたプログラムで、ユーザが入力したプログラムは一旦、macirb が受け取るのだけれども、それを実行するのはこれとは別の YARV のインタプリタということなのでしょうか。それともマルチスレッドになっているのかな?よく分りませんけれど、キーボード割り込みが下で動いている YARV に転送されていないために起きるエラーのようです。なんでも r212 で下で動いている YARV に定期的に割り込みの有無をチェックさせることでこのバグは修正されたようです。

というわけで、起動時に NKF をロードしないように設定すればいいのですが、それがよく分らない。仕方がないので以下のように言語環境を騙して macirb を起動しています。

wakita$ LANG=C macirb
>> framework 'Cocoa'
=> true

これでは、いつ暴走するか分らないから $HOME/.bashrc に以下を追加しました。

macirb() = { env LANG=C /usr/local/bin/macirb $*; }

めでたし、めでたし。ところで、本当は .rubyrc みたいなものに、「NKF は読み込まないで下さい」みたいな設定ができると思うんですけれど、知っている人がいたら教えて下さい。お願いします。


*1
定期的に Wikipedia の解説を乱択して表示してくれます

Spam Protection by WP-SpamFree