Your SlideShare is downloading. ×
0
Andrew Grimm University of New South Wales ニューサウスウェールズ大学  (UNSW) RubyKaigi 2011 日本 Ruby 会議  2011 Finding Black Holes in Ru...
tl;dr Too Long, Didn't Read( 長過ぎてよんでられない ) <ul><li>Creates random code. Metaprogramming magic! </li></ul><ul><li>ランダムなコードを...
Why? なんで? <ul><li>Why did I create the Small Eigen Collider? </li></ul><ul><li>なぜ私は小型特異衝突型加速器を作成した ? </li></ul>
Background 背景 <ul><li>Bioinformatician at UNSW </li></ul><ul><li>UNSW  のバイオインフォマティクス </li></ul><ul><li>Looking at mutation...
Looking at mutations 私は突然変異で探しています <ul><li>Start with viruses with identical DNA sequence </li></ul><ul><li>同一の DNA 配列を持つウ...
Big data ビッグデータ <ul><li>Looking at approximately 500,000 sequences </li></ul><ul><li>約 50 万シーケンスを見て </li></ul><ul><li>Appr...
Problem <ul><li>Ruby is too slow </li></ul><ul><li>XKCD 303 </li></ul>問題 <ul><li>Ruby は遅すぎる </li></ul>
How slow is my application? 私のアプリのスピード <ul><li>Currently using YARV Ruby 1.9.1 </li></ul><ul><li>My application looks at 5...
That's after some optimizing! ちなみにこれはチューニングの 後の数字です
Other Rubies might be faster ほかの Ruby 実装はもっと速いかも
JRuby <ul><li>Faster at some tasks </li></ul><ul><li>Real multithreading (no GIL) </li></ul><ul><li>特定の処理は高速で真のマルチスレッド </l...
Rubinius <ul><li>Faster at some tasks </li></ul><ul><li>Real multithreading Real Soon Now </li></ul><ul><li>特定の処理は高速で真のマルチ...
Ruby Enterprise Edition <ul><li>Mainly better at garbage collection </li></ul><ul><li>GC が良い。 </li></ul><ul><li>More relev...
<ul><li>How do I know it'll give the correct results? </li></ul><ul><li>どのように私はそれが正しい結果を与えているか知ることができる? </li></ul>Should I...
What kind of errors worry me? どういうエラーが心配? <ul><li>Large, obvious bugs that cause an exception are fine </li></ul><ul><li>エ...
Other implementations are wrong 他の実装が間違っている <ul><li>Ran my project against Rubinius – 1 unit test failed </li></ul><ul><li...
Other implementations are wrongerer 他の実装では、さらに間違っている <ul><li>Ran BioRuby with Rubinius – 1 unit test failed </li></ul><ul>...
Even JRuby is not immune JRuby も例に漏れず <ul><li>Made mistakes in the complicated task of splitting a file into lines </li></...
How many bugs cause 0 failures? Fail しないバグはいくつ? <ul><li>3 bugs caused 1 unit test failure each </li></ul><ul><li>3つのバグがそれぞ...
How can I be sure there weren't others? どのように他のエラーがないことを確認することができる? <ul><li>Rubinius and JRuby had failed me. RubySpec had...
What could I do? 私には何ができる? XKCD 386
What assumptions can I make about the problem? 問題に対してどういった想定をすれば良い?
Bugs are simple ソフトウェアのバグは簡単 <ul><li>Isolate them to a single failure, not several failures </li></ul><ul><li>、複数のフェイルがでてい...
Bugs are simple to fix バグの修正は簡単 <ul><li>Rubinius folk fixed bugs promptly </li></ul><ul><li>Rubinius 開発者で  1 日以内にバグを修正 </l...
Unexplored territory 未踏の領域 <ul><li>Bugs are from trying something not done before </li></ul><ul><li>バグというのは今まで行われていなかった領域に...
<ul><li>I'm happy to report that this is the first ever &quot;Rubinius doesn't support flipflop&quot; bug. I've been waiti...
What is the Small Eigen Collider? 小型特異衝突型加速器って何?
How Small Eigen Collider Works 小型特異衝突型加速器はどう動く? <ul><li>Create same tasks, run on different Rubies, compare results </li><...
Comparing results 比較結果 <ul><li>Me: What is the result of &quot;a&quot;.casecmp(&quot;b&quot;)? </li></ul><ul><li>YARV: -1 ...
Task execution タスクの実行 <ul><li>receiver.send(method_name, *parameters, &block) </li></ul><ul><li>&quot;a&quot;.send(:casecm...
Task creation – objects タスクの作成  -  オブジェクト <ul><li>Receiver and parameters are objects chosen at random, with a random numb...
Task creation – method タスクの作成  -  メソッド <ul><li>Potential methods based on reflection </li></ul><ul><li>リフレクションによるメソッド候補作成 ...
Result comparison Receiver object: “a” Method: “casecmp” Parameters: [“b”] Result: -1 diff MRI_output.txt rubinius_output....
Task serialization タスクのシリアル化 <ul><li>Required for consistency </li></ul><ul><li>これは、一貫性のために必要 </li></ul>
Segmentation faults セグメンテーションフォールト <ul><li>CRuby and Rubinius can crash, so need tasks saved </li></ul><ul><li>CRuby と Rub...
Discoveries 発見
Bugs のバグ <ul><li>String#casecmp bug in Rubinius </li></ul><ul><li>String#casecmp Rubinius のバグ </li></ul>
Segmentation faults セグメンテーションフォールト <ul><li>Found in CRuby and Rubinius </li></ul><ul><li>CRuby  と  Rubinius  で検出 </li></ul...
Current difficulties 現在の課題
Inconsistencies in inspect inspect の結果が実装ごとに異なる <ul><li>inspect has different results between implementations </li></ul><u...
False alarms 誤報 <ul><li>Is giving nil rather than false a problem? </li></ul><ul><li>&quot;false&quot; でなく &quot;nil&quot;...
Future directions 将来の方向性
Faster 高速化 <ul><li>Faster is often better </li></ul><ul><li>速ければより良い </li></ul><ul><li>Move it to the cloud? </li></ul><ul...
Questions? 質問?
Extra material! 補足資料
String#casecmp testing <ul><li>Testing everything except “happy path”! </li></ul><ul><li>エッジケースのみテスト </li></ul>describe &q...
Other bugs found by SEC SEC で見つかったバグ <ul><li>YAML.load(YAML.dump(Regexp.new('',0,'n'))) </li></ul><ul><li>''.unpack('d') {...
Other bugs independent of SEC SEC とは別に見つかったバグ <ul><li>&quot;XabXcd&quot;.split(&quot;X&quot;, 2) # => [&quot;ab&quot;] but...
Thankyou! Domo arigato! どうもありがとう <ul><li>Translations: </li></ul><ul><ul><li>Makoto Inoue-san </li></ul></ul><ul><ul><li>m...
Upcoming SlideShare
Loading in...5
×

Small eigen collider ruby kaigi 2011

729

Published on

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total Views
729
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Small eigen collider ruby kaigi 2011"

  1. 1. Andrew Grimm University of New South Wales ニューサウスウェールズ大学 (UNSW) RubyKaigi 2011 日本 Ruby 会議 2011 Finding Black Holes in Ruby with the Small Eigen Collider 小型特異衝突型加速器で Ruby 内のブラックホールの特異点を見つける方法
  2. 2. tl;dr Too Long, Didn't Read( 長過ぎてよんでられない ) <ul><li>Creates random code. Metaprogramming magic! </li></ul><ul><li>ランダムなコードを作成します。メタプログラミングマジック! </li></ul>
  3. 3. Why? なんで? <ul><li>Why did I create the Small Eigen Collider? </li></ul><ul><li>なぜ私は小型特異衝突型加速器を作成した ? </li></ul>
  4. 4. Background 背景 <ul><li>Bioinformatician at UNSW </li></ul><ul><li>UNSW のバイオインフォマティクス </li></ul><ul><li>Looking at mutations in HIV </li></ul><ul><li>HIV 感染の変異を見て </li></ul>
  5. 5. Looking at mutations 私は突然変異で探しています <ul><li>Start with viruses with identical DNA sequence </li></ul><ul><li>同一の DNA 配列を持つウイルスで始まります </li></ul><ul><li>Allow to reproduce for one generation in laboratory </li></ul><ul><li>実験室内の 1 つの世代のために再現することができます </li></ul><ul><li>Determine DNA sequence of new viruses </li></ul><ul><li>新しいウイルスの DNA 配列を決定する </li></ul><ul><li>Differences are mutations </li></ul><ul><li>違いは突然変異です </li></ul>
  6. 6. Big data ビッグデータ <ul><li>Looking at approximately 500,000 sequences </li></ul><ul><li>約 50 万シーケンスを見て </li></ul><ul><li>Approx. 150,000,000 DNA letters (A, C, G, T) </li></ul><ul><li>約。 1.5 億 DNA の文字( A 、 C 、 G 、 T ) </li></ul><ul><li>For comparison, human genome is 3,000,000,000 letters </li></ul><ul><li>比較のために、ヒトゲノムは 30 億文字です </li></ul>
  7. 7. Problem <ul><li>Ruby is too slow </li></ul><ul><li>XKCD 303 </li></ul>問題 <ul><li>Ruby は遅すぎる </li></ul>
  8. 8. How slow is my application? 私のアプリのスピード <ul><li>Currently using YARV Ruby 1.9.1 </li></ul><ul><li>My application looks at 500,000 sequences </li></ul><ul><li>50万件のルックアップ </li></ul><ul><li>An analysis takes 20 minutes </li></ul><ul><li>解析には20分かかる </li></ul>
  9. 9. That's after some optimizing! ちなみにこれはチューニングの 後の数字です
  10. 10. Other Rubies might be faster ほかの Ruby 実装はもっと速いかも
  11. 11. JRuby <ul><li>Faster at some tasks </li></ul><ul><li>Real multithreading (no GIL) </li></ul><ul><li>特定の処理は高速で真のマルチスレッド </li></ul>
  12. 12. Rubinius <ul><li>Faster at some tasks </li></ul><ul><li>Real multithreading Real Soon Now </li></ul><ul><li>特定の処理は高速で真のマルチスレッドも近日リリース </li></ul>
  13. 13. Ruby Enterprise Edition <ul><li>Mainly better at garbage collection </li></ul><ul><li>GC が良い。 </li></ul><ul><li>More relevant to Rails developers than me </li></ul><ul><li>Rails 開発者向き </li></ul>
  14. 14. <ul><li>How do I know it'll give the correct results? </li></ul><ul><li>どのように私はそれが正しい結果を与えているか知ることができる? </li></ul>Should I switch to a faster Ruby? もっと早い Ruby 実装に乗り換えるべき?
  15. 15. What kind of errors worry me? どういうエラーが心配? <ul><li>Large, obvious bugs that cause an exception are fine </li></ul><ul><li>エラーを生じる明らかなバグはあまり心配なし </li></ul><ul><li>Small, subtle bugs that give an incorrect result are bad </li></ul><ul><li>些細でまちがった結果を生じるバグがやばめ </li></ul>
  16. 16. Other implementations are wrong 他の実装が間違っている <ul><li>Ran my project against Rubinius – 1 unit test failed </li></ul><ul><li>Rubinius で自分のプロジェクトを走らせてみた - テストが一つ失敗した </li></ul>
  17. 17. Other implementations are wrongerer 他の実装では、さらに間違っている <ul><li>Ran BioRuby with Rubinius – 1 unit test failed </li></ul><ul><li>Rubinius で BioRuby を走らせてみた - テストが一つが失敗した </li></ul>
  18. 18. Even JRuby is not immune JRuby も例に漏れず <ul><li>Made mistakes in the complicated task of splitting a file into lines </li></ul><ul><li>ファイルを行に分割する複雑な作業でミス </li></ul>
  19. 19. How many bugs cause 0 failures? Fail しないバグはいくつ? <ul><li>3 bugs caused 1 unit test failure each </li></ul><ul><li>3つのバグがそれぞれ一つの Fail テストを生じる </li></ul><ul><li>How many bugs caused 0 unit test failures each? </li></ul><ul><li>では Fail してない時のバグはいくつ? </li></ul>
  20. 20. How can I be sure there weren't others? どのように他のエラーがないことを確認することができる? <ul><li>Rubinius and JRuby had failed me. RubySpec had failed me. </li></ul><ul><li>Rubinius でも JRuby でも RubySpec でもうまくいかなかった </li></ul>
  21. 21. What could I do? 私には何ができる? XKCD 386
  22. 22. What assumptions can I make about the problem? 問題に対してどういった想定をすれば良い?
  23. 23. Bugs are simple ソフトウェアのバグは簡単 <ul><li>Isolate them to a single failure, not several failures </li></ul><ul><li>、複数のフェイルがでているコードを単一のフェイルがでているところまで分離 </li></ul>
  24. 24. Bugs are simple to fix バグの修正は簡単 <ul><li>Rubinius folk fixed bugs promptly </li></ul><ul><li>Rubinius 開発者で 1 日以内にバグを修正 </li></ul><ul><ul><li>String#split 1 day (1 日 ) </li></ul></ul><ul><ul><li>StringIO#gets 1 day (1 日 ) </li></ul></ul><ul><ul><li>String#casecmp 3 days (3 日 ) </li></ul></ul>
  25. 25. Unexplored territory 未踏の領域 <ul><li>Bugs are from trying something not done before </li></ul><ul><li>バグというのは今まで行われていなかった領域に足を踏み込む前に現れる </li></ul>
  26. 26. <ul><li>I'm happy to report that this is the first ever &quot;Rubinius doesn't support flipflop&quot; bug. I've been waiting for this day. </li></ul><ul><li>「 Rubinius がほげほげをサポートしてない」的なバグリポートをする日をずっと待っていた </li></ul><ul><li>I'll go ahead and implement it now, I was waiting for someone to report it. It only took 5 years. </li></ul><ul><li>今すぐ実装するよ。だれかがリポートしてくれるのを5年間待ってたし </li></ul>
  27. 27. What is the Small Eigen Collider? 小型特異衝突型加速器って何?
  28. 28. How Small Eigen Collider Works 小型特異衝突型加速器はどう動く? <ul><li>Create same tasks, run on different Rubies, compare results </li></ul><ul><li>別のルビーで同じタスクを実行し、結果を比較。 </li></ul>
  29. 29. Comparing results 比較結果 <ul><li>Me: What is the result of &quot;a&quot;.casecmp(&quot;b&quot;)? </li></ul><ul><li>YARV: -1 </li></ul><ul><li>JRuby: -1 </li></ul><ul><li>Rubinius: +1 </li></ul>
  30. 30. Task execution タスクの実行 <ul><li>receiver.send(method_name, *parameters, &block) </li></ul><ul><li>&quot;a&quot;.send(:casecmp, [&quot;b&quot;], &:inspect) </li></ul>
  31. 31. Task creation – objects タスクの作成 - オブジェクト <ul><li>Receiver and parameters are objects chosen at random, with a random number of parameters </li></ul><ul><li>レシーバとパラメータはランダムに作成されたオブジェクト </li></ul>
  32. 32. Task creation – method タスクの作成 - メソッド <ul><li>Potential methods based on reflection </li></ul><ul><li>リフレクションによるメソッド候補作成 </li></ul><ul><li>&quot;a&quot;.methods # => [:upcase, :zip, ..., :casecmp, …] </li></ul><ul><li>Method chosen at random </li></ul><ul><li>最後はランダムに選ばれる </li></ul>
  33. 33. Result comparison Receiver object: “a” Method: “casecmp” Parameters: [“b”] Result: -1 diff MRI_output.txt rubinius_output.txt 180c180 < Result: -1 --- > Result: 1 結果の比較
  34. 34. Task serialization タスクのシリアル化 <ul><li>Required for consistency </li></ul><ul><li>これは、一貫性のために必要 </li></ul>
  35. 35. Segmentation faults セグメンテーションフォールト <ul><li>CRuby and Rubinius can crash, so need tasks saved </li></ul><ul><li>CRuby と Rubinius はクラッシュする可能性があるので、タスクを保存する必要あり </li></ul>
  36. 36. Discoveries 発見
  37. 37. Bugs のバグ <ul><li>String#casecmp bug in Rubinius </li></ul><ul><li>String#casecmp Rubinius のバグ </li></ul>
  38. 38. Segmentation faults セグメンテーションフォールト <ul><li>Found in CRuby and Rubinius </li></ul><ul><li>CRuby と Rubinius で検出 </li></ul><ul><li>Thread.kill(nil) caused a segfault in YARV </li></ul><ul><li>Thread.kill(nil) が YARV でセグフォールとを引き起こした </li></ul>
  39. 39. Current difficulties 現在の課題
  40. 40. Inconsistencies in inspect inspect の結果が実装ごとに異なる <ul><li>inspect has different results between implementations </li></ul><ul><ul><li>Default: #<StringIO:0x10169cfd8> </li></ul></ul><ul><ul><li>Rubinius: #<StringIO:0xf7c @string=&quot;&quot; @lineno=0 @append=false @readable=true @writable=true @pos=0> </li></ul></ul>
  41. 41. False alarms 誤報 <ul><li>Is giving nil rather than false a problem? </li></ul><ul><li>&quot;false&quot; でなく &quot;nil&quot; を与える事は問題? </li></ul><ul><li>&quot;n&quot;.is_binary_data? </li></ul><ul><ul><li>Rbx, MRI 1.8: false </li></ul></ul><ul><ul><li>JRuby 1.8: nil </li></ul></ul>
  42. 42. Future directions 将来の方向性
  43. 43. Faster 高速化 <ul><li>Faster is often better </li></ul><ul><li>速ければより良い </li></ul><ul><li>Move it to the cloud? </li></ul><ul><li>クラウドに移行? </li></ul>
  44. 44. Questions? 質問?
  45. 45. Extra material! 補足資料
  46. 46. String#casecmp testing <ul><li>Testing everything except “happy path”! </li></ul><ul><li>エッジケースのみテスト </li></ul>describe &quot;String#casecmp&quot; do it &quot;is a case-insensitive version of String#<=>&quot; do &quot;abcdef&quot;.casecmp(&quot;abcde&quot;).should == 1 &quot;aBcDeF&quot;.casecmp(&quot;abcdef&quot;).should == 0 &quot;abcdef&quot;.casecmp(&quot;abcdefg&quot;).should == -1 &quot;abcdef&quot;.casecmp(&quot;ABCDEF&quot;).should == 0 end # Snipped I18N tests end
  47. 47. Other bugs found by SEC SEC で見つかったバグ <ul><li>YAML.load(YAML.dump(Regexp.new('',0,'n'))) </li></ul><ul><li>''.unpack('d') { true } </li></ul><ul><li>ObjectSpace.undefine_finalizer(:symbol) </li></ul><ul><li>Fixnum.set_superclass Object ; 42.to_int </li></ul><ul><li>YAML.try_implicit(0) </li></ul>
  48. 48. Other bugs independent of SEC SEC とは別に見つかったバグ <ul><li>&quot;XabXcd&quot;.split(&quot;X&quot;, 2) # => [&quot;ab&quot;] but no &quot;cd&quot; </li></ul><ul><li>StringIO.new(&quot;phone&quot;).gets(&quot;on&quot;) # => gives &quot;pho&quot; when it should give &quot;phon&quot; </li></ul>
  49. 49. Thankyou! Domo arigato! どうもありがとう <ul><li>Translations: </li></ul><ul><ul><li>Makoto Inoue-san </li></ul></ul><ul><ul><li>mame2-san </li></ul></ul><ul><ul><li>Google Translate-san </li></ul></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×