\documentclass[a4paper,titlepage]{jsarticle}
\usepackage[dvips]{graphicx}
\usepackage{moreverb}
\pagestyle{empty}
\西暦
\setlength{\textheight}{240mm}
\setlength{\topmargin}{-10mm}
\setlength{\textwidth}{165mm}
\hyphenation{front-end}

\title{アドレス帳同期システムの開発}
\date{}%ここはブランク
\author{05H101 藤木仙雅}

\begin{document}
\maketitle\pagestyle{empty}

% 目次
\tableofcontents
\clearpage

\pagestyle{plain}
\setcounter{page}{1}

 \section{はじめに}

 今日では、様々な場所にアドレス帳が分散している。
 例えばパーソナルコンピュータ(以下、コンピュータ)内に
 年賀状作成ソフトウェア、メーラー
 \footnote{電子メールの作成、送受信や送受信したメールを保存、
 管理するソフトウェア。}
 、Webメールなどのアドレス帳が存在し、さらには携帯電話端末にも
 アドレス帳が存在する。
 このように複数のアドレス帳を扱っていると管理するのは容易ではなく、
 全てのアドレス帳に一つずつ情報を入力していくには非常に手間がかかる。
 さらには情報の入力洩れなども起こりうる。例えば、会社のコンピュータに
 仕事用のアドレス帳を更新した時、自宅のコンピュータにも同じ情報を入力
 しておないと、いざ自宅で必要な時に必要な情報が分からないという情況に
 なってしまう。さらには、年賀状作成ソフトウェアは用途が限られており、
 頻繁に扱うことが少ない。よって、他のソフトウェアでアドレス帳を更新した際に
 年賀状作成ソフトウェアのアドレス帳の更新を忘れることがしばしば見受けられる。
 そこでアドレス帳同期、共有システム\footnote{アドレス帳同期システム:
 分散したアドレス帳を集約し
 同期させるもの。また異なるコンピュータ間で自動同期させ常に最新の情報を
 維持させる。
 アドレス帳共有システム:アドレス帳同期システムに、他ユーザとも共有する
 機能を持たせたもの}を用い、アドレス帳管理を容易にすることができる。
 
 本研究ではユーザのアドレス帳管理や情報入力の効率を上げるため、
 アドレス帳同期システムを開発した。
 
 \clearpage
 
 \section{卒業研究の目的}
  
  本研究では複数のソフトウェアに分散したアドレス帳を集約し、
  同期させることを目的とする。
  マルチプラットフォームに\footnote{アプリケーションソフトウェアが複数の
  OSに対応していること。}
  対応し様々なOS\footnote{Operating System}
  で動作させる。
  CUI\footnote{Character-based User Interface\\
  キーボードを用いて入力を行い、文字によって出力を行うユーザインターフェース}
  とGUI\footnote{Graphical User Interface\\
  コンピュータグラフィックスとポインティングデバイスを用いて、直感的な
  操作を提供するユーザインターフェース}
  で動作させ、幅広いユーザが扱えるようにする。
  この時、CUIをバックエンドで動作させ、GUIをフロントエンドで動作させる。
  異なるコンピュータ間の同期にはLDAP
  \footnote{Lightweight Directory Access Protocol\\
  インターネットやイントラネットなどのTCP/IPネットワークで、
  ディレクトリデータベースにアクセスするためのプロトコル}
  ~\cite{ldap}サーバを用いる。
  LDAPサーバを用いたアドレス帳の同期はWebメールやメーラで標準搭載されている
  機能でもあり、開発するアドレス帳同期システムで同期させたアドレス帳を
  LDAPサーバに登録し、Webメールやメーラで扱うこともできる。
  対応するアドレス帳形式には、様々なソフトウェアで互換性が高いvCard形式
  \footnote{電子名刺の標準フォーマット。RFC2426で規定。}
  を用いる。

  \clearpage
   
 \section{既存のシステム}
 
 アドレス帳共有、同期システムとして以下のシステムが存在している。
 
 \begin{itemize}
  
  \item{Ripplex}~\cite{ripplex}
       
       Ripplex社が開発した無料アドレス帳ソフト。webサービスではなく、
       クライアントアプリ
       \footnote{クライアント・アプリケーション\\
       デスクトップパソコンやモバイルパソコン内で動作するアプリケーション。}
       である。複数のコンピュータ間でアドレス帳情報が自動的に同期。
       他ユーザのアドレス帳と共有し情報管理が容易。アドレス帳だけでなく、
       Skype\footnote{ルクセンブルクに籍を置くSkype Technologies社が提供する
       インターネット電話サービス。}、
       Twitter\footnote{Twitter社が開発した、個々のユーザが「つぶやき」
       を投稿し合うことでつながるコミュニケーション、サービス。}や
       mixi\footnote{株式会社ミクシィが運営するSNS(Social Networking Service)}
       サービスの情報も管理可能である。各情報はRipplexサーバ
       ではなく、ユーザのコンピュータ内にて管理される。\\
       
  \item{Plaxo}~\cite{plaxo}
       
       Plaxo社が提供するサービス。ネットワークを活用した今までにない、
       常に最新の情報を保つアドレス帳として開発。自分の情報を公開し、
       他ユーザと共有するのが第一趣旨であり、アドレス帳やスケジュール帳
       など共有することができる。
       現在はpulseという機能が追加され、ブログ、写真、ビデオや様々なレ
       ビューなども共有することができる。各情報はPlaxoサーバにて管理。\\
       
  \item{Mobile Me}~\cite{mobileme}
       
       \raisebox{.5mm}{A}pple社が提供しているいサービス。
       メール、アドレス帳、カレンダーやギャラリーなどを同期。
       メールはiPodTouch\footnote{\raisebox{.5mm}{A}pple社が開発した
       ミュージックプレイヤー。iPodにゲーム、インターネットの機能を
       追加したもの。\\
       iPodとはApple社が開発したミュージックプレイヤーである。}
       やiPhone\footnote{\raisebox{.5mm}{A}pple社が開発した、携帯電話端
       末、iPodやインターネットデバイスを一つにしたもの。}
       だけでなく、MacOSのMail.appやMS-WindowsのOutlook
       \footnote{Microsoft Outlook\\
       Microsoft社がWindows向けに販売しているExchange Serverの
       標準クライアント。
       電子メールの機能以外に、予定表、連絡先管理、仕事管理やメモなどの
       機能が実装されている。},
       Outlook Express\footnote{MicrosoftのInternet Explorerに付属する
       電子メール及びニュースグループ送受信用クライアントソフトウェア。\\
       Microsoft Outlookとは別物であり、Internet/Intranet専用の電子
       メールクライアント。},
       Windows Mailとも連係。
       アドレス帳はMacOS、MS-Windowsのアドレス帳と同期させることができる。
       各情報はクラウド
       \footnote{\raisebox{.5mm}{A}ppleのオンラインサーバ}に保存。\\
       
  \item{Soocial}~\cite{soocial}
       
       コンタクト情報にフォーカスしているオランダ発のWebサービス。
       携帯電話端末、Mac、
       Gmail\footnote{Googleが提供しているwebメール}
       やOutlookのアドレス帳データを同期できる。
       
 \end{itemize}
 
 \clearpage
 
 \section{開発したシステム}
 
 本研究で、アドレス帳同期システム(Address-Book Synchronous System)を開発
 した。
 
 本システムの概略図を{\bf 図\ref{zu}}に示す。

 \begin{figure}[!ht]
  \centering
  \includegraphics[width=9cm]{zu.eps}
  \caption{システムの概略図}
  \label{zu}
 \end{figure}

 \subsection{開発環境}
 
 \begin{itemize}
  \item ハードウェア(AT互換機)
       \begin{itemize}
        \item CPU:Intel(R) Celeron(R) CPU 2.80GHz
	\item Cache Memory:256KB
       \end{itemize}
  \item OS：Vine Linux 4.2~\cite{vine} / Ubuntu Linux 8.04~\cite{ubuntu}
       [研究室内マシン
       / 個人所有マシン]\\
  \item 開発言語：Ruby~\cite{ruby} 1.8.5 / 1.8.6 [研究室内マシン
       / 個人所有マシン] 
 \end{itemize}
 
 \subsection{処理の流れ}
  
  以下に処理の流れと付加する機能について説明する。
  
   \subsubsection{同期させるアドレス帳の入力}
   
   同期させるアドレス帳Pathを一つずつ入力。
   その際に入力したアドレス帳が存在するか、またvCard形式であるかを判定する。
   入力されたアドレス帳が存在し、vCard形式ならば、アドレス帳のPathをpath.txt
   ファイルに書き込む。

   アドレス帳入力画面を{\bf 図\ref{nyuuryoku}}に示す。

   アドレス帳入力のフローチャートを{\bf 図\ref{delete}}、
   {\bf \ref{maincui}}に示す。

   \clearpage

   \begin{figure}[!ht]
     \centering
     \includegraphics[width=10cm]{nyuuryoku.eps}
     \caption{アドレス帳入力画面}
     \label{nyuuryoku}
   \end{figure}
   
   \subsubsection{入力したアドレス帳の集約}
   
   アドレス帳集約の際には、入力されたアドレス帳を一件ずつ解析。解析が
   終了すればBackupデータを用い、既に集約しているアドレス帳と比較し、
   同一名称で登録されているデータがないか確認。
   同一名称で登録されているデータを発見すれば、双方が同一ユーザなのか
   ユーザ側が判断。
   同一ユーザであれば双方のデータを結合させる。
   同一ユーザ結合の際、同項目に別の情報が入っていた場合もユーザ側に
   判断させる。
   同一名称で登録されているデータが発見されなければ解析終了。
   
   解析には一件のアドレス帳一項目ずつ解析し、名前、住所、電話番号、
   E-MAILの個人情報を抽出。抽出した個人情報の内、名前は同一ユーザ発見の
   際に使用、その他の項目は各ユーザの情報として使用。

   入力されたアドレス帳の解析が全て終了すれば、RFC2426~\cite{rfc2426}
   で定められているvCard形式のデータ型に置き換える。

   アドレス帳集約画面を{\bf 図\ref{syuuyaku}}に示す。

   アドレス帳集約のフローチャートを{\bf 図\ref{clearn}〜
   \ref{mcollect3}}
   に示す。

   \begin{figure}[!ht]
     \centering
     \includegraphics[width=9cm]{syuuyaku.eps}
     \caption{アドレス帳集約画面}
     \label{syuuyaku}
   \end{figure}
   
   \subsubsection{集約したアドレス帳の同期}
   
   path.txtファイルを参照し、同期させているアドレス帳全てに書き込み処理を行う。
   書き込む際にはnkf\footnote{文字コードを変換するコマンド}~\cite{nkf}を
   用いて文字コード変換を行う。
   同時にBackupファイルも作成する。Backupファイル作成時にはvCardのversion
   \footnote{現在、version2.1とversion3が存在する。}別で作成する。
   
   \subsubsection{同期させたアドレス帳の更新}
   
   起動時もしくはrenewalコマンドにて同期させたアドレス帳の更新を行う。
   
   path.txtファイルを参照し、全てのアドレス帳の最終更新時間を取得。
   最終更新時間の新しいものと、Backupファイルの更新時間を比較。
   最終更新時間を取得したアドレス帳が新しものならば、他の同期させている
   アドレス帳へ書き込み処理を行い。新しくBackupファイルを作成する。
   この場合も、nkfを用いて文字コードの変換を行う。
   
   アドレス帳更新画面(更新無し)を{\bf 図\ref{renewal1}}に示す。
   
   \begin{figure}[!ht]
    \centering
    \includegraphics[width=9cm]{renewal1.eps}
    \caption{アドレス帳更新(更新無し)}
    \label{renewal1}
   \end{figure}
   
   アドレス帳更新画面(更新有り)を{\bf 図\ref{renewal2}}に示す。
   
   \begin{figure}[!ht]
    \centering
    \includegraphics[width=9cm]{renewal2.eps}
    \caption{アドレス帳更新(更新有り)}
    \label{renewal2}
   \end{figure}
   
   アドレス帳更新のフローチャートを{\bf 図\ref{code_change2}〜
   \ref{watch3}}に示す。
   
   \clearpage

   \subsubsection{同期させているアドレス帳の一覧表示}
   
   pathfileコマンドにて同期させているアドレス帳の一覧を表示させる。
   
   アドレス帳一覧表示画面を{\bf 図\ref{pathfile}}に示す。
   
   \begin{figure}[!ht]
    \centering
    \includegraphics[width=9cm]{pathfile.eps}
    \caption{アドレス帳一覧表示}
    \label{pathfile}
   \end{figure}
       
   \subsubsection{同期の解除}
       
  deleteコマンドにて同期させているアドレス帳の解除を行う。
       
  解除方法として、現在同期させているアドレス帳の一覧を表示。その中から
  同期を解除させたいアドレス帳のPathを入力し、入力したアドレス帳が
  正しければ一覧から削除させる。

  アドレス帳同期解除画面を{\bf 図\ref{delete1}}に示す。

   \begin{figure}[!ht]
    \centering
    \includegraphics[width=9cm]{delete1.eps}
    \caption{アドレス帳同期解除}
    \label{delete1}
   \end{figure}
  
  \clearpage

 \section{考察}
 
 アドレス帳同期システムを開発し、実際に稼働させた。\\
 本システムについて、以下の利点と問題点が挙げられる。
 
  \subsection{利点}
  
  マルチプラットフォームで動作するRubyを用いて開発したので、様々なOSで
  動作する。
  コンピュータ内に分散されたアドレス帳を集約させることで、アドレス帳の
  管理、情報入力の手間を省くことができる。
  対応するアドレス帳にvCard形式を用いた。vCard形式はRFC2426で規定
  されているので様々なソフトウェアでの互換性が高い。
  
  
  \subsection{問題点}
  
  現在はCUIのみの動作なので幅広いユーザが扱うことは難しい。
  Rubyでプログラミングするにあたり、RFC2426で規定されているデータ型全て
  (非標準の型は除く)に対応させて開発した。それにより、一つずつ型の解析を
  行っている為、読みにくいソースコードとなっている。
  vCard形式はRFC2426で規定されているが、``X-''で始まる名前を持つものは非
  標準の私的な型であり、各ソフトウェアによって様々な情報が当てはめられている。
  よって、全てに対応させることは出来ない。

  \clearpage
   
 \section{まとめ}
 
 本研究では、分散したアドレス帳を集約し、同期させるシステムを開発した。
 これにより複数のアドレス帳の管理を容易にし、情報入力の手間を省いた。
 また、対応するアドレス帳にvCard形式を用いることにより、様々なソフトウェアに
 対応することができる。

 テスト運用として、携帯電話端末(docomo P905i)、Windowsマシンに標準搭載
 されている``アドレス帳''ソフトウェアとGmailアドレス帳を用いてアドレス
 帳の同期を行い、アドレス帳同期システムとして稼働することを確認。
 しかし、携帯電話端末のアドレス帳はJIS X 0201右側部分が使われている。
 現状ではJIS X 0201右側部分が認識されておらず携帯電話端末で集約したア
 ドレス帳を読み込んだ際、振り仮名が空白となってしまう。
 

 \clearpage

  \section{今後の課題}

  \begin{itemize}

   \item{LDAPサーバの導入}

	異なるコンピュータ間で同期させるためLDAPサーバを導入する。
	しかし、アドレス帳をサーバに置くことを嫌うユーザが存在する
	可能性があるので、異なるコンピュータと同期させるか否かを
	ユーザ側で判定をさせる。\\

   \item{GUIでも動作}

	幅広いユーザが扱えるように、CUIだけでなく、GUIを用いて動作
	させるようにする。\\

   \item{アドレス帳の自動更新}

	更新を確認するのに、開発したシステムの再起動、``renewal''コマン
	ドや更新ボタンを押す手間を省くため、アドレス帳更新の確認を分単位
	で行う。
	更新確認時間の間隔はユーザ側で指定する。\\

   \item{Ruby環境でないマシンでの稼働}

	現在はRuby環境のマシンでしか稼働しない。
	よってExerb\footnote{Rubyのスクリプト、拡張ライブラリを単一で動
	作可能なWindows実行形式ファイルに変換するソフトウェア。}
	やRubyScript2Exe\footnote{RubyスクリプトからWindows用とLinux用の
	実行形式ファイルを作成するソフトウェア。}
	を用いてexeファイルに変換し、MS-Windowsでも稼働
	させる。\\

   \item{Backupデータの作成}

	現在、Backupデータは過去一回分しか作成していない。
	よってユーザの誤操作により意図しない結果により更新してしまった場合
	のことを考慮し、過去数回分のBackupを作成する。
	過去何回分作成するかをユーザ側で指定させ、複数のBackup
	データを作成する。\\

  \end{itemize}

  \clearpage
 
 \section*{謝辞}
 
 本研究を進めていく上で、ご教授頂いた大垣 斉講師、藤井 信夫教授、情報安
 全工学研究室の卒業研究生並びに情報システム工学科卒業生の方々に深く感謝
 の意を表します。
 
 % 参考文献
 \begin{thebibliography}{99}
  \bibitem{ldap}LDAP, [http://e-words.jp/w/LDAP.html]
  \bibitem{vine}Vine Linux, [http://www.vinelinux.org/]
  \bibitem{ubuntu}Ubuntu Linux, [http://www.ubuntulinux.jp/]
  \bibitem{ruby}オブジェクト指向スクリプト言語 Ruby,
	  [http://www.ruby-lang.org/ja/]
  \bibitem{ripplex}Ripplex, [http://www.ripplex.com/jpn/index.html]
  \bibitem{plaxo}Plaxo, [http://www.plaxo.com/?lang=ja]
  \bibitem{mobileme}Mobile Me, [http://www.apple.com/ja/mobileme]
  \bibitem{soocial}Soocial, [http://www.soocial.com/]
  \bibitem{rfc2426}RFC2426, 
          [http://www.y-adagio.com/public/standards/tr\_vcd\_2426/toc.htm]
  \bibitem{nkf}nkf,
	  [http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/]
 \end{thebibliography}
 (注)URIは全て2008年11月25日時点のもの
 
 \clearpage
 
 \appendix
 \section{フローチャート}
 
  \subsection{アドレス帳入力のフローチャート}
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[width=15cm]{delete.eps}
   \caption{deleteメソッド}
   \label{delete}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=23cm]{main-cui.eps}
   \caption{main-cui.rb}
   \label{maincui}
  \end{figure}
  
  \clearpage
  
  \subsection{アドレス帳集約時のフローチャート}
  
  \begin{figure}[!ht]
   \begin{tabular}{cc}
    \begin{minipage}{0.45\hsize}
     \centering
     \includegraphics[width=6cm]{clearn.eps}
     \caption{clearn メソッド}
     \label{clearn}
    \end{minipage}
    \begin{minipage}{0.45\hsize}
     \centering
     \includegraphics[width=6cm]{settype.eps}
     \caption{settype メソッド}
     \label{settype}
    \end{minipage}
   \end{tabular}
  \end{figure}
  
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=19cm]{setvcard.eps}
   \caption{setvcard メソッド}
   \label{setvcard}
  \end{figure}

  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[width=16cm]{els.eps}
   \caption{els メソッド}
   \label{els}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=23cm]{collect.eps}
   \caption{collect メソッド}
   \label{collect}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \begin{tabular}{cc}
    \begin{minipage}{0.4\hsize}
     \centering
     \includegraphics[width=3cm]{infdata.eps}
     \caption{infdata メソッド}
     \label{infdata}
    \end{minipage}
    \begin{minipage}{0.4\hsize}
     \centering
     \includegraphics[width=3cm]{infbdata.eps}
     \caption{infbdata メソッド}
     \label{infbdata}
    \end{minipage}
   \end{tabular}
  \end{figure}

  \begin{figure}[!ht]
   \centering
   \rotatebox{-90}{\includegraphics[width=17cm]{code_change.eps}}
   \caption{code-change メソッド}
   \label{code_change1}
  \end{figure}

  \clearpage

  \begin{figure}[!ht]
   \centering
   \rotatebox{-90}{\includegraphics[width=22cm]{moji.eps}}
   \caption{moji メソッド}
   \label{moji1}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=23cm]{maincollect1.eps}
   \caption{collect.rb(1)}
   \label{mcollect1}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=23cm]{maincollect2.eps}
   \caption{collect.rb(2)}
   \label{mcollect2}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=23cm]{maincollect3.eps}
   \caption{collect.rb(3)}
   \label{mcollect3}
  \end{figure}
  
  \clearpage
  
  \subsection{アドレス帳更新確認のフローチャート}
  
  \begin{figure}[!ht]
   \centering
   \rotatebox{-90}{\includegraphics[width=20cm]{code_change.eps}}
   \caption{code-change メソッド}
   \label{code_change2}
  \end{figure}

  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \rotatebox{-90}{\includegraphics[width=21cm]{moji.eps}}
   \caption{moji メソッド}
   \label{moji2}
  \end{figure}

  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[width=16cm]{time.eps}
   \caption{time メソッド}
   \label{time}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[width=12cm]{watch.eps}
   \caption{watch.rb (1)}
   \label{watch1}
  \end{figure}
  
  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=23cm]{watch2.eps}
   \caption{watch.rb (2)}
   \label{watch2}
  \end{figure}

  \clearpage
  
  \begin{figure}[!ht]
   \centering
   \includegraphics[height=22cm]{watch3.eps}
   \caption{watch.rb (3)}
   \label{watch3}
  \end{figure}
  
  \clearpage
  
 \section{ソースコード}
 
  \subsection{main-cui.rb}

  \verbatimtabinput{main-cui.rb}

  \subsection{collect.rb}

  \verbatimtabinput{collect.rb}
  
  \subsection{watch.rb}
  
  \verbatimtabinput{watch.rb}

\end{document}
