狠狠撸

狠狠撸Share a Scribd company logo
高速?軽量Webフレームワーク 
関西関数型道場 
2014-09-06 
で学ぶ
? Suguru Hamazaki (@hamazy) 
? とあるマーケティング会社で勤務 
? 先週まで WordPress ホスティングの 
会社にいました
? an open-source toolkit for building REST/HTTP-based 
integration layers 
REST/HTTPによる統合レイヤーを構築するための、オープンソースなツールキット 
? on top of Scala and Akka 
? asynchronous, actor-based, fast, lightweight, 
modular and testable 
— from http://spray.io/ 
Scala と Akka がベース 
非同期、Actorベース、高速、軽量、モジュラー化されており、テスト可能
Akka is a toolkit and runtime for 
building highly concurrent, distributed, 
and fault tolerant event-driven 
applications on the JVM. 
Akka は並列度が高く、分散した、耐障害性の高い、イベント駆動型の 
アプリケーションを作成するツールキットであり、実行環境です。 
— from http://akka.io/
Actor 
? 並行計算のモデル 
? スレッドモデルよりも抽象度が高く、扱い易い 
? イベント駆動型の受信ループでメッセージを非同期に処理 
? Non-blocking で高速 
? Akkaのactorは非常に軽量 
? 1GBのメモリーにつき数百万のactorが動作
Sprayのアプリで、 
Actorがどのように使われるか見てみましょう 
(demo)
? ActorSystem から Actor を作った 
? Spray が提供する Actor とメッセージをやりとり 
して、簡単な HTTP のサービスが出来た 
? Http.Bind, Http.Bound, Http.Connected, 
Http.Register, HttpRequest, HttpResponse
? HTTPのイベントに対応したロジックはそれはそ 
れでわかりやすい 
? が、全部それで書くのはしんどい 
? HTTPとアプリ、レイヤーは分けたい
Spray Routing
? ルーティングを定義 
? どんなリクエストをどこで処理するか 
? HTTPからアプリのレイヤーへの橋渡し 
? 抽象化された柔軟な内部DSLで書ける 
? 内部DSLなのでScalaの型チェックが入る
簡単なルーティングの定義を 
見てみましょう 
(demo)
? リクエストのメソッド名、パス、パラメーター 
で、処理するリクエストを抽出できた 
? パス、パラメーターの構造に応じて、処理の型 
が決まった 
? 型が合わないとコンパイルエラー
型安全は嬉しい
柔软性も欲しい
complete の例 
complete(StatusCodes.OK) 
StatusCode 型 
complete("Hello.") String 型 
complete(HttpResponse(entity = "Hello")) 
? HttpResponse 型
もっと色々渡したい 
? JSON オブジェクト 
? XML (NodeSeq型) 
? Future型 
? 任意の型のドメインオブジェクト
渡す値の型が共通のインターフェイスを 
継承することは、とても期待できない
さてどうしましょう
メソッドオーバー 
ローディング? 
いいえ、implicit です
? 似たコードの繰り返しを防ぐ 
? 型消去にまつわる問題を回避 
? Future[String] と Future[NodeSeq] を区別して 
もらわないと困る
実際の complete の定義 
def complete: 
(? ToResponseMarshallable) ? StandardRoute
ほぼこれに一致 
def complete( 
marshallable: ? ToResponseMarshallable): 
StandardRoute 
(このメソッドを関数へ持ち上げると、先ほどのコードになる)
def complete( 
marshallable: ? ToResponseMarshallable): 
StandardRoute 
この関数で、 
どうやって多様な型に 
対応しているのか?
Implicits
Implicits 
? 暗黙の型変換 / 暗黙のパラメーター 
? Haskell でいう型クラスを Scala で実現するため 
のもの
Haskell の型クラス 
class Ord a where 
(<=) :: a -> a -> Bool 
順序という概念を 
定義 
instance (Ord a, Ord b) => Ord (a, b) where 
(xa, xb) <= (ya, yb) = xa < xb || (xa == ya && xb <= yb) 
概念をペアについて 
実装したモデル
sort :: Ord a => [a] -> [a] 
> sort [ (3, 5), (2, 4), (3, 4) ] 
概念を前提とする 
関数を定義 
関数をこのように使用できるのは、 
ペアについて実装したモデルがあるため
Scala の暗黙パラメーターで 
trait Ord[T] { 
def compare (a:T, b:T):Boolean 
} 
順序という概念を 
implicit object intOrd extends Ord[Int] { 
def compare (a:Int, b:Int):Boolean = a <= b 
} 
定義 
概念を Int について 
実装したモデル
def sort[T](xs:List[T])(implicit ordT:Ord[T]):List[T] 
> sort (List (3, 2, 1)) 
List (1, 2, 3) 
概念を前提とする 
関数を定義 
関数をこのように使用できるのは、 
ペアについて実装したモデルがあるため
更に、暗黙型変換で 
trait Ordered[T] { 
def compare (o: T) : Boolean 
} 
implicit def mkOrd[T](x:T)(implicit ev: Ord[T]): Ordered[T] = 
new Ordered[T] { 
def compare(o: T) = ev.compare(x, o) 
} 
> 1.compare(2) 
true 
OOP的に書けるようになった!
implicit のルール 
? プレフィックスなしでアクセスできる、implicit 
な値 (もしくは変換) を探しにいく 
? 目的の型 (変換の場合は変換元と変換先) のコン 
パニオンオブジェクトのメンバーから、implicit 
な値 (もしくは変換) を探しにいく 
詳しくは、 http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html 参照
complete を 
もう一度見てみる
メソッド呼び出し 
complete("Hello.") メソッド定義 
trait RouteDirectives { 
… 
def complete: 
(? ToResponseMarshallable): StandardRoute 
… 
} 
ToResponseMarshallable 
という概念を String で実現したモデルが、どこ 
かにあるはず
object ToResponseMarshallable { 
implicit def isMarshallable[T](value: T)(implicit marshaller: 
ToResponseMarshaller[T]): ToResponseMarshallable 
… 
} 
ToResponseMarshaller という概念を 
String で実現したモデルが、どこかにあるはず
object ToResponseMarshaller extends BasicToResponseMarshallers 
with MetaToResponseMarshallers 
with LowPriorityToResponseMarshallerImplicits { 
def fromMarshaller[T] 
(status: StatusCode = StatusCodes.OK, 
headers: Seq[HttpHeader] = Nil) 
(implicit m: Marshaller[T]): ToResponseMarshaller[T] 
… 
} 
Marshaller という概念を String で実現した 
モデルが、どこかにあるはず
object Marshaller extends BasicMarshallers 
with MetaMarshallers 
with MultipartMarshallers { 
… 
} 
trait BasicMarshallers { 
… 
implicit val StringMarshaller: Marshaller[String] 
… 
} 
Marshaller という概念を String で実現した 
モデルが、ここにあった!
? 結局、Marshaller[String]があれば充分だった 
? 他にも様々な Marshaller が Spray に用意されて 
いる 
? 独自の型で complete を利用する場合は、有効な 
スコープやその型のコンパニオンオブジェクトに 
implicit な Marshaller[T] を定義すればよい
まとめ 
? AkkaベースのSprayはActorを使って非同期、ノン 
ブロッキングで動いている 
? Spray のルーティング定義は型安全かつ柔軟な 
DSL で書ける 
? それには Scala の implicit の仕組みを利用している 
? Scala の implicit は Haskell の型クラスに相当する
Scala も Haskell もその他の言語も 
一緒に勉強しましょう
今日はお話しできなかった事 
? 型安全で柔軟な Spray Routing の DSL には、他 
に Shapeless が一役買っている 
? C++ の Template Meta-Programming のような、 
コンパイル時における型レベルのプログラミング
See you 
soon!
参考情報 
? The Magnet Pattern (from spray blog) 
? Type Classes as Objects and Implicits (PDF) 
? Spray on Akka (Typesafe webinar on 
2013-11-19)
QA
Image Credits
Ad

Recommended

厂肠补濒补ノススメ
厂肠补濒补ノススメ
Yasuyuki Maeda
?
Phantom Type in Scala
Phantom Type in Scala
Yasuyuki Maeda
?
プログラミング贬补蝉办别濒濒(第1章)
プログラミング贬补蝉办别濒濒(第1章)
yaju88
?
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
aiya000
?
闯补惫补厂肠谤颈辫迟クイックスタート
闯补惫补厂肠谤颈辫迟クイックスタート
Shumpei Shiraishi
?
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎と クラス設計への応用
nagise
?
闯补惫补の骋别苍别谤颈肠蝉とは?
闯补惫补の骋别苍别谤颈肠蝉とは?
Kenji Nakamura
?
プログラミング贬补蝉办别濒濒(第2章)
プログラミング贬补蝉办别濒濒(第2章)
yaju88
?
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii
?
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
yo0824
?
厂肠补濒补东北绍介
厂肠补濒补东北绍介
Takeda Hiroyuki
?
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
nagise
?
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
Yuta Yokoi
?
厂肠补濒补プログラマのための贬补蝉办别濒濒入门
厂肠补濒补プログラマのための贬补蝉办别濒濒入门
Yasuaki Takebe
?
厂肠补濒补で萌える関数型プログラミング摆完全版闭
厂肠补濒补で萌える関数型プログラミング摆完全版闭
Ra Zon
?
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
?
厂肠补濒补プログラミング?マニアックス
厂肠补濒补プログラミング?マニアックス
Tomoharu ASAMI
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
guest5f4320
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
Takeda Hiroyuki
?
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
?
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
?
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
?
JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編
陽平 山口
?
厂肠补濒补でプログラムを作りました
厂肠补濒补でプログラムを作りました
Tomoharu ASAMI
?

More Related Content

What's hot (10)

プログラミング贬补蝉办别濒濒(第2章)
プログラミング贬补蝉办别濒濒(第2章)
yaju88
?
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii
?
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
yo0824
?
厂肠补濒补东北绍介
厂肠补濒补东北绍介
Takeda Hiroyuki
?
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
nagise
?
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
Yuta Yokoi
?
厂肠补濒补プログラマのための贬补蝉办别濒濒入门
厂肠补濒补プログラマのための贬补蝉办别濒濒入门
Yasuaki Takebe
?
厂肠补濒补で萌える関数型プログラミング摆完全版闭
厂肠补濒补で萌える関数型プログラミング摆完全版闭
Ra Zon
?
プログラミング贬补蝉办别濒濒(第2章)
プログラミング贬补蝉办别濒濒(第2章)
yaju88
?
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii
?
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
yo0824
?
厂肠补濒补东北绍介
厂肠补濒补东北绍介
Takeda Hiroyuki
?
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
nagise
?
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
Yuta Yokoi
?
厂肠补濒补プログラマのための贬补蝉办别濒濒入门
厂肠补濒补プログラマのための贬补蝉办别濒濒入门
Yasuaki Takebe
?
厂肠补濒补で萌える関数型プログラミング摆完全版闭
厂肠补濒补で萌える関数型プログラミング摆完全版闭
Ra Zon
?

Similar to Introduction to Spray at Kansai Functional Programming (20)

オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
?
厂肠补濒补プログラミング?マニアックス
厂肠补濒补プログラミング?マニアックス
Tomoharu ASAMI
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
guest5f4320
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
Takeda Hiroyuki
?
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
?
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
?
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
?
JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編
陽平 山口
?
厂肠补濒补でプログラムを作りました
厂肠补濒补でプログラムを作りました
Tomoharu ASAMI
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
Haskell で CLI
Haskell で CLI
Nobutada Matsubara
?
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
?
础辫别虫コアデベロッパーセミナー(础辫别虫コード)071010
础辫别虫コアデベロッパーセミナー(础辫别虫コード)071010
stomita
?
ざっくり DDD 入門!!
ざっくり DDD 入門!!
Yukei Wachi
?
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
Kent Ohashi
?
From Scala/Clojure to Kotlin
From Scala/Clojure to Kotlin
Kent Ohashi
?
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
?
厂肠补濒补プログラミング?マニアックス
厂肠补濒补プログラミング?マニアックス
Tomoharu ASAMI
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
guest5f4320
?
厂肠补濒补2.8への移行
厂肠补濒补2.8への移行
Takeda Hiroyuki
?
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
?
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
?
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
?
JAWSDAYS 2014 ACEに聞け! EMR編
JAWSDAYS 2014 ACEに聞け! EMR編
陽平 山口
?
厂肠补濒补でプログラムを作りました
厂肠补濒补でプログラムを作りました
Tomoharu ASAMI
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
?
础辫别虫コアデベロッパーセミナー(础辫别虫コード)071010
础辫别虫コアデベロッパーセミナー(础辫别虫コード)071010
stomita
?
ざっくり DDD 入門!!
ざっくり DDD 入門!!
Yukei Wachi
?
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
Kent Ohashi
?
From Scala/Clojure to Kotlin
From Scala/Clojure to Kotlin
Kent Ohashi
?
Ad

Introduction to Spray at Kansai Functional Programming