Mercurial > hg > Papers > 2020 > itsuki-thesis
annotate slide/thesis.md @ 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 |
rev | line source |
---|---|
16 | 1 title: 分散フレームワークChristieを用いたリモートエディタの実装 |
2 author: Takahiro Ikki, Shinji Kono | |
3 profile: 琉球大学 | |
4 lang: Japanese | |
5 code-engine: coderay | |
6 | |
7 ## 研究目的, 背景 | |
8 - ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
9 - 既存のリモートエディタアプリケーションとしてVisual Stdio Codeのlive share機能があげられる。 |
16 | 10 - 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
11 - 本研究室で開発している分散フレームワークChristieはGearという概念の性質上リモートエディタと相性が良い。 |
16 | 12 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
13 <!-- |
16 | 14 ## 発表の流れ |
15 - リモートエディタの機能と開発手順の解説 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
16 - javaで制作したテスト用エディタ |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
17 - コマンドパターンによる命令オブジェクトの作成 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
18 - 編集位置の相違とその解消方法 |
16 | 19 - スター型接続によるネットワーク通信 |
20 - Christieの解説 | |
21 - Gearの概念 | |
22 - アノテーション | |
23 - TopologyManager | |
24 - 今後の課題とまとめ | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
25 !--> |
16 | 26 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
27 ## リモートエディタの概要説明 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
28 - 本研究で作成するリモートエディタはChristieの機能を用いて通信環境を構成する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
29 - 同期編集セッションに接続したユーザーは自身のマシン上でエディタを使って編集対象ファイルを開く。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
30 - ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&実行させる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
31 - 命令コマンドはサーバーへ集められ、サーバーは受け取ったコマンドを他の接続ノードへ送信し、実行させる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
32 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
33 <div style="text-align: center;"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
34 <img src="images/RemoteEditor.pdf" alt="MetaGear" width="800"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
35 </div> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
36 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
37 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
38 ## テスト用テキストエディタ |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
39 - 通信の構成を行うChristieはjava言語で作成されているため、javaのswingを用いてテキストエディタを制作した。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
40 - エディタ部分の入力、削除の取得はDocument Listenerクラスを使った。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
41 - insertUpdate、removeUpdateメソッドがそれぞれ挿入、削除を検知した時に動作する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
42 - このエディタはファイルの内容をオフセット番号で取り扱っている。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
43 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
44 <div style="text-align: center;"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
45 <img src="images/Editor.png" alt="MetaGear" width="800"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
46 </div> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
47 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
48 ## DocumentListenerの記述部分 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
49 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
50 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
51 public class MyDocumentListener implements DocumentListener { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
52 @Override |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
53 public void insertUpdate(DocumentEvent e) { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
54 Document doc = e.getDocument(); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
55 loc = e.getOffset(); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
56 System.out.println(loc); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
57 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
58 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
59 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
60 @Override |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
61 public void removeUpdate(DocumentEvent e) { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
62 Document doc = e.getDocument(); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
63 sendLoc = e.getOffset(); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
64 System.out.println("delete " + sendLoc); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
65 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
66 @Override |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
67 public void changedUpdate(DocumentEvent e) { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
68 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
69 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
70 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
71 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
72 ## コマンドパターンの解説 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
73 - リモートエディタの通信では、各ノード(参加ユーザのエディタ)がそれぞれ自身のファイルの変更内容を他のノードに送信する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
74 - コマンドパターンとは命令を一つのオブジェクトとして表現するプログラム手法である。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
75 - 命令を表すクラスを作成し、インスタンスを作成と同時に命令の中身を入力することで命令を作成する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
76 - リモートエディタにおいては「オフセットn番目に に 文字列 "A"を入力した」という変更を命令にして送信する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
77 - コマンドパターンの利点として、 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
78 - ChristieのGearの概念と相性がいい。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
79 - 命令に必要な内容をまとめて送信するため、時間差による相違の発生が防げる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
80 - オブジェクトとして取り扱えるため管理が行いやすい。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
81 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
82 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
83 package christie.example.RemoteTake; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
84 import org.msgpack.annotation.Message; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
85 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
86 @Message |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
87 class RTCommand { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
88 public String line; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
89 public String cmd; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
90 public int offset; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
91 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
92 public RTCommand () {} |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
93 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
94 public RTCommand(String cmd, String line, int i) { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
95 this.cmd = cmd; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
96 this.line = line; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
97 this.offset = i; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
98 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
99 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
100 @Override |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
101 public String toString() { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
102 return "RTCommand{" + |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
103 "line='" + line + '\'' + |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
104 ", cmd='" + cmd + '\'' + |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
105 ", offset=" + offset + |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
106 '}'; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
107 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
108 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
109 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
110 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
111 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
112 ## コマンドパターン実装の際に起こった問題 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
113 - クラスを他ノードに送信するためには、クラスをシリアライズして送信する必要がある。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
114 - コマンドの送信にはmsgpackクラスとjavassistを利用している。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
115 - しかし、送信がうまく行えなかったため、原因を調査した。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
116 - javaのバージョン進行のため、msgpackバージョン0.6.12が非対称となっていた。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
117 - msgpackの最新バージョン0.8.20はシリアライズ機能が含まれなくなった。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
118 - 以上の原因に対処するため |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
119 - javassistのバージョンを最新版へ変更した。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
120 - シリアライズする命令クラスに対し、クラスをpublicに変更した。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
121 - 以上の対処によりコマンドパターンでの命令実装を行うことができた。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
122 - 自身でシリアライズ機能をChristieに内蔵してしまえば、これらのパッケージは不要になる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
123 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
124 ## 編集位置の相違 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
125 - 同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
126 - EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
127 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
128 <div style="text-align: center;"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
129 <img src="images/difference_offset.pdf" alt="MetaGear" width="800"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
130 </div> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
131 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
132 ## 編集の相違の解消 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
133 - 同期編集のセッションはスター型の通信接続で行うため、サーバー対複数ノードの通信間で相違が発生する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
134 - 編集の相違を防ぐためには二つの処理を行う必要がある。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
135 - サーバーとノード間の命令のすれ違いが発生したことを検知する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
136 - すれ違いが発生した際に、オフセットのズレを修正する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
137 - サーバーが正しいファイルの状態を保持するためサーバーの状態にノードが合わせる必要がある。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
138 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
139 ## 命令コマンドに番号をつけ相違を解消する |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
140 - 命令コマンド番号には以下の特性がある。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
141 - 全てのノード(サーバーを含める)は事前に処理した命令コマンドの番号を記憶している。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
142 - 新しく作られた命令コマンドは作られたノードの命令実行済み番号+1 を自身の命令コマンド番号とする。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
143 - ノードは自身が作成したか、他のノードに送られてきたかに関わらず命令コマンドを実行したら命令実行済み番号をその命令コマンドの番号と同じにする。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
144 - もしノードが送られてきた命令コマンドを見て、そのコマンドが自身の実行済み番号と同値以下の場合、送信元のノードとの命令のすれ違いが発生していることが分かる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
145 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
146 <div style="text-align: center;"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
147 <img src="images/FixCommand.pdf" alt="MetaGear" width="800"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
148 </div> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
149 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
150 ## すれ違いが発生した際の処理 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
151 - 全てのノードは自分が実行した命令コマンドを記録しており、後からオフセットや文字列を取り出すことができる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
152 - すれ違いが発生した時点からの命令の中身を集計、参照しすれ違いで送られてきたコマンドを修正する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
153 - insertを例とすると |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
154 - 受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
155 - 受け取ったコマンドのオフセット <= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
156 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
157 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
158 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
159 ## スター型通信 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
160 - Christieにはノードの通信接続を行うTopologyManagerという機能がある。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
161 - 同期通信はスター型での接続を行う。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
162 - スター型通信の利点は |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
163 - サーバーが正しいファイル状態を保持するため、整合性を保つことができる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
164 - どこかのノードが切断されても、要害の範囲をそのノードのみに抑えることができる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
165 - 新しいノードが参加した、もしくは復帰の際にはサーバーのファイル状況を参照するのみで参加、復帰ができる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
166 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
167 <div style="text-align: center;"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
168 <img src="images/Star-Topology.pdf" alt="MetaGear" width="800"> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
169 </div> |
16 | 170 |
171 ## Christie | |
172 - Christieは当研究室で開発している、信頼性を重視した分散フレームワークである. | |
173 - 現在はjava上で開発されているが、別言語(CbC)で構成されたGearsOSに組み込む予定があるため,それに向けて書き換え可能な構成となっている。 | |
174 - ChristieではデータをGearという単位で分割して記述を行う。 | |
175 - CodeGear(以下CG) | |
176 - スレッドやクラスに相当し、javaの継承を用いて記述する。keyに全てのDGが格納された際に動作する。 | |
177 - DataGear(以下DG) | |
178 - DGは変数に相当し、CG内でアノテーションを用いてデータを取り出せる。 | |
179 - CodeGearManager(以下CGM) | |
180 - ノードに相当し, DG, CG, DataGearManagerの管理をする. | |
181 - DataGearManager(以下DGM) | |
182 - DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。 | |
183 | |
184 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
185 ## Christieのコード例 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
186 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
187 package christie.example.HelloWorld; |
16 | 188 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
189 import christie.codegear.CodeGearManager; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
190 import christie.codegear.StartCodeGear; |
16 | 191 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
192 public class StartHelloWorld extends StartCodeGear { |
16 | 193 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
194 public StartHelloWorld(CodeGearManager cgm) { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
195 super(cgm); |
16 | 196 } |
197 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
198 public static void main(String[] args){ |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
199 CodeGearManager cgm = createCGM(10000); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
200 cgm.setup(new HelloWorldCodeGear()); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
201 cgm.setup(new FinishHelloWorld()); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
202 cgm.getLocalDGM().put("helloWorld","hello"); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
203 cgm.getLocalDGM().put("helloWorld","world"); |
16 | 204 } |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
205 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
206 ``` |
16 | 207 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
208 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
209 ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
210 hello world |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
211 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
212 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
213 <!-- |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
214 - 立ち上げ後はManager名を指定してDataSegmentAPI用いてDSのやり取りを行うため、プログラマはManager名を意識することでLocalへの操作もRemoteへの操作も同様に扱える。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
215 --> |
16 | 216 |
217 <!-- | |
218 | |
219 ## Christieの言語概念 | |
220 - CGはスレッド, クラスに相当し, javaの継承を用いて記述する. | |
221 - DGは変数データに相当し, CG内でアノテーションを用いて変数データを取り出せる. | |
222 - CGMはノードであり, DG, CG, DGMを管理する. | |
223 - DGMはDGを管理するものであり, putという操作により, 変数データ(DG)を格納できる. | |
224 - DGMにはLocalDGMとRemoteDGMが存在する。LocalDGMは各ノード固有のデータベースである。RemoteDSMは他ノードのLocalDGMに対応するproxyであり、接続しているノードの数だけ存在する。 | |
225 - DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMに対しDGを格納し, Remoteの場合は接続したRemoteさきのCGMのDGMにDGを格納する. | |
226 | |
227 --> | |
228 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
229 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
230 <!-- |
16 | 231 ## DGM |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
232 - CGMはDGをputという操作を使って、自身や他ノードのDGMに書き込ませる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
233 - LocalDGMが自身、RemoteDGMが他ノードのDGMである。 |
16 | 234 |
235 <div style="text-align: center;"> | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
236 <img src="images/remote_datasegment.pdf" alt="MetaGear" width="800"> |
16 | 237 </div> |
238 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
239 !--> |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
240 |
16 | 241 <!-- |
242 - RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 | |
243 --> | |
244 | |
245 | |
246 ## DGのアノテーション | |
247 - DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには | |
248 Take、Peek、TakeFrom、PeekFrom、の4つがある。 | |
249 - Take | |
250 - 先頭のDGを読み込み、そのDGを削除する。 | |
251 - Peek | |
252 - 先頭のDGを読み込むが、DGが消去されない。そのため特に操作をしない場合、同じデータを参照し続ける。 | |
253 - TakeFrom | |
254 - Remote DGM nameを指定することで、その接続先のDGM からTake操作をおこえる。 | |
255 - PeekFrom | |
256 - Remote DGM nameを指定することで、その接続先のDGM からPeek操作をおこえる。 | |
257 | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
258 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
259 package christie.example.HelloWorld; |
16 | 260 |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
261 import christie.annotation.Peek; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
262 import christie.annotation.Take; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
263 import christie.codegear.CodeGear; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
264 import christie.codegear.CodeGearManager; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
265 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
266 public class HelloWorldCodeGear extends CodeGear { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
267 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
268 @Take |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
269 String helloWorld; |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
270 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
271 @Override |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
272 protected void run(CodeGearManager cgm) { |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
273 System.out.print(helloWorld + " "); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
274 cgm.setup(new HelloWorldCodeGear()); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
275 cgm.getLocalDGM().put(helloWorld,helloWorld); |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
276 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
277 } |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
278 ``` |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
279 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
280 <!-- |
16 | 281 ## TopologyManager |
282 - TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。 | |
283 - TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 | |
284 - 動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。 | |
285 - 静的Toopologyはdotファイルを与えることノード関係の構築を行う。 | |
286 | |
287 ```Code | |
288 digraph test { | |
289 node0 -> node1 [label="right"] | |
290 node1 -> node2 [label="right"] | |
291 node2 -> node0 [label="right"] | |
292 } | |
293 ``` | |
294 | |
295 <div style="text-align: center;"> | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
296 <img src="images/ring.pdf" alt="MetaGear" width="500"> |
16 | 297 </div> |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
298 !--> |
16 | 299 |
300 ## まとめとこれから | |
17
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
301 - 本研究発表ではリモートエディタの開発とそれに伴う技術について述べた。現時点で実装できた構成は以下である。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
302 - リモートエディタの基本となる命令のやり取り部分のコマンドパターン実装。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
303 - 編集相違を防ぐためのアルゴリズムの発案と検証。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
304 - 現時点では最低限のセッションを動かすまでの最低限の実装は終わっていない。これから取り組まなければならない課題として以下が挙げられる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
305 - スター型Topologyの接続を動的に行わせる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
306 - 編集するファイルの共有方法 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
307 - ファイルをそのまま送信すると、負担が大きいと予想される。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
308 - 既存のエディタを同期通信に対応させる。 |
55e745a21506
add abstruct & slide
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
309 - 以上の課題の課題に取り組み、これからも実装を続けていきたい。 |