# HG changeset patch # User Nozomi Teruya # Date 1517208076 -32400 # Node ID 14e0a5a932cff06a8874b3673193200c804ef130 # Parent 528fca1998278e5c4a78f2c8fa3734104b4293d3 add example CodeGear diff -r 528fca199827 -r 14e0a5a932cf paper/nozomi-master.pdf Binary file paper/nozomi-master.pdf has changed diff -r 528fca199827 -r 14e0a5a932cf paper/nozomi-master.tex --- 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内に複数のデータ形式を保持していた。 diff -r 528fca199827 -r 14e0a5a932cf paper/source/christie/MultiLocal.java --- /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()); + } +} diff -r 528fca199827 -r 14e0a5a932cf paper/source/christie/StartTest.java --- 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); } } diff -r 528fca199827 -r 14e0a5a932cf paper/source/christie/TestCodeGear.java --- 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 hoge = new DataGear<>(); + @Take("count") + public DataGear 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); + } } }