annotate final_main/chapter2/chapter2.tex @ 9:a37b7bd13be9

...
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Tue, 11 Feb 2020 21:59:14 +0900
parents f71206f427e3
children 5ddb3e41e515
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 %\input{/Users/e155753/.tex/setup}
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 %%文書開始****************************
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 \begin{document}
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 %%**************************************
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
6 \chapter{リモートエディタ}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
7 リモートエディタとは他のマシン上に存在するファイルのバッファを別デバイスから開いて編集, 保存することができる機能である. 加えてこのリモートエディタを複数人が同時に同じファイルを編集し, その上変更がリアルタイムに反映されるように設計する.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
8 この章ではリモートエディタの実装の上で踏んだプロセスや, 開発の上で問題となる点と解決策について説明する。
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
10 \section{document listenerによる編集オフセット番号の読み取り}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
11 エディタ同士の基本通信環境の構成のため, Chrisitie と同様のjava 言語で作成したエディタのインスタンスを使い, 異なるマシン同士の同期の実現を目指した. 自作エディタは java. swingの機能で構成されており, 追記または削除されたオフセット位置とその内容の取得はDocumentListenrを使用した. DocumentListenerのクラスはswingで実装したエディタ部分の入力と削除を検知し, 動作するメソッドであり, DocumentEvent内に入力されたオフセットとその長さや文字列が入力されるため, それをChrisitie側で検知し処理を行った.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
12 insertUpdateメソッドではバッファに入力が行われた際に自動的に実行され, removeUpdateメソッドは同様に削除が行われた際に実行される. 他ノードから送信されてきた命令によるバッファの変更によっても実行され, 意図しないループが発生したため, 受信した命令では実行されないように記述をおこなった.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
13
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
14 \lstinputlisting[caption=DocumentListenerのコード部分, label=code:DocumentListener]{./src/DocumentListener.java}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
17 \section{Command パターンによる命令オブジェクトの作成}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
18 リモートエディタを実装する上において, 各エディタは自身に起きたバッファの変更を対応した他ノードに送信する必要がある. この変更の送り合いをCommand パターンとして実装した. Command パターンとは, 命令を一つのオブジェクトとして表現する方法である. コマンドパターンの利点として,
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
19 \begin{itemize}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
20 \item インスタンスを利用して命令を作成するため, ChristieのGearの概念と相性が良い.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
21 \item 命令に必要な内容をまとめて送信するため, 相違の発生を防ぐことができる.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
22 \item 命令の管理が行いやすい, 行列に並ばせ命令の順番を管理したり, 命令の際実行, 取り消しが容易になる.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
23 \end{itemize}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
24 といった点が挙げられる. ソースコード:\ref{code:Command}は書き込み, 送信を行う際の命令をクラスとして作成したものである. このクラスのインスタンスを命令オブジェクトとして送信し合う.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
25
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
26 \lstinputlisting[caption=Commandパターンとして実装した命令, label=code:Command]{./src/Command.java}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
27
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
28 \section{命令オブジェクトを実装する際に起きた問題}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
29 インスタンス化した命令を他ノードに送信する際にエラーが発生し, 送信に失敗してしまうという問題が発生した. クラスの送信の際のシリアライズはmsgpackクラスを利用していた.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
30 msgpackクラスは,シリアライズしたいクラスにMessage アノテーションをつけることにより, シリアライズ化を行う. 原因を調査した結果, 以下の原因が見つかった.
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 \begin{itemize}
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
33 \item Christieのjavaバージョンは11を使用していたが, msgpackバージョン0.6.12はjava11に対して対応していなかった.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
34 \item msgpackの最新版0.8.20はシリアライズ機能が含まれなくなった.
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \end{itemize}
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
37 以上の原因に対処するために以下のことを行った.
4
c1732eac57f6 add some section
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
38
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
39 \begin{itemize}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
40 \item Christieのjavaバージョンを8まで下げ, msgpackバージョン0.6.12を動作できるようにした.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
41 \item シリアライズする命令クラスに対し, フィールドをpublic にした.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
42 \item javassistのバージョンを最新版へ変更した.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
43 \end{itemize}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
45 javaのバージョンを下げたのは応急的な処置となってしまったが, これらの処置により問題なくCommandパターンでの命令実装を行うことができた. javaのバージョンに左右されずリモートエディタを実装するには, シリアライズの機能について他のパッケージを使うか, 自信で作成する必要が生まれた。
4
c1732eac57f6 add some section
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
46
c1732eac57f6 add some section
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
47
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
48 \section{編集位置の相違}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
49 セッション中のエディタ間の通信で生じうる, 編集結果の相違について説明する. エディタ同士のコマンドの送信はそれぞれが独立して行うため, 編集対象の領域にエディタ間で相違が生じる場合がある. 例としてエディタが一対一の接続となっている時に発生しうる相違を図\ref{fig:difference} を使用して解説する.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
50 編集対象は各オフセット番号に同じ値の数字が入っているものとする. EditorA ではオフセット番号 3 の 3 という 要素を削除 (テキストエディタ上のため削除されたオフセットにはその後ろの要素が繰り上げられる.), EditorB では オフセット番号 2 に A という要素を挿入するという編集をしたとする. この編集を共通プロトコルとして互いに送信しあった際, 本来編集する予定だったオフセットの中身が異なってしまい編集結果に違いが生じてしまう. これらの問題を解決することのできるエディタ同士の通信手法を作成しなければならない。
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 \begin{figure}[H]
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \centering
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 \fbox{
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
55 \includegraphics[scale=0.6]{./images/difference_offset.pdf}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 }
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
57 \caption{通信のすれ違いによる編集位置の相違}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
58 \label{fig:difference}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 \end{figure}
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
61 \section{編集位置の相違解消方法}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
62 編集するオフセットに相違が発生する条件として, サーバーとノードがお互いにコマンドを送り合った際, その命令コマンドが相手に到着する前に相手が自身のバッファに変更を加えてしまった場合に起きる. したがって, 相違の解消に必要なことは
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
63 \begin{itemize}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
64 \item サーバーとノード間のコマンド送信のすれ違いが発生したということを検知する方法
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
65 \item すれ違いが発生した際に編集したオフセットのズレを修正する方法
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
66 \end{itemize}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
67 が挙げられる.
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 %%文書終了****************************
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
72 \end{document}