扱うデータの形式を元のコードを大きく変更することなく指定することができる。データの多態性を実現し、扱いたいデータの状態に合わせてDataSegmentManagerを切り替えることで、ノード間通信における自由度の向上を図った。Segment(以下CS)という単位に分割してプログラミングを行う。DSはAliceが内部にもつデータベースによって管理されている。DSに対応する一意のkeyが設定されており、そのkeyを用いてデータベースを操作する。CSは実行に必要なDSが揃うと実行されるという性質を持ち、入力されたDSに応じた結果が出力される。データの依存関係にないCSは並列実行が可能であるため、並列度を上げるためにはCSの処理内容を細かく分割して依存するデータを少なくするのが望ましい。複数のスレッドから1つのデータに変更を行うためには、データの不整合を防ぐためのlockが必要になる。複数の関係のない要素を1つのデータオブジェクトで表現した場合、全ての操作でlockが必要になる。このlockがスケラビリティーを低下させる。データのサイズも並列計算には重要である。Aliceはデータを細かく分割して記述する。その細かく分割されたデータをDSと呼ぶ。実際には特定のオブジェクトにマッピングされ、マッピングされたクラスを通してアクセスされる。DSは実際にはqueueに保存される。queueには対になるkeyが存在し、keyの数だけqueueが存在する。このkeyを指定してDSの保存、取得を行う。queueの集合体はデータベースとして捉えられる。Manager(以下DSM)と呼ぶ。DSMは各ノード固有のデータベースである。DSMのproxyであり、接続しているノードの数だけ存在する。DSMに書き込まれる。APIを用いてデータベースにアクセスする。putとupdateはDSを追加する際に、peekとtakeはDSを取得する際に使用する。peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。Javaを利用している。2種類があり、LocalDSMにputされた場合は一般的なJavaのクラスオブジェクトとしてenQueueされる。RemoteDSMにputされた場合は通信時にbyteArrayに変換されたバイナリオブジェクトがenQueueされる。Alice上で実行されるタスクの単位がCSである。ユーザーはCSを組み合わせることでプログラミングを行う。CSをユーザーが記述する際に、内部で使用するDSの作成を記述する。DSはCSに用意されているAPIを用いて作成する。Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。,\ref{src:CodeSegment})。Segmentで使用するAPIを利用する事ができる。DSMに値を追加する。13行目が終了条件であり、countの値が10になれば終了する。AliceのComputationは、keyで指し示されるDSを待ち合わせてCSを実行させると定義できる。Computationは、AliceのComputationを支えているComputationのプログラミングと定義できる。このようにプログラムすることで、通常処理と例外処理を分離することができるため、シンプルなプログラムを記述できる。DSは、アプリケーションに管理されているデータのことである。アプリケーションを構成するCSによってその値は変更される。DSは、分散フレームワークAliceが管理しているデータである。Aliceを構成するCSによってのみ、その値は変更される。DSはアプリケーションに利用することができる。APIを用いて取得できる。CSはアプリケーションを動作させるために必要なタスクであり、ユーザーによって定義される。CSはAliceを構成するタスクである。CSの群はAliceのComputationと言い換えることができる。一部のみユーザーが定義をすることができ、Aliceの挙動を変更することができる。実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。Segmentが毎回新しく作成される。出力するデータのコピーが行われる。Segmentとして出力する場合、コピーを行なうのは無駄である。Segmentの更新におけるオーバーヘッドを減らす方法としてflip機能の実装を行った。SegmentであるReceiverをflipメソッドに引数として渡すことで、無駄なコピーを減らす。Segmentが毎回新しく作成され、出力するデータのコピーが行われる。Segmentとして出力する場合、コピーを行なうのは無駄である。Segmentを交換する機能をflip機能として実装した。SegmentであるReceiverをコピーせずにflipメソッドに引数として渡すことで、コピーのオーバーヘッドをなくしている。Computationとしてflip機能が使えることは有用である。TreeVNCでは画面配信の際、データを圧縮してノード間通信を行っている。そのため、AliceVNCにも圧縮されたデータ形式を扱える機能が必要だと考えた。データを圧縮する機構を追加すればいいわけではない。表現でデータ本体が保存される。シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。圧縮されたバイナリオブジェクトが保存される。表現でデータ本体が保存される。シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。圧縮されたバイナリオブジェクトが保存される。Managerの追加した。-put/updateでは、ソースコード\ref{src:zput}のように指定するDSM名の先頭に"compressed"をつけることでDSは自動で圧縮状態も持つようになる。take/peekもソースコード\ref{src:ztake}のようにsetKeyを実行する際にDSM名の先頭に"compressed"をつけることで圧縮形式でDSを受け取ることができる。Managerの追加した。DSMの内部では、put/updateが呼ばれた際にReceiveData.classが圧縮表現を持っていればそれを使用し、持っていなければその時点で圧縮表現を作ってput/updateを行う。Computationが走りDSを圧縮状態で扱うようになる。-これによりユーザは指定するDSMを変えるだけで、他の計算部分を変えずに圧縮表現を持つDSを扱うことができる。--ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipすれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。)を使うことで適切な形式でデータを取得できる。asClass()}はDSを目的の型にcastするメソッドであり、圧縮されていれば解凍してcastを行っている。-これにより必要なDSを必要な時にだけ解凍できる。+これによりユーザは指定するDSMを変えるだけで、他の計算部分を変えずに圧縮表現を持つDSを扱うことができる。ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipすれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。)を使うことで適切な形式でデータを取得できる。asClass()}はDSを目的の型にcastするメソッドであり、ReceiveData.classが圧縮表現だけを持っている場合はこのメソッド内で解凍してcastを行っている。+これによりDSの表現を必要になったときにその場で作成できる。-\subsection{パケットの再設計}-2.5で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。Segmentの表現」で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。データの表現に圧縮形式を追加したことで、RemoteからでもputされたbyteArrayが圧縮されているのかそうでないのかが判断できなくなった。そこで、データの状態を表すフラグをヘッダに含めてパケットを構成するように変更した。{src:CommandMessage}にシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。{src:CommandMessage})にシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。これによってputされたDSMはフラグに応じた適切な形式でReceiveData.class内にDSを格納できる。CommandMessage.classに圧縮前のデータサイズも追加したことで、適切な解凍が可能になった。これにより、必要に応じた形式を扱うことができ、ユーザが記述するComputation部分を大きく変えずに自由度の高い通信を行うことが可能になった。同様の手法を用いれば、圧縮形式以外にも暗号形式・JSON形式などの複数のデータ表現をユーザに扱いやすい形で拡張することができる。-今後の課題としては、より実用的なアプリケーションを記述するために、データの永続性の確保等が挙げられる。memoryであるためプロセスの終了とともにDS全て失われてしまう。Store等のシステムに保存し、永続性を確保する必要がある。+今後の課題としては、圧縮機能をAliceVNCで用いることで有効性を測る必要がある。ComputationにProxy機能を実装することで、TreeVNCでは実装が困難であったNAT越えの機能を提供できると期待される。