0
|
1 \section{Remote Editing Protocol(REP)}
|
|
2
|
|
3 %概要
|
|
4 \subsection{REPの概要}
|
|
5 Remote Editing Protocol(REP) は異なるマシン上に存在する異なるアプリケーション同
|
|
6 士を接続し、データの直接編集を相互に行うことを目的としたプロトコルである。REP を
|
|
7 実装したテキストエディタをリモートエディタと呼ぶ。
|
|
8 現在、REP は Vim, Emacs, Eclipse
|
|
9 などに実装されている。
|
|
10 REPではREPコマンドを用いて、エディタの接続の処理や、データの相互編集を行う(図\ref{fig:editor_to_editor2})。
|
|
11
|
|
12 \begin{figure}[htpb]
|
|
13 \begin{center}
|
|
14 \includegraphics[scale=.4]{figure/editor_to_editor2.pdf}
|
|
15 \end{center}
|
|
16 \caption{REPでの相互編集}
|
|
17 \label{fig:editor_to_editor2}
|
|
18 \end{figure}
|
|
19
|
|
20 %REPコマンド
|
|
21 \subsection{REPコマンド}
|
|
22 REPコマンドはテキスト編集における基本的な操作を表している。
|
|
23 REPは、様々なアプリケーションに実装されているため、それぞれのエディタ間での編集コマンドの差を埋める必要がある。REPでは、それぞれのエディタの複雑な編集コマンドをREPコマンドのinsert、deleteコマンドに変換してデータの相互編集を行っている。\\
|
|
24
|
|
25 \begin{figure}[htpb]
|
|
26 \begin{center}
|
|
27 \includegraphics[scale=.5]{figure/rep_command.pdf}
|
|
28 \end{center}
|
|
29 \caption{REPコマンド}
|
|
30 \label{fig:rep_command}
|
|
31 \end{figure}
|
|
32
|
|
33 以下に、REPコマンドのそれぞれのフィールドについての説明を行う。
|
|
34
|
|
35 \begin{itemize}
|
|
36 \item cmd\\ コマンド識別子。REPではこの識別子によって処理の内容を判断する。
|
|
37 \item sid\\ Sessionを識別するための番号。
|
|
38 \item eid\\ エディタを識別するための番号。
|
|
39 \item seq\\ シーケンス番号。
|
|
40 \item lineno\\ 編集を行う行番号。
|
|
41 \item text\\ 編集された/するテキスト。\\
|
|
42 \end{itemize}
|
|
43
|
|
44 次に、テキスト編集に用いられるREPコマンドと、接続時に用いられるREPコマンドの一部を紹介する。\\
|
|
45
|
|
46 編集コマンド
|
|
47 \begin{itemize}
|
|
48 \item insert\\ テキストへの行の挿入を表すコマンド。エディタでテキストへの行の挿入があった場合、このコマンドを発行し、たのエディタへ送信する。linenoに行番号、textに挿入するされたテキストをセットする。受信したエディタは指定された行にテキストを挿入する。
|
|
49 \item delete\\ テキストからの行の削除を表すコマンド。エディタで行が削除された時に発行され、textには削除された行がセットされる。このコマンドを受け取った側のエディタでは、テキストに対し、行の削除を行い、このコマンドのtextの値を、このエディタで削除した行へとセットし直す。\\
|
|
50 \end{itemize}
|
|
51
|
|
52 接続コマンド
|
|
53 \begin{itemize}
|
|
54 \item join\\ エディタがSession Managerに接続するときに発行するコマンド。このコマンドの場合、エディタがどのSessionに接続するかはすぐには決定せず、ユーザのSession ManagerへのGUI操作によって決定する。
|
|
55 \item put\\ エディタがSession Managerに接続し、Sessionを生成するコマンド。この場合。エディタは生成された。Sessionへ自動的に接続する。このとき生成されるSessionはエディタ側が現在開いているテキストとなる。
|
|
56 \item sync\\ あるSessionに参加する全てのエディタに対してテキスト内容の同期を行う。このコマンドはSessionに新たにエディタが接続してきたときにSession Managerからfile ownerのエディタへ送信される。受け取ったエディタは自分が持っているテキストの内容をinsert/deleteコマンドにより他のエディタへ送信して、テキストの内容を反映させる。
|
|
57 \end{itemize}
|
|
58
|
|
59 %Session Manager
|
|
60 \subsection{Session Managerの導入}
|
|
61 最初のREPは、一つのエディタをサーバとして、クライアントからの編集を可能にするものであり、1997年に新垣将史によって、pico エディタに実装された\cite{bib:arakaki3}。その後、Emacs 上にも実装された\cite{bib:arakaki}。
|
|
62 この版のREPでは、変更は一方向であり、サーバはクライアントからの
|
|
63 変更を受け付けるだけであった。
|
|
64
|
|
65 宮里忍、安村恭一は、二つのエディタ間でREPコマンドを巡回させることにより、二つのエディタ間での双方向の編集を可能にするマージアルゴリズムを作成した\cite{bib:yasumura}\cite{bib:miyazato}。
|
|
66 この時に、REPはvimにも移植されている。
|
|
67
|
|
68 2007年にはEclipseへの実装を行なった。これにより、Eclipse同士、あるいは、
|
|
69 Eclipse 上のファイルをEmacs/vimなどで編集することが可能になる。
|
|
70
|
|
71 この時点で、エディタ同士を直接
|
|
72 接続する手順が複雑すぎることが明らかになった。エディタのIPアドレスや
|
|
73 ファイル名をユーザがエディタから直接入力するのは、かなり繁雑である。
|
|
74 そこで、エディタ間の接続を管理するGUIとして、Session Managerを導入することを提案した(図\ref{fig:one_session_manager})。
|
|
75
|
|
76 \begin{figure}[htpb]
|
|
77 \begin{center}
|
|
78 \includegraphics[scale=.35]{figure/one_session_manager.pdf}
|
|
79 \end{center}
|
|
80 \caption{Session Managerの導入}
|
|
81 \label{fig:one_session_manager}
|
|
82 \end{figure}
|
|
83
|
|
84 Session Manager にはネットワーク経由でどこからでも接続できるが、
|
|
85 その場合は、やはり、エディタの方でIPアドレスなどを指定する必要がある。
|
|
86 それよりはSession Manager はコンピュータ上に一つあると言う方が
|
|
87 望ましい。そうすれば、エディタは決まったポートでデフォルトの
|
|
88 Session Manager に接続できる。
|
|
89
|
|
90 \begin{figure}[htpb]
|
|
91 \begin{center}
|
|
92 \includegraphics[scale=.28]{figure/many_session_manager.pdf}
|
|
93 \end{center}
|
|
94 \caption{Session Managerの同士の接続}
|
|
95 \label{fig:many_session_manager}
|
|
96 \end{figure}
|
|
97
|
|
98 このようにSession Managerを導入することで、エディタ側に複雑な
|
|
99 ユーザインタフェースを実装することなくREPを実装することが
|
|
100 可能となる。このユーザインタフェース部分は、Emacsでは10\%程度、
|
|
101 vim では30\%程度を占めており無視できない大きさである。
|
|
102
|
2
|
103 %sm_join
|
|
104 \subsection{Session Manager同士の接続}
|
|
105 リモートホスト同士のエディタ間で相互にデータの編集作業を行うにはまず、そのホストのSession Manager同士を接続し、エディタ間での通信は接続されたSession Managerを介して行う。
|
|
106
|
|
107 Session Manager同士を接続するにはユーザがGUI操作によって接続先のSession Managerを決定し、sm\_joinコマンドを発行する。
|
|
108 sm\_joinコマンドを発行して接続してきたほうをslave、接続されたほうをmasterとし、全てのSession Managerの接続はTree構造を形成する。
|
|
109
|
|
110 sm\_joinコマンドを受け取ったSession Managerが既にmasterだった場合、sm\_join\_ackを全てのslaveに送信する。slaveだった場合はmasterの方向へsm\_joinコマンドを送信する。slaveがackを受け取った場合はTree構造の子の方向へackを送信する。
|
|
111
|
|
112 \begin{figure}[htpb]
|
|
113 \begin{center}
|
|
114 \includegraphics[scale=.3]{figure/sm_join.pdf}
|
|
115 \end{center}
|
|
116 \caption{sm\_joinコマンド}
|
|
117 \label{fig:sm_join}
|
|
118 \end{figure}
|
|
119
|
0
|
120 %エディタの接続
|
|
121 \subsection{エディタの接続}
|
|
122
|
|
123 REPを使用して複数のエディタ同士でテキストの相互編集を行うにはまず、エディタへのユーザの操作によりjoinコマンド、またはputコマンドを発行する。
|
|
124 すると、エディタは自動的にデフォルトのSession Managerに接続する。
|
|
125 putによって接続するとSession Manager側にSessionが生成される、エディタは自動的にそのSessionに接続する。
|
|
126 joinで接続を行うと、このエディタ接続がSession Manager側のGUIに反映される。
|
|
127 そして、ユーザはSession ManagerへのGUI操作により、joinによって接続したエディタがどのSessionに接続するかを決定する。
|
|
128
|
|
129 \begin{figure}[htpb]
|
|
130 \begin{center}
|
|
131 \includegraphics[scale=.5]{figure/use_case_put_join3.pdf}
|
|
132 \end{center}
|
|
133 \caption{エディタの接続}
|
|
134 \label{fig:use_case_put_join3}
|
|
135 \end{figure}
|
|
136
|
|
137 リモートホスト間で通信を行う場合にはまず、Session Managerどうしの接続を行う。
|
|
138 この接続はSession Managerへのユーザ操作によって行う。
|
|
139
|
|
140 Session Manager同士の接続が確立したら、Session Manager 同士の接続が確立したら、エディタ側から put/join コマンドによりローカルホストの Session Manager へ接続を行う。
|
|
141 これを受けとったSession Managerは、Sessionの追加やエディタの追加を他のSession Managerにupdateコマンドによって通知する(図\ref{fig:use_case_put_join_over_sm})。\\
|
|
142
|
|
143 \begin{figure}[htpb]
|
|
144 \begin{center}
|
|
145 \includegraphics[scale=.3]{figure/use_case_put_join_over_sm.pdf}
|
|
146 \end{center}
|
|
147 \caption{Session Managerを介したエディタの接続}
|
|
148 \label{fig:use_case_put_join_over_sm}
|
|
149 \end{figure}
|