Mercurial > hg > Papers > 2018 > nozomi-master
changeset 156:bc9be2d40d0d
add requiremants
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 30 Jan 2018 23:41:54 +0900 |
parents | 573db146fa93 |
children | d620f126a383 |
files | ChristieClass.graffle paper/TopologyFile.dot paper/images/DGM.pdf paper/images/metaCGDG.png paper/nozomi-master.tex paper/source/christie/RemoteTakeAnnotation.java paper/source/christie/Setup.java paper/source/christie/TakeAnnotation.java |
diffstat | 8 files changed, 264 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/ChristieClass.graffle Mon Jan 29 17:35:22 2018 +0900 +++ b/ChristieClass.graffle Tue Jan 30 23:41:54 2018 +0900 @@ -26,7 +26,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2018-01-27 13:20:08 +0000</string> + <string>2018-01-30 07:38:58 +0000</string> <key>Modifier</key> <string>Nozomi Teruya</string> <key>NotesVisible</key> @@ -1310,8 +1310,8 @@ <integer>88</integer> <key>Points</key> <array> - <string>{404.86796214506819, 190.49999993384441}</string> - <string>{404.82500695589715, 279.00001111248685}</string> + <string>{402.36169956394451, 190.49264690304938}</string> + <string>{387.01112971211177, 279.00987525811337}</string> </array> <key>Style</key> <dict> @@ -1600,8 +1600,8 @@ <integer>79</integer> <key>Points</key> <array> - <string>{404.10901776419723, 319.99741076995082}</string> - <string>{402.03960598191975, 340.25275020044165}</string> + <string>{388.91056379626622, 319.95467464568424}</string> + <string>{398.21268641423939, 340.2868841493347}</string> </array> <key>Style</key> <dict> @@ -1630,7 +1630,7 @@ <array> <dict> <key>Bounds</key> - <string>{{334.875, 279.5}, {140, 14}}</string> + <string>{{315.5, 279.5}, {140, 14}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>FitText</key> @@ -1666,7 +1666,7 @@ </dict> <dict> <key>Bounds</key> - <string>{{334.875, 293.5}, {140, 12}}</string> + <string>{{315.5, 293.5}, {140, 12}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>FitText</key> @@ -1697,7 +1697,7 @@ </dict> <dict> <key>Bounds</key> - <string>{{334.875, 305.5}, {140, 14}}</string> + <string>{{315.5, 305.5}, {140, 14}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>FitText</key> @@ -1918,8 +1918,8 @@ <integer>71</integer> <key>Points</key> <array> - <string>{334.37534712224652, 289.1283179823327}</string> - <string>{247.49961346096504, 292.36715737642493}</string> + <string>{315.00043064867185, 289.42782879143084}</string> + <string>{247.4995904350809, 292.23112114117907}</string> </array> <key>Style</key> <dict> @@ -2715,6 +2715,94 @@ <key>DisplayScale</key> <string>1 0/72 in = 1.0000 in</string> <key>GraphicsList</key> + <array/> + <key>GridInfo</key> + <dict/> + <key>HPages</key> + <integer>1</integer> + <key>KeepToScale</key> + <false/> + <key>Layers</key> + <array> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>Layer 1</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + </array> + <key>LayoutInfo</key> + <dict> + <key>Animate</key> + <string>NO</string> + <key>circoMinDist</key> + <real>18</real> + <key>circoSeparation</key> + <real>0.0</real> + <key>layoutEngine</key> + <string>dot</string> + <key>neatoSeparation</key> + <real>0.0</real> + <key>twopiSeparation</key> + <real>0.0</real> + </dict> + <key>Orientation</key> + <integer>2</integer> + <key>PrintOnePage</key> + <false/> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>Canvas 4</string> + <key>UniqueID</key> + <integer>4</integer> + <key>VPages</key> + <integer>1</integer> + </dict> + <dict> + <key>ActiveLayerIndex</key> + <integer>0</integer> + <key>AutoAdjust</key> + <true/> + <key>BackgroundGraphic</key> + <dict> + <key>Bounds</key> + <string>{{0, 0}, {559, 783}}</string> + <key>Class</key> + <string>SolidGraphic</string> + <key>ID</key> + <integer>2</integer> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + </dict> + <key>BaseZoom</key> + <integer>0</integer> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>DisplayScale</key> + <string>1 0/72 in = 1.0000 in</string> + <key>GraphicsList</key> <array> <dict> <key>Class</key> @@ -3499,7 +3587,7 @@ <key>SidebarWidth</key> <integer>120</integer> <key>VisibleRegion</key> - <string>{{-57, 15}, {672, 619}}</string> + <string>{{-57, 5.5}, {672, 619}}</string> <key>Zoom</key> <real>1</real> <key>ZoomValues</key> @@ -3519,6 +3607,11 @@ <real>1</real> <real>1</real> </array> + <array> + <string>Canvas 4</string> + <real>1</real> + <real>1</real> + </array> </array> </dict> </dict>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/TopologyFile.dot Tue Jan 30 23:41:54 2018 +0900 @@ -0,0 +1,8 @@ +digraph test{ + node0 -> node1[label="right"] + node0 -> node2[label="left"] + node1 -> node2[label="right"] + node1 -> node0[label="left"] + node2 -> node0[label="right"] + node2 -> node1[label="left"] +}
--- a/paper/nozomi-master.tex Mon Jan 29 17:35:22 2018 +0900 +++ b/paper/nozomi-master.tex Tue Jan 30 23:41:54 2018 +0900 @@ -361,8 +361,6 @@ - - \chapter{Aliceの問題点} Aliceを拡張していく中でいくつかの問題点が明らかになり、これらを解決するにはAlice自体を再設計する必要があるとわかった。 @@ -380,8 +378,26 @@ 可読性の低いコードはプログラマの負担となるため、CSが何を待ち合わせているのかそのCSを見ただけで理解できるようにAPIを改善すべきである。 +\section{setKeyは最後に呼ばなければならない} +setKeyメソッドをコンストラクタで呼ぶ際、setKeyメソッドを必ず最後に呼ばなければならない。 + +CSは内部で実行に必要なDSを数えている。DSの取得に成功するとこの値が、デクリメントされ、0になると必要なDSが全て揃ったことと判断されThread poolへ送られる。 + +setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。 + +\lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java} + +ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にDSの取得数を決めようとしている。しかし、setKeyが最初に呼ばれた際に、DSの取得に成功すると実行可能と判断されてしまう。runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。 + \newpage +今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。 + +\lstinputlisting[label=src:success,caption=NullPointerExceptionにならない記述]{source/ShowData.java} + +このように記述の順序を考えながらプログラミングしなければならない設計では、バグを引き起こし信頼性を損なうことに繋がる。より自然に扱えるAPI設計にするべきだと考える。 + + \section{動的なsetKey} setKeyはCSのコンストラクタで指定することが多い。 このとき、指定するkeyは引数などから動的に受け取り、セットすることができる。 @@ -397,6 +413,7 @@ 辿ってもflipされている可能性もあるため、最初にそのDSをputしている部分を見つけるのは困難である。 従って、待ち合わせているkeyにどのような型のデータが対応しているのかをそのCSを見ただけで分かるようにするべきと考える。 +\newpage \section{key名と変数名の不一致} 2.4のCodeSegmentの例題である通り、key名とそのkeyで待ち合わせたDSを受け取るReceiver名は異なることがある。 @@ -414,7 +431,6 @@ Alice自体の拡張・デバッグをしやすくするためにも、DSがどの型を持っているのかをひと目で分かるようにしたい。 -\newpage \section{LocalDataSegmentManagerを複数持てない} Aliceでは1つのノードにつき1つしかLocalDSMを立ち上げられない作りになっている。 @@ -432,8 +448,6 @@ その一つがNAT越えの機能である。NAT越えは分散アプリケーション構築における課題の1つでもあるが、プログラマにとってその実装は容易ではない。Topology ManagerにNATを越えたノード間通信機能をつけることにより、ネットワークを気にせずに通信が行えるようにしたい。 -\newpage - 図 \ref{fig:nat}はTopologyManagerを用いてNAT越えをするための設計である。 \begin{figure}[h] @@ -444,12 +458,12 @@ \label{fig:nat} \end{figure} +\newpage また、別トポロジーで立ち上げたアプリケーション同士を接続する機能も追加したいと考えていた。 TreeTopologyのVNCアプリとStarTopologyのチャットアプリを連携したいという要望が生まれたためである。 別トポロジーのアプリケーションが接続可能になれば、VNC画面のスナップショットをChat上に載せたり、VNC上にChatの内容をコメントとして流すといった拡張が容易になる(図 \ref{fig:vncandchat})。 -\newpage \begin{figure}[h] \begin{center} \includegraphics[width=180mm]{images/vncandchat.pdf} @@ -468,17 +482,18 @@ 1つのノードに複数のTopologyManagerを対応させるには、TopologyNodeが複数のnodeNameを持つ必要がある。 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 -\newpage そこで、Meta Computationとして、通常のLocal DSMとは別にTopology ManagerごとのMeta Local DSMを立ち上げる方法が考えられる(図 \ref{fig:somehostname})。 \begin{figure}[h] \begin{center} -\includegraphics[width=100mm]{images/somehostname.pdf} +\includegraphics[width=120mm]{images/somehostname.pdf} \end{center} \caption{複数のTopologyManagerに複数のLocalDSMが対応} \label{fig:somehostname} \end{figure} +\newpage + それぞれのTopology Managerに対応するLocalDSMを作り、それぞれに対応したnodeNameを格納することで、DSMを切り替えるだけでTopologyNodeの仕様は変えずに複数のTopology Managerに対応できるという設計である。 しかし、現在のAliceのコードではDSMを管理するclassがstatic classであったため、複数のLocal DSMを持つことはできなかった。 @@ -491,8 +506,25 @@ \chapter{分散フレームワークChristieの設計} + +\section{Christieの必要条件} 3章でのAliceの問題点を踏まえ、新たにフレームワークを作り直すべきだと考えた。 本章では、新たに作った分散フレームワークChristieの設計を説明する。 +Christieに必要な要件は以下のように考える。 + +\begin{itemize} +\item {\ttfamily create/setKeyのような煩雑なAPIをシンプルにし可読性を上げる} +\end{itemize} + +\begin{itemize} +\item {\ttfamily プログラマが型を推測しなくとも整合性がとれるように型を解決し、信頼性を上げる} +\end{itemize} + +\begin{itemize} +\item {\ttfamily staticなLocalDSMをなくし、複数のインスタンスを同時に立ち上げられるようにすることで拡張性を上げる} +\end{itemize} + + \section{Christieの基本設計} 基本的にはAliceと同じ、タスクとデータを細かい単位に分割して依存関係を記述し、入力が揃った順から並列実行するというプログラミング手法を用いる。 @@ -508,7 +540,7 @@ DGはAliceと同様にDataGearManager(以下DGM)が管理する。 DGMはLocalとRemoteがあり、全てのDGMはCodeGearManager(以下CGM)で管理される。 GearsOSではContextという全てのCG/DGを一括管理するプロセスがあり、AliceのCGMもこのContextに相当する。 - +全てのCGMはThreadPoolと他のCGM全てのリストを共有しているため、全てのCG/DGにアクセス可能である。 CGを記述する際はAlice同様CodeGear.classを継承する。 CodeGearは @@ -518,37 +550,39 @@ ChristieのAPIにはrunの引数で受け取ったCGMを経由しアクセスする。 GearsOSではCG間でContextを受け渡すことによってCGはDGにアクセスするため、Christieでもその記述方法を採用した。 +%Clas図 + \newpage \section{APIの改善} \subsection{TAKE/PEEK} InputAPIにはAliceと同じくTakeとPeekを用意した。 -ChristieではInput DG の指定にはAnnotationを使う。 -Annotationとは、Javaのクラスやメソッド、パッケージに対して付加情報を記述できる機能である。 -先頭に@をつけることで記述でき、オリジナルのAnnotationを定義することもできる。 +ChristieではInput DG の指定にはアノテーションを使う。 +アノテーションとは、クラスやメソッド、パッケージに対して付加情報を記述できるJavaのMeta Computationである。 +先頭に@をつけることで記述でき、オリジナルのアノテーションを定義することもできる。 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 -ChristieではInputのためのDGを作り、その上にAnnotationでKeyを指定する(\ref{src:take})。 +ChristieではInputのためのDGを作り、その上にアノテーションでKeyを指定する(\ref{src:take})。 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java} -Annotationで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 +アノテーションで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 これにはJavaのreflectionAPIを利用している。 -Annotationの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 +アノテーションの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 -DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、<>内に指定した型でデータの型を限定できる。 +DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、\textless \textgreater 内に指定した型でデータの型を限定できる。 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。 -この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてAnnotationから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 +この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてアノテーションから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 -リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのAnnotationを用いる(\ref{src:remotetake})。 -そのため待ち合わせ先がLocalかRemoteかはAnnotationの違いからひと目でわかるようになった。 +リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのアノテーションを用いる(\ref{src:remotetake})。 +そのため待ち合わせ先がLocalかRemoteかはアノテーションの違いからひと目でわかるようになった。 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java} @@ -612,11 +646,14 @@ createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。 CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。 -CGの待ち合わせ処理はsetupメソッドが行う。 +CGに対してアノテーションから待ち合わせを実行する処理はsetupメソッドが行う。 そのためソースコード\ref{src:StartCodeGear}の13行目、\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。 -AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとAnnotationから待ち合わせを行う処理ができないため、newの後にsetupを行う。 +AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとアノテーションから待ち合わせを行う処理ができないため、newの後にsetupを行う。 そのため、CGの生成には必ずCGMが必要になる。 runでCGMを受け渡すのはこのためである。 +なお、StartCGはインプットを持たないため、setupを行う必要がなく、newされた時点でrunが実行されuる。 + +%ここにCG/DGのフロー? \newpage @@ -659,35 +696,80 @@ \chapter{Christieの評価} -\section{Akka} -\section{Corba} -\section{Erlang} -\section{Hazelcast} +\section{Aliceとの分散性能測定} + +\section{他フレームワークとの比較} +\subsection{Akka} +\subsection{Corba} +\subsection{Erlang} +\subsection{Hazelcast} \chapter{まとめ} + \chapter{今後の課題} +\section{TopologyManagerの実装} +Aliceと同じく、静的・動的なトポロジー管理のできるTopologyManagerの実装が必要である。 +Christieでは複数のLocalDSMが立ち上げ可能なため、TopologyManagerでのNAT超えも実装し実用性があるかを検証する +また、通信の信頼性を保証するために、TopologyManagerがダウンした際に新たなTopologyManagerを立ち上げる機能もあるべきだと考える。 + +\section{検証機構の導入?} + +\section{GearsOSへの移行} +GearsOSはまだ開発途中であったため、本論文の作成時点ではChristieのような分散機能を実装することが叶わなかった。 +GearsOSにChristieを移行するには、GearsOSにJavaのアノテーションに相当するMeta Computationを実装する必要がある。 +そしてChristieでは実現できなかったアノテーションからの変数の自動生成が行えれば更にプログラミングしやすいAPIになると考えられる。 + +\chapter{付録} +\section{独自のアノテーション定義} +Christieのアノテーションの実装方法と、そのアノテーションからtakeを実行する部分を解説する。 + +ソースコード\ref{src:take}、\ref{src:remotetake}がChristie独自のアノテーションの定義である。 + +\lstinputlisting[label=src:take, caption=Takeの実装]{source/christie/TakeAnnotation.java} +\lstinputlisting[label=src:remotetake, caption=RemoteTakeの実装]{source/christie/RemoteTakeAnnotation.java} + +@Targetや@Retentionはアノテーション定義のためのアノテーション、メタアノテーションである。 +@Targetには、フィールドやメソッド、コンストラクタなど、このアノテーションの付加対象となる構文要素が何かを記述する。 +@Retentionには、SOURCE・CLASS・RUNTIMEが選択でき、アノテーションで付加された情報がどの段階まで保持されるかを定義する。reflectionAPIを利用するにはRUNTIMEでなければならないため、Christieのアノテーションの@Retentionは全てRUNTIMEである。 + +定義したアノテーションの仕様例がソースコード\ref{src:takeAno}、\ref{src:remotetakeAno}である。 + +\lstinputlisting[label=src:takeAno, caption=Takeアノテーションの使用例]{source/christie/InputDG.java} +\lstinputlisting[label=src:remotetakeAno, caption=RemoteTakeアノテーションの使用例]{source/christie/RemoteInputDG.java} + +アノテーションを使う際、()内に記述する値が\ref{src:take}のvalueや\ref{src:remotetake}のdsmNameといったキーに保存される。 +通常キーに対して値を入れる場合は、ソースコード\ref{src:remotetakeAno}のようにkey=の形で記述しなければならないが、Takeのようにキーが1つの場合、キー名をvalueにすることでその記述を省略することができる。 + +setupメソッド内では生成されたフィールドに対してアノテーションを含めた情報を処理している(ソースコード\ref{src:setup})。 + +\lstinputlisting[label=src:setup, caption=reflectionAPIでフィールドの情報を取得]{source/christie/Setup.java} + +これにはJavaのreflectionAPIが使用されている。 +reflectionAPIでは対象となるクラスのフィールドやメソッド、それに対するアノテーションも取得できる。 +フィールドから取得したDGとアノテーションから取得したkeyからインプットコマンド(TAKE/PEEK)を生成し、DGMへ送って実行する。 + +このとき要求したデータがDGM内にない場合はwaitListに入る。 +PUTコマンドが実行された際、もしwaitListに同じkeyのDGを待っているコマンドがあれば実行される。 +CGは生成したインプットコマンドの総数を初期値としたカウンタを持っており、コマンドが解決されるたびにカウンタは減っていき、0になった時、CGがThreadPoolへ送られる。 \chapter{謝辞} 本研究の遂行、また本論文の作成にあたり、ご多忙にも関わらず終始懇切なる御指導と御 教授を賜わりました河野真治准教授に深く感謝したします。 -そして、数々の貴重な御助言と技術的指導を戴いた伊波立樹さん、並びに並列信頼研究室 -の皆様、本研究を遂行するにあたり参考にさせていただいた先行研究のAlice, Federated - Linda, Jungle, TreeVNC の設計・実装に関わった全ての方々に感謝いたします。 - - また、本フレームワークの名前の由来となったクリスティー式戦車の生みの親、ジョン・ - W・クリスティーに敬意を評します。 - - 最後に、日々の研究生活を支えてくださった米須智子さん、情報工学科の方々、そし - て家族に心より感謝いたします。 - +そして、数々の貴重な御助言と技術的指導を戴いた伊波立樹さん、他フレームワークの調査に協力してくださった清水隆博さん、赤堀貴一さん、浜瀬裕暉さん、大城由也さん、並びに信頼研究室の皆様に感謝いたします。 +先行研究であるAlice, Federated Linda, Jungle, TreeVNCがなければ本研究はありませんでした。 これら先行研究の設計や実装に関わった全ての先輩方に感謝いたします。 + +また、本フレームワークの名前の由来となったクリスティー式戦車の生みの親、ジョン・W・クリスティーに敬意を評します。 + +最後に、日々の研究生活を支えてくださった米須智子さん、菱田正和さん、情報工学科の方々、そして家族に心より感謝いたします。 + %参考文献 \nocite{*} \bibliographystyle{junsrt} -\bibliography{reference} +%\bibliography{reference} %発表履歴 \addcontentsline{toc}{chapter}{発表履歴}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/RemoteTakeAnnotation.java Tue Jan 30 23:41:54 2018 +0900 @@ -0,0 +1,6 @@ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RemoteTake { + String dgmName(); + String key(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/christie/Setup.java Tue Jan 30 23:41:54 2018 +0900 @@ -0,0 +1,23 @@ +public void setup(CodeGearManager cgm){ + this.cgm = cgm; + this.cge = new CodeGearExecutor(this, this.cgm); + this.localDGM = cgm.getLocalDGM(); + + for (Field field : this.getClass().getDeclaredFields()) { + if (field.isAnnotationPresent(Take.class)) { + Take ano = field.getAnnotation(Take.class); + setTakeCommand("local", ano.value(), initDataGear(field, ano.value())); + } else if (field.isAnnotationPresent(Peek.class)) { + Peek ano = field.getAnnotation(Peek.class); + setPeekCommand("local", ano.value(), initDataGear(field, ano.value())); + } else if (field.isAnnotationPresent(RemoteTake.class)) { + RemoteTake ano = field.getAnnotation(RemoteTake.class); + setTakeCommand(ano.dgmName(), ano.key(), initDataGear(field, ano.key())); + } else if (field.isAnnotationPresent(RemotePeek.class)) { + RemotePeek ano = field.getAnnotation(RemotePeek.class); + setTakeCommand(ano.dgmName(), ano.key(), initDataGear(field, ano.key())); + } + } + + idg.finishInput(cgm, commandList); +}