Slide 1

Slide 1 text

minirakeを 並列化した話 @take-cheeze

Slide 2

Slide 2 text

mrubyのビルドに使うあいつ - Makefileはあるけど実体はrakeっぽいあいつ - Ruby 1.9でも動く

Slide 3

Slide 3 text

minirake - rakeのサブセット - 1000行未満でrakeのほしい機能が大体ある - MobiRubyの作者の方が導入

Slide 4

Slide 4 text

minirakeの問題点 - `-j` オプションがなかった(過去形) - ビルドスクリプトが副作用自由すぎてつらい(関数型言語信者(狂

Slide 5

Slide 5 text

minirakeに-jオプションを実装した - (Rubyの)パパが喜んでた - ダリフラのフトシは漢だと思う - ゴローが代役の方になってしまって残念だった。。。 - 最終話の録画に失敗した。。。 - パパが喜んでたけど、いい実験台だった... - マルチなんちゃらプログラミングは難しい - なんか挙動がおかしいとは思っていた

Slide 6

Slide 6 text

実装方法 - 子プロセスは `Thread` で待って管理 - タスクは `Fiber` 上で実行 - 子プロセスを立ち上げると `FIber` が停止する - rakeは `ThreadGroup` でやっているが使い方がよくわからなかっ たので...

Slide 7

Slide 7 text

試行錯誤(実験したこと) - `Fiber.yield` だとちゃんと切り替わらないケースがある - あくまで可能性だったが、微妙な実装はリリースにのってほしくなかった - `resume` / `yield` の代わりに、 `transfer` で置き換え - 同時実行の上限をうまく設定できてなかった - 実装終わったと思ったらあるある実装の抜け - タスクが上限を天元突破して動作してた(おかげで見つかった依存関係のバグ - OSたぶんよろしくやってたか、いいマシンで実行してた - 同時実行のバグを潰したら、CPUを食いつぶす - スリープを適切に入れてあげる - `pthread_yield` 相当がほしかった。。。

Slide 8

Slide 8 text

バグらせて、別のバグを見つける - ビルドシステムで依存漏れってよくありますよね? - 並列ビルドは、義務です

Slide 9

Slide 9 text

おまけ: rakeにもパッチ送ったよ - prerequisitesと打てない人のためのalias - https://github.com/ruby/rake/pull/268 - `prereqs` でほぼ半分のタイプ数 - rakeでもorder only dependencyがほしい - https://github.com/ruby/rake/pull/269 - スクリプト内でprerequisitesからは除外される - 依存するコマンドをprereqsから除外するのに便利

Slide 10

Slide 10 text

おしまい ありがとうございました 入れられるかわからないけど、1.4にバックポートしたみ