# HG changeset patch # User Takahiro SHIMIZU # Date 1522895679 -32400 # Node ID c0ec001d8a28f8b8dd36ad43ecd50afbdf894f77 # Parent 7143a82401fa35c5bd4f7355069e9302b81d57ad update diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180116/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180116/slide.md Thu Apr 05 11:34:39 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の例題を実行する +* + +* 実行結果 + +``` +$ 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); + } +} +``` diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180123/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180123/slide.md Thu Apr 05 11:34:39 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 + }) + +} + +``` + +# 詰まっている所 + +* 公式のサンプルコードを動かそうとすると型エラーが発生する +* コンパニオンオブジェクトの書き方があまり理解できていない diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180126/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180126/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,15 @@ +title: 分散フレームワークakkaの調査 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 調査目的 +* 先輩の修論の比較材料の為に行う +* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する + +# 今週の進捗 +* コンパイラと共通の課題をやっていました +* ゼミ資料を良い感じに作るスクリプトとかを組んでました + + diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180130/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180130/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,190 @@ +title: 分散フレームワークakkaの調査 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 調査目的 +* 先輩の修論の比較材料の為に行う +* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する + + +# 今週の進捗 +* ゼミ資料良い感じに作れる便利スクリプト作ってました +* akkaでインクリメトを行うプログラムを書いてました +* コンパイラ構成論も進めてました + +# akkaのインクリメント + +* akkaのインスタンスはprops経由で作成する +* 今回は1対1の通信なのでprops内には出力用のみ用意しました +* `system.terminate()` しないとsystemが動いたままになってしまう + +```scala +package IncrementSample + + +import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, Props, TypedActor} + + +object Incrementer { + def props(printerActor:ActorRef): Props = Props(new Incrementer(printerActor)) + + final case class SendData(data:Int) + final case class SetActor(actor:ActorRef) +} + +class Incrementer(printerActor: ActorRef) extends Actor { + import Incrementer._ + import Printer._ + + + var otherActor = ActorRef.noSender + val MAX_SIZE = 10 + + def receive = { + case SendData(data) => + printerActor ! Println(data.toString) + if (data < MAX_SIZE) { + val send_data = data + 1 + otherActor ! SendData(send_data) + } + case SetActor(actor :ActorRef) => + otherActor = actor + } +} + +object Printer { + def props: Props = Props[Printer] + + final case class Println(message: String) +} + +class Printer extends Actor with ActorLogging { + import Printer._ + + def receive = { + case Println(message) => + log.info(s"Printer received (from ${sender()} ): $message") + } +} + +object IncrementSample extends App { + + import Incrementer._ + + + val system: ActorSystem = ActorSystem("incrementSample") + + val printer: ActorRef = system.actorOf(Printer.props,"printerActor") + + val actorOne: ActorRef = system.actorOf(Incrementer.props(printer),"ActorOne") + val actorTwo: ActorRef = system.actorOf(Incrementer.props(printer),"ActorTwo") + + actorOne ! SetActor(actorTwo) + actorTwo ! SetActor(actorOne) + + val FIRST_DATA = 1 + + actorOne ! SendData(FIRST_DATA) + system.terminate() +} + +``` + + +# Incrementer + +* ActorRefの型の初期値が不明なので `ActorRef.noSender` でごまかす +* 別Actorに処理を投げる際は `otherActor ! Method` な書き方をする + * この際に `otherActor ! receive(Method)` と書くと自分自身を呼び出してしまう + +```scala +object Incrementer { + def props(printerActor:ActorRef): Props = Props(new Incrementer(printerActor)) + + final case class SendData(data:Int) + final case class SetActor(actor:ActorRef) +} + +class Incrementer(printerActor: ActorRef) extends Actor { + import Incrementer._ + import Printer._ + + + var otherActor = ActorRef.noSender + val MAX_SIZE = 10 + + def receive = { + case SendData(data) => + printerActor ! Println(data.toString) + if (data < MAX_SIZE) { + val send_data = data + 1 + otherActor ! SendData(send_data) + } + case SetActor(actor :ActorRef) => + otherActor = actor + } +} +``` + +# 実行結果 + +``` +/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=65202:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/e155730/Canossa/working/cr/akka/increment-sample/target/scala-2.12/classes:/Users/e155730/.sbt/boot/scala-2.12.4/lib/scala-library.jar:/Users/e155730/.ivy2/cache/org.scala-lang.modules/scala-java8-compat_2.12/bundles/scala-java8-compat_2.12-0.8.0.jar:/Users/e155730/.ivy2/cache/com.typesafe.akka/akka-testkit_2.12/jars/akka-testkit_2.12-2.5.3.jar:/Users/e155730/.ivy2/cache/com.typesafe.akka/akka-actor_2.12/jars/akka-actor_2.12-2.5.3.jar:/Users/e155730/.ivy2/cache/com.typesafe/config/bundles/config-1.3.1.jar IncrementSample.IncrementSample +[INFO] [01/29/2018 16:45:05.275] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 3 +[INFO] [01/29/2018 16:45:05.276] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 2 +[INFO] [01/29/2018 16:45:05.276] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 4 +[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 5 +[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 6 +[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 7 +[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 8 +[INFO] [01/29/2018 16:45:05.278] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 9 +[INFO] [01/29/2018 16:45:05.278] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 10 +[INFO] [01/29/2018 16:45:05.278] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): fin +``` + + +# テスト + +* Akkaの提供するTestKitライブラリを主に利用する +* actorを管理する `system` はTestKitがラップしたものを利用する +* またTestKitを利用するとシングルスレッドでakkaが処理を行うようになる +* Scalaテストは慣例でファイル名に `Specs`を含める(Scalaのテストフレームワークに由来) +* 出力テストを行う場合、出力を受け取るようのアクターを `TestPropbe()` で置き換えれば可能 + +``` + val printer: ActorRef = system.actorOf(Printer.props,"printerActor") +``` + +``` +val testProbe = TestProbe() +``` + +# Actorテスト + +* Actorの内部にアクセスしたい場合 `system.actorOf(Actor.props,"name)` の書き方ではなく +`TestActorRef()` にする +* TestActorでラップするとActor内部の値を参照できるらしい(出来なかった) + + + +``` + val actorOne: ActorRef = system.actorOf(Incrementer.props(printer),"ActorOne") + val actorTwo: ActorRef = system.actorOf(Incrementer.props(printer),"ActorTwo") +``` + +``` + val actorOne = TestActorRef(Incrementer.props(testProbe.ref),"ActorOne") + val actorTwo = TestActorRef(Incrementer.props(testProbe.ref),"ActorTwo") +``` + +# akkaのトポロジーサポート + +- 大城くんに投げてます +- Graphと呼ばれる構造なら出来そうな気はしますが、StackOverflowでは無理と言われていた + +# akkaのデータ圧縮 + +* akkaのstreamの[akka.stream.scaladsl.Compression](https://doc.akka.io/docs/akka/current/stream/stream-cookbook.html?language=scala#dealing-with-compressed-data-streams)でデータ圧縮が可能 +* scala版の[API](https://doc.akka.io/api/akka/current/akka/stream/scaladsl/Compression$.html) diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180213/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180213/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,25 @@ +title: 近況報告 +author: Takahiro Shimizu +profile: +lang: Japanese + +# 研究目的 + +- そろそろ研究目的/内容を考えていこうと思っています +- 興味はOS/言語です + - 春休みにCbC読みたいので先輩お願いします +- ちなみに明日は誕生日です + +# 近況報告 + +- コンパイラ構成論でインタプリタを拡張してました + - 配列を実装してみました +- `ie-docker`のループバックデバイスの容量を拡張しました + + +``` + % fallocate -l $((1024*1024*1024*1024)) /mnt/whisky/os/docker/devicemapper/devicemapper/data + % resize2fs /mnt/whisky/os/docker/devicemapper/devicemapper/data +``` + +- おどろきの `s/100GB/1TB/` diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180306/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180306/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,28 @@ +title: 近況報告 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 近況報告 + +* YAPC成功しました + * 当日と前日はTwitterアカウントの中の人やってました + * 新屋さんのセッションがインターネット見てる限り好評でした + * ちなみに懇親会では80Lの🍺が売り切れました + +* 単位が残り研究実験だけとなりました + +# 今週の進捗 + +* 先生とllvmの `tail` callが呼ばれない問題について見ていました + * llvmを久々に呼んでました +* 今日はgccCbCの環境付きのジャンプが呼ばれない問題について検証してました + +# 研究分野について + +* OSかコンパイラやりたいと思ってます +* 今はVMと言語機能的なVMに興味があります +* CbC/Gearsについてはあまり良くわかってないです + + diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180325/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180325/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,12 @@ +title: 近況報告 +author: Takahiro Shimizu +profile: +lang: Japanese + + +# 研究内容 +* OS + +# hoge +* foo + * puyo diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180327/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180327/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,14 @@ +title: 近況報告 +author: Takahiro Shimizu +profile: +lang: Japanese + +# 近況報告 + +* バイトでRubyを書いたりしています +* x86エミュレータを作る本を読み始めました + +# 研究内容 + +* 個人的にはOSか言語系がやりたいと思っています +* VMを作る作業に興味があります diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180327/text --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180327/text Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,17 @@ +- 命令のごとCodeGearを書けば良さそう +- PS3の + +命令レベルで並列度を追求する->4並列が最大 +byte codeレベルにあげた場合は不明 + +スクリプトは必ずなんらかのループが持っている + -> それを高速化させたい + +OpenMP的に指示子をいれるのを自動化したい + -> CbCのメタ部で処理したい + +OpenMPIはAssemblerレベルなので厳しい +どんなに早い通信路でも4Mbにしか締め切られない + +- MoarVMをイメージ化する + diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180403/memo.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180403/memo.txt Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,18 @@ +- モデル検査 + - 実際に処理をしている箇所は? + - 並列実行をしている箇所を選択する + - Synchronized Queue + +- 方針 + - 使える部分だけCbCに書き換える + - 完全にGearsの形式に書き換える + +- CbCで書き直したxv6も同じ方式で行っている +- 帯域変数は入力で持ってくる,出力で出すという雰囲気 + +- PWDを環境変数に持たせると途中のディレクトリパスが異なる可能性がある + - syscallにすると途中のパスをuserdirに保存する + +- UEFI + - OSの立ち上げ時のBaseとなる部分 + diff -r 7143a82401fa -r c0ec001d8a28 slides/2018/20180403/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides/2018/20180403/slide.md Thu Apr 05 11:34:39 2018 +0900 @@ -0,0 +1,181 @@ +title: 近況報告 +author: Takahiro Shimizu +profile: +lang: Japanese + +# 今週の進捗 + +- xv6をcloneして読み始めました + - [Xv6, a simple Unix-like teaching operating system](https://pdos.csail.mit.edu/6.828/2017/xv6.html) +- 教科書もありました + - [xv6 a simple, Unix-like teaching operating system](https://pdos.csail.mit.edu/6.828/2017/xv6/book-rev10.pdf) +- 木金で読み会をやる予定です + +# systemcall + +- `user.h` `usys.S`でそれぞれ定義されていました + +```c +// system calls +int fork(void); +int exit(void) __attribute__((noreturn)); +int wait(void); +int pipe(int*); +int write(int, void*, int); +int read(int, void*, int); +int close(int); +int kill(int); +int exec(char*, char**); +int open(char*, int); +int mknod(char*, short, short); +int unlink(char*); +int fstat(int fd, struct stat*); +int link(char*, char*); +int mkdir(char*); +int chdir(char*); +int dup(int); +int getpid(void); +char* sbrk(int); +int sleep(int); +int uptime(void); +``` + +# printf + +- printfは `%d, %x, %p, %s.` のみをサポートしています +- コンパイラ構成論で書いたような素朴な実装でした +- print時の進数は `printint` の引数で分けているようです + +```c +void +printf(int fd, char *fmt, ...) +{ + char *s; + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for(i = 0; fmt[i]; i++){ + c = fmt[i] & 0xff; + if(state == 0){ + if(c == '%'){ + state = '%'; + } else { + putc(fd, c); + } + } else if(state == '%'){ + if(c == 'd'){ + printint(fd, *ap, 10, 1); + ap++; + } else if(c == 'x' || c == 'p'){ + printint(fd, *ap, 16, 0); + ap++; + } else if(c == 's'){ + s = (char*)*ap; + ap++; + if(s == 0) + s = "(null)"; + while(*s != 0){ + putc(fd, *s); + s++; + } + } else if(c == 'c'){ + putc(fd, *ap); + ap++; + } else if(c == '%'){ + putc(fd, c); + } else { + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } + state = 0; + } + } +} +``` + +# sysemcallを呼ぶ前 + +- まだ処理が追いきれていません。 + +``` +static void +printint(int fd, int xx, int base, int sgn) +{ + static char digits[] = "0123456789ABCDEF"; + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + neg = 1; + x = -xx; + } else { + x = xx; + } + + i = 0; + do{ + buf[i++] = digits[x % base]; + }while((x /= base) != 0); + if(neg) + buf[i++] = '-'; + + while(--i >= 0) + putc(fd, buf[i]); +} +``` + +# putc + +- 素朴にwriteを読んでいる + +``` +static void +putc(int fd, char c) +{ + write(fd, &c, 1); +} + +``` + +# sh + +- main関数 +- まずforkが入る +- cd以外はparseしてrunする世界観のようです + +```C +int +main(void) +{ + static char buf[100]; + int fd; + + // Ensure that three file descriptors are open. + while((fd = open("console", O_RDWR)) >= 0){ + if(fd >= 3){ + close(fd); + break; + } + } + + // Read and run input commands. + while(getcmd(buf, sizeof(buf)) >= 0){ + if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){ + // Chdir must be called by the parent, not the child. + buf[strlen(buf)-1] = 0; // chop \n + if(chdir(buf+3) < 0) + printf(2, "cannot cd %s\n", buf+3); + continue; + } + if(fork1() == 0) + runcmd(parsecmd(buf)); + wait(); + } + exit(); +} +``` diff -r 7143a82401fa -r c0ec001d8a28 slides/20180116/slide.md --- a/slides/20180116/slide.md Thu Apr 05 11:30:03 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の例題を実行する -* - -* 実行結果 - -``` -$ 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); - } -} -``` diff -r 7143a82401fa -r c0ec001d8a28 slides/20180123/slide.md --- a/slides/20180123/slide.md Thu Apr 05 11:30:03 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 - }) - -} - -``` - -# 詰まっている所 - -* 公式のサンプルコードを動かそうとすると型エラーが発生する -* コンパニオンオブジェクトの書き方があまり理解できていない diff -r 7143a82401fa -r c0ec001d8a28 slides/20180126/slide.md --- a/slides/20180126/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -title: 分散フレームワークakkaの調査 -author: Takahiro Shimizu -profile: -lang: Japanese - - -# 調査目的 -* 先輩の修論の比較材料の為に行う -* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する - -# 今週の進捗 -* コンパイラと共通の課題をやっていました -* ゼミ資料を良い感じに作るスクリプトとかを組んでました - - diff -r 7143a82401fa -r c0ec001d8a28 slides/20180130/slide.md --- a/slides/20180130/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -title: 分散フレームワークakkaの調査 -author: Takahiro Shimizu -profile: -lang: Japanese - - -# 調査目的 -* 先輩の修論の比較材料の為に行う -* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する - - -# 今週の進捗 -* ゼミ資料良い感じに作れる便利スクリプト作ってました -* akkaでインクリメトを行うプログラムを書いてました -* コンパイラ構成論も進めてました - -# akkaのインクリメント - -* akkaのインスタンスはprops経由で作成する -* 今回は1対1の通信なのでprops内には出力用のみ用意しました -* `system.terminate()` しないとsystemが動いたままになってしまう - -```scala -package IncrementSample - - -import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, Props, TypedActor} - - -object Incrementer { - def props(printerActor:ActorRef): Props = Props(new Incrementer(printerActor)) - - final case class SendData(data:Int) - final case class SetActor(actor:ActorRef) -} - -class Incrementer(printerActor: ActorRef) extends Actor { - import Incrementer._ - import Printer._ - - - var otherActor = ActorRef.noSender - val MAX_SIZE = 10 - - def receive = { - case SendData(data) => - printerActor ! Println(data.toString) - if (data < MAX_SIZE) { - val send_data = data + 1 - otherActor ! SendData(send_data) - } - case SetActor(actor :ActorRef) => - otherActor = actor - } -} - -object Printer { - def props: Props = Props[Printer] - - final case class Println(message: String) -} - -class Printer extends Actor with ActorLogging { - import Printer._ - - def receive = { - case Println(message) => - log.info(s"Printer received (from ${sender()} ): $message") - } -} - -object IncrementSample extends App { - - import Incrementer._ - - - val system: ActorSystem = ActorSystem("incrementSample") - - val printer: ActorRef = system.actorOf(Printer.props,"printerActor") - - val actorOne: ActorRef = system.actorOf(Incrementer.props(printer),"ActorOne") - val actorTwo: ActorRef = system.actorOf(Incrementer.props(printer),"ActorTwo") - - actorOne ! SetActor(actorTwo) - actorTwo ! SetActor(actorOne) - - val FIRST_DATA = 1 - - actorOne ! SendData(FIRST_DATA) - system.terminate() -} - -``` - - -# Incrementer - -* ActorRefの型の初期値が不明なので `ActorRef.noSender` でごまかす -* 別Actorに処理を投げる際は `otherActor ! Method` な書き方をする - * この際に `otherActor ! receive(Method)` と書くと自分自身を呼び出してしまう - -```scala -object Incrementer { - def props(printerActor:ActorRef): Props = Props(new Incrementer(printerActor)) - - final case class SendData(data:Int) - final case class SetActor(actor:ActorRef) -} - -class Incrementer(printerActor: ActorRef) extends Actor { - import Incrementer._ - import Printer._ - - - var otherActor = ActorRef.noSender - val MAX_SIZE = 10 - - def receive = { - case SendData(data) => - printerActor ! Println(data.toString) - if (data < MAX_SIZE) { - val send_data = data + 1 - otherActor ! SendData(send_data) - } - case SetActor(actor :ActorRef) => - otherActor = actor - } -} -``` - -# 実行結果 - -``` -/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=65202:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/e155730/Canossa/working/cr/akka/increment-sample/target/scala-2.12/classes:/Users/e155730/.sbt/boot/scala-2.12.4/lib/scala-library.jar:/Users/e155730/.ivy2/cache/org.scala-lang.modules/scala-java8-compat_2.12/bundles/scala-java8-compat_2.12-0.8.0.jar:/Users/e155730/.ivy2/cache/com.typesafe.akka/akka-testkit_2.12/jars/akka-testkit_2.12-2.5.3.jar:/Users/e155730/.ivy2/cache/com.typesafe.akka/akka-actor_2.12/jars/akka-actor_2.12-2.5.3.jar:/Users/e155730/.ivy2/cache/com.typesafe/config/bundles/config-1.3.1.jar IncrementSample.IncrementSample -[INFO] [01/29/2018 16:45:05.275] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 3 -[INFO] [01/29/2018 16:45:05.276] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 2 -[INFO] [01/29/2018 16:45:05.276] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 4 -[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 5 -[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 6 -[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 7 -[INFO] [01/29/2018 16:45:05.277] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 8 -[INFO] [01/29/2018 16:45:05.278] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): 9 -[INFO] [01/29/2018 16:45:05.278] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/FooActor#-1325429432] ): 10 -[INFO] [01/29/2018 16:45:05.278] [incrementSample-akka.actor.default-dispatcher-5] [akka://incrementSample/user/printerActor] Printer received (from Actor[akka://incrementSample/user/HogeActor#-884834315] ): fin -``` - - -# テスト - -* Akkaの提供するTestKitライブラリを主に利用する -* actorを管理する `system` はTestKitがラップしたものを利用する -* またTestKitを利用するとシングルスレッドでakkaが処理を行うようになる -* Scalaテストは慣例でファイル名に `Specs`を含める(Scalaのテストフレームワークに由来) -* 出力テストを行う場合、出力を受け取るようのアクターを `TestPropbe()` で置き換えれば可能 - -``` - val printer: ActorRef = system.actorOf(Printer.props,"printerActor") -``` - -``` -val testProbe = TestProbe() -``` - -# Actorテスト - -* Actorの内部にアクセスしたい場合 `system.actorOf(Actor.props,"name)` の書き方ではなく -`TestActorRef()` にする -* TestActorでラップするとActor内部の値を参照できるらしい(出来なかった) - - - -``` - val actorOne: ActorRef = system.actorOf(Incrementer.props(printer),"ActorOne") - val actorTwo: ActorRef = system.actorOf(Incrementer.props(printer),"ActorTwo") -``` - -``` - val actorOne = TestActorRef(Incrementer.props(testProbe.ref),"ActorOne") - val actorTwo = TestActorRef(Incrementer.props(testProbe.ref),"ActorTwo") -``` - -# akkaのトポロジーサポート - -- 大城くんに投げてます -- Graphと呼ばれる構造なら出来そうな気はしますが、StackOverflowでは無理と言われていた - -# akkaのデータ圧縮 - -* akkaのstreamの[akka.stream.scaladsl.Compression](https://doc.akka.io/docs/akka/current/stream/stream-cookbook.html?language=scala#dealing-with-compressed-data-streams)でデータ圧縮が可能 -* scala版の[API](https://doc.akka.io/api/akka/current/akka/stream/scaladsl/Compression$.html) diff -r 7143a82401fa -r c0ec001d8a28 slides/20180213/slide.md --- a/slides/20180213/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -title: 近況報告 -author: Takahiro Shimizu -profile: -lang: Japanese - -# 研究目的 - -- そろそろ研究目的/内容を考えていこうと思っています -- 興味はOS/言語です - - 春休みにCbC読みたいので先輩お願いします -- ちなみに明日は誕生日です - -# 近況報告 - -- コンパイラ構成論でインタプリタを拡張してました - - 配列を実装してみました -- `ie-docker`のループバックデバイスの容量を拡張しました - - -``` - % fallocate -l $((1024*1024*1024*1024)) /mnt/whisky/os/docker/devicemapper/devicemapper/data - % resize2fs /mnt/whisky/os/docker/devicemapper/devicemapper/data -``` - -- おどろきの `s/100GB/1TB/` diff -r 7143a82401fa -r c0ec001d8a28 slides/20180306/slide.md --- a/slides/20180306/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -title: 近況報告 -author: Takahiro Shimizu -profile: -lang: Japanese - - -# 近況報告 - -* YAPC成功しました - * 当日と前日はTwitterアカウントの中の人やってました - * 新屋さんのセッションがインターネット見てる限り好評でした - * ちなみに懇親会では80Lの🍺が売り切れました - -* 単位が残り研究実験だけとなりました - -# 今週の進捗 - -* 先生とllvmの `tail` callが呼ばれない問題について見ていました - * llvmを久々に呼んでました -* 今日はgccCbCの環境付きのジャンプが呼ばれない問題について検証してました - -# 研究分野について - -* OSかコンパイラやりたいと思ってます -* 今はVMと言語機能的なVMに興味があります -* CbC/Gearsについてはあまり良くわかってないです - - diff -r 7143a82401fa -r c0ec001d8a28 slides/20180325/slide.md --- a/slides/20180325/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -title: 近況報告 -author: Takahiro Shimizu -profile: -lang: Japanese - - -# 研究内容 -* OS - -# hoge -* foo - * puyo diff -r 7143a82401fa -r c0ec001d8a28 slides/20180327/slide.md --- a/slides/20180327/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -title: 近況報告 -author: Takahiro Shimizu -profile: -lang: Japanese - -# 近況報告 - -* バイトでRubyを書いたりしています -* x86エミュレータを作る本を読み始めました - -# 研究内容 - -* 個人的にはOSか言語系がやりたいと思っています -* VMを作る作業に興味があります diff -r 7143a82401fa -r c0ec001d8a28 slides/20180327/text --- a/slides/20180327/text Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -- 命令のごとCodeGearを書けば良さそう -- PS3の - -命令レベルで並列度を追求する->4並列が最大 -byte codeレベルにあげた場合は不明 - -スクリプトは必ずなんらかのループが持っている - -> それを高速化させたい - -OpenMP的に指示子をいれるのを自動化したい - -> CbCのメタ部で処理したい - -OpenMPIはAssemblerレベルなので厳しい -どんなに早い通信路でも4Mbにしか締め切られない - -- MoarVMをイメージ化する - diff -r 7143a82401fa -r c0ec001d8a28 slides/20180403/memo.txt --- a/slides/20180403/memo.txt Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -- モデル検査 - - 実際に処理をしている箇所は? - - 並列実行をしている箇所を選択する - - Synchronized Queue - -- 方針 - - 使える部分だけCbCに書き換える - - 完全にGearsの形式に書き換える - -- CbCで書き直したxv6も同じ方式で行っている -- 帯域変数は入力で持ってくる,出力で出すという雰囲気 - -- PWDを環境変数に持たせると途中のディレクトリパスが異なる可能性がある - - syscallにすると途中のパスをuserdirに保存する - -- UEFI - - OSの立ち上げ時のBaseとなる部分 - diff -r 7143a82401fa -r c0ec001d8a28 slides/20180403/slide.md --- a/slides/20180403/slide.md Thu Apr 05 11:30:03 2018 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -title: 近況報告 -author: Takahiro Shimizu -profile: -lang: Japanese - -# 今週の進捗 - -- xv6をcloneして読み始めました - - [Xv6, a simple Unix-like teaching operating system](https://pdos.csail.mit.edu/6.828/2017/xv6.html) -- 教科書もありました - - [xv6 a simple, Unix-like teaching operating system](https://pdos.csail.mit.edu/6.828/2017/xv6/book-rev10.pdf) -- 木金で読み会をやる予定です - -# systemcall - -- `user.h` `usys.S`でそれぞれ定義されていました - -```c -// system calls -int fork(void); -int exit(void) __attribute__((noreturn)); -int wait(void); -int pipe(int*); -int write(int, void*, int); -int read(int, void*, int); -int close(int); -int kill(int); -int exec(char*, char**); -int open(char*, int); -int mknod(char*, short, short); -int unlink(char*); -int fstat(int fd, struct stat*); -int link(char*, char*); -int mkdir(char*); -int chdir(char*); -int dup(int); -int getpid(void); -char* sbrk(int); -int sleep(int); -int uptime(void); -``` - -# printf - -- printfは `%d, %x, %p, %s.` のみをサポートしています -- コンパイラ構成論で書いたような素朴な実装でした -- print時の進数は `printint` の引数で分けているようです - -```c -void -printf(int fd, char *fmt, ...) -{ - char *s; - int c, i, state; - uint *ap; - - state = 0; - ap = (uint*)(void*)&fmt + 1; - for(i = 0; fmt[i]; i++){ - c = fmt[i] & 0xff; - if(state == 0){ - if(c == '%'){ - state = '%'; - } else { - putc(fd, c); - } - } else if(state == '%'){ - if(c == 'd'){ - printint(fd, *ap, 10, 1); - ap++; - } else if(c == 'x' || c == 'p'){ - printint(fd, *ap, 16, 0); - ap++; - } else if(c == 's'){ - s = (char*)*ap; - ap++; - if(s == 0) - s = "(null)"; - while(*s != 0){ - putc(fd, *s); - s++; - } - } else if(c == 'c'){ - putc(fd, *ap); - ap++; - } else if(c == '%'){ - putc(fd, c); - } else { - // Unknown % sequence. Print it to draw attention. - putc(fd, '%'); - putc(fd, c); - } - state = 0; - } - } -} -``` - -# sysemcallを呼ぶ前 - -- まだ処理が追いきれていません。 - -``` -static void -printint(int fd, int xx, int base, int sgn) -{ - static char digits[] = "0123456789ABCDEF"; - char buf[16]; - int i, neg; - uint x; - - neg = 0; - if(sgn && xx < 0){ - neg = 1; - x = -xx; - } else { - x = xx; - } - - i = 0; - do{ - buf[i++] = digits[x % base]; - }while((x /= base) != 0); - if(neg) - buf[i++] = '-'; - - while(--i >= 0) - putc(fd, buf[i]); -} -``` - -# putc - -- 素朴にwriteを読んでいる - -``` -static void -putc(int fd, char c) -{ - write(fd, &c, 1); -} - -``` - -# sh - -- main関数 -- まずforkが入る -- cd以外はparseしてrunする世界観のようです - -```C -int -main(void) -{ - static char buf[100]; - int fd; - - // Ensure that three file descriptors are open. - while((fd = open("console", O_RDWR)) >= 0){ - if(fd >= 3){ - close(fd); - break; - } - } - - // Read and run input commands. - while(getcmd(buf, sizeof(buf)) >= 0){ - if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){ - // Chdir must be called by the parent, not the child. - buf[strlen(buf)-1] = 0; // chop \n - if(chdir(buf+3) < 0) - printf(2, "cannot cd %s\n", buf+3); - continue; - } - if(fork1() == 0) - runcmd(parsecmd(buf)); - wait(); - } - exit(); -} -```