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>ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&amp;実行させる。</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>受け取ったコマンドのオフセット &gt; 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。</li>
321 <li>受け取ったコマンドのオフセット &lt;= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。</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 -&gt; node1 [label="right"]
313 node1 -&gt; node2 [label="right"]
314 node2 -&gt; 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 -->