RailsConf 2010二日目

さぁ、始まりましたよー、RailsConf 2010。オープニングは9:00amからだから、早めに、、、と思いつつ、8:30すぎに会場に到着したら、もう、大勢の人が集まって、それぞれに楽しげに話しをしていました。カンファレンス会場Level4では朝食が用意されています。パンとフルーツと飲み物の、コンチネンタルな朝食です。

9:00amにオープニングトーク
一応、写真をとってはみたのですが、暗い会場で、古いデジカメではうまくとれず、、、 RailsConfのサイトにちゃんとした写真が載るはずなので、ここでは雰囲気だけ味わってくださいませ。話しの内容はというと、、、この手のオープニングでは恒例のサーベイが最初。このサーベイによるとほとんどがRailsConfリーピータだねってことになったのですが、後に、初めての人は?の質問にはこれも結構いて会場から笑いが。実際、会場に来ている人に聞いてみると初めて、という人が何人もいました。そういう私もこれが最初。Windowsユーザは?に反応した人がかなり少ないのにはびっくり。確かに会場はMac, Mac, Mac.....。ちなみに、カンファレンス会場内でもwifiが使えるのでした。親切に電源も多数用意されています。さすが!!!
サーベイの他はカンファレンスのご案内でした。


そして、いよいよDHHのキーノート。この写真も雰囲気だけ味わってくださいませ。生DHHがそこにいたとうことで。詳しいキーノートの内容はきっと、いろいろなところで紹介されるはずだし、ビデオも公開されると思うので、ここでは雰囲気を味わえる程度に書いておこうと思います。
DHHの話しはRails3のいわゆるテクニカルな内容。いかにも、技術屋さんな感じで、コードを前面に出して、Rails3はどこがどうよくなったかをこれでもかっ、という感じで解説してくれました。私が初めてRailsを使ってみたときに、プログラムなんだか、記号をならべているんだかミョーな感じがしたあたりが、かなり自然なRubyのコードに変わっています。ま、詳しい話しはRailsな人ならとっくに知っているはずなので、これもあまり書きませんが、これだよ、これがRubyだよって思った。いいかも、Rails3。RESTfulなあたりも、自然な感じだった。


続くキーノートはMichael Feather氏のよいコードとは何かについて。いやぁ、これは哲学的で話しが難しかったなぁ。早口だったし。Big ball of mud - Wikipediaってこの業界では有名だったのかしら、、、知らなかった。。。CMSを使って、コードをきちんと管理しような話しやらコードのどの部分がもっともよく使われているのかを把握しろな話しやらでしたね。まぁ、このキーノートも公開されるはずなので、詳しくはそちらをどうぞ。


キーノートが終わると、5つの会場でセッションが平行して進みます。私はBuilding an API with Rails(パネル)に行ってみました。でも、時間がないのかなぁ、、、パネルという感じではなくて、かくお題について、パネラーが自分はこうしているとちょっとずつ話しをするだけ。ディスカッションしてくれたほうが面白かったかも。。。お題そのものはWebアプリ屋さんには興味深いものではありました。AuthenticationやらScaling、Securityなどなど。


次のセッションは、From 'Rails' to 'Release'に行ってみました。この発表のスライド、必見です。公開されたらぜひご覧ください。とてもアートなスライドでプログラミングの発表じゃないみたいなのだけれど、ちゃんと話しの内容をサポートしているんですよ。これって才能じゃないか、と思った。2週間でRailsでアプリを作ってリリースしちゃう、話しで、Day 1のあれとこれをやって、Day 2には、、、Day 13にはpolishしてさぁ、Ship it!リリースだ、というもの。そして、"keep the cukes green"と、cucumberによるテストを欠かさず実行していつもパスするような状態にしておくんだそうな。ちなみに、cucumberは大人気のようす。他のスピーカもcucumberっていっていたし、隣に座った人と話しをしたら、やっぱりcucumberはいいって言っていたし。


そして、お昼ご飯。これはカンファレンス代に入っている。バイキング形式で品数は多くないけれど、けっこうおいしい。食事をしながら、参加者どうし話しがはずみます。テキサス大学の3年生だという人がいたのですが、かなりプログラミングをやっている様子。すごいなぁ。自分もそのくらいのころから真剣にプログラム書いていたら人生変わっていたよねー、と、後悔。もう、手遅れだが、、、ドイツ、ベルリンから20時間かけてやってきた人もいました。ドイツの人って(プログラマーはかも)、英語が話せるみたいで、ドイツでこの手のカンファレンスをやるときには全部英語でも問題ないらしい。日本とは偉い違いだ。日本人は英語が話せないんだー!!!ととりあえず主張しておいた。Matzの英語についても話しが出たのですが、Matzは日本人にしてはすごく英語が上手なんだよと教えてあげましたよ。
お、そういえば、一人でやってきていた日本人女性を発見。RailsConfは初めてとか。お互い楽しみましょう!

展示会会場はこんな感じ。Engine Yardが正面で、その後ろにHerokuとかいろいろ。


お昼ご飯会場はExhibit Hallのお隣だったので、Engine Yardのブースへ行ってみると、、、、いましたぁ!!Charles Nutter氏、Tom Enebo氏、そしてNick Sieger氏。うわぁ、感動かも。いつもメールやら、チャットやら、JIRAのコメントやらのオンラインのコミュニケーションだけでしたからね。話しを聞くと、彼ら自信、会ったことのないJRubyコミッタが何人もいるらしい。Vladに会ったことがないというのは意外。JRubyKaigiの話しやら、Ruby 1.9サポートの話しやら(エンコーディング関係の問題とか)、しばし話しをしてまいりました。
あ、NokogiriのAaron Peterson氏にも会えましたよ。彼の方から声をかえてくれたんですよ。よくわかったなぁ。。。"えぃれん"な感じの発音をされて、最初は"あれっ、誰???"と思った。だって、長髪の例の写真と全然ちがうんだもの。わかりませんでしたよ。Nokogiriのって言われてすぐにわかった。Ruby Hero受賞、おめでとうございます!


午後のセッションはInheriting CodeとDataMapper 1.0に行ってきました。Inheritingの方は、とても現場な感じ。誰かが書いたコードを引き継いで、バグフィックスやらリファクタリングやらを行う話しです。この手の話しは万国共通?かも。Forensic Analyst(犯罪の科学捜査アナリスト)のような、、、だんなんて。(^^;; 引き継いでしまったのは、有名なオープンソースのすばらしいコードとかはなくて、ダメ系のコードが前提の話しでしたね。
DataMapperは本日1.0リリースだとか。タイトルが最初から"DataMapper 1.0"ってことは以前から計画されていたってことですね。DataMapperは使ってみたいなぁと思いつつ、そのままになっているので、何が新しくなっているのかいまひとつわかりませんでした。が、ORマッピングの記述がかなり自然な感じ。Rubyらしいし。質問時間中、GoogleのJohn Woodell氏が翌日のHackfestの宣伝をしておりました。DataMapperもテーマの一つになっていらしい。


ここで、break(休憩)が。3時のおやつですね。展示会場の中で、フルーツとデザート、飲み物がでました。デザートがおいしい。明日もあるのかしら‥。楽しみかも。


そして、本日最後のセッションは、Engine Yardのお二人、Evan Phienix氏とCharles Nutter氏によるRuby's Dark abd Dusty Cornersです。Rubyプログラミングではまるところの解説でした。Threadはつかうなぁ、autoloadはthread safeではないから気をつけろとか、ObjectSpaceの_id2refはダメだ、使うな、とか。いろいろ。テストコードのテストが必要だというのはちょっと笑ったかも。引き合いに出されていたテストコード、たしかに気をつけないとやってしまうかも、、、、でした。


勝手に夕飯を食べてこいの次は本日最後のキーノート(こんな時間に?! 7:00pm始まり)、Yahuda Katz氏の話しと、続いて、Ruby Hiro表彰式でした。Katz氏の写真は例によって雰囲気だけお楽しみください。Katz氏の話しは技術的な話しはいっさいありませんでした。この業界でimpossibleをpossibleに変えた人々の話し、夢がある話しがメインでした。Railsを支えているのはアメリカ人のコンピュータサイエンスを専攻したひとではなく、とにかくhard workで一生懸命やっている人たちなのだ、と。中には英語があまりうまくないという人もいるとのこと。日本人だってできますよ。すでに何人かは貢献済みだとは思いますが。


このように、今日の一日が終わりました。また明日。


[追記]
RailsConf 2010のスライドやビデオはこちら

RailsConf 2010にやってきました

やってきました、RailsConf 2010。今日はチュートリアルの日。ちょっと節約してチュートリアル無しのパスにしたので、特に何も聞きにいってはいません。Free wifi areaでひとときを過ごしていたら、GAEのJohn Woodellさんに会いました。ちょっとだけ、pure Java Nokogiriの話しをしたところで、Woodell氏は急がしそうに去っていかれました。その後、BOF掲示を眺めていると、Sarah Allenさん(http://en.oreilly.com/rails2010/public/schedule/speaker/73874)に声をかけられて、一緒に夕飯を食べにいってきました。Allen氏はこのRailsConfでもスピーカですが、8月末のRubyKaigiでもスピーカだとのこと。RubyKaigiでのタイトルは日本語の「イノナカノカワズ」だと言っていました。日本語のテキストサーチをするべく、いろいろ勉強していようすです。楽しみですね。ところで、彼女、Matzに発音してもらった日本語(ビデオ)を持っていた、、、Allen氏の会社の日本人通訳はMatzが何を言っているのかまったく理解できないと言ったそうな、、、(^^ だって、ちょー濃いプログラミングの話しをしているんだもの。この世界の人じゃないとムリ。

本日の写真はとりあえず、message board。どちらかというと、job posting boardのような感じになっている。Herokuとかいろいろな会社がhiring!のメッセージを書き込んでいました。Wifi areaで会った人からは、"unemployed(私のこと)だったら、そこのメッセージボードを見にいけばきっと仕事が見つかるよ"とのこと。不況のアメリカだけれど、この業界はそうでもなさそうな感じ。。。

Welcome to B'more Pub Night(カンファレンス会場近くのレストランで飲んで雑談をする)にも立ち寄ってみました。が、ここはうるさすぎて話しが聞こえない。。。わからない。。。x_x

明日は朝からDHHのkeynote、そしてセッション本番。いろいろ聞いてきます。

JRubyいろいろ - 「Ruby逆引きレシピ」のJRubyレシピ

Ruby逆引きレシピ」にはJRubyのレシピが3つ、161, 162, 163あるんですね!うれしいなぁ、こんなところにもJRubyが、、、こうしてあちらこちらでJRubyのあれこれが増えると、きっと使ってくれる人も増えるよね。

でも!あ、ちょっと違う‥、なところが。もうちょっと説明がほしいかも‥なところがいくつか。ま、これまではあまりまとまった情報はないし、kenaiのWikiは古いの新しいのがごちゃ混ぜで、どれが正しいのかよくわからなかったのかもしれないので、やむを得ないでしょう。いまなら、core developersの執筆本(Using JRuby: Bringing Ruby to Java by Charles O Nutter, Thomas Enebo, Nick Sieger, Ola Bini, and Ian Dees | The Pragmatic Bookshelf)が出ているので、これが一番いいのでは。が、まだ邦訳は出ていないので、今回のJRubyいろいろは勝手にレシピ修正&追加編を果敢に実行と行きましょう。


その1 レシピ161を勝手に修正

hello_jruby.rb(レシピ161から引用)

require 'java'
import 'java.lang.System'

System.out.println("Hello, JRuby")

うん、間違ってはいない。でも、なんか、このいかにもRubyシンタックスJavaを使ってみました風がいまひとつ。。。かつて、私がJavaを使い始めた十数年前に、Javaシンタックスを使ったC言語なプログラムを書いていたのを思い出すような。。。で、こんなんどう?Rubyっぽくなったでしょ?

require 'java'
Java::JavaLang::System.out.println "こんにちは, JRuby"

Rubyな人なら一目でわかるmodule定義を使った方法ですね!JRubyjavaライブラリはこの例のようなモジュールでのクラス呼び出しができるようにしてくれているんです。ついでに日本語も大丈夫。これはRuby 1.8.7モード。

で、もうひとつ。import文が何をしているのかの説明が欲しかったかも。JRubyのimport文はJavaのimport文とは若干違う使い方をするので。ええ、そうです。モジュール定義の中でつかえるんですよ。レシピ163では include_packageを使っていますが、importも使えるんです。JRubyJavaライブラリがやっているみたいに。ちなみに、こんな MyJavaモジュールを定義すると、java.lang.Systemもjava.util.concurrent.ConcurrentHashMapもMyJavaなクラスみたいにして使えちゃう。

require 'java'

module MyJava
  import "java.lang"
  import "java.util.concurrent"
end

MyJava::System.out.println "こんにちは, JRuby"
h = MyJava::ConcurrentHashMap.new
h.put("日本語", "はろ〜")
h.put("英語", "Hello")
puts h

これを実行すると、こんな風にプリントされる。

こんにちは, JRuby
{英語=Hello, 日本語=はろ〜}

Hashの方の順番がputした順じゃないのはオブジェクトがJavaのhashだからなんですよ。Javaの場合、hashの順番は保証されていませんからね。

では、もしもimportしたいパッケージがたくさんあったらどうする?ひとつひとつ書いていく、、、?いやいや、Rubyなプログラムでそんなことはしませんよ、ね。

module MyJava
  ['lang', 'util', 'util.concurrent'].each do |name|
    import "java.#{name}"
  end
end

な感じで、配列に並べていけばよし、と。Rubyな人なら、もっといろいろアイディアがありそう。


ここで、ちょっとレシピ163に飛んで、、、サンプルにjava.utilを使っていますが、これはすでにJRubyがモジュール定義しているので、

h = Java::JavaUtil::HashMap.new

で行ける。自分が書いたクラスとか、jp.xxx.xxxなクラスとかはモジュール定義のありがたみがあるじゃないかと。


次ぎは jirbね。起動はjirbでもいいんだけれど、jruby -S irbの方がいろいろなオプションを指定できて便利。たとえば、Ruby 1.9モードで使いたい場合は

jruby --1.9 -vS irb
jruby 1.5.0 (ruby 1.9.2dev trunk 24787) (2010-05-12 6769999) (Java HotSpot(TM) Client VM 1.5.0_24) [i386-java]

なんかできる。

ま、これはいいとして、、、「jirbはrequire 'java'が実行された状態で起動するため」はうそだよぉ〜 (^^;; このサンプルはJRubyが内部で自動的にJavaライブラリをロードするコードだったから、そう勘違いしただけだと思う。その証拠に、


ー追記ー
!!!おぉっと、失礼。JRuby 1.5.0 は起動時のパフォーマンスを良くするために、Javaライブラリをロードしなくなったから、jirbもrequire 'java'された状態では起動しなくなったのでした。レシピは明らかにJRuby 1.5.0よりも前のバージョンで書かれているので、ここは正しいはず。
ということで、JRuby 1.5.0を使う場合はrequire 'java'をお忘れなく。Nokogiriも1.4.2から、内部でrequire 'java'をするようになったのですが、それ以前ははこれをやっていないので、JRuby 1.5.0でうごかん!ということがあるかも。

jirb
irb(main):001:0> require 'java'
=> true
irb(main):002:0> require 'java'
=> false

ね。最初のrequire 'java'はJavaライブラリをロードしました、の、true。二回目のrequire 'java'はもうロードしてあるから、二度はロードしないよ、の、falseになっているでしょ?駄目押しに、Javaライブラリがロードされていないと使えない、to_javaメソッドを試すと、

jirb
irb(main):001:0> "Heeey!".to_java
NoMethodError: undefined method `to_java' for "Heeey!":String
	from (irb):1
irb(main):002:0> require 'java'
=> true
irb(main):003:0> "Heeey!".to_java
=> #

というように、jirbは決してJavaライブラリがロードされた状態では起動しません。Javaのクラスを使うときはrequire 'java'を習慣にしておくといいかも。付け足すと、レシピのコードはJRubyJavaプロクシが使われたので、自動的にJavaのライブラリがロードされたものなのですよ。


その2 レシピ162を勝手に修正
(レシピ162から引用)

require 'java'
require 'example.recipe.sample.jar'

sample = SampleClass.new

って、require 'example.recipe.sample.jar'がビミョー。このrequireは必要なのかもしれないけれど、無駄かもしれない。もしも、requireしないと動かないと仮定すると、そこからわかるのは、"example.recipe.sample.jar"っていう名前のjarアーカイブjrubyコマンドを実行したディレクトリ(カレントディレクトリ)にあって、かつ、カレントディレクトリにクラスパスが通っていないということ。もしも、これが、

require '/Users/yoko/example/recipe/sample.jar'

だったら、あぁ、そこにあるjarアーカイブをロードしたのね、と素直になっとくできるんだけど。。。

このあたりは、JRubyJavaアプリでしかもRubyを動かしちゃうという複雑なところで、わかりにくいところでしょうねぇ。で、どうしたらjarアーカイブの中身をRubyで使えるようにできるかというと、、、

require '/Users/yoko/example/recipe/sample.jar'

この場合、Javaのクラスパスの設定は無用

  • ケース2 Jarアーカイブのあるところをクラスパスに設定する
export CLASSPATH=$CLASSPATH:/Users/yoko/example/recipe/sample.jar
(Windowsは : の代わりに、; でしたね)
あるいは
jruby -J-cp /Users/yoko/example/recipe/sample.jar -S irb

JRubyJavaのアプリですからね、クラスパスが設定されているところ、例えばWebアプリのWEB-INF/libとかWEB-INF/classesとかにあるものは自動的に読み込みますよ。Servletコンテナがクラスパスを設定しているから。さらに、JRubyJavaのアプリですからね、-J-cpでjarアーカイブを見にいきまよ。

(.rbの中、あるいはirbで)
$CLASSPATH << '/Users/yoko/example/recipe/sample.jar'


では、実際に試してみましょうか。こんなクラスを作って、Oak.jarというアーカイブを作ってみました。

package acorn;

public class SimpleMethods {

    public double getSqrt(int v) {
        return Math.sqrt*1;
    }
}

いろいろあるパス設定、今回はJavaっぽく、-J-cpを使ってみました。

jruby -J-cp ~/NetBeansProjects/Oak/dist/Oak.jar -S irb
irb(main):001:0> require 'java'
=> true
irb(main):002:0> m = Java::Acorn::SimpleMethods.new
=> #
irb(main):003:0> m.getSqrt 144
=> 12.0

おぉ、何やら動きましたねぇ。
パスの設定についてはこの辺が参考になるかも。


と、動いたところで、レシピ162にでているように、もっとRubyっぽい感じのメソッド名を試そうじゃないですか。で、どんなメソッド名が使えるの?と思ったら、methodsメソッドを叩いてみよー!

irb(main):004:0> m.methods
=> ["__jsend!", "get_sqrt", "__jcreate!", "sqrt", "getSqrt", "hashCode", "finalize", "getClass", "equals?", "toString", "get_class", "hash_code", "clone", "notifyAll", "to_string", "notify_all", "equals", "wait", "notify", "initialize", "java_send", "marshal_load", "java_method", "marshal_dump", "equal?", "java_class", "inspect", "eql?", "to_java_object", "synchronized", "java_object", "java_object=", "==", "to_s", "hash", "__jtrap", "java_kind_of?", "handle_different_imports", "include_class", "object_id", "frozen?", "java_package", "methods", "=~", "to_a", "tainted?", "javax", "tap", "taint", "public_methods", "dup", "method", "java_require", "singleton_methods", "is_a?", "instance_eval", "instance_variable_get", "com", "java_signature", "instance_of?", "java", "java_name", "org", "__id__", "__send__", "id", "instance_variable_set", "send", "untaint", "class", "protected_methods", "kind_of?", "enum_for", "instance_variable_defined?", "instance_variables", "display", "extend", "to_enum", "freeze", "java_implements", "private_methods", "nil?", "java_annotation", "type", "===", "instance_exec", "to_java", "respond_to?"]

ごそごそとたくさん出てきたねー。コレ全部、使えるんだけれど、目的はgetSqrt()のRubyっぽいバーションだから、最初の方を見てみると、、、get_sqrtとsqrtなんかも使えそうだ。試してみると、、、

irb(main):005:0> m.get_sqrt 121
=> 11.0
irb(main):006:0> m.sqrt 111
=> 10.5356537528527

おっけー!


さて、ここで、JavaアプリJRubyの悩みが‥。こんなJavaのクラスがあったら、どうやってRubyから使う、、、、?!

package acorn;

public class SimpleMethods {

    public double getSqrt(int v) {
        System.out.println("int version");
        return Math.sqrt*2;
    }

    public static void main(String[] args) {
        SimpleMethods m = new SimpleMethods();
        System.out.println(m.getSqrt(144));
    }
}

Javaには型があるから、3つのgetSqrtの区別はカンタン。でもRubyは型なんて気にしない、なるようになるって、の言語。String引き数はいいとして、intとlongの違いは、、、そんなクラスを定義するなっ、というのもありかもしれないけれど、あっちやらこっちやらでリリースされているAPIを使おうとしたら、自分ではどうしようもないよね。
ご安心ください。JRubyはちゃんとメソッドを区別する方法を用意しています。どのバージョンからだったかは失念。たぶん、1.4.0あたりじゃなかったかなー。じゃ、もう一度 irbで。

jruby -J-cp ~/NetBeansProjects/Oak/dist/Oak.jar -S irbirb(main):001:0> require 'java'
=> true
irb(main):002:0> m = Java::Acorn::SimpleMethods.new
=> #
irb(main):003:0> m.sqrt "144"       <--- Stringは大丈夫
String version
=> 12.0
irb(main):004:0> m.sqrt 144        <--- Fixnumはjava.lang.Longにマップされる
long version
=> 12.0
irb(main):010:0> m.java_send :getSqrt, [Java::int], 144 <--- java_sendを使うとintバージョンも呼べる
int version
=> 12.0
irb(main):011:0> m.java_send :getSqrt, [Java::long], 144 <--- java_sendでlongバーション
long version
=> 12.0
irb(main):013:0> m.java_send :getSqrt, [Java::JavaLang::String], "144" <--- java_sendでStringバーション
String version
=> 12.0

というこで、無事オーバーロードされたメソッドを区別して使えました。java_sendを使うと、Javaのメソッド名そのままで、エイリアスのget_sqrtやsqrtは使えないけれど、intバージョンを呼べないよりはいいでしょう。


以上、勝手にレシピ修正&追加編でしたー。

次は RailsConfの後ですね。ええ、行くんですよ、RaisConf, Baltimore。楽しみー!!!
誰か、RailsConf行く人がいたら、会場で私を見かけたら声をかけてくださいませ。

*1:double)v); } public static void main(String[] args) { SimpleMethods m = new SimpleMethods(); System.out.println(m.getSqrt(144

*2:double)v); } public double getSqrt(long v) { System.out.println("long version"); return Math.sqrt((double)v); } public double getSqrt(String v) { System.out.println("String version"); return Math.sqrt(Double.valueOf(v

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とかもあったりするし。

JRubyいろいろ - 起動時オプション(コマンドラインオプション)

インストール編(http://d.hatena.ne.jp/yokolet/20100529#1275156722)に書いたどれか(もしかするとさらに他のインストール方法もあるかも。。。NetBeansに付いてきたとか)で、JRubyをインストールできたら、次は当然、使っちゃうぞー!でしょう。では、さっそく。


その1 動く?
定番、Hello Worldの前にやっておくのは、ほんとーにJRubyが動いている?を確認すること、ですね。Hello Worldが動かなかったときに、なにがまずいかを特定するためにも必要。ので、最初はコレ。

jrubyコマンドへのパスは通してあるよね!、じゃ、

jruby -v
jruby 1.5.0 (ruby 1.8.7 patchlevel 249) (2010-05-12 6769999) (Java HotSpot(TM) Client VM 1.5.0_24) [i386-java]

バージョン番号、でたかな?まれに、JDKのバージョンと相性が悪くて動かないことがあるみたいです。すでに一年前の話しなので、状況は変わっていると思いますが、
http://kenai.com/projects/jruby/pages/JRubyOnUbuntu
http://kenai.com/projects/jruby/pages/JRubyOnHPUX11_23
なんかがあるので、JRubyが動いているかどうかの確認をお忘れなく。


その2 定番、Hello Worldは?
定番、定番。もう、コレをやらなきゃプログラミングは始まらないよねー。JRubyの場合、基本的にRubyと同じなので、

jruby -e"puts 'Hello World'"
Hello World

とか、

jruby -e"puts \"Hello World\""
Hello World

とかして、-eオプションをつければ"(double quote)で囲まれた中を評価してくれる、と。日本語だって、

jruby -e"puts 'JRubyいいよぉ。使おうよ!'"
JRubyいいよぉ。使おうよ!

というように、ちゃんと表示してくれます。

もう一つ、Rubyならではのirbを使ってHello Worldしてみるというのも、もちろんあります。JRubyにはirbの他にjirbという最初に"j"をつけたコマンドもあるのですが、一番よく使われているのは "jruby -S irb" ではないかと。なぜかというと、jrubyを使っているということがわかりやすいし、いろいろなオプションを指定したいときはコレが一番だからです。

jruby -S irb
irb(main):001:0> puts 'JRubyいいよぉ。使おうよ!'
JRubyいいよぉ。使おうよ!
=> nil
irb(main):002:0> 


その3 オプションいろいろ
と、ここまでで、すでに3つのコマンドラインオプション-v, -e -Sが出てきました。。。他には?、、、よりどりみどり揃えてございます。。。なのがJRubyRubyとはちょっと違うところですね。-hオプションを叩いてみると、、、

jruby -h
Usage: jruby [switches] [--] [programfile] [arguments]
  -0[octal]       specify record separator (\0, if no argument)
  -a              autosplit mode with -n or -p (splits $_ into $F)
  -b              benchmark mode, times the script execution
  -c              check syntax only
  -Cdirectory     cd to directory, before executing your script
  -d              set debugging flags (set $DEBUG to true)
  -e 'command'    one line of script. Several -e's allowed. Omit [programfile]
  -Fpattern       split() pattern for autosplit (-a)
  -i[extension]   edit ARGV files in place (make backup if extension supplied)
  -Idirectory     specify $LOAD_PATH directory (may be used more than once)
  -J[java option] pass an option on to the JVM (e.g. -J-Xmx512m)
                    use --properties to list JRuby properties
                    run 'java -help' for a list of other Java options
  -Kkcode         specifies code-set (e.g. -Ku for Unicode, -Ke for EUC and -Ks for SJIS)
  -l              enable line ending processing
  -n              assume 'while gets(); ... end' loop around your script
  -p              assume loop like -n but print line also like sed
  -rlibrary       require the library, before executing your script
  -s              enable some switch parsing for switches after script name
  -S              look for the script in bin or using PATH environment variable
  -T[level]       turn on tainting checks
  -v              print version number, then turn on verbose mode
  -w              turn warnings on for your script
  -W[level]       set warning level; 0=silence, 1=medium, 2=verbose (default)
  -x[directory]   strip off text before #!ruby line and perhaps cd to directory
  -X[option]      enable extended option (omit option to list)
  -y              enable parsing debug output
  --copyright     print the copyright
  --debug         sets the execution mode most suitable for debugger functionality
  --jdb           runs JRuby process under JDB
  --properties    List all configuration Java properties (pass -J-Dproperty=value)
  --sample        run with profiling using the JVM's sampling profiler
  --client        use the non-optimizing "client" JVM (improves startup; default)
  --server        use the optimizing "server" JVM (improves perf)
  --manage        enable remote JMX management and monitoring of the VM and JRuby
  --headless      do not launch a GUI window, no matter what
  --1.8           specify Ruby 1.8.x compatibility (default)
  --1.9           specify Ruby 1.9.x compatibility
  --bytecode      show the JVM bytecode produced by compiling specified code
  --version       print the version

いやぁ、けっこうあるね。Rubyな人にはお馴染みのオプションが半分くらいあるけれど、見たことがないオプションも結構あるかも。ところが、実はこれだけじゃあない。もっとあるんです。もうひとつのヘルプオプション --propertiesを付けてJRubyを起動してみると、、

jruby --properties
These properties can be used to alter runtime behavior for perf or compatibility.
Specify them by passing -J-D=

COMPILER SETTINGS:
    jruby.compile.mode=JIT|FORCE|OFF
       Set compilation mode. JIT is default; FORCE compiles all, OFF disables
    jruby.compile.fastest=true|false
       (EXPERIMENTAL) Turn on all experimental compiler optimizations
    jruby.compile.frameless=true|false
       (EXPERIMENTAL) Turn on frameless compilation where possible
    jruby.compile.positionless=true|false
       (EXPERIMENTAL) Turn on compilation that avoids updating Ruby position info. Default is false
    jruby.compile.threadless=true|false
       (EXPERIMENTAL) Turn on compilation without polling for "unsafe" thread events. Default is false
    jruby.compile.fastops=true|false
       (EXPERIMENTAL) Turn on fast operators for Fixnum. Default is false
    jruby.compile.fastcase=true|false
       (EXPERIMENTAL) Turn on fast case/when for all-Fixnum whens. Default is false
    jruby.compile.chainsize=
       Set the number of lines at which compiled bodies are "chained". Default is 500
    jruby.compile.lazyHandles=true|false
       Generate method bindings (handles) for compiled methods lazily. Default is false.
    jruby.compile.peephole=true|false
       Enable or disable peephole optimizations. Default is true (on).

JIT SETTINGS:
    jruby.jit.threshold=
       Set the JIT threshold to the specified method invocation count. Default is 50.
    jruby.jit.max=
       Set the max count of active methods eligible for JIT-compilation.
       Default is 4096 per runtime. A value of 0 disables JIT, -1 disables max.
    jruby.jit.maxsize=
       Set the maximum full-class byte size allowed for jitted methods. Default is 10000.
    jruby.jit.logging=true|false
       Enable JIT logging (reports successful compilation). Default is false
    jruby.jit.logging.verbose=true|false
       Enable verbose JIT logging (reports failed compilation). Default is false
    jruby.jit.logEvery=
       Log a message every n methods JIT compiled. Default is 0 (off).
    jruby.jit.exclude=
       Exclude methods from JIT by class/module short name, c/m::method_name,
       or -::method_name for anon/singleton classes/modules. Comma-delimited.
    jruby.jit.cache=true|false
       Cache jitted method in-memory bodies across runtimes and loads. Default is true.
    jruby.jit.codeCache=
       Save jitted methods to  as they're compiled, for future runs.

NATIVE SUPPORT:
    jruby.native.enabled=true|false
       Enable/disable native extensions (like JNA for non-Java APIs; Default is true
       (This affects all JRuby instances in a given JVM)
    jruby.native.verbose=true|false
       Enable verbose logging of native extension loading. Default is false.
    jruby.fork.enabled=true|false
       (EXPERIMENTAL, maybe dangerous) Enable fork(2) on platforms that support it.

THREAD POOLING:
    jruby.thread.pool.enabled=true|false
       Enable reuse of native backing threads via a thread pool. Default is false.
    jruby.thread.pool.min=
       The minimum number of threads to keep alive in the pool. Default is 0.
    jruby.thread.pool.max=
       The maximum number of threads to allow in the pool. Default is unlimited.
    jruby.thread.pool.ttl=

これらのオプションは

http://kenai.com/projects/jruby/pages/JRubyOptions

に一覧を作っておいてあるので、ざざっと眺めてくださいませ。この一覧はRedBridge(JRuby Embed)にコンフィグ用のメソッドをいろいろ追加するときに、ソースコードを眺めつつまとめたものです。とにかくやたらたくさんあって、なにがどうだったか忘れてしまうので。ただ、すべてのオプションがまともに動くワケではなくて、かなーりexperimentalなオプションも混じっているらしいので、中には"効かん!!"というのもあるかも。

オプションを改めて眺めるとよーくわかるのが、JRubyはやっぱりJavaのアプリケーションなんだということ。Javaシステムプロパティやコマンドラインオプションを使ってJVMのコンフィグをする、というJavaな人には当たり前すぎる方法、でもRubyな人には未知の世界(?)な方法がいくつもあります。これらJavaなオプション使いこなしはJRuby使いこなし、スピードアップのためには必須なので、マスターすべし。だって、思ったでしょ。Hello Worldirb起動して、"JRuby遅ぇ"って、MRIに比べたら。:)


その4 JRubyスピードアップのオプション
JRubyの名誉のため、念のため、言っておこうと思いますが、JRubyはそれなりのアプリケーションを動かす上では実行速度という点でMRIに決して引けはとりません(きっぱり)。起動は確かにMRIに比べて遅いけれど、一度立ち上がってしまえば早いんです。このあたりはHello Worldじゃわかりませんから。

それでもやっぱり実行速度は速いにこしたことはないし、"もっと速く!"という願いは不変なので、チューンアップ方法をいくつか。

Javaな人にはお馴染み、JVMにはclientモードとserverモードがありますよね。ぜひ、clientモードでお試しを。これは私自身も経験したのですが、、、、なんだかJDK 6だとミョウに遅い。JDK 5ならもっと速いのに、、、何だこの違いは?!と思ったら、JDK 5はclientがデフォルトでJDK 6はserverがデフォルトになっているのでした。その後、client/serverでのパフォーマンスの違いはIRCでも話題になっていて、"やっぱりね"と思った。この話しはCharles Nutter氏のブログ

Headius: JRuby Startup Time Tips

にも登場。ちなみに私のOS Xで試したら、

time jruby -J-server -ve "require 'rubygems'; require 'columnize'"
jruby 1.5.0 (ruby 1.8.7 patchlevel 249) (2010-05-12 6769999) (Java HotSpot(TM) Server VM 1.5.0_24) [i386-java]

real	0m1.741s
user	0m2.214s
sys	0m0.208s

time jruby -J-client -ve "require 'rubygems'; require 'columnize'"
jruby 1.5.0 (ruby 1.8.7 patchlevel 249) (2010-05-12 6769999) (Java HotSpot(TM) Client VM 1.5.0_24) [i386-java]

real	0m1.315s
user	0m1.090s
sys	0m0.149s

な感じで、やっぱりclientを選ぶと速い。ところで、OS XJDK 6だと -clientを指定しても常にserver JVMでしか起動しないのはバグなのかしら?UbuntuのOpenJDK 6はちゃんと切り替わったけれど。。。

  • JITはOFFの方がいいときがある

Nutter氏のブログにもあるチューンナップから、もう一つ。JRubyJIT compilerはOFFにした方が速い場合がある。なぜかというと、compileのプロセスが遅いから。JITが効きそうなプログラムの実行ならJITをONにしておいた方がみたいだけれど、そうじゃないときはOFFのほうがいいかも。-X-CでOFFにできます。ただ、"require 'rubygems'; require 'columnize'"の程度だと違いはびみょー。

  • ObjectSpaceをOFFにすると速くなるかも

次はこちらにあるチューンアップから。

http://kenai.com/projects/jruby/pages/PerformanceTuning

ObjectSpaceというもの、私はあまり使ったことがないのですが、Rubyな人はよく使うのかな?「Ruby逆引きレシピ」だと、レシピ198の”オブジェクトが存在しているかを調べたい”で使ってますね。ま、必要無い場合、JRubyは-X-Oで無効にできます。さっきのJIT OFFと一緒に指定すると、、、

time jruby -J-client -X-C -X-O -ve "require 'rubygems'; require 'columnize'"
jruby 1.5.0 (ruby 1.8.7 patchlevel 249) (2010-05-12 6769999) (Java HotSpot(TM) Client VM 1.5.0_24) [i386-java]

real	0m1.217s
user	0m1.041s
sys	0m0.141s

気持ち、速くなっているかも。ちなみに、Performance TuningのドキュメントにあるThread Poolingの機能はアプリケーションによりけり、concurrentでびしばしさばいていかないといけないアプリじゃないと。この辺はJavaのマルチスレッドのノウハウを調べてから使った方がいいかも。--fastオプションも場合によりけり。遅くなることもあって、ビミョーなオプション。

  • とりあえず -Xmx, -Xms。効くかも。

Java使いにとってはいにしえからのお友達です。heapサイズの最大、最小値を設定するJVMオプションですね。特に-Xms、最小値の方はstartup timeに効くはずなので、立ち上がりが速くなるはず。。。32MBを指定して試してみると、、、

time jruby -J-client -J-Xms32m -X-C -X-O -ve "require 'rubygems'; require 'columnize'"
jruby 1.5.0 (ruby 1.8.7 patchlevel 249) (2010-05-12 6769999) (Java HotSpot(TM) Client VM 1.5.0_24) [i386-java]

real	0m1.167s
user	0m0.978s
sys	0m0.138s

まったくオプション無し(-J-clientはディフォルトだから付けていない)の

time jruby -ve "require 'rubygems'; require 'columnize'"
jruby 1.5.0 (ruby 1.8.7 patchlevel 249) (2010-05-12 6769999) (Java HotSpot(TM) Client VM 1.5.0_24) [i386-java]

real	0m1.320s
user	0m1.090s
sys	0m0.148s

と比べると、速くなっているよね。たったこれだけのプログラムだから、違いはわずかだけれど。

JVMのオプションは
http://performance.netbeans.org/howto/jvmswitches/index.html
http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
なんていうのがあるし、Nutter氏は
Headius: My Favorite Hotspot JVM Flags
なんていうオタクなブログも書いているし、まだいろいろチューニングできそう。試してください、いろいろ。


ここでとりあげた以外にも、Nailgunを使う方法とか、Rubyのクラスをコンパイルしてしまう(http://kenai.com/projects/jruby/pages/JRubyCompiler)とか、JRubyには実行速度カイゼン方法がまだまだあります。よりどりみどり。いずれ、そのあたりも書きたいなぁ、と思う。



ところで、Nutter氏の"Startup Time Tips"、「近いうちに日本語訳します」って@hiro_asariが3月はじめにtweatしていたんだけれど、どこかで公開されているのかしら?”訳しました”とか”公開しました”とかいうのは見かけていないような‥

[追記]
日本語訳がようやく出たようです。

JRuby いろいろ - インストール

Ruby逆引きレシピ」をながめ始めたところですが、この手のモノを読むとどーしても気になるのが”JRubyはどうなんだぁ?!”なんです。なので、Rubyと違うところなどなど、ちらほらと書いていこうかと思います。日本JRubyユーザ会(http://groups.google.co.jp/group/jruby-users-jp/web/jruby)なんかも始まったし、8月末には筑波でJRubyKaigiも開催されることだし、あちこちでJRubyはあーだこーだのブログなんかが増えるんじゃないかと。で、ここでも、JRubyの話しを増やしていこうかと。

では、定番のインストールから。「Ruby逆引きレシピ」はRubyのインストールそのものについては語っていません。OSに付いてくるからインストールなんかいらないのでしょう。でも、JRubyはOSに付いてきませんので、やっぱり最初は定番のインストールをしないといけません。ところが、JRubyの場合、インストール方法は一つじゃないので、お好きな方法を選んでくださいませ。でも、実際に全部は試していないので、インストールできないじゃないか!の苦情には何もできないかも。特にWindowsについては何を言われても、ほぇ??という状態なので。


インストール その1
定番中の定番、バイナリーのアーカイブをもってくる方法です。Javaな人たちには一番馴染みのある方法じゃないでしょうか。アーカイブのありかは

http://www.jruby.org/download

です。jruby-bin-x.x.x.tar.gzでも、jruby-bin-x.x.x.zipでもダウンロードしたら展開するだけです。Javaはついてこないので、予めJavaはインストールしておかないとだめです。Javaな人はよーくわかっていることですが、Rubyな人は動かない、、、と思うかもしれないので念のため。

展開したら、jrubyコマンドへのパスを設定します。
bashだったら、

cd jruby-x.x.x
export JRUBY_HOME=`pwd`
PATH=$JRUBY_HOME/bin:$PATH

これで、jrubyコマンドが使えるはず。jrubyコマンドさえ使えていれば、JRUBY_HOME環境変数の設定はしなくていい(内部的に行われている)のですが、shell的に落ち着かない気分なので、いつもこうしています。


インストール その2
Windowsインストーラを使う方法です。JRuby 1.4.0からWindowsインストーラが付きました。Rubyと違って(?)、Javaのユーザは圧倒的にWindows使いが多い。で、WindowsのサポートはJRubyにとっては重要ということで、Windowsらしいインストール方法が追加されています。これもやっぱりhttp://www.jruby.org/downloadにあるので、誰かWindowsでのインストール方法をブログに書いてくれないかなぁ。リンク張るから。

[追記] 英語でよければhttp://kenai.com/projects/jruby/pages/GettingStarted#Microsoft_Windows_XP_Installation_Example


インストール その3
じゃ、Macは?Macインストーラは?あります。

http://github.com/calavera/jruby-mac-installer/downloads

Macインストーラについては、http://old.nabble.com/-ANN--Native-mac-installer-for-JRuby-1.5.0-td28550599.html#a28550599に目を通しておいたほうがいいかも。インストールできたよーという報告があるので、できるのでしょう。誰かMacインストーラを試してブログに書いてくれるとうれしいかも。リンク貼付けるから。私もMac使いですが、いつもターミナルを開いてばしばしコマンド打ちまくりのMac使い。。。それって、Macを素敵なGUI付きLinuxマシンとして使っているだけだよね、と思う。。。(^^;;


インストール その4
Rubyっぽい、rvmを使う方法。おぉ、いいブログがあった。さっそくリンクを張っておこうじゃありませんか。Rubyな人には馴染みやすい方法でしょうね、きっと。Gemも一緒にインストールされるみたいだし、RubyJRubyの切り替えが簡単にできるのもよさげ。

http://fujibee.org/2010/05/22/jruby%E3%83%A6%E3%83%BC%E3%82%B6%E4%BC%9A%E3%81%AE%E6%99%82%E3%81%AE%E3%83%87%E3%83%A2/

あ、ちなみに、このブログに書いてある"require 'java'"ですが、JRubyのときはいつも必要なのではなくて、JavaAPIを使うときやRubyの変数をJavaの何かの型に変換したいときに必要です。Rubyしか使っていない場合はjavaライブラリは必要なし。


インストール その5
やっぱりね、ソースコードコンパイルしようよ!Antさえあればすぐにできるんです。リリースバージョンのソースコードなら、http://www.jruby.org/downloadjruby-src-x.x.x.tar.gzとかjruby-src-x.x.x.zipとかあるから、展開したら、

ant clean-all
ant

で終了。簡単、カンタン。あとはその1と同じ、jrubyコマンドへのパスを設定。Antのバージョンは古すぎるとだめだったような記憶があるのですが、1.7.1とかそれ以降だったら大丈夫です。ソース用アーカイブにはテストコードとかいろいろ付いてくるので、眺めてみてくださいませ。ぜひ。

もっとedgeな人、"なんだこりゃぁ、パッチ送っちゃうぞー"な気分になる人はやっぱり、git repoからソースを取得してコンパイル、インストール、ですね。JRubyの最新版が置いてあるrepoは

本家 git://jruby.org/jruby.git
ミラー http://github.com/jruby/jruby.git

なので、例えば

git clone git://jruby.org/jruby.git
cd jruby
ant

でインストールです。簡単、カンタン。”パッチおくっちゃうぞー”な気分の場合は、一応、http://kenai.com/projects/jruby/pages/JRubyBugReportingStyleGuidehttp://kenai.com/projects/jruby/pages/JRubyStyleGuideなんか見ておくといいかも。むずかしい注文を付けているわけではないのですが、念のため。パッチの送り先はhttp://jira.codehaus.org/browse/JRUBY

ちなみに、http://jira.codehaus.org/browse/JRUBY-4816なんか、誰かわかりそう。日本語でも同じ結果になるし。


インストール その6
でいりぃびるどをゲット。バグが修正されたみたいなんだけど、gitのrepoからとってきてコンパイルはちょっと‥、という人にはdailyにbuildされるsnapshotがおススメです。

http://ci.jruby.org/snapshots/

にあるので、お試しください。ダウンロードしたら、あとはその1と同じ。


インストール その7
jruby-complete-x.x.x.jarってなに?という人に。CompleteなjarはJRuby用のRuby standard libraryも何もかもひとまとめにしたJARアーカイブで、webアプリには必須のパッケージです。JRubyJavaの.classファイルと、Rubyの.rbファイルで出来上がっています。RubyのファイルをロードするときにはJRUBY_HOME環境変数が手がかりになるのですが、JavaのwebアプリにHOMEなんていう概念は通用しません。ポータブルじゃないといけないから。jruby-complete.jarはJRUBY_HOMEの環境をjarアーカイブの中に作り上げて、webアプリでもRubyのライブラリがちゃーんと動くようにしたものです。

コンパイルしてjruby-complete.jarを手に入れたかったら

ant jar-complete

です。簡単、カンタン。


ということで、インストール編でした。次は、使ってみるぞー編ですね。なるべく早めに書こうと、、、書きたい、と、思います。

「Ruby逆引きレシピ」読み始めました

実は、オブジェクト倶楽部の懸賞にみごとに当たって「Ruby逆引きレシピ」を獲得したのでした。とりあえず、日本の留守宅に配送していただいたのですが、このたび、ようやくミシガンまで届いたので読み始めたところです。これは確かに便利そうですね。ちゃんと読んでおけばいちいちインターネットで探しまわらなくてよさそう。ありがとうございます、オブジェクト倶楽部のみなさま。

で、さっそく、なんといってもまずは、Nokgoiri。現在、Java Portを推進中なので。どきどきしながら、レシピ124のサンプルコードを試してみると、、、ちゃーんと、動いてくれました。文字化けもなく。\(^^)/
Pure Java versionのNokogiriはこの週末にbeta版gemがリリースされたところです。

jruby -S gem install --prerelease nokogiri

で試せるので、JRubyと一緒にお使いくださいませ。

ところで、コラムに出ていたNokogirlって、最初は「ノコぎる」って読んでしまった。ノコガールじゃなくて。日本人だなー > 自分、と思った。