雑念日記

主に技術的なことをつらとらと(書ければいいな)。

ruby-processingをもっと知って更なるイケメンになろう

本投稿はProcessing Advent Calendar 2013の9日目の記事です。

(2013-12-24 13:00 追記) 日本時間で多分2013年12月23日に、Processing 2.1対応のruby-processing-2.4.1がリリースされました。これに伴い、内部の実装やインストール方法などが多少変わっていますので、本記事の内容は参考になりません。近日中に補足記事を書く予定です。

(2013-12-25 00:10 追記) ruby-processing-2.4.1導入記事を書きました↓


突然ですがruby-processingというProcessingのRubyラッパーをご存知でしょうか。

Processing Advent Calendar 2012でも@koki_hさんが紹介記事を書かれております。
@koki_hさんの功績によってイケメン御用達と名高いことで有名ですね。

あれから1年が経過し、ruby-processingを取り巻く環境も少し変化しているので、本投稿を2013年版ruby-processing紹介記事とさせていただきたいと思います。

以下、インデックスです。

  • ruby-processingって何?
  • 最新版インストール方法
  • どうやって動いているの?
  • 終わりに

ruby-processingって何?

Processing Advent Calendar 2012@koki_hさんの記事を見ていただければ大体のことは書かれているのでこの項は無くてもいいのですが、簡単におさらいしましょう。

Processingのスケッチは以下のように記述しますよね。

void setup() {
  size(200, 200);
}

void draw() {
  rect(50, 50, 100, 100);
}

ruby-processingを使うと、以下のようにrubyの文法で全く同じスケッチを描くことが可能です。

def setup
  size(200, 200)
end

def draw
  rect(50, 50, 100, 100)
end

ruby-processingをインストールするとrp5というコマンドが使用できるようになります。
上のように書いたスケッチを仮にsketch.rbファイルに保存したとすると、次のようにrp5コマンドを実行することで、sketch.rbに書いたスケッチを実行することが可能となります。

  $ rp5 run sketch.rb
  # または
  $ rp5 --nojruby run sketch.rb

単純に互換があるだけではなく、Module、Class、ProcなどRubyが持つさまざまな便利機能も使用できるようになります。もともとProcessingが持つ機能に、Rubyが持つパワーや便利なツールを加えてアプリケーションが作成できるというのがruby-processingの強みでしょう。

f:id:hoshi_sano:20131206092359j:plain
ruby-processingのサンプルのひとつ、fern.rb

最新版インストール方法

前出の@koki_hさんの記事では、以下のようにRubyGemsと呼ばれるRubyのパッケージ管理用システムとその配布サイト(RubyGems.org)を利用する方法が紹介されていました。

  $ gem install ruby-processing

これでもインストールされることはされるのですが、2013年12月現在、@koki_hさんも記事内で言及しておられるようにRubyGems.org上のruby-processingは2011年9月末から更新されておらず、バージョン1.0.11で停止しております。*1

しかしGithub上では今もプロジェクトは動いており、現在以下のような状況となっております。

  • 2013年11月、バージョン2.3.0リリース
    • Processing 2.1 対応
    • JRuby 1.7.6 対応

しっかりと最新のProcessing事情に追随しています。ならばGithubから取得する以外ありませんね。

準備

では下準備から始めましょう。

  • javaのインストール
  • rubyのインストール
  • rubygemsのインストール
  • rakeのインストール
  • wgetのインストール
  • gitのインストール(可能ならば)

すみませんがそれぞれについてインストール方法を詳細には記載しませんので、わからない方は「ruby インストール」などでググってみてください。
以下のコマンドを実行して、エラーが表示されずバージョンが表示されれば準備はOKです。

  $ java -version
  $ ruby -v
  $ gem -v
  $ rake -V
  $ wget -V
  $ git --version

ソースの取得

次にgitを使ってソースをローカルに落とします。

  $ git clone https://github.com/jashkenas/ruby-processing.git

わしゃgitなんぞ使わんぞ、という方はこちらから.zipまたは.tar.gzで取得できるので利用しましょう。

gemのビルド

git clone、またはダウンロード+展開が完了したら、生成されたディレクトリに移動します。

  $ cd ruby-processing

rake コマンドを実行します。これはしばらく時間がかかるので気長に待ちましょう。

  $ rake

途中テストが実行され、場合によってはテストに失敗することがありますが、問題ないケースもあるのでよくわからない人は気にせず次に行きましょう。テストが失敗するのが気持ち悪い方は、JRubyのインストールやbundle installなどをすると幸せになれるかもしれません。

gemのインストール

rakeが完了すると、ローカルにgemファイルが生成されているので、これをインストールします。

  $ gem install ruby-processing-2.3.1.gem

以上でインストール完了です。
rp5コマンドが使用できるようになっていれば成功です。

$ rp5 -v
Ruby-Processing version 2.3.1

どうやって動いているの?

ここからはruby-processingがどのように動いているかを軽くお話したいと思います。

Javaをエンジンとして動作するProcessingとRubyがどのようにして連携を取るのか。
Ruby界隈に関わりのある方はピンと来るかもしれませんが、ruby-processingではJRubyを使用しています。

JRubyとはなんぞや

一般にRubyと呼んだ場合、C言語で実装されたいわゆるCRubyを指すことが多いですが、JRubyJavaで実装されたものを指します。JRubyJavaと緊密な連携を取ることが可能で、JavaからJRubyを呼び出したり、JRubyからJavaを呼び出すことが可能です。Javaで実装されたProcessingも当然JRubyから呼び出すことができるのです。

JRubyがインストールされていなくても大丈夫

ではruby-processingを使うにはシステムにJRubyがインストールされていないとダメなのかというと、そういうわけではありません。なんとruby-processingは内部にProcessing本体とJRubyを含んでいるのです。(これにより、ruby-processingのgemは一般的なgemに比べデータ量が大きくなってしまい、RubyGems.orgでの配布ができない状態のようです。)上述のインストール手順で、JRubyはおろかProcessingすらインストールしなかったのはこのためですね。

次のように呼び出した場合、システムにインストールされているJRubyを使ってProcessingを起動しようとします。

  $ rp5 run sketch.rb

ですが、次のように呼び出した場合はシステムのJRubyではなく、ruby-processingに含まれるJRubyを使ってProcessingを起動します。

  $ rp5 --nojruby run sketch.rb

rp5コマンドからProcessingが起動されるまで

rp5コマンドを実行してからスケッチが実行されるまでのざっくりとした流れを以下に図示してみました。
大体こんな感じだと思います(が、何かツッコミがあればお願いします)。
CRubyからrp5コマンドを叩いても、途中からの処理はシステムのJRuby、もしくはruby-processingに同梱されているJRubyによって実行されます。

f:id:hoshi_sano:20131205014755j:plain

途中、「スケッチの解析」という処理が行われています。ここでは、仮にsketch.rbの内容が

def setup
  size(200, 200)
end

def draw
  rect(50, 50, 100, 100)
end

のようになっていた場合、

class Sketch < Processing::App
  def setup
    size(200, 200)
  end

  def draw
    rect(50, 50, 100, 100)
  end
end

のように、Processing::Appクラスを継承したSketchクラスを定義するソースコードに整形するような処理を行なっています。Processing::Appクラスは本家ProcessingのPAppletを継承したクラスですので、これを継承するSketchクラスではPAppletが実行可能な数々の関数(メソッド)を実行することができるようになります。

終わりに

ちょっぴりRubyな話が多めでしたがいかがでしたでしょうか。
グラフィック特化言語Processingと「書くのが楽しい」言語Rubyのコラボレーションであるruby-processingは、楽しいビジュアライジングが可能になるまさにイケメンツールです。
ゼヒゼヒ一度お試しください。

*1:近日中にRubyGems.orgから最新版が取得可能なようにしたい、という旨の記述がGithub上で見られますが、具体的にいつになるかは不明です。