やさしいIteratee入門

6,772 views

Published on

できるだけわかりやすくIterateeを説明します。

Published in: Engineering
0 Comments
28 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,772
On SlideShare
0
From Embeds
0
Number of Embeds
1,548
Actions
Shares
0
Downloads
29
Comments
0
Likes
28
Embeds 0
No embeds

No notes for slide

やさしいIteratee入門

  1. 1. やさしいIteratee入門 Play Framework 2 Meetup @kawachi 2014/5/24
  2. 2. データ分析関連書籍
 翻訳やってます。 Scala, Play, iOS,
 Ruby, Rails, Java, C, Python, Javascript, Haxe etc.
  3. 3. Scala, Play 関連 2011年 プロトタイプ作成にPlay! 1 採用
 (少しだけ) 2012年~ Scalaをメインとして使用 2013年末~ Play 2 で開発 サービス課題をサクッとチェック 事前登録受付中 http://logbook.strikingly.com/ Logbook
  4. 4. ScalaMatsuri 9月6~7日 日本最大のScala Conference ただいまSponsor募集中! http://scalamatsuri.org
  5. 5. 対象 • 今日の話は Play 2.3.0-RC1 を基にしています • Scala です • えーと、Java の方いらっしゃいますか?
  6. 6. 今日の内容 1. Iteratee の概要 2. Iteratee 3つの特徴 3. 身近な Iteratee
  7. 7. Iteratee? • Websocket の説明を読んでいると突然出てくるアレ • マニュアル内 Advanced topics の最初の項目 • 純粋関数型世界からきた概念 • 2008年に提唱された • http://okmij.org/ftp/Streams.html
  8. 8. Iteratee を知っておくべき理由 • WebSocket/Comet の実装に必要 • Play のいろんなところで使われている • わかんないと気持ち悪い (ですよね?)
  9. 9. Iteratee を学びたての
 James Roper さん曰く (2012/11) • “Well I just learnt iteratees, and although I'm feeling more and more comfortable with functional programming every day, I still think like an imperative programmer at heart. This made learning iteratees very difficult for me.” • Typesafe 社で Play の tech lead やってる人も
 難しいっていってた http://jazzy.id.au/default/2012/11/06/iteratees_for_imperative_programmers.html
  10. 10. 今日の目的 Iteratee のイメージをつかむ。 Iteratee が出てきた時に驚かない体を作る。
  11. 11. ストリーミングモデル 読み込み /生成 処理 出力 結果 Iteratee Input (小分けしたデータ) Enumerator
  12. 12. ストリーミングモデル 読み込み /生成 処理 出力 結果 IterateeEnumerator 変換 Enumeratee Input (小分けしたデータ)
  13. 13. Iteratee の状態と状態遷移 • Cont — 引き続き Input[E] を処理する • Done — 結果がでた • Error — エラーが起きた Inputをひとつ処理する毎に 状態遷移 Cont Done Error Iteratee は状態をもつ
  14. 14. Iteratee ライブラリの3大要素 play.api.libs.iteratee Iteratee Enumerator Enumeratee
  15. 15. 今日の内容 1. Iteratee の概要 2. Iteratee 3つの特徴 3. 身近な Iteratee
  16. 16. 3つの特徴 • Immutable • Non-blocking • Composable
  17. 17. Immutable? でも状態があるよ? Immutable で状態を変更するには… Immutable collection を思い出してみよう。 ! val a1 = List(1, 2, 3) val a2 = a1 ++ List(4, 5, 6) もとのa1は変更されずそのまま。 新しい collection が生成される。
  18. 18. Immutable! Cont 状態の Iteratee は
 Input を引数にとって 次の Iteratee を返す 関数をもつ 1 Input 毎に 別の Iteratee が 生成される Done か Error になったら それ以上入力を受け取らない Cont Cont Done
  19. 19. コード見たほうが分かりやすい? sealed trait Step[E, +A] ! object Step { case class Done[+A, E](a: A, remaining: Input[E]) extends Step[E, A] case class Cont[E, +A](k: Input[E] => Iteratee[E, A]) extends Step[E, A] case class Error[E](msg: String, input: Input[E]) extends Step[E, Nothing] }
  20. 20. Non-blocking IterateeEnumerator Iteratee Iteratee … Iteratee に Input を流し込み、将来の Iteratee を得る trait Enumerator[E] { def apply[A](i: Iteratee[E, A]): Future[Iteratee[E, A]] } blockしない
  21. 21. 混乱しがちなこと • Iteratee には
 状態がわかっているもの (StepIteratee)と、
 将来状態がわかるもの(FutureIteratee)がある • Future[Iteratee] は
 Iteratee (FutureIteratee) に
 変換できる (Iteratee.flatten()) Iteratee StepIteratee FutureIteratee
  22. 22. Enumerator.apply() の結果は Iteratee とみなせる IterateeEnumerator Iteratee (FutureIteratee) Iteratee.flatten()
  23. 23. 結果Aの計算も Non-blocking IterateeEnumerator Iteratee Iteratee … A trait Iteratee { def run: Future[A] } blockしない
  24. 24. Composable • 小さなコンポーネントを組み合せて
 より大きなコンポーネントをつくること
  25. 25. Enumerator.apply(Iteratee) Iteratee[E,A] E Enumerator[E] Iteratee[E,A] (FutureIteratee) Iteratee.flatten() E A A E E |>>
  26. 26. Enumeratee.compose(Enumeratee) Enumeratee[B,C] A Enumeratee[A,B] A B B C C Enumeratee[A,C] A A C C ><>
  27. 27. Enumerator.through(Enumeratee) Enumeratee[A,B] A Enumerator[A] A B B Enumerator[B] B B &>
  28. 28. Enumeratee.transform(Iteratee) Iteratee[B,C] A Enumeratee[A,B] A B B C Iteratee[A,C] A A C &>>
  29. 29. Enumerator.andThen (Enumerator) E Enumerator[E] EEnumerator[E] 1 2 ひとつめの Enumerator が 終わったら、ふたつめ Enumerator[E] E E >>>
  30. 30. Enumerator.interleave(Enume rator) E Enumerator[E] EEnumerator[E] ふたつを織り交ぜて出力する Enumerator[E] E E >-
  31. 31. 記号API • |>>, |>>|, &>, >-, >>> などの記号がある • Methodを呼び出しているだけ • その都度定義をみても大丈夫 例: def |>>[A](i: Iteratee[E, A]): Future[Iteratee[E, A]] = apply(i)
  32. 32. 今日の内容 1. Iteratee の概要 2. Iteratee 3つの特徴 3. 身近な Iteratee
  33. 33. Iteratee が
 Play のどんなところで
 使われているかみてみましょう
  34. 34. 身近なIteratee (WebSocket) ドキュメント内のサンプルコード def socket = WebSocket.using[String] { request => // Log events to the console val in = Iteratee.foreach[String](println).map { _ => println("Disconnected") } // Send a single 'Hello!' message val out = Enumerator("Hello!") (in, out) } (Iteratee[E, _], Enumerator[E])
  35. 35. 身近なIteratee (WebSocket) Browser Play Enumerator Iteratee WebSocket ここは自分で頑張る
  36. 36. Actor based web socket API • Play 2.3 から入る • 自分で頑張る部分を手助けしてくれる ドキュメント内のサンプルコード def socket = WebSocket.acceptWithActor[String, String] { request => out => MyWebSocketActor.props(out) } RequestHeader ActorRef (出力担当Actor) Props (入力担当Actorの設定)
  37. 37. Actor based web socket API Browser Play Enumerator Iteratee 出力Actor 入力Actor Props ここは自分で頑張る
  38. 38. 身近なIteratee (Result) def index = Action { Ok("hello") } ! case class Result( header: ResponseHeader, body: Enumerator[Array[Byte]]) これは Result 型
  39. 39. 身近なIteratee (Result) Browser Play Enumerator HTTP request
  40. 40. 身近なIteratee (Result) Ok.chunked() で chunked response が返せる。 送信開始時に全データ Content-Length を知らなくて いいから嬉しい(こともある)。 ! def index = Action { Ok.chunked( Enumerator.fromFile(new File("1gb.file"))) }
  41. 41. 身近なIteratee (BodyParser) trait BodyParser[A] extends
 (RequestHeader =>
 Iteratee[Array[Byte], Either[Result, A]]) BodyParser は RequestHeader を取って Iteratee を返す関数 def save = Action(parse.text) { request => Ok("Got: " + request.body) } これが BodyParser。
 指定しなければ parse.anyContent parse された body
  42. 42. Play 身近なIteratee (BodyParser) BodyParser RequestHeader Iteratee Input[Array[Byte]] ① ② A HTTP request の body を 小分けしたもの Request.body ができた ③HTTP request
  43. 43. まとめ • Iteratee はストリーミング処理API • Enumerator → Enumeratee → Iteratee • Cont, Done, Error 状態をもつ • Immutable, Non-blocking, Composable • Play のいろんなところで使われている
  44. 44. ご清聴ありがとうございました やさしかった…ですね?

×