annotate rep-verify-sigos.ind @ 4:8e30bfb5deb6

done.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 26 Mar 2009 12:53:57 +0900
parents f1214f4b5933
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 -title: Remote Editing Protocol の実装と検証
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 --author: 与儀健人, 宮城健太, 河野真治
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
5 --はじめに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
7 本研究室では、vim、Emacs、Ecpliseを相互接続するプロトコルを提案して来た。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
8 今回は、Session Manager を導入することにより、より単純なユーザインタフェース
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
9 を実現するとともに、複雑なプロトコルをSession Manager側に閉じ込めて、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
10 Editor側の実装の手間を軽くすることを提案する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
12 一方で、プロトコル自体がかなり複雑になったので、プロトコルの正しさ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
13 及び、プロトコル実装の正しさを検証する必要が出て来た。
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
14 プロトコル検証では、Java PathFinder\cite{havelund98model}の
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
15 有効性が知られているが、それを用いるために、ソケット
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
16 通信をThread間の同期で実現するライブラリを作成した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
17 また、Editor側の実装の正しさの検証及びデバッグのために、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
18 テスト用のEditorを作成した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
19
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
20 --Remote Editing Protocol の設計方針
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
21
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
22 複数人が同じテキストを共有して編集するプロトコルは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
23 さまざまなものが提案されているが、汎用エディタに実装
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
24 する前堤のプロトコルはほとんどない。Remote Editing Protocol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
25 では、複数のSession Managerと、リング状のSession の上に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
26 編集コマンドを循環させる方法を取っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
27
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
28 <center><img src="fig/editor_to_editor2.pdf" alt="REPでの相互接続"></center>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
29
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
30 この方法を採用した理由はいくつがある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
31 集中サーバを用いない\underline{分散実装}が一つの前堤になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
32 Session Manager 自体が分散していて、Session Manager は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
33 (分離されたMergerを除けば)編集コマンドを中継するだけである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
34 また、既存のエディタを用いるために、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
35 \underline{localな編集}を妨げない点を重視している。遠隔/共有編集を実現
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
36 することによって、本来の編集機能が速度低下などにより損なわれることはない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
37 一度に大量の通信をすることなどを避け
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
38 \underline{Network負荷が軽い}こと。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
39 複雑なコマンド入力などのない\underline{Simple なユーザInterface}。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
40 これらを実現するために\underline{Conflictを非同期に解決}し、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
41 変更の伝播の遅延は容認する。また、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
42 \underline{小人数向け}の共有とする。遅延を容認するために、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
43 \underline{遠距離でも使用可能}となる。また、オープンソースとして実装し、
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
44 \underline{教育用途}に向いている。特に、XP (eXtreme Programming) \cite{bib:xp}
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
45 における\underline{Pair Programming}での使用を意識しているので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
46 \underline{Emacs/vim/Eclipseの相互接続}を重視する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
47 将来的には、動的な変更を可能とする
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
48 \underline{Inter-Application Protocol}として使えるものを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
49 目指している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
50 プロトコル自体の信頼性を増すために、プロトコル自体の正しさ、及び、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
51 実装の正しさを調べることを可能にする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
52
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 --Protocol の構成
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
55 ここでは、REPをSession manager(SM), Session manager接続プロトコル、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
56 Session 接続プロトコル、Editor Command、Mergeプロトコル、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
57 MergeのSession Managerへの移動の順に説明する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
58
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
59 ---Session managerの導入
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
60
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
61 従来のREPはエディタ間を直接結んでいたが、その場合は相手の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
62 エディタのホスト名やファイル名を直接入力する必要があった。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
63 これは、ユーザに取って繁雑なだけでなく、個々のエディタでの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
64 実装に複雑なUIを含める必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
66 Session manager(SM)はエディタの動作するホストに一つあり、エディタ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
67 は自動的に決まったポートを通してSMに接続(join/put)する。このようにすれば、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
68 エディタ上でホスト名を入力する必要はない。一つのホスト上では、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
69 単一のSMに複数のエディタが接続する。離れたホスト同士のエディタを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
70 接続する場合は、まず、それぞれのホスト同士のSMを接続する。そして、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
71 それぞれエディタがSMに接続した後で、ホスト間の接続を選択(select)する。
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
72 <center><img src="fig/one_session_manager.pdf" alt="Session Managerの導入"></center>
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
73
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 ---Session managerの接続protocol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
76 SM同士の接続は、{\tt sm\_join}コマンドをSMに送ることによる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
77 接続により、接続したSM間でuniqueな session manager id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
78 が決められる。SM同士の接続は木構造(SM木)になるようになっており、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
79 唯一のmaster SMが存在する。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
80
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
81 同時に相互に{\tt sm\_join}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
82 が発行される場合もあるので、リングを避けるために、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
83 {\tt sm\_join} はmaster SMまで転送される。自分自身に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
84 {\tt sm\_join} が戻って来た場合は、その{\tt sm\_join} は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
85 廃棄される。現在は、既にsession/editorを持つSMは、他のSMに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
86 接続することは出来ない。
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
87 <center><img src="fig/many_session_manager.pdf" alt="Session Manager同士の接続"></center>
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
88
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89 ---Session 接続 protocol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
90
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
91 SMに接続したエディタは、自分の既にオープンしたファイルを持って接続する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
92 {\tt put}と、他のエディタへ空のバッファを接続する{\tt join}の二種類の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
93 接続を行なう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
94
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95 接続が行なわれると、SMからeditor idをACKとして受け取る。editor idは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
96 session manager id (SM id)を含んでおり、全てのSM上でユニークとなる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
98 {\tt put}したファイルを持つエディタは、そのsessionのmasterとなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
99 ファイルを共有するeditor群をsession と呼ぶ。session には、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
100 SM id を含む session id が割り振られ、全てのSM上
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
101 でユニークとなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
102
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
103 ユニークな SM id を使うので、editor id/sesison id はmaster SMに問い合わせる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
104 ことなく生成が可能となる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
105
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
106 {\tt put}されたファイルはSM木を{\tt put}コマンドで遡り、{\tt put\_ack}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
107 によって、すべてのSMに通知される。このファイルの編集に参加したい場合は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
108 まず、Editorを空のバッファの状態でSMに{\tt join}コマンドで接続する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
109 すると、{\tt put}と同様に{\tt join}したEditorがすべてのSM上に通知される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
110 SMのGUI上の操作{\tt select}により、{\tt put}されたファイルと{\tt join}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
111 したEditorが結びつけられる。
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
112 <center><img src="fig/sm_join.pdf" alt="join コマンド"></center>
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
113
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
114 {\tt select}操作では、{\tt join}したEditorと{\tt put}したエディタを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
115 探し出す必要がある。そのために、SM木上にSM同士に到達するための
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
116 routing tableを構築している。これは、{\tt sm\_join}時に作成される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
117 まず{\tt put}したEditorを探し、見つかったら{\tt select\_ack}を、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
118 session ring を構築しながら{\tt join}したEditorを探す。見つかったら
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
119 {\tt join\_ack}がEditorに返される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
120 この時に、必要があれば、{\tt join}側、{\tt put}側の認証を行なう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
121
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
122 {\tt join}したエディタは空のバッファを持っているので、Session master
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
123 ({\tt put}したEditor)に、必要な編集行を要求する{\tt sync}コマンドを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
124 session ring に送る。Session master は、次のEditor Command を使って
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
125 必要な行を送信する。
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
126 <center><img src="fig/use_case_put_join_over_sm.pdf" alt="Session Managerを介したエディタの接続"></center>
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
128 ---Editor Command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
129
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
130 Editorのコマンドは、すべて、{\tt insert},{\tt delete} に分解される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
131 SM上での混乱を避けるために、Editorが直接SMに送ったユーザが生成した
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
132 Editor Command {\tt user\_inert, user\_delete}と SM経由で送られた他のEditor Command は異なる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
133 コマンドとして扱っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
134
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
135 Editor は複数のsession を持つことも可能であるが、一つのEditor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
136 が同じSessionに複数回{\tt join}すると、Editorの通信経路とEditor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
137 id が対応しなくなる。問題はないが、実装はより複雑となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
139 次のMerge Protocolでは、SM上でEditorのコマンドのundoを計算する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
140 必要があるので、{\tt user\_delete}には、削除した行の内容が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
141 付加されてSMに送られる。したがって、{\tt user\_delete}と
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
142 {\tt user\_insert}と見掛け上対称となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
143
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
144 全文置換なども{\tt user\_inert, user\_delete}に分解する必要が
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
145 あり、その分解はEditorによって行なわれる。REPは歴史的理由で行指向の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
146 プロトコルであり、行指向でないEditorでも行番号を付加する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
147 必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
148
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
149 {\tt sync}に対しては、要求された行に対して、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
150 {\tt delete, insert}を順に送ることで、{\tt join}したEditorに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
151 行を転送する。特別なバッファ転送コマンドはない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
152
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
153 置換を特別扱いすることによるコマンド短縮の利点があるように
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
154 思えるが、SMではundoを生成する必要があるので、変更前の行と
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
155 変更後の行を送る必要があり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
156 {\tt delete, insert}を順に送る場合との差は無視できる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
157
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
158 ---Merge Protocol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
159
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
160 一つのSessionの上で、複数のEditorが同時に編集を行なった場合には、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
161 その結果は、最終的に、Session 上で同じになる必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
162
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
163 REPでは、二つのEditorの場合の編集の衝突の解決を行なう
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
164 手法を提案して来た。この方法(Merge Protocol (A))では自分のEditor Commandを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
165 相手に送り、戻って来るまでのEditor Commandをキューに入れておく。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
166 他のEditorのCommandを受け取った時には、その
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
167 キューと、そのCommandの可換性を調べて、キューを変更する\cite{kono04g}。
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
168 しかし、この方法は、三つ以上のEditorの場合はうまく動作しない。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
169
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
170 そこで、以下のようなMerge Protocol (B)を導入する。(1) Editor Command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
171 をSession Ring 上に流し、それが戻って来るまでに、他のEditorから
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
172 受け取った Editor Command をキューに入れておく。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
173 (2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
174 順序を基にソートする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
175 (3) Editor Command がなくても、他のEditorからCommand を受け取ったら、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
176 NOP Command を生成して、それが戻って来た時にソートを行なう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
177
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
178 <center><img src="fig/new_merge.pdf" alt="Session Ring上のREPコマンドの送信"></center>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
179
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
180 この手法では、EditorがN個あるSessionの場合、一つのEditor Commandに対して、N-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
181 個のNOP Command が生成される。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
182
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
183 そこで、以下のようなMerge Protocol (C)を導入する。(1) Editor Command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
184 をSession Ring 上に流し、それが戻って来るまでに、他のEditorから
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
185 受け取った Editor Command をキューに入れておく。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
186 (2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
187 順序を基にソートする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
188 (3) 他のEditorにソートのタイミングを与えるために、Editor Command の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
189 ack を、もう一周させる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
190 (4) 他のEditorのCommandを受け取ってから、ack が来るまでのCommandをキューに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
191 入れておき、ack が来たら、eid とCommandの順序を基にソートする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
192
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
193 Editor には、ソートした編集結果になるように、それまで行なった編集をUndo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
194 して、ソートした編集結果を適用する。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
195
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
196 ---Merge のSession Managerへの移動
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
197
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
198 Merge Protocol は、かなり複雑であり、すべてのEditor実装に対して
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
199 実装する必要がある。我々のターゲット(Vim, Emacs, Eclipse)は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
200 すべて異なる言語(C,Emacs Lisp,Java)で実装されており、そのすべてで、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
201 複雑なプロトコルを実装するのは不可能ではないが、コストがかかる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
202
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
203 今回は、SMが一つのEditorに対して必ず存在するので、Merge Procotol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
204 をSMに実装すると、SMの実装言語(Java)に実装するので十分になる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
205 しかし、Merge Protocol は編集バッファに対して複雑な操作をするので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
206 それをEditor Command を通して実装する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
208 まず、Editor Command がUndo(取消し)可能でなければならない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
209 このために、{\tt user\_delete} Command に削除した行の内容を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
210 付加することにした。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
211
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
212 次に、SMがMerge Protocolでソートした編集結果を適用した結果は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
213 (可能な最適化をした)Editor Command 列でEditorに反映する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
214 この時に、ユーザが編集コマンドを割り込ませる可能性がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
215
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
216 これを防ぐ一つの方法は、Merge 作業が始まった段階で、ユーザ入力を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
217 block してやれば良い(a)。もう一つの方法は、ユーザ入力の割り込みが
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
218 あった場合は、その入力込みで、もう一度、ソートを実行すれば良い(b)。
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
219 これはリマージと呼ばれる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
220
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
221 <center><img src="fig/reMerge.pdf" alt="リマージ"></center>
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
222
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
223 Merge 作業中には、他のSM/Editorからの入力をblockすることは問題ない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
224 それは、もともと非同期で動作しており、遅延は許容されるように
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
225 なっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
226
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
227 ユーザ入力のlock(a)は、エディタの実装に依存していて、実装はさまざまで
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
228 ある。また、REP設計の一つの目標であるlocalな編集を妨げないという
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
229 点では問題が残る。(b) は、Merge Protocol の実装が繁雑になるが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
230 ユーザの入力を妨げることはない。また、エディタのlockを実装しなくて
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
231 すむ。(a),(b)はお互いに干渉しないので、エディタのlockの実装は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
232 REPを実装する時の選択肢の一つとなる。lock がある方が大量の変更(コピー
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
233 ペースト)がある場合にスムースな動作が期待できる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
234
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
235
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
236 --Protocol の正しさ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
237
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
238 Merge Protocol の正しさの証明は、Protocol自体の正しさと、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
239 Protocolの実装を含めた正しさの二種類の正しさを示す必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
240
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
241 ここでは、(A)のProtocolの正しさを示す。Editor $0..n$ が、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
242 それぞれ、編集コマンド$C_{ij}$ (Editor $i$の$j$番目のコマンド,$j$は0から)を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
243 入力したとする。このコマンドは、Session ring を巡回する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
244 巡回するたびに、各Editor $k$が{\tt NOP} Command $N_{kx}$を、その
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
245 コマンドの前に付加する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
246 % (A)では自分が既にCommandを送っていれば{\tt NOP}を付加する必要は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
247 % ないが、ここでは、必ず付加することにする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
248 $x$は、コマンドの順序である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
249 % $C_{ij}$の$j$は、{\tt NOP}を含めた番号に付け換える。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
250
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
251 Editor $m$では、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
252 \[ C_{m0} C_{x0} N_{00} .... N_{yz} \]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
253 などのコマンド列が実行されることになる。これを$C/N$の
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
254 区別のないコマンド記号($E_{ij}$)で置き換えよう。
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
255 \[ E_{m0} E_{x0} E_{00} .... E_{yz} \]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
256 NOPの付加手順から、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
257 他のEditorが送ったCommandには、その前の他のEditorからのCommandを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
258 受け取った後の、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
259 自分が送ったCommand(0以上の複数個)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
260 または、{\tt NOP}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
261 が必ず対応している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
262 対応するCommandとは、Session ring 上で同時に実行されたと考えられる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
263 Command の集合と考えて良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
264 Command はSession ring を一周するので、すべての
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
265 Editor が同じCommandの集合を受け取っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
267 ここで、対応したCommandの集まり毎に列を分割し、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
268 Editor iの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
269 その集まりを集合と
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
270 みなし$S_{ij}$ とする。この集合の列を$Z_i$とする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
271 \[ Z_i = S_{i0} S_{i1} .... S_{in} \]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
272 定義から隣同士の$S_{ij}$には、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
273 対応したCommandが含まれることはない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
274
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
275 この集合列$Z$は、すべてのEditorで同一となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
276 [証明]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
277 Editor $i$とEditor $j$で、$S_{ik}$と、$j$の$S_{jk}$が異なっている
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
278 としよう。あるCommand $E_s$があって、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
279 $E_s \in S_{ik}$であって$E_s \in S_{jk}$でない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
280 しかし、$E_s$
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
281 はsession ringを一周しているので、$S_{ik}$と$S_{jk}$の両方に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
282 含まれているか、隣同士にあるはずである。両方に含まれていると
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
283 すると仮定と矛盾するので、隣同士になるはずである。しかし、隣同士で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
284 あれば、Command の分割の方法に矛盾する。[証明終り]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
285
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
286 従って、$S_i$をEditor idとCommand順序によってソートしてやれば、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
287 すべてのEditorで、同一なCommand列を得ることが出来る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
288 ソートのタイミングは、対応するコマンドがすべて自分に到着した時点である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
289 自分の送った新しいコマンド、または、新しい{\tt NOP}が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
290 来たことによって、その一つ前までが対応しているものだということがわかる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
291 ので、その時点でソートしてやれば良い。従って、Merge Protocolにより、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
292 すべてのEditorで同一の編集結果が得られることがわかった。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
293
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
294 (B)では、{\tt NOP}の挿入の代わりに{\tt ack}を、もう一周させている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
295 {\tt ack} が来た時点で、対応するCommandの集合が確定する。あるいは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
296 仮想的に{\tt NOP}を挿入したと考えると、その{\tt NOP}は、{\tt ack}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
297 の前に挿入されていると考えて良い。従って、(A)と同じように集合列$Z$
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
298 を、すべてのEditorで同一となるように決めることが出来る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
299
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
300 プロトコルの実装の正しさは、実装言語であるJavaに深く依存するので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
301 このように簡単に証明することは出来ない。そこで、
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
302 モデル検査器であるJava PathFinder\cite{havelund98model}を用いる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
303
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
304 --Protocol の実装
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
305
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
306 Session Manager はJava 1.5で実装されており、 Ecplise は Java によるPlug-in
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
307 となっている。 Emacs は、従来はCで書いたクライアントを接続していたが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
308 今は、すべて Emacs Lisp で書かれている。 Vim は、C で記述されており、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
309 Merger もCで記述されていたが、今回の実装で取り外された。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
310
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
311 今回の実装では、Editor 側の実装のコストが削減されており、Merge Protocol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
312 部分でCで150行程度が削減されている。Editor 側の実装は、Editor Command を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
313 {\tt insert, delete} に分解する部分の実装が大半である。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
314
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
315 Editor 側で実装する必要があるのは、表\ref{tb:sync}の機能である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
316 \begin{table}[htdp]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
317 \caption{Editor 側での実装}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
318 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
319 \begin{tabular}{|l|l|}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
320 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
321 1 & 編集機能の{\tt user\_insert,user\_detele}への分解と、分解したEditor Command の送信 \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
322 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
323 2 & {\tt join,put} Command のUI部分と、Command の送信 \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
324 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
325 3 & {\tt join,put} Command のUI部分と、Command の送信 \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
326 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
327 4 & {\tt join\_ack,put\_ack} の受け取りとsid,eidの設定 \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
328 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
329 5 & 外部からのEditor Commandの非同期受け取りと実行 \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
330 \hline
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
331 6 & {\tt sync} Command を受け取った場合の{\tt user\_insert,user\_detele}の生成 \\
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
332 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
333 7 & Merge 時のlock (optional) \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
334 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
335 7 & {\tt quit} Command \\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
336 \hline
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
337 \end{tabular}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
338 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
339 \label{tb:sync}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
340 \end{table}%
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
341
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
342 ファイルのオープン/セーブなどの機能はREPには含まれていない。Master Editor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
343 も、それ以外のEditorも任意の時点でのローカルなセーブが可能である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
344 版管理なども、REP以外の部分で対応する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
345
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
346 外部からのEditor Command を受け取った場合のカーソルなどの制御は、規定されて
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
347 いない。移動した場合が便利な場合と、そうでない場合があると思われる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
348
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
349 --Socket Simulator
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
350
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
351 Java Pathfinder による検証を行なうために、直接、Socketを経由せずに、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
352 Thread を通して通信を行なうライブラリを作成した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
353
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
354 このライブラリは、最初、java.nio互換ではなく作成し、Merge Protocol
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
355 (A)及び(B)の動作をJava PathFinder で確認した。編集結果の同一性を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
356 調べるために、Session 内の Editor のquit プロトコルを実装している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
357
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
358 まず、 {\tt quit } Command がSessin ring に送られ、各Editorは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
359 {\tt quit}を受け取ると、自分のユーザ編集コマンドを停止する。その編集を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
360 終了した後、{\tt quit}を返す。{\tt quit}を受け取った後も、他の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
361 Editor からのEditor Commandは来る可能性がある。{\tt quit}を最初に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
362 送ったEditorに{\tt quit}が戻ると、今度は{\tt quit2}をSession Ring
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
363 に流す。これより後に、ユーザ編集コマンドが来ることはない。Editor は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
364 自分の待っているEditor Commandのackがすべて来るのを確認してから、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
365 {\tt quit2}を次へ渡す。{\tt quit2}を渡した後は、Editor Command は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
366 来ないので、終了して良い。最初のEditorへ{\tt quit2}が戻った時点で、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
367 すべての編集が終了する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
368
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
369 この時に、Editor のバッファを比較して、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
370 すべてのEditorのバッファが同じならば、正しくプロトコルが動いた
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
371 ことになる。これをJava PathFinderで検証を行なう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
372
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
373
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
374 (C)の実装を、実際のSession Manager 上で検証するために、java.nio と
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
375 Thread による通信のシミュレーションを切替えることが可能なライブラリ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
376 を作成した。実際のSession Manager に対する Java PathFinder での
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
377 実行確認は、計算時間の制約により、まだ、可能とはなっていない。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
378
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
379 --検証とデバッグ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
380
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
381 (A)のプロトコルがEditor 二つで動作すること、及び、(B)のプロトコル
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
382 が複数のEditorで動作することを Java PathFinder で確認することが
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
383 出来た。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
384
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
385 (C)は、実際のSession Managerの実装を含む検証となるので、よりハードルが
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
386 高い。現状では、Java PathFinder での動作確認は出来ていない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
387
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
388 Java PathFinder でvimやEmacsを含む検証は可能とはなっていないが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
389 Sample Editor をJava で実装することにより、Java PathFinderでの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
390 Merge Protocolの検証が可能となっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
391
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
392 実際には、vim やEmacs などのEditor側の実装が正しいかどうかを調べる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
393 ことも重要である。それは、Merge Protocolを切った状態で、Javaの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
394 Sample Editor に対する動作を確認することで調べることが出来る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
395
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
396
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
397 --比較
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
398
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
399 類似のProject としては、GroupKit \cite{bib:groupkit}, Soba Project\cite{bib:soba} がある。
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
400 vim やEmacs などのOpen source editor の実装を含むのが、REPの特徴
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
401 である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
402
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
403 また、Java で実装されていて、Session Manager 部分、Editor の改変部分、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
404 Eclipse plugin のすべてが、LGPLで公開されているのも独自な特徴の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
405 一つである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
407 GroupKit はtcl/tkで記述されており、検証などが困難だが、REPでは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
408 Java の部分をJava PathFinder で検証することが可能だと思われる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
409 しかし、現状では、まだ、検証までには至っていない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
410
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
411 GroupKit などで使われているマルチメディア編集の同期は、Masterが
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
412 一つ存在し、それに対するCommandの発行と、MasterからのCommandの
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
413 マルチキャストで実現されている\cite{bib:ellis}。REPでは、マルチキャスト
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
414 ではなく、Session ring によって同期を実現している。Ring は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
415 遅く信頼性に欠ける部分があるが、ネットワークに対する負荷が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
416 軽いと言う特徴がある。(C)のMerge Protocolを使うことにより、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
417 o(n)のパケットで同期を行なうことが出来る。また、マルチキャスト
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
418 を避けているので、WANなどの遅延が大きい部分に複数のストリーム
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
419 を張る必要がないという特徴がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
420
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
421 また、Session Manager 上には、Editor Bufferが存在しないので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
422 大きなファイルを編集する場合でも、Session Manager のメモリを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
423 消費することはない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
424
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
425 --最後に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
426
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
427 このプロジェクトは、sourceforge を通じて公開\cite{rep-sourceforge}されており、まだ、
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
428 開発途上となっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
429
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
430 残念ながら、実際のSession Manager 上でのJava Pathfinder での検証は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
431 まだ、出来てはないが、通信ライブラリ上での処理をatomicにするなどの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
432 工夫で可能になると期待している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
433
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
434
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
435
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
436