!SLIDE
!SLIDE
会場の皆様には非公開のコードを交えて解説します
!SLIDE
スマートフォン,タブレットでサーバーに接続する
- コマンド打つのが面倒
- タスクマネージャを起動するのが面倒
- マウスが暴れまわる(固有の問題)
!SLIDE
- 停止
- 再起動
- 設定の更新
Webからプログラムを操作する
!SLIDE
- Unfiltered
- web toolkit
- HTTPリクエストの処理に使う
- プログラムに組み込み易い
- Akka
- actors and supervision
- アクターを生成したりを殺したり
- Scalaz
- functional programming
- Trampolineを使う
- sequenceとか>>とか…
!SLIDE
HTMLはXMLリテラルベタ書き
自分で使うツールなのでエラー処理とか適当
def intent = {
case GET(Path("/")) =>
Html(form())
case POST(Path("/restart")) =>
restart()
Redirect("/")
case POST(Path("/stop")) =>
stop()
Redirect("/")
case POST(Path("/update")) & Params(params) =>
update(params)
Redirect("/")
}
!SLIDE
元のプログラムを割り込み可能な形に書き換えなければならない
def receive = {
case "loop" =>
f()
self ! "loop"
case "exit" =>
System.exit(0)
}
全てをメッセージパッシングで書き換えるのは非現実的
!SLIDE
プログラムをステートマシンに書き換えてアクターで駆動すれば良い
case class State[A](run: A => State[A])
def receive = {
case state: State[_] => self ! state.run(input)
}
!SLIDE
元のプログラムはステートレスだったのでトランポリンで記述できる
標準のTailCallsだと再帰が書けないのでScalazを使う
モナドなので手続き的なコードの書き換えも簡単(要出典)
!SLIDE
アクターを再利用しないならActorDSLを使うと便利
import scalaz.Free
import akka.actor._, ActorDSL._
val system = ActorSystem("system")
actor(system, "process")(new Act {
become {
case tramp: Free.Trampoline[_] =>
tramp.resume.fold(self ! _(), _ => ())
}
})
!SLIDE
動いてるアクターを参照したり殺したり
system.actorSelection("/user/process").resolveOne(timeout).onSuccess {
case ref => system.stop(ref)
}
!SLIDE
- Akka便利
- 2.11早く来てほしい
- HTML手書きつらい
技術的におもしろいコードだけど公開できないのが残念