SlideShare a Scribd company logo
1 of 44
Download to read offline
プログラミング言語の
パラダイムシフト
Scalaから見る関数型と並列性時代の幕開け
安田裕介
concurrency
なぜ並列性なのか
ムーアの法則
http://spray.io/duse/#/2
トランジスタの数は1.5年ごとに倍になる
ムーアの法則
http://spray.io/duse/#/2
単一スレッドの
パフォーマンスは
限界に達した
今後は
コアが増える形で
トランジスタの集積率を
増やす形になる
トランジスタの数は1.5年ごとに倍になる
アムダールの法則
http://spray.io/duse/#/3
並列計算の分野において、複数のプロセッサを使ったときの
理論上の性能向上の限界を予測する法則
アムダールの法則
98.7%
75%
99.2%
80%の性能を出すのに
必要な並列度
96.4%
http://spray.io/duse/#/3
並列計算の分野において、複数のプロセッサを使ったときの
理論上の性能向上の限界を予測する法則
アムダールの法則
並列性の低い
プログラムは
コアが増えても
まったく速くならず、
リソースを無駄にする
並列性の高い
プログラムは
コアが増えるほど
速くなる
http://spray.io/duse/#/3
並列計算の分野において、複数のプロセッサを使ったときの
理論上の性能向上の限界を予測する法則
並列性の低いアプリケーションは
CPUを使い切れない
PHP + Apache
CPU: 32コア Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
ハードウェアの進化を
待っていれば
プログラムが速くなる
時代は終わった
時代は
並列分散プログラミングへ
並列分散処理言語
• Scala
• Erlang
• Haskell
• Elixir
• Rust
• (Go)
• (Pony) いずれもが関数型の性質をもつ
並列分散処理の技術
http://spray.io/duse/#/5
スレッド
http://spray.io/duse/#/5
スレッドは恐ろしい
http://docs.scala-lang.org/ja/overviews/core/futures.html
問題:
na *16と BATMAN の
aとAの合計totalAはいくつ?
スレッドは恐ろしい
http://docs.scala-lang.org/ja/overviews/core/futures.html
問題:
na *16と BATMAN の
aとAの合計totalAはいくつ?
A: 2 か 16 か 18
読み込みと書き込みに
原子性がないことと、
実行順序が不明なことが原因
スレッドの問題
• 原子性がない
• 順番の保証がない
• デッドロック、レースコンディション
• リソースとして貴重
• 排他制御、待ち合わせなど、コードが複雑になる
• デバッグが困難
Future
http://spray.io/duse/#/5
Future
• 非同期計算の結果のための統一インターフェースと
してのコレクション
• Scalaにおける並列実行の単位
• map, flatMapなどのモナドコンビネーターメソッ
ド搭載
"Future" must {

import scala.concurrent.ExecutionContext.Implicits.global


"map and flatMap" in {

val futureMessage = Future {

Thread.sleep(1000); 1

}.flatMap(value => Future {

Thread.sleep(1000); value + 1

}).map(s => s"This is a value of future after $s seconds")

Await.result(futureMessage, 5 seconds) must be("This is a value of future after 2 seconds")

}


"for comprehension" in {

val futureMessage = for {

s1 <- Future {

Thread.sleep(1000); 1

}

s2 <- Future {

Thread.sleep(1000); s1 + 1

}

} yield s"This is a value of future after $s2 seconds"

Await.result(futureMessage, 5 seconds) must be("This is a value of future after 2 seconds")

}

}
Future
並列に実行
並列に実行
並列に実行
forコンプリヘンション
並列に実行
並列に実行
ParallelCollection
http://spray.io/duse/#/5
• Scalaコレクションの並列版
• Scalaコレクションと同じAPIだが、内部実行は並
列
• parメソッドによりScalaコレクションから並列コ
レクションに透過的に変換できる
• Scalaコレクションと使いかたが同じなので簡単に
使える
ParallelCollection
ParallelCollection
"parallel collection" must {

"behave same as standard one" in {

val list = (0 to 9999).toList

list.map(_ + 1).filter(_ % 2 == 0).fold(0)(_ + _) must be

list.par.map(_ + 1).filter(_ % 2 == 0).fold(0)(_ + _)

}

}
通常のコレクション
並列コレクション
使い方まったく同じ
Actor
http://spray.io/duse/#/5
Actorとは
• 並列実行単位となるオブジェクト
Future: 関数 Actor: オブジェクト
並列実行単位
Actorは速い
http://spray.io/blog/2013-05-24-benchmarking-spray/
ActorベースのフレームワークSprayはJVM史上最速
Actorは効率的
• 4096スレッドで1Gbのメモリーを消費(linux x64)
• 2700000アクターで1Gbのメモリーを消費
Akka in Actionより
Actorは堅牢
• Erlangで作られたAXD301スイッチは
99.9999999% 可用性を実現
ReactiveManifesto
http://www.reactivemanifesto.org/
• 即応性 (Responsive)
• 耐障害性 (Resilient)
• 弾力性 (Elastic)
• メッセージ駆動 (Message Driven)
リアクティブなシステムを構築せよ
以降Akka actorを元に説明
Actor
Actor
Actorの機能概観
1.SEND
2.CREATE
4.BECOME
3.SUPERVISE
振る舞いを変える
複製する
監視する
メッセージを
送る
Actor の仕組み
mailbox
thread pool
partial function
message
event loop
thread
Actorはスレッドの問題を解決
する
• 原子性:アクター内部の処理は並列ではなく順次実行されるので、
通常のプログラミングと同じ
• 実行順序:アクター内部の処理は並列ではなく順次実行されるので、
通常のプログラミングと同じ
• カプセル化:他のスレッドからアクター内はアクセスできない
• 安全性:アクターはブロックしないので、デッドロックはおきない
• リソース効率性:スレッドプールから論理スレッドが確保できたと
きだけ、メッセージが処理される
Actorによる並列プログラミング
class CountAActor extends Actor {

var totalA = 0


def receive: Receive = {

case "How many?" => sender ! totalA

case text: String => totalA += text.toUpperCase().count(_ == 'A')

}

}



object CountAActor {

def props = Props(new CountAActor)

}
class SampleTest extends TestKit(ActorSystem("SampleSystem", ConfigFactory.empty()))

with WordSpecLike with MustMatchers with ImplicitSender with StopSystemAfterAll {



"CountAActor" must {

"count A and a" in {

val countAActor = system.actorOf(CountAActor.props, "countAActor")

countAActor ! "na" * 16

countAActor ! "BATMAN!"

countAActor ! "How many?"

expectMsg(18)

}

}

}
非同期にメッセージを送る
必ず18になる
Actor内部は順次実行されるので、
安全に状態を更新できる
(直ちに処理されるのではなくmailboxに貯まる)
内部状態は絶対に外から見えないので、
他のスレッドから守られている
SEND:メッセージの送信
• メッセージの送信は、非同期でブロックしない
• メッセージの送信先はアクター参照(ActorRef)で
あり、アクターインスタンスではない
• アクターインスタンスを直接取得する方法はなく、
外部から完全に守られている
• アクター参照は実際の送信先を抽象化する(位置透
過性)
位置透過性
LocationTransparency
• アクターのインスタンスが物理的にどこに存在しよ
うが、同じようにメッセージを送れる
doc.akka.io
• 同じプロセス
• 別のプロセス
• 別のネットワーク上のサーバー
CREATE:複製
• アクターは簡単に複製できる
• アクターは気軽にどんどん作ろう
• アクターはスケール簡単にスケールする
Props:アクターの設計図
class CountAActor extends Actor {

var totalA = 0

def receive: Receive = {

case "How many?" => sender ! totalA

case text: String => totalA += text.toUpperCase().count(_ == 'A')

}

}



object CountAActor {

def props = Props(new CountAActor)

}



class SampleTest extends TestKit(ActorSystem("SampleSystem", ConfigFactory.empty()))

with WordSpecLike with MustMatchers with ImplicitSender with StopSystemAfterAll {



"CountAActor" must {

"count A and a in parallel" in {

implicit val dispatcher = system.dispatcher

implicit val timeout = Timeout(5 seconds)

import akka.pattern.ask

val countAActor1 = system.actorOf(CountAActor.props, "countAActor1")

val countAActor2 = system.actorOf(CountAActor.props, “countAActor2")


countAActor1 ! "na" * 16

countAActor2 ! “BATMAN!"


val futures = Seq(countAActor1, countAActor2).map(_ ? "How many?").map(_.mapTo[Int])

val result = Future.sequence(futures).map(_.reduce(_ + _))

Await.result(result, 5 seconds) must be(18)

}

}

}
再現可能なインスタンスを作るためのProps
Propsからアクターを2つ作成
2つのアクターにメッセージを送る
2つのアクターの計算結果を集計する
Router:負荷分散
trait RouterCreator {

def createRouter = SmallestMailboxPool(100).props(CountAActor.props)

}



class CountARouter extends Actor with RouterCreator {

val countARouter = context.actorOf(createRouter)

def receive: Receive = {

case hm@"How many?" => {

val reducer = context.actorOf(Reducer.props(sender(), 100))

countARouter.tell(Broadcast(hm), reducer)

}

case msg => countARouter forward msg

}

}



object CountARouter {

def props = Props(new CountARouter)

}



class Reducer(sendTo: ActorRef, maxCount: Int) extends Actor {

var total = 0; var count = 0

def receive: Receive = {

case sum: Int => {

total += sum; count += 1

if (count == maxCount) {

sendTo ! total

self ! PoisonPill

}

}

}

}



object Reducer {

def props(sendTo: ActorRef, maxCount: Int) = Props(new Reducer(sendTo, maxCount))

}
100個のアクターに分散する
ルーター
ルーターにメッセージを送る
最終的な結果を集計するアクター
すべてのルーティーに集計メッセージを送る
Router
class SampleTest extends TestKit(ActorSystem("SampleSystem", ConfigFactory.empty()))

with WordSpecLike with MustMatchers with ImplicitSender with StopSystemAfterAll {



"Router" must {

"route messages" in {

val router = system.actorOf(CountARouter.props, "CountARouter")

Stream.fill(10000)("BATMAN!").foreach(router ! _)

router ! "How many?"

expectMsg(10000 * 2)

}

}

}
10000個のメッセージを送る
集計
ルーターは100個のアクターに分散する
RemoteRouter
複数のサーバー上のアクターに分散する
http://doc.akka.io/docs/akka/snapshot/dev/multi-jvm-testing.html
sbt-multijvm-pluginを使ったmulti-jvmテストのデモ
位置透過性により、
送る先のアクターがどこにあってもよい
同じようにActorRefに対してメッセージを送るだけ
SUPERVISE:監視する
• 障害を起こさないように設計するのではなく、障害がおき
てもいいように設計する Let it crash モデルを採用
• アクターは親子構造のヒエラルキーを作る
• 親が子の監視者となり、子の障害に対処する
• 階層をできるだけ深くして、障害の影響範囲を小さくする
• 状態がおかしくなってクラッシュしたアクターは再起動さ
れる(デフォルトの設定)
Let it crash!
アクターの再起動
親アクター
子アクター
1. 障害発生
親アクター
子アクター
2. 子アクターが停止
親アクター
子アクター子アクター
親アクター
子アクター
3. 子アクターを
再生成して
入れ替え
4. 新しい子アクター
インスタンスで
処理再開
(mailboxは保持)
class CrashActor extends Actor with ActorLogging {

def receive: Receive = {

case "Crash!!!" => throw new Exception("crashed!")

}

override def preStart() {

log.info("preStart")

}

override def preRestart(reason: Throwable, message: Option[Any]) = {

log.info("preRestart")

super.preRestart(reason, message)

}

override def postRestart(reason: Throwable) {

log.info("postRestart")

super.postRestart(reason)

}

override def postStop() {

log.info("postStop")

}

}



object CrashActor {

def props = Props(new CrashActor)

}



class Supervisor extends Actor {

val crashActor = context.actorOf(CrashActor.props)



def receive: Receive = {

case msg => crashActor forward msg

}

}



object Supervisor {

def props = Props(new Supervisor)

}



class SampleTest extends TestKit(ActorSystem("SampleSystem", ConfigFactory.empty()))

with WordSpecLike with MustMatchers with ImplicitSender with StopSystemAfterAll {



"Supervisor" must {

"crush CrashActor" in {

val supervisor = system.actorOf(Supervisor.props, "supervisor")

supervisor ! "Crash!!!"

Thread.sleep(1000)

}

}
クラッシュするメッセージを
受けるアクター
CrashActorを子に持つ監視アクター
クラッシュさせる
アクターの
ライフサイクルフックメソッド
再起動してる
まとめ
• 今後CPUの進化はマルチコア化が駆動
• CPUを使い尽くすために、並列分散プログラミングが必
要
• 並列分散プログラミングは難しい
• 抽象度・一般性のトレードオフの中で、並列処理のハー
ドルを下げる様々な概念がある
• Future, Parallel Collection, Actor

More Related Content

What's hot

あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascriptRyuma Tsukano
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idiomsfimbul
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream APIdcomsolution
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Languagey_taka_23
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLispKent Ohashi
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4Shingo Inoue
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオンHiroto Yamakawa
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Toshio Ehara
 

What's hot (20)

あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascript
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
Perfect python section5
Perfect python section5Perfect python section5
Perfect python section5
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idioms
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4
 
Functional Way
Functional WayFunctional Way
Functional Way
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
 

Viewers also liked

MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」
MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」
MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」moterech
 
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twittermaruyama097
 
Tues. Dec. 20th Pine River Announcements
Tues. Dec. 20th Pine River Announcements  Tues. Dec. 20th Pine River Announcements
Tues. Dec. 20th Pine River Announcements Pine River
 
FPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchFPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchYutaka Yasuda
 
mruby を C# に 組み込んでみる
mruby を C# に 組み込んでみるmruby を C# に 組み込んでみる
mruby を C# に 組み込んでみるRyosuke Akiyama
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界Yoshinori Nakanishi
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
企業システムにアジャイルは必要か
企業システムにアジャイルは必要か企業システムにアジャイルは必要か
企業システムにアジャイルは必要かHiromasa Oka
 
インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由axsh co., LTD.
 
Simple perceptron by TJO
Simple perceptron by TJOSimple perceptron by TJO
Simple perceptron by TJOTakashi J OZAKI
 
Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Takuya ASADA
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Ken Morishita
 
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜Mikiya Okuno
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書くmametter
 
機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual TalksYuya Unno
 
Shall we play a game?
Shall we play a game?Shall we play a game?
Shall we play a game?Maciej Lasyk
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging ChallengesAaron Irizarry
 
エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理maruyama097
 
未来につながる言語
未来につながる言語未来につながる言語
未来につながる言語yukihiro_matz
 
ゲ−ム部合同ジャム@東ゲ部 Unityチーム
ゲ−ム部合同ジャム@東ゲ部 Unityチームゲ−ム部合同ジャム@東ゲ部 Unityチーム
ゲ−ム部合同ジャム@東ゲ部 UnityチームYuuki Ogino
 

Viewers also liked (20)

MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」
MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」
MLaPP 24章 「マルコフ連鎖モンテカルロ法 (MCMC) による推論」
 
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter
 
Tues. Dec. 20th Pine River Announcements
Tues. Dec. 20th Pine River Announcements  Tues. Dec. 20th Pine River Announcements
Tues. Dec. 20th Pine River Announcements
 
FPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchFPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow Switch
 
mruby を C# に 組み込んでみる
mruby を C# に 組み込んでみるmruby を C# に 組み込んでみる
mruby を C# に 組み込んでみる
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
企業システムにアジャイルは必要か
企業システムにアジャイルは必要か企業システムにアジャイルは必要か
企業システムにアジャイルは必要か
 
インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由
 
Simple perceptron by TJO
Simple perceptron by TJOSimple perceptron by TJO
Simple perceptron by TJO
 
Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識
 
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks
 
Shall we play a game?
Shall we play a game?Shall we play a game?
Shall we play a game?
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
 
エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理
 
未来につながる言語
未来につながる言語未来につながる言語
未来につながる言語
 
ゲ−ム部合同ジャム@東ゲ部 Unityチーム
ゲ−ム部合同ジャム@東ゲ部 Unityチームゲ−ム部合同ジャム@東ゲ部 Unityチーム
ゲ−ム部合同ジャム@東ゲ部 Unityチーム
 

Similar to プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー

機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価Shintaro Fukushima
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語ScalaTanUkkii
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”するde:code 2017
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 

Similar to プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー (20)

Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
20180728 halide-study
20180728 halide-study20180728 halide-study
20180728 halide-study
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
ALPSチュートリアル(3) アプリケーション実習
ALPSチュートリアル(3) アプリケーション実習ALPSチュートリアル(3) アプリケーション実習
ALPSチュートリアル(3) アプリケーション実習
 
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 

More from TanUkkii

Distributed ID generator in ChatWork
Distributed ID generator in ChatWorkDistributed ID generator in ChatWork
Distributed ID generator in ChatWorkTanUkkii
 
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...TanUkkii
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on ScalaTanUkkii
 
Akka Clusterの耐障害設計
Akka Clusterの耐障害設計Akka Clusterの耐障害設計
Akka Clusterの耐障害設計TanUkkii
 
スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成TanUkkii
 
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何かすべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何かTanUkkii
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門TanUkkii
 
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けーTanUkkii
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングTanUkkii
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6TanUkkii
 

More from TanUkkii (15)

Distributed ID generator in ChatWork
Distributed ID generator in ChatWorkDistributed ID generator in ChatWork
Distributed ID generator in ChatWork
 
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
 
JSON CRDT
JSON CRDTJSON CRDT
JSON CRDT
 
Akka Clusterの耐障害設計
Akka Clusterの耐障害設計Akka Clusterの耐障害設計
Akka Clusterの耐障害設計
 
WaveNet
WaveNetWaveNet
WaveNet
 
スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成
 
Akka HTTP
Akka HTTPAkka HTTP
Akka HTTP
 
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何かすべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門
 
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
 

プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー