What's new? | Help | Directory | Sign in
Google
action-coding
Ruby + Processing
  
  
  
  
    
Search
for
Updated Jun 08, 2008 by Ichitaro.Masuda
Tutorial  

インストール

JRubyをインストールし、パスを通して下さい。

http://jruby.codehaus.org/Home

Processingをインスールして下さい。

http://processing.org/download/index.html

本ソフトウェアをチェックアウトして下さい。

$ svn checkout http://action-coding.googlecode.com/svn/trunk/ action-coding-read-only

svn/trunk/config.yamlをテキストエディタで開き、Processingのパスを指定して下さい。

p5home: /Applications/Processing 0135


簡単な使い方

svn/trunk/run.commandを実行します。

ファイルダイアログが表示されますので、以下のファイルを選択します。アプレットが起動されるはずです。

svn/trunk/examples/basics/arrays/array_objects.rb

別の起動方法として以下のものがあります。

$ jruby aco.rb examples/basics/arrays/array_objects.rb

テキストエディタで以下のファイルを開きます。

svn/trunk/examples/basics/array/array_objects.rb

47行目を以下のように書き換えてファイルを保存します。

p.stroke 4 * p.second, 0, 0

ストロークの色が赤に変わりましたか? ファイルを保存することで、Modクラスの定義が実行時に置き換わりました。 続いて、4行目を以下のように書き換えてファイルを保存して下さい。

size 300, 300

Processingをご存知の方なら、ウィンドウサイズが変わると予想したことでしょう。 しかし、setup()はアプレットの起動時に一度だけ呼び出されるだけですので、関数の定義が変わっただけでは反映されません。

プログラムを始めから実行したいときは、アプレットが表示されているウィンドウにフォーカスがある状態で、

⌘R (または Ctrl R)

と入力します。setup()関数が再び評価され、ウィンドウが大きくなります。基本的な使い方は以上になります。

なお、コーディング中にエラーが起きた場合も、スタックトレースを参考にコードを修正し、アプレットにフォーカスを合わせて⌘Rで再起動して下さい。


コマンドラインオプション

$ jruby aco.rb <オプション> ファイル名

とすることで、コマンドラインからアプレットを起動できます。 オプションは以下の通りです。

-fオプションを使用したサンプルは以下にあります。

svn/trunk/examples/3d_and_opengl/opengl/full_screen_app


PFontを使う

PFontを利用するには、事前にビットマップフォントを準備する必要があります。

  1. Processingを起動する
  2. メニューからTools => Create Font...を選ぶ
  3. 使用する書体と級数を入力し、OKをクリック
  4. メニューからSketch => Show Sketch Folderを選ぶ
  5. dataフォルダの中に.vlwという拡張子を持つファイルが作られているので、ソースコードと同じ階層にコピー

以上の準備ができたら、例えば以下のように書きます。

def setup
  size 400, 400
  background 0
  fill 255
             
  fontA = loadFont "CourierNew36.vlw" #書体のファイル名は書き換えて下さい
  textFont fontA, 36
  textAlign CENTER
  
  text 'Hello PFont', 200, 200
end

Processingでは、リソースを格納するdataフォルダが作られ、ファイル名を指定する際のベースパスとなっていました。action-codingではソースコードと同階層がベースパスとなることを覚えておいて下さい。


Processing用ライブラリを使う

Processingのlibraries以下にあるライブラリをロードするには、ソースコードの先頭で

include_class 'クラス名'

と指定します。パッケージ単位でロードする場合は

include_package 'パッケージ名'

と指定します。以下に例を挙げます。

include_package 'processing.pdf'

def setup
  size 594, 842
  @pdf = beginRecord PDF, "RandomBook.pdf"
  beginRecord @pdf
end

def draw
  background 255
  
  100.times do |i|
    if random(1.0) < 0.2
      stroke 255
    else
      stroke 0
    end
    sw = pow random(1.0), 12
    strokeWeight sw * 260
    x1 = random -200, -100
    x2 = random width+100, width+200
    y1 = random -100, height+100
    y2 = random -100, height+100
    line x1, y1, x2, y2
  end

  if frameCount == 768
    endRecord
    exit
  else
    @pdf.nextPage
  end
end

パラメーターの調整を手軽に行う

NodeBoxにはプログラム中にマジックナンバーを書く代わりに、スライダー等のGUIによってユーザーが調整できるパラメーターを作成する機能があります。

http://nodebox.net/code/index.php/Variables (のページの一番下)

同様の機能をControlというモジュールが提供しています。 これを利用するにはソースコードの先頭で、Controlモジュールをインクルードします。

require 'control.rb'   
include Control

続いて、setup()関数の中で以下のメソッドを呼び出します。

このようにすることで、GUIの値を自由に参照できるようになります。 例を以下に挙げます。

require 'control.rb'   
include Control

def setup                
  size 200, 200  
  smooth
  noStroke
  fill 0
  slider :radius, 100, 0, 200  
  text_field :msg, 'hello'
  button :click      
  check_box :visible, true 
end

def draw        
  background 255
  ellipse 100, 100, radius, radius if visible
end                

def click
  puts msg
end

mousePressed及び、keyPressedについて

JRubyでは、イベントハンドラとしてのmousePressed()と、フィールドとしてのmousePressedの区別がつきません。keyPressedも同様です。action-codingでは、フィールドのほうに別な名前をつけて解消しています。以下の表を参照して下さい。

Processingでのフィールド名action-codingでのフィールド名Ruby的な同義語
mousePressedisMousePressedmouse_pressed?
keyPressedisKeyPressedkey_pressed?


RubyでProcessing用ライブラリを書く

ProcessingのAPIのほとんどを提供するPAppletクラスでは、ライブラリ作成者のためのイベントハンドラとして、以下を用意しています。

リスナーの登録はPAppletの以下のメソッドから行います。

しかし、RubyのオブジェクトをregisterDispose等の引数に渡してもリフレクション関連のエラーが発生してしまいうまくいきません。このエラーを回避するために、IPAppletAdapterというJavaインターフェースを提供しています。このインタフェースをincludeすることで、あなたのRubyクラスをPAppletと協調させることができます。

非常にシンプルな例を以下に挙げます。

require 'java'
require 'rplib.jar'
include_class 'processing.core.PApplet'
include_class 'IPAppletAdapter' 

class BoringLibrary
  include IPAppletAdapter

  def initialize(applet)
    super()
    @applet = applet
    applet.registerDispose(self)
  end

  def dispose
    #anything in here will be called automatically when 
    #the parent applet shuts down. for instance, this might
    #shut down a thread used by this library.
  end
end 

TextMateから使う

TextMateを使っている方は、以下の手順を踏むことで、エディタ内からアプレットを直接実行できるようになります。デバッグ情報やエラーもTextMateのコンソールに表示されるため便利です。

以下のバンドルをそれぞれダブルクリックしてインストールします。

svn/trunk/textmate/Run (action-coding).tmCommand

svn/trunk/textmate/Reload (action-coding).tmCommand

svn/trunk/textmate/Eval Line / Selection (action-coding).tmCommand

⌘, でPreferencesを開き、AdvancedのShell Variablesで以下の変数を追加します。

VariableValue
TM_JRUBYjrubyのパス
TM_ACTIONCODINGsvn/trunk/aco.rbのパス

参考までに、私の環境では以下のようになっています。

VariableValue
TM_JRUBY/jruby-1.1/bin/jruby
TM_ACTIONCODING/works/action-coding/aco.rb

以上で、セットアップは完了です。基本的な使い方は以下のようになります。

  1. 新規テキストを作成
  2. 言語をRubyに切り替え
  3. ⌥⌘R でaction-codingを起動
  4. コードを書く
  5. ⌘S で反映
  6. 必要に応じて4に戻る。

その他の機能も含めると、以下のようになっています。

コマンド名ショートカット説明
Run (action-coding)⌥⌘R編集中のファイルを対象としてaction-codingを起動
Reload (action-coding)⌘4アプレットを再起動 (プログラムを始めから確認)
Eval Line / Selection (action-coding)⌘E選択テキストまたはカーソルのある行を評価


スコープについて

あなたが書いたコードは、以下のように変換されてから実行されると思って下さい。TextMateからEval Line / Selectionしたコードも同様です。

class MyApplet < PApplet
  <あなたのソースコード>
end

そのため、スコープには十分気をつけて下さい。 例えば、ソースコードのトップレベルで以下のようなことはできません。

background 0

また、以下のようなコードも意図通り動かないと思います。

def hoge
  p "hoge"
end
hoge()

一方、以下はうまくいきます。

def self.hoge
  p "hoge"
end
hoge()    

Comment by kotobuki, May 01, 2008

MacBook? + Mac OS X 10.5.2 + JRuby 1.1.1で動作確認してみましたが、run.shをダブルクリックしたらTextMate?で開かれてしまった以外は問題なく動作しました。これはすごいですね!

Comment by Ichitaro.Masuda, May 01, 2008

ありがとうございます。確かにダブルクリックじゃまずい場合がほとんどですね。敷居の低い起動方法はないものか・・

Comment by kotobuki, May 02, 2008

TextMate?を使う方法を試してみましたが、これは快適ですね。しばらく使い続けてみて、何か問題があればまたレポートします。

Comment by yamato, May 05, 2008

MacBook?? + Mac OS X 10.5.2 + JRuby 1.1.1で私も使えました。やーこれはいいですね。TextMate?と組み合わせてつかってます。

一応ご報告で既知であるかもしれませんが、はじめMacPort?でJRubyをインストールしたため、1.0.3とバージョンが古く、そちらでは上手く動きませんでした。

Comment by Ichitaro.Masuda, May 05, 2008

ご報告ありがとうございます。お恥ずかしいことに、JRubyのバージョンがいくつ以降であれば動くかを把握できておりませんので、参考になります。

Comment by ymmt2106, May 09, 2008

Mac OSX 10.5.2 + jruby-1.0.3で触ってみました。サンプルムービーの通り挙動しました。これは驚きです!

Comment by kotobuki, May 10, 2008

いまさらながらダブルクリックの件ですが、拡張子を.shではなく.commandにすれば普通にコマンドとして認識されるようになるようです。

さらに、Platypusを使えばアイコンなども設定できていいのでは…と思って試したのですが、なぜかPlatypusでアプリ化した時のrun.shからはjrubyがcommand not foundになってしまいます。~/.profileでの$PATHを反映してくれないようです。

http://www.sveinbjorn.org/platypus

とはいえ、TextMate?から便利に利用できる今となっては大きな意味はないのかもしれませんが…。

Comment by Ichitaro.Masuda, May 11, 2008

情報ありがとうございます。取り急ぎ.shを.commandにリネームしておきました。

Comment by lllkoballl, May 12, 2008

http://un-q.netのll_koba_llです

Mac OSX 10.4.11 + JRuby1.1.1で試してみました。 ほぼ動いたのですが、TextMate?のCommand+Sで更新が反映されませんでした。 Command+Eとかは動いてます。

もう少しいろいろ試してみます。

Comment by lllkoballl, May 12, 2008

jruby aco.rb -r examples/basics/arrays/array_objects.rb で実行してみたら、ファイルを更新するごとに更新が反映されました。

こちらで色々試してみます。

Comment by Ichitaro.Masuda, May 12, 2008

ご報告ありがとうございます。

>ほぼ動いたのですが、TextMate?のCommand+Sで更新が反映されませんでした。

おっと、そうでしたか。。その際、何かエラーログなどが出ているようでしたら教えていただけると助かります。

ちなみに、setup()の定義を書き変えた場合は、⌘4でリロードしないとメソッド自体が呼ばれないので反映されていないように見えるのですが、その可能性はないでしょうか・・?

Comment by lllkoballl, May 13, 2008

>ちなみに、setup()の定義を書き変えた場合は、⌘4でリロードしないとメソッド自体が呼ばれないので反映されていないように見えるのですが、その可能性はないでしょうか・・?

そのとおりでした。 ありがとうございまーす

Comment by Ichitaro.Masuda, May 13, 2008

>そのとおりでした。 ありがとうございまーす

それはよかったです。この点、説明が分かりにくくてすみません。

Comment by kotobuki, May 18, 2008

フォント利用の件ですが、事前に

println PFont.list

とだけ書いたスケッチを実行するなどして使用できるフォントを確認した後、次のようにcreateFontを使うことでProcessingを起動せずに利用するということも可能です。

def setup
  size 400, 400
  background 0
  fill 255
             
  fontA = createFont "CourierNew36.vlw", 36
  textFont fontA
  textAlign CENTER
  
  text 'Hello PFont', 200, 200
end

※この場合にはテンポラリにフォントが生成されるようです。起動時にフォント生成の時間が必要になるという問題はありますが、デモなどではお手軽かと思います。

釈迦に説法だと思うのですが、こういう方法もあるということで。;)

Comment by Ichitaro.Masuda, May 19, 2008

おお、動的にフォントを作成できるメソッドがあったとは、恥ずかしながら知りませんでした。ありがとうございます。

日本語書体のようなグリフ数が多いものであれば遅くて使いものにならないと思いきや、以下のようなコードでもあっという間に表示されますね。

def setup
  size 400, 400
  background 0
  fill 255

  textFont(createFont("KozGoPro-Bold", 36))
  textAlign CENTER
  
  text '日本語', 200, 200
end

メニューからAll Charactersチェック付きでCreateFont?するより遥かに高速な気がしますが、これはどういうことでしょうか・・w

Comment by fishstory812, May 19, 2008

action-codingにとても興味があり、設定をして、動かしたいのですが、うまくいきません。 Mac OSX 10.5.2 + jruby-1.1.1、TEXTMATEを使用する方法で、挑戦しています。

ScriptMate?は起動するのですが、Processing 0135が動きません。

ScriptMate?の文章

ScriptMate? r8136 running ruby 1.8.6 (2008-04-22 rev 6555) [i386-jruby1.1.1] (/Applications/jruby-1.1.1/bin/jruby) >>> aco.rb

Program exited.

以上の用に表示されています。

svn/trunk/config.yamlのパスも、以下の用に変更しています。展開したフォルダもアプリケーションフォルダに入れてあります。

p5home: /Applications/Processing 0135

>JRubyをインストールし、パスを通して下さい。

とういうのも、検索エンジンなど調べた内容を試してみましたが、ちょっとよく内容がわかならなっかたのですが、参考になる様なサイトがあれば教えていただきたいです。

jrubyは以下に展開しています。

/Applications/jruby-1.1.1

乱文申し訳ありませんが、よろしくお願いします。

Comment by Ichitaro.Masuda, May 19, 2008

>ScriptMate??は起動するのですが、Processing 0135が動きません。

Processing 0135はライブラリとして使うだけですので、Processing 0135が起動しないこと自体は正常です。

>ScriptMate?? r8136 running ruby 1.8.6 (2008-04-22 rev 6555) [i386-jruby1.1.1] (/Applications/jruby-1.1.1/bin/jruby) >>> aco.rb

このログを見る限り、aco.rbをTextMate?で開いた上で⌘ + Enterしているように思われるのですが、もしそうだとしたら、aco.rbではなく新しいテキストファイルを作成した上で、⌘ + Enterしてみて下さい。すると、ファイル保存のダイアログが開くと思いますので、適当な名前で保存します。すると、今しがた指定したファイル名と同じ名前のウインドウが立ち上がると思うのですが・・

>>JRubyをインストールし、パスを通して下さい。

>とういうのも、検索エンジンなど調べた内容を試してみましたが、ちょっとよく内容がわかならなっかたのですが、参考になる様なサイトがあれば教えていただきたいです。

こちら、説明不足ですみません。TextMate?から使う限りは、PreferencesでTM_JRUBYという変数さえ正しく設定されていれば、jrubyにパスを通す必要はありません。

とはいえ、一応ご説明させていただくと・・

ホームディレクトリの.bash_profieというファイルをテキストエディタで開きます。なければ同じ名前で作成してください。続いて、以下の1行を追記してファイルを保存します。

PATH=$PATH:/Applications/jruby-1.1.1/bin

ターミナルを起動し、以下のように入力します。

jruby -v

例えば、以下のようなバージョン情報が印字されれば正くパスが通っています。

ruby 1.8.6 (2008-03-28 rev 6360) [i386-jruby1.1]

.bash_profieは隠しファイルになっているため、Finderから見つけたい場合は以下を参考にして下さい。

http://netafull.net/macosx/014755.html

OSXでのパスの通し方は以下が参考になります。

http://homepage.mac.com/akihide/iblog/C1557102128/E1968370044/index.html

Comment by fishstory812, May 20, 2008

返信ありがとございます。感謝します。

現状をお伝えします。 http://www.metaphor.co.jp/file/action-coding-demo00.movのでもービー内では、画面左上に、動作確認用のウインドウが開いているのですが、それが動作しないのです。

>このログを見る限り、aco.rbをTextMate??で開いた上で⌘ + Enterしているように思われるのですが、もしそうだとしたら、aco.rbではなく新しいテキストファイルを作成した上で、⌘ + Enterしてみて下さい。すると、ファイル保存のダイアログが開くと思いますので、適当な名前で保存します。すると、今しがた指定したファイル名と同じ名前のウインドウが立ち上がると思うのですが・・

上記の作業ですとScriptMate?が、保存した名前で立ち上がりましたが、動作確認画面が立ち上がりません。

TEXTMATEは設定

TM_JRUBY = /Applications/jruby-1.1.1/bin/jruby TM_ACTIONCODING = /Applications/action-coding/aco.rb

以上のように環境設定を行っています。

現在気になってる点は、ScriptMate?の最下部にProgram exited.と表示されているのがおかしいと思っています。

Comment by Ichitaro.Masuda, May 20, 2008

お返事ありがとうございます。うーむ。そうですか・・ ちょっとどこでコケているか分かりかねるので、大変お手数ですが、以下の点をご確認後お知らせいただけると幸いです。

  • Processing 0135で作ったスケッチは⌘Rなどで普通に実行できるか
  • TextMate?のバンドル(⌘Enterなど)を使わないで、Wikiの「簡単な使い方」の手順通りで問題なく使えるか
  • ScriptMate?に表示されるエラーメッセージはやはり以下が全てか
  • ScriptMate r8136 running ruby 1.8.6 (2008-04-22 rev 6555) [i386-jruby1.1.1] (/Applications/jruby-1.1.1/bin/jruby) >>> aco.rb
    
    Program exited.
Comment by fishstory812, May 20, 2008

ほんとうにご迷惑おかけします。

・Processing 0135.appを起動して、examplesのフォルダのなか○○.pdeというファイルを数種類ドロップし、⌘Rを実行、小さい画面が立ち上がり、表示したり動いたりしておりました。

・簡単な使い方で、run.commandをダブルクリックすると、ターミナルで以下のようになって動かないようです。

Last login: Tue May 20 10:55:37 on console /Applications/action-coding/run.command ; exit; sakana-Macbook:~ fish_story812$ /Applications/action-coding/run.command ; exit; logout

・エラーメッセージについては、

ScriptMate? r8136 running ruby 1.8.6 (2008-04-22 rev 6555) [i386-jruby1.1.1] (/Applications/jruby-1.1.1/bin/jruby) >>> test.rb

Program exited.

です。右上に、copy outputというの出ています。

お手数ですが、よろしくお願いします。

Comment by Ichitaro.Masuda, May 20, 2008

>・簡単な使い方で、run.commandをダブルクリックすると、ターミナルで以下のようになって動かないようです。

そうでしたか・・。何のエラーもなくexit;となっているので、おそらくjrubyのパスも通っている状態ですよね。この段階でこけるとなるとTextMate?からでもやはり使えないと思います。

時間を割いていただいたにも関わらず申し訳ないのですが、現状で思い当たる点がなくなってしまいました。引き続き、この件で分かったことがあればお知らせしたいと思いますが・・


Sign in to add a comment