Mercurial > hg > Papers > 2020 > itsuki-thesis
comparison slide/thesis.pdf.html @ 17:55e745a21506 default tip
add abstruct & slide
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 16 Feb 2020 17:54:28 +0900 |
parents | 7293b6481e32 |
children |
comparison
equal
deleted
inserted
replaced
16:7293b6481e32 | 17:55e745a21506 |
---|---|
76 | 76 |
77 <!-- _S9SLIDE_ --> | 77 <!-- _S9SLIDE_ --> |
78 <h2 id="研究目的-背景">研究目的, 背景</h2> | 78 <h2 id="研究目的-背景">研究目的, 背景</h2> |
79 <ul> | 79 <ul> |
80 <li>ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。</li> | 80 <li>ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。</li> |
81 <li>既存のリモートエディタアプリケーションとしてVisual Stdio Codeがあげられる。 | 81 <li>既存のリモートエディタアプリケーションとしてVisual Stdio Codeのlive share機能があげられる。</li> |
82 <ul> | |
83 <li>しかし、セッションに参加する全員がVSCodeの環境を持っていなければならず、不便である。</li> | |
84 </ul> | |
85 </li> | |
86 <li>編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。</li> | 82 <li>編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。</li> |
87 <li>本研究室で開発している分散フレームワークChristieを使い、簡潔な実装を目指す。</li> | 83 <li>本研究室で開発している分散フレームワークChristieはGearという概念の性質上リモートエディタと相性が良い。</li> |
88 </ul> | 84 </ul> |
89 | 85 |
90 | 86 <!-- |
91 | 87 ## 発表の流れ |
92 </div> | 88 - リモートエディタの機能と開発手順の解説 |
93 | 89 - javaで制作したテスト用エディタ |
94 <div class='slide'> | 90 - コマンドパターンによる命令オブジェクトの作成 |
95 <!-- _S9SLIDE_ --> | 91 - 編集位置の相違とその解消方法 |
96 <h2 id="発表の流れ">発表の流れ</h2> | 92 - スター型接続によるネットワーク通信 |
97 <ul> | 93 - Christieの解説 |
98 <li>リモートエディタの機能と開発手順の解説</li> | 94 - Gearの概念 |
99 <li>スター型接続によるネットワーク通信</li> | 95 - アノテーション |
100 <li>Christieの解説 | 96 - TopologyManager |
101 <ul> | 97 - 今後の課題とまとめ |
102 <li>Gearの概念</li> | 98 !--> |
103 <li>アノテーション</li> | 99 |
104 <li>TopologyManager</li> | 100 |
105 </ul> | 101 |
106 </li> | 102 </div> |
107 <li>今後の課題とまとめ</li> | 103 |
108 </ul> | 104 <div class='slide'> |
105 <!-- _S9SLIDE_ --> | |
106 <h2 id="リモートエディタの概要説明">リモートエディタの概要説明</h2> | |
107 <ul> | |
108 <li>本研究で作成するリモートエディタはChristieの機能を用いて通信環境を構成する。</li> | |
109 <li>同期編集セッションに接続したユーザーは自身のマシン上でエディタを使って編集対象ファイルを開く。 | |
110 <ul> | |
111 <li>ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&実行させる。</li> | |
112 </ul> | |
113 </li> | |
114 <li>命令コマンドはサーバーへ集められ、サーバーは受け取ったコマンドを他の接続ノードへ送信し、実行させる。</li> | |
115 </ul> | |
116 | |
117 <div style="text-align: center;"> | |
118 <img src="images/RemoteEditor.pdf" alt="MetaGear" width="800" /> | |
119 </div> | |
120 | |
121 | |
122 | |
123 </div> | |
124 | |
125 <div class='slide'> | |
126 <!-- _S9SLIDE_ --> | |
127 <h2 id="テスト用テキストエディタ">テスト用テキストエディタ</h2> | |
128 <ul> | |
129 <li>通信の構成を行うChristieはjava言語で作成されているため、javaのswingを用いてテキストエディタを制作した。</li> | |
130 <li>エディタ部分の入力、削除の取得はDocument Listenerクラスを使った。 | |
131 <ul> | |
132 <li>insertUpdate、removeUpdateメソッドがそれぞれ挿入、削除を検知した時に動作する。</li> | |
133 </ul> | |
134 </li> | |
135 <li>このエディタはファイルの内容をオフセット番号で取り扱っている。</li> | |
136 </ul> | |
137 | |
138 <div style="text-align: center;"> | |
139 <img src="images/Editor.png" alt="MetaGear" width="800" /> | |
140 </div> | |
141 | |
142 | |
143 | |
144 </div> | |
145 | |
146 <div class='slide'> | |
147 <!-- _S9SLIDE_ --> | |
148 <h2 id="documentlistenerの記述部分">DocumentListenerの記述部分</h2> | |
149 | |
150 <pre><code>public class MyDocumentListener implements DocumentListener { | |
151 @Override | |
152 public void insertUpdate(DocumentEvent e) { | |
153 Document doc = e.getDocument(); | |
154 loc = e.getOffset(); | |
155 System.out.println(loc); | |
156 | |
157 } | |
158 | |
159 @Override | |
160 public void removeUpdate(DocumentEvent e) { | |
161 Document doc = e.getDocument(); | |
162 sendLoc = e.getOffset(); | |
163 System.out.println("delete " + sendLoc); | |
164 } | |
165 @Override | |
166 public void changedUpdate(DocumentEvent e) { | |
167 } | |
168 } | |
169 </code></pre> | |
170 | |
171 | |
172 | |
173 </div> | |
174 | |
175 <div class='slide'> | |
176 <!-- _S9SLIDE_ --> | |
177 <h2 id="コマンドパターンの解説">コマンドパターンの解説</h2> | |
178 <ul> | |
179 <li>リモートエディタの通信では、各ノード(参加ユーザのエディタ)がそれぞれ自身のファイルの変更内容を他のノードに送信する。</li> | |
180 <li>コマンドパターンとは命令を一つのオブジェクトとして表現するプログラム手法である。</li> | |
181 <li>命令を表すクラスを作成し、インスタンスを作成と同時に命令の中身を入力することで命令を作成する。 | |
182 <ul> | |
183 <li>リモートエディタにおいては「オフセットn番目に に 文字列 “A”を入力した」という変更を命令にして送信する。</li> | |
184 </ul> | |
185 </li> | |
186 <li>コマンドパターンの利点として、 | |
187 <ul> | |
188 <li>ChristieのGearの概念と相性がいい。</li> | |
189 <li>命令に必要な内容をまとめて送信するため、時間差による相違の発生が防げる。</li> | |
190 <li>オブジェクトとして取り扱えるため管理が行いやすい。</li> | |
191 </ul> | |
192 </li> | |
193 </ul> | |
194 | |
195 <pre><code> package christie.example.RemoteTake; | |
196 import org.msgpack.annotation.Message; | |
197 | |
198 @Message | |
199 class RTCommand { | |
200 public String line; | |
201 public String cmd; | |
202 public int offset; | |
203 | |
204 public RTCommand () {} | |
205 | |
206 public RTCommand(String cmd, String line, int i) { | |
207 this.cmd = cmd; | |
208 this.line = line; | |
209 this.offset = i; | |
210 } | |
211 | |
212 @Override | |
213 public String toString() { | |
214 return "RTCommand{" + | |
215 "line='" + line + '\'' + | |
216 ", cmd='" + cmd + '\'' + | |
217 ", offset=" + offset + | |
218 '}'; | |
219 } | |
220 } | |
221 </code></pre> | |
222 | |
223 | |
224 | |
225 </div> | |
226 | |
227 <div class='slide'> | |
228 <!-- _S9SLIDE_ --> | |
229 <h2 id="コマンドパターン実装の際に起こった問題">コマンドパターン実装の際に起こった問題</h2> | |
230 <ul> | |
231 <li>クラスを他ノードに送信するためには、クラスをシリアライズして送信する必要がある。 | |
232 <ul> | |
233 <li>コマンドの送信にはmsgpackクラスとjavassistを利用している。</li> | |
234 </ul> | |
235 </li> | |
236 <li>しかし、送信がうまく行えなかったため、原因を調査した。 | |
237 <ul> | |
238 <li>javaのバージョン進行のため、msgpackバージョン0.6.12が非対称となっていた。</li> | |
239 <li>msgpackの最新バージョン0.8.20はシリアライズ機能が含まれなくなった。</li> | |
240 </ul> | |
241 </li> | |
242 <li>以上の原因に対処するため | |
243 <ul> | |
244 <li>javassistのバージョンを最新版へ変更した。</li> | |
245 <li>シリアライズする命令クラスに対し、クラスをpublicに変更した。</li> | |
246 </ul> | |
247 </li> | |
248 <li>以上の対処によりコマンドパターンでの命令実装を行うことができた。</li> | |
249 <li>自身でシリアライズ機能をChristieに内蔵してしまえば、これらのパッケージは不要になる。</li> | |
250 </ul> | |
251 | |
252 | |
253 | |
254 </div> | |
255 | |
256 <div class='slide'> | |
257 <!-- _S9SLIDE_ --> | |
258 <h2 id="編集位置の相違">編集位置の相違</h2> | |
259 <ul> | |
260 <li>同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。</li> | |
261 <li>EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。</li> | |
262 </ul> | |
263 | |
264 <div style="text-align: center;"> | |
265 <img src="images/difference_offset.pdf" alt="MetaGear" width="800" /> | |
266 </div> | |
267 | |
268 | |
269 | |
270 </div> | |
271 | |
272 <div class='slide'> | |
273 <!-- _S9SLIDE_ --> | |
274 <h2 id="編集の相違の解消">編集の相違の解消</h2> | |
275 <ul> | |
276 <li>同期編集のセッションはスター型の通信接続で行うため、サーバー対複数ノードの通信間で相違が発生する。</li> | |
277 <li>編集の相違を防ぐためには二つの処理を行う必要がある。 | |
278 <ul> | |
279 <li>サーバーとノード間の命令のすれ違いが発生したことを検知する。</li> | |
280 <li>すれ違いが発生した際に、オフセットのズレを修正する。</li> | |
281 </ul> | |
282 </li> | |
283 <li>サーバーが正しいファイルの状態を保持するためサーバーの状態にノードが合わせる必要がある。</li> | |
284 </ul> | |
285 | |
286 | |
287 | |
288 </div> | |
289 | |
290 <div class='slide'> | |
291 <!-- _S9SLIDE_ --> | |
292 <h2 id="命令コマンドに番号をつけ相違を解消する">命令コマンドに番号をつけ相違を解消する</h2> | |
293 <ul> | |
294 <li>命令コマンド番号には以下の特性がある。 | |
295 <ul> | |
296 <li>全てのノード(サーバーを含める)は事前に処理した命令コマンドの番号を記憶している。</li> | |
297 <li>新しく作られた命令コマンドは作られたノードの命令実行済み番号+1 を自身の命令コマンド番号とする。</li> | |
298 <li>ノードは自身が作成したか、他のノードに送られてきたかに関わらず命令コマンドを実行したら命令実行済み番号をその命令コマンドの番号と同じにする。</li> | |
299 </ul> | |
300 </li> | |
301 <li>もしノードが送られてきた命令コマンドを見て、そのコマンドが自身の実行済み番号と同値以下の場合、送信元のノードとの命令のすれ違いが発生していることが分かる。</li> | |
302 </ul> | |
303 | |
304 <div style="text-align: center;"> | |
305 <img src="images/FixCommand.pdf" alt="MetaGear" width="800" /> | |
306 </div> | |
307 | |
308 | |
309 | |
310 </div> | |
311 | |
312 <div class='slide'> | |
313 <!-- _S9SLIDE_ --> | |
314 <h2 id="すれ違いが発生した際の処理">すれ違いが発生した際の処理</h2> | |
315 <ul> | |
316 <li>全てのノードは自分が実行した命令コマンドを記録しており、後からオフセットや文字列を取り出すことができる。</li> | |
317 <li>すれ違いが発生した時点からの命令の中身を集計、参照しすれ違いで送られてきたコマンドを修正する。</li> | |
318 <li>insertを例とすると | |
319 <ul> | |
320 <li>受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。</li> | |
321 <li>受け取ったコマンドのオフセット <= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。</li> | |
322 </ul> | |
323 </li> | |
324 </ul> | |
325 | |
326 | |
327 | |
328 </div> | |
329 | |
330 <div class='slide'> | |
331 <!-- _S9SLIDE_ --> | |
332 <h2 id="スター型通信">スター型通信</h2> | |
333 <ul> | |
334 <li>Christieにはノードの通信接続を行うTopologyManagerという機能がある。</li> | |
335 <li>同期通信はスター型での接続を行う。</li> | |
336 <li>スター型通信の利点は | |
337 <ul> | |
338 <li>サーバーが正しいファイル状態を保持するため、整合性を保つことができる。</li> | |
339 <li>どこかのノードが切断されても、要害の範囲をそのノードのみに抑えることができる。</li> | |
340 <li>新しいノードが参加した、もしくは復帰の際にはサーバーのファイル状況を参照するのみで参加、復帰ができる。</li> | |
341 </ul> | |
342 </li> | |
343 </ul> | |
344 | |
345 <div style="text-align: center;"> | |
346 <img src="images/Star-Topology.pdf" alt="MetaGear" width="800" /> | |
347 </div> | |
109 | 348 |
110 | 349 |
111 | 350 |
112 </div> | 351 </div> |
113 | 352 |
136 </li> | 375 </li> |
137 <li>DataGearManager(以下DGM) | 376 <li>DataGearManager(以下DGM) |
138 <ul> | 377 <ul> |
139 <li>DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。</li> | 378 <li>DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。</li> |
140 </ul> | 379 </ul> |
141 | 380 </li> |
142 | 381 </ul> |
382 </li> | |
383 </ul> | |
384 | |
385 | |
143 | 386 |
144 </div> | 387 </div> |
145 | 388 |
146 <div class='slide'> | 389 <div class='slide'> |
147 <!-- _S9SLIDE_ --> | 390 <!-- _S9SLIDE_ --> |
148 <h2 id="christieのコード例">Christieのコード例</h2> | 391 <h2 id="christieのコード例">Christieのコード例</h2> |
149 <pre><code class="language-code">package christie.example.HelloWorld; | 392 <pre><code>package christie.example.HelloWorld; |
150 | 393 |
151 import christie.codegear.CodeGearManager; | 394 import christie.codegear.CodeGearManager; |
152 import christie.codegear.StartCodeGear; | 395 import christie.codegear.StartCodeGear; |
153 | 396 |
154 public class StartHelloWorld extends StartCodeGear { | 397 public class StartHelloWorld extends StartCodeGear { |
155 | 398 |
156 public StartHelloWorld(CodeGearManager cgm) { | 399 public StartHelloWorld(CodeGearManager cgm) { |
157 super(cgm); | 400 super(cgm); |
158 } | 401 } |
159 | 402 |
160 public static void main(String[] args){ | 403 public static void main(String[] args){ |
161 CodeGearManager cgm = createCGM(10000); #ポート番号を指定してCGMを立ち上げ。 | 404 CodeGearManager cgm = createCGM(10000); |
162 cgm.setup(new HelloWorldCodeGear()); #立ち上げたCGMへCGを待ちあわせる。 | 405 cgm.setup(new HelloWorldCodeGear()); |
163 cgm.getLocalDGM().put("helloWorld","hello"); #keyname "helloWorld"に文字列helloをput | 406 cgm.setup(new FinishHelloWorld()); |
407 cgm.getLocalDGM().put("helloWorld","hello"); | |
164 cgm.getLocalDGM().put("helloWorld","world"); | 408 cgm.getLocalDGM().put("helloWorld","world"); |
165 } | 409 } |
166 } | 410 } |
167 | |
168 </code></pre> | 411 </code></pre> |
169 <pre><code>ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000 | 412 |
413 <pre><code>ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000 | |
170 hello world | 414 hello world |
171 </code></pre> | 415 </code></pre> |
172 <!-- | 416 |
417 <!-- | |
173 - 立ち上げ後はManager名を指定してDataSegmentAPI用いてDSのやり取りを行うため、プログラマはManager名を意識することでLocalへの操作もRemoteへの操作も同様に扱える。 | 418 - 立ち上げ後はManager名を指定してDataSegmentAPI用いてDSのやり取りを行うため、プログラマはManager名を意識することでLocalへの操作もRemoteへの操作も同様に扱える。 |
174 --> | 419 --> |
175 </li> | |
176 </ul> | |
177 </li> | |
178 </ul> | |
179 | 420 |
180 <!-- | 421 <!-- |
181 | 422 |
182 ## Christieの言語概念 | 423 ## Christieの言語概念 |
183 - CGはスレッド, クラスに相当し, javaの継承を用いて記述する. | 424 - CGはスレッド, クラスに相当し, javaの継承を用いて記述する. |
187 - DGMにはLocalDGMとRemoteDGMが存在する。LocalDGMは各ノード固有のデータベースである。RemoteDSMは他ノードのLocalDGMに対応するproxyであり、接続しているノードの数だけ存在する。 | 428 - DGMにはLocalDGMとRemoteDGMが存在する。LocalDGMは各ノード固有のデータベースである。RemoteDSMは他ノードのLocalDGMに対応するproxyであり、接続しているノードの数だけ存在する。 |
188 - DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMに対しDGを格納し, Remoteの場合は接続したRemoteさきのCGMのDGMにDGを格納する. | 429 - DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMに対しDGを格納し, Remoteの場合は接続したRemoteさきのCGMのDGMにDGを格納する. |
189 | 430 |
190 --> | 431 --> |
191 | 432 |
192 | 433 <!-- |
193 | 434 ## DGM |
194 </div> | 435 - CGMはDGをputという操作を使って、自身や他ノードのDGMに書き込ませる。 |
195 | 436 - LocalDGMが自身、RemoteDGMが他ノードのDGMである。 |
196 <div class='slide'> | 437 |
197 <!-- _S9SLIDE_ --> | 438 <div style="text-align: center;"> |
198 <h2 id="dgm">DGM</h2> | 439 <img src="images/remote_datasegment.pdf" alt="MetaGear" width="800"> |
199 <ul> | 440 </div> |
200 <li>DGMは分散システムの肝となる他のノード間とのデータのやり取りの際に重要となる。</li> | 441 |
201 <li>DGMにはLocalDGMとRemoteDGMが存在する。 | 442 !--> |
202 <ul> | |
203 <li>LocalDGM | |
204 <ul> | |
205 <li>LocalなDGMのプールのkeyにデータの書き込みを行う。</li> | |
206 </ul> | |
207 </li> | |
208 <li>RemoteDGM | |
209 <ul> | |
210 <li>Localに存在する、他のノードのLocalDGMに対応するプールのkeyにデータを書き込みする。接続しているノードの数だけ存在する。</li> | |
211 </ul> | |
212 </li> | |
213 </ul> | |
214 </li> | |
215 <li>DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMへ、 Remoteの場合は接続したRemote先のCGMのDGMにDGを格納する.</li> | |
216 </ul> | |
217 | |
218 <div style="text-align: center;"> | |
219 <img src="../paper/images/remote_datasegment.svg" alt="MetaGear" width="800" /> | |
220 </div> | |
221 | 443 |
222 <!-- | 444 <!-- |
223 - RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 | 445 - RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 |
224 --> | 446 --> |
225 | 447 |
227 | 449 |
228 </div> | 450 </div> |
229 | 451 |
230 <div class='slide'> | 452 <div class='slide'> |
231 <!-- _S9SLIDE_ --> | 453 <!-- _S9SLIDE_ --> |
232 <h2 id="annottation">Annottation</h2> | 454 <h2 id="dgのアノテーション">DGのアノテーション</h2> |
233 <ul> | 455 <ul> |
234 <li>ChristieではInputDGの指定にはアノテーションを使う。</li> | 456 <li>DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには |
235 <li>アノテーションとはクラスやメソッド、パッケージに対して、付加情報を記述できるJavaのMeta Computationである。</li> | 457 Take、Peek、TakeFrom、PeekFrom、の4つがある。 |
236 <li>先頭に@をつけることで記述する。オリジナルのアノテーションを定義することもでき、Input | 458 <ul> |
237 される型の変数を直接宣言し、変数名としてkeyを記述する。その上にアノテーションでTakeもしくはPeekを指定する。</li> | 459 <li>Take |
238 </ul> | 460 <ul> |
239 | 461 <li>先頭のDGを読み込み、そのDGを削除する。</li> |
240 <pre><code class="language-cc">package christie.example.HelloWorld; | 462 </ul> |
241 | 463 </li> |
464 <li>Peek | |
465 <ul> | |
466 <li>先頭のDGを読み込むが、DGが消去されない。そのため特に操作をしない場合、同じデータを参照し続ける。</li> | |
467 </ul> | |
468 </li> | |
469 <li>TakeFrom | |
470 <ul> | |
471 <li>Remote DGM nameを指定することで、その接続先のDGM からTake操作をおこえる。</li> | |
472 </ul> | |
473 </li> | |
474 <li>PeekFrom | |
475 <ul> | |
476 <li>Remote DGM nameを指定することで、その接続先のDGM からPeek操作をおこえる。</li> | |
477 </ul> | |
478 </li> | |
479 </ul> | |
480 </li> | |
481 </ul> | |
482 | |
483 <pre><code>package christie.example.HelloWorld; | |
484 | |
485 import christie.annotation.Peek; | |
242 import christie.annotation.Take; | 486 import christie.annotation.Take; |
243 import christie.codegear.CodeGear; | 487 import christie.codegear.CodeGear; |
244 import christie.codegear.CodeGearManager; | 488 import christie.codegear.CodeGearManager; |
245 | 489 |
246 public class HelloWorldCodeGear extends CodeGear { | 490 public class HelloWorldCodeGear extends CodeGear { |
491 | |
247 @Take | 492 @Take |
248 String helloWorld; | 493 String helloWorld; |
249 | 494 |
250 @Override | 495 @Override |
251 protected void run(CodeGearManager cgm) { | 496 protected void run(CodeGearManager cgm) { |
252 System.out.print(helloWorld + " "); | 497 System.out.print(helloWorld + " "); |
253 cgm.setup(new HelloWorldCodeGear()); | 498 cgm.setup(new HelloWorldCodeGear()); |
499 cgm.getLocalDGM().put(helloWorld,helloWorld); | |
254 } | 500 } |
255 } | 501 } |
256 | |
257 </code></pre> | 502 </code></pre> |
258 | 503 |
259 | 504 <!-- |
260 | 505 ## TopologyManager |
261 </div> | 506 - TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。 |
262 | 507 - TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 |
263 <div class='slide'> | 508 - 動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。 |
264 <!-- _S9SLIDE_ --> | 509 - 静的Toopologyはdotファイルを与えることノード関係の構築を行う。 |
265 <h2 id="dgのアノテーション">DGのアノテーション</h2> | 510 |
266 <ul> | 511 ```Code |
267 <li>DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには | 512 digraph test { |
268 Take、Peek、TakeFrom、PeekFrom、の4つがある。 | 513 node0 -> node1 [label="right"] |
269 <ul> | 514 node1 -> node2 [label="right"] |
270 <li>Take | 515 node2 -> node0 [label="right"] |
271 <ul> | |
272 <li>先頭のDGを読み込み、そのDGを削除する。</li> | |
273 </ul> | |
274 </li> | |
275 <li>Peek | |
276 <ul> | |
277 <li>先頭のDGを読み込むが、DGが消去されない。そのため特に操作をしない場合、同じデータを参照し続ける。</li> | |
278 </ul> | |
279 </li> | |
280 <li>TakeFrom | |
281 <ul> | |
282 <li>Remote DGM nameを指定することで、その接続先のDGM からTake操作をおこえる。</li> | |
283 </ul> | |
284 </li> | |
285 <li>PeekFrom | |
286 <ul> | |
287 <li>Remote DGM nameを指定することで、その接続先のDGM からPeek操作をおこえる。</li> | |
288 </ul> | |
289 </li> | |
290 </ul> | |
291 </li> | |
292 </ul> | |
293 | |
294 | |
295 | |
296 </div> | |
297 | |
298 <div class='slide'> | |
299 <!-- _S9SLIDE_ --> | |
300 <h2 id="topologymanager">TopologyManager</h2> | |
301 <ul> | |
302 <li>TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。</li> | |
303 <li>TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 | |
304 <ul> | |
305 <li>動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。</li> | |
306 <li>静的Toopologyはdotファイルを与えることノード関係の構築を行う。</li> | |
307 </ul> | |
308 </li> | |
309 </ul> | |
310 | |
311 <pre><code class="language-Code">digraph test { | |
312 node0 -> node1 [label="right"] | |
313 node1 -> node2 [label="right"] | |
314 node2 -> node0 [label="right"] | |
315 } | 516 } |
316 </code></pre> | 517 ``` |
317 | 518 |
318 <div style="text-align: center;"> | 519 <div style="text-align: center;"> |
319 <img src="../paper/images/ring.svg" alt="MetaGear" width="500" /> | 520 <img src="images/ring.pdf" alt="MetaGear" width="500"> |
320 </div> | 521 </div> |
522 !--> | |
321 | 523 |
322 | 524 |
323 | 525 |
324 </div> | 526 </div> |
325 | 527 |
326 <div class='slide'> | 528 <div class='slide'> |
327 <!-- _S9SLIDE_ --> | 529 <!-- _S9SLIDE_ --> |
328 <h2 id="まとめとこれから">まとめとこれから</h2> | 530 <h2 id="まとめとこれから">まとめとこれから</h2> |
531 <ul> | |
532 <li>本研究発表ではリモートエディタの開発とそれに伴う技術について述べた。現時点で実装できた構成は以下である。 | |
533 <ul> | |
534 <li>リモートエディタの基本となる命令のやり取り部分のコマンドパターン実装。</li> | |
535 <li>編集相違を防ぐためのアルゴリズムの発案と検証。</li> | |
536 </ul> | |
537 </li> | |
538 <li>現時点では最低限のセッションを動かすまでの最低限の実装は終わっていない。これから取り組まなければならない課題として以下が挙げられる。 | |
539 <ul> | |
540 <li>スター型Topologyの接続を動的に行わせる。</li> | |
541 <li>編集するファイルの共有方法 | |
542 <ul> | |
543 <li>ファイルをそのまま送信すると、負担が大きいと予想される。</li> | |
544 </ul> | |
545 </li> | |
546 <li>既存のエディタを同期通信に対応させる。</li> | |
547 </ul> | |
548 </li> | |
549 <li>以上の課題の課題に取り組み、これからも実装を続けていきたい。</li> | |
550 </ul> | |
329 | 551 |
330 </div> | 552 </div> |
331 | 553 |
332 | 554 |
333 </div><!-- presentation --> | 555 </div><!-- presentation --> |