annotate paper/chapter1.tex @ 18:d2eeb833c75e

modify chapter2
author sugi
date Tue, 27 Jan 2015 20:38:25 +0900
parents 675939a7f983
children 6b470aab9a41
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
295b393a7134 first commit
sugi
parents:
diff changeset
1 \chapter{分散フレームワーク Alice の概要} \label{chapter:chapter1}
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
2
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
3 \section{Aliceの計算モデル}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
4 \subsection{Data SegmentとCode Segment}\label{subsection:computation}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
5 AliceはデータをData Segment、タスクをCode Segmentという単位に分割してプログラミングを行なう。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
6 Code SegmentはInput Data SegmentとOutput Data Segmentを持つ(図 \ref{fig:dsandcs})。Input Data SegmentはそのCode Segmentを実行するために必要なデータ群であり、Output Data SegmentはCode Segmentが計算を行った結果を格納するデータ群である。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
7
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
8
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
9 Data SegmentはAliceが内部にもつデータベースによって管理されている。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
10 Input Data Segmentを取得する際とOutput Data Segmentを保存する際にデータベースに通信を行う。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
11 取得するData SegmentはData Segmentに対して一意であるKEYを用いて指定する。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
12 Input Data Segmentの取得に失敗した場合、Code SegmentはDatabaseでData Segmentの待ち合わせを行う。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
13 Input Data Segmentが揃った場合にCode Segmentは実行される。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
14
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
15
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
16 \begin{figure}[htbp]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
17 \begin{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
18 \includegraphics[width=100mm]{images/dsandcs.pdf}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
19 \end{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
20 \caption{Code SegmentはInput Data Segment とOutput Data Segmentが存在する}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
21 \label{fig:dsandcs}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
22 \end{figure}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
23
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
24 Code Segmentに依存するデータ群であると出力されるデータ群を記述することにより、Code Segmentが実行される順番が決定される(図 \ref{fig:dsandcs2})。データの依存関係にないCode Segmentは並列実行が可能であるため、並列度を上げるためにはCode Segmentの処理内容を細かく分割して依存するデータを少なくするのが望ましい。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
25
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
26
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
27 \begin{figure}[htbp]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
28 \begin{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
29 \includegraphics[width=110mm]{images/dsandcs2.pdf}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
30 \end{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
31 \caption{Input Data Segment とOut put Data SegmentがCode Segment間の依存関係を自動的に記述する}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
32 \label{fig:dsandcs2}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
33 \end{figure}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
34
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
35 \subsection{ComputationとMeta Computation}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
36 Aliceのcomputationは\ref{subsection:computation}で示したように、keyで指し示されるData Segmentを待ち合わせてCode Segmentを実行させるというものである。アプリケーションを作成するためにはアルゴリズムをAliceのComputationで表現する必要がある。しかし、アプリケーションを作成するためにはAliceのComputationで表現するだけでは足りない。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
37
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
38 例えば、AliceはData SegmentをDatabaseにMemory上に書き出してるが、書き出す際にMemoryが不足していた場合どうするのかといったメモリ管理の問題がある。これはアプリケーションに直接関係しているわけではないが、Aliceを動作させるために必要なcomputationである。このcomputationを設定することのできるcomputationがmeta computationである。
2
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
39
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
40 今回Aliceにmeta computationを追加した。Aliceでmeta computationを表現するので、当然Code SegmentとData Segmentで表現される
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
41
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
42
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
43 \section{Aliceの実装}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
44 \subsection{Data Segment}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
45 Data Segmentは数値や文字列などのデータを構造的に保持する。AliceはData Segmentをデータベースとして扱っている。Data Segmentには必ず対になるKeyが存在する。つまりKey Value Storeとして考える事ができる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
46
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
47 Aliceのデータベースは通常のKVSとは異なっている点がある。通常のKVSはプログラミング言語の連想配列やMapと同様に 「Key(キー)」と「Value(値)」がペアとなっている。そのため1つのKeyに対して値は1つである。しかし、Aliceの場合は「Key」と「Queue」がペアとなっているため、Keyに対して複数回putできる。従って取得できるValueも複数存在する。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
48
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
49 Data SegmentはData Segment Manager(以下DSM)によって管理されている。ノード毎にLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のKVSとなっている。従ってRemote DSMを指定するKeyはノード内部でuniqueなものである。Remote DSMは他のノードのLocal DSMのproxyと考えられる。つまりRemote DSMは複数存在し、それぞれに対応するノードは異なる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
50
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
51 \begin{figure}[htbp]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
52 \begin{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
53 \includegraphics{images/remote_datasegment.pdf}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
54 \end{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
55 \caption{Remote DSMは他のノードのLocal DSMのproxy }
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
56 \label{fig:RemoteDSM}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
57 \end{figure}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
58
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
59 KVSへのアクセスはqueueによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread Poolにより並列実行される。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
60 \subsubsection{Data Segment の表現}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
61 Data Segmentの表現にはMessage Packを利用している。Message Packに関してJavaにおけるデータ表現は以下の3種類があり、制限を伴うが互いに変換可能である。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
62 \begin{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
63 \item {\ttfamily 一般的なJavaのクラスオブジェクト}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
64 \item {\ttfamily MessagePack for JavaのValueオブジェクト}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
65 \item {\ttfamily byte[]で表現されたbinary}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
66 \end{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
67
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
68 Data Segment APIの内部においてデータは、一般的なJavaのクラスオブジェクトまたはbyteArrayで表現されたbinaryで表現されている。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
69 Localからデータがputされた場合は一般的なJavaのクラスオブジェクトの状態でenqueueされる。RemoteからデータがputされるとbyteArrayで表現されたbinaryの状態でenqueueされる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
70
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
71 ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
72 この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。もちろん、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
73
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
74 Remoteに対してputできるデータは、@MessageをもつクラスオブジェクトかMessage Packで扱える型に限られる。
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
75
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
76 \subsection{Data Segment API}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
77 \subsection{Code Segment}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
78 Code SegmentとはAlice上で実行されるタスクの単位である。ユーザーはCode Segmentを組み合わせることでプログラミングを行う。Code Segmentをユーザーが記述する際に、内部で使用するData Segmentの作成を記述する。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
79
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
80 Input Data Segment と Output Data SegmentはCode Segmentに用意されているAPIを用いて作成する。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
81 Input Data Segmentは、LocalかRemoteか、またkeyを指定する必要がある。Code Segmentは、記述したInput Data Segmentが全て揃うとThread poolに送られ、実行される。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
82
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
83 Output Data SegmentもLocalかRemoteか、またkeyを指定する必要がある。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
84 Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
85 しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
86
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
87
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
88
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
89 \subsubsection{Code Segmentの実行方法}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
90 Alice には、Start Code Segment (ソースコード \ref{src:StartCodeSegment})というC の main に相当するような最初に実行される Code Segment がある。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
91 \begin{table}[html]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
92 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
93 \end{table}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
94
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
95 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
96 このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
97
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
98
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
99 \subsubsection{Code Segmentの記述方法}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
100 Code Segmentをユーザーが記述する際にはCode Segmentを継承して記述する(ソースコード \ref{src:CodeSegment})。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
101 Code SegmentはInput/Output Data Segment Managerを利用することができる。
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
102
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
103 Input DSM はCode Segmentの{\tt ids}というフィールドを用いてアクセスする。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
104
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
105 \begin{table}[html]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
106 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
107 \end{table}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
108
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
109 \begin{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
110 \item {\ttfamily Receiver create(CommandType type)}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
111 \end{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
112 createでコマンドが実行された際に取得されるData Segmentが格納される受け皿を作る。引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
113 \begin{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
114 \item \verb+void setKey(String managerKey, String key)+
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
115 \end{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
116 setKeyメソッドにより、どこのData Segmentのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定することができる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
117 コマンドの結果がレスポンスとして届き次第Code Segmentは実行される。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
118
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
119 Output DSMはCode Segmentの{\tt ods}というフィールドを用いてアクセスする。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
120 Output DSMは{\tt put}または{\tt update}を実行することができる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
121 \begin{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
122 \item \verb+void put(String managerKey, String key, Object val)+
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
123 \item \verb+void update(String managerKey, String key, Object val)+
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
124 \end{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
125
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
126 %
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
127 \subsection{Meta Data Segment}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
128 %
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
129 \subsection{Meta Code Segment}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
130
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
131 \subsection{Topology Manager}
2
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
132 Aliceは複数のノードで構成され、相互に接続される。通信するノードはURLにより直接指定するのではなくTopology Managerで管理する。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
133 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきTopology NodeのIPアドレス、ポート番号、接続名を送りトポロジーファイルに記述されたとおりにトポロジーを作成する。(図\ref{fig:topologymanager})
2
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
134
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
135 \begin{figure}[htbp]
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
136 \begin{center}
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
137 \includegraphics[width=70mm]{images/topologymanager.pdf}
2
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
138 \end{center}
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
139 \caption{Topology Manager はトポロジーファイルの記述に従ってトポロジーを生成する}
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
140 \label{fig:topologymanager}
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
141 \end{figure}
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
142
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
143 Code Segment内部でRemote DSMにアクセスする場合はToplogyManagerによって指定されたノード内部だけで有効なlabel(文字列)を使う。これにより特定のURLがCode Segment内部に記述されることを防いでいる。
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
144
15
930eae4e8aeb modify introduction
sugi
parents: 14
diff changeset
145 トポロジーファイルはグラフ構造を表現するデータ記述する言語の一種であるDOT Languageと呼ばれる言語で記述する。また、dotコマンドを用いてトポロジーファイルを可視化することができる。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
146
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
147 \subsubsection{Topology Managerの参加表明処理}
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
148 Topology Managerへの参加表明は、Topology Node起動時にコマンドライン引数からTopology ManagerのIPアドレスとポート番号を指定すればよい。
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
149 指定されたTopology Managerに接続を行うと、Topology Manager側のキー"hosts"に、自分自身のIPアドレスとポート番号をputする。
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
150
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
151 参加表明を受け取ったTopology Managerは、抽象名を参加表明したTopology Nodeのキー"host"にputする。
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
152 その後、Topology Manager上のTopology Node名のキーに、接続すべきTopology Nodeの情報(IP アドレス、ポート番号等)を全てputする。Topology Nodeは、その情報を1つずつTakeし接続処理を行う。全ての接続処理が終わるとTopology ManagerからTopology Nodeに対してStart Code Segmentの実行命令が出され、アプリケーションが開始される。
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
153
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
154 \begin{figure}[htbp]
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
155 \begin{center}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
156 \includegraphics[width=120mm]{images/topologymanagerandnode.pdf}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
157 \end{center}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
158 \caption{Topology ManagerとTopology Node間の通信}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
159 \label{fig:topologymanagerandnode}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
160 \end{figure}
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
161
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
162
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
163 \section{Aliceによるプログラミング手法}
14
b9b3f2241ab4 modify chapter2
sugi
parents: 5
diff changeset
164 AliceはCode SegmentとData Segmentによってプログラミングを行なう。Code Segmentから別にCode SegmentへData Segmentを引き渡す際、コンストラクタは使わない。Code SegmentがLocal / Remote Data Segmentに対してputを行い、別のCode SegmentがLocal / Remote Data Segmentに対してpeekを行うことで引き渡される。つまり、Code Segmentは実行前後にData Segmentへ通信が行われるのである。この通信の順序がCode Segmentの実行順序を決定している。
b9b3f2241ab4 modify chapter2
sugi
parents: 5
diff changeset
165 すなわち、Aliceによるプログラミングとは通信の管理を行うことであり、プロトコルを設計することと捉える事ができる。