JRubyいろいろ - gem, gem, gem

Rubyな人なら当たり前の、朝飯前の、手に馴染みすぎているくらいのgem、でも、Javaな人にはいまひとつピンとこないかものgem。今回はJRubyで使うgemsのいろいろです。

Ruby逆引きレシピ」はいきなりrubygemsのレシピで始まって、続くレシピもgem, gem, gemな感じで進んでいますよねー。とにかく便利ですね、gems。ライブラリのインストールだけじゃなくて検索も、当然アンインストールも、同じライブラリでいくつか違うバージョンがあっても大丈夫だし。Javaにもこういうのがあるといいのになぁ。あえて取り上げるとMavenが近いかもね、gemsには。


その1 インストールしなくていいgemsがいくつか

さて、さて、もしかすると、前回(http://d.hatena.ne.jp/yokolet/20100531#1275357454)の起動時オプション編の「その4 JRubyスピードアップのオプション」のところで、"require 'rubygems'"というのを見て、”rubygemsのインストールの話しなんて全然していないのに”と思ったRubyな人がいたかも。これは、rubygemsがインストールしてあるなんて当たり前というワケじゃないんです。JRubyには最初から、いくつかのgemがプレインストールされた状態で配布されているからなのです。もし、JRubyをインストール後、まだ何もgemをインストールしていなかったら、ちょっと見てみてください。JRubyにはjgemっていうコマンドもあるんだけれど、大抵は jruby に -S オプションを付けて実行、、、こんな感じ。

jruby -S gem list

LOCAL GEMS ***
columnize (0.3.1) rake (0.8.7) rspec (1.3.0) ruby-debug (0.10.3) ruby-debug-base (0.10.3.2) sources (0.0.1)
でしょ!rubygemsはlistには出てこないけれど、ちゃんと入っています。気になったら、jruby-x.x.x/lib/ruby/site_ruby/1.8/ ディレクトリをご覧くださいませ。ね、ちゃんとあったでしょ? なんで、最初からいくつか入っているのかというと、、、JRubyJavaのアプリケーションだからポータブルじゃないといけないから。 JavaのアプリケーションやらAPIやらを使うときって、ダウンロードしたらjarアーカイブにパスを通すだけだったり、アプリケーションだったら、java -jar xxxx.jarとかで動くよね。セットアップとかしないよね。ね。ね。つまり、、、インストール編(http://d.hatena.ne.jp/yokolet/20100529#1275156722) でちょろっと話しをしたjruby-complete.jarがあると、、、
java -jar lib/jruby-complete.jar -S irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> 
ほぅら、動いた。だから、JRubyjruby-complete.jarはOS Xの私のディレクトリに置いておいても、コピーして誰かのWindowsマシンに持っていっても、java -jar jruby-complete.jarって叩けば動く、Rubyが使えるのですよ。さすが Java! ポータブルでいいでしょ。(^^v Jarアーカイブをポータブルにするために、JRubyには基本的なgemsはあらかじめインストールされているんです。このあたりの話しは Nick Sieger氏のブログにいくつかあります。例えば、コレとか。 おぉ、使ってますね、-Xmxオプション。 その2 どのgemなら使える? かなりのRuby用gemがJRubyでも使えます。有名どころのrailsとか、cucumberとかいろいろ。試しに、「Ruby逆引きレシピ」のレシピ11と13のcheatとwirbleなんか使ってみました。
jruby -S gem install cheat
Successfully installed cheat-1.2.1
1 gem installed
Installing ri documentation for cheat-1.2.1...
Installing RDoc documentation for cheat-1.2.1...
で、cheatコマンドはjruby-x.x.x/binにインストールされているので、そのままcheatコマンドを実行してもいいのですが、例によって -Sオプションを使うと、
jruby -S cheat sheets
All Cheat Sheets:
  a2ps
  a2ps_page_size
  ack
....

(すごーくよく使うgitコマンドをcheatしてみる)
jruby -S cheat git
git:
  Setup
  -----
  
  git clone 
.....
もひとつ。wirbleもjruby -S gem install wirbleして、jruby -S irbして、、、おぉ、極彩色。。。 ただ、残念ながら全てのRuby用gemsが使えるわけではありません。例えば、racc(parser generator)なんか、
jruby -S gem install racc
Building native extensions.  This could take a while...
ERROR:  Error installing racc:
	ERROR: Failed to build gem native extension.

/Users/yoko/Tools/jruby-1.5.0/bin/jruby extconf.rb
WARNING: JRuby does not support native extensions or the `mkmf' library.
         Check http://kenai.com/projects/jruby/pages/Home for alternatives.
extconf.rb:7: undefined method `create_makefile' for main:Object (NoMethodError)
....
な感じで、失敗してしまう。(コレ、kenai.comのJRubyプロジェクトのWikiを見にいったところで、どこにalternativeが出ているのか発見できないのですよ。誰か知ってる?) 以前はisitjruby.comというドメインがあってどのgemがJRubyで使えるかわかるようになっていたけれど、現在お休み中のもよう。残念。 その3 Cのライブラリを使うgemは? 使えます。はい。FFI経由で使えます。JRubyには最初からffiがインストールされているので、cRubyのように "gem install ffi"する必要もありません。XMLライブラリのNokogiriもpure JavaじゃないJRuby用はffi経由でLibXML2を使っています。でも、FFI経由で接続するライブラリのメンテナンスはけっこうめんどうくさいらしい。Nokogiriの開発者Mike(flavorjones)さんは、FFI版はdropしてさっさとpure Java一本にしぼりたいと言っていたのも、その辺が理由みたいだ。 こうしてFFI経由でCのライブラリを使うgemsも利用可能なのは世界が広がっていいのですが、、、そこにJavaアプリJRubyの悩みが‥。Pure Javaな環境、Javaしか使えない環境ではCのライブラリが必要なgemsは動かないという致命的な問題が、、、!!たとえば、Google App EngineとかAndroid(アメリカではDroidって、よく言う。"どろ〜ぃど"なTVコマーシャルもあり)とか。#並べてみると、両方ともGoogleだ。。。 そんなこんなで、Ruby gemsのJava portなんていう話しをちょろちょろと見かけるんですよ。Java portっていうのは単にJRubyで動くようにするのではなくて、pure Javaで実装するという意味で。 FFIの参考になりそうなのは、 あたりかな。もう古くなってきているけれど。それにしても、Javaの上で、Rubyのコードを動かして、Cの関数を呼び出し、ってマジックみたい。 その4 JRuby限定gems Gem, gem, gem,,,いろいろなgemsの中にはJRuby限定!なものもそれなりにある。有名どころだと、railsからDBに接続するためのgemなんかでしょ。有名だから知っている人も多いと思うけれどJRubyの場合JDBCを使うから、たとえば、
SQLite3
jruby -S gem install activerecord-jdbcsqlite3-adapter

MySQL
jruby -S gem install activerecord-jdbcmysql-adapter
他にもPostgreSQLだの、Oracleだのいろいろあるので、 をどうぞ。 そして、きっとこれも有名だと思うけれど、warbler gem。 パッケージングのgemですね。RailsなんかのRackベースのアプリをTomcatやらJettyやらJavaServlet Container上で動かすためのwarファイルを作ってくれるgemです。Javaですからね、必要なgemsなんかもぜーんぶまとめて一つのwarに。Gems in warだ。 さらに、これも有名だと思うけれど、Google App Engine gem。 なんだか、http://gihyo.jp/dev/serial/01/ruby/0016なんか、とても試してみたくないくらい面倒なことが書いてあったけれど、イマドキなら、このgemでカンタン、ラクラクのはず。 同じく、これも有名だと思うけれど、Glassfish gem。 で、このgemで最近もうひとつ有名になったのは、、、どうやら危機に瀕しているらしいということ(http://www.infoq.com/news/2010/04/glassfish-gem-alternatives-jruby)。Oracleはgemのサポートをしないらしい。Glassfish gemを救え!運動が始まりそうな。。。 ということで、gem, gem, gemな話しでした。最後に、名前だけあげたgemたちについてはそのうち、また話しをしたいなぁと思います。JRuby-Rackとかもあったりするし。