SlideShare a Scribd company logo
1 of 81
Download to read offline
ScalaMatsuri 2016
なぜリアクティブは重要か
岡本 雄太 (@okapies)
2016/01/30
https://www.flickr.com/photos/livenature/204420128
自己紹介
• 岡本 雄太(@okapies)
• 製造業で働くソフト屋さん
• Scala と Scala OSSs 愛好家
• 最近の仕事はインフラエンジニアっぽい感じ
• ScalaMatsuri 2016 準備委員会 運営委員
公開してる OSS
• finagle-kafka (https://github.com/okapies/
finagle-kafka)
• sircuit (https://github.com/okapies/sircuit)
• rx-process (https://github.com/okapies/rx-
process)
書き物
• 翻訳:
• リアクティブ宣言 v2.0
• Effective Scala 日本語版
• 命令型のコールバック、関数型のプロミス
• ブログ記事 (http://okapies.hateblo.jp/):
• 非同期ストリーム処理の標準化を目指す "Reactive Streams" とは
• 関数型プログラマのための Rx 入門
• マイクロサービスが Scala を選ぶ3つの理由
関連するセッション
• 12:00 - 12:40(国際交流会議場):
• リアクティブ・マイクロサービス (Christopher
Hunt)
• 15:00 - 15:40(メディアホール):
• レジリエンスが無ければ、他は無いも同じ (Jonas
Bonér)
今日のソフト開発が直面する課題
• 非同期&イベント駆動プログラミング
• 並行・並列処理
• システムと組織のスケーラビリティ
• 耐障害性
(マイクロサービス)
どこでもリアクティブ!
• フロントエンドからバックエンドまで、様々な
文脈で〈リアクティブ〉がキーワードに
• 互いに似ているけど異なる様々なコンセプト:
• Reactive Programming
• Reactive Streams
• Reactive Manifesto
フロントエンド GUI
マルチクリックストリーム
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
250 ミリ秒毎に

クリックを集積
リストを長さ

にマッピング
RxJS による非同期クリックストリーム
GUI とネットワークサービス
https://github.com/reark/reark
RxJava + Android

製のデモアプリ
非同期 GUI イベント

と JSON API 呼び出

しを並行処理として

組み合わせる
マイクロサービス
val userAndTweets = Future.join(	
userService.findByUserId(userId),	
tweetService.findByUserId(userId)	
)
find
find
userId userAndTweets
User

Service
Tweet

Service
http://www.slideshare.net/knoldus/finagle-by-twitter-engineer/16
join
他のマイクロサービスへクエリ
を投げ、全ての応答が ったら
非同期に集約してタプルにする
Twitter Finagle
ビッグデータ処理
https://speakerdeck.com/googlecloudjapan/google-cloud-dataflowwoli-jie-suru
ビッグデータの分散並列処理
Google Cloud Dataflow
Reactive Streams が JDK 9 に
Reactive?
リアクティブ ⃝⃝


プログラミングモデル?
!
ランタイムエンジン?
!
アーキテクチャ?
=
文脈によってかなり意味付けが異なるのが実情
リアクティブの基盤
• リアクティブなコンポーネント
!
• リアクティブなデータフロー
in out
1
2
A
B C
リアクティブなコンポーネント
• 入力にのみ反応 (react) してデータを出力する
• 自己完結性
in out
関数?
オブジェクト?
アクター?
サブシステム?
リアクティブなデータフロー
Source
Source Sink
in out
コンポーネントの入力と
出力を結びつけてデータ
を運搬するパイプライン
リアクティブ ⃝⃝


プログラミングモデル
!
ランタイムエンジン
!
アーキテクチャ
=
vs
vs
課題(再掲)
• 非同期&イベント駆動プログラミング
• 並行・並列処理
• システムと組織のスケーラビリティ
• 耐障害性
コールバックじゃダメなの?
// asynchronous event	
def mouseClick(f: (Int, Int) => Unit): Unit	
!
// register a callback as an argument	
mouseClick { case (x, y) => println(s"x: $x, y: $y”) }
コールバック
コールバック地獄
• コードのモジュール化が困難
• 状態(副作用)やデータの依存関係の管理が
困難
• 実行順序の制御が困難(外部イベント次第で
変化する)
破滅のピラミッド
var g = ...	
!
step1 { a =>	
step2 { b =>	
step3 { c =>	
step4 { d =>	
// do something with a, b, c, d and g	
}	
}	
}	
}
依存する非同期ステップが

ピラミッドのように積み上がる
外側のスコープの状態を暗黙に

参照していてモジュール性が低い
リアクティブなコンポーネント
• データフローから非同期イベントが入力され
たときだけ反応する
in out
自己完結性
• 各コンポーネントの内部状態は互いに隔離さ
れ、かつ独立したライフサイクルを持つ
• 自己完結性があると非同期処理がやりやすい
? ?
in out
× ×外側の変数を

暗黙に使わない
利点
• モジュール性(組み合わせ可能性)が向上
• 状態や障害の封じ込めが容易になる
? ?
in out
× ×
実行順序と依存性
• 非同期プログラミングで実行順序をどうやっ
て制御すればいいか?
• 解決策: リアクティブ・プログラミング
http://en.wikipedia.org/wiki/Reactive_programming
〈データフロー〉と〈変更の伝播〉を指向するパラダイム
データフロー
g1
g2
h
Source
Source Sink
f
in out
演算の間を流れるデータ
の有向グラフ
一般的な (命令型の) プログラム
A = 1;	
B = 2;	
C = (A+1) + (B-1)*2;
上から順に実行する
-1
×2
+
+1A
B C
命令型コードをデータフローに
A = 1;	
B = 2;	
C = (A+1) + (B-1)*2;
1
2 4
1 2
2
実行モデル
• データフローそのものは、変数と演算の間の
依存関係を記述しているだけ
• グラフの具体的な計算方法は実行モデルが決
める
A
B C
+1
—1
×2
+
A = 1;	
B = 2;	
C = (A+1) + (B-1)*2;
-1
×2
+
+1A
B C
変数への再代入
A = 1; B = 2;	
C = (A+1) + (B-1)*2;

A = 2;
1 $ 2
2 4
A の変更は

C に伝搬しない
命令型の実行モデル
×
×
××
× ×
-1
×2
+
+1A
B C
変数への再代入
A := 1; B := 2;

C := (A+1) + (B-1)*2;

A := 2;
1 $ 2
4 $ 52
1 $ 3
1 2
A の変更が

C に伝搬する
リアクティブの実行モデル
-1
×2
+
+1A
B C
変数への再代入
2
5 $ 72 $ 3
1 $ 2 2 $ 4
3
C := (A+1) + (B-1)*2;

A := 2;	
B := 3;
リアクティブの実行モデル
B の変更が

C に伝搬する
-1
×2
+
+1A
B C
変数への再代入
2 $ 0
7 $ 53
2 4
3 $ 1
A := 2;

B := 3;

A := 0;
リアクティブの実行モデル
A の変更が

C に伝搬する
リアクティブプログラミング
!
!
関数型
リアクティブプログラミング
(FRP)
≒
一般に〈リアクティブプログラミング〉というと
〈関数型∼〉(FRP) を指すことが多い
例 (Akka Streams):
implicit val system = ActorSystem()	
implicit val mat = ActorMaterializer()	
!
val a = Source(...)	
val b = Source(...)	
!
val a1 = a.map(_ + 1)	
val b1 = b.map(_ - 1).map(_ * 2)	
!
val c = (a1 zip b1).map{case (a, b) => a + b}	
!
c.runWith(Sink.foreach(println))(mat)
A
B C
+1
—1
×2
+
先ほどのデータフローを

関数型 DSL で記述する
例 (Akka Streams):
implicit val system = ActorSystem()	
implicit val mat = ActorMaterializer()	
!
val a = Source(...)	
val b = Source(...)	
!
val a1 = a.map(_ + 1)	
val b1 = b.map(_ - 1).map(_ * 2)	
!
val c = (a1 zip b1).map{case (a, b) => a + b}	
!
c.runWith(Sink.foreach(println))(mat)
入力に適用する関数を

高階関数 map で繋ぎ合わせる
関数
入力
A
B C
+1
—1
×2
+
関数型とリアクティブの関係
• なぜリアクティブ・プログラミングには関数
型プログラミングが適しているのか?
• この疑問に答えるには「なぜ関数プログラミ
ングは重要か」を知る必要がある
なぜ関数プログラミングは重要か
• QuickCheck の開発や QuviQ の創業者として
知られるジョン・ヒューズ博士の著名な論文
• 初版は 1984 年(30 年前!)
• 関数型プログラミングを活用して、コードの
モジュール性を高める方法について論じてい
る
http://www.cse.chalmers.se/~rjmh/Papers/whyfp.html
関数型の〈糊〉
• 関数型における二つの重要な〈糊〉
• 遅延評価
• 高階関数(コンビネータ)
「元の問題を分割する方法は、解と解を貼り合
わせる方法に直接に依存する。」
遅延評価
class Cons[A](hd: A, tl: => List[A]) extends List[A]	
!
def nats(n: Int): List[Int] = new Cons(n, nats(n+1))	
def fizzbuzz(n: Int) = n match {	
case _ if n % 15 == 0 => "FizzBuzz"	
case _ if n % 3 == 0 => "Fizz"	
case _ if n % 5 == 0 => "Buzz"	
case _ => n.toString	
}	
nats.map(fizzbuzz).take(100).foreach(println)
必要呼び
(プル型)
コードを生成器と選択器の
組み合わせでモジュール化できる
無限リスト
高階関数
• プログラムを、汎用的な高階関数とユースケー
スに特化した関数に分けてモジュール化
!
!
• ビジネスロジックと、それが乗っかるデータ
型の文脈を分離できる
set. map(_ + 1) // Set[A]	
map. map(_ + 1) // Map[A, B]	
list.map(_ + 1) // List[A]
局所化された文脈 ビジネスロジックを使い回せる
FP の糊を RP に適用すると?
• 遅延評価:
• 非同期イベントを少しずつ処理する生成器・選
択器のパイプラインとしてプログラムを構成す
る(プッシュ型)
• 高階関数:
• ビジネスロジックと、それが乗っかる非同期イ
ベント駆動の文脈を分離する
FRP の〈糊〉
implicit val system = ActorSystem()	
implicit val mat = ActorMaterializer()	
!
val a = Source(...)	
val b = Source(...)	
!
val a1 = a.map(_ + 1)	
val b1 = b.map(_ - 1).map(_ * 2)	
!
val c = (a1 zip b1).map{case (a, b) => a + b}	
!
c.runWith(Sink.foreach(println))
A
B C
+1
—1
×2
+
生成器
非同期の文脈を局所化した高階関数 (map, zip 等)を使い、
ビジネスロジックをパイプライン化する
選択器
局所化された非同期の文脈
• 多くの FRP のデータフロー記述は宣言型 DSL:
構築したデータフローを実際にスケジュールし
実行するのはランタイムの役割
what と how の分離
implicit val system = ActorSystem()	
implicit val mat = ActorMaterializer()	
!
val c = (a1 zip b1).map{case (a, b) => a + b}	
!
c.runWith(Sink.foreach(println))(mat) ランタイム
what と how の分離
Input
Input
Output(2) ランタイム
(1) プログラミングモデル (DSL)
(how を実行する = 変更の伝搬)
(what を記述する = データフロー)
リアクティブ ⃝⃝


プログラミングモデル
!
ランタイムエンジン
!
アーキテクチャ
=
vs
vs
リアクティブなプログラミングモデルとランタイムには
密接な関係がある
可搬性(マルチプラットフォーム)
• リアクティブなプログラムは、ランタイムによっ
て様々なアーキテクチャにマッピングできる
• 単一マシン
• GPU クラスタ
• 分散環境
最適化
• データフローの性能や安定性をランタイムが
最適化できる
• 融合、データ局所化、キャッシュ
• 並列分散化
• 検証
例: 融合 (Fusing)
• Akka Streams 2.0 の新機能
This new abstraction … is called fusing. This feature
… will be now possible to execute multiple stream
processing steps inside one actor, reducing the
number of thread-hops where they are not
necessary … will increase performance for various
use cases, including HTTP.
http://akka.io/news/2015/11/05/akka-streams-2.0-M1-released.html
複数の処理ステップを

一つにまとめて性能向上
実装例
• データフロー DSL とランタイムの組み合わせは、近
年、様々な分野で適用されている
• Akka Streams, ReactiveX, …
• 科学技術計算: TensorFlow, Halide
• ビッグデータ処理: Spark, Google Cloud Dataflow,
Asakusa Framework, Gearpump
例: TensorFlow
http://download.tensorflow.org/paper/whitepaper2015.pdf
課題(再掲)
• 非同期&イベント駆動プログラミング
• 並行・並列処理
• システムと組織のスケーラビリティ
• 耐障害性
DO
NE!
リアクティブ ⃝⃝


プログラミングモデル
!
ランタイムエンジン
!
アーキテクチャ
=
vs
vs
単一マシン
!
!
分散システム
なぜ分散システムか?
• 非同期&イベント駆動プログラミング
• 並行・並列処理
• システムと組織のスケーラビリティ
• 耐障害性
→ リアクティブ・システム
(マイクロサービス)
http://www.reactivemanifesto.org/ja
アプリケーションの要求の変化
数年前 現在
Configuration 数十のサーバ
数千の

マルチコアプロセッサ
Response

time
秒単位 ミリ秒単位
Availability
数時間の

オフラインメンテナンス
稼働率 100%
Data size ギガバイト単位 ペタバイト単位
システムの構築方法の変化
“大規模システムを構築する組織は

この変化に対処する設計原則を

すでに発見している”







“そのような特徴を備えるシステムを

Reactive Systems と呼ぼう”
http://www.reactivemanifesto.org/ja
リアクティブシステムの性質
リアクティブシステムの四つの特徴:
即応性、弾力性、レジリエンス、メッセージ駆動
http://www.slideshare.net/Typesafe_Inc/going-reactive-2016-data-preview/6
リアクティブシステムの性質
実現したい価値:

ユーザへ迅速かつ一貫した

速度でサービスを提供する
障害時にも

即応性を維持する
非同期メッセージパッシングが
全ての基盤である
負荷が変動しても

即応性を維持する
http://www.slideshare.net/Typesafe_Inc/going-reactive-2016-data-preview/6
RS におけるコンポーネント
• メッセージのみを介して互いに通信する
• 自己完結しており非同期(バイナリ)境界で
互いに隔離されている
アクター
サブシステム
in out
メッセージ駆動が達成するもの
• 弾力性: スケーラビリティ、シャーディング、
レプリケーション、位置透過性
• レジリエンス: レプリケーション、隔離、タス
クやエラーの委譲 (“Let it crash”)
リアクティブシステムをどう構築するか?
マニフェストの中で、その実現方法について規範的なことは述
べたくなかった。 — Martin Thompson
• マニフェストは、リアクティブなコンポーネントやシス
テムの性質や品質についてのみ記述しており、具体的な
実現方法には触れていない
• 実例としてマイクロサービス・アーキテクチャ (MSA) を
見てみよう
http://www.infoq.com/news/2014/10/thompson-reactive-manifesto-2
マイクロサービス・アーキテクチャ
• Amazon, Netflix, Twitter のような巨大な開発
組織をスケールさせるための方法論
• サービスを、ビジネス遂行能力に沿って小さく
独立したモジュールに分ける(c.f. コンウェイ
の法則)
• リアクティブシステムの実例の一つとみなせる
STORAGE &
RETRIEVAL
LOGICPRESENTATIONROUTING
Redis
Memcache
Flock
T-Bird
MySQLTweet
User
Timeline
Social
Graph
DMs
API
Web
Monorail
TFE
HTTP Thrift “Stuff”
http://monkey.org/~marius/scala2015.pdf
例: Twitter における
マイクロサービス
システムレベルのデータフロー
• MSA は(リアクティブな)コンポーネント
と、そのビジネス上の依存関係で構成される
• つまりシステムレベルのデータフロー
• ならば、分散システム全体をコードとして記
述できないだろうか?
A
B C
リアクティブ・ビッグデータ
• 近年のビッグデータ処理フレームワークでは、リア
クティブなアーキテクチャが採用されることが多い
• Spark
• Google Cloud Dataflow
• Gearpump (Intel)
• Asakusa Framework
https://speakerdeck.com/googlecloudjapan/google-cloud-dataflowwoli-jie-suru
DAG でデータ処理

パイプラインを記述
in Google Cloud Dataflow
DAG on Spark
https://cloud.githubusercontent.com/assets/2133137/7625997/e0878f8c-f9b4-11e4-8df3-7dd611b13c87.png
実行中の Spark ジョブを DAG として可視化した例
http://www.gearpump.io/overview.html
Gearpump の Akka を

使ったリアクティブ・

アーキテクチャ
http://knowledge.sakura.ad.jp/tech/4016/
http://docs.asakusafw.com/preview/ja/html/asakusa-on-spark/user-guide.html
Asakusa Framework
一つの DSL アプリを
Hadoop でも Spark でも

ポータブルに実行できる
Apache Dataflow (New!)
http://googlecloudplatform.blogspot.co.uk/2016/01/Dataflow-and-open-source-proposal-to-join-the-Apache-Incubator.html
Google 主導によるデータフロー記述の標準化の取り組み
https://speakerdeck.com/googlecloudjapan/google-cloud-dataflowwoli-jie-suru
ランタイムとしての
Google Cloud
Optimize
Schedule
Flow of pipeline
User code & SDK Monitoring UI
データフロー定義
データフロー・ランタイムとしての Google クラウドが
データフローの最適化とタスクのスケジュールを行う
一般化すると…
ビッグデータにおけるリアクティブ・システムの
アーキテクチャを一般化してみる
Dataflow
Reactive System
Cloud-level Runtime
一般化すると…
• クラウドレベルのランタイムは:
• 指定されたデータフローを最適化すると共に、リアク
ティブなコンポーネントをスケジューリングする
• YARN や      のような分散リソースマネージャ
からリソースを獲得する
• 確保したリソースにコンポーネントを配備し、リアク
ティブ・システムとして実行する
Dataflow
Reactive System
Cloud-level Runtime
ウェブサービスの配備自動化
• 現代の DevOps ツールは、主にノードごとにシ
ステムを設定することに焦点を当てており、
Dockerfile のような命令的な記述を用いている
• イミュータブル・インフラストラクチャは、本
来、リアクティブなコンポーネントと宣言的な
データフローの組み合わせとして実現されるべ
きだったのでは?
まとめ
• リアクティブ・プログラミングとアーキテクチャによっ
て、今日のソフト開発が直面する課題を解決できる:
• 非同期&イベント駆動プログラミング
• 並行・並列処理
• システムと組織のスケーラビリティ
• 耐障害性
まとめ
• リアクティブなコンポーネントとデータフロー
は、システムのあらゆる階層において非同期
と分散の課題に対処する際に有効なツール
• プログラミングモデルよりもランタイムが提
供する能力(性能、耐障害性、運用性)が重
要な時代が到来しつつある

More Related Content

What's hot

DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
スクラムの知られざる勘所
スクラムの知られざる勘所スクラムの知られざる勘所
スクラムの知られざる勘所Yoshifumi Tsuda
 
ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてKota Mizushima
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割Recruit Lifestyle Co., Ltd.
 
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界Y Watanabe
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 FallYoshitaka Kawashima
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
Clojureに入門してみた、2017年秋
Clojureに入門してみた、2017年秋Clojureに入門してみた、2017年秋
Clojureに入門してみた、2017年秋Satoshi KOBAYASHI
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 

What's hot (20)

DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
Guide To AGPL
Guide To AGPLGuide To AGPL
Guide To AGPL
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
スクラムの知られざる勘所
スクラムの知られざる勘所スクラムの知られざる勘所
スクラムの知られざる勘所
 
ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修について
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
 
スキルチェックリスト 2017年版
スキルチェックリスト 2017年版スキルチェックリスト 2017年版
スキルチェックリスト 2017年版
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
Clojureに入門してみた、2017年秋
Clojureに入門してみた、2017年秋Clojureに入門してみた、2017年秋
Clojureに入門してみた、2017年秋
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 

Viewers also liked

UniRxでPUNを使いやすくする
UniRxでPUNを使いやすくするUniRxでPUNを使いやすくする
UniRxでPUNを使いやすくするtorisoup
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術Unity Technologies Japan K.K.
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法Yoshifumi Kawai
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityYoshifumi Kawai
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#Yoshifumi Kawai
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 

Viewers also liked (6)

UniRxでPUNを使いやすくする
UniRxでPUNを使いやすくするUniRxでPUNを使いやすくする
UniRxでPUNを使いやすくする
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 

Similar to なぜリアクティブは重要か #ScalaMatsuri

Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説Katsunori Kanda
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料Recruit Technologies
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何かTakashi Hoshino
 
Silkによる並列分散ワークフロープログラミング
Silkによる並列分散ワークフロープログラミングSilkによる並列分散ワークフロープログラミング
Silkによる並列分散ワークフロープログラミングTaro L. Saito
 
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3Toshiaki Maki
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesTakeshi Komiya
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例Shigeru UCHIYAMA
 
A Road map of Data Analysis for Visualization with D3.js
A Road map of Data Analysis for Visualization with D3.jsA Road map of Data Analysis for Visualization with D3.js
A Road map of Data Analysis for Visualization with D3.js博三 太田
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 

Similar to なぜリアクティブは重要か #ScalaMatsuri (20)

Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何か
 
Silkによる並列分散ワークフロープログラミング
Silkによる並列分散ワークフロープログラミングSilkによる並列分散ワークフロープログラミング
Silkによる並列分散ワークフロープログラミング
 
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
A Road map of Data Analysis for Visualization with D3.js
A Road map of Data Analysis for Visualization with D3.jsA Road map of Data Analysis for Visualization with D3.js
A Road map of Data Analysis for Visualization with D3.js
 
Lisp講義1
Lisp講義1Lisp講義1
Lisp講義1
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 

なぜリアクティブは重要か #ScalaMatsuri