annotate final_main/chapter2/chapter2.tex @ 16:7293b6481e32

add slide & tweak
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Sat, 15 Feb 2020 21:22:43 +0900
parents c7ab31269230
children
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{リモートエディタ}
13
7a840fd996a1 rm some graph
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
7 リモートエディタとは他のマシン上に存在するファイルのバッファを別デバイスから開いて編集, 保存することができる機能である.
7a840fd996a1 rm some graph
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
8
7a840fd996a1 rm some graph
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
9 本研究ではこのリモートエディタを複数人が同時に同じファイルを編集し, その上変更がリアルタイムに反映されるように設計する.
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
10 この章では同期式リモートエディタの実装の上で踏んだプロセスや, 開発の上で問題となる点と解決策について説明する。
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
11
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
12 \section{document listenerによる編集オフセット番号の読み取り}
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
13 本研究の通信部分を構成する分散フレームワークChrisitie はjavaで開発する.
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
14 したがってエディタ同士の基本通信環境の構成のため, Chrisitie と同様にjava 言語で作成したエディタのインスタンスを使い, 異なるマシン同士の同期の実現を目指した.
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
15 自作エディタは java. swingの機能で構成されており, コードをオフセット番号で取り扱っている.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
16
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
17 追記または削除されたオフセット位置とその内容の取得はDocumentListenrを使用した.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
18 DocumentListenerのクラスはswingで実装したエディタ部分の入力と削除を検知し, 動作するメソッドであり, DocumentEvent内に入力されたオフセットとその長さや文字列が入力されるため, それをChrisitie側で検知し処理を行った.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
19
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
20 insertUpdateメソッドではエディタのバッファに入力が行われた際に自動的に実行され, removeUpdateメソッドは同様にバッファ内の文字のいずれかが削除が行われた際に実行される.
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
21 他ノードから送信されてきた命令によるバッファの変更によっても実行され, 意図しないループが発生したため, 受信した命令では実行されないように記述をおこなった.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
22
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
23 コード\ref{code:DocumentListener}はinsertUpdate, removeUpdateの記述部分である.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
24
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
25 \newpage
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
26
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
27 \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
28
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
30 \section{Command パターンによる命令オブジェクトの作成}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
31 リモートエディタを実装する上において, 各エディタは自身に起きたバッファの変更を他ノードに送信する必要がある.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
32 この変更の送り合いをCommand パターンとして実装した.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
33 Command パターンとは, 命令を一つのオブジェクトとして表現する方法である.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
34 コマンドパターンの利点として,
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
35
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
36 \begin{itemize}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
37 \item インスタンスを利用して命令を作成するため, 後述のChristieのGearの概念と相性が良い.
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
38 \item 命令に必要な内容をまとめて送信するため, 相違の発生を防ぐことができる.
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
39 \item 命令の管理が行いやすい, 行列に並ばせ命令の順番を管理したり, 命令の際, 実行, 取り消しが容易になる.
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
40 \end{itemize}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
41
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
42 といった点が挙げられる.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
43 ソースコード:\ref{code:Command}は書き込み, 送信を行う際の命令をクラスとして作成したものである.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
44 このクラスのインスタンスを命令オブジェクトとして送信し合う.
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
45 実際にChristieで命令オブジェクトの送受信を実装した解説は第四章にて行う.
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
46
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
47 \lstinputlisting[caption=Commandパターンで実装した命令クラス, label=code:Command]{./src/Command.java}
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
48
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
49
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
50 \section{命令オブジェクトを実装する際に起きた問題}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
51 インスタンス化した命令を他ノードに送信する際にエラーが発生し, 送信に失敗してしまうという問題が発生した.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
52 クラスの送信の際のシリアライズはmsgpackクラスを利用している.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
53 msgpackクラスは,シリアライズしたいクラスにMessage アノテーションをつけることにより, シリアライズ化を行う.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
54 原因を調査した結果, 以下の原因が見つかった.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
55
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 \begin{itemize}
16
7293b6481e32 add slide & tweak
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
57 \item Christieのjavaバージョンは11を使用しているが, msgpackバージョン0.6.12はjava11に対して非推奨となっていた.
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
58 \item msgpackの最新版0.8.20はシリアライズ機能が含まれなくなった.
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 \end{itemize}
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 以上の原因に対処するために以下のことを行った.
4
c1732eac57f6 add some section
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
62
9
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 シリアライズする命令クラスに対し, フィールドをpublic にした.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
65 \item javassistのバージョンを最新版へ変更した.
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
66 \end{itemize}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
16
7293b6481e32 add slide & tweak
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
68 これらの処置により問題なくCommandパターンでの命令実装を行うことができた.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
69 javaのバージョンに左右されずリモートエディタを実装するには, シリアライズの機能について他のパッケージを使うか, 自身で作成する必要が生まれた。
4
c1732eac57f6 add some section
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
70
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
71 \newpage
4
c1732eac57f6 add some section
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
72
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
73 \section{編集位置の相違}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
74 セッション中のエディタ間の通信で生じうる, 編集結果の相違について説明する.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
75 エディタ同士のコマンドの送信はそれぞれが独立して行うため, 編集対象の領域にエディタ間で相違が生じる場合がある.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
76
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
77 例としてエディタが一対一の接続となっている時に発生しうる相違を図\ref{fig:difference} を使用して解説する.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
78 編集対象は各オフセット番号に同じ値の数字が入っているものとする.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
79 EditorA ではオフセット番号 3 の 3 という 要素を削除 (テキストエディタ上のため削除されたオフセットにはその後ろの要素が繰り上げられる.), EditorB では オフセット番号 2 に A という要素を挿入するという編集をしたとする.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
80
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
81 この編集を共通プロトコルとして互いに送信しあった際, 本来編集する予定だったオフセットの中身が異なってしまい編集結果に違いが生じてしまう.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
82 これらの問題を解決することのできるエディタ同士の通信手法を作成しなければならない.
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 \begin{figure}[H]
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 \centering
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 \fbox{
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
87 \includegraphics[scale=0.6]{./images/difference_offset.pdf}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 }
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
89 \caption{通信のすれ違いによる編集位置の相違}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
90 \label{fig:difference}
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 \end{figure}
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
93 \section{編集位置の相違解消方法}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
94 編集するオフセットに相違が発生する条件として, サーバーとノードがお互いにコマンドを送り合った際, その命令コマンドが相手に到着する前に相手が自身のバッファに変更を加えてしまった場合に起きる.
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
95 したがって, 相違の解消に必要なことは
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
96
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
97 \begin{itemize}
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
98 \item サーバーとノード間のコマンド送信のすれ違いが発生したということを検知する方法
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
99 \item すれ違いが発生した際に編集したオフセットのズレを修正する方法
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
100 \end{itemize}
10
5ddb3e41e515 remove .DS_Store
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
101
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
102 が挙げられる.
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
104 そこで, すれ違いが発生したか否かを検知するために、ノード同士が送信し合うコマンドにそれぞれ番号を割り振る方法を考案した.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
105 図\ref{fig:Fix}を用いて解説する.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
106
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
107 以下の図はコマンド番号を実装し, すれ違いを検知する際の動作の想定図である.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
108 また, 本説明のコマンドは文字列の書き込み命令であり, バッファの指定されたオフセットにinsertされるため, それ以降のオフセット内の文字列は, 一つずつ後方オフセットへ移動する.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
109
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
110 命令コマンドはクラスのインスタンスを用いて作られており, 中には1オフセット分(文字数分)の文字列, 入力するオフセット, コマンド番号, コマンドを発行したノード名が記録されている.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
111
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
112 二つのノードserver とnode は同じファイルのバッファを開いており, そのバッファには何も記述されていないとする.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
113 また, serverが送信するコマンドは他のノードから送られてきたコマンドであるとする.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
114 加えて各サーバー, ノードは実行したコマンドをスタック領域に保持しておいている.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
115
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
116 コマンドとコマンド番号について以下の特性が存在する.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
117 \begin{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
118 \item 各ノードは最後に実行した数値を変数(図ではserverがcNum, nodeがnodeCNum) に保持している.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
119 \item いずれかのノードがコマンドを発行したら, そのコマンドのコマンド番号は前に実行したコマンドの番号+1となる. そしてそれは送信されてきたコマンドか自分が発行したコマンドであるかは問わない.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
120 \item 送信されてきたコマンドのコマンド番号が自身が保持しているコマンド番号+1でなければ、自身が先に発進したコマンドとすれ違いが発生していることが判明できる. (保持コマンド番号より同値以下の場合)
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
121 \end{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
122
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
123 \newpage
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
124
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
125 つまり, 送信されたコマンドNo.102を実行したらそれぞれのノードは実行済みコマンド番号を102へ書き換えなければならない.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
126 そして続いて自らがバッファに変更を加えたとき, その変更をコマンドNo103として作成し, 送信と実行済みコマンド番号を103に書き換える処理が必要となる.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
127
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
128 以上の処理でコマンド送信のすれ違いを検知する.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
129
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
130 \begin{figure}[H]
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
131 \centering
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
132 \fbox{
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
133 \includegraphics[scale=0.85]{./fig/FixCommand.pdf}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
134 }
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
135 \caption{コマンド番号を利用した相違の解消}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
136 \label{fig:Fix}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
137 \end{figure}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
138
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
139 \newpage
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
140
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
141 コマンドのすれ違いを検知した際の処理は以下のように行う.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
142 \begin{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
143 \item 前提としてノードよりサーバーの整合性を維持したいため優先度は常にサーバーが高い.例えば同じオフセットにそれぞれのノードが別の文字列に変更した場合, サーバーノード共にサーバー側が発進したコマンドの文字列が書き込まれる.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
144 \item すれ違いが発生したら, 各ノードはコマンドを記録しているスタックを参照し, 受け取ったコマンドのオフセットのズレを集計しそのコマンドを修正する.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
145 \end{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
146
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
147 図上ではserverからのinsert B for offset:2 とnodeからのinsert Z for offset:2の命令がすれ違いを起こしている.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
148 この場合, serverのバッファ状態が優先されるため, server側がnodeからの命令のoffset位置を調整してやらなければならない.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
149 この処理はserverと全ての接続しているノード間で独立して行われる.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
150
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
151 コマンドのオフセットの修正は
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
152 \begin{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
153 \item 受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき, 受診したコマンドのオフセットに+1する.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
154 \item 受け取ったコマンドのオフセット < 受信コマンドとすれ違ったコマンドのオフセット のとき, 受診したコマンドのオフセットを変えずにそのまま実行できる.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
155 \item 受け取ったコマンドのオフセット = 受信コマンドとすれ違ったコマンドのオフセット のとき, サーバー側の文字列が優先される.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
156 \end{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
157 と言った方法で行うことができる.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
158 これを削除, 文字列の置き換えにもそれぞれ対応する方法を作ることによりズレの修正を行う.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
159
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
160 上記の修正方法のテストコードを試みた.
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
161 構成としては現時点では問題が見られていないが, 実装した際に初めて判明する通信速度や複数の独立した処理による影響も対処しなければならない可能性がある.
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
162
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
163 また, これからの実装を考えると
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
164 \begin{itemize}
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
165 \item 既存のエディタ(emacsやvim)のバッファ処理はオフセット単位で行われていない.
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
166 \item コマンドを保持し続けるとメモリ容量に無駄が発生する.
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
167 \item コマンドのput(送信)失敗についての想定ができていない.
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
168 \end{itemize}
15
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
169 といった点を修正する必要がある.
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
170
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
171
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
172
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
173
c7ab31269230 update some file
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
174
11
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
175
b8149a449b7d forget .DS_Store & add thankc & others
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
176
2
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
97d58fdc8185 add copies final_main
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 %%文書終了****************************
9
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
180 \end{document}