# HG changeset patch # User ichikitakahiro # Date 1581843268 -32400 # Node ID 55e745a21506aa92faad202bdeff88bca1b72b4e # Parent 7293b6481e328735c28bbbb94db99684dfd34e84 add abstruct & slide diff -r 7293b6481e32 -r 55e745a21506 final_pre/final_pre.aux --- a/final_pre/final_pre.aux Sat Feb 15 21:22:43 2020 +0900 +++ b/final_pre/final_pre.aux Sun Feb 16 17:54:28 2020 +0900 @@ -4,15 +4,15 @@ \@writefile{toc}{\contentsline {section}{\numberline {3}コマンドパターンでの実装}{1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}msgpackの対応修正}{1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {5}編集位置の相違とその解消}{1}\protected@file@percent } -\citation{*} -\bibstyle{junsrt} -\bibdata{reference} -\bibcite{dfs}{1} \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces コマンド番号による編集相違の解消}}{2}\protected@file@percent } \newlabel{fig:Fix}{{1}{2}} \@writefile{toc}{\contentsline {section}{\numberline {6}スター型ネットワーク}{2}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {7}分散フレームワークChristie}{2}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {8}今後の課題}{2}\protected@file@percent } +\citation{*} +\bibstyle{junsrt} +\bibdata{reference} +\bibcite{dfs}{1} \bibcite{cbc}{2} \bibcite{christie}{3} \bibcite{rep}{4} diff -r 7293b6481e32 -r 55e745a21506 final_pre/final_pre.dvi Binary file final_pre/final_pre.dvi has changed diff -r 7293b6481e32 -r 55e745a21506 final_pre/final_pre.log --- a/final_pre/final_pre.log Sat Feb 15 21:22:43 2020 +0900 +++ b/final_pre/final_pre.log Sun Feb 16 17:54:28 2020 +0900 @@ -1,4 +1,4 @@ -This is e-pTeX, Version 3.14159265-p3.8.2-190131-2.6 (utf8.euc) (TeX Live 2019) (preloaded format=platex 2019.10.15) 15 FEB 2020 21:22 +This is e-pTeX, Version 3.14159265-p3.8.2-190131-2.6 (utf8.euc) (TeX Live 2019) (preloaded format=platex 2019.10.15) 16 FEB 2020 17:42 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -188,22 +188,26 @@ LaTeX Font Info: ... okay on input line 48. \c@lstlisting=\count124 LaTeX Font Info: External font `cmex10' loaded for size -(Font) <12> on input line 53. +(Font) <12> on input line 62. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <8> on input line 53. +(Font) <8> on input line 62. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <6> on input line 53. +(Font) <6> on input line 62. +LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <9> not available +(Font) Font shape `JT1/gt/m/n' tried instead on input line 62. +LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <9> not available +(Font) Font shape `JY1/gt/m/n' tried instead on input line 62. LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 56. +(Font) Font shape `JT1/gt/m/n' tried instead on input line 66. LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 56. -LaTeX Font Info: Trying to load font information for OMS+cmr on input line 8 +(Font) Font shape `JY1/gt/m/n' tried instead on input line 66. +LaTeX Font Info: Trying to load font information for OMS+cmr on input line 9 0. (/usr/local/texlive/2019/texmf-dist/tex/latex/base/omscmr.fd File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available -(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 80. +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 90. File: pic/emblem-bitmap.pdf Graphic file (type pdf) @@ -224,7 +228,7 @@ ] File: fig/FIxCommand.pdf Graphic file (type pdf) - (./final_pre.bbl [2] + [2] (./final_pre.bbl LaTeX Font Warning: Font shape `JT1/gt/m/it' undefined (Font) using `JT1/gt/m/n' instead on input line 11. @@ -241,12 +245,12 @@ ) Here is how much of TeX's memory you used: - 2534 strings out of 492763 - 33914 string characters out of 6140193 + 2549 strings out of 492763 + 34062 string characters out of 6140193 308912 words of memory out of 5000000 - 6977 multiletter control sequences out of 15000+600000 - 13434 words of font info for 52 fonts, out of 8000000 for 9000 + 6986 multiletter control sequences out of 15000+600000 + 14967 words of font info for 58 fonts, out of 8000000 for 9000 929 hyphenation exceptions out of 8191 - 28i,15n,51p,285b,433s stack positions out of 5000i,500n,10000p,200000b,80000s + 28i,15n,51p,285b,371s stack positions out of 5000i,500n,10000p,200000b,80000s -Output written on final_pre.dvi (3 pages, 15764 bytes). +Output written on final_pre.dvi (3 pages, 16580 bytes). diff -r 7293b6481e32 -r 55e745a21506 final_pre/final_pre.pdf Binary file final_pre/final_pre.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 final_pre/final_pre.tex --- a/final_pre/final_pre.tex Sat Feb 15 21:22:43 2020 +0900 +++ b/final_pre/final_pre.tex Sun Feb 16 17:54:28 2020 +0900 @@ -50,7 +50,17 @@ \author{165713F 一木貴裕 {}{} 指導教員 : 河野真治} \date{} +\twocolumn [ \maketitle +\begin{onecolabstract} +There are many different types of editors used to edit programming. +Therefore, the editors that people are used to are almost different +There is problem with pair programming is that users must match each other's editing environment. +So we will develop a remote editor application that allows users to edit on multiple machines simultaneously, regardless of the type of editor. +This research uses Christie, a distributed framework developed in our laboratory. +It can be expected that Christie's Gear programming concept is suitable for making remote editors. +\end{onecolabstract}] + \thispagestyle{fancy} \section{複数人によるファイルの同時編集} diff -r 7293b6481e32 -r 55e745a21506 slide/images/Editor.png Binary file slide/images/Editor.png has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/FixCommand.pdf Binary file slide/images/FixCommand.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/RemoteEditor.pdf Binary file slide/images/RemoteEditor.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/Star-Topology.pdf Binary file slide/images/Star-Topology.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/difference_offset.pdf Binary file slide/images/difference_offset.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/remote_datasegment.pdf Binary file slide/images/remote_datasegment.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/ring.pdf Binary file slide/images/ring.pdf has changed diff -r 7293b6481e32 -r 55e745a21506 slide/images/名称未設定.graffle Binary file slide/images/名称未設定.graffle has changed diff -r 7293b6481e32 -r 55e745a21506 slide/thesis.html --- a/slide/thesis.html Sat Feb 15 21:22:43 2020 +0900 +++ b/slide/thesis.html Sun Feb 16 17:54:28 2020 +0900 @@ -94,13 +94,175 @@

研究目的, 背景

  • ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。
  • -
  • 既存のリモートエディタアプリケーションとしてVisual Stdio Codeがあげられる。 +
  • 既存のリモートエディタアプリケーションとしてVisual Stdio Codeのlive share機能があげられる。
  • +
  • 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。
  • +
  • 本研究室で開発している分散フレームワークChristieはGearという概念の性質上リモートエディタと相性が良い。
  • +
+ + + + + + + +
+ +

リモートエディタの概要説明

+
    +
  • 本研究で作成するリモートエディタはChristieの機能を用いて通信環境を構成する。
  • +
  • 同期編集セッションに接続したユーザーは自身のマシン上でエディタを使って編集対象ファイルを開く。
      -
    • しかし、セッションに参加する全員がVSCodeの環境を持っていなければならず、不便である。
    • +
    • ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&実行させる。
    • +
    +
  • +
  • 命令コマンドはサーバーへ集められ、サーバーは受け取ったコマンドを他の接続ノードへ送信し、実行させる。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

テスト用テキストエディタ

+
    +
  • 通信の構成を行うChristieはjava言語で作成されているため、javaのswingを用いてテキストエディタを制作した。
  • +
  • エディタ部分の入力、削除の取得はDocument Listenerクラスを使った。 +
      +
    • insertUpdate、removeUpdateメソッドがそれぞれ挿入、削除を検知した時に動作する。
  • -
  • 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。
  • -
  • 本研究室で開発している分散フレームワークChristieを使い、簡潔な実装を目指す。
  • +
  • このエディタはファイルの内容をオフセット番号で取り扱っている。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

DocumentListenerの記述部分

+ +
public class MyDocumentListener implements DocumentListener {
+    @Override
+    public void insertUpdate(DocumentEvent e) {
+        Document doc = e.getDocument();
+        loc = e.getOffset();
+        System.out.println(loc);
+
+    }
+
+    @Override
+    public void removeUpdate(DocumentEvent e) {
+        Document doc = e.getDocument();
+        sendLoc = e.getOffset();
+        System.out.println("delete " + sendLoc);
+    }
+    @Override
+    public void changedUpdate(DocumentEvent e) {
+    }
+}
+
+ + + +
+ +
+ +

コマンドパターンの解説

+
    +
  • リモートエディタの通信では、各ノード(参加ユーザのエディタ)がそれぞれ自身のファイルの変更内容を他のノードに送信する。
  • +
  • コマンドパターンとは命令を一つのオブジェクトとして表現するプログラム手法である。
  • +
  • 命令を表すクラスを作成し、インスタンスを作成と同時に命令の中身を入力することで命令を作成する。 +
      +
    • リモートエディタにおいては「オフセットn番目に に 文字列 “A”を入力した」という変更を命令にして送信する。
    • +
    +
  • +
  • コマンドパターンの利点として、 +
      +
    • ChristieのGearの概念と相性がいい。
    • +
    • 命令に必要な内容をまとめて送信するため、時間差による相違の発生が防げる。
    • +
    • オブジェクトとして取り扱えるため管理が行いやすい。
    • +
    +
  • +
+ +
  package christie.example.RemoteTake;
+  import org.msgpack.annotation.Message;
+
+  @Message
+  class RTCommand {
+      public String line;
+      public String cmd;
+      public int offset;
+
+      public RTCommand () {}
+
+      public RTCommand(String cmd, String line, int i) {
+          this.cmd = cmd;
+          this.line = line;
+          this.offset = i;
+      }
+
+      @Override
+      public String toString() {
+          return "RTCommand{" +
+                  "line='" + line + '\'' +
+                  ", cmd='" + cmd + '\'' +
+                  ", offset=" + offset +
+                  '}';
+      }
+  }
+
+ + + +
+ +
+ +

コマンドパターン実装の際に起こった問題

+
    +
  • クラスを他ノードに送信するためには、クラスをシリアライズして送信する必要がある。 +
      +
    • コマンドの送信にはmsgpackクラスとjavassistを利用している。
    • +
    +
  • +
  • しかし、送信がうまく行えなかったため、原因を調査した。 +
      +
    • javaのバージョン進行のため、msgpackバージョン0.6.12が非対称となっていた。
    • +
    • msgpackの最新バージョン0.8.20はシリアライズ機能が含まれなくなった。
    • +
    +
  • +
  • 以上の原因に対処するため +
      +
    • javassistのバージョンを最新版へ変更した。
    • +
    • シリアライズする命令クラスに対し、クラスをpublicに変更した。
    • +
    +
  • +
  • 以上の対処によりコマンドパターンでの命令実装を行うことができた。
  • +
  • 自身でシリアライズ機能をChristieに内蔵してしまえば、これらのパッケージは不要になる。
@@ -109,18 +271,72 @@
-

発表の流れ

+

編集位置の相違

+
    +
  • 同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。
  • +
  • EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

編集の相違の解消

    -
  • リモートエディタの機能と開発手順の解説
  • -
  • スター型接続によるネットワーク通信
  • -
  • Christieの解説 +
  • 同期編集のセッションはスター型の通信接続で行うため、サーバー対複数ノードの通信間で相違が発生する。
  • +
  • 編集の相違を防ぐためには二つの処理を行う必要がある。
      -
    • Gearの概念
    • -
    • アノテーション
    • -
    • TopologyManager
    • +
    • サーバーとノード間の命令のすれ違いが発生したことを検知する。
    • +
    • すれ違いが発生した際に、オフセットのズレを修正する。
    • +
    +
  • +
  • サーバーが正しいファイルの状態を保持するためサーバーの状態にノードが合わせる必要がある。
  • +
+ + + +
+ +
+ +

命令コマンドに番号をつけ相違を解消する

+
    +
  • 命令コマンド番号には以下の特性がある。 +
      +
    • 全てのノード(サーバーを含める)は事前に処理した命令コマンドの番号を記憶している。
    • +
    • 新しく作られた命令コマンドは作られたノードの命令実行済み番号+1 を自身の命令コマンド番号とする。
    • +
    • ノードは自身が作成したか、他のノードに送られてきたかに関わらず命令コマンドを実行したら命令実行済み番号をその命令コマンドの番号と同じにする。
  • -
  • 今後の課題とまとめ
  • +
  • もしノードが送られてきた命令コマンドを見て、そのコマンドが自身の実行済み番号と同値以下の場合、送信元のノードとの命令のすれ違いが発生していることが分かる。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

すれ違いが発生した際の処理

+
    +
  • 全てのノードは自分が実行した命令コマンドを記録しており、後からオフセットや文字列を取り出すことができる。
  • +
  • すれ違いが発生した時点からの命令の中身を集計、参照しすれ違いで送られてきたコマンドを修正する。
  • +
  • insertを例とすると +
      +
    • 受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。
    • +
    • 受け取ったコマンドのオフセット <= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。
    • +
    +
@@ -129,6 +345,29 @@
+

スター型通信

+
    +
  • Christieにはノードの通信接続を行うTopologyManagerという機能がある。
  • +
  • 同期通信はスター型での接続を行う。
  • +
  • スター型通信の利点は +
      +
    • サーバーが正しいファイル状態を保持するため、整合性を保つことができる。
    • +
    • どこかのノードが切断されても、要害の範囲をそのノードのみに抑えることができる。
    • +
    • 新しいノードが参加した、もしくは復帰の際にはサーバーのファイル状況を参照するのみで参加、復帰ができる。
    • +
    +
  • +
+ +
+ MetaGear +
+ + + +
+ +
+

Christie

  • Christieは当研究室で開発している、信頼性を重視した分散フレームワークである.
  • @@ -154,15 +393,19 @@
    • DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。
    + +
+ + - +

Christieのコード例

-
package christie.example.HelloWorld;
+
package christie.example.HelloWorld;
 
 import christie.codegear.CodeGearManager;
 import christie.codegear.StartCodeGear;
@@ -171,27 +414,25 @@
 
     public StartHelloWorld(CodeGearManager cgm) {
         super(cgm);
-    }
+        }
 
     public static void main(String[] args){
-        CodeGearManager cgm = createCGM(10000); #ポート番号を指定してCGMを立ち上げ。
-        cgm.setup(new HelloWorldCodeGear()); #立ち上げたCGMへCGを待ちあわせる。
-        cgm.getLocalDGM().put("helloWorld","hello"); #keyname "helloWorld"に文字列helloをput
+        CodeGearManager cgm = createCGM(10000);
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.setup(new FinishHelloWorld());
+        cgm.getLocalDGM().put("helloWorld","hello");
         cgm.getLocalDGM().put("helloWorld","world");
     }
 }
+
-
-
ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000
+
ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000
 hello world
 
- - - - - + -

DGM

-
    -
  • DGMは分散システムの肝となる他のノード間とのデータのやり取りの際に重要となる。
  • -
  • DGMにはLocalDGMとRemoteDGMが存在する。 -
      -
    • LocalDGM -
        -
      • LocalなDGMのプールのkeyにデータの書き込みを行う。
      • -
      -
    • -
    • RemoteDGM -
        -
      • Localに存在する、他のノードのLocalDGMに対応するプールのkeyにデータを書き込みする。接続しているノードの数だけ存在する。
      • -
      -
    • -
    -
  • -
  • DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMへ、 Remoteの場合は接続したRemote先のCGMのDGMにDGを格納する.
  • -
- -
- MetaGear -
+!--> -

Annottation

-
    -
  • ChristieではInputDGの指定にはアノテーションを使う。
  • -
  • アノテーションとはクラスやメソッド、パッケージに対して、付加情報を記述できるJavaのMeta Computationである。
  • -
  • 先頭に@をつけることで記述する。オリジナルのアノテーションを定義することもでき、Input -される型の変数を直接宣言し、変数名としてkeyを記述する。その上にアノテーションでTakeもしくはPeekを指定する。
  • -
- -
package christie.example.HelloWorld;
-
-import christie.annotation.Take;
-import christie.codegear.CodeGear;
-import christie.codegear.CodeGearManager;
-
-public class HelloWorldCodeGear extends CodeGear {
-    @Take
-    String helloWorld;
-
-    @Override
-    protected void run(CodeGearManager cgm) {
-        System.out.print(helloWorld + " ");
-        cgm.setup(new HelloWorldCodeGear());
-    }
-}
-
-
- - - -
- -
-

DGのアノテーション

  • DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには @@ -307,33 +496,46 @@
- +
package christie.example.HelloWorld;
 
-
+import christie.annotation.Peek; +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { -
- -

TopologyManager

-
    -
  • TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。
  • -
  • TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 -
      -
    • 動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。
    • -
    • 静的Toopologyはdotファイルを与えることノード関係の構築を行う。
    • -
    -
  • -
+ @Take + String helloWorld; -
digraph test {
-	node0 -> node1 [label="right"]
-	node1 -> node2 [label="right"]
-	node2 -> node0 [label="right"]
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.print(helloWorld + " ");
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.getLocalDGM().put(helloWorld,helloWorld);
+    }
 }
 
+ @@ -342,6 +544,26 @@

まとめとこれから

+
    +
  • 本研究発表ではリモートエディタの開発とそれに伴う技術について述べた。現時点で実装できた構成は以下である。 +
      +
    • リモートエディタの基本となる命令のやり取り部分のコマンドパターン実装。
    • +
    • 編集相違を防ぐためのアルゴリズムの発案と検証。
    • +
    +
  • +
  • 現時点では最低限のセッションを動かすまでの最低限の実装は終わっていない。これから取り組まなければならない課題として以下が挙げられる。 +
      +
    • スター型Topologyの接続を動的に行わせる。
    • +
    • 編集するファイルの共有方法 +
        +
      • ファイルをそのまま送信すると、負担が大きいと予想される。
      • +
      +
    • +
    • 既存のエディタを同期通信に対応させる。
    • +
    +
  • +
  • 以上の課題の課題に取り組み、これからも実装を続けていきたい。
  • +
diff -r 7293b6481e32 -r 55e745a21506 slide/thesis.md --- a/slide/thesis.md Sat Feb 15 21:22:43 2020 +0900 +++ b/slide/thesis.md Sun Feb 16 17:54:28 2020 +0900 @@ -6,21 +6,167 @@ ## 研究目的, 背景 - ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。 -- 既存のリモートエディタアプリケーションとしてVisual Stdio Codeがあげられる。 - - しかし、セッションに参加する全員がVSCodeの環境を持っていなければならず、不便である。 +- 既存のリモートエディタアプリケーションとしてVisual Stdio Codeのlive share機能があげられる。 - 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。 -- 本研究室で開発している分散フレームワークChristieを使い、簡潔な実装を目指す。 +- 本研究室で開発している分散フレームワークChristieはGearという概念の性質上リモートエディタと相性が良い。 - + +## リモートエディタの概要説明 +- 本研究で作成するリモートエディタはChristieの機能を用いて通信環境を構成する。 +- 同期編集セッションに接続したユーザーは自身のマシン上でエディタを使って編集対象ファイルを開く。 + - ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&実行させる。 +- 命令コマンドはサーバーへ集められ、サーバーは受け取ったコマンドを他の接続ノードへ送信し、実行させる。 + +
+ MetaGear +
+ + +## テスト用テキストエディタ +- 通信の構成を行うChristieはjava言語で作成されているため、javaのswingを用いてテキストエディタを制作した。 +- エディタ部分の入力、削除の取得はDocument Listenerクラスを使った。 + - insertUpdate、removeUpdateメソッドがそれぞれ挿入、削除を検知した時に動作する。 +- このエディタはファイルの内容をオフセット番号で取り扱っている。 + +
+ MetaGear +
+ +## DocumentListenerの記述部分 + +``` +public class MyDocumentListener implements DocumentListener { + @Override + public void insertUpdate(DocumentEvent e) { + Document doc = e.getDocument(); + loc = e.getOffset(); + System.out.println(loc); + + } + + @Override + public void removeUpdate(DocumentEvent e) { + Document doc = e.getDocument(); + sendLoc = e.getOffset(); + System.out.println("delete " + sendLoc); + } + @Override + public void changedUpdate(DocumentEvent e) { + } +} +``` + +## コマンドパターンの解説 +- リモートエディタの通信では、各ノード(参加ユーザのエディタ)がそれぞれ自身のファイルの変更内容を他のノードに送信する。 +- コマンドパターンとは命令を一つのオブジェクトとして表現するプログラム手法である。 +- 命令を表すクラスを作成し、インスタンスを作成と同時に命令の中身を入力することで命令を作成する。 + - リモートエディタにおいては「オフセットn番目に に 文字列 "A"を入力した」という変更を命令にして送信する。 +- コマンドパターンの利点として、 + - ChristieのGearの概念と相性がいい。 + - 命令に必要な内容をまとめて送信するため、時間差による相違の発生が防げる。 + - オブジェクトとして取り扱えるため管理が行いやすい。 + +``` + package christie.example.RemoteTake; + import org.msgpack.annotation.Message; + + @Message + class RTCommand { + public String line; + public String cmd; + public int offset; + + public RTCommand () {} + + public RTCommand(String cmd, String line, int i) { + this.cmd = cmd; + this.line = line; + this.offset = i; + } + + @Override + public String toString() { + return "RTCommand{" + + "line='" + line + '\'' + + ", cmd='" + cmd + '\'' + + ", offset=" + offset + + '}'; + } + } +``` + + +## コマンドパターン実装の際に起こった問題 +- クラスを他ノードに送信するためには、クラスをシリアライズして送信する必要がある。 + - コマンドの送信にはmsgpackクラスとjavassistを利用している。 +- しかし、送信がうまく行えなかったため、原因を調査した。 + - javaのバージョン進行のため、msgpackバージョン0.6.12が非対称となっていた。 + - msgpackの最新バージョン0.8.20はシリアライズ機能が含まれなくなった。 +- 以上の原因に対処するため + - javassistのバージョンを最新版へ変更した。 + - シリアライズする命令クラスに対し、クラスをpublicに変更した。 +- 以上の対処によりコマンドパターンでの命令実装を行うことができた。 +- 自身でシリアライズ機能をChristieに内蔵してしまえば、これらのパッケージは不要になる。 + +## 編集位置の相違 +- 同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。 +- EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。 + +
+ MetaGear +
+ +## 編集の相違の解消 +- 同期編集のセッションはスター型の通信接続で行うため、サーバー対複数ノードの通信間で相違が発生する。 +- 編集の相違を防ぐためには二つの処理を行う必要がある。 + - サーバーとノード間の命令のすれ違いが発生したことを検知する。 + - すれ違いが発生した際に、オフセットのズレを修正する。 +- サーバーが正しいファイルの状態を保持するためサーバーの状態にノードが合わせる必要がある。 + +## 命令コマンドに番号をつけ相違を解消する +- 命令コマンド番号には以下の特性がある。 + - 全てのノード(サーバーを含める)は事前に処理した命令コマンドの番号を記憶している。 + - 新しく作られた命令コマンドは作られたノードの命令実行済み番号+1 を自身の命令コマンド番号とする。 + - ノードは自身が作成したか、他のノードに送られてきたかに関わらず命令コマンドを実行したら命令実行済み番号をその命令コマンドの番号と同じにする。 +- もしノードが送られてきた命令コマンドを見て、そのコマンドが自身の実行済み番号と同値以下の場合、送信元のノードとの命令のすれ違いが発生していることが分かる。 + +
+ MetaGear +
+ +## すれ違いが発生した際の処理 +- 全てのノードは自分が実行した命令コマンドを記録しており、後からオフセットや文字列を取り出すことができる。 +- すれ違いが発生した時点からの命令の中身を集計、参照しすれ違いで送られてきたコマンドを修正する。 +- insertを例とすると + - 受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。 + - 受け取ったコマンドのオフセット <= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。 + + + +## スター型通信 +- Christieにはノードの通信接続を行うTopologyManagerという機能がある。 +- 同期通信はスター型での接続を行う。 +- スター型通信の利点は + - サーバーが正しいファイル状態を保持するため、整合性を保つことができる。 + - どこかのノードが切断されても、要害の範囲をそのノードのみに抑えることができる。 + - 新しいノードが参加した、もしくは復帰の際にはサーバーのファイル状況を参照するのみで参加、復帰ができる。 + +
+ MetaGear +
## Christie - Christieは当研究室で開発している、信頼性を重視した分散フレームワークである. @@ -36,35 +182,37 @@ - DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。 - ## Christieのコード例 - ```code - package christie.example.HelloWorld; +## Christieのコード例 +``` +package christie.example.HelloWorld; - import christie.codegear.CodeGearManager; - import christie.codegear.StartCodeGear; +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; - public class StartHelloWorld extends StartCodeGear { +public class StartHelloWorld extends StartCodeGear { - public StartHelloWorld(CodeGearManager cgm) { - super(cgm); + public StartHelloWorld(CodeGearManager cgm) { + super(cgm); } - public static void main(String[] args){ - CodeGearManager cgm = createCGM(10000); #ポート番号を指定してCGMを立ち上げ。 - cgm.setup(new HelloWorldCodeGear()); #立ち上げたCGMへCGを待ちあわせる。 - cgm.getLocalDGM().put("helloWorld","hello"); #keyname "helloWorld"に文字列helloをput - cgm.getLocalDGM().put("helloWorld","world"); - } + public static void main(String[] args){ + CodeGearManager cgm = createCGM(10000); + cgm.setup(new HelloWorldCodeGear()); + cgm.setup(new FinishHelloWorld()); + cgm.getLocalDGM().put("helloWorld","hello"); + cgm.getLocalDGM().put("helloWorld","world"); } +} +``` - ``` - ``` - ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000 - hello world - ``` - +``` +ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000 +hello world +``` + + + + + -## Annottation -- ChristieではInputDGの指定にはアノテーションを使う。 -- アノテーションとはクラスやメソッド、パッケージに対して、付加情報を記述できるJavaのMeta Computationである。 -- 先頭に@をつけることで記述する。オリジナルのアノテーションを定義することもでき、Input -される型の変数を直接宣言し、変数名としてkeyを記述する。その上にアノテーションでTakeもしくはPeekを指定する。 - -```cc -package christie.example.HelloWorld; - -import christie.annotation.Take; -import christie.codegear.CodeGear; -import christie.codegear.CodeGearManager; - -public class HelloWorldCodeGear extends CodeGear { - @Take - String helloWorld; - - @Override - protected void run(CodeGearManager cgm) { - System.out.print(helloWorld + " "); - cgm.setup(new HelloWorldCodeGear()); - } -} - -``` ## DGのアノテーション - DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには @@ -133,7 +255,29 @@ - PeekFrom - Remote DGM nameを指定することで、その接続先のDGM からPeek操作をおこえる。 +``` +package christie.example.HelloWorld; +import christie.annotation.Peek; +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { + + @Take + String helloWorld; + + @Override + protected void run(CodeGearManager cgm) { + System.out.print(helloWorld + " "); + cgm.setup(new HelloWorldCodeGear()); + cgm.getLocalDGM().put(helloWorld,helloWorld); + } +} +``` + + ## まとめとこれから +- 本研究発表ではリモートエディタの開発とそれに伴う技術について述べた。現時点で実装できた構成は以下である。 + - リモートエディタの基本となる命令のやり取り部分のコマンドパターン実装。 + - 編集相違を防ぐためのアルゴリズムの発案と検証。 +- 現時点では最低限のセッションを動かすまでの最低限の実装は終わっていない。これから取り組まなければならない課題として以下が挙げられる。 + - スター型Topologyの接続を動的に行わせる。 + - 編集するファイルの共有方法 + - ファイルをそのまま送信すると、負担が大きいと予想される。 + - 既存のエディタを同期通信に対応させる。 +- 以上の課題の課題に取り組み、これからも実装を続けていきたい。 diff -r 7293b6481e32 -r 55e745a21506 slide/thesis.pdf.html --- a/slide/thesis.pdf.html Sat Feb 15 21:22:43 2020 +0900 +++ b/slide/thesis.pdf.html Sun Feb 16 17:54:28 2020 +0900 @@ -78,13 +78,175 @@

研究目的, 背景

  • ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。
  • -
  • 既存のリモートエディタアプリケーションとしてVisual Stdio Codeがあげられる。 +
  • 既存のリモートエディタアプリケーションとしてVisual Stdio Codeのlive share機能があげられる。
  • +
  • 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。
  • +
  • 本研究室で開発している分散フレームワークChristieはGearという概念の性質上リモートエディタと相性が良い。
  • +
+ + + + + +
+ +
+ +

リモートエディタの概要説明

+
    +
  • 本研究で作成するリモートエディタはChristieの機能を用いて通信環境を構成する。
  • +
  • 同期編集セッションに接続したユーザーは自身のマシン上でエディタを使って編集対象ファイルを開く。
      -
    • しかし、セッションに参加する全員がVSCodeの環境を持っていなければならず、不便である。
    • +
    • ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&実行させる。
    • +
    +
  • +
  • 命令コマンドはサーバーへ集められ、サーバーは受け取ったコマンドを他の接続ノードへ送信し、実行させる。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

テスト用テキストエディタ

+
    +
  • 通信の構成を行うChristieはjava言語で作成されているため、javaのswingを用いてテキストエディタを制作した。
  • +
  • エディタ部分の入力、削除の取得はDocument Listenerクラスを使った。 +
      +
    • insertUpdate、removeUpdateメソッドがそれぞれ挿入、削除を検知した時に動作する。
  • -
  • 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。
  • -
  • 本研究室で開発している分散フレームワークChristieを使い、簡潔な実装を目指す。
  • +
  • このエディタはファイルの内容をオフセット番号で取り扱っている。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

DocumentListenerの記述部分

+ +
public class MyDocumentListener implements DocumentListener {
+    @Override
+    public void insertUpdate(DocumentEvent e) {
+        Document doc = e.getDocument();
+        loc = e.getOffset();
+        System.out.println(loc);
+
+    }
+
+    @Override
+    public void removeUpdate(DocumentEvent e) {
+        Document doc = e.getDocument();
+        sendLoc = e.getOffset();
+        System.out.println("delete " + sendLoc);
+    }
+    @Override
+    public void changedUpdate(DocumentEvent e) {
+    }
+}
+
+ + + +
+ +
+ +

コマンドパターンの解説

+
    +
  • リモートエディタの通信では、各ノード(参加ユーザのエディタ)がそれぞれ自身のファイルの変更内容を他のノードに送信する。
  • +
  • コマンドパターンとは命令を一つのオブジェクトとして表現するプログラム手法である。
  • +
  • 命令を表すクラスを作成し、インスタンスを作成と同時に命令の中身を入力することで命令を作成する。 +
      +
    • リモートエディタにおいては「オフセットn番目に に 文字列 “A”を入力した」という変更を命令にして送信する。
    • +
    +
  • +
  • コマンドパターンの利点として、 +
      +
    • ChristieのGearの概念と相性がいい。
    • +
    • 命令に必要な内容をまとめて送信するため、時間差による相違の発生が防げる。
    • +
    • オブジェクトとして取り扱えるため管理が行いやすい。
    • +
    +
  • +
+ +
  package christie.example.RemoteTake;
+  import org.msgpack.annotation.Message;
+
+  @Message
+  class RTCommand {
+      public String line;
+      public String cmd;
+      public int offset;
+
+      public RTCommand () {}
+
+      public RTCommand(String cmd, String line, int i) {
+          this.cmd = cmd;
+          this.line = line;
+          this.offset = i;
+      }
+
+      @Override
+      public String toString() {
+          return "RTCommand{" +
+                  "line='" + line + '\'' +
+                  ", cmd='" + cmd + '\'' +
+                  ", offset=" + offset +
+                  '}';
+      }
+  }
+
+ + + +
+ +
+ +

コマンドパターン実装の際に起こった問題

+
    +
  • クラスを他ノードに送信するためには、クラスをシリアライズして送信する必要がある。 +
      +
    • コマンドの送信にはmsgpackクラスとjavassistを利用している。
    • +
    +
  • +
  • しかし、送信がうまく行えなかったため、原因を調査した。 +
      +
    • javaのバージョン進行のため、msgpackバージョン0.6.12が非対称となっていた。
    • +
    • msgpackの最新バージョン0.8.20はシリアライズ機能が含まれなくなった。
    • +
    +
  • +
  • 以上の原因に対処するため +
      +
    • javassistのバージョンを最新版へ変更した。
    • +
    • シリアライズする命令クラスに対し、クラスをpublicに変更した。
    • +
    +
  • +
  • 以上の対処によりコマンドパターンでの命令実装を行うことができた。
  • +
  • 自身でシリアライズ機能をChristieに内蔵してしまえば、これらのパッケージは不要になる。
@@ -93,18 +255,72 @@
-

発表の流れ

+

編集位置の相違

+
    +
  • 同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。
  • +
  • EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

編集の相違の解消

    -
  • リモートエディタの機能と開発手順の解説
  • -
  • スター型接続によるネットワーク通信
  • -
  • Christieの解説 +
  • 同期編集のセッションはスター型の通信接続で行うため、サーバー対複数ノードの通信間で相違が発生する。
  • +
  • 編集の相違を防ぐためには二つの処理を行う必要がある。
      -
    • Gearの概念
    • -
    • アノテーション
    • -
    • TopologyManager
    • +
    • サーバーとノード間の命令のすれ違いが発生したことを検知する。
    • +
    • すれ違いが発生した際に、オフセットのズレを修正する。
    • +
    +
  • +
  • サーバーが正しいファイルの状態を保持するためサーバーの状態にノードが合わせる必要がある。
  • +
+ + + +
+ +
+ +

命令コマンドに番号をつけ相違を解消する

+
    +
  • 命令コマンド番号には以下の特性がある。 +
      +
    • 全てのノード(サーバーを含める)は事前に処理した命令コマンドの番号を記憶している。
    • +
    • 新しく作られた命令コマンドは作られたノードの命令実行済み番号+1 を自身の命令コマンド番号とする。
    • +
    • ノードは自身が作成したか、他のノードに送られてきたかに関わらず命令コマンドを実行したら命令実行済み番号をその命令コマンドの番号と同じにする。
  • -
  • 今後の課題とまとめ
  • +
  • もしノードが送られてきた命令コマンドを見て、そのコマンドが自身の実行済み番号と同値以下の場合、送信元のノードとの命令のすれ違いが発生していることが分かる。
  • +
+ +
+ MetaGear +
+ + + +
+ +
+ +

すれ違いが発生した際の処理

+
    +
  • 全てのノードは自分が実行した命令コマンドを記録しており、後からオフセットや文字列を取り出すことができる。
  • +
  • すれ違いが発生した時点からの命令の中身を集計、参照しすれ違いで送られてきたコマンドを修正する。
  • +
  • insertを例とすると +
      +
    • 受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。
    • +
    • 受け取ったコマンドのオフセット <= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。
    • +
    +
@@ -113,6 +329,29 @@
+

スター型通信

+
    +
  • Christieにはノードの通信接続を行うTopologyManagerという機能がある。
  • +
  • 同期通信はスター型での接続を行う。
  • +
  • スター型通信の利点は +
      +
    • サーバーが正しいファイル状態を保持するため、整合性を保つことができる。
    • +
    • どこかのノードが切断されても、要害の範囲をそのノードのみに抑えることができる。
    • +
    • 新しいノードが参加した、もしくは復帰の際にはサーバーのファイル状況を参照するのみで参加、復帰ができる。
    • +
    +
  • +
+ +
+ MetaGear +
+ + + +
+ +
+

Christie

  • Christieは当研究室で開発している、信頼性を重視した分散フレームワークである.
  • @@ -138,15 +377,19 @@
    • DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。
    + +
+ + - +

Christieのコード例

-
package christie.example.HelloWorld;
+
package christie.example.HelloWorld;
 
 import christie.codegear.CodeGearManager;
 import christie.codegear.StartCodeGear;
@@ -155,27 +398,25 @@
 
     public StartHelloWorld(CodeGearManager cgm) {
         super(cgm);
-    }
+        }
 
     public static void main(String[] args){
-        CodeGearManager cgm = createCGM(10000); #ポート番号を指定してCGMを立ち上げ。
-        cgm.setup(new HelloWorldCodeGear()); #立ち上げたCGMへCGを待ちあわせる。
-        cgm.getLocalDGM().put("helloWorld","hello"); #keyname "helloWorld"に文字列helloをput
+        CodeGearManager cgm = createCGM(10000);
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.setup(new FinishHelloWorld());
+        cgm.getLocalDGM().put("helloWorld","hello");
         cgm.getLocalDGM().put("helloWorld","world");
     }
 }
+
-
-
ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000
+
ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000
 hello world
 
- - - - - + -

DGM

-
    -
  • DGMは分散システムの肝となる他のノード間とのデータのやり取りの際に重要となる。
  • -
  • DGMにはLocalDGMとRemoteDGMが存在する。 -
      -
    • LocalDGM -
        -
      • LocalなDGMのプールのkeyにデータの書き込みを行う。
      • -
      -
    • -
    • RemoteDGM -
        -
      • Localに存在する、他のノードのLocalDGMに対応するプールのkeyにデータを書き込みする。接続しているノードの数だけ存在する。
      • -
      -
    • -
    -
  • -
  • DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMへ、 Remoteの場合は接続したRemote先のCGMのDGMにDGを格納する.
  • -
- -
- MetaGear -
+!--> -

Annottation

-
    -
  • ChristieではInputDGの指定にはアノテーションを使う。
  • -
  • アノテーションとはクラスやメソッド、パッケージに対して、付加情報を記述できるJavaのMeta Computationである。
  • -
  • 先頭に@をつけることで記述する。オリジナルのアノテーションを定義することもでき、Input -される型の変数を直接宣言し、変数名としてkeyを記述する。その上にアノテーションでTakeもしくはPeekを指定する。
  • -
- -
package christie.example.HelloWorld;
-
-import christie.annotation.Take;
-import christie.codegear.CodeGear;
-import christie.codegear.CodeGearManager;
-
-public class HelloWorldCodeGear extends CodeGear {
-    @Take
-    String helloWorld;
-
-    @Override
-    protected void run(CodeGearManager cgm) {
-        System.out.print(helloWorld + " ");
-        cgm.setup(new HelloWorldCodeGear());
-    }
-}
-
-
- - - -
- -
-

DGのアノテーション

  • DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには @@ -291,33 +480,46 @@
- +
package christie.example.HelloWorld;
 
-
+import christie.annotation.Peek; +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { -
- -

TopologyManager

-
    -
  • TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。
  • -
  • TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 -
      -
    • 動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。
    • -
    • 静的Toopologyはdotファイルを与えることノード関係の構築を行う。
    • -
    -
  • -
+ @Take + String helloWorld; -
digraph test {
-	node0 -> node1 [label="right"]
-	node1 -> node2 [label="right"]
-	node2 -> node0 [label="right"]
+    @Override
+    protected void run(CodeGearManager cgm) {
+        System.out.print(helloWorld + " ");
+        cgm.setup(new HelloWorldCodeGear());
+        cgm.getLocalDGM().put(helloWorld,helloWorld);
+    }
 }
 
+ @@ -326,6 +528,26 @@

まとめとこれから

+
    +
  • 本研究発表ではリモートエディタの開発とそれに伴う技術について述べた。現時点で実装できた構成は以下である。 +
      +
    • リモートエディタの基本となる命令のやり取り部分のコマンドパターン実装。
    • +
    • 編集相違を防ぐためのアルゴリズムの発案と検証。
    • +
    +
  • +
  • 現時点では最低限のセッションを動かすまでの最低限の実装は終わっていない。これから取り組まなければならない課題として以下が挙げられる。 +
      +
    • スター型Topologyの接続を動的に行わせる。
    • +
    • 編集するファイルの共有方法 +
        +
      • ファイルをそのまま送信すると、負担が大きいと予想される。
      • +
      +
    • +
    • 既存のエディタを同期通信に対応させる。
    • +
    +
  • +
  • 以上の課題の課題に取り組み、これからも実装を続けていきたい。
  • +