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で動いた。

続き >> http://d.hatena.ne.jp/dewdrop/20070513/p5r