annotate paper/chapter3.tex @ 4:3b3b014765a2

minor change
author sugi
date Wed, 13 Feb 2013 17:33:02 +0900
parents 236628ffc497
children 52dff3fd4f40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e248011df195 register repository
sugi
parents:
diff changeset
1 \chapter{Aliceを用いた例題}
e248011df195 register repository
sugi
parents:
diff changeset
2 \label{chap:poordirection}
e248011df195 register repository
sugi
parents:
diff changeset
3 AliceのAPIを見直すためには実際にAliceを用いて例題を作成するのが、適切である。この章では実際にAliceを用いて作成された例題を示す。
e248011df195 register repository
sugi
parents:
diff changeset
4 \section{水族館ゲーム}
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
5 Aliceは分散ネットフレームワークである。従って例題を作成するにあたってネットワークを介した例題が適切であると思われる。そこで過去にFedarated Lindaでも作成された水族館ゲームをAliceで実装した。また、Java3D版(図\ref{fig:Java3D})とは別に、新しくJava7に組み込まれたJavaFx(図\ref{fig:JavaFx})を使い水族館ゲームのJavaFx版を作成した。
0
e248011df195 register repository
sugi
parents:
diff changeset
6
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
7 水族館ゲームとは複数のclientのディスプレイを並べて使用する。アプリケーションを実行するとウインドウが表示され、複数の魚がウインドウの中を泳ぎ始める。魚は画面の端まで移動すると自分の画面上からは消え、隣のプレイヤーの画面の端から出てくる。魚のうち1匹はプレイヤーが操作することができる。トポロジーはAliceのTopologyManagerによってツリー状に構成されている。
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
8 \begin{figure}[htbp]
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
9 \begin{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
10 \includegraphics[width=160mm]{fig/for_3D.pdf}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
11 \end{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
12 \caption{java3D版 水族館ゲーム}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
13 \label{fig:Java3D}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
14 \end{figure}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
15
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
16 \begin{figure}[htbp]
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
17 \begin{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
18 \includegraphics[width=160mm]{fig/for_FX.pdf}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
19 \end{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
20 \caption{javaFX版 水族館ゲーム}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
21 \label{fig:JavaFx}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
22 \end{figure}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
23
0
e248011df195 register repository
sugi
parents:
diff changeset
24
e248011df195 register repository
sugi
parents:
diff changeset
25 \subsection{処理の流れ}
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
26 図\ref{fig:NodeToClient}はデータの流れをコラボレーションダイアグラムで示したものである。
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
27 \begin{enumerate}
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
28 \item ユーザーが魚を操作する。または、PositionController(Code Segment)により魚の座標のData SegmentであるfishPositionが更新される。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
29 \item fishPositionが魚のオブジェクトに座標をセットするためのCode Segment であるSetLocationにreplyされる。SetLocationが実行され画面に反映される。
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
30 \item 他のノードに更新されたfishPositionを送信するためのCode SegmentであるUpdateにfishPositionがreplyされる。
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
31 \item Updateに自分と接続されているノード一覧のData Segmentであるlistがreplyされる。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
32
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
33 \item Updateはlistを参照して、fishPositionを送信する。また、fishPositionには送信元の情報が付加されているので、送信元に対してfishPositionを送り返すことはない。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
34
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
35 \item 各clientで2 - 4 が実行され、fishPositionが全体で共有される。
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
36 \end{enumerate}
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
37
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
38 \begin{figure}[htbp]
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
39 \begin{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
40 \includegraphics[width=150mm]{fig/NodeToClient.pdf}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
41 \end{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
42 \caption{データの伝搬の様子}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
43 \label{fig:NodeToClient}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
44 \end{figure}
0
e248011df195 register repository
sugi
parents:
diff changeset
45
e248011df195 register repository
sugi
parents:
diff changeset
46
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
47 \section{バイトニックソート}
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
48 Aliceはマルチコアが現在に主流になっているという背景を踏まえて設計されている。従って並列処理に対するテストを行った。並列処理に対する例題としてバイトニックソートを実装した。
0
e248011df195 register repository
sugi
parents:
diff changeset
49
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
50
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
51 \subsection{処理の流れ}
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
52 指定された数の乱数を生成し、Sortを行う例題である。
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
53 また、図\ref{fig:bitonicSort}はSortされるまでの流れをコラボレーションダイアグラムで示したものである。
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
54 \begin{enumerate}
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
55 \item SetTask (Code Segment)が乱数列を分割してarray1にputする。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
56 \item replyされたDataSegmentをSort (Code Segment)で昇順に整列させる。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
57 \item Sortで整列された数列を更に分割する。上半分をarray1-Fにputする。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
58 \item 下半分をarray1-Bにputする。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
59 \item SetTaskが分割した各数列(array2)に対して2 - 4を行う。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
60 \item replyされた2つのData Segment(array1-B、array2-F)を合体させ、整列させる。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
61 \item 整列の結果を結果の上半分をarray1-B、下半分をarray2-Fにputする。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
62 \item replyされた2つのData Segment(array1-F、array1-B)を合体させ、整列させる。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
63 \item 整列の結果を結果の上半分をarray1-F、下半分をarray1-Bにputする。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
64 \item array2に対しても操作 8 - 9 を行う。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
65 \item 6 - 10 を繰り返し行うことで全体がSortされる。
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
66 \end{enumerate}
0
e248011df195 register repository
sugi
parents:
diff changeset
67
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
68 \begin{figure}[htbp]
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
69 \begin{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
70 \includegraphics[width=150mm]{fig/bitonicSort.pdf}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
71 \end{center}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
72 \caption{Sortの様子}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
73 \label{fig:bitonicSort}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
74 \end{figure}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
75
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
76 \section{Aliceのバグ}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
77 データを静的な型に変換する際にMessagePackの使い方が誤っていたため、PermGen Errorを引き起こしていた。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
78
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
79
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
80 peekまたはtakeで取得したData SegmentはValueオブジェクトであるため、そのままでは使うことができない。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
81 そのため Data Segmentの型を変換する必要がある。それを提供するAPIにasClass()というものがある。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
82 このAPIはユーザーが一般的なクラスを IDLのように用いてデータを表現した場合に使用し、引数として変換したいClassを指定する。(ソースコード \ref{fig:use_asClass})
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
83
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
84
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
85 asClass内部のconvert(ソースコード \ref{fig:PermGenError})で実際に目的の型に変換するが、この際Message Pack のオブジェクトは渡されたClassに対してClass定義を行う。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
86 Class定義の情報はPermanent領域に保存される。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
87 同一オブジェクトであれば、一度定義を行えば次回以降変換する際に再び定義することはない。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
88 しかし、型変換を行うたびにMessagePackのオブジェクトをnewしていた。そのため型変換を行うたびにClassを定義を行なっていたため
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
89 Parmanent領域が減っていき、枯渇した際にエラーを引き起こしていた。現在はMessagePackのオブジェクトをSingletonパターンで記述しているためこのエラーは起きない。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
90
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
91 \begin{table}[htbp]
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
92 \lstinputlisting[label=fig:use_asClass, caption=asClassの使用例]{source/AsClass.java}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
93 \lstinputlisting[label=fig:PermGenError, caption=PermGen Errorを引き起こす]{source/PermGenError.java}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
94 \end{table}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
95
2
236628ffc497 chapter2 and chapter3
sugi
parents: 0
diff changeset
96 \subsection{注意すべき記述}
4
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
97 Aliceを記述する際に注意すべき記述がある。(ソースコード \ref{fig:NullPointerException})
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
98
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
99 Code Segmentを作成する際、コンストラクタ内でData Segmentを指定するsetKeyメソッドを呼ぶ。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
100 この際、setKey以降に処理を記述すると、その記述した処理が実行されない可能性がある。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
101
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
102 Code Segmentは内部で必要なData Segmentの数の数えている。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
103 Data Segmentが取得されるたびにこの値がデクリメントされていき、0になった時にThread Poolへ送られる仕組みとなっている。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
104 値が0であるかを確認するのは別スレッドであるため、setKey以降に処理を記述すると、その処理が途中であってもThread Poolへ送られてしまい、nullpointerexception等のエラーが起こる可能性がある。記述自体は一般的なjavaの記述であるため一見してわかるものではない。また、データの取得にかかる時間次第で、エラーが出たり、出なかったりするので非常に厄介である。
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
105 \begin{table}[htbp]
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
106 \lstinputlisting[label=fig:NullPointerException, caption=実行するとNullPointerExceptionを起こす]{source/NullPointerException.java}
3b3b014765a2 minor change
sugi
parents: 2
diff changeset
107 \end{table}