title: 分散フレームワークChristieを用いたリモートエディタの実装 author: Takahiro Ikki, Shinji Kono profile: 琉球大学 lang: Japanese code-engine: coderay ## 研究目的, 背景 - ペアプログラミングなどでは同時に複数人が一つのファイルを編集することができるリモートエディタが有効である。 - 既存のリモートエディタアプリケーションとしてVisual Stdio Codeがあげられる。 - しかし、セッションに参加する全員がVSCodeの環境を持っていなければならず、不便である。 - 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。 - 本研究室で開発している分散フレームワークChristieを使い、簡潔な実装を目指す。 ## 発表の流れ - リモートエディタの機能と開発手順の解説 - スター型接続によるネットワーク通信 - Christieの解説 - Gearの概念 - アノテーション - TopologyManager - 今後の課題とまとめ ## Christie - Christieは当研究室で開発している、信頼性を重視した分散フレームワークである. - 現在はjava上で開発されているが、別言語(CbC)で構成されたGearsOSに組み込む予定があるため,それに向けて書き換え可能な構成となっている。 - ChristieではデータをGearという単位で分割して記述を行う。 - CodeGear(以下CG) - スレッドやクラスに相当し、javaの継承を用いて記述する。keyに全てのDGが格納された際に動作する。 - DataGear(以下DG) - DGは変数に相当し、CG内でアノテーションを用いてデータを取り出せる。 - CodeGearManager(以下CGM) - ノードに相当し, DG, CG, DataGearManagerの管理をする. - DataGearManager(以下DGM) - DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。 ## Christieのコード例 ```code package christie.example.HelloWorld; import christie.codegear.CodeGearManager; import christie.codegear.StartCodeGear; public class StartHelloWorld extends StartCodeGear { 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"); } } ``` ``` 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を指定する。 ```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アノテーションには Take、Peek、TakeFrom、PeekFrom、の4つがある。 - Take - 先頭のDGを読み込み、そのDGを削除する。 - Peek - 先頭のDGを読み込むが、DGが消去されない。そのため特に操作をしない場合、同じデータを参照し続ける。 - TakeFrom - Remote DGM nameを指定することで、その接続先のDGM からTake操作をおこえる。 - PeekFrom - Remote DGM nameを指定することで、その接続先のDGM からPeek操作をおこえる。 ## TopologyManager - TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。 - TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 - 動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。 - 静的Toopologyはdotファイルを与えることノード関係の構築を行う。 ```Code digraph test { node0 -> node1 [label="right"] node1 -> node2 [label="right"] node2 -> node0 [label="right"] } ```
 MetaGear
## まとめとこれから