# HG changeset patch # User Nozomi Teruya # Date 1517195519 -32400 # Node ID 528fca1998278e5c4a78f2c8fa3734104b4293d3 # Parent 9c1b9562f44138a6533979f4329959c9447204cf add some source diff -r 9c1b9562f441 -r 528fca199827 paper/nozomi-master.pdf Binary file paper/nozomi-master.pdf has changed diff -r 9c1b9562f441 -r 528fca199827 paper/nozomi-master.tex --- a/paper/nozomi-master.tex Mon Jan 29 01:16:03 2018 +0900 +++ b/paper/nozomi-master.tex Mon Jan 29 12:11:59 2018 +0900 @@ -493,6 +493,7 @@ \section{APIの改善} \subsection{TAKE/PEEK} +InputAPIにはAliceと同じくTakeとPeekを用意した。 ChristieではInput DG の指定にはAnnotationを使う。 Annotationとは、Javaのクラスやメソッド、パッケージに対して付加情報を記述できる機能である。 先頭に@をつけることで記述でき、オリジナルのAnnotationを定義することもできる。 @@ -500,31 +501,68 @@ AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 ChristieではInputのためのDGを作り、その上にAnnotationでKeyを指定する(\ref{src:take})。 -\lstinputlisting[label=src:take, caption=TAKEの例]{source/christie/InputDG.java} +\lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java} Annotationで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 これにはJavaのreflectionAPIを利用している。 +Annotationの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 -そのため、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かる。 -また、取得してきたDGが指定と違う型であった場合エラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 +DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、<>内に指定した型でデータの型を限定できる。 +このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。 +また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 -%Aliceではkeyと変数名の不一致から可読性が低くなっていた。しかし -%JavaのメタプログラミングAPIであるjavassistを用いてAnnotationから変数の自動生成も試みたが、javassistでは ため、実現できなかった。 +また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。 +しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。 +この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてAnnotationから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 + -%リモートノードに対してTAKEする際は、REMOTETAKEのAnnotationを用いる。 -%LocalかRemoteかはAnnotationが違うためひと目でわかる -%例 +リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのAnnotationを用いる(\ref{src:remotetake})。 +そのため待ち合わせ先がLocalかRemoteかはAnnotationの違いからひと目でわかるようになった。 + +\lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java} -%なお、圧縮を指定する際はAlice同様dgm名の前にcompressedをつける。Localでの圧縮は基本想定していない。しかし、RemoteTakeで間接的にすることは可能である。 +なお、圧縮を指定する際はAlice同様DGM名の前にcompressedをつける。 +LocalからのTAKEではDGM名の指定がないが、それはLocalでの圧縮は基本想定していないためである。 +しかし、Localでの圧縮をしようと思えばRemoteTakeを用いて間接的にすることは可能である(\ref{src:compresslocal})。 + +\lstinputlisting[label=src:compresslocal, caption=Localへの圧縮の指定の例]{source/christie/CompressLocal.java} + + \subsection{PUT/FLIP} -%odsはない。dsmを指定して直接putする。 +OutputAPIにはput/flipを用意した。 +put/flipのメソッドはDGMに用意されている。 +CodeGear.classにはDGMを取得するメソッドがあり、それを用いて書き込みたいDGMを指定して直接putする。 +そのためLocal/Remoteの切り替えはDGMの切り替えによって行う。 +ソースコード\ref{src:put}、\ref{src:remoteput}はLocalとRemoteにputする記述の例である。 + +\lstinputlisting[label=src:put, caption=Localへputする例]{source/christie/Put.java} +\lstinputlisting[label=src:remoteput, caption=Remoteへputする例]{source/christie/RemotePut.java} + +flipも同様にDGMに直接DGを渡す(\ref{src:flip})。 + +\lstinputlisting[label=src:flip, caption=Remoteへflipする例]{source/christie/Flip.java} + + +ChristieではDGMに対して直接putするため、AliceのODSにあたる部分はない。 +ODSを経由するより直接DGMに書き込むような記述のほうが直感的であると考えたためである。 + + \subsection{getData()} -%asClassに相当 -%InputDGで指定した型は内部で保存され、通信先でも保存される。getDataで正しい型でとれる。 +AliceのasClassに相当するのがgetDataである。 +ソースコード\ref{src:getdata}はgetDataを用いてInputDGからデータを取得する例である。 + +\lstinputlisting[label=src:getdata, caption=getDataの例]{source/christie/GetData.java} + +Aliceと違う点は、プログラマが型を指定しなくて良い点である。 +4.2.1で示したように、InputDGを生成する際には型を指定する。 +この型は内部で保存され、リモートノードと通信する際も保たれる。 +このようにgetDataするだけでプログラマが指定しなくとも正しい型で取得できるため、プログラマの負担を減らし信頼性を保証することができる。 + + \section{CodeGearの記述方法} %以下のコードはLocalDSMにputした @@ -534,13 +572,23 @@ %CGを作るときはsetup。AliceではnewすればCGが待ちに入ったが、Annotationの処理を挟むには一度newしておかなければならないため、Christieではnewの後setupをして待ち合わせの処理を行う。 + + \section{DataGearManagerの複数立ち上げ} %CGMを2つつくればLocalが2つ作られる。Remoteへの接続と同じようにすれば良い + + \section{DataGearの拡張} -%別のclassに分けている。DataGearを継承したMessagePackDataGearと、それを更に継承したCompressedDataGearを用意した。 -%そのため、どの形式をもっているかクラスを見るだけでわかるようになった +Aliceではデータの多態性を実現するためにDS内に複数のデータ形式を保持していた。 +しかしChristieではデータ形式ごとに別のclassに分けている。 +DataGearを継承したMessagePackDataGearと、それを更に継承したCompressedDataGearを用意した。 +そのため子クラスは親クラスのデータ形式を保持しながら新しいデータ形式を持つ形になっている。 +クラスを見るだけで今どの形式を保持しているかわかるようになったため、デバッグがしやすくなった。 + + + \chapter{Christieの評価} \section{Akka} diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/CompressLocal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/CompressLocal.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,2 @@ +@RemoteTake(dsmName = "compressedlocal", key = "count") +public DataGear count = new DataGear<>(); diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/Flip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/Flip.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,10 @@ +public class Flip extends CodeGear { + + @RemoteTake(dgmName = "remote1", key = "name") + public DataGear name = new DataGear<>(); + + @Override + protected void run(CodeGearManager cgm) { + getDGM("remote2").put("name", name); + } +} diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/GetData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/GetData.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,10 @@ +public class GetData extends CodeGear{ + + @Take("name") + public DataGear name = new DataGear<>(); + + @Override + protected void run(CodeGearManager cgm) { + System.out.println("this name is : " + name.getData()); + } +} diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/InputDG.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/InputDG.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,2 @@ +@Take("count") +public DataGear count = new DataGear<>(); diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/Put.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/Put.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,1 @@ +getLocalDGM().put("count", 1); diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/RemoteInputDG.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/RemoteInputDG.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,2 @@ +@RemoteTake(dgmName = "remote", key = "count") +public DataGear count = new DataGear<>(); diff -r 9c1b9562f441 -r 528fca199827 paper/source/christie/RemotePut.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/RemotePut.java Mon Jan 29 12:11:59 2018 +0900 @@ -0,0 +1,1 @@ +getDGM("remote").put("count", 1);