\documentclass[twocolumn,twoside,9.5pt]{jarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{picins}
\usepackage{fancyhdr}
\usepackage{abstract}
\usepackage{here}
\usepackage{url}
\usepackage{float}
\usepackage{listings}
%\pagestyle{fancy}
\lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{pic/emblem-bitmap.pdf}}琉球大学主催 工学部情報工学科 中間発表予稿}
\rhead{}
\cfoot{}

\setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
\setlength{\headheight}{0mm}
\setlength{\headsep}{5mm}
\setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
\setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
\setlength{\textwidth}{181mm}
\setlength{\textheight}{261mm}
\setlength{\footskip}{0mm}

\pagestyle{empty}
\lstset{
  language=C, 
  tabsize=2, 
  frame=single, 
  basicstyle={\ttfamily\footnotesize}, % 
  identifierstyle={\footnotesize}, % 
  commentstyle={\footnotesize\itshape}, % 
  keywordstyle={\footnotesize\bfseries}, % 
  ndkeywordstyle={\footnotesize}, % 
  stringstyle={\footnotesize\ttfamily}, 
  breaklines=true, 
  captionpos=b, 
  columns=[l]{fullflexible}, % 
  xrightmargin=0zw, % 
  xleftmargin=1zw, % 
  aboveskip=1zw, 
  numberstyle={\scriptsize}, % 
  stepnumber=1, 
  numbersep=0.5zw, % 
  lineskip=-0.5ex, 
}


\begin{document}
\title{分散フレームワークChristieを用いたremote editor\\ Remote editor using distributed framework Christie}

\author{165713F 一木貴裕 {}{} 指導教員 : 河野真治}
\date{}
\maketitle
\thispagestyle{fancy} 

\section{複数人によるファイルの同時編集}
情報社会の発展にともないプログラミングを始めとしたIT技術に対する注目が集まっている。特定の場所に赴かずとも仕事を行うことができるリモートワークの増加、互いのいる場所を問わず画面越しに対話が行える遠隔会議、小学校教育の一環にプログラミングを取り組むといった動きがその一例と言える。

これらの取り組みをより発展させる方法としてremote editorの開発を行うことにした。プログラミング教育や共同開発に行われる手法としてペアプログラミングが挙げられる。remote editorを実装し、共通のファイルを複数人で同時に操作を可能にすることによりペアプログラミングの効能をより高められると考えた。しかし一人ひとりが使うプログラミングに用いられるエディタは膨大な数が存在する。共同で編集するユーザが環境を合わせる必要なく、自分の慣れ親しんだ環境で編集できるように異なるエディタ間での同期が行えるような機能を実現する。

　開発するremote editorは異なるマシン上のtext editorを接続し、異なるエディタ間でも通信が行えるよう編集コマンドを統一する共通プロトコルを用いる。接続された一つのマシン上のエディタで編集を行うと、編集位置と内容を逐次、共通の編集コマンドに変換する。変換されたコマンドを接続ネットワークに送信することで遠隔でのテキスト編集を行う。

　本研究は先行研究\cite{rep}を参考として進める。先行研究ではネットワークをリング型で構成しトークンを巡回させていたが、ノードごとの整合性の確立が難しい、ネットワーク全体の障害に対する脆弱性の弱さといった問題点が見られた。これらの反省点を踏まえ本研究ではスター型ネットワークを用いることでremote editorの障害耐性を高める。また新しく、当研究室で開発している分散フレームワークChristieを用いることにより、エディタ間の通信の構成を行い、Christieの実用性の検討を行う。

\section{remote editor}
リモートエディタは共通プロトコルが対応するエディタが保持するバッファを開いて編集することができる。ネットワーク上の一つのバッファが編集されると他のバッファにも変更が反映され、お互いのバッファを編集し合うことができる。

\section{編集位置の相違とその解消}
エディタ間の通信で生じる相違について説明する。エディタ同士のコマンドの送信はそれぞれが独立して行うため、編集対象の領域にエディタ間で相違が生じる場合がある。例としてエディタが一対一の接続となっている時に発生しうる相違を図\ref{fig:diff_off}を使用して解説する。

　編集対象は各オフセット番号に同じ値の数字が入っているものとする。EditorAではオフセット番号3の３という要素を削除(テキストエディタ上のため削除されたオフセットにはその後ろの要素が繰り上げられる。)、EditorBではオフセット番号2にAという要素を挿入するという編集をしたとする。この編集を共通プロトコルとして互いに送信しあった際、本来編集する予定だったオフセットの中身が食い違ってしまい最終的に異なった内容となってしまう。これらの問題を解決することのできるエディタ同士の通信方法を確立しなければならない。
\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.4}{\includegraphics{pic/graph/difference_offset.pdf}}
 \end{center}
 \caption{通信によるオフセット位置のずれ}
 \label{fig:diff_off}
\end{figure}

\section{document listenerによる編集オフセット番号の読み取り}
エディタ同士の基本通信環境の構成のため、java言語で作成したエディタを使い異なるマシン同士の同期を実現する。自作エディタはjava.swingの機能で構成されており、追記もしくは削除されたオフセット位置とその内容の取得はDocumentListenerを使用している 。

\lstinputlisting[label=TextFrame_example,  caption=]{pic/sample_code/TextFrame.java}



\section{スター型ネットワークによる巡回トークン}
スター型で構成されたネットワーク上の巡回トークンについて解説する。

スター型とはネットワーク接続形態の一つであり、主要となるサーバー(ハブ)から接続された他の全てのノードが直接接続される形のネットワークトポロジーである。一般的なLANはスター型で接続されており、またハブ同士を接続したりtree型にノードを構成するといった自由性もある。

スター型ネットワークで接続されたリモートエディタにトークンを巡回させコマンドの送信と受信を行う。先行研究のリング型ネットワークと比較したスター型ネットワークの利点として

\begin{itemize}
  \item リング型ではエディタ同士の変更内容の一元化が難しいが、スター型ではサーバーが中心となるため一元性の保持が容易である。
  \item ノードが障害を起こしても影響がそのノードのみに限られる。また、再接続の際はサーバーを参照することで可能となる。
\end{itemize}
が挙げられる。

\section{分散フレームワークChristie}
ここでは当研究室が開発している分散フレームワークChristieについて説明する。

Christieはユーザーが分散プログラムを行う際、並列で動く資源などの複雑性を緩和しながらプログラムを書き上げることができる構造となっている。接続された異なるノード間において互いのキーの差し合いだけで通信を行うことができ、remote editorの通信を手軽に実現することができる。
また、Christieはjava言語で開発されている。また同じく当研究室で開発している言語Continuation based C(以下CbC)で構成されているGearsOSに組み込まれる予定がある。そのため CbCと似たGearというプログラミング概念が存在する。Gearは以下の四種類が存在する。
\begin{itemize}
  \item CodeGear (CG)
  \item DataGear (DG)
  \item CodeGearManager (CGM)
  \item DataGearManager (DGM)
\end{itemize}
CodeGearはクラス、メソッドに相当し、DataGearは変数データに相当する。CodeGearManagerはノードであり、CodeGear, DataGear, CodeGearManagerを管理する。 DataGearManagerはDataGearを管理するものであり、putという操作により変数データ、つまりDataGearを格納できる。

DataGearManagerにはLocalとRemoteの二種がある。Localであれば、LocalのCodeGearManagerが管理しているDataGearManagerに対し、DataGearを格納する。Remoteであれば、Remote先のCodeGearManagerにDataGearを格納する。

　また、DataGearはアノテーションを付けデータの取り出し方を指定する必要がある。アノテーションにはTakeとPeekの二つがあり、Takeは読み込んだDataGearを保持せず消えるが、PeekはDataGearを保持し続ける。また、RemoteTake,RemotePeekというものもあり、リモート先を指定することにより、RemoteのDataGearManagerからデータを取ることができる。

　CodeGearはCodeGearManagerによって実行される。ただし、CodeGear内に記述されたDataGearが全て入力される必要がある。もしDataGearが揃わない場合、CodeGearManagerはDataGearが揃うまで待機状態となる。

\section{今後の課題}
現時点ではChristieと同じjava言語で作成したエディタを作り、一対一のエディタ同士の通信を確認している。また、現在はオフセット番号を取得し同期を行なっているが、既在のエディタは行単位での挿入と削除を行なっているため、将来的には行単位に統一する必要がある。

\nocite{*}
\bibliographystyle{junsrt}
\bibliography{reference}
\end{document}