SlideShare a Scribd company logo
Learning Process Calculate 
with CSP, Groovy, GPars 
in JJUG 2014.09.18 
kyon_mm
Self Introduction 
きょん kyon_mm 
テストアーキテクト 2年目 
TDD/BDD, SCM, Agile, Softwaretest, 
SoftwareEngineering 
なごや 
基礎勉強会, SCMBC, Nagoya.Testing, 
Cafe.Testing
Agenda 
the word of CSP 
Good points 
Try! GPars! Verify! FDR!
the word of CSP
CSP 
並行処理のモデルとして利用されているプロセ 
ス代数の一例です。 
プロセス代数の他の例としては、ご存知π計算 
だと思います。 
太一(@ryushi)さんが名古屋に来たときにGoの 
話をしていたので、jjugの皆様もGoを知ってい 
ると思い、Goユーザには身近なCSPの話をしに 
きました。
CSP 
Tony Hoareが考案したモデルで、いまや様々な 
言語やフレームワークに影響を与えています。 
Occamはもちろんですが、Erlangも影響を受け 
ています。 
並行処理関連で「チャネル」がうんたらとか言 
われたら、CSPかな?って思って聞くといいか 
もだよ!
Good points
Good points 
研究者と実績がたくさん 
逐次実行と並行実行の仕様を比較するツール 
Groovy(もしくはJava)で実装できる
逐次実行と並行実行 
の比較 
並行実行を正しく仕様化するのは難しいと言わ 
れており、僕もよく間違います。 
逐次実行だったらあまり間違わないところでも、 
並行実行にするだけで難しくなることがよくあ 
る。
逐次実行と並行実行 
の比較 
そこで、FDR(ツール)ですよ。CSPとほぼ同等 
の記法のスクリプトを入力とする検証ツール。 
CSP記法で同じ結果を得るための「逐次実行の 
仕様」と「並行実行の仕様」両方を書く。 
FDRにそれぞれを入力すると、どの程度同一か 
判定してくれる! 
結果によっては、ライブロックフリー、デッド 
ロックフリーなどが保証される!!
Groovyで書ける 
CSPをJava実装したものがJCSPというライブラ 
リとして後悔されていて、GParsはJCSPをラッ 
プしている! 
Groovyに並行処理を書ける!
Try GPars
GPars 
Groovyをインストールすれば入っています。 
org.codehaus.gpars:gpars:1.2.1 
JCSPスタイルで書く事も、GParsスタイルで書 
く事も可能。 
GParsスタイル = DataFlowクラス系との組み合 
わせ
Sample 
groovyx.gpars.plugAndPlayパッケージ配下に 
簡単なものがいくつか定義されているので、そ 
れらを使って、とりあえず動かしてみる事がで 
きます
plugAndPlay 
classes 
GConsole 
GConsoleStr 
ingToIntege 
r 
GDelta2 
GFixedDelay 
GIdentity 
GIntegrate 
GNumbers 
GObjectToCo 
nsoleString 
GPairs 
GParPrint 
GPCopy 
GPlus 
GPrefix 
GPrint 
GSquares 
GStatePairs 
GSuccessor 
GTail
class Executor implements CSProcess { 
def out1 
def out2 
def random = new Random() 
@Override 
void run() { 
while (true){ 
out1.write(random.nextInt() % 10) 
out2.write(random.nextInt() % 10) 
sleep(50L) 
} 
} 
}
def channelA = Channel.one2one() 
def channelB = Channel.one2one() 
def channelC = Channel.one2one() 
final def par = new PAR([ 
new Executor(out1: channelA.out(), out2: 
channelB.out()), 
new GPlus(inChannel0: channelA.in(), 
inChannel1:channelB.in(), outChannel: channelC.out()), 
new GPrint(inChannel: channelC.in(), heading: "足し算 
しちゃうよ?") 
]) 
par.run()
JCSP,GPars 
処理はCSProcessインターフェースの実装に書 
きます。これをプロセスといいます。 
プロセスとプロセスのやり取りはチャネルを通 
してのみ行います。 
1プロセス対Nプロセス、1チャネル対Nチャネル 
もあります。
JCSP,GPars 
new PAR([someProcess,,,])とすることで、プ 
ロセス合成をしている。 
制限がありますが、プロセス通信は1マシン内 
でも、マシン間でも出来ます。(夢がひろがる!
例えばGSuccessorのなかみ↓ 
ChannelInput inChannel 
ChannelOutput outChannel 
void run() { 
while (true) { 
outChannel.write(inChannel.read() + 1) 
} 
}
例えばGPrintのなかみ↓ 
ChannelInput inChannel 
String heading = "No Heading Provided" 
long delay = 200 
def void run() { 
def timer = new CSTimer() 
println "${heading}" 
while (true) { 
println inChannel.read().toString() 
if (delay != 0) { 
timer.sleep(delay)
CSP 
チャネルは同期的に動作し、プロセスは非同期 
に動作する。(同期的メッセージング、非同期 
動作) 
ただし、GParsではチャネルを非同期にするこ 
ともできる!(実際あやうい気はするが、わか 
らない)
Sample with 
Dataflow 
入力した文字列をフォーマットして、挨拶文を 
返すプログラム 
Input <-> Formatter <-> Greeter <-> Output
class Formatter implements Callable<String> { 
DataflowReadChannel rawNames 
DataflowWriteChannel formattedNames 
@Override 
String call() { 
while(!Thread.currentThread().isInterrupted()) { 
String name = rawNames.val 
formattedNames << name.toUpperCase() 
} 
} 
}
class Greeter implements Callable<String> { 
DataflowReadChannel names 
DataflowWriteChannel greetings 
@Override 
String call() { 
while(!Thread.currentThread().isInterrupted()) { 
String name = names.val 
greetings << "Hello " + name 
} 
} 
}
def a = new SyncDataflowQueue() 
def b = new SyncDataflowQueue() 
def c = new SyncDataflowQueue() 
! 
group.task new Formatter(rawNames:a, formattedNames:b) 
group.task new Greeter(names:b, greetings:c) 
! 
// 送信と受信をする 
a << “Joe" // チャネルに送信 
println c.val // 出力 
…
Verify FDR
FDR3 Released! 
書籍やなんかではFDR2!と書かれていますが、 
現在はFDR3.10がリリースされています。 
FDRは学術目的のみ無償で利用できるライセン 
スです。
FDR3 
みてみよう! 
http://www.cs.ox.ac.uk/projects/fdr/ 
FDR3 で 検索!
Conclusion
Conclusion 
CSPを使ってみたいなら、GParsを使うと簡単な 
プロセスがいくつか定義されているので、動か 
しやすいし、Groovy自体の書きやすさもあって 
よい。 
モデルとコードが近くなりやすいCSPで書いて 
おくと、ツールでの検証が捗るし、検証してか 
らコードに書くのもそんなに困らない。 
机上デバッグやめたいれす^q^
Append 
非同期処理のプロジェクトで失敗したのをキッ 
カケに真面目に取り組み始めました。 
いまは、CSPベースの何かを開発しています。 
CIサーバ 
テスティングフレームワーク 
ビルドツール
ご清聴ありがとぴょん◆

More Related Content

PDF
Closures and methodMissing are real
PDF
制約をつけて遊ぼう
PPTX
YAPC::ASIA 2012 LT GaiaX
PPTX
そんな装備で大丈夫か?
ODP
こんにちはGroovy
PDF
Hacking Ruby with Python
PDF
プログラミング・パラダイム
PPT
Javascriptで無限ループを実現する5つの方法
Closures and methodMissing are real
制約をつけて遊ぼう
YAPC::ASIA 2012 LT GaiaX
そんな装備で大丈夫か?
こんにちはGroovy
Hacking Ruby with Python
プログラミング・パラダイム
Javascriptで無限ループを実現する5つの方法

What's hot (16)

PDF
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
PDF
道具を磨き続ける
PPTX
技術ドキュメントで難しい英文に出会ったら
PDF
Javaな人が今すぐ使えるG*
PDF
Listen&notifyとbwpの間違った使い方
PPT
Smalltalk との比較で深まる Citrine の理解
PDF
神戸Rustの会 #1 LT - I'm lazy rust programmer
PDF
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
PPTX
プログラミング技法特論第5回
PDF
Goでこれどうやるの? 入門
PPTX
JavaScript 非同期処理 入門
PDF
PHP-ML で手書き数字認識
ODP
Shortcodin
PPT
いまさら聞けないRake入門
PPTX
ここがすごい! なぞとPHP5.3
PDF
Go言語オーバービュー201507
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
道具を磨き続ける
技術ドキュメントで難しい英文に出会ったら
Javaな人が今すぐ使えるG*
Listen&notifyとbwpの間違った使い方
Smalltalk との比較で深まる Citrine の理解
神戸Rustの会 #1 LT - I'm lazy rust programmer
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
プログラミング技法特論第5回
Goでこれどうやるの? 入門
JavaScript 非同期処理 入門
PHP-ML で手書き数字認識
Shortcodin
いまさら聞けないRake入門
ここがすごい! なぞとPHP5.3
Go言語オーバービュー201507
Ad

Viewers also liked (15)

PDF
そんなリザルトキャッシュで大丈夫か? #jjug
PDF
Legend of Java Concurrency/Parallelism
PDF
Java EEの話(仮)
PDF
Introduction to Spock
PDF
GroovyでJSON2014
PDF
Groovy AST Demystified
PDF
Griffon Update Gr8conf 2013
PDF
Introduce Groovy 2.3 trait
PDF
Groovy Bootcamp 2015 by JGGUG
PPTX
Grailsでシステム構築
PDF
簡単!Groovy入門
PDF
Grailsでドメイン駆動設計を実践する時の勘所
PDF
Xtext And Grails20091218
PDF
Railsチュートリアルの歩き方 (第4版)
PDF
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
そんなリザルトキャッシュで大丈夫か? #jjug
Legend of Java Concurrency/Parallelism
Java EEの話(仮)
Introduction to Spock
GroovyでJSON2014
Groovy AST Demystified
Griffon Update Gr8conf 2013
Introduce Groovy 2.3 trait
Groovy Bootcamp 2015 by JGGUG
Grailsでシステム構築
簡単!Groovy入門
Grailsでドメイン駆動設計を実践する時の勘所
Xtext And Grails20091218
Railsチュートリアルの歩き方 (第4版)
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
Ad

Similar to Groovyで学ぶプロセス代数 #jjug (20)

PDF
async/await不要論
PDF
Hackers Champloo 2016 postgresql-9.6
PDF
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
PPTX
パフォーマンスの良いGASの書き方 Best Practice
PPT
Googleの基盤クローン Hadoopについて
PPT
2008.10.18 L4u Tech Talk
PPTX
Ll tiger clojure
PPTX
機械学習 / Deep Learning 大全 (6) Library編
PDF
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
PDF
Flutterを体験してみませんか
PPTX
競プロでGo!
PDF
【公開版】AWS基礎 for 新卒エンジニア
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
PDF
PDF
Write good parser in perl
PDF
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
PDF
アドテク×Scala×パフォーマンスチューニング
PDF
Introduction to argo
PDF
C++による数値解析の並列化手法
async/await不要論
Hackers Champloo 2016 postgresql-9.6
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
パフォーマンスの良いGASの書き方 Best Practice
Googleの基盤クローン Hadoopについて
2008.10.18 L4u Tech Talk
Ll tiger clojure
機械学習 / Deep Learning 大全 (6) Library編
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
もしも… Javaでヘテロジニアスコアが使えたら…
Flutterを体験してみませんか
競プロでGo!
【公開版】AWS基礎 for 新卒エンジニア
今日から始めるGopher - スタートGo #0 @GDG名古屋
Write good parser in perl
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
アドテク×Scala×パフォーマンスチューニング
Introduction to argo
C++による数値解析の並列化手法

More from kyon mm (20)

PDF
Scrum,Test,Metrics #sgt2016
PDF
Kaizen process with test #hackt
PDF
ザ・ジェネラリスト #5000dai
PDF
ICST2015 GUI Testingの紹介 #SIGSTJ
PDF
焦らず急いでの意味
PDF
Sta introduction in_kyoto #devkan
PDF
出来るチューリング完全!SQLでもいろいろ出来る! #syoboben
PDF
#STAC2014 状態遷移を活用した自動テストのテスト戦略とデプロイメントパイプライン
PDF
#STAC2014 システムテスト自動化ハンズオン
PDF
テストファースト、自動テストを導入するという事について(@社内勉強会)
PDF
Gradle 2.2, 2.3 news #jggug
PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp
PDF
テストエンジニアの品格 #automatornight
PDF
@kyon_mmの書籍の読み方 #AsianAA
PDF
JenkinsとGitで実装するGatewayCheckIn Pattern #AsianAA
PDF
GradleのREPLプラグイン紹介 #jggug
PDF
契る意味 #pykonjp2014
PDF
いつでも聞けるTDD入門 #TDDBC_NAGOYA
PDF
Test Retrospective #kyon_kao_wedding in Tokyo
PDF
ソフトウェア開発を勉強し始めて3年間でやったこと~After~ #devsumi
Scrum,Test,Metrics #sgt2016
Kaizen process with test #hackt
ザ・ジェネラリスト #5000dai
ICST2015 GUI Testingの紹介 #SIGSTJ
焦らず急いでの意味
Sta introduction in_kyoto #devkan
出来るチューリング完全!SQLでもいろいろ出来る! #syoboben
#STAC2014 状態遷移を活用した自動テストのテスト戦略とデプロイメントパイプライン
#STAC2014 システムテスト自動化ハンズオン
テストファースト、自動テストを導入するという事について(@社内勉強会)
Gradle 2.2, 2.3 news #jggug
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストエンジニアの品格 #automatornight
@kyon_mmの書籍の読み方 #AsianAA
JenkinsとGitで実装するGatewayCheckIn Pattern #AsianAA
GradleのREPLプラグイン紹介 #jggug
契る意味 #pykonjp2014
いつでも聞けるTDD入門 #TDDBC_NAGOYA
Test Retrospective #kyon_kao_wedding in Tokyo
ソフトウェア開発を勉強し始めて3年間でやったこと~After~ #devsumi

Groovyで学ぶプロセス代数 #jjug