changeset 154:14e0a5a932cf

add example CodeGear
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Mon, 29 Jan 2018 15:41:16 +0900
parents 528fca199827
children 573db146fa93
files paper/nozomi-master.pdf paper/nozomi-master.tex paper/source/christie/MultiLocal.java paper/source/christie/StartTest.java paper/source/christie/TestCodeGear.java
diffstat 5 files changed, 71 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
Binary file paper/nozomi-master.pdf has changed
--- a/paper/nozomi-master.tex	Mon Jan 29 12:11:59 2018 +0900
+++ b/paper/nozomi-master.tex	Mon Jan 29 15:41:16 2018 +0900
@@ -523,10 +523,13 @@
 
 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java}
 
+\newpage
+
 なお、圧縮を指定する際はAlice同様DGM名の前にcompressedをつける。
 LocalからのTAKEではDGM名の指定がないが、それはLocalでの圧縮は基本想定していないためである。
 しかし、Localでの圧縮をしようと思えばRemoteTakeを用いて間接的にすることは可能である(\ref{src:compresslocal})。
 
+
 \lstinputlisting[label=src:compresslocal, caption=Localへの圧縮の指定の例]{source/christie/CompressLocal.java}
 
 
@@ -534,6 +537,7 @@
 \subsection{PUT/FLIP}
 OutputAPIにはput/flipを用意した。
 put/flipのメソッドはDGMに用意されている。
+cal.java
 CodeGear.classにはDGMを取得するメソッドがあり、それを用いて書き込みたいDGMを指定して直接putする。
 そのためLocal/Remoteの切り替えはDGMの切り替えによって行う。
 ソースコード\ref{src:put}、\ref{src:remoteput}はLocalとRemoteにputする記述の例である。
@@ -549,7 +553,7 @@
 ChristieではDGMに対して直接putするため、AliceのODSにあたる部分はない。
 ODSを経由するより直接DGMに書き込むような記述のほうが直感的であると考えたためである。
 
-
+\newpage
 
 \subsection{getData()}
 AliceのasClassに相当するのがgetDataである。
@@ -565,20 +569,55 @@
 
 
 \section{CodeGearの記述方法}
-%以下のコードはLocalDSMにputした
+以下のコードはLocalDSMにputしたDGを取り出して表示するのを10回繰り返す例題である。
+
+\lstinputlisting[label=src:StartCodeGear, caption=StartCodeGearの例]{source/christie/StartTest.java}
+\lstinputlisting[label=src:TestCodeGear, caption=CodeGearの例]{source/christie/TestCodeGear.java}
+
+Alice同様、ChristieでもInputDGを持たないStartCGから処理を開始する。
+StartCGはStartCodeGear.classを継承することで記述できる。
+AliceではStartCSもCodeSegment.classを継承して書かれていたため、どれがStartCSなのか判別しづらかったが、Christieではその心配はない。
 
-    \lstinputlisting[label=src:StartCodeGear, caption=StartCodeGearの例]{source/christie/StartTest.java}
-    \lstinputlisting[label=src:TestCodeGear, caption=CodeGearの例]{source/christie/TestCodeGear.java}
+StartCGを記述する際にはcreateCGMメソッドでCGMを生成してコンストラクタに渡す必要がある。
+ソースコード\ref{src:StartCodeGear}の8行目でそれが行われている。
+createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。
+CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。
 
-%CGを作るときはsetup。AliceではnewすればCGが待ちに入ったが、Annotationの処理を挟むには一度newしておかなければならないため、Christieではnewの後setupをして待ち合わせの処理を行う。
+CGの待ち合わせ処理はsetupメソッドが行う。
+そのためソースコード\ref{src:StartCodeGear}の13行目、\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。
+AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとAnnotationから待ち合わせを行う処理ができないため、newの後にsetupを行う。
+そのため、CGの生成には必ずCGMが必要になる。
+runでCGMを受け渡すのはこのためである。
 
+\newpage
 
 
 \section{DataGearManagerの複数立ち上げ}
-%CGMを2つつくればLocalが2つ作られる。Remoteへの接続と同じようにすれば良い
+AliceではLocalDGMがstaticで書かれていたため複数のLocalDGMを立ち上げることができなかった。
+しかしChristieではCGMを2つ生成すればLocalDGMも2つ作られる。
+複数のLocalDGM同士のやりとりも、Remoteへの接続と同じようにRemoteDGMをproxyとして立ち上げアクセスする(図\ref{fig:remoteDGM})。
+
+\begin{figure}[h]
+\begin{center}
+\includegraphics[width=100mm]{images/DGM.pdf}
+\end{center}
+\caption{RemoteDGMを介して他のLocalDGMを参照}
+\label{fig:remoteDGM}
+\end{figure}
 
+\newpage
 
+ソースコード\ref{multilocal}は、LocalDSMを2つ立ち上げ、お互いをリモートに見立てて通信する例である。
+11行目にあるように、RemoteDGMを立ち上げるにはCGMが持つcreateRemoteDGMメソッドを用いる。
+引数にはRemoteDGM名と接続するリモートノードのIPアドレス、ポート番号を渡している。
 
+\lstinputlisting[label=src:multilocal, caption=LocalDGMを2つ作る例]{source/christie/MultiLocal.java}
+
+リモートの場合の同じようにアクセスできることで、コードの変更をせずに、同一マシン上の1つのアプリケーション内で分散アプリケーションのテストができるようになった。
+
+また、CGMは内部にCGMのリストをstaticでもっており、複数生成したCGMを全て管理している。
+つまり、メタレベルではRemoteDGMを介さずに各LocalDGMに相互アクセス可能である。
+そのため、Christieでは容易にNAT越えが実装できることが期待できる。
 
 \section{DataGearの拡張}
 Aliceではデータの多態性を実現するためにDS内に複数のデータ形式を保持していた。
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/source/christie/MultiLocal.java	Mon Jan 29 15:41:16 2018 +0900
@@ -0,0 +1,18 @@
+public class StartRemoteTakeTest extends StartCodeGear{
+
+    public StartRemoteTake(CodeGearManager cgm) {
+        super(cgm);
+    }
+
+    public static void main(String args[]){
+        CodeGearManager cgm = createCGM(10000);
+        new StartRemoteTake(cgm);
+
+        cgm.createRemoteDGM("remote", "localhost", 10001);
+        cgm.setup(new RemoteTakeTest());
+
+        CodeGearManager cgm2 = createCGM(10001);
+        cgm2.createRemoteDGM("remote", "localhost", 10000);
+        cgm2.setup(new RemoteTakeTest());
+    }
+}
--- a/paper/source/christie/StartTest.java	Mon Jan 29 12:11:59 2018 +0900
+++ b/paper/source/christie/StartTest.java	Mon Jan 29 15:41:16 2018 +0900
@@ -11,6 +11,6 @@
     @Override
     protected void run(CodeGearManager cgm) {
         cgm.setup(new TestCodeGear());
-        getLocalDGM().put("data", 1);
+        getLocalDGM().put("count", 1);
     }
 }
--- a/paper/source/christie/TestCodeGear.java	Mon Jan 29 12:11:59 2018 +0900
+++ b/paper/source/christie/TestCodeGear.java	Mon Jan 29 15:41:16 2018 +0900
@@ -1,9 +1,14 @@
 public class TestCodeGear extends CodeGear {
 
-    @Take("hoge")
-    public DataGear<Integer> hoge = new DataGear<>();
+    @Take("count")
+    public DataGear<Integer> count = new DataGear<>();
 
     public void run(CodeGearManager cgm){
         System.out.println(hoge.getData());
+        
+        if (count.getData()!= 10){
+            cgm.setup(new TestCodeGear());
+            getLocalDGM().put("count", count.getData() + 1);
+        }
     }
 }