Processing by Ruby
本が出たりイベントがあったりでProcessingがまたちょっと盛り上がってきてるみたいなので久しぶりに触ったりしてる。以前書いたように Processingの実体はprocessing.core.PAppletっていうJavaのクラスで、Processingが生成するJavaのコードを見るとよくわかるんだけど、ProcessingのSketchコードっていうのは実はJavaのコードそのものです。それは最新版(今だと0124)でも変わってないし、たぶんこの先も変わらないんじゃないかなーと思う。要はprocessing.core.PAppletクラスを継承したJavaのコードを書けばProcessingベースのAppletになる。ここらへんの仕組みはよく考えられてると思う。
で、ふと、JRuby使ったらProcessingのコードをRubyで書けんじゃん?(ニーズはなさそうだが)と思ってやってみた。そして挫折。以下、挫折コード。
# p5r.rb require "java" include_class "processing.core.PApplet" class Sketch < PApplet def setup size 400, 400 background 255 no_stroke end def draw 30.times do fill random(255), random(255), random(255) rect random(width), random(height), 10, 10 end end def mousePressed background 255 end end JFrame = javax.swing.JFrame frame = JFrame.new "Sketch" applet = Sketch.new frame.content_pane.add applet frame.default_close_operation = JFrame::EXIT_ON_CLOSE applet.init frame.pack frame.visible = true
で、実行。
> set CLASSPATH=%P5_HOME%\lib\core.jar > jruby p5r.rb
実行すると、PApplet.init()内でコールしてるgetAppletContext()でNullPointerExceptionが発生してabort。PAppletのソース見るとちゃんとそこでNullPointerExceptionをcatchするようになってるんだけど、そこをなぜか飛び越えてくる。うーん? 普通のAppletやビルド済みのjarからクラスを読み込んだりするのはうまくいくんだけどなー。
調べてみると、どうやらJRubyの既知のバグっぽい。
http://jira.codehaus.org/browse/JRUBY-704
なんかちょうど一昨日くらいにfixされて一応trunkでは対応済みになってるらしいので、次のリリース(1.0.0?)では上に書いてあるコードがそのまま動く、予定。このバグを報告した人もProcessingをJRubyで動かそうとしてたみたい。同じこと考える人はいるもんだな。
というわけで今のところは挫折のまま終了。挫折で終わる連休。
ところでJRuby何気におもしろいなー。超遅いけど。irbで、BufferedOutputStreamがいつバッファをフラッシュするのかを観察してみたりとか、ちょっとたのしい(地味)。Swingと組み合わせるのが一番おもしろいかも。GUIアプリのデモ用のモックアップとかつくるのに使えそう。
- - - -
[5/13 追記]
JRuby1.0.0RC1で動いた。