SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
Streaming data processing ライブラリの紹介
(主に conduit)
KrdLab
(2013/12/21)
はじめに
 ときどきコードが出てきますが
 「ふーん,こんな感じなのか」

 って見てもらえれば幸いです
今回の内容
 これは何?
 何があるの?

 Conduit の紹介
 ほんの少しだけ中身をのぞくと…
 まとめ
Streaming data processing ライブラリって何?
 ストリームデータに対して統一インタフェースを提供
 どこから来たデータであっても同じように扱える

 リソースの解放をコントロール
 lazy IO の問題を解決
統一されたインタフェース
 ソケット/ファイル/メモリ,どこから来たデータなのかに関係なく扱える
 データの生成/変換/消費
 これらを記述する primitive
 これらを連結する operator

 ライブラリごとに若干名前が異なりますが…





Source/Process
Source/Conduit/Sink
Pipe/Proxy
InputStream/OutputStream

-- だいたいこんな感じ
run $ source (ope) process (ope) ...

ストリームデータ
の抽象化
リソースの解放をコントロール (1/2)
 lazy IO のみで構成すると大きなデータでもコンスタントなメモリで処理できる
 しかし,lazy IO はリソース解放のタイミングが難しい
 GC 任せにすると解放タイミングが非決定的
 かといって完璧に管理するのも大変
-- 単純かつ極端な例 (もちろんコンパイルは通る)
main = do
s <- withFile “test.txt” ReadMode hGetContents
putStr s -- あっ… 表示されない…

 例えば hGetContents の返す String はすべてのデータを表す
 えっ!?
 引き回しはじめたらどこで閉じたら良いのかわからない…
(参考) http://www.haskell.org/haskellwiki/Iteratee_I/O
リソースの解放をコントロール (2/2)
 リソースは使い終わったら即時回収
 リソースは貴重品
 もちろん “constant memory”

main = runResource $
sourceFile “test.txt” $$ sinkHandle stdout

 “deterministic resource handling”
 “resource and exception safety”
有名どころの Implementasions
 conduit
 Yesod の作者が作っている
 ResourceT でリソース管理

 pipes
 よく conduit と一緒に取り上げられ,確か conduit の実装に影響を与えていたはず
 リソースのあたりは pipes-safe

 io-streams
 他と少し毛色が違う,IO をベースとした API
 リソースのあたりは catch/bracket/with*

 あと machines というものもあるよ!
今回のターゲット
 conduit について紹介します

 machines についてはブログ参照
 「Haskell の machines に入門してみた,というお話」
 http://krdlab.hatenablog.com/entry/2013/03/16/204039
Conduit: リスト操作
-- List の例
import
Data.Conduit
import qualified Data.Conduit.List as CL
main = do
l <- CL.sourceList [1..10] $$ CL.map (+1) =$ CL.consume
print l
-- [2,3,4,5,6,7,8,9,10,11]
Conduit: ファイル操作
 宣言的
main = runResourceT $
sourceFile “test.txt” $$ sinkFile “output.txt”

 加工したい場合も宣言的にかける
main = runResourceT $
sourceFile “test.txt”
$= decode utf8
$= CL.map toUpper
$= encode utf8
$$ sinkFile “output.txt”
Conduit: Core & Generalized Types
 type Source m o
 データの生産

 type Conduit i m o
 データの変換

 type Sink i
 データの消費

 一般化したやつ
 type Producer m o
 type Consumer i m r
 (補足:上 3 つと違って input/output が forall)
Conduit: Operators
 各コンポーネントをつなぐ

 ($$) :: Source m a -> Sink a m b -> m b
 connect

 ($=) :: Source m a -> Conduit a m b -> Source m b
 fuse

 (=$) :: Conduit a m b -> Sink b m c -> Sink a m c
 fuse

 (=$=) :: Conduit a m b -> ConduitM b c m r -> ConduitM a c m r
 fuse
Conduit: Primitives
 自分で中身を書きたいときに使う

 await :: Monad m => Consumer i m (Maybe i)
 上流からの入力を待つ

 yield :: Monad m => o -> ConduitM i o m ()
 値を下流へ流す

 leftover :: i -> ConduitM i o m ()
 入力の読み残しを次に渡す
Conduit: Primitives の利用例
 リストを加工する例
Conduit: Internal (少しだけです)
Conduit: Internal
 data Pipe l i o u m r







l: left over (otherwise Void)
i: input values
o: output values
u: upstream からの戻り値
m: ベースモナド (ex. IO)
r: 最終的な戻り値

 コンストラクタは 5 種類
 HaveOutput/NeedInput/Done/PipeM/Leftover
Conduit: Internal - Core datatype
 data ConduitM i o m r





i: input values
o: output values
m: ベースモナド (最終的に返されるコンテキスト)
r: 最終的な戻り値

 内部には Pipe を持っている
 newtype ConduitM i o m r = ConduitM { unConduitM :: Pipe i i o () m r }
Conduit: Internal - Types
 type Source m o = ConduitM () o m ()
 type Conduit i m o = ConduitM i o m ()

 type Sink i = ConduitM i Void
 type Producer m o = forall i. ConduitM i o m ()
 type Consumer i m r = forall o. ConduitM i o m r
 すべてが Pipe
Conduit: 要するに
 ストリームデータを Pipe 構造に変換
 処理を Pipe で記述

 演算子で連結
↓
 Conduit の処理は Pipe を interpret する
まとめ
 良い感じにストリームデータを扱える
 統一されたインタフェース
 リソース解放のコントロール

 いろいろ実装あるけど,今回は conduit を紹介した
 良い感じでコンポーネントを書くための primitive も提供されている

 内部は Pipe を処理している
 すぐに試してみたい人は “FP Haskell Center” を使うと楽です
 https://www.fpcomplete.com/

Mais conteúdo relacionado

Mais procurados

掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public
掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public
掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 PublicHisaya Okada
 
as-3. プログラムカウンタと命令実行サイクル
as-3. プログラムカウンタと命令実行サイクルas-3. プログラムカウンタと命令実行サイクル
as-3. プログラムカウンタと命令実行サイクルkunihikokaneko1
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)洋史 東平
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみたina job
 
補足資料 太陽電池モデリング教材
補足資料 太陽電池モデリング教材補足資料 太陽電池モデリング教材
補足資料 太陽電池モデリング教材Tsuyoshi Horigome
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門Shohei Arai
 
Youtube embedded
Youtube embeddedYoutube embedded
Youtube embeddedJun Chiba
 

Mais procurados (12)

emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public
掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public
掃除をさせるだけではもったいない「ルンバ」の魅力と攻略法 Public
 
as-3. プログラムカウンタと命令実行サイクル
as-3. プログラムカウンタと命令実行サイクルas-3. プログラムカウンタと命令実行サイクル
as-3. プログラムカウンタと命令実行サイクル
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
 
llvm入門
llvm入門llvm入門
llvm入門
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
 
補足資料 太陽電池モデリング教材
補足資料 太陽電池モデリング教材補足資料 太陽電池モデリング教材
補足資料 太陽電池モデリング教材
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
 
Rails vim easy
Rails vim easyRails vim easy
Rails vim easy
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Youtube embedded
Youtube embeddedYoutube embedded
Youtube embedded
 

Semelhante a Streaming data processing ライブラリの紹介 (主に Conduit)

Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
B lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめB lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめShinichi Hirauchi
 
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門Akira Shimosako
 
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjavaきつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjavabitter_fox
 

Semelhante a Streaming data processing ライブラリの紹介 (主に Conduit) (6)

Stream2の基本
Stream2の基本Stream2の基本
Stream2の基本
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
B lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめB lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめ
 
20010901
2001090120010901
20010901
 
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
 
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjavaきつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
 

Último

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

Streaming data processing ライブラリの紹介 (主に Conduit)