Rubyの聞こえる化 Pasta-K - pasta0915@gmail.com 2009.08.15.Sat セキュリティ&プログラミングキャンプ2009 Supported by 西尾泰和
目的 <ul><li>If文中の条件式がtrueかfalseかによって音を鳴らす </li></ul><ul><ul><li>画面を見なくても、条件式がtrueかfalseかが音で分かる
退屈なデバッグ中に音が鳴ることによって、ちょっぴりハッピーになれる
make testの曲なんていうのも表現できる? </li><ul><li>ニコニコ動画にう p </li></ul></ul></ul>
変更の方針 <ul><li>構文木からバイトコードへの変更を担当しているcompile.cを書き換えて、Rubyのif文を書いたときに出力されるバイトコードを変えて、音をならすようにする。 </li></ul>
手順 <ul><li>実際にRubyのソースコードを読み、 (実行するRubyのスクリプト内の)if文中の条件式が構文木に評価されるところを見つける
同じように関数の呼び出しを行うコードを見つけ、1、部分に実際に埋め込む
pなどを用いて、関数の呼び出しが行われているのか動作確認
音を鳴らすrubyスクリプトを作り埋め込む </li></ul>
1,if文の条件式を評価しているところ <ul><li>何をしている部分? </li><ul><li>NODE_XXXXを受け取って、それをもとにして、どんな構文が書かれているのかを判断し、適切なバイトコードに変換している。 </li></ul...
変換後のバイトコードのイメージ if 条件文 else end then true の音を鳴らす true の場合の動作 false の音を鳴らす false の場合の動作
2,Rubyスクリプト内の関数を呼び出す方法 <ul><li>実際にRubyの関数を呼び出している部分を参考に、1,で見つけた部分に記述していった。 </li></ul>
音を鳴らすRubyスクリプト def sound() f=File.open(&quot;/dev/dsp&quot;,&quot;w&quot;) i=0 n=&quot;&quot; 2560.times{|i| a=i*15%256 n=...
音を鳴らす方法 <ul><li>OSS(Open Sound System)というUnix オペレーティングシステムで音を作成したりキャプチャしたりするための標準インターフェイスのAPIを叩いて音を鳴らす。 </li></ul>引用元: htt...
Upcoming SlideShare
Loading in …5
×

Rubyの聞こえる化

3,982 views
3,865 views

Published on

セキュリティ&プログラミングキャンプ2009発表資料

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,982
On SlideShare
0
From Embeds
0
Number of Embeds
1,090
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Rubyの聞こえる化

  1. 1. Rubyの聞こえる化 Pasta-K - pasta0915@gmail.com 2009.08.15.Sat セキュリティ&プログラミングキャンプ2009 Supported by 西尾泰和
  2. 2. 目的 <ul><li>If文中の条件式がtrueかfalseかによって音を鳴らす </li></ul><ul><ul><li>画面を見なくても、条件式がtrueかfalseかが音で分かる
  3. 3. 退屈なデバッグ中に音が鳴ることによって、ちょっぴりハッピーになれる
  4. 4. make testの曲なんていうのも表現できる? </li><ul><li>ニコニコ動画にう p </li></ul></ul></ul>
  5. 5. 変更の方針 <ul><li>構文木からバイトコードへの変更を担当しているcompile.cを書き換えて、Rubyのif文を書いたときに出力されるバイトコードを変えて、音をならすようにする。 </li></ul>
  6. 6. 手順 <ul><li>実際にRubyのソースコードを読み、 (実行するRubyのスクリプト内の)if文中の条件式が構文木に評価されるところを見つける
  7. 7. 同じように関数の呼び出しを行うコードを見つけ、1、部分に実際に埋め込む
  8. 8. pなどを用いて、関数の呼び出しが行われているのか動作確認
  9. 9. 音を鳴らすrubyスクリプトを作り埋め込む </li></ul>
  10. 10. 1,if文の条件式を評価しているところ <ul><li>何をしている部分? </li><ul><li>NODE_XXXXを受け取って、それをもとにして、どんな構文が書かれているのかを判断し、適切なバイトコードに変換している。 </li></ul></ul><ul><li>つまり、この部分でthen節とelse節をバイトコードに変換する前に、音が鳴る動作を付けてやれば、それも一緒にバイトコードに変換されるのではないか </li></ul>
  11. 11. 変換後のバイトコードのイメージ if 条件文 else end then true の音を鳴らす true の場合の動作 false の音を鳴らす false の場合の動作
  12. 12. 2,Rubyスクリプト内の関数を呼び出す方法 <ul><li>実際にRubyの関数を呼び出している部分を参考に、1,で見つけた部分に記述していった。 </li></ul>
  13. 13. 音を鳴らすRubyスクリプト def sound() f=File.open(&quot;/dev/dsp&quot;,&quot;w&quot;) i=0 n=&quot;&quot; 2560.times{|i| a=i*15%256 n=n+a.chr } f.puts n f.close end
  14. 14. 音を鳴らす方法 <ul><li>OSS(Open Sound System)というUnix オペレーティングシステムで音を作成したりキャプチャしたりするための標準インターフェイスのAPIを叩いて音を鳴らす。 </li></ul>引用元: http://ja.wikipedia.org/wiki/%E3%81%AE%E3%81%93%E3%81%8E%E3%82%8A%E6%B3%A2
  15. 15. 検証中に・・・ <ul>音を鳴らす関数内にオプション的に出力を変えるためにif文を用いた分岐を書いていたら、そのif文に反応して、音を鳴らす関数が呼び出された </ul><ul><li>また、検証用のif文が実行されるときに(ry
  16. 16. また(ry
  17. 17. 無限ループ突入 orz </li></ul>
  18. 18. 実際の実装は… <ul><li>true、falseの場合に鳴らす音をそれぞれ分けて実装
  19. 19. 始めは、各rbファイルに逐一記述していたが、prelude.rbやgem_prelude.rbに記述すれば、Cの文字列として、rubyに埋め込まれると分かったのでprelude.rbに記述 </li><ul><li>prelude.rbやgem_prelude.rb内のif文にも適応されて、「関数が見つからないよ><」エラーが出てました。 </li><ul><li>ダミーの関数を用意することで解消 </li></ul></ul></ul>
  20. 20. 聞いてみたいですよね? <ul><li>(多分)世界初のtest/test_prime.rbの音です </li><ul><li>素数を求めるスクリプトです </li></ul></ul>
  21. 21. 感想 <ul><li>CもRubyもあまり書いた経験がなかったので、ソースを読んだり、スクリプト書くのもとても大変でした </li><ul><li>講師の皆さん、Google先生ありがとうございました </li></ul><li>gdbでのデバッグも初体験で新鮮でした。
  22. 22. 将来的には、rbファイルを楽譜代わりに演奏なんていうのも・・・ </li></ul>
  23. 23. ご清聴ありがとうございました <ul><li>Thank you for listening!!! </li></ul>

×