comparison paper/nozomi-master.tex @ 174:f0e9cc7d13f9

minor change
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Mon, 05 Feb 2018 16:38:28 +0900
parents 52a43c1336d9
children 7e7fe5e28ba4
comparison
equal deleted inserted replaced
173:52a43c1336d9 174:f0e9cc7d13f9
113 またスケーラビリティーとは、分散ソフトウェアに対して単純にノードを追加するだけで性能を線形的に上昇させることができる性質である。 113 またスケーラビリティーとは、分散ソフトウェアに対して単純にノードを追加するだけで性能を線形的に上昇させることができる性質である。
114 114
115 しかし、これらをもつ分散プログラムをユーザーが一から記述することは容易ではない。 115 しかし、これらをもつ分散プログラムをユーザーが一から記述することは容易ではない。
116 なぜなら、並列で動く分散した資源を意識しながら記述するのは容易ではなく、また、どのように分散したノードの選択を行えば良いのか明確ではないからである。 116 なぜなら、並列で動く分散した資源を意識しながら記述するのは容易ではなく、また、どのように分散したノードの選択を行えば良いのか明確ではないからである。
117 117
118 分散プログラムには以下の3つの要素がある。 118 分散プログラムには以下の3つの要素がある\cite{Framework}。
119 \begin{itemize} 119 \begin{itemize}
120 \item {ノード内の計算} 120 \item {ノード内の計算}
121 \end{itemize} 121 \end{itemize}
122 122
123 \begin{itemize} 123 \begin{itemize}
153 153
154 Aliceは、タスクをCode Segment、データをData Segmentという単位で記述し、Code SegmentはインプットとなるData Segmentが全て揃うと並列に実行される。 154 Aliceは、タスクをCode Segment、データをData Segmentという単位で記述し、Code SegmentはインプットとなるData Segmentが全て揃うと並列に実行される。
155 Data Segmentは対になるkeyが存在し、Data Segment Managerというノードごとに存在する独自のデータベースによって管理されている。 155 Data Segmentは対になるkeyが存在し、Data Segment Managerというノードごとに存在する独自のデータベースによって管理されている。
156 各ノードにはラベル付きのプロキシであるRemote Data Segment Managerを立て、ラベルとkeyを指定してデータをtake/putするプロトコルとなっている。 156 各ノードにはラベル付きのプロキシであるRemote Data Segment Managerを立て、ラベルとkeyを指定してデータをtake/putするプロトコルとなっている。
157 157
158 %Topologymanagerもここにかく? 158 \newpage
159 159 記述の面において、Akkaでは基本的にメッセージをFIFO的に処理するため、複数のインプットを待ち合わせる場合は、待ち合わせの処理をプログラマが各必要があった。
160 \newpage 160 しかしAliceは複数のインプットを1箇所に記述するるため、そのような煩雑さがない。
161 %問題といったら参考文献が必要,わかりづらいとハッキリ書かない
162 記述の面において、Akkaではメッセージが集中した場合にそれを処理するパターンマッチが増えてしまう問題や、複数のインプットを待ち合わせる際に記述が煩雑になる問題があった。
163 しかしAliceはインプットを明確に記述でき、複数のインプットを持てる。
164 161
165 プロトコルの設計方針において、AkkaやHazelcastは分散通信の複雜さを抽象度を高めることで隠す方針であるため、ロケーション透過性が高く、プログラマからは処理の流れを把握しにくくなっていた。 162 プロトコルの設計方針において、AkkaやHazelcastは分散通信の複雜さを抽象度を高めることで隠す方針であるため、ロケーション透過性が高く、プログラマからは処理の流れを把握しにくくなっていた。
166 一方でAliceは分散計算のチューニングをメタ計算として行う。これによりメタ計算から分離された処理の流れを明確にすることができる。 163 一方でAliceでは明示的に分散性を意識する代わりに、計算を通常計算とそれを支えるメタ計算として分離することで記述の複雑さを回避している。
167 164 これにより処理の流れを明確にし、分散計算のチューニングをしやすくしている。
168 Alice の分散ノード間の通信はラベルを用いてリモートノードを選択することによって指定する。 165
169 Akkaでは送り先をドメインで指定しているのと同様である。Alice ではラベルはToplogy managerによって自動的に指定される。 166 また、Aliceの分散ノード間の通信はラベルを用いてリモートノードを選択することによって指定する。
170 167 これはAkkaで送り先をドメインで指定しているのと同様である。
171 % このように、Aliceのプロトコルの特徴は分散処理の見通しの良さといえる。Alice は Java 上に実装されており、Javaのオブジェクト生成や 168 Aliceではラベルの命名をToplogy Managerによって自動的に指定することもできる。
172 % 継承により記述されている
173 %しかし、現状のAliceのAPIシンタックスは直感的でなく、プログラマが処理の順番やデータの型を考慮して書く必要があった。
174 %これではバグを引き起こす可能性が高いため、信頼性を上げるにはよりユーザーフレンドリーなシンタックスで再設計すべきだと考えた。
175 169
176 170
177 \section{トポロジーの構成} 171 \section{トポロジーの構成}
178 AkkaではAkka Streamという機能で処理の流れが記述できる。 172 AkkaではAkka Streamという機能で処理の流れが記述できる。
179 N入力1出力、1入力N出力、出力のみ、などが用意されたJunctionsと呼ばれる要素をつなぎ合わせることでトポロジーを記述する。 173 N入力1出力、1入力N出力、出力のみ、などが用意されたJunctionsと呼ばれる要素をつなぎ合わせることでトポロジーを記述する。
253 一つのkeyに対して複数のDSをputするとFIFO的に処理される。なのでData Segment Managerは通常のデータベースとは異なる。 247 一つのkeyに対して複数のDSをputするとFIFO的に処理される。なのでData Segment Managerは通常のデータベースとは異なる。
254 248
255 249
256 250
257 \section{DataSegmentManager} 251 \section{DataSegmentManager}
258 DS Manager(以下DSM)にはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 252 DS Manager(以下DSM)にはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。
259 253
260 Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:Remote DSM} )。 254 Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:Remote DSM} )。
261 他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 255 他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。
262 256
263 \newpage 257 \newpage
264 258
265 \begin{figure}[h] 259 \begin{figure}[h]
309 り出すのは無駄である。flipはDSを受け取った形式のまま転送するため無駄なコピーなくDSの保存ができる。 303 り出すのは無駄である。flipはDSを受け取った形式のまま転送するため無駄なコピーなくDSの保存ができる。
310 304
311 \begin{itemize} 305 \begin{itemize}
312 \item {\ttfamily void take(String managerKey, String key)} 306 \item {\ttfamily void take(String managerKey, String key)}
313 \end{itemize} 307 \end{itemize}
314 takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。要求したDSが存在しなければ、CSの待ち合わせ (Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。 308 takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。要求したDSが存在しなければ、CSの待ち合わせ (Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。
315 309
316 \begin{itemize} 310 \begin{itemize}
317 \item {\ttfamily void peek(String managerKey, String key)} 311 \item {\ttfamily void peek(String managerKey, String key)}
318 \end{itemize} 312 \end{itemize}
319 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。 313 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。
321 315
322 316
323 \newpage 317 \newpage
324 318
325 \section{CodeSegmentの記述方法} 319 \section{CodeSegmentの記述方法}
326 CSをユーザーが記述する際にはCodeSegmentクラスを継承して記述する(ソースコード \ref{src:StartCodeSegmen 320 CSをユーザーが記述する際にはCodeSegmentクラスを継承して記述する(ソースコード \ref{src:StartCodeSegment} , \ref{src:CodeSegment})。
327 t} , \ref{src:CodeSegment})。
328 321
329 継承することによりCode Segmentで使用するData Segment APIを利用する事ができる。 322 継承することによりCode Segmentで使用するData Segment APIを利用する事ができる。
330 323
331 Alice には、Start CS (ソースコード \ref{src:StartCodeSegment} )というC の main に相当するような最初に 324 Alice には、Start CS (ソースコード \ref{src:StartCodeSegment} )というC の main に相当するような最初に
332 実行される CS がある。 325 実行される CS がある。
337 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} 330 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
338 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java} 331 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
339 332
340 \newpage 333 \newpage
341 334
342 ソースコード \ref{src:StartCodeSegment} は、5行目で次に実行させたいCS(ソースコード \ref{src:CodeSegment} )を作成している。 335 ソースコード \ref{src:StartCodeSegment} は、5行目で次に実行させたいCS(ソースコード \ref{src:CodeSegment} )を作成している。
343 8行目でOutput DS APIを通してLocal DSMに対してDSをputしている。 336 8行目でOutput DS APIを通してLocal DSMに対してDSをputしている。
344 Output DS APIはCSの{\tt ods}というフィールドを用いてアクセスする。 337 Output DS APIはCSの{\tt ods}というフィールドを用いてアクセスする。
345 {\tt ods}は{\tt put}と{\tt update}と{\tt flip}を実行することができる。 338 {\tt ods}は{\tt put}と{\tt update}と{\tt flip}を実行することができる。
346 TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でputが行われるとTestCodeSegmentは実 339 TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でputが行われるとTestCodeSegmentは実
347 行される。 340 行される。
411 仕様の変更を抑えてプログラムの拡張ができるということは、コードを破壊しないため変更以前の信頼性を保てるということである。 404 仕様の変更を抑えてプログラムの拡張ができるということは、コードを破壊しないため変更以前の信頼性を保てるということである。
412 405
413 Meta ComputationもCS/DSで作られており、プログラマ側から見えないこれらのCS/DSはMeta CS/Meta DSと呼ばれる。 406 Meta ComputationもCS/DSで作られており、プログラマ側から見えないこれらのCS/DSはMeta CS/Meta DSと呼ばれる。
414 407
415 現在Aliceには、データの圧縮機能、トポロジーの構成・管理機能、ノードの生存確認機能、ノードの切断・再接続時の処理管理機能などのMeta Computationが用意されている。 408 現在Aliceには、データの圧縮機能、トポロジーの構成・管理機能、ノードの生存確認機能、ノードの切断・再接続時の処理管理機能などのMeta Computationが用意されている。
409 これらの有用性は水族館の例題\cite{Aquarium}やTreeVNCの例題\cite{TreeVNC}\cite{AliceVNC}によって示された。
416 410
417 \newpage 411 \newpage
418 412
419 \subsection{Aliceの圧縮機能} 413 \subsection{Aliceの圧縮機能}
420 リモートノードに大きなデータを送るために、データを圧縮したい場合がある。 414 リモートノードに大きなデータを送るために、データを圧縮したい場合がある。
421 そこで、Aliceは圧縮をサポートしている。 415 そこで、Aliceは圧縮をサポートしている。
422 しかし、単に圧縮のメソッドを用意したわけではない。 416 しかし、単に圧縮のメソッドを用意したわけではない。
423 圧縮データの展開と、圧縮したまま別ノードへの転送を同時に実現したい場合があるため、Meta CSを介すことでDSに圧縮と非圧縮のデータを同時に持てるようにしている(図\ref{fig:compress})。 417 圧縮データの展開と、圧縮したまま別ノードへの転送を同時に実現したい場合があるため、Meta CSを介すことでDSに圧縮と非圧縮のデータを同時に持てるようにしている(図\ref{fig:compress})。
424 418
425 \begin{figure}[h] 419 \begin{figure}[h]
426 \begin{center} 420 \begin{center}
427 \includegraphics[width=160mm]{images/compress.pdf} 421 \includegraphics[width=160mm]{images/compress.pdf}
428 \end{center} 422 \end{center}
432 426
433 1つのDS内にMeta DSとして以下の3つの表現を持たせることでデータに多態性を持たせ、必要に応じた形式でDSを扱う。 427 1つのDS内にMeta DSとして以下の3つの表現を持たせることでデータに多態性を持たせ、必要に応じた形式でDSを扱う。
434 428
435 \begin{enumerate} 429 \begin{enumerate}
436 \item 一般的なJavaのクラスオブジェクト 430 \item 一般的なJavaのクラスオブジェクト
437 \item MessagePack for Java\cite{}でシリアライズ化されたバイナリオブジェクト 431 \item MessagePack for Java\cite{MessagePack}でシリアライズ化されたバイナリオブジェクト
438 \item 2を圧縮したバイナリオブジェクト 432 \item 2を圧縮したバイナリオブジェクト
439 \end{enumerate} 433 \end{enumerate}
440 434
441 Local DSMにputされた場合は、(1)の一般的なJavaクラスオブジェクトとして追加される。 435 Local DSMにputされた場合は、(1)の一般的なJavaクラスオブジェクトとして追加される。
442 Remote DSMにputされた場合は、通信時に(2)のbyteArrayに変換されたバイナリオブジェクトに変換されたDSが追加 436 Remote DSMにputされた場合は、通信時に(2)のbyteArrayに変換されたバイナリオブジェクトに変換されたDSが追加
444 Local/Remote DSMにDSを圧縮して保存したい場合は(3)の圧縮形式を用いる。 438 Local/Remote DSMにDSを圧縮して保存したい場合は(3)の圧縮形式を用いる。
445 439
446 \newpage 440 \newpage
447 441
448 データの圧縮を指定するには、putするDSMの名前の前に"compressed"をつけるだけでよい。 442 データの圧縮を指定するには、putするDSMの名前の前に"compressed"をつけるだけでよい。
449 \ref{src:before},\ref{src:after}は通常のDSと圧縮のDSを扱う際の記述の例である。 443 ソースコード\ref{src:before},\ref{src:after}は通常のDSと圧縮のDSを扱う際の記述の例である。
450 444
451 \lstinputlisting[label=src:before, caption=通常のDSを扱うCSの例]{source/beforeCompress.java} 445 \lstinputlisting[label=src:before, caption=通常のDSを扱うCSの例]{source/beforeCompress.java}
452 \lstinputlisting[label=src:after,caption=圧縮したDSを扱うCSの例]{source/afterCompress.java} 446 \lstinputlisting[label=src:after,caption=圧縮したDSを扱うCSの例]{source/afterCompress.java}
453 447
454 このようにコードの変更を抑えて圧縮できるため、他の計算部分を変えずにデータ形式が指定できる。 448 このようにコードの変更を抑えて圧縮できるため、他の計算部分を変えずにデータ形式が指定できる。
456 450
457 451
458 \subsection{TopologyManager} 452 \subsection{TopologyManager}
459 Aliceでは、ノード間の接続管理やトポロジーの構成管理を、Topology ManagerとTopology NodeというMeta Computationが提供している。 453 Aliceでは、ノード間の接続管理やトポロジーの構成管理を、Topology ManagerとTopology NodeというMeta Computationが提供している。
460 プログラマはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。 454 プログラマはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。
461 トポロジーファイルはDOT Language\cite{}という言語で記述される。 455 トポロジーファイルはDOT Language\cite{dot}という言語で記述される。
462 DOT Languageとは、プレーンテキストを用いてデータ構造としてのグラフを表現するためのデータ記述言語の一 456 DOT Languageとは、プレーンテキストを用いてデータ構造としてのグラフを表現するためのデータ記述言語の一つである。
463 つである。
464 ソースコード\ref{src:topologyfile}は3台のノードでリングトポロジーを組むときのトポロジーファイルの例である。 457 ソースコード\ref{src:topologyfile}は3台のノードでリングトポロジーを組むときのトポロジーファイルの例である。
465 458
466 \lstinputlisting[label=src:topologyfile, caption=トポロジーファイルの例]{source/TopologyFile.dot} 459 \lstinputlisting[label=src:topologyfile, caption=トポロジーファイルの例]{source/TopologyFile.dot}
467 DOT Languageファイルはdotコマンドを用いてグラフの画像ファイルを生成することができる。そのため、記述したトポロジーが正しいか可視化することが可能である。 460 DOT Languageファイルはdotコマンドを用いてグラフの画像ファイルを生成することができる。そのため、記述したトポロジーが正しいか可視化することが可能である。
468 461
469 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきクライアントのIPアドレスやポート番号、接続名を送る(図\ref{fig:topologymanager})。 462 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきクライアントのIPアドレスやポート番号、接続名を送る(図\ref{fig:topologymanager})。
470 463
471 \newpage 464 \newpage
472 465
473 \begin{figure}[h] 466 \begin{figure}[h]
474 \begin{center} 467 \begin{center}
497 490
498 \section{APIの記述の分離} 491 \section{APIの記述の分離}
499 2.4で示したように、InputDSを記述するには、一度フィールドでReceiverをcreateして、その後Reveiverに対してsetKeyで待ち合わせるkeyを指定しなければならない。 492 2.4で示したように、InputDSを記述するには、一度フィールドでReceiverをcreateして、その後Reveiverに対してsetKeyで待ち合わせるkeyを指定しなければならない。
500 このようにインプットの処理が分離されてしまっていては、記述が煩雑な上にコードを読んだ際にどのkeyに対して待ち合わせを行っているのか直感的に分からない。 493 このようにインプットの処理が分離されてしまっていては、記述が煩雑な上にコードを読んだ際にどのkeyに対して待ち合わせを行っているのか直感的に分からない。
501 494
502 さらに、setKeyは明確な記述場所が決まっていないため、そのDSを待ち合わせているCS以外からも呼び出せてしまう\ref{src:StartSetKey}。 495 さらに、setKeyは明確な記述場所が決まっていないため、そのDSを待ち合わせているCS以外からも呼び出せてしまう(ソースコード\ref{src:StartSetKey)})。
503 496
504 \lstinputlisting[label=src:StartSetKey, caption=setKeyを外部から呼び出す例]{source/StartSetKey.java} 497 \lstinputlisting[label=src:StartSetKey, caption=setKeyを外部から呼び出す例]{source/StartSetKey.java}
505 \lstinputlisting[label=src:SetKey]{source/SetKey.java} 498 \lstinputlisting[label=src:SetKey]{source/SetKey.java}
506 499
507 このような書き方をされると、CSだけを見てどのkeyに対して待ち合わせを行っているのかわからないため、setKeyを呼び出しているコードを辿る必要がある。 500 このような書き方をされると、CSだけを見てどのkeyに対して待ち合わせを行っているのかわからないため、setKeyを呼び出しているコードを辿る必要がある。
517 510
518 setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。 511 setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。
519 512
520 \lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java} 513 \lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java}
521 514
522 ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にDSの取得数を決めようとしている。しかし、setKeyが最初に呼ばれた際に、DSの取得に成功すると実行可能と判断されてしまう。runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。 515 ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にDSの取得数を決めようとしている。
516 しかし、setKeyが最初に呼ばれた際に、DSの取得に成功すると実行可能と判断されてしまう。
517 runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。
518 この問題もインプットAPIの記述の分離により引き起こされるエラーである。
523 519
524 \newpage 520 \newpage
525 521
526 今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。 522 今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。
527 523
574 しかし、Aliceでは一つのアプリケーション内にLocalDSMは一つと決まっていたため、テストに必要なノード数分だけアプリケーションを別で立ち上げなければならないという手間があった。 570 しかし、Aliceでは一つのアプリケーション内にLocalDSMは一つと決まっていたため、テストに必要なノード数分だけアプリケーションを別で立ち上げなければならないという手間があった。
575 このためのシェルスクリプトをプログラマが書かなければならないのは本質的な作業ではない。 571 このためのシェルスクリプトをプログラマが書かなければならないのは本質的な作業ではない。
576 より気軽にテストができるよう、同一プログラム内でLocalDSMを複数立ち上げられるようにすべきだと考えた。 572 より気軽にテストができるよう、同一プログラム内でLocalDSMを複数立ち上げられるようにすべきだと考えた。
577 573
578 \subsection{TopologyManagerの拡張が困難} 574 \subsection{TopologyManagerの拡張が困難}
579 Aliceではより自由度の高い通信を行うために、TopologyManagerに幾つかの機能を追加すること考えていた。 575 Aliceではより自由度の高い通信を行うために、TopologyManagerに幾つかの機能を追加すること考えていた\cite{OverNAT}。
580 576
581 その一つがNAT越えの機能である。NAT越えは分散アプリケーション構築における課題の1つでもあるが、プログラマにとってその実装は容易ではない。Topology ManagerにNATを越えたノード間通信機能をつけることにより、ネットワークを気にせずに通信が行えるようにしたい。 577 その一つがNAT越えの機能である。NAT越えは分散アプリケーション構築における課題の1つでもあるが、プログラマにとってその実装は容易ではない。Topology ManagerにNATを越えたノード間通信機能をつけることにより、ネットワークを気にせずに通信が行えるようにしたい。
582 578
583 図 \ref{fig:nat}はTopologyManagerを用いてNAT越えをするための設計である。 579 図 \ref{fig:nat}はTopologyManagerを用いてNAT越えをするための設計である。
584 580
605 601
606 TopologyManagerはネットワークごと、トポロジーごとに存在するため、いずれの機能も複数のTopologyManagerを立ち上げ、連携させることで実現可能となる。 602 TopologyManagerはネットワークごと、トポロジーごとに存在するため、いずれの機能も複数のTopologyManagerを立ち上げ、連携させることで実現可能となる。
607 603
608 今までのAliceでは、1つのノードに対してTopology Managerは1つと決められていた。 604 今までのAliceでは、1つのノードに対してTopology Managerは1つと決められていた。
609 Topology Managerと各ノードのやり取りをするのは、ノードごとに実行されるTopology NodeというMeta Computationである。 605 Topology Managerと各ノードのやり取りをするのは、ノードごとに実行されるTopology NodeというMeta Computationである。
610 Topology Managerは接続されたnodeの情報(nodeNameとIPアドレスのHashMap)を"nodeTable"というKeyに対応するDSとして保存している。 606 Topology Managerは接続されたnodeの情報(nodeNameとIPアドレスのHashMap)を"nodeTable"というKeyに対応するDSとして保存している。
611 そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。 607 そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。
612 つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。 608 つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。
613 1つのノードに複数のTopologyManagerを対応させるには、TopologyNodeが複数のnodeNameを持つ必要がある。 609 1つのノードに複数のTopologyManagerを対応させるには、TopologyNodeが複数のnodeNameを持つ必要がある。
614 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 610 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。
615 611
660 \section{Christieの基本設計} 656 \section{Christieの基本設計}
661 基本的にはAliceと同じ、タスクとデータを細かい単位に分割して依存関係を記述し、入力が揃った順から並列実行するというプログラミング手法を用いる。 657 基本的にはAliceと同じ、タスクとデータを細かい単位に分割して依存関係を記述し、入力が揃った順から並列実行するというプログラミング手法を用いる。
662 658
663 659
664 ChristieはAliceと同じくJavaで書かれている。 660 ChristieはAliceと同じくJavaで書かれている。
665 しかし将来的に当研究室が開発するGearsOSに取り入れたいため、GearsOSを構成する言語であるContinuation based C(CbC)に互換可能な設計を目指す。 661 しかし将来的に当研究室が開発するGearsOS\cite{GearsOS}に取り入れたいため、GearsOSを構成する言語であるContinuation based C(CbC)に互換可能な設計を目指す。
666 662
667 663
668 GearsOSではCodeSegment/DataSegmentと同様の概念としてCodeGear/DataGearという名称を用いているため、Christieでもそれに倣いCodeGear/DataGear(以下、CG/DG)と呼ぶこととする。 664 GearsOSではCodeSegment/DataSegmentと同様の概念としてCodeGear/DataGearという名称を用いているため、Christieでもそれに倣いCodeGear/DataGear(以下、CG/DG)と呼ぶこととする。
669 665
670 \newpage 666 \newpage
671 667
672 DGはAliceと同様にDataGearManager(以下DGM)が管理する。 668 DGはAliceと同様にDataGearManager(以下DGM)が管理する。
673 DGMはLocalとRemoteがあり、全てのDGMはCodeGearManager(以下CGM)で管理される。 669 DGMはLocalとRemoteがあり、全てのDGMはCodeGearManager(以下CGM)で管理される。
674 GearsOSではContextという全てのCG/DGを一括管理するプロセスがあり、AliceのCGMもこのContextに相当する。 670 GearsOSではContextという全てのCG/DGを一括管理するプロセスがあり、AliceのCGMもこのContextに相当する。
675 全てのCGMはThreadPoolと他のCGM全てのリストを共有しているため、全てのCG/DGにアクセス可能である(図\ref{fig:christieClass})。 671 全てのCGMはThreadPoolと他のCGM全てのリストを共有しているため、全てのCG/DGにアクセス可能である(図\ref{fig:christieClass})。
676 672
677 \begin{figure}[h] 673 \begin{figure}[h]
678 \begin{center} 674 \begin{center}
679 \includegraphics[width=130mm]{images/ChristieClass.pdf} 675 \includegraphics[width=130mm]{images/ChristieClass.pdf}
680 \end{center} 676 \end{center}
704 ChristieではInput DG の指定にはアノテーションを使う。 700 ChristieではInput DG の指定にはアノテーションを使う。
705 アノテーションとは、クラスやメソッド、パッケージに対して付加情報を記述できるJavaのMeta Computationである。 701 アノテーションとは、クラスやメソッド、パッケージに対して付加情報を記述できるJavaのMeta Computationである。
706 先頭に@をつけることで記述でき、オリジナルのアノテーションを定義することもできる。 702 先頭に@をつけることで記述でき、オリジナルのアノテーションを定義することもできる。
707 703
708 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 704 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、
709 ChristieではInputのためのDGを作り、その上にアノテーションでKeyを指定する(\ref{src:take})。 705 ChristieではInputのためのDGを作り、その上にアノテーションでKeyを指定する(ソースコード\ref{src:take})。
710 706
711 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java} 707 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java}
712 708
713 709
714 アノテーションで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 710 アノテーションで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。
717 Christieのこのインプットアノテーションはフィールドに対してしか記述できないため、InputDGの生成とTake/Peekの指定とkeyの指定を必ず一箇所で書くことが明確に決まっている。 713 Christieのこのインプットアノテーションはフィールドに対してしか記述できないため、InputDGの生成とTake/Peekの指定とkeyの指定を必ず一箇所で書くことが明確に決まっている。
718 そのためAliceのように外のCSからのkeyへの干渉をされることがない。 714 そのためAliceのように外のCSからのkeyへの干渉をされることがない。
719 また、アノテーションの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 715 また、アノテーションの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。
720 このように、アノテーションを用いたことで、Aliceの記述の分離問題が解決された。 716 このように、アノテーションを用いたことで、Aliceの記述の分離問題が解決された。
721 717
722 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 718 ソースコード\ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。
723 DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、\textless \textgreater 内に指定した型でデータの型を限定できる。 719 DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、\textless \textgreater 内に指定した型でデータの型を限定できる。
724 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。 720 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。
725 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 721 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。
726 722
727 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。 723 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。
728 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。 724 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。
729 この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてアノテーションから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 725 この部分に関しては、JavaのメタプログラミングAPIであるJavassist\cite{javassist}を用いてアノテーションから変数の自動生成も試みたが、Javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。
730 726
731 727
732 リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのアノテーションを用いる(\ref{src:remotetake})。 728 リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのアノテーションを用いる(ソースコード\ref{src:remotetake})。
733 そのため待ち合わせ先がLocalかRemoteかはアノテーションの違いからひと目でわかるようになった。 729 そのため待ち合わせ先がLocalかRemoteかはアノテーションの違いからひと目でわかるようになった。
734 730
735 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java} 731 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java}
736 732
737 733
738 なお、圧縮のMeta ComputationはAliceと同様で、指定する際にDGM名の前にcompressedをつける(\ref{src:compresslocal})。 734 なお、圧縮のMeta ComputationはAliceと同様で、指定する際にDGM名の前にcompressedをつける(ソースコード\ref{src:compresslocal})。
739 735
740 \lstinputlisting[label=src:compresslocal, caption=Localへの圧縮の指定の例]{source/christie/CompressLocal.java} 736 \lstinputlisting[label=src:compresslocal, caption=Localへの圧縮の指定の例]{source/christie/CompressLocal.java}
741 737
742 LocalからのTAKEではDGM名の指定がないが、それはLocalでの圧縮は基本想定していないためである。 738 LocalからのTAKEではDGM名の指定がないが、それはLocalでの圧縮は基本想定していないためである。
743 しかし、Localでの圧縮をしようと思えばRemoteTakeを用いて間接的にすることは可能である。 739 しかし、Localでの圧縮をしようと思えばRemoteTakeを用いて間接的にすることは可能である。
754 \lstinputlisting[label=src:put, caption=Localへputする例]{source/christie/Put.java} 750 \lstinputlisting[label=src:put, caption=Localへputする例]{source/christie/Put.java}
755 \lstinputlisting[label=src:remoteput, caption=Remoteへputする例]{source/christie/RemotePut.java} 751 \lstinputlisting[label=src:remoteput, caption=Remoteへputする例]{source/christie/RemotePut.java}
756 752
757 \newpage 753 \newpage
758 754
759 flipも同様にDGMに直接DGを渡す(\ref{src:flip})。 755 flipも同様にDGMに直接DGを渡す(ソースコード\ref{src:flip})。
760 756
761 \lstinputlisting[label=src:flip, caption=Remoteへflipする例]{source/christie/Flip.java} 757 \lstinputlisting[label=src:flip, caption=Remoteへflipする例]{source/christie/Flip.java}
762 758
763 ChristieではDGMに対して直接putするため、AliceのODSにあたる部分はない。 759 ChristieではDGMに対して直接putするため、AliceのODSにあたる部分はない。
764 ODSを経由するより直接DGMに書き込むような記述のほうが直感的であると考えたためである。 760 ODSを経由するより直接DGMに書き込むような記述のほうが直感的であると考えたためである。
769 ソースコード\ref{src:getdata}はgetDataを用いてInputDGからデータを取得する例である。 765 ソースコード\ref{src:getdata}はgetDataを用いてInputDGからデータを取得する例である。
770 766
771 \lstinputlisting[label=src:getdata, caption=getDataの例]{source/christie/GetData.java} 767 \lstinputlisting[label=src:getdata, caption=getDataの例]{source/christie/GetData.java}
772 768
773 Aliceと違う点は、プログラマが型を指定しなくて良い点である。 769 Aliceと違う点は、プログラマが型を指定しなくて良い点である。
774 4.2.1で示したように、InputDGを生成する際には型を指定する。 770 4.3で示したように、InputDGを生成する際には型を指定する。
775 この型は内部で保存され、リモートノードと通信する際も保たれる。 771 この型は内部で保存され、リモートノードと通信する際も保たれる。
776 このようにgetDataするだけでプログラマが指定しなくとも正しい型で取得できるため、プログラマの負担を減らし信頼性を保証することができる。 772 このようにgetDataするだけでプログラマが指定しなくとも正しい型で取得できるため、プログラマの負担を減らし信頼性を保証することができる。
777 773
778 \newpage 774 \newpage
779 775
793 ソースコード\ref{src:StartCodeGear}の8行目でそれが行われている。 789 ソースコード\ref{src:StartCodeGear}の8行目でそれが行われている。
794 createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。 790 createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。
795 CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。 791 CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。
796 792
797 CGに対してアノテーションから待ち合わせを実行する処理はsetupメソッドが行う。 793 CGに対してアノテーションから待ち合わせを実行する処理はsetupメソッドが行う。
798 そのためソースコード\ref{src:StartCodeGear}の13行目、\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。 794 そのためソースコード\ref{src:StartCodeGear}の13行目、ソースコード\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。
799 AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとアノテーションから待ち合わせを行う処理ができないため、newの後にsetupを行う。 795 AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとアノテーションから待ち合わせを行う処理ができないため、newの後にsetupを行う。
800 そのため、CGの生成には必ずCGMが必要になる。 796 そのため、CGの生成には必ずCGMが必要になる。
801 runでCGMを受け渡すのはこのためである。 797 runでCGMを受け渡すのはこのためである。
802 なお、StartCGはインプットを持たないため、setupを行う必要がなく、newされた時点でrunが実行される。 798 なお、StartCGはインプットを持たないため、setupを行う必要がなく、newされた時点でrunが実行される。
803 799
805 801
806 802
807 \section{DataGearManagerの複数立ち上げ} 803 \section{DataGearManagerの複数立ち上げ}
808 AliceではLocalDGMがstaticで書かれていたため複数のLocalDGMを立ち上げることができなかった。 804 AliceではLocalDGMがstaticで書かれていたため複数のLocalDGMを立ち上げることができなかった。
809 しかしChristieではCGMを2つ生成すればLocalDGMも2つ作られる。 805 しかしChristieではCGMを2つ生成すればLocalDGMも2つ作られる。
810 複数のLocalDGM同士のやりとりも、Remoteへの接続と同じようにRemoteDGMをproxyとして立ち上げアクセスする(図\ref{fig:remoteDGM})。 806 複数のLocalDGM同士のやりとりも、Remoteへの接続と同じようにRemoteDGMをproxyとして立ち上げアクセスする(図\ref{fig:remoteDGM})。
811 807
812 \begin{figure}[h] 808 \begin{figure}[h]
813 \begin{center} 809 \begin{center}
814 \includegraphics[width=130mm]{images/DGM.pdf} 810 \includegraphics[width=130mm]{images/DGM.pdf}
815 \end{center} 811 \end{center}
817 \label{fig:remoteDGM} 813 \label{fig:remoteDGM}
818 \end{figure} 814 \end{figure}
819 815
820 \newpage 816 \newpage
821 817
822 ソースコード\ref{multilocal}は、LocalDSMを2つ立ち上げ、お互いをリモートに見立てて通信する例である。 818 ソースコード\ref{src:multilocal}は、LocalDSMを2つ立ち上げ、お互いをリモートに見立てて通信する例である。
823 11行目にあるように、RemoteDGMを立ち上げるにはCGMが持つcreateRemoteDGMメソッドを用いる。 819 11行目にあるように、RemoteDGMを立ち上げるにはCGMが持つcreateRemoteDGMメソッドを用いる。
824 引数にはRemoteDGM名と接続するリモートノードのIPアドレス、ポート番号を渡している。 820 引数にはRemoteDGM名と接続するリモートノードのIPアドレス、ポート番号を渡している。
825 821
826 \lstinputlisting[label=src:multilocal, caption=LocalDGMを2つ作る例]{source/christie/MultiLocal.java} 822 \lstinputlisting[label=src:multilocal, caption=LocalDGMを2つ作る例]{source/christie/MultiLocal.java}
827 823
851 \end{figure} 847 \end{figure}
852 848
853 プログラマはmainでCGMとStartCGを生成する。 849 プログラマはmainでCGMとStartCGを生成する。
854 CGMと同時にLocalDGMは作られる。 850 CGMと同時にLocalDGMは作られる。
855 CGが生成され、setupメソッドが呼ばれるとアノテーションからTAKEコマンドが作られ実行される。 851 CGが生成され、setupメソッドが呼ばれるとアノテーションからTAKEコマンドが作られ実行される。
856 CGは生成したインプットコマンドの総数を初期値としたカウンタを持っており、コマンドが解決される(InputDGが揃う)たびにカウンタは減っていき、0になるとrun内の処理がThreadPoolへ送られる。 852 CGは生成したインプットコマンドの総数を初期値としたカウンタを持っており、コマンドが解決される(InputDGが揃う)たびにカウンタは減っていき、0になるとrun内の処理がThreadPoolへ送られる。
857 853
858 854
859 \newpage 855 \newpage
860 856
861 図\ref{fig:remotePutSequence}は、LocalDGMにTakeを行うが、LocalDGM内にDGがなかったためにPutの待ち合わせをするときの処理の流れである。 857 図\ref{fig:remotePutSequence}は、LocalDGMにTakeを行うが、LocalDGM内にDGがなかったためにPutの待ち合わせをするときの処理の流れである。
864 \begin{figure}[h] 860 \begin{figure}[h]
865 \begin{center} 861 \begin{center}
866 \includegraphics[width=160mm]{images/RemotePutSequence.pdf} 862 \includegraphics[width=160mm]{images/RemotePutSequence.pdf}
867 \end{center} 863 \end{center}
868 \caption{RemoteDGMにPutしたときのフロー} 864 \caption{RemoteDGMにPutしたときのフロー}
865 \label{fig:remotePutSequence}
869 \end{figure} 866 \end{figure}
870 LocalまたはリモードノードからPUTコマンドが実行された際、もしwaitListにPutしたDGを待っているコマンドがあれば実行される。 867 LocalまたはリモードノードからPUTコマンドが実行された際、もしwaitListにPutしたDGを待っているコマンドがあれば実行される。
871 868
872 869
873 \newpage 870 \newpage
892 REPLYを受け取るとRemoteDGMはwaitListに入っていたコマンドを解決する。 889 REPLYを受け取るとRemoteDGMはwaitListに入っていたコマンドを解決する。
893 890
894 \chapter{再設計への考察} 891 \chapter{再設計への考察}
895 InputDGの指定において、CGにDGを宣言するというのは、DGをそのままflipできるようにするためであった。 892 InputDGの指定において、CGにDGを宣言するというのは、DGをそのままflipできるようにするためであった。
896 逆に言えばそれ以外でDataGear型でプログラマが利用することは少ない。 893 逆に言えばそれ以外でDataGear型でプログラマが利用することは少ない。
897 そのため、DGをアノテーションから生成し完全にメタレイヤーに移すことで、DGの宣言のないより分かりやすい記述が可能だと考える。 894 そのため、DGを宣言せずにアノテーションから生成し完全にメタレイヤーに移すことで、より分かりやすい記述が可能だと考える。
898 flipする場合は、keyを指定するだけにしたほうが良い。 895 flipする場合は、keyを指定するだけで良い。
896
899 また、put/flipする際にDGM名を直接指定する書き方も、まだひと目でアウトプットしている部分が分かるようなシンタックスではないため、改善の余地がある。 897 また、put/flipする際にDGM名を直接指定する書き方も、まだひと目でアウトプットしている部分が分かるようなシンタックスではないため、改善の余地がある。
900 898
901 DGMは一種のデータベースであると述べたが、現状のDGMはデータベースに必要なトランザクションを持っていない。 899 DGMは一種のデータベースであると述べたが、現状のDGMはデータベースに必要なトランザクションを持っていない。
902 当研究室で開発しているJungleデータベースはトランザクションを持っており、更にマージ可能な差分管理システムを持っている。 900 当研究室で開発しているJungleデータベースはトランザクションを持っており、更にマージ可能な差分管理システムを持っている。
903 そのためJungleデータベースとの統合することで、DGMへの操作を信頼性高くできるようにしたほうが望ましい。 901 そのためJungleデータベースとの統合することで、DGMへの操作を信頼性高くすることが望ましい。
904 902
905 現在はノードごとにDGMとDGのkeyが与えられているが、URLのような大域で使えるkeyを用意することで 903 また、現在はノードごとにDGMとDGのkeyが与えられているが、将来的にはURLのような大域で使えるkeyを用意することでより手軽なRemoteDGMへのアクセスを提供できると考えられる。
906 904
907 \chapter{結論} 905 \chapter{結論}
908 \section{まとめ} 906 \section{まとめ}
909 本研究では、まず分散フレームワークに必要な要件を洗い出し、Akka、Hazelcastと比較しながら分散フレームワークAliceが分散性を意識して記述できる特徴をもつことを示した。 907 本研究では、まず分散フレームワークに必要な要件を洗い出し、Akka、Hazelcastと比較しながら分散フレームワークAliceが分散性を意識して記述できる特徴をもつことを示した。
910 また、Aliceの持つCode Segment/Data Segmentの計算モデルや記述方法、Meta Computationについてを説明し、AliceでNAT越えを実現するための手法を示した。 908 また、Aliceの持つCode Segment/Data Segmentの計算モデルや記述方法、Meta Computationについてを説明し、AliceでNAT越えを実現するための手法を示した。
925 CG/DGのプログラミングモデルなどの基本的にはAliceと同じであるが、アノテーションの処理がどれほどのオーバーヘッドに繋がっているか現時点では不明である。 923 CG/DGのプログラミングモデルなどの基本的にはAliceと同じであるが、アノテーションの処理がどれほどのオーバーヘッドに繋がっているか現時点では不明である。
926 そのため、Aliceと同等の速度性能を持っているか、コードの量や複雑度は抑えられているかなどを分散処理の例題を用いて測定する必要がある。 924 そのため、Aliceと同等の速度性能を持っているか、コードの量や複雑度は抑えられているかなどを分散処理の例題を用いて測定する必要がある。
927 925
928 \subsection*{GearsOSへの移行} 926 \subsection*{GearsOSへの移行}
929 GearsOSはまだ開発途中であったため、本論文の作成時点ではChristieのような分散機能を実装することが叶わなかった。 927 GearsOSはまだ開発途中であったため、本論文の作成時点ではChristieのような分散機能を実装することが叶わなかった。
930 GearsOSではモデル検査機構akasha\cite{}があるため、待ちに入っているkeyのputし忘れなどをコンパイルの段階で見つけることができる。 928 GearsOSではモデル検査機構akasya\cite{akasya}があるため、待ちに入っているkeyのputし忘れなどをコンパイルの段階で見つけることができる。
931 GearsOS上で分散プログラミングができればより信頼性の高いプログラミングが期待できるため、将来的にはChristieをGearsOSの分散機構として取り込みたい。 929 GearsOS上で分散プログラミングができればより信頼性の高いプログラミングが期待できるため、将来的にはChristieをGearsOSの分散機構として取り込みたい。
932 930
933 GearsOSにChristieを移行するには、GearsOSにJavaのアノテーションに相当するMeta Computationを実装する必要がある。 931 GearsOSにChristieを移行するには、GearsOSにJavaのアノテーションに相当するMeta Computationを実装する必要がある。
934 そしてChristieでは実現できなかったアノテーションからの変数の自動生成が行えれば更にプログラミングしやすいAPIになると考えられる。 932 そしてChristieでは実現できなかったアノテーションからの変数の自動生成が行えれば更にプログラミングしやすいAPIになると考えられる。
935 933
952 定義したアノテーションの仕様例がソースコード\ref{src:takeAno}、\ref{src:remotetakeAno}である。 950 定義したアノテーションの仕様例がソースコード\ref{src:takeAno}、\ref{src:remotetakeAno}である。
953 951
954 \lstinputlisting[label=src:takeAno, caption=Takeアノテーションの使用例]{source/christie/InputDG.java} 952 \lstinputlisting[label=src:takeAno, caption=Takeアノテーションの使用例]{source/christie/InputDG.java}
955 \lstinputlisting[label=src:remotetakeAno, caption=RemoteTakeアノテーションの使用例]{source/christie/RemoteInputDG.java} 953 \lstinputlisting[label=src:remotetakeAno, caption=RemoteTakeアノテーションの使用例]{source/christie/RemoteInputDG.java}
956 954
957 アノテーションを使う際、()内に記述する値が\ref{src:take}のvalueや\ref{src:remotetake}のdsmNameといったキーに保存される。 955 アノテーションを使う際、()内に記述する値がソースコード\ref{src:take}のvalueやソースコード\ref{src:remotetake}のdsmNameといったキーに保存される。
958 通常キーに対して値を入れる場合は、ソースコード\ref{src:remotetakeAno}のようにkey=の形で記述しなければならないが、Takeのようにキーが1つの場合、キー名をvalueにすることでその記述を省略することができる。 956 通常キーに対して値を入れる場合は、ソースコード\ref{src:remotetakeAno}のようにkey=の形で記述しなければならないが、Takeのようにキーが1つの場合、キー名をvalueにすることでその記述を省略することができる。
959 957
960 setupメソッド内では生成されたフィールドに対してアノテーションを含めた情報を処理している。 958 setupメソッド内では生成されたフィールドに対してアノテーションを含めた情報を処理している。
961 これにはJavaのreflectionAPIが使用されている。 959 これにはJavaのreflectionAPIが使用されている。
962 reflectionAPIでは対象となるクラスのフィールドやメソッド、それに対するアノテーションやアノテーションが保持するキーにアクセスすることができる。 960 reflectionAPIでは対象となるクラスのフィールドやメソッド、それに対するアノテーションやアノテーションが保持するキーにアクセスすることができる。
963 ソースコード\ref{src:setup}はsetupメソッド内でreflectionAPIを用いてアノテーションからTakeコマンドを作成する部分である。 961 ソースコード\ref{src:setup}はsetupメソッド内でreflectionAPIを用いてアノテーションからTakeコマンドを作成する部分である。
964 962
965 \lstinputlisting[label=src:setup, caption=reflectionAPIでフィールドの情報を取得]{source/christie/Setup.java} 963 \lstinputlisting[label=src:setup, caption=reflectionAPIでフィールドの情報を取得]{source/christie/Setup.java}
966 964
967 フィールドから取得したDGとアノテーションから取得したkeyからインプットコマンド(TAKE/PEEK)を生成し、DGMへ送って実行する。 965 フィールドから取得したDGとアノテーションから取得したkeyからインプットコマンド(TAKE/PEEK)を生成し、DGMへ送って実行する。
968 966
969 967
970 \chapter{謝辞} 968 \chapter{謝辞}
971 本研究の遂行、また本論文の作成にあたり、ご多忙にも関わらず終始懇切なる御指導と御 969 本研究の遂行、また本論文の作成にあたり、ご多忙にも関わらず終始懇切なる御指導と御
972 教授を賜わりました河野真治准教授に深く感謝したします。 970 教授を賜わりました河野真治准教授に深く感謝したします。