Ruby1.9のfiberのかっこいい使い方
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Ruby1.9のfiberのかっこいい使い方

on

  • 3,130 views

 

Statistics

Views

Total Views
3,130
Views on SlideShare
3,100
Embed Views
30

Actions

Likes
8
Downloads
13
Comments
0

2 Embeds 30

https://twitter.com 28
http://us-w1.rockmelt.com 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Ruby1.9のfiberのかっこいい使い方 Presentation Transcript

  • 1. Ruby1.9のFiberとクロージャのかっこいい使い方
    Rubyist九州
    山崎重一郎
  • 2. まず、関数、クロージャ、継続の気持ちを説明してみます
    マインド
    Rubyではどうなっているのか?
              
  • 3. 関数とマインド
    関数はいつも上から目線
     自分自身の心が行っていることを幽体離脱して外から眺める感じ
    ああして
    こうして
    こうなったら
    こうして
    関数の定義
  • 4. 0マインド
    「何もない」状態を考えてみましょう
    0 = φ = {}
    {}
  • 5. 1マインド
    「何もない」と思っている自分を見ている自分
     1 = {φ}
    {}
  • 6. 2マインド
    1マインドの自分を見ている自分
     2 = {φ,{φ}}
  • 7. 3マインド
    2マインドの自分を見ている自分
     3 = {φ,{φ},{φ,{φ}}}
  • 8. ωマインド
    これってずっと無限にできるよねと思っている自分
     ω = {φ,{φ},{φ,{φ}},...}
    ...
     「我はαでありωである」
         ヨハネの黙示録
  • 9. ω+1マインド
    「これってずっと無限にできるよねと思っている自分」を見ている自分
     ω+1 = {ω}
  • 10. ω+ωマインド
    ωマインドを対象にした対象化もまた無限にできるよねと思っている自分
    •  ω+1 = {ω,{ω},{ω,{ω}},...}
    ...
  • 11. まだまだ
    3ωマインド
    ω×ωマインド
    ωωマインド
    ....
    ★でも、ずっとずっとやると精神を病みます
  • 12. ωマインドの関数定義
    λを使うことがωマインドの例
    -> x { ... }
    階乗の再帰的定義
    fact = -> n {n==0 ? 1 : n*fact[n-1]}
    ★下のように書く方が Ruby っぽいけど
    fact = -> x {(1..x).reduce(:*)}
  • 13. ω+ωマインドの関数定義
    λを二つ使うとω+ω
    -> x { -> y {...} }
    組み合わせ関数(再帰なのですっごく遅い)
    combi=->n{->r{r==1 ?n:(n==r ?1:combi[n-1][r-1]+combi[n-1][r])}}
  • 14. でも有限のマインドも大切
    クロージャ:上から目線でつくった状態
    ωマインドの視点から -> nマインド(状態)を見る
    ファイバー:継続、ジェネレータ
    ジェネレータ: n マインドから ωマインドを見る その逆も
  • 15. 関数とクロージャ
    関数の独立変数と係数
     f(x) = a*x
     aは係数でxは独立変数?
    • 係数のa をω+ωの視点から見下ろして定義
    fa= ->a {->x {a*x}}
    で、aに何かの値を束縛したωな関数をつくる
    fa= ->a {->x {a*x}}
    > f=fa[2]
    > f[3]
    => 6
    > eval('a',f.binding)
    => 2
  • 16. 関数のメモ化
    関数には時間の概念がない
    でも、もう一つ上のωの視点から見おろせば状態が作れる
    組み合わせ関数のメモ化
    combi_memo= ->m { ->n {m[n]||={}; ->r {m[n][r]||=combi[n][r]}}}
    > cm=combi_memo[{}]
    > cm[3][2]
    => 3
    > cm[30][7]
    => 2035800
    > eval('m',cm.binding)
    => {3=>{2=>3}, 30=>{7=>2035800}}
  • 17. Fiber
    f=Fiber.new{|x|
    puts '最初'
    Fiber.yield
    puts x
    y=Fiber.yield
    puts y
    }
    > f.resume 3 #new メソッドへ
    最初
    => nil
    > f.resume #yield メソッドへ
    3
    => nil
    > f.resume7 #yield メソッドへ
    7
    => nil
    > f.resume
    FiberError: dead fiber called
    継続、軽量スレッド
    Fiber.new {|x|...}
    ファイバーの生成
    Fiver.yield(obj)
    親のコンテクストに行く
    resume(obj) メソッド
    子供のコンテクストに行く
    (途中でとまっていた処理を継続)
  • 18. Fiber によるジェネレータ
    nマインドとωマインドを行き来する
    無限ループでデータを無限に生成するプログラムの最初のn要素
    自然数ジェネレータ
    num= -> a {loop {a+=1}}
    > num[0]
    ... 無限ループ〜
    無限集合を素直に生成しているんだけどね
    ファイバーにした自然数ジェネレータ
    n = Fiber.new{|a|loop{Fiber.yielda+=1}}
    無限集合の最初の5個だけ取り出す
    (Haskellみたいでかっこいい!)
    > 5.times {puts n.resume 0}
    1
    2
    3
    4
    5
    => 5
  • 19. Fiber によるジェネレータ
    フィボナッチ数列バージョン!
    フィボナッチ数列ジェネレータ
    fib = -> x {a,b=x
    loop {a; a,b=b,a+b}}
    >fib[[0,1]]
    ... 無限ループ〜
    フィボナッチ数列を素直に生成している
    ファイバーにしたフィボナッチ数列ジェネレータ
    f = Fiber.new{|x| a,b=x
    loop {Fiber.yielda; a,b=b,a+b}}
    無限集合の最初の5個だけ取り出す
    > 5.times {puts f.resume [0,1]}
    0
    1
    1
    2
    3
    => 5
    もっとHaskellチックにこんなのもいいかも!
    deff.take(n) n.times {puts self.resume} end
    > f.take 10
  • 20. Fiberによるコルーチンで軽量イベント駆動マシン
    初期のMacintosh OS
    多数のコルーチンの集合体でできていた
    (すっごく軽量なスレッドみたいなもの)
    Macintosh 128K
    8MHz
    128Kb
    コルーチン
    コルーチン
    コルーチン
    コルーチン
    操作による
    イベント
    実際のメモリ
    コルーチン
    ビットマップ
    への表示など
  • 21. Fiberによるコルーチンで軽量イベント駆動マシン
    Rails 3.2 からPjaxが標準に
    WebサーバにFiberプールで軽量スレッド
    メモリ節約、起動/再起動の高速化
    コルーチン
    コルーチン
    Pjax
    ブラウザ
    コルーチン
    コルーチン
    操作による
    イベント
    Fiber対応Webサーバ
    unicornとかGoliathとか
    コルーチン
    ブラウザへの
    表示変更
  • 22. FiberとThreadの比較
    出典:Ruby Fibers Vs Ruby Threads
    http://oldmoe.blogspot.com/2008/08/ruby-fibers-vs-ruby-threads.html
  • 23. Fiberによるリアルタイム処理
    次回にね!