annotate paper/appendix1.tex @ 71:98a55a935619

describe slides without rpar
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Thu, 13 Feb 2014 13:02:59 +0900
parents 0644825c43ac
children 56e65e2b01c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \clearpage
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \addcontentsline{toc}{chapter}{付録}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 \appendix
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 \def\thesection{付録\Alph{section}}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \section{計測環境の構築}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
6 ウェブアプリケーションのベンチマークを行う際, サーバの設定に注意を払う必要がある.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
7 適切に設定を行わないと, サーバがボトルネックとなってしまい正しい結果が得られない.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
8 ウェブアプリケーションのベンチマークを行う際の注意点について述べる.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
10 データを受信したり送信したりするのは OS カーネルである.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
11 多くの TCP パケットを要求し, 各パケットのサイズが1500バイトといった大きなファイルを提供する場合,
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
12 ウェブアプリケーションというよりOSカーネルのテストになってしまう.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
14 接続には, HTTP Keep-Alivesを利用する.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
15 新しい TCP 接続を確立するのはとても遅く, OS カーネルによって行われる.
49
0a8d66c9ccd1 describe the impl
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
16 毎秒多くの新しい接続を作成するベンチマークを行うと, OSカーネルのテストとなってしまう.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
18 アプリケーションやOSカーネルが完全にハードウェアを使用できるようにするためにいくつか調整を行う必要がある.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
19 最初の問題は, ファイル記述子の欠如である.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
20 デフォルトはプロセスあたり, 1,024 files で非常に貧弱な結果しか得られない.
58
7403d5ee2c92 describe the benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
21 ファイル記述子の現在のリミットはソースコード\ref{ulimit} のコマンド取得できる.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
58
7403d5ee2c92 describe the benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
23 \begin{lstlisting}[label=ulimit, caption=ファイル記述子のリミットの取得]
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 $ ulimit -aH
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 \end{lstlisting}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
58
7403d5ee2c92 describe the benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
27 リミットを変更するには, ソースコード\ref{ulimit2} のコマンドを実行する.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
58
7403d5ee2c92 describe the benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
29 \begin{lstlisting}[label=ulimit2, caption=ファイル記述子のリミットの設定]
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 $ sudo sh -c ulimit -HSn 200000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 \end{lstlisting}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
33 再起動後も有効にするためには, システムファイルの編集を行う.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
35 /etc/security/limits.conf へソースコード\ref{limit}の記述を追加する.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
37 \begin{lstlisting}[label=limit, caption=リミットの設定の追加]
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 * soft nofile 200000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 * hard nofile 200000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 \end{lstlisting}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
42 次に問題となるのは listenキューの制限である.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
43 listen キューとは, 保留中のコネクションが繋がれるキューのことである.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
44 このキューの長さの制限が小さいと, 同時にたくさんのコネクション要求がきた場合, 制限を超えた要求を拒否する.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
45 listen キューや, その他の設定も含めてベンチマーク用にサーバの設定を変更する.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
47 /etc/sysctl.conf にソースコード\ref{sysctl}の記述を追加する.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
49 \newpage
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
50 \begin{lstlisting}[label=sysctl, caption=システム設定の変更]
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 fs.file-max = 5000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 net.core.netdev_max_backlog = 400000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 net.core.optmem_max = 10000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 net.core.rmem_default = 10000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 net.core.rmem_max = 10000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 net.core.somaxconn = 100000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 net.core.wmem_default = 10000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 net.core.wmem_max = 10000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 net.ipv4.conf.all.rp_filter = 1
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 net.ipv4.conf.default.rp_filter = 1
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 net.ipv4.ip_local_port_range = 1024 65535
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 net.ipv4.tcp_congestion_control = bic
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 net.ipv4.tcp_ecn = 0
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 net.ipv4.tcp_max_syn_backlog = 12000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 net.ipv4.tcp_max_tw_buckets = 2000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 net.ipv4.tcp_mem = 30000000 30000000 30000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 net.ipv4.tcp_rmem = 30000000 30000000 30000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 net.ipv4.tcp_sack = 1
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 net.ipv4.tcp_syncookies = 0
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 net.ipv4.tcp_timestamps = 1
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 net.ipv4.tcp_wmem = 30000000 30000000 30000000
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 net.ipv4.tcp_tw_reuse = 1
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 net.ipv4.tcp_tw_recycle = 1
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 \end{lstlisting}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
76 ファイルを保存後, 設定を反映させるにはソースコード\ref{sysctl2}のコマンドを実行する.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
78 \begin{lstlisting}[label=sysctl2, caption=設定の反映]
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 $ sudo sysctl -p /etc/sysctl.conf
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 \end{lstlisting}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
82 ベンチマークを行う際, 小さなテストでは妥当性が低くなってしまうので注意する.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
83 TCP/IPのスタックは保守的な方法で動作し, ダウンロード速度に合わせて徐々に速度を増大させるためである.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
85 また, テストするサーバより遅いベンチマーククライアントを用いると正しい結果は得られない.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
86 シングルスレッドで稼働したり, Ruby や Python といった低速なベンチマークツールでテストを行うと,
49
0a8d66c9ccd1 describe the impl
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
87 すべてのテストする対象が同じパフォーマンスを持っているように見えてしまう.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 \subsubsection{weighttp}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
90 ウェブアプリケーションの性能測定には, weighttpを用いる.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
91 weighttpはWebサーバの性能測定ツールで, マルチコアCPUを使ってテストできる\cite{weighttp}.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
92 また, livev を使うことで, モダンなポール・システムコールを利用し, 測定性能を向上できるといった特徴を持つ.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
93 同様の性能測定ツールには, Apache Benchやhttprefが存在するが非力であり, ボトルネックとなってしまうため使用しない.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
59
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
95 weighttp を起動するには, ソースコード\ref{weighttp}のコマンドを入力する.
0644825c43ac add ghc 7.6.3 benchmark
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
96 \begin{lstlisting}[label=weighttp, caption=weighttpの起動]
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 $ weighttp -n 1000000 -c 1000 -t 10 -k "http://bldsv12.cr.ie.u-ryukyu.ac.jp:3000"
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 \end{lstlisting}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
100 起動時には対象のサーバの URL を記述する他に, いくつかのオプションを指定できる.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 \begin{itemize}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 \item n ... HTTP リクエストの総数
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 \item c ... 同時に接続するコネクションの数
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 \item t ... 作製するネイティブスレッドの数
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 \item k ... HTTP Keep-Alives を有効にする
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 \end{itemize}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 \clearpage
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 \section{Warp を用いたウェブアプリケーションの構築}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
111 Warp は, 軽量・高速な HTTP サーバである\cite{warp}.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
112 Haskell の軽量スレッドを活かして書かれている.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
113 Haskell のウェブフレームワークである Yesod のバックエンドとして用いられており, 現在も開発が続けられている.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
115 Warp を用いてウェブアプリケーションを構築する方法について説明する.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 % Source Codeは実行可能な状態でsrcに置いてある
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
118 % firstline, lastlineで, どの範囲を表示するか指定できる
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 \lstinputlisting[label=warp_sample, caption=Warpを用いたウェブアプリケーションの例, firstline=9]{src/warp.hs}
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
121 ソースコード \ref{warp_sample}は, URLによって出力する結果を変更するウェブアプリケーションである.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
122 /hello/worldへアクセスがあった場合は, インクリメントされる counter が表示される.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 \paragraph*{main}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
125 HTTP サーバを起動するには, Warp の run 関数を利用する.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
126 run 関数は, 利用する Port 番号と, application というリクエストを受けて何かしらのレスポンスを返す関数の2つを引数として受け取る.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
128 関数型言語では, 関数を第一級オブジェクトとして扱える.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
129 また, 今回は Haskell のカリー化された関数の特性を利用し, main 内で作成した IORef 型の counter を部分適用させている.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
131 IORef を用いることで, Haskell で更新可能な変数を扱うことができる.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
132 参照透過性を失うようにみえるが, Haskell は IO モナドを利用することで純粋性を保っている.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
133 IORef 自体が入出力を行うわけではなく, 単なる入出力操作の指示にすぎない.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
134 IO モナドとして糊付けされた単一のアクションに main という名前を付けて実行することで処理系が入出力処理を行う.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 \paragraph*{application 及び routes , findRoute}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
137 application の実装では, routes という関数を独自に定義して, URL によって出力を変更している.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
138 application に渡されるリクエストはデータ型で様々な情報が含まれている.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
139 その中のひとつに pathInfo という, URL から hostname/port と, クエリを取り除いたリストがある.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
140 この情報を routes という関数に渡すことで, routeSetting というリストから一致する URL がないか調べる.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
141 routeSetting は, URL のリストとレスポンスを返す関数のタプルのリストである.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 \paragraph*{notFound 及び hello}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
144 レスポンスを返す関数は, いくつか定義されている.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
145 その中で利用されている responseLBS は文字列からレスポンスを構築するためのコンストラクタである.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 \paragraph*{world 及び incCount}
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
148 world は, インクリメントされる counter を表示するための関数である.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
149 IORef 内のデータは直接触ることができないため, incCount 内で atomicModifyIORef を利用してデータの更新を行なっている.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
150 atomicModifyIORef は, データの更新をスレッドセーフに行うことができる.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
151 また, responseLBSで構築したレスポンスは, Resource Tというリーソスの解放を安全に行うために使われるモナドに包まれている.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
152 lift 関数を用いて, incCountの型を持ち上げ調整している.
35
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
47
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
155 プログラムを例にして説明したが, Warp は容易にプログラムに組み込むことができる.
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
156 本研究では, 非破壊的木構造データベース Jungle と Warp を組み合わせて, 掲示板ウェブアプリケーションを開発した.