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