Hiroshimarb 027-fiber

35
Fiber サンプルをかいてみた 2013/02/02 広島Ruby勉強会 #027 1322日土曜日

Transcript of Hiroshimarb 027-fiber

Page 1: Hiroshimarb 027-fiber

Fiber のサンプルをかいてみた

2013/02/02 広島Ruby勉強会 #027

13年2月2日土曜日

Page 2: Hiroshimarb 027-fiber

Fiber13年2月2日土曜日

Page 3: Hiroshimarb 027-fiber

別名

マイクロスレッド

コルーチン

13年2月2日土曜日

Page 4: Hiroshimarb 027-fiber

状態管理を意識せずに行えるため、協調的処理、イテレータ、無限リスト、パイプなど、継続状況を持つプログラムが容易に記述できる。

13年2月2日土曜日

Page 5: Hiroshimarb 027-fiber

ゲームプログラミングでみたことある

13年2月2日土曜日

Page 6: Hiroshimarb 027-fiber

ということでそれ系のサンプルをかいてみた

13年2月2日土曜日

Page 7: Hiroshimarb 027-fiber

http://www.youtube.com/watch?v=UOIOVLrBDEA

13年2月2日土曜日

Page 8: Hiroshimarb 027-fiber

もっと派手にすればよかった

13年2月2日土曜日

Page 9: Hiroshimarb 027-fiber

どんなコードを書きたいか

13年2月2日土曜日

Page 10: Hiroshimarb 027-fiber

10回 下に移動する

10回 右に移動する

10回 上に移動する

10回 左に移動する

13年2月2日土曜日

Page 11: Hiroshimarb 027-fiber

10.times do downend

10.times do rightend

10.times do upend

10.times do leftend

13年2月2日土曜日

Page 12: Hiroshimarb 027-fiber

そうはうまくいかぬ

13年2月2日土曜日

Page 13: Hiroshimarb 027-fiber

Fiber を使わずかいてみよう

13年2月2日土曜日

Page 14: Hiroshimarb 027-fiber

def step if @time < 10 @x += 1 elsif @time >=10 and @time < 20 @y += 1 elsif @time >= 20 and @time < 30 @x -= 1 elsif @time >= 30 and @time < 40 @y -= 1 else @x = 0 @y = 0 @time = 0 end @time += 1 end

13年2月2日土曜日

Page 15: Hiroshimarb 027-fiber

def step if @time < 10 @x += 1 elsif @time >=10 and @time < 20 @y += 1 elsif @time >= 20 and @time < 30 @x -= 1 elsif @time >= 30 and @time < 40 @y -= 1 else @x = 0 @y = 0 @time = 0 end @time += 1 end

状態を管理する必要がある

状態の更新が必要

13年2月2日土曜日

Page 16: Hiroshimarb 027-fiber

def step if @time < 10 @x += 1 elsif @time >=10 and @time < 20 @y += 1 elsif @time >= 20 and @time < 30 @x -= 1 elsif @time >= 30 and @time < 40 @y -= 1 else @x = 0 @y = 0 @time = 0 end @time += 1 end

どの状態か判断が必要

下に移動する時

右に移動する時

上に移動する時

左に移動する時

13年2月2日土曜日

Page 17: Hiroshimarb 027-fiber

Fiber を使うと?

13年2月2日土曜日

Page 18: Hiroshimarb 027-fiber

def step fiber.resume end

13年2月2日土曜日

Page 19: Hiroshimarb 027-fiber

@fiber ||= Fiber.new do loop do @x = 5 @y = 5

10.times do @x += 1 Fiber.yield end

10.times do @y += 1 Fiber.yield end

10.times do @x -= 1 Fiber.yield end

10.times do @y -= 1 Fiber.yield end end end

13年2月2日土曜日

Page 20: Hiroshimarb 027-fiber

10.times do downend

10.times do rightend

10.times do upend

10.times do leftend

13年2月2日土曜日

Page 21: Hiroshimarb 027-fiber

@fiber ||= Fiber.new do loop do @x = 5 @y = 5

10.times do @x += 1 Fiber.yield end

10.times do @y += 1 Fiber.yield end

10.times do @x -= 1 Fiber.yield end

10.times do @y -= 1 Fiber.yield end end end

13年2月2日土曜日

Page 22: Hiroshimarb 027-fiber

概ね希望どおりかける

13年2月2日土曜日

Page 23: Hiroshimarb 027-fiber

Fiber.yield を呼んだところで止めたままにできる

13年2月2日土曜日

Page 24: Hiroshimarb 027-fiber

再開するには Fiber#resume を使用する

13年2月2日土曜日

Page 25: Hiroshimarb 027-fiber

メイン サブ

止めておいたところからそのまま再開できる

13年2月2日土曜日

Page 26: Hiroshimarb 027-fiber

step メソッドで Fiber を再開させるだけFiber の中では必要なとこで止まる状態をそのまま維持

13年2月2日土曜日

Page 27: Hiroshimarb 027-fiber

実際にはあちこちまわるけどプログラムは

真っ直ぐ書ける

13年2月2日土曜日

Page 28: Hiroshimarb 027-fiber

おまけ

13年2月2日土曜日

Page 29: Hiroshimarb 027-fiber

描画にはOpenGL とかつかってがんばる方法もあるけどCurses を使いました

13年2月2日土曜日

Page 30: Hiroshimarb 027-fiber

Curses

13年2月2日土曜日

Page 32: Hiroshimarb 027-fiber

端末の画面の特定の位置に文字を置く

13年2月2日土曜日

Page 33: Hiroshimarb 027-fiber

Curses.setpos(x,y) Curses.addstr('*')

13年2月2日土曜日

Page 34: Hiroshimarb 027-fiber

https://github.com/eiel/Fiber-Sample

ソースコード

13年2月2日土曜日

Page 35: Hiroshimarb 027-fiber

ご清聴ありがとうございます

13年2月2日土曜日