Mercurial > hg > Papers > 2016 > nozomi-thesis
comparison presen/sample.markdown @ 10:90aaf305aed6 default tip
add presen
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 18 Feb 2016 09:06:13 +0900 |
parents | b2869724949d |
children |
comparison
equal
deleted
inserted
replaced
9:b2869724949d | 10:90aaf305aed6 |
---|---|
1 title: 分散フレームワークAliceのPC画面配信システムへの応用 | 1 title: 分散フレームワークAliceのMeta Data Segment |
2 author: 照屋のぞみ 河野真治 | 2 author: 照屋のぞみ |
3 profile:琉球大学 工学部 情報工学科 | 3 profile:琉球大学 工学部 情報工学科 河野研 |
4 | 4 |
5 # 研究目的(1/3) | 5 # 研究目的(1/3) |
6 * 当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 | 6 * 当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する |
7 * ここで言う信頼性とは定められた環境下で安定して仕様に従った動作を行うことを指す。 | 7 * ここで言う信頼性とは定められた環境下で安定して仕様に従った動作を行うことを指す |
8 * Aliceでは当研究室が提案しているデータを Data Segment、タスクを Code Segment という単位で分割して記述するプログラミング手法を採用している。 | 8 * Aliceでは当研究室が提案しているデータを Data Segment、タスクを Code Segment という単位で分割して記述するプログラミング手法を採用している |
9 | 9 |
10 # 研究目的(2/3) | 10 # 研究目的(2/3) |
11 * Aliceでは、処理をComputationとMetaComputationに階層化し、コアな仕様と複雑な例外処理に分離する。 | 11 * Aliceでは、ComputationとMetaComputationに階層化し、コアな仕様と複雑な例外処理に分離する。 |
12 * 分散環境構築などの複雑な処理はAliceがMeta Computationとして提供する | 12 * 分散環境構築などの複雑な処理はAliceがMeta Computationとして提供する |
13 * 仕様を大きく変更することなくプログラムの挙動が変えられる | 13 * コードの変更を抑え、変更前の信頼性を保ったまま拡張可能にする |
14 * 変更前の信頼性を保ったまま拡張可能にする | |
15 | 14 |
16 # 研究目的(3/3) | 15 # 研究目的(3/3) |
17 * 本研究では、 Alice上に実用的な分散アプリケーションが制作できることを示すために画面配信システムTreeVNCを構築する。 | 16 * 本研究では、Alice上に実用的な分散アプリケーションが制作できることを示すために画面配信システムTreeVNCを構築する |
18 * 構築するにあたり必要となった圧縮機能をAliceのMeta Computationとして実装した。 | 17 * 構築するにあたり必要となった圧縮機能をAliceのMeta Computationとして実装した |
19 * もとのTreeVNCとの比較を行うことでMetaComputationの役割と有効性を示す。 | 18 * もとのTreeVNCとの比較を行うことでMeta Computationの役割と有効性を示す |
20 | 19 |
21 | 20 |
22 # Data Segment と Code Segment | 21 # Data Segment と Code Segment |
23 * Aliceではデータを **Data Segment(DS)** 、タスクを **Code Segment(CS)** という単位に分割して依存関係を記述することでプログラミングを行う。 | 22 * Aliceではデータを **Data Segment(DS)** 、タスクを **Code Segment(CS)** という単位に分割して依存関係を記述することでプログラミングを行う。 |
24 * CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。 | 23 * CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。 |
25 * CSはkeyで指定されたDSが揃うと実行されるという性質を持つ。 | 24 * CSはkeyで指定されたDSが全て揃うと実行されるという性質を持つ。 |
26 ![opt](./images/dsandcs.svg){:width="60%"} | 25 ![opt](./images/dsandcs.svg){:width="50%"} |
27 | 26 |
28 # CodeSegmentの依存関係 | 27 # CodeSegmentの依存関係 |
29 * データの依存関係にないCSは並列実行される | 28 * データの依存関係にないCSは並列実行される |
30 * データの依存関係がある場合は Input DS が揃うと順に実行される | 29 * データの依存関係がある場合は Input DS が揃うと順に実行される |
31 * DSはCSに専有されるためロックの記述を必要としない | 30 * DSはCSに専有されるためロックの記述を必要としない |
32 ![opt](./images/dsandcs2.svg){:width="60%"} | 31 ![opt](./images/dsandcs2.svg){:width="60%"} |
33 | 32 |
34 # Data Segment と CodeSegment | |
35 * AliceはJavaで実装されており、DSはJava-Object、CSはRunnableに相当する | |
36 * ユーザーが記述する際には CodeSegment.class を継承することでDSを操作するためのAPIを利用して依存関係を記述することができる。 | |
37 * DSはAliceが内部にもつデータベース(DS Manager)により管理されており、CSはDSに対応する一意のkeyを使ってDSを操作する。 | |
38 | |
39 # Data Segment Manager | 33 # Data Segment Manager |
40 * DS の集合体であるデータベースを Alice では **DS Manager(DSM)** と呼ぶ。 | 34 * DS の集合体であるデータベースを **DS Manager(DSM)** と呼ぶ。 |
35 * Local DSM … 各ノード固有のデータベース。 | |
36 * Remote DSM … 他のノードの Local DSM の proxy。接続しているノードの数だけ存在する。 | |
41 * DSM 内の DS には対になる String型のkey が存在し、 DSM 名と key を指定しすることで DS の保存、取得を行う。 | 37 * DSM 内の DS には対になる String型のkey が存在し、 DSM 名と key を指定しすることで DS の保存、取得を行う。 |
42 * keyに対して複数のDSを保存する際はFIFO的に処理される | |
43 ![opt](./images/KeyDS.svg){:width="50%"} | |
44 | |
45 # Data Segment Manager | |
46 * Local DSM … 各ノード固有のデータベース。 | |
47 * Remote DSM … 他のノードの Local DSM の proxy。接続しているノードの数だけ存在する。 | |
48 ![opt](./images/remote_datasegment.svg){:width="50%"} | 38 ![opt](./images/remote_datasegment.svg){:width="50%"} |
49 | 39 |
50 # Data Segment API | |
51 * DS の追加 | |
52 * put(String managerKey, String key, Object val) | |
53 * update(String managerKey, String key, Object val) ※先頭DSを削除してからput | |
54 * flip(String managerKey, String key, Receiver receiver) ※ゼロコピー転送用 | |
55 * DS の取得 | |
56 * take(String managerKey, String key) | |
57 * peek(String managerKey, String key) ※DSMから削除されない | |
58 | |
59 * take/peekは実際にはcreate()とsetKey()によって行われる | |
60 * create()でDSの受け皿を作っておき、setKey()にkeyをセットすることで Input DS を指定する | |
61 | 40 |
62 # Computation と Meta Computation | 41 # Computation と Meta Computation |
63 * Aliceでは、計算の本質的な処理をComputatin、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。 | 42 * Aliceでは、計算の本質的な処理をComputatin、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。 |
64 * Alice のComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理。 | 43 * 分散トポロジーの構成、通信の切断・再接続時の処理などはMeta ComputationとしてAliceが提供 |
65 * 分散トポロジーの構成、通信の切断・再接続時の処理やデータの表現形式の選択など、Computationを支えている処理。 | 44 * プログラマは目的の処理だけ記述し通信部分などはMeta Computationを指定することでシンプルな記述を実現 |
66 | 45 |
67 # Computation と Meta Computation | 46 # Computation と Meta Computation |
68 * DS/CSの接続の間にMeta Computationが実行されている | 47 * DS/CSの接続の間にMeta Computationが実行されている |
69 * AliceのMeta ComputationもCS/DSにより実現される | 48 * AliceのMeta ComputationもCS/DSにより実現される |
70 * Meta ComputationはCS の処理を支えるMeta CSとMeta CSに管理されるMeta DSに分けられる | 49 * Meta ComputationはCS の処理を支えるMeta CSとMeta CSに管理されるMeta DSに分けられる |
71 ![opt](./pictures/MetaCSDS.svg){:width="70%"} | 50 ![opt](./pictures/MetaCSDS.svg){:width="70%"} |
72 | 51 |
73 # Computation と Meta Computation | 52 |
74 * 分散環境構築などの複雑な処理をAliceがMeta Computationとして提供する | 53 # TreeVNCへの応用 |
75 * プログラマは目的の処理だけ記述し通信部分などはMeta Computationを指定する | 54 * AliceのMeta Computationの有効性を示すため実用的な例題であるTreeVNCを実装する |
76 | 55 * TightVNCをもとにした木構造画面配信システム |
77 # TreeVNC | |
78 * Aliceを用いて実装する実用的な分散プログラムの例題 | |
79 * 当研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム | |
80 * TightVNCがもとになっている | |
81 * 画面処理や分散処理が混在する複雑なTreeVNCも、Aliceを用いればTightVNCからの変更が少ない見通しの良い記述で構成可能 | 56 * 画面処理や分散処理が混在する複雑なTreeVNCも、Aliceを用いればTightVNCからの変更が少ない見通しの良い記述で構成可能 |
82 | 57 |
83 # TreeVNCで必要な機能 | 58 # TreeVNCで必要な機能 |
84 TreeVNCのComputation(VNCサーバからデータを受け取り表示)を支える機能をMeta Computationとして実装する | 59 TreeVNCのComputation(VNCサーバからデータを受け取り表示)を支える機能をMeta Computationとして実装する |
85 | 60 |
90 * データの圧縮 | 65 * データの圧縮 |
91 | 66 |
92 # Meta Computationの追加 | 67 # Meta Computationの追加 |
93 * TreeVNCの数MByteの画面差分データを配信し続けるためデータを圧縮している | 68 * TreeVNCの数MByteの画面差分データを配信し続けるためデータを圧縮している |
94 * 画面データを圧縮して送る → 解凍して画面表示 → 再圧縮して子ノードへ転送 | 69 * 画面データを圧縮して送る → 解凍して画面表示 → 再圧縮して子ノードへ転送 |
95 * 再圧縮オーバーヘッドなしにゼロコピー転送する機能が必要 | 70 * 圧縮状態のまま子ノードに送信ができれば、解凍・再圧縮 するオーバーヘッドを無くすことができる |
96 * 圧縮のMeta Computationと転送のMeta Computationを追加した | 71 * 圧縮のMeta Computationと転送のMeta Computationを追加した |
97 | 72 |
98 # 圧縮表現(Meta DS)の追加 | 73 # 圧縮表現(Meta DS)の追加 |
99 * DSを複数作るのではなく、1つのDSに対しMeta DSとして以下の表現を同時に持たせる | 74 * DSを複数作るのではなく、1つのDSに対しMeta DSとして以下の表現を同時に持たせる |
100 | 75 |
101 <table style="border:none;"> | 76 <table style="border:none;"> |
102 <tr><td> | 77 <tr><td width="550px"> |
103 1. 一般的なJavaのオブジェクト<br> | 78 1. 一般的なJavaのオブジェクト<br> |
104 LocalDSMにputしたときの形式 <br> | 79 LocalDSMにputしたときの形式 <br> |
105 2. MessagePackでシリアライズ化されたバイナリオブジェクト <br> | 80 <br> |
106 RemoteDSMにputしたときの形式 <br> | 81 2. シリアライズ化されたバイナリオブジェクト <br> |
107 3. 2をさらに圧縮したバイナリオブジェクト <br> | 82 RemoteDSMにputしたときの形式 <br> |
108 今回追加した形式 <br> | 83 <br> |
84 3. 2を圧縮したバイナリオブジェクト <br> | |
85 今回追加した形式 <br> | |
109 </td> | 86 </td> |
110 <td> | 87 <td width="500px"> |
111 <img src="./pictures/compressDS.svg" width="90%"> | 88 <img src="./pictures/compressDS.svg" width="100%"> |
112 </td> | 89 </td> |
113 </tr> | 90 </tr> |
114 </table> | 91 </table> |
115 | 92 |
116 | |
117 # MessagePackとは | |
118 * Sadayuki Furuhashiが開発したシリアライズのための機能をまとめたオープンソースライブラリ。 | |
119 * シリアライズ/デシリアライズを高速に行うことができ、整数、浮動小数点数、Boolean、文字列、配列、連想配列、nilをバイト列にシリアライズできる。 | |
120 * JSONのようにプログラミング言語に依存しないデータの表現形式として使用できる。 | |
121 | 93 |
122 | 94 |
123 # 圧縮表現を扱うDSMとAPIの追加 | 95 # 圧縮表現を扱うDSMとAPIの追加 |
124 * Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加 | 96 * Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加 |
125 * DSを圧縮したい場合は指定する DSM を Compressed DSM に変える | 97 * DSを圧縮したい場合は指定する DSM を Compressed DSM に変える |
128 put("Remote", "Key", val); | 100 put("Remote", "Key", val); |
129 put("compressedRemote", "Key", val); | 101 put("compressedRemote", "Key", val); |
130 ``` | 102 ``` |
131 | 103 |
132 # 圧縮表現がオンデマンドに作られる | 104 # 圧縮表現がオンデマンドに作られる |
133 * NodeAでNodeBのcompressed RemoteDSM に対してDSをput | |
134 ![opt](./pictures/flow1.svg){:width="80%"} | |
135 | |
136 # 圧縮表現がオンデマンドに作られる | |
137 * DS が圧縮表現を持っていなければCompressed DSM内部で圧縮表現を生成してput | |
138 ![opt](./pictures/flow2.svg){:width="80%"} | |
139 | |
140 # 圧縮表現がオンデマンドに作られる | |
141 * RemoteDSMがAliceの送信パケットをNodeBのLocalDSMに送る | |
142 ![opt](./pictures/flow3.svg){:width="80%"} | |
143 | |
144 # 圧縮表現がオンデマンドに作られる | |
145 * NodeBのLocalDSMでは圧縮表現のみのDSとして保存する | |
146 ![opt](./pictures/flow4.svg){:width="80%"} | |
147 | |
148 # 圧縮表現がオンデマンドに作られる | |
149 * setKey()でtake/peekで呼ばれたらReceiverにDSが渡される | |
150 ![opt](./pictures/flow5.svg){:width="80%"} | |
151 | |
152 # 圧縮表現がオンデマンドに作られる | |
153 * castメソッドである **asClass()** が解凍・デシリアライズされた表現を作って渡す | |
154 ![opt](./pictures/flow6.svg){:width="80%"} | |
155 | |
156 # 圧縮表現がオンデマンドに作られる | |
157 * DS はオブジェクト表現と圧縮表現を同時にもつため、TreeVNCでは受け取った画面データを解凍した後、転送のためにコピーや再圧縮をすることはない。 | 105 * DS はオブジェクト表現と圧縮表現を同時にもつため、TreeVNCでは受け取った画面データを解凍した後、転送のためにコピーや再圧縮をすることはない。 |
158 * 複数表現は必要最低限にしか作られない。 | 106 * 複数表現は必要最低限にしか作られない。 |
159 * 一つのKeyに対し様々な表現のDSが対応するが、asClass()によってユーザーは送られてくるDSの表現を気にせず扱える。 | 107 * 一つのKeyに対し様々な表現のDSが対応するが、キャストメソッドであるasClass()によってユーザーは送られてくるDSの表現を気にせず任意の型で取り出せる。 |
160 | 108 |
161 # Meta Computationの評価 | 109 # Meta Computationの評価 |
162 TreeVNCとAliceVNCを比較した | 110 TreeVNCとAliceVNCを比較した |
163 | 111 |
164 * 性能比較 | 112 * 性能比較 |
166 同等の性能が実現できたか | 114 同等の性能が実現できたか |
167 * コード比較 | 115 * コード比較 |
168 コード量・コード複雑度を比較 | 116 コード量・コード複雑度を比較 |
169 シンプルな記述で仕様の変更が抑えられているか | 117 シンプルな記述で仕様の変更が抑えられているか |
170 | 118 |
171 # 性能比較 - 実験内容 | |
172 * 木の段数ごとにメッセージの到達にどれぐらい時間がかかっているかを計測 | |
173 * 講義内で学生に協力してもらい、最大 17 名の接続があった | |
174 ![](./pictures/delay.svg){:width="50%"}![](./pictures/delay2.svg){:width="50%"} | |
175 | |
176 # 性能比較 - 実験結果 | 119 # 性能比較 - 実験結果 |
177 * 3段目の計測結果 | 120 * 3段目の計測結果 |
178 * 同じ傾向から同等の処理性能があることがわかった | 121 * 同じ傾向から同等の処理性能があることがわかった |
179 | 122 |
180 <table style="border:none;"> | 123 <table style="border:none;"> |
219 </table> | 162 </table> |
220 | 163 |
221 # コード複雑度比較 | 164 # コード複雑度比較 |
222 * 循環的複雑度を用いる | 165 * 循環的複雑度を用いる |
223 コード内の線形独立な経路の数。if や forが多いほど複雑度が高い。 | 166 コード内の線形独立な経路の数。if や forが多いほど複雑度が高い。 |
224 * 計測にはIntelliJのプラグイン「MetricsReloaded」を使用 | |
225 | 167 |
226 <table style="border-collapse: collapse;border:1px solid #000000;"> | 168 <table style="border-collapse: collapse;border:1px solid #000000;"> |
227 <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"></th> | 169 <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"></th> |
228 <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"> 平均値 </th> | 170 <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"> 平均値 </th> |
229 <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">最高値</th> | 171 <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">最高値</th> |
250 * AliceVNCで最も複雑度が高いSwingViewerWindow.classは、TightVNCから変更がほとんどないため、AliceVNCの持っている複雑度はTightVNCが元来持っていた複雑度 | 192 * AliceVNCで最も複雑度が高いSwingViewerWindow.classは、TightVNCから変更がほとんどないため、AliceVNCの持っている複雑度はTightVNCが元来持っていた複雑度 |
251 | 193 |
252 | 194 |
253 | 195 |
254 # まとめ | 196 # まとめ |
255 * Alice が実用的なアプリケーションを記述するための Meta Computation として、Meta Data Segmentに複数の表現のデータを同時に持たせることで圧縮機能を実装した。 | 197 * Alice が実用的なアプリケーションを記述するための Meta Computation として、Meta Data Segmentに複数の表現のデータを同時に持たせることで圧縮機能を実装した。同様の手法を用いれば暗号表現などへの対応もでき自由度の高い通信を行うことが可能になる。 |
256 * TreeVNCをAlice上で実装し比較を行った結果、シンプルな記述でTreeVNCの基本機能を実現でき、同等の性能を出すことに成功した。 | 198 * TreeVNCをAlice上で実装し比較を行った結果、変更量の少ないシンプルな記述でTreeVNCの基本機能を実現でき、同等の性能を出すことに成功した。 |
257 * AliceのMeta Computationが信頼性の高い実 用的な分散アプリケーションの構築に有用であることが確認された。 | 199 * AliceのMeta Computationが拡張性・信頼性の高い実用的な分散アプリケーションの構築に有用であることが確認された。 |
200 | |
201 # 今後の課題 | |
202 * TreeVNCでは拡張が困難であった別ネットワーク間の通信もTopology Manager を用いれば容易に拡張できると考えられる | |
203 ![opt](./pictures/overNAT.svg){:width="60%"} | |
258 | 204 |
259 # 今後の課題 | 205 # 今後の課題 |
260 * APIの再設計 | 206 * APIの再設計 |
261 * put/updateに対しtake/peekがcreate()・setKey()の操作はわかりにくい | 207 * put/updateに対しtake/peekがcreate()・setKey()の操作はわかりにくい |
262 * DSの型情報のマネジメント | 208 * DSの型情報のマネジメント |
263 * 型情報がないのでpeek/takeする際にわかりにくい | 209 * 型情報がないのでpeek/takeする際にわかりにくい |
264 * セキュリティをサポートしていない | 210 * セキュリティをサポートしていない |
265 * 圧縮と同様の手法で暗号形式のデータ表現を扱えるように拡張可能 | 211 * 圧縮と同様の手法で暗号形式のデータ表現を扱えるように拡張可能 |
266 | 212 |
267 # 今後の課題 | 213 |
268 * TreeVNCでは拡張が困難であった別ネットワーク間の通信もTopology Manager を用いれば容易に拡張できると考えられる | 214 |
269 ![opt](./pictures/overNAT.svg){:width="60%"} | |
270 | |
271 # Dynamic Topology Manager | |
272 ![](./pictures/tree1.svg){:width="33%"}![](./pictures/tree2.svg){:width="33%"}![](./pictures/tree3.svg){:width="33%"} | |
273 | |
274 | |
275 # CodeSegment の 例 | |
276 * RemoteDSM から DSをtakeし、LocalDSM に put を10回繰り返す | |
277 ![opt](./pictures/remoteTest.svg){:width="70%"} | |
278 | |
279 # CodeSegment の 例 | |
280 * RemoteDSM から DSをtakeし、LocalDSM に put を10回繰り返す | |
281 * CSはInputDSを持たないStartCSからはじまる | |
282 ![opt](./pictures/remoteTest2.svg){:width="70%"} | |
283 | |
284 # StartCodeSegmentの例 | |
285 ```java | |
286 public class RemoteStartCodeSegment extends CodeSegment { | |
287 | |
288 @Override | |
289 public void run() { | |
290 RemoteIncrement cs = new RemoteIncrement();//CSを生成 | |
291 ods.put("local", "num", 0); | |
292 } | |
293 | |
294 } | |
295 ``` | |
296 | |
297 # StartCodeSegmentの例 | |
298 ```java | |
299 public class RemoteStartCodeSegment extends CodeSegment { | |
300 | |
301 @Override | |
302 public void run() { | |
303 RemoteIncrement cs = new RemoteIncrement(); | |
304 ods.put("local", "num", 0);//DSをLocalDSMにput | |
305 } | |
306 | |
307 } | |
308 ``` | |
309 | |
310 # CodeSegment の 例 | |
311 ```java | |
312 public class RemoteIncrement extends CodeSegment { | |
313 | |
314 public Receiver num = ids.create(CommandType.TAKE);//DSの受け皿を作る | |
315 | |
316 public RemoteIncrement(){ | |
317 num.setKey("remote", "num"); | |
318 } | |
319 | |
320 @Override | |
321 public void run() { | |
322 int n = num.asClass(Integer.class); | |
323 if (n == 10) System.exit(0); | |
324 RemoteIncrement cs = new RemoteIncrement(); | |
325 ods.put("local", "num", ++n); | |
326 } | |
327 | |
328 } | |
329 ``` | |
330 | |
331 # CodeSegment の 例 | |
332 ```java | |
333 public class RemoteIncrement extends CodeSegment { | |
334 | |
335 public Receiver num = ids.create(CommandType.TAKE); | |
336 | |
337 public RemoteIncrement(){ | |
338 num.setKey("remote", "num");//CSにInputDSをセット。待ち合わせが発生。 | |
339 } | |
340 | |
341 @Override | |
342 public void run() { | |
343 int n = num.asClass(Integer.class); | |
344 if (n == 10) System.exit(0); | |
345 RemoteIncrement cs = new RemoteIncrement(); | |
346 ods.put("local", "num", ++n); | |
347 } | |
348 | |
349 } | |
350 ``` | |
351 | |
352 # CodeSegment の 例 | |
353 ```java | |
354 public class RemoteIncrement extends CodeSegment { | |
355 | |
356 public Receiver num = ids.create(CommandType.TAKE); | |
357 | |
358 public RemoteIncrement(){ | |
359 num.setKey("remote", "num"); | |
360 } | |
361 | |
362 @Override | |
363 public void run() { | |
364 int n = num.asClass(Integer.class);//InputDSをキャストして取得 | |
365 if (n == 10) System.exit(0); | |
366 RemoteIncrement cs = new RemoteIncrement(); | |
367 ods.put("local", "num", ++n); | |
368 } | |
369 | |
370 } | |
371 ``` | |
372 | |
373 # CodeSegment の 例 | |
374 ```java | |
375 public class RemoteIncrement extends CodeSegment { | |
376 | |
377 public Receiver num = ids.create(CommandType.TAKE); | |
378 | |
379 public RemoteIncrement(){ | |
380 num.setKey("remote", "num"); | |
381 } | |
382 | |
383 @Override | |
384 public void run() { | |
385 int n = num.asClass(Integer.class); | |
386 if (n == 10) System.exit(0);//num=10なら終了 | |
387 RemoteIncrement cs = new RemoteIncrement(); | |
388 ods.put("local", "num", ++n); | |
389 } | |
390 | |
391 } | |
392 | |
393 ``` | |
394 | |
395 | |
396 # CodeSegment の 例 | |
397 ```java | |
398 public class RemoteIncrement extends CodeSegment { | |
399 | |
400 public Receiver num = ids.create(CommandType.TAKE); | |
401 | |
402 public RemoteIncrement(){ | |
403 num.setKey("remote", "num"); | |
404 } | |
405 | |
406 @Override | |
407 public void run() { | |
408 int n = num.asClass(Integer.class); | |
409 if (n == 10) System.exit(0); | |
410 RemoteIncrement cs = new RemoteIncrement();//次のCSを生成 | |
411 ods.put("local", "num", ++n); | |
412 } | |
413 | |
414 } | |
415 ``` | |
416 | |
417 # CodeSegment の 例 | |
418 ```java | |
419 public class RemoteIncrement extends CodeSegment { | |
420 | |
421 public Receiver num = ids.create(CommandType.TAKE); | |
422 | |
423 public RemoteIncrement(){ | |
424 num.setKey("remote", "num"); | |
425 } | |
426 | |
427 @Override | |
428 public void run() { | |
429 int n = num.asClass(Integer.class); | |
430 if (n == 10) System.exit(0); | |
431 RemoteIncrement cs = new RemoteIncrement(); | |
432 ods.put("local", "num", ++n);//インクリメントしたDSをput | |
433 } | |
434 | |
435 } | |
436 ``` | |
437 | 215 |
438 | 216 |
439 <style type="text/css"> | 217 <style type="text/css"> |
440 <!-- | 218 <!-- |
441 *{ | 219 *{ |