comparison presen/sample.markdown @ 179:a3ee75a897f3

cut slide
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Tue, 06 Feb 2018 13:46:47 +0900
parents 074eb76a9184
children 5a0a11b54ab4
comparison
equal deleted inserted replaced
178:074eb76a9184 179:a3ee75a897f3
1 title: 分散フレームワークChristieの設計 1 title: 分散フレームワークChristieの設計
2 author: 照屋のぞみ 2 author: 照屋のぞみ
3 3
4 # 研究目的(1/2) 4 # 研究目的(1/2)
5 * スケーラブルで信頼性の高い分散プログラムを書くのは容易ではない
6 * 並列で動く分散した資源を意識するのは難しい
7 * 分散したノードの選択方法が明確ではない􏱾􏱿􏰮􏳠􏲒􏰌􏰍􏰞􏰫􏷑􏷒􏱃􏱱􏲭􏰞􏰡􏰨􏰢􏱯􏱰􏰻􏰼􏰔􏰠􏳍􏳎􏰮􏰠􏰡􏲒􏰭􏲣 􏰫􏰭􏰘􏰔􏱑􏰥􏰹􏰌􏰍􏰞􏰫
8 * 当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する 5 * 当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する
9 * ここで言う信頼性とは定められた環境下で安定して仕様に従った動作を行うことを指す 6 * ここで言う信頼性とは定められた環境下で安定して仕様に従った動作を行うことを指す
10 * 仕様の記述のしやすさ、可読性、拡張時に仕様変更を抑えられるかも含む 7 * 仕様の記述のしやすさ、可読性、拡張時に仕様変更を抑えられるかも含む
11 * スケーラビリティとはサービス利用者が増加したとき単純にノードを追加するだけで線形に性能を向上させる能力 8 * スケーラビリティとはサービス利用者が増加したとき単純にノードを追加するだけで線形に性能を向上させる能力
12 9
16 * Aliceの問題点を整理し、得られた知見をもとに分散フレームワークChristieの設計を行う 13 * Aliceの問題点を整理し、得られた知見をもとに分散フレームワークChristieの設計を行う
17 14
18 15
19 # 目次 16 # 目次
20 * Aliceの概要 17 * Aliceの概要
21 * Code Segment / Data Segment 18 * AliceのNAT越え
22 * Data Segment Manager
23 * API
24 * Computation / Meta Computation
25 * Topology Manager
26 * 圧縮
27 * Topology Managerの拡張設計
28 * 別トポロジー間の接続のための設計
29 * 別ネットワーク間の接続のための設計
30 * Aliceの問題点 19 * Aliceの問題点
31 * LocalDSMの複数立ち上げができない
32 * 記述の煩雑さ
33 * Christieの設計 20 * Christieの設計
34 * 基本設計
35 * 記述性の改善
36 * 他フレームワークとの比較 21 * 他フレームワークとの比較
37 * Akka, Hazelcast
38 * 設計思想の違い
39 * 記述性の違い
40 * 提供する機能
41 * まとめ 22 * まとめ
42 * 今後の課題 23 * 今後の課題
43 24
44 25
45 26
72 * Remote DSMにはString型のDSM keyを指定してアクセスする 53 * Remote DSMにはString型のDSM keyを指定してアクセスする
73 ![opt](./pictures/newDSM.svg){:width="50%"} 54 ![opt](./pictures/newDSM.svg){:width="50%"}
74 55
75 # Data Segment API 56 # Data Segment API
76 * DSの取得 57 * DSの取得
77 * `void take(String managerKey, String key)` 58 * take/peek
78 * `void peek(String managerKey, String key)`
79 * DSの追加 59 * DSの追加
80 * `void put(String managerKey, String key, Object val)` 60 * put/update
81 * `void update(String managerKey, String key, Object val)` 61 * DSの転送
82 * `void flip(String managerKey, String key, Receiver val)` 62 * flip
83 63
84 # Code Segmentの記述例 64 # Code Segmentの記述例
85 * take/peekをするにはcreate/setKeyメソッドを使わなければならない 65 * take/peekをするにはcreate/setKeyメソッドを使わなければならない
86 * *create* でインプットDGのRecieverを作り、*setKey* でReceiverにインプットとなるkeyを指定 66 * *create* でインプットDGのRecieverを作り、*setKey* でReceiverにインプットとなるkeyを指定
87 * データをReceiverから取り出す際は *asClass()* で型を指定 67 * データをReceiverから取り出す際は *asClass()* で型を指定
125 * ノード間の接続管理やトポロジーの構成管理行うMeta Computation 105 * ノード間の接続管理やトポロジーの構成管理行うMeta Computation
126 * Static Topology ManagerとDynamic Topology Managerがある 106 * Static Topology ManagerとDynamic Topology Managerがある
127 * Topology Node 107 * Topology Node
128 * 各ノード側でTopology Managerとの通信を行うMeta Computation 108 * 各ノード側でTopology Managerとの通信を行うMeta Computation
129 * ノードアプリケーションを記述する際にTopology Nodeをnewしておけば以降のTopology Managerとの通信やノード間の接続を行う 109 * ノードアプリケーションを記述する際にTopology Nodeをnewしておけば以降のTopology Managerとの通信やノード間の接続を行う
130 * Topology Manager/NodeもCS/DSを用いて実装されている。 110
131 111 # AliceのMeta Computation - Topology Manager/Topology Node
132 # AliceのMeta Computation - Static Topology Manager 112 * Topology Managerを立ち上げる
133 * プログラマがdot形式のトポロジーファイルを用意し、Topology Managerに読み込ませる
134 * トポロジーファイルにはノードの接続関係と接続する際に指定するRemote DSM名を記す
135 * Graphvizを用いればトポロジーを描くだけでトポロジーファイルが自動出力されるため構成が容易
136
137 ```dot
138 digraph test{
139 node0 −> node1[label=”right”]
140 node0 −> node2[label=”left”]
141 node1 −> node2[label=”right”]
142 node1 −> node0[label=”left”]
143 node2 −> node0[label=”right”]
144 node2 −> node1[label=”left”]
145 }
146 ```
147
148 # AliceのMeta Computation - Static Topology Manager
149 * ファイルを読み込んだTopology Managerを立ち上げる
150 * 各Topology NodeはTopology Managerに参加表明をし接続すべきノードの情報を要求する 113 * 各Topology NodeはTopology Managerに参加表明をし接続すべきノードの情報を要求する
151 ![opt](./pictures/tree1.svg){:width="60%"} 114 ![opt](./pictures/tree1.svg){:width="60%"}
152 115
153 # AliceのMeta Computation - Static Topology Manager 116 # AliceのMeta Computation - Topology Manager/Topology Node
154 * 参加表明があった順に各ノードにnodeNameを割り当て、接続するべきノードのIPアドレス/ポート番号を送る 117 * 参加表明があった順に各ノードにnodeNameを割り当て、接続するべきノードのIPアドレス/ポート番号を送る
155 ![opt](./pictures/tree2.svg){:width="60%"} 118 ![opt](./pictures/tree2.svg){:width="60%"}
156 119
157 # AliceのMeta Computation - Static Topology Manager 120 # AliceのMeta Computation - Topology Manager/Topology Node
158 * Topology Nodeが受け取った情報をもとにRemote DSMを立ちあげ接続し合うことでオーバーレイネットワークが作られる 121 * Topology Nodeが受け取った情報をもとにRemote DSMを立ちあげ接続し合うことでオーバーレイネットワークが作られる
159 * Topology Managerは接続情報を管理し、実際の接続はTopology Nodeが行う 122 * Topology Managerは接続情報を管理し、実際の接続はTopology Nodeが行う
160 ![opt](./pictures/tree3.svg){:width="60%"} 123 ![opt](./pictures/tree3.svg){:width="60%"}
161
162 # AliceのMeta Computation - Dynamic Topology Manager
163 * 参加するノード数があらかじめ決まっているとは限らない
164 * Dynamic Topology Managerがノードを参加表明順にトポロジーに組み込む
165 * 現在はTree Topologyに対応
166 124
167 # AliceのMeta Computation - 圧縮 125 # AliceのMeta Computation - 圧縮
168 * DSは内部に圧縮・非圧縮の複数の形式を複数もつことができる 126 * DSは内部に圧縮・非圧縮の複数の形式を複数もつことができる
169 * 圧縮したデータの伸長と圧縮したままの転送が同時に可能 127 * 圧縮したデータの伸長と圧縮したままの転送が同時に可能
170 ![opt](./pictures/compress.svg){:width="80%"} 128 ![opt](./pictures/compress.svg){:width="80%"}
173 * 圧縮の指定には宛先DGM keyに"compressed"とつけるだけでよい 131 * 圧縮の指定には宛先DGM keyに"compressed"とつけるだけでよい
174 `put("compressedRemoteDGM", "key", data)` 132 `put("compressedRemoteDGM", "key", data)`
175 * 伸長も *asClass()* した際に自動でされる 133 * 伸長も *asClass()* した際に自動でされる
176 * コードの変更が抑えて圧縮・非圧縮が切り替えられる 134 * コードの変更が抑えて圧縮・非圧縮が切り替えられる
177 135
178 136 # AliceのNATを越え
179
180 # Aliceに求められるMeta Computation - アプリケーションの接続
181 * 別のトポロジーをもった既存のアプリケーション同士をコードの変更を抑えつつ接続させたい
182 * AliceVNC
183 * Alice上に実装したツリートポロジーの画面配信システム
184 * AliceChat
185 * Alice上に実装したスタートポロジーのチャット
186 * 連携することで実現したい機能
187 * VNC画面のスナップショットをチャットに載せる
188 * チャットの内容をVNC画面にコメントとして流す
189
190 # Aliceに求められるMeta Computation - アプリケーションの接続
191 * それぞれのアプリケーションのトポロジーを構成するTopologyManagerを連携させることで可能
192 ![opt](./pictures/vncandchat.svg){:width="70%"}
193
194 # Aliceに求められるMeta Computation - NATを越えた接続
195 * NATを越えたノード間通信は分散処理の課題である 137 * NATを越えたノード間通信は分散処理の課題である
196 * Aliceではトポロジー管理がアプリケーションから分離しているため、コードを大きく変更しなくともTopology Managerを増やすことでトポロジーの拡張が可能 138 * Aliceではトポロジー管理がアプリケーションから分離しているため、コードを大きく変更しなくともTopology Managerを増やすことでNAT越えが可能
197 139
198 # Aliceに求められるMeta Computation - NATを越えた接続 140 # AliceのNATを越え接続
199 * 各プライベートネットワーク内を管理するPrivate Topology Manager 141 * 各プライベートネットワーク内を管理するPrivate Topology Manager
200 * グローバルIPアドレスを持ったGlobal Topology Managerを1つ立てる 142 * グローバルIPアドレスを持ったGlobal Topology Managerを1つ立てる
201 * TopologyNodeが複数対応できるためPrivate/Global Topology Managerに接続 143 * TopologyNodeが複数対応できるためPrivate/Global Topology Managerに接続
202 ![opt](./pictures/overNAT.svg){:width="70%"} 144 ![opt](./pictures/overNAT.svg){:width="70%"}
203 145
216 158
217 159
218 # Aliceの問題点 - LocalDSMを複数立ち上げられない 160 # Aliceの問題点 - LocalDSMを複数立ち上げられない
219 * AliceではDSMを管理するクラスがstaticで書かれていたためLocal DSMを複数立ち上げることができない 161 * AliceではDSMを管理するクラスがstaticで書かれていたためLocal DSMを複数立ち上げることができない
220 * このstaticを抜くにはAliceのコード全体を大きく変更しなければならない 162 * このstaticを抜くにはAliceのコード全体を大きく変更しなければならない
221 * アプリケーション接続やNAT越えのMeta Computationの追加が困難 163 * 現状ではNAT越えのMeta Computationの追加が困難
222 * 複数インスタンスを立ち上げての分散プログラムのテストが書けない 164 * 複数インスタンスを立ち上げての分散プログラムのテストが書けない
165 * 再設計の必要がある
223 166
224 # Aliceの問題点 - APIシンタックスの分離 167 # Aliceの問題点 - APIシンタックスの分離
225 * setKeyは記述場所が決まっておらず、CSの外からも呼べる 168 * setKeyは記述場所が決まっておらず、待ち合わせを行っているCSの外からも呼べる
226 * CSの再利用を可能にするが、どのkeyを待っているのか不明なCSが生まれてしまう 169 * どのkeyを待っているのか不明なCSが生まれてしまう
227 * setKeyではkeyを動的に指定することができる 170 * setKeyではkeyを動的に指定することができる
228 * どんな処理を行っているかわかりづらい 171 * どんな処理を行っているかわかりづらい
229 * 対応するput箇所も修正しなければならない 172 * 対応するput箇所も修正しなければならない
230 * モデル検査しづらくなる 173 * モデル検査しづらくなる
231 174
259 202
260 # Aliceの問題点 - 型が推測できない 203 # Aliceの問題点 - 型が推測できない
261 * Input DSをReceiver型でcreateするため、どの型のデータを待っているのかわからない 204 * Input DSをReceiver型でcreateするため、どの型のデータを待っているのかわからない
262 * しかしReceiverからデータを取り出すにはasClass()で型を指定する必要がある 205 * しかしReceiverからデータを取り出すにはasClass()で型を指定する必要がある
263 * 型をDSをputした箇所までコードをたどる必要がある 206 * 型をDSをputした箇所までコードをたどる必要がある
264 * flipでの転送もあるため、それを発見するのは容易ではない
265 207
266 # Aliceの問題点 - まとめ 208 # Aliceの問題点 - まとめ
267 * 以下の問題がAliceの信頼性・拡張性を下げている 209 * 以下の問題がAliceの信頼性・拡張性を下げている
268 * Local DSMを複数立ち上げられないため、Topology Managerの拡張やテストが困難 210 * Local DSMを複数立ち上げられないため、Topology Managerの拡張やテストが困難
269 * インプットAPIが分離しているためCSでどんな処理が行われているかわかりづらい 211 * インプットAPIが分離しているためCSでどんな処理が行われているかわかりづらい
270 * setKyeの記述順序や型を気にしてプログラミングをしなくてはならない 212 * setKeyの記述順序や型を気にしてプログラミングをしなくてはならない
271 213
272 # 分散フレームワークChristieへの必要要件 214 # 分散フレームワークChristieへの必要要件
273 * Aliceの問題点を踏まえ、フレームワークをChristieを設計する 215 * Aliceの問題点を踏まえ、フレームワークをChristieを設計する
274 * staticなLocalDSMをなくし複数インスタンスを立ち上げられるようにすることでスケーラビリティを高める 216 * staticなLocalDSMをなくし複数インスタンスを立ち上げられるようにすることでスケーラビリティを高める
275 * 煩雑なAPIをシンプルにし、記述性を高める 217 * 煩雑なAPIをシンプルにし、記述性を高める
276 * 型の整合性をとれるようにし、信頼性を向上させる 218 * 型の整合性をとれるようにし、信頼性を向上させる
277 219
278 # Christie - 基本設計 220 # Christie - 基本設計(1)
279 * Javaで実装される 221 * Javaで実装される
222 * CS/DSの依存関係や、DSMの構造、リモートノードへの接続方法はAliceと同様である
280 * 将来的に当研究室で開発しているGearsOSに統合したい 223 * 将来的に当研究室で開発しているGearsOSに統合したい
281 * GearsOSに倣い、Code Gear(CG)/ Data Gear(DG) という名称を用いる 224 * GearsOSに倣い、Code Gear(CG)/ Data Gear(DG) という名称を用いる
282 * CG/DGの依存関係や、DG Manager(DGM)の構造、Remote DGMへの接続方法はAliceと同様である 225
283 226 # Christie - 基本設計(2)
284 # Christie - 基本設計 227 * Code Gear Manager(CGM)という機構がData Gear Manager(DGM)を管理
285 * DGMはLocalもRemoteも全てCode Gear Manager(CGM)が管理する
286 * 1つのCGMは1つのLocalDGMを持つ 228 * 1つのCGMは1つのLocalDGMを持つ
287 * CGM同士はThreadPoolとCGMのリストを共有している 229 * CGM同士はThreadPoolとCGMのリストを共有している
288 * メタ計算で全てのCGMにアクセス可能 230 * メタ計算で全てのCGMにアクセス可能
289 ![opt](./pictures/ChristieClass.svg){:width="60%"} 231 ![opt](./pictures/ChristieClass.svg){:width="60%"}
290 232
291 # Christie - 基本設計 233 # Christie - 基本設計(2) DGMの複数立ち上げ
234 * ChristieではCGMを2つ生成すればLocalDGMも2つ作られる
235 * NAT越えなどの機能拡張に対応可能
236 * 複数のLocalDGM同士のやりとりは、Remoteへの接続と同じようにRemoteDGMを介してアクセスする
237 * 分散プログラムのローカルでのテストが可能になる
238 ![opt](./pictures/DGM.svg){:width="50%"}
239
240 # Christie - 基本設計(3)
292 * CG を記述する際は Alice同様CodeGear.classを継承 241 * CG を記述する際は Alice同様CodeGear.classを継承
293 * CGは *void run(CodeGearManager cgm)* を持ち、run メソッド内に処理を記述 242 * CGは *void run(CodeGearManager cgm)* を持ち、run メソッド内に処理を記述
243 * run内で新たなCGを作るためのAPIにはCGM経由で呼び出す
294 * このようにCGMを持ち運ぶ書き方はGearsOSに合わせてた書き方 244 * このようにCGMを持ち運ぶ書き方はGearsOSに合わせてた書き方
295 * CGを作るためのAPIにはCGM経由で呼び出す
296
297 # Christie - DGMの複数立ち上げ
298 * ChristieではCGMを2つ生成すればLocalDGMも2つ作られる
299 * 複数のLocalDGM同士のやりとりは、Remoteへの接続と同じようにRemoteDGMを介してアクセスする
300 * 分散プログラムのローカルでのテストが可能になる
301 ![opt](./pictures/DGM.svg){:width="50%"}
302
303 # Christie - CGの生成方法
304 1. StartCodeGear.classを継承しCGMを生成する
305 2. CGをnewしたあと*setup*を用いる
306 * newが終わらないとアノテーションから待ち合わせを行う処理ができないため
307 * このときCGMがCGに渡されるため、プログラマが引数にCGMを渡す必要はない
308
309 ```java
310 public class StartTest extends StartCodeGear{//StartCG
311
312 public StartTest(CodeGearManager cgm) {
313 super(cgm);
314 }
315
316 public static void main(String args[]){
317 StartTest start = new StartTest(createCGM(10000));//CGMを生成
318 }
319
320 @Override
321 protected void run(CodeGearManager cgm) {
322 cgm.setup(new TestCodeGear());//CGの待ち合わせを開始
323 getLocalDGM().put("count", 1);
324 }
325 }
326 ```
327 245
328 # Christie - アノテーションを用いたインプット記述 246 # Christie - アノテーションを用いたインプット記述
329 * keyの指定にはJavaのアノテーションを用いる 247 * keyの指定にはJavaのアノテーションを用いる
330 * 先頭を@で始める注釈 248 * 先頭を@で始める注釈
331 * 独自アノテーションを定義できる 249 * 独自アノテーションを定義できる
372 } 290 }
373 ``` 291 ```
374 * 取得したDGが待ち合わせに指定した型と違う場合はエラーになる 292 * 取得したDGが待ち合わせに指定した型と違う場合はエラーになる
375 293
376 # Christie - まとめ 294 # Christie - まとめ
377 * CodeGearManagerというDGMの管理機構を作ったことでLocalDGM複数立ち上げが可能になった 295 * CodeGearManagerというDGMの管理機構を作ったことでLocalDGM複数立ち上げが可能になり、NAT越えなどの機能拡張やテストをしやすくなった
378 * テストや機能拡張がしやすくなった
379 * アノテーションを用いたことでDG生成とkey指定の分離問題を解決し、処理の見通しを良くした 296 * アノテーションを用いたことでDG生成とkey指定の分離問題を解決し、処理の見通しを良くした
380 * 型の整合性を保証することで信頼性が向上した 297 * 型の整合性を保証することで信頼性が向上した
381 298
382 # Christieと他フレームワークの比較 299 # Christieと他フレームワークの比較
383 * Christieの特徴を述べるために他の分散フレームワークとしてAkka、Hazelcastと比較を行う 300 * Akka、Hazelcastと比較してChristieの特徴を述べる
301 * Akka ...Scala/Java向け分散フレームワーク
302 * Hazelcast ...Java向け分散フレームワーク
384 303
385 # Christieと他フレームワークの比較 - Akka 304 # Christieと他フレームワークの比較 - Akka
386 * アクターモデル 305 * アクターモデル
387 * アクターと呼ばれるオブジェクト同士が並列で非同期メッセージを送受信するモデル 306 * アクターと呼ばれるオブジェクト同士が並列で非同期メッセージを送受信するモデル
388 * アクターは固有のアドレス持つ 307 * アクターは固有のアドレス持つ
389 * ローカルアクターにもリモートアクターにもアドレス指定でメッセージを送受信 308 * ローカルアクターにもリモートアクターにもアドレス指定でメッセージを送受信
390 * アクターはメールボックスというキューを持つ 309 * アクターはメールボックスというキューを持つ
391 * 受け取ったメッセージをパターンマッチで順次処理 310 * 受け取ったメッセージをパターンマッチで順次処理
392 * パターンマッチにはScalaのcase classを用いられる 311 * パターンマッチにはScalaのcase classを用いられる
393 ![opt](./pictures/Akka.svg){:width="50%"} 312 ![opt](./pictures/Akka.svg){:width="70%"}
394 313
395 # Christieと他フレームワークの比較 - Hazelcast 314 # Christieと他フレームワークの比較 - Hazelcast
396 * キーと値の1対1でデータを管理するインメモリ・データグリッド 315 * キーと値の1対1でデータを管理するインメモリ・データグリッド
397 * 複数のノードに分散させたデータを、仮想的な1つのメモリ空間に見せるモデル 316 * 複数のノードに分散させたデータを、仮想的な1つのメモリ空間に見せるモデル
398 * プログラマがサーバを意識せずに共有のタプルスペースに対してデータをget/put 317 * プログラマがサーバを意識せずに共有のタプルスペースに対してデータをget/put
409 * 複数のインプットを待ち合わせして処理を行いたい場合 328 * 複数のインプットを待ち合わせして処理を行いたい場合
410 * Akkaは待ち合わせ処理をプログラマが書かなければならない 329 * Akkaは待ち合わせ処理をプログラマが書かなければならない
411 * Christieでは複数のインプットを記述でき待ち合わせ処理が必要ない 330 * Christieでは複数のインプットを記述でき待ち合わせ処理が必要ない
412 * データの圧縮通信を指定したい場合 331 * データの圧縮通信を指定したい場合
413 * Akka、Hazelcastでは圧縮メソッドが用意されているため、それを用いて記述する 332 * Akka、Hazelcastでは圧縮メソッドが用意されているため、それを用いて記述する
414 * ChristieではDGMkeyの名前を変えるだけなのでメソッド呼び出しの記述が必要ない 333 * ChristieではDGMkeyの名前を変えるだけでメソッド呼び出しの記述が要らないため少ない変更で拡張が可能
415 334
416 # まとめ 335 # まとめ
417 * AliceのプロトコルやMeta Computationを説明し、TopologyManagerを用いたNAT越えの手法を示した 336 * AliceのプロトコルやMeta Computationを説明し、TopologyManagerを用いたNAT越えの手法を示した
418 * Aliceの問題点を整理し、再設計の必要性を述べた 337 * Aliceの問題点を整理し、再設計の必要性を述べた
419 * LocalDGMの複数立ち上げを可能にし、テストや機能拡張がしやすい環境を整えた 338 * LocalDGMの複数立ち上げを可能にし、テストや機能拡張がしやすい環境を整えた
420 * Christieではアノテーションを用いたAPIで信頼性の高い記述を実現した 339 * Christieではアノテーションを用いたAPIで信頼性の高い記述を実現した
421 * Christieを他のフレームワークと比較し、分散性を意識して記述できる特徴があることを述べた 340 * Christieを他のフレームワークと比較し、分散性を意識して記述できる特徴があることを示した
422 341
423 # 今後の課題 342 # 今後の課題
424 * DataGearのメタレイヤーへの移行 343 * DataGearのメタレイヤーへの移行
425 * TopologyManagerの実装 344 * TopologyManagerの実装
426 * 実用性の検証 345 * 実用性の検証
427 * Jungleとの統合 346 * Jungleとの統合
428 * GearsOSへの移行 347 * GearsOSへの移行
429 348
349 # Christie - CGの生成方法
350 1. StartCodeGear.classを継承しCGMを生成する
351 2. CGをnewしたあと*setup*を用いる
352 * newが終わらないとアノテーションから待ち合わせを行う処理ができないため
353 * このときCGMがCGに渡されるため、プログラマが引数にCGMを渡す必要はない
354
355 ```java
356 public class StartTest extends StartCodeGear{//StartCG
357
358 public StartTest(CodeGearManager cgm) {
359 super(cgm);
360 }
361
362 public static void main(String args[]){
363 StartTest start = new StartTest(createCGM(10000));//CGMを生成
364 }
365
366 @Override
367 protected void run(CodeGearManager cgm) {
368 cgm.setup(new TestCodeGear());//CGの待ち合わせを開始
369 getLocalDGM().put("count", 1);
370 }
371 }
372 ```
373
374
430 <style type="text/css"> 375 <style type="text/css">
431 <!-- 376 <!--
432 *{ 377 *{
433 font:nomal 100% 'PT Sans'; 378 font:nomal 100% 'PT Sans';
434 } 379 }