Movatterモバイル変換


[0]ホーム

URL:


Tomoharu ASAMI, profile picture
Uploaded byTomoharu ASAMI
PDF, PPTX5,806 views

Scalaz-StreamによるFunctional Reactive Programming

「Reactive System Meetup in 西新宿」資料です。http://reactive-shinjuku.connpass.com/event/17991/

Embed presentation

Download as PDF, PPTX
scalaz-streamによる!Functional ReactieProgramming2015年年8⽉月18⽇日Everforth浅海智晴
自己紹介•  1985年年富⼠士通(株)⼊入社•  UNIXワークステーション/サーバーのOS、分散基盤、Web基盤の開発に従事•  2001年年9⽉月に独⽴立立•  Java, XML, UMLを中⼼心に活動•  2005年年4⽉月より2007年年3⽉月まで•  稚内北北星学園⼤大学東京サテライト校教授•  現在•  (株) 匠BusinessPlace 取締役チーフコンサルタント•  (株) Everforth 取締役CTO•  OSS•  SmartDoc•  Relaxer•  著作•  上流流⼯工程UMLモデリング(⽇日経BP)•  マインドマップではじめるモデリング講座(翔泳社)•  Relaxer Java/XMLによるWeb開発(ピアソン)•  ぼくらのScala(Softbank Creative)
ApparelCloud データを一元化することで、多様な情報を、様々なメディア・デバイスを通じて 消費者に届け、真のCRMを実現する仕組み。http://www.apparel-cloud.com/
ApparelCloudクーポン  ブランドサイトオンラインストア ブログブランド                        アプリニュース ブログ ショップコンテンツ 集計・分析ダッシュボード複数メディア・コンテンツを⼀一元管理理し、クオリティの統⼀一と運⽤用コストの低減を実現。コンテンツを⼆二重三重に登録する必要もなく、データ分析などの⼀一元化も可能。
関数型プログラミング
関数型⾔言語の技術マップ抽象代数学数理論理学直感主義命題論理&自然演繹単純型付ラムダ計算純粋関数型言語命題型クラス群論Hask圏(プログラム圏)永続データ構造関数型言語手続き型言語代数的データ型Curry-Haward対応オブジェクト指向言語証明述語論理様相論理圏論直積 直和不変副作用なし参照透過性置換モデルモノイド モナド型計算
Scalaz•  https://github.com/scalaz/scalaz•  キャッチフレーズ•  昔: Scalaz: Type Classes and Pure Functional DataStructures for Scala•  今: An extension to the core Scala library for functionalprogramming. http://typelevel.org•  最新の関数型プログラミングを可能にする機能群をScala向けに⽤用意•  型クラス•  純粋関数型データ構造•  Haskellで実績のある機能群をScalaで実現
Pipelineプログラミング(1)def pipeline(x: Int) = h(g(f(x))def pipeline(x: Option[Int]) = x.map(f).map(g).map(h)def pipeline(x: Int) = x |> f |> g |> h関数呼び出しFunctorMonaddef pipeline(x: Option[Int]) = x.flatMap(f).flatMap(g).flatMap(h)def pipeline(x: Option[Int]) =for (a <- f(x); b <- g(a); c <- h(b)) yiled c
Pipelineプログラミング(2)val pipeline =State(f).flatMap(x => State(g(x))).flatMap(x => State(h(x)))pipeline.run(10)val pipeline =for (a <- State(f);b <- State(g(a)); c <- State(h(c))) yield cpipeline.run(10)Monad (インタープリター型)参考: [FP] パイプライン・プログラミングhttp://modegramming.blogspot.jp/2015/06/fp.htmlval pipeline = io.linesR("infile.txt").filter(_.nonEmpty).map(x =>s"${x.length}:$x”)pipeline.run.runscalaz-stream (Process Monad)
StateモナドによるパイプラインState MonadFuncionState Function FunctionStateValueValue Value ValueValue Value
Task•  scalaz.concurrent.Task•  TryとFutureを合わせた機能を持つモナド•  ⻑⾧長所•  Scalazとの親和性•  利利⽤用シーンに合わせて並列列処理理の使⽤用・⾮非使⽤用を選択できる•  Futureのようにスレッドを⼤大量量消費しない•  純粋関数型指向のインタフェース(副作⽤用はrunで実⾏行行)•  関数型的な合成可能な部品化val t: Task[Int] = Task(f(1000))val i: Int = t.runval i: Int = Task(f(1000)).run
scalaz-‐‑‒stream
The Reactive Manifest•  http://www.reactivemanifesto.org/•  ⽇日本語訳•  http://okapies.hateblo.jp/entry/2014/12/03/025921•  Responsive•  応答性:すぐ応答する•  Resilient•  耐故障性:回復復⼒力力に富む、⽴立立ち直りが早い•  Elastic•  弾⼒力力性:伸縮⾃自在の•  Message Driven•  メッセージ駆動•  関連: Reactive Streams•  http://www.reactive-streams.org/
Reactiveの実現Service ClusterCPU CoreFunctionServiceMessageMessageMessageFunctionFunctionFunctionFunctionFunctionServiceServiceServiceServiceFunctionReactiveConcurrentParallelDistributedResponsiveResillienceElasticityMessage DrivenConcurrentParallelDistributed
Functional ReactiveProgrammingで実現したいこと•  関数型プログラミングのメリットを享受•  参照透過性•  関数による部品化/部品の組⽴立立て•  パイプラインのセマンティクス•  イベント駆動処理理•  Callback hellの排除•  ストリーム処理理•  リソース管理理•  フロー制御•  ⼤大規模データ処理理•  リソース管理理•  省省メモリ
Functional Reactive Programmingの候補•  RxJava – Scala•  https://github.com/ReactiveX/RxJava•  Observableモナド•  Scalaz Stream•  https://github.com/scalaz/scalaz-stream•  Processモナド•  Akka Streams•  https://typesafe.com/blog/typesafe-announces-akka-streams•  Akka actor
scalaz-stream•  ScalazベースのStreamingライブラリ•  https://github.com/scalaz/scalaz-stream•  ⽤用途•  ⼊入出⼒力力処理理フレームワーク•  パイプライン•  部品化、部品合成によるロジック記述•  ⼤大規模データ⼀一括処理理•  ストリーム処理理•  Processモナド•  Pull型 (backpressureあり)•  参照透過性:副作⽤用なし•  部品化:パイプラインによる関数の合成•  リソースの獲得・解放•  フロー制御•  状態機械
Processモナド既存部品 アプリケーション・ロジックリソース管理トランザクション管理フロー制御Function FunctionProcessMonadProcessMonadChannel SinkChannel SinkProcess Monad
部品 (ストリーム)•  Process•  Processモナド。•  Process1•  データ変換。Processの⼀一種。•  Sink•  ストリームの終端。副作⽤用あり。Processの⼀一種。•  Channel•  外部⼊入出⼒力力。Processの⼀一種。•  Tee•  2つのストリームを合流流(interleave, zipping)。Processの⼀一種。•  Wye•  2つのストリームを⾮非決定的に合流流。Processの⼀一種。•  Writer•  ストリームを2本に分割。Processの⼀一種。
部品 (連携)•  Exchange•  外部システムと連携。•  Queue•  キュー。•  書込み⽤用のメソッドを提供。•  読込み⽤用のProcessモナドを⽣生成。•  Topic•  pub/sub機能。•  書込み⽤用のメソッドを提供。•  書込み⽤用のProcessモナドを⽣生成。•  読込み⽤用のProcessモナドを⽣生成。
scalaz-streamの⻑⾧長所/短所•  ⻑⾧長所•  Scalazと親和性が⾼高い。•  純粋関数型の範囲で相当のことができる。•  部品化が容易易。•  プログラミングが容易易。•  短所•  性能が遅いようです。•  COMPARING AKKA-STREAM AND SCALAZ-STREAM WITHCODE EXAMPLES•  https://softwaremill.com/comparing-akka-stream-scalaz-stream•  (最初に)使い⽅方を把握するのが難しい。•  ストリームの分岐は関数型の範囲ではできない。•  Topicを使⽤用して実現。•  EIP:Content-Based Routingなど。•  マシンをまたいだストリームは構築できない。
scalaz-streamプログラムval source: Process[Task, String] = io.linesR("infile.txt")val a: Process[Task, String] = source.filter(_.nonEmpty)val b: Process[Task, String] = a.map(x => s"${x.length}:$x")val c: Process[Task, ByteVector] = b.pipe(text.utf8Encode)val sink: Sink[Task, ByteVector] = io.fileChunkW("outfile.txt")val pipeline: Process[Task, Unit] = b.to(sink)val task: Task[Unit] = pipeline.runval result: Unit = task.runio.linesR("infile.txt").filter(_.nonEmpty).map(x => s"${x.length}:$x").pipe(text.utf8Encode).to(io.fileChunkW("outfile.txt")).run.run
プログラミング例例•  パイプラインを流流れてくるデータを以下のルールでパケット化•  3つで⼀一つのパケットにする•  パケットにシーケンス番号をつける•  “start”データの前のパケットにエンドマークをつける•  上記アルゴリズムを実現した部品を⼤大規模データ処理理とストリーミング処理理の両⽅方に適⽤用する参考: [scalaz-stream] シーケンス番号とエンドマークhttp://modegramming.blogspot.jp/2015/03/scalaz-stream.html
準備case class Packet(seqno: Int, end: Boolean, content: String)def sink: Sink[Task, Packet] = {io.channel((a: Packet) => Task.delay(println(a)))}参考: [scalaz-stream] ストリーミングで状態機械http://modegramming.blogspot.jp/2015/04/scalaz-stream.html参考: [scalaz-stream] Scala的状態機械/OOP編http://modegramming.blogspot.jp/2015/03/scalaoop.html参考: [scalaz-stream] Scala的状態機械/FP編http://modegramming.blogspot.jp/2015/03/scalafp.html
アプリケーション・ロジック        def buildTextToPacket[M[_]: Monad](source: Process[M, String]):Process[M, Packet] = {source.chunk(3). // 3個ずつチャンク化            pipe(zipWithNext). // 次のパケットを同時に取得            pipe(zipWithIndex). // インデックを採番            map(toPacket)}def toPacket(x: ((Vector[String], Option[Vector[String]]), Int)):Packet = {val ((current, next), index) = xval content = current.mkString("-")val isend = next.cata(_.headOption === Some("start"), true)Packet(index + 1, isend, content)}既存部品とアプリケーションロジックを組合せてパイプラインを構築以下のロジックを実現- 3つで⼀一つのパケットにする- パケットにシーケンス番号をつける- “start”データの前のパケットにエンドマークをつける
⼤大規模データ処理理val source = io.linesR("data.txt")val pipeline = buildTextToPacket(source).to(sink)pipeline.run.runPacket(1,false,1-2-3)Packet(2,true,4-5-6)Packet(3,true,start-8-9)123456start89汎⽤用部品を⼤大規模データ処理理に適⽤用リソース管理フロー制御chunkzipWithNextzipWithIndextoPacketChannel SinkProcess Monad
EventProcessorval queue = EventProcessor.qval source = Vector("1", "2", "3", "4", "5", "6", "start", "8", "9")source foreach { x =>queue.enqueueOne(x).runThread.sleep(2000)}object EventProcessor {val q = async.unboundedQueue[String]val eventStream: Process[Task, String] = q.dequeue}参考: [scalaz-stream] ストリーミングで状態機械http://modegramming.blogspot.jp/2015/04/scalaz-stream.html
ストリーム処理理val source = EventProcessor.eventStreamval pipeline = buildTextToPacket(source).to(sink)pipeline.run.runPacket(1,false,1-2-3)Packet(2,true,4-5-6)汎⽤用ロジックをストリーミング処理理に適⽤用リソース管理フロー制御chunkzipWithNextzipWithIndextoPacketChannel SinkProcess Monad
まとめ•  Reactiveには関数型プログラミング•  Responsive, Elastice, Resilience, Message-Driven•  Cuncurrent, Parallel, Distributed•  純粋関数型と普通の関数型/⼿手続き型のトレードオフ•  書やすさ/品質/部品化/将来技術との連続性  vs 性能•  可能であれば純粋関数型が望ましい•  scalaz stream•  純粋関数型の範囲で相当のことができる•  出きない/苦⼿手なことがあるので応⽤用との相性を⾒見見極める•  Push•  マシンをまたいだストリームの構築
END

Recommended

PDF
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
PPTX
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
PDF
オブジェクト指向開発におけるObject-Functional Programming
PDF
Object-Functional Analysis and Design and Programming温泉
PDF
モデリングの未来 〜~パネルディスカッション
PDF
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
PDF
Scalaプログラミング・マニアックス
PDF
協調モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第7回】
PDF
TypeScript超入門
PPTX
おっさんES6/ES2015,React.jsを学ぶ
PDF
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
PDF
OCL in Papyrus Introduction
PDF
Lets scala
 
PDF
Object-Funcational Analysis and design
PDF
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
PDF
Learn ES2015
PPTX
190731 chalice
PDF
超高速アプリ開発法
PDF
Spark MLlib code reading ~optimization~
PDF
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
KEY
Scalaはじめました!
PPTX
TypeScriptはいいぞ
PDF
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
PPTX
Kotlinについて学んだコト
PPTX
Java使いにとっての関数
PPTX
Scalaで学ぶ関数型言語超入門
PPTX
Prefer Cloud Platform - ビジョン、アーキテクチャ
PDF
『アジャイルとスクラム』第1回 POStudy 〜プロダクトオーナーシップ勉強会〜
PDF
Scala DSLの作り方
PPTX
Everforth Organization - 組織モデル

More Related Content

PDF
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
PPTX
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
PDF
オブジェクト指向開発におけるObject-Functional Programming
PDF
Object-Functional Analysis and Design and Programming温泉
PDF
モデリングの未来 〜~パネルディスカッション
PDF
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
PDF
Scalaプログラミング・マニアックス
PDF
協調モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第7回】
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
オブジェクト指向開発におけるObject-Functional Programming
Object-Functional Analysis and Design and Programming温泉
モデリングの未来 〜~パネルディスカッション
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
Scalaプログラミング・マニアックス
協調モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第7回】

What's hot

PDF
TypeScript超入門
PPTX
おっさんES6/ES2015,React.jsを学ぶ
PDF
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
PDF
OCL in Papyrus Introduction
PDF
Lets scala
 
PDF
Object-Funcational Analysis and design
PDF
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
PDF
Learn ES2015
PPTX
190731 chalice
PDF
超高速アプリ開発法
PDF
Spark MLlib code reading ~optimization~
PDF
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
KEY
Scalaはじめました!
PPTX
TypeScriptはいいぞ
PDF
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
PPTX
Kotlinについて学んだコト
PPTX
Java使いにとっての関数
PPTX
Scalaで学ぶ関数型言語超入門
TypeScript超入門
おっさんES6/ES2015,React.jsを学ぶ
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
OCL in Papyrus Introduction
Lets scala
 
Object-Funcational Analysis and design
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
Learn ES2015
190731 chalice
超高速アプリ開発法
Spark MLlib code reading ~optimization~
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scalaはじめました!
TypeScriptはいいぞ
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
Kotlinについて学んだコト
Java使いにとっての関数
Scalaで学ぶ関数型言語超入門

Viewers also liked

PPTX
Prefer Cloud Platform - ビジョン、アーキテクチャ
PDF
『アジャイルとスクラム』第1回 POStudy 〜プロダクトオーナーシップ勉強会〜
PDF
Scala DSLの作り方
PPTX
Everforth Organization - 組織モデル
PPTX
Scala eXchange: Building robust data pipelines in Scala
PDF
Typesafe Reactive Platformで作るReactive System入門
Prefer Cloud Platform - ビジョン、アーキテクチャ
『アジャイルとスクラム』第1回 POStudy 〜プロダクトオーナーシップ勉強会〜
Scala DSLの作り方
Everforth Organization - 組織モデル
Scala eXchange: Building robust data pipelines in Scala
Typesafe Reactive Platformで作るReactive System入門

Similar to Scalaz-StreamによるFunctional Reactive Programming

PDF
Scalaでのプログラム開発
PDF
動的モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第6回】
PDF
IoT時代におけるストリームデータ処理と急成長の Apache Flink
PDF
なぜリアクティブは重要か #ScalaMatsuri
PDF
実務者のためのかんたんScalaz
PDF
並列対決 Elixir × Go × C# x Scala , Node.js
PPTX
Spark Structured Streaming with Kafka
PDF
言語アップデート -Scala編-
PDF
Scala2.8への移行
PDF
Scala2.8への移行
PDF
Asakusa FrameworkとScalaの密かな関係
PPTX
StreamGraph
PPT
Blueprintsについて
PDF
Why Reactive Matters #ScalaMatsuri
PDF
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
PDF
State of the art Stream Processing #hadoopreading
PDF
Stormの注目の新機能TridentAPI
PDF
Akka stream
PPTX
20130215 fluentd esper_2
Scalaでのプログラム開発
動的モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第6回】
IoT時代におけるストリームデータ処理と急成長の Apache Flink
なぜリアクティブは重要か #ScalaMatsuri
実務者のためのかんたんScalaz
並列対決 Elixir × Go × C# x Scala , Node.js
Spark Structured Streaming with Kafka
言語アップデート -Scala編-
Scala2.8への移行
Scala2.8への移行
Asakusa FrameworkとScalaの密かな関係
StreamGraph
Blueprintsについて
Why Reactive Matters #ScalaMatsuri
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
State of the art Stream Processing #hadoopreading
Stormの注目の新機能TridentAPI
Akka stream
20130215 fluentd esper_2

More from Tomoharu ASAMI

PDF
AI時代のソフトウェア開発 文芸モデル駆動アプローチ : 文芸モデルをDSLとした文芸モデル開発と生成AI連携の知識ベース
PDF
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
PDF
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
PDF
要求モデル/BDD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第43回】
PDF
ケーススタディ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第40回】
PDF
要求モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第42回】
PDF
Cloud Native Component Framework 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第39回】
PDF
ケーススタディ/テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第47回】
PDF
分析モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第44回】
PDF
ビジネス・モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第41回】
PDF
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
PDF
Cloud Native CBD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第35回】
PDF
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
PDF
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
PDF
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
PDF
ドメイン・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第36回】
PDF
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
PDF
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
PDF
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
PDF
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
AI時代のソフトウェア開発 文芸モデル駆動アプローチ : 文芸モデルをDSLとした文芸モデル開発と生成AI連携の知識ベース
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
要求モデル/BDD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第43回】
ケーススタディ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第40回】
要求モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第42回】
Cloud Native Component Framework 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第39回】
ケーススタディ/テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第47回】
分析モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第44回】
ビジネス・モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第41回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
Cloud Native CBD 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第35回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
ドメイン・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第36回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】

Scalaz-StreamによるFunctional Reactive Programming


[8]ページ先頭

©2009-2025 Movatter.jp