Mercurial > hg > Papers > 2020 > itsuki-thesis
changeset 8:f71206f427e3
add text and some file
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Feb 2020 17:44:52 +0900 |
parents | 59f9d2488005 |
children | a37b7bd13be9 |
files | final_main/.DS_Store final_main/chapter2/chapter2.tex final_main/chapter3/chapter3.tex final_main/chapter4/chapter4.tex final_main/fig/FixCommand.graffle final_main/fig/FixCommand.pdf final_main/images/Star-Topology.pdf final_main/images/difference_offset.pdf final_main/main.pdf final_main/src/FinishHelloWorld.java final_main/src/StartPrefixTree.java final_main/src/StartRemotingTextEditor.java |
diffstat | 12 files changed, 113 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/final_main/chapter2/chapter2.tex Mon Feb 10 17:38:22 2020 +0900 +++ b/final_main/chapter2/chapter2.tex Tue Feb 11 17:44:52 2020 +0900 @@ -28,11 +28,14 @@ \end{description} \section{プログラムの例} -以下のソースコード\ref{code:nStartHelloWorld} , \ref{code:HelloWorldCodeGear}のプログラムはChrisitieの基本動作となる DGM による put 操作を用いた hello world の出力プログラムである. メソッド setCGM でポート番号を指定した上で CGM を作成しする. HelloWorldCodeGear() クラスには String型の"helloWorld" という key が用意され, "helloWorld"に入力された DG をprint するコードである. "helloWorld" に hello と worldというDGをputすることで出力結果がhello world となる. CGM が起動していると処理が終了しないため, FinishHelloWorld には DG が揃い次第 cgm.getLocalDGM().finish(); というメソッドを実行させcgmを終了させる処理が書かれている。 +以下のソースコード\ref{code:nStartHelloWorld} , \ref{code:HelloWorldCodeGear}のプログラムはChrisitieの基本動作となる DGM による put 操作を用いた hello world の出力プログラムである. メソッド sreateCGM でポート番号を指定した上で CGM を作成しする. CGM にCG (クラスファイル)を指定した上でsetupすることでCGMが CGを動作させることができる. HelloWorldCodeGear()とFinishHelloWorld()がここではCGに当たる. HelloWorldCodeGear() クラスには String型の"helloWorld" という key が用意され, "helloWorld"に入力された DG(String型の変数データ) をprint するコードである. "helloWorld" に hello と worldというDGをputすることで出力結果がhello world となる. \lstinputlisting[caption=StartHelloWorld,label=code:nStartHelloWorld]{./src/HelloWorld/StartHelloWorld.java} \lstinputlisting[caption=HelloWorldCodeGear,label=code:HelloWorldCodeGear]{./src/HelloWorld/HelloWorldCodeGear.java} +CGM は起動し続けていると処理が自動的に終了しないという問題点がある. そこで役目がなくなったCGM を終了させるための処理を行わなければならない. CGMを終了させるためのプログラムはソースコード\ref{code:FinishHelloWorld} であり, 二つのkeyが揃ったらcgm.getLocalDGM().finish() の処理でcgmを終了させるよう記述されている. + +\lstinputlisting[caption=FinishHelloWorld, label=code:FinishHelloWorld]{./src/FinishHelloWorld.java}
--- a/final_main/chapter3/chapter3.tex Mon Feb 10 17:38:22 2020 +0900 +++ b/final_main/chapter3/chapter3.tex Tue Feb 11 17:44:52 2020 +0900 @@ -7,9 +7,11 @@ リモートエディタとは他のマシン上に存在するファイルのバッファを別デバイスから開いて編集, 保存することができる機能である. 加えてこのリモートエディタを複数人が同時に同じファイルを編集し, その上変更がリアルタイムに反映されるように設計する. この章ではリモートエディタの実装の上で踏んだプロセスや, 開発の上で問題となる点と解決策について説明する。 + + \section{編集位置の相違} セッション中のエディタ間の通信で生じうる, 編集結果の相違について説明する. エディタ同士のコマンドの送信はそれぞれが独立して行うため, 編集対象の領域にエディタ間で相違が生じる場合がある. 例としてエディタが一対一の接続となっている時に発生しうる相違を図\ref{fig:difference} を使用して解説する. - 編集対象は各オフセット番号に同じ値の数字が入っているものとする. EditorA ではオフセット番号 3 の 3 という 要素を削除 (テキストエディタ上のため削除されたオフセットにはその後ろの要素が繰り上げられる.), EditorB では オフセット番号 2 に A という要素を挿入するという編集をしたとする. この編集を共通プロトコルとして互いに送信しあった際, 本来編集する予定だったオフセットの中身が食い違ってしまい最終的に異なった内容となってしまう. これらの問題を解決することのできるエディタ同士の通信アルゴリズムを作成しなければならない。 + 編集対象は各オフセット番号に同じ値の数字が入っているものとする. EditorA ではオフセット番号 3 の 3 という 要素を削除 (テキストエディタ上のため削除されたオフセットにはその後ろの要素が繰り上げられる.), EditorB では オフセット番号 2 に A という要素を挿入するという編集をしたとする. この編集を共通プロトコルとして互いに送信しあった際, 本来編集する予定だったオフセットの中身が異なってしまい編集結果に違いが生じてしまう. これらの問題を解決することのできるエディタ同士の通信手法を作成しなければならない。 \begin{figure}[H] \centering @@ -21,6 +23,14 @@ \end{figure} \section{編集位置の相違解消方法} +編集するオフセットに相違が発生する条件として, サーバーとノードがお互いにコマンドを送り合った際, その命令コマンドが相手に到着する前に相手が自身のバッファに変更を加えてしまった場合に起きる. したがって, 相違の解消に必要なことは +\begin{itemize} +\item サーバーとノード間のコマンド送信のすれ違いが発生したということを検知する方法 +\item すれ違いが発生した際に編集したオフセットのズレを修正する方法 +\end{itemize} +が挙げられる. + + \section{document listenerによる編集オフセット番号の読み取り}
--- a/final_main/chapter4/chapter4.tex Mon Feb 10 17:38:22 2020 +0900 +++ b/final_main/chapter4/chapter4.tex Tue Feb 11 17:44:52 2020 +0900 @@ -18,7 +18,18 @@ \item 新しいノードが参加した, もしくはノードの再接続の際にはサーバーのファイル状況を参照するのみで参加, 復帰ができる. \end{itemize} と言ったことが挙げられる. - +TopologyManagerの接続相手にラベルをつける機能により, サーバーでは各nodeすべてをまとめて一つの名前で処理をすることができる. 反対に各ノードもラベルを利用することで, CG内に大きな工夫をつけることなくサーバーとの通信を行うことができる. \\ +懸念点として +\begin{itemize} +\item 通信がノードのみに集中するため, それを原因に遅延が発生する可能性がある. +\item サーバーと他ノードとの一対複数という通信形式から発生する, 予期せぬ編集誤差の危険性. +\end{itemize} +と言った点が挙げられる. これらの発生を防ぐため, +\begin{itemize} +\item 送信するデータ量や頻度を減らす工夫などを凝らし, 通信の負荷がなるべく少ない設計を構築する. +\item サーバーを中心とした整合性維持のための設計をする. +\end{itemize} +と言った対策が考えられる. \begin{figure}[H] \centering
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/FinishHelloWorld.java Tue Feb 11 17:44:52 2020 +0900 @@ -0,0 +1,15 @@ +package christie.example.HelloWorld; + +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class FinishHelloWorld extends CodeGear { + @Take String hello; + @Take String world; + + @Override + protected void run(CodeGearManager cgm) { + cgm.getLocalDGM().finish(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/StartPrefixTree.java Tue Feb 11 17:44:52 2020 +0900 @@ -0,0 +1,38 @@ +package christie.example.PrefixTree; + +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; +import christie.topology.manager.StartTopologyManager; +import christie.topology.manager.TopologyManagerConfig; +import christie.topology.node.StartTopologyNode; +import christie.topology.node.TopologyNodeConfig; + +public class StartPrefixTree extends StartCodeGear { + + + public StartPrefixTree(CodeGearManager cgm) { + super(cgm); + } + + public static void main(String[] args) { + int topologyManagerPort = 10000; + int topologyNodePort = 10001; + int nodeNum = 8; + String[] managerArg = {"--localPort", String.valueOf(topologyManagerPort), "--Topology", "tree"}; + TopologyManagerConfig topologyManagerConfig = new TopologyManagerConfig(managerArg); + new StartTopologyManager(topologyManagerConfig); + + for (int i = 0; i < nodeNum ; i++){ + String[] nodeArg = { + "--managerPort", String.valueOf(topologyManagerPort), + "--managerHost", "localhost", + "--localPort", String.valueOf(topologyNodePort + i), + "--totalNodeNum", String.valueOf(nodeNum), + "--i", String.valueOf(i)}; + + PrefixNode.main(nodeArg); + + + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/StartRemotingTextEditor.java Tue Feb 11 17:44:52 2020 +0900 @@ -0,0 +1,33 @@ +package christie.remoteTextEditor; + +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; +import christie.topology.manager.StartTopologyManager; +import christie.topology.manager.TopologyManagerConfig; + +public class StartRemotingTextEditor extends StartCodeGear { + + public StartRemotingTextEditor(CodeGearManager cgm) { + super(cgm); + } + + public static void main(String[] args){ + int TopologyManagerPort = 10000; + int TopologyNodePort = 10001; + + String[] managerArg = {"--localPort", String.valueOf(TopologyManagerPort), "--confFile", "scripts/Log/star.dot"}; + + TopologyManagerConfig topologyManagerConfig = new TopologyManagerConfig(managerArg); + new StartTopologyManager(topologyManagerConfig); + + + for (int i = 0; i <= 1; i++){ + String[] nodeArg = {"--managerPort", String.valueOf(TopologyManagerPort), + "--managerHost", "localhost", + "--localPort", String.valueOf(TopologyNodePort + i), + }; + + RemoteNodeStart.main(nodeArg); + } + } +}