Mercurial > hg > Members > anatofuz > slides
changeset 14:deecd8254ba8
rename
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 26 Jan 2018 14:34:14 +0900 |
parents | 967fe50f1ef4 |
children | 80767afba59c |
files | slides/20170116/slide.md slides/20170123/slide.md slides/20180116/slide.md slides/20180123/slide.md slides/20180126/slide.md |
diffstat | 5 files changed, 355 insertions(+), 342 deletions(-) [+] |
line wrap: on
line diff
--- a/slides/20170116/slide.md Fri Jan 26 14:16:04 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,254 +0,0 @@ -title: 分散フレームワークakkaの調査 -author: Takahiro Shimizu -profile: -lang: Japanese - - -# 調査目的 -* 先輩の修論の比較材料の為に行う -* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する - -# 調査内容 -* akkaのmac osx,ubuntu上の導入 -* [公式チュートリアル](https://developer.lightbend.com/guides/akka-quickstart-java/)の例題を行う -* 今回はJavaで実行した - -# 環境構築 - -* 公式からzipファイルで提供されているので落とす -* 例題はGradleで実行できるように作成されているので `$ gradle run` を実行可能. - -# akkaの分散処理 - -* akkaはアクターモデルを採用したフレームワーク - * アクターモデルでは「アクター」と呼ばれるオブジェクト同士がメッセージ通信を行うことで並列処理を実現する(イベント・ドリブン) - * publicなAPIを持っていない為,強力な分離機能を持っており、複数のJVMなどでも連携可能 - * 環境透過性 - * 軽量 -* JVM上で動き、ScalaとJavaをサポートしている - -# 例題(Hello,World) - -* 今回は公式チュートリアルにある、複数のアクターが挨拶をするHello Worldの例題を実行する -* <img src="https://developer.lightbend.com/guides/akka-quickstart-java/images/hello-akka-architecture.png"> - -* 実行結果 - -``` -$ gradle run -Starting a Gradle Daemon (subsequent builds will be faster) - - > Task :run - >>> Press ENTER to exit <<< - [INFO] [01/16/2018 15:33:05.871] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Howdy, Akka - [INFO] [01/16/2018 15:33:05.872] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Howdy, Lightbend - [INFO] [01/16/2018 15:33:05.872] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Good day, Play - [INFO] [01/16/2018 15:33:05.872] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Hello, Java -``` - -# Hello World Actors - -* 例題のActorrは3種類のmessageを利用する - -* `WhoToGreet` - * greetingの受取用オブジェクト -* `Greet` - * greetingの実行用 -* `Greeting` - * `greeting`にメッセージを含める為の命令 - -* 複数のスレッドで共有をする必要がある為、メッセージはimmutableでなければならない - - -# Greeter Actor - -* `Greeter` のコンストラクタは、送信用メッセージと出力用のActorのリファレンスを必要とする -* mainの中ではGreeterは複数呼ばれている - -``` -package com.lightbend.akka.sample; - -import akka.actor.AbstractActor; -import akka.actor.ActorRef; -import akka.actor.Props; -import com.lightbend.akka.sample.Printer.Greeting; - -public class Greeter extends AbstractActor { - static public Props props(String message, ActorRef printerActor) { - return Props.create(Greeter.class, () -> new Greeter(message, printerActor)); - } - - static public class WhoToGreet { - public final String who; - - public WhoToGreet(String who) { - this.who = who; - } - } - - static public class Greet { - public Greet() { - } - } - - private final String message; - private final ActorRef printerActor; - private String greeting = ""; - - public Greeter(String message, ActorRef printerActor) { - this.message = message; - this.printerActor = printerActor; - } - - @Override - public Receive createReceive() { - return receiveBuilder() - .match(WhoToGreet.class, wtg -> { - this.greeting = message + ", " + wtg.who; - }) - .match(Greet.class, x -> { - printerActor.tell(new Greeting(greeting), getSelf()); - }) - .build(); - } -} -``` - -# Printer Actor - -* `Logging.getLogger(getContext().getSystem(), this);` で各Actorが `log.info()` に追記していく -* `Greeting` とlogsに対してhandleを所持している - -``` -package com.lightbend.akka.sample; - -import akka.actor.AbstractActor; -import akka.actor.ActorRef; -import akka.actor.Props; -import akka.event.Logging; -import akka.event.LoggingAdapter; - -public class Printer extends AbstractActor { - static public Props props() { - return Props.create(Printer.class, () -> new Printer()); - } - - static public class Greeting { - public final String message; - - public Greeting(String message) { - this.message = message; - } - } - - private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); - - public Printer() { - } - - @Override - public Receive createReceive() { - return receiveBuilder() - .match(Greeting.class, greeting -> { - log.info(greeting.message); - }) - .build(); - } -} -``` - - -# Actorを作る - -* akkaはインスタンスを作る際に `new` を使わない。これはakkaのインスタンスがリファレンスである為 (`akka.actor.ActorRef`)である。 - * その為、軽量かつ柔軟にシステムに組み込むことが可能である -* akkaのActorは `akka.actor.ActorSystem` が管理する。(factoryなどとも呼ばれる) -* 例題では次のようにakkaのインスタンスを作成している。 - -``` -public class AkkaQuickstart { - public static void main(String[] args) { - final ActorSystem system = ActorSystem.create("helloakka"); - try { - //#create-actors - final ActorRef printerActor = - system.actorOf(Printer.props(), "printerActor"); - final ActorRef howdyGreeter = - system.actorOf(Greeter.props("Howdy", printerActor), "howdyGreeter"); - final ActorRef helloGreeter = - system.actorOf(Greeter.props("Hello", printerActor), "helloGreeter"); - final ActorRef goodDayGreeter = - system.actorOf(Greeter.props("Good day", printerActor), "goodDayGreeter"); - //#create-actors -``` - -# メッセージ送信 - -* akkaのメッセージ送信は `ActorRef`の`tell`メソッドを呼ぶ。 - -``` -howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); -howdyGreeter.tell(new Greet(), ActorRef.noSender()); - -howdyGreeter.tell(new WhoToGreet("Lightbend"), ActorRef.noSender()); -howdyGreeter.tell(new Greet(), ActorRef.noSender()); - -helloGreeter.tell(new WhoToGreet("Java"), ActorRef.noSender()); -helloGreeter.tell(new Greet(), ActorRef.noSender()); - -goodDayGreeter.tell(new WhoToGreet("Play"), ActorRef.noSender()); -goodDayGreeter.tell(new Greet(), ActorRef.noSender()); -``` - -* `Greeter` Actrorは `Printer` Actorにメッセージを送信している - -``` -printerActor.tell(new Greeting(greeting), getSelf()); -``` - -# テスト - -* Javaで使われているのでテストはJUnitを利用できる -* akkaaでは `akka.test.javadsl.TestKit` が用意されており, TestKit が推奨されている。 -* 詳しくは[公式ドキュメント](https://doc.akka.io/docs/akka/current/testing.html?language=java)を見ろということらしい… - -``` -`ckage com.lightbend.akka.sample; - -import akka.actor.ActorRef; -import akka.actor.ActorSystem; -import akka.testkit.javadsl.TestKit; -import com.lightbend.akka.sample.Greeter.*; -import com.lightbend.akka.sample.Printer.*; - -import static org.junit.Assert.assertEquals; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -public class AkkaQuickstartTest { - static ActorSystem system; - - @BeforeClass - public static void setup() { - system = ActorSystem.create(); - } - - @AfterClass - public static void teardown() { - TestKit.shutdownActorSystem(system); - system = null; - } - - @Test - public void testGreeterActorSendingOfGreeting() { - final TestKit testProbe = new TestKit(system); - final ActorRef helloGreeter = system.actorOf(Greeter.props("Hello", testProbe.getRef())); - helloGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); - helloGreeter.tell(new Greet(), ActorRef.noSender()); - Greeting greeting = testProbe.expectMsgClass(Greeting.class); - assertEquals("Hello, Akka", greeting.message); - } -} -```
--- a/slides/20170123/slide.md Fri Jan 26 14:16:04 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -title: 分散フレームワークakkaの調査 -author: Takahiro Shimizu -profile: -lang: Japanese - - -# 調査目的 -* 先輩の修論の比較材料の為に行う -* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する - - -# 今週の進捗 -* scalaの入門書を斜め読みした -* akkaの公式チュートリアルを行った -* Graphでn入力1出力のアクターモデルが生成出来ることを調べた - * ドキュメントの例題を実行した - -# 調査内容 -* akkaのmac osx,ubuntu上の導入 -* [公式チュートリアル](https://developer.lightbend.com/guides/akka-quickstart-java/)の例題を行う -* 前回はJavaで実行した - * scalaで今回再調査を行いました - -# scala環境の構築 -* brewやaptで導入した -* scalaという名前のパッケージもあるが、sbtで導入する - * `~/.sbt` 以下のディレクトリにバージョンごと入る為、適切に処理しないと競合する - -# akkaでn入力の処理 -* [GraphDSL](https://doc.akka.io/docs/akka/current/stream/stream-graphs.html?language=scala#constructing-graphs)系の命令を利用すると実行可能 -* [Github上の別のサンプル](https://github.com/pkinsky/akka-streams-example) - -# 出力系 -* Broadcast[T] - * (1input N output) 1入力に対して全てのoutputに渡す -* Balance[T] - * (1input N outputs) outputを1つ指定して出力をする -* unzipWith[In,A,B..] - * 関数を受取,20までの各要素に対して実行する -* unZip[A,B] - * Tupleを分割して、2つのoutputに対して送る - -# input系 -* Merge[In] -* MergePreferred[In] -* MergePrioritized[In] -* ZipWith[A,B,...,Out] -* Zip[A,B] -* Concat[A] - -# チュートリアル - -```scala -package merger - -import akka.NotUsed -import akka.actor.ActorSystem -import akka.routing.Broadcast -import akka.stream.{ClosedShape, OverflowStrategy} -import akka.stream.scaladsl.{Flow, GraphDSL, Merge, RunnableGraph, Sink, Source} - - -object merger extends App { - val system: ActorSystem = ActorSystem("mergeAkka") - - val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] => - import GraphDSL.Implicits._ - val in = Source(1 to 10) - val out = Sink.ignore - - val bcast = builder.add(Broadcast[Int](2)) - val merge = builder.add(Merge[Int](2)) - - val f1, f2, f3, f4 = Flow[Int].map(_ + 10) - - in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out - bcast ~> f4 ~> merge - ClosedShape - }) - -} - -``` - -# 詰まっている所 - -* 公式のサンプルコードを動かそうとすると型エラーが発生する -* コンパニオンオブジェクトの書き方があまり理解できていない
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/20180116/slide.md Fri Jan 26 14:34:14 2018 +0900 @@ -0,0 +1,254 @@ +title: 分散フレームワークakkaの調査 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 調査目的 +* 先輩の修論の比較材料の為に行う +* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する + +# 調査内容 +* akkaのmac osx,ubuntu上の導入 +* [公式チュートリアル](https://developer.lightbend.com/guides/akka-quickstart-java/)の例題を行う +* 今回はJavaで実行した + +# 環境構築 + +* 公式からzipファイルで提供されているので落とす +* 例題はGradleで実行できるように作成されているので `$ gradle run` を実行可能. + +# akkaの分散処理 + +* akkaはアクターモデルを採用したフレームワーク + * アクターモデルでは「アクター」と呼ばれるオブジェクト同士がメッセージ通信を行うことで並列処理を実現する(イベント・ドリブン) + * publicなAPIを持っていない為,強力な分離機能を持っており、複数のJVMなどでも連携可能 + * 環境透過性 + * 軽量 +* JVM上で動き、ScalaとJavaをサポートしている + +# 例題(Hello,World) + +* 今回は公式チュートリアルにある、複数のアクターが挨拶をするHello Worldの例題を実行する +* <img src="https://developer.lightbend.com/guides/akka-quickstart-java/images/hello-akka-architecture.png"> + +* 実行結果 + +``` +$ gradle run +Starting a Gradle Daemon (subsequent builds will be faster) + + > Task :run + >>> Press ENTER to exit <<< + [INFO] [01/16/2018 15:33:05.871] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Howdy, Akka + [INFO] [01/16/2018 15:33:05.872] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Howdy, Lightbend + [INFO] [01/16/2018 15:33:05.872] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Good day, Play + [INFO] [01/16/2018 15:33:05.872] [helloakka-akka.actor.default-dispatcher-4] [akka://helloakka/user/printerActor] Hello, Java +``` + +# Hello World Actors + +* 例題のActorrは3種類のmessageを利用する + +* `WhoToGreet` + * greetingの受取用オブジェクト +* `Greet` + * greetingの実行用 +* `Greeting` + * `greeting`にメッセージを含める為の命令 + +* 複数のスレッドで共有をする必要がある為、メッセージはimmutableでなければならない + + +# Greeter Actor + +* `Greeter` のコンストラクタは、送信用メッセージと出力用のActorのリファレンスを必要とする +* mainの中ではGreeterは複数呼ばれている + +``` +package com.lightbend.akka.sample; + +import akka.actor.AbstractActor; +import akka.actor.ActorRef; +import akka.actor.Props; +import com.lightbend.akka.sample.Printer.Greeting; + +public class Greeter extends AbstractActor { + static public Props props(String message, ActorRef printerActor) { + return Props.create(Greeter.class, () -> new Greeter(message, printerActor)); + } + + static public class WhoToGreet { + public final String who; + + public WhoToGreet(String who) { + this.who = who; + } + } + + static public class Greet { + public Greet() { + } + } + + private final String message; + private final ActorRef printerActor; + private String greeting = ""; + + public Greeter(String message, ActorRef printerActor) { + this.message = message; + this.printerActor = printerActor; + } + + @Override + public Receive createReceive() { + return receiveBuilder() + .match(WhoToGreet.class, wtg -> { + this.greeting = message + ", " + wtg.who; + }) + .match(Greet.class, x -> { + printerActor.tell(new Greeting(greeting), getSelf()); + }) + .build(); + } +} +``` + +# Printer Actor + +* `Logging.getLogger(getContext().getSystem(), this);` で各Actorが `log.info()` に追記していく +* `Greeting` とlogsに対してhandleを所持している + +``` +package com.lightbend.akka.sample; + +import akka.actor.AbstractActor; +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.event.Logging; +import akka.event.LoggingAdapter; + +public class Printer extends AbstractActor { + static public Props props() { + return Props.create(Printer.class, () -> new Printer()); + } + + static public class Greeting { + public final String message; + + public Greeting(String message) { + this.message = message; + } + } + + private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); + + public Printer() { + } + + @Override + public Receive createReceive() { + return receiveBuilder() + .match(Greeting.class, greeting -> { + log.info(greeting.message); + }) + .build(); + } +} +``` + + +# Actorを作る + +* akkaはインスタンスを作る際に `new` を使わない。これはakkaのインスタンスがリファレンスである為 (`akka.actor.ActorRef`)である。 + * その為、軽量かつ柔軟にシステムに組み込むことが可能である +* akkaのActorは `akka.actor.ActorSystem` が管理する。(factoryなどとも呼ばれる) +* 例題では次のようにakkaのインスタンスを作成している。 + +``` +public class AkkaQuickstart { + public static void main(String[] args) { + final ActorSystem system = ActorSystem.create("helloakka"); + try { + //#create-actors + final ActorRef printerActor = + system.actorOf(Printer.props(), "printerActor"); + final ActorRef howdyGreeter = + system.actorOf(Greeter.props("Howdy", printerActor), "howdyGreeter"); + final ActorRef helloGreeter = + system.actorOf(Greeter.props("Hello", printerActor), "helloGreeter"); + final ActorRef goodDayGreeter = + system.actorOf(Greeter.props("Good day", printerActor), "goodDayGreeter"); + //#create-actors +``` + +# メッセージ送信 + +* akkaのメッセージ送信は `ActorRef`の`tell`メソッドを呼ぶ。 + +``` +howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); +howdyGreeter.tell(new Greet(), ActorRef.noSender()); + +howdyGreeter.tell(new WhoToGreet("Lightbend"), ActorRef.noSender()); +howdyGreeter.tell(new Greet(), ActorRef.noSender()); + +helloGreeter.tell(new WhoToGreet("Java"), ActorRef.noSender()); +helloGreeter.tell(new Greet(), ActorRef.noSender()); + +goodDayGreeter.tell(new WhoToGreet("Play"), ActorRef.noSender()); +goodDayGreeter.tell(new Greet(), ActorRef.noSender()); +``` + +* `Greeter` Actrorは `Printer` Actorにメッセージを送信している + +``` +printerActor.tell(new Greeting(greeting), getSelf()); +``` + +# テスト + +* Javaで使われているのでテストはJUnitを利用できる +* akkaaでは `akka.test.javadsl.TestKit` が用意されており, TestKit が推奨されている。 +* 詳しくは[公式ドキュメント](https://doc.akka.io/docs/akka/current/testing.html?language=java)を見ろということらしい… + +``` +`ckage com.lightbend.akka.sample; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.testkit.javadsl.TestKit; +import com.lightbend.akka.sample.Greeter.*; +import com.lightbend.akka.sample.Printer.*; + +import static org.junit.Assert.assertEquals; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class AkkaQuickstartTest { + static ActorSystem system; + + @BeforeClass + public static void setup() { + system = ActorSystem.create(); + } + + @AfterClass + public static void teardown() { + TestKit.shutdownActorSystem(system); + system = null; + } + + @Test + public void testGreeterActorSendingOfGreeting() { + final TestKit testProbe = new TestKit(system); + final ActorRef helloGreeter = system.actorOf(Greeter.props("Hello", testProbe.getRef())); + helloGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); + helloGreeter.tell(new Greet(), ActorRef.noSender()); + Greeting greeting = testProbe.expectMsgClass(Greeting.class); + assertEquals("Hello, Akka", greeting.message); + } +} +```
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/20180123/slide.md Fri Jan 26 14:34:14 2018 +0900 @@ -0,0 +1,88 @@ +title: 分散フレームワークakkaの調査 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 調査目的 +* 先輩の修論の比較材料の為に行う +* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する + + +# 今週の進捗 +* scalaの入門書を斜め読みした +* akkaの公式チュートリアルを行った +* Graphでn入力1出力のアクターモデルが生成出来ることを調べた + * ドキュメントの例題を実行した + +# 調査内容 +* akkaのmac osx,ubuntu上の導入 +* [公式チュートリアル](https://developer.lightbend.com/guides/akka-quickstart-java/)の例題を行う +* 前回はJavaで実行した + * scalaで今回再調査を行いました + +# scala環境の構築 +* brewやaptで導入した +* scalaという名前のパッケージもあるが、sbtで導入する + * `~/.sbt` 以下のディレクトリにバージョンごと入る為、適切に処理しないと競合する + +# akkaでn入力の処理 +* [GraphDSL](https://doc.akka.io/docs/akka/current/stream/stream-graphs.html?language=scala#constructing-graphs)系の命令を利用すると実行可能 +* [Github上の別のサンプル](https://github.com/pkinsky/akka-streams-example) + +# 出力系 +* Broadcast[T] + * (1input N output) 1入力に対して全てのoutputに渡す +* Balance[T] + * (1input N outputs) outputを1つ指定して出力をする +* unzipWith[In,A,B..] + * 関数を受取,20までの各要素に対して実行する +* unZip[A,B] + * Tupleを分割して、2つのoutputに対して送る + +# input系 +* Merge[In] +* MergePreferred[In] +* MergePrioritized[In] +* ZipWith[A,B,...,Out] +* Zip[A,B] +* Concat[A] + +# チュートリアル + +```scala +package merger + +import akka.NotUsed +import akka.actor.ActorSystem +import akka.routing.Broadcast +import akka.stream.{ClosedShape, OverflowStrategy} +import akka.stream.scaladsl.{Flow, GraphDSL, Merge, RunnableGraph, Sink, Source} + + +object merger extends App { + val system: ActorSystem = ActorSystem("mergeAkka") + + val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] => + import GraphDSL.Implicits._ + val in = Source(1 to 10) + val out = Sink.ignore + + val bcast = builder.add(Broadcast[Int](2)) + val merge = builder.add(Merge[Int](2)) + + val f1, f2, f3, f4 = Flow[Int].map(_ + 10) + + in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out + bcast ~> f4 ~> merge + ClosedShape + }) + +} + +``` + +# 詰まっている所 + +* 公式のサンプルコードを動かそうとすると型エラーが発生する +* コンパニオンオブジェクトの書き方があまり理解できていない
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/20180126/slide.md Fri Jan 26 14:34:14 2018 +0900 @@ -0,0 +1,13 @@ +title: 分散フレームワークakkaの調査 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 調査目的 +* 先輩の修論の比較材料の為に行う +* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する + +# 今週の進捗 +* コンパイラと共通の課題をやっていました +* ゼミ資料を良い感じに作るスクリプトとかを組んでました