SlideShare a Scribd company logo
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

Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
Rui Watanabe
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
Kouji YAMADA
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話
Yusuke Hisatsu
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
Recruit Lifestyle Co., Ltd.
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
日本マイクロソフト株式会社
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
 
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
Akira Inoue
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
Kota Saito
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 

What's hot (20)

Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 

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 Unity
Yoshifumi 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 #ScalaMatsuri
Yuta Okamoto
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
Tomoharu ASAMI
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
kyoto 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_l8
y_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_ef3
Toshiaki 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
博三 太田
 
Lisp講義1
Lisp講義1Lisp講義1
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
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