touch で作成する
<div class="outline-text-3" id="text-2-2">
<p>
Unix のコマンド touch で作成する.
</p>
<ul class="org-ul">
<li>
<a href="http://ja.wikipedia.org/wiki/Touch_(UNIX)">touch (UNIX) – Wikipedia</a>
</li>
</ul>
<p>
[sourcecode language=”bash” title=”” ]<br /> touch /home/tsu-nera/tmp/test<br /> [/sourcecode]
</p>
</div>
<div id="outline-container-sec-2-2-1" class="outline-4">
<h4 id="sec-2-2-1">
touch のソースを眺める
</h4>
<div class="outline-text-4" id="text-2-2-1">
<p>
GNU coreutils のソースを眺める.
</p>
<ul class="org-ul">
<li>
<a href="https://github.com/goj/coreutils/blob/master/src/touch.c">https://github.com/goj/coreutils/blob/master/src/touch.c</a>
</li>
</ul>
<p>
そして,fd_reopen という関数の中で open/close が利用されている. <a href="https://github.com/goj/coreutils/blob/master/lib/fd-reopen.c">https://github.com/goj/coreutils/blob/master/lib/fd-reopen.c</a>
</p>
</div>
</div>
<div id="outline-container-sec-2-2-2" class="outline-4">
<h4 id="sec-2-2-2">
strace でみてみる
</h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
プログラムが使用するシステムコールおよび受け取るシグナルを監視するツール.
</p>
<ul class="org-ul">
<li>
<a href="http://ja.wikipedia.org/wiki/Strace">strace – Wikipedia</a>
</li>
</ul>
<p>
[sourcecode language=”text” title=”” ]<br /> strace touch /home/tsu-nera/tmp/test<br /> [/sourcecode]
</p>
<p>
こうなった.
</p>
<p>
[sourcecode language=”text” title=”” ]<br /> execve (“/usr/bin/touch”, [“touch”, “/home/tsu-nera/tmp/test”], [/* 50 vars */]) = 0<br /> brk (0) = 0x6ce000<br /> access (“/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory)<br /> open (“/usr/local/lib/tls/x86_64/libc.so.6”, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (“/usr/local/lib/tls/x86_64”, 0x7ffffbbac6d0) = -1 ENOENT (No such file or directory)<br /> open (“/usr/local/lib/tls/libc.so.6”, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (“/usr/local/lib/tls”, 0x7ffffbbac6d0) = -1 ENOENT (No such file or directory)<br /> open (“/usr/local/lib/x86_64/libc.so.6”, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (“/usr/local/lib/x86_64”, 0x7ffffbbac6d0) = -1 ENOENT (No such file or directory)<br /> open (“/usr/local/lib/libc.so.6”, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (“/usr/local/lib”, {st_mode=S_IFDIR|0755, st_size=4096, …}) = 0<br /> open (“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 4<br /> fstat (4, {st_mode=S_IFREG|0644, st_size=166490, …}) = 0<br /> mmap (NULL, 166490, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7f042abdd000<br /> close (4) = 0<br /> open (“/usr/lib/libc.so.6”, O_RDONLY|O_CLOEXEC) = 4<br /> read (4, “\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\1\2\0\0\0\0\0″…, 832) = 832<br /> fstat (4, {st_mode=S_IFREG|0755, st_size=1984416, …}) = 0<br /> mmap (NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f042abdc000<br /> mmap (NULL, 3813200, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7f042a642000<br /> mprotect (0x7f042a7db000, 2097152, PROT_NONE) = 0<br /> mmap (0x7f042a9db000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x199000) = 0x7f042a9db000<br /> mmap (0x7f042a9e1000, 16208, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f042a9e1000<br /> close (4) = 0<br /> mmap (NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f042abdb000<br /> mmap (NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f042abda000<br /> arch_prctl (ARCH_SET_FS, 0x7f042abdb700) = 0<br /> mprotect (0x7f042a9db000, 16384, PROT_READ) = 0<br /> mprotect (0x60d000, 4096, PROT_READ) = 0<br /> mprotect (0x7f042ac06000, 4096, PROT_READ) = 0<br /> munmap (0x7f042abdd000, 166490) = 0<br /> brk (0) = 0x6ce000<br /> brk (0x6ef000) = 0x6ef000<br /> open (“/usr/lib/locale/locale-archive”, O_RDONLY|O_CLOEXEC) = 4<br /> fstat (4, {st_mode=S_IFREG|0644, st_size=2581856, …}) = 0<br /> mmap (NULL, 2581856, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7f042a3cb000<br /> close (4) = 0<br /> open (“/home/tsu-nera/tmp/test”, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 4<br /> dup2 (4, 0) = 0<br /> close (4) = 0<br /> utimensat (0, NULL, NULL, 0) = 0<br /> close (0) = 0<br /> close (1) = 0<br /> close (2) = 0<br /> exit_group (0) = ?<br /> +++ exited with 0 +++<br /> [/sourcecode]
</p>
<p>
見にくいので, 統計情報を出力する.
</p>
<p>
あるディレクトリ配下にファイルを作成すだけでも, 結構な数のシステムコールが呼ばれていることが分かる.
</p>
<p>
[sourcecode language=”text” title=”” ]<br /> [tsu-nera]% strace -c touch /home/tsu-nera/tmp/test<br /> % time seconds usecs/call calls errors syscall<br /> —— ———– ———– ——— ——— —————-<br /> 0.00 0.000000 0 1 read<br /> 0.00 0.000000 0 8 4 open<br /> 0.00 0.000000 0 7 close<br /> 0.00 0.000000 0 4 3 stat<br /> 0.00 0.000000 0 3 fstat<br /> 0.00 0.000000 0 8 mmap<br /> 0.00 0.000000 0 4 mprotect<br /> 0.00 0.000000 0 1 munmap<br /> 0.00 0.000000 0 3 brk<br /> 0.00 0.000000 0 1 1 access<br /> 0.00 0.000000 0 1 dup2<br /> 0.00 0.000000 0 1 execve<br /> 0.00 0.000000 0 1 arch_prctl<br /> 0.00 0.000000 0 1 utimensat<br /> —— ———– ———– ——— ——— —————-<br /> 100.00 0.000000 44 8 total<br /> [/sourcecode]
</p>
</div>
</div>
C 言語 ライブラリで実装してみる
<div class="outline-text-3" id="text-2-3">
<p>
C 言語で ファイル操作を行うために, fopen, fclose を利用する.
</p>
<ul class="org-ul">
<li>
<a href="http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/fopen.3.html">Man page of FOPEN</a>
</li>
<li>
<a href="http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/fclose.3.html">Man page of FCLOSE</a>
</li>
</ul>
<p>
[sourcecode language=”c” title=”” ]<br /> #include <stdio.h><br /> int main (void)<br /> {<br /> FILE *fp;<br /> fp = fopen (“/home/tsu-nera/tmp/test”, “w”);<br /> fclose (fp);<br /> return 0;<br /> }<br /> [/sourcecode] </div> </div>
<div id="outline-container-sec-2-4" class="outline-3">
<h3 id="sec-2-4">
C 言語 システムコールで実装してみる
</h3>
<div class="outline-text-3" id="text-2-4">
<p>
では, 本題. opne/close を利用する.
</p>
<ul class="org-ul">
<li>
<a href="http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/open.2.html">Man page of OPEN</a>
</li>
<li>
<a href="http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/close.2.html">Man page of CLOSE</a>
</li>
</ul>
<p>
fopen と open の違いはここがわかりやすかった.
</p>
<ul class="org-ul">
<li>
<a href="http://d.hatena.ne.jp/skyjoker/20130102/1357093289">fopen (高水準入出力) と open (低水準入出力) の違い – skyjoker (飛びます)</a>
</li>
</ul>
<p>
[sourcecode language=”c” title=”” ]<br /> #include <sys/types.h><br /> #include <sys/stat.h><br /> #include <fcntl.h><br /> #include <unistd.h>
</p>
<p>
int main (void)<br /> {<br /> int fd;<br /> fd = open (“/home/tsu-nera/tmp/test”, O_RDWR|O_CREAT, S_IREAD | S_IWRITE);<br /> close (fd);<br /> return 0;<br /> }<br /> [/sourcecode]
</p>
</div>
</div></div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">
ファイル書き込み
</h2>
<div class="outline-text-2" id="text-3">
<p>
ファイル新規作成を応用して, ファイルにデータを書き込んでみる.
</p>
</div>
<div id="outline-container-sec-3-1" class="outline-3">
<h3 id="sec-3-1">
やること
</h3>
<div class="outline-text-3" id="text-3-1">
<p>
/home/tsu-nera/tmp 配下に test という 1MB の ファイルを新規作成する.
</p>
</div>
</div>
<div id="outline-container-sec-3-2" class="outline-3">
<h3 id="sec-3-2">
dd でやってみる
</h3>
<div class="outline-text-3" id="text-3-2">
<p>
Unix コマンドの dd を利用して, 1MB のファイルを作成する.
</p>
<p>
[sourcecode language=”bash” title=”” ]<br /> dd if=/dev/urandom of=/home/tsu-nera/tmp/test count=1024 bs=1024<br /> [/sourcecode]
</p>
</div>
<div id="outline-container-sec-3-2-1" class="outline-4">
<h4 id="sec-3-2-1">
dd コマンドのソースをながめる
</h4>
<div class="outline-text-4" id="text-3-2-1">
<p>
GNU coreutils のソースを眺める.
</p>
<ul class="org-ul">
<li>
<a href="https://github.com/goj/coreutils/blob/master/src/dd.c">https://github.com/goj/coreutils/blob/master/src/dd.c</a>
</li>
</ul>
<p>
たとえば以下のように write 関数が利用されている.
</p>
<p>
[sourcecode language=”c” title=”” ]<br /> while (total_written < size) { ssize_t nwritten; process_signals (); nwritten = write (fd, buf + total_written, size - total_written); if (nwritten < 0) { if (errno != EINTR) break; } else if (nwritten == 0) { /* Some buggy drivers return 0 when one tries to write beyond a device's end. (Example: Linux kernel 1.2.13 on /dev/fd0.) Set errno to ENOSPC so they get a sensible diagnostic. */ errno = ENOSPC; break; } else total_written += nwritten; } [/sourcecode] </div> </div> </div>
<div id="outline-container-sec-3-3" class="outline-3">
<h3 id="sec-3-3">
C 言語 ライブラリで実装してみる
</h3>
<div class="outline-text-3" id="text-3-3">
<p>
fwrite 関数で書き込む.
</p>
<ul class="org-ul">
<li>
<a href="http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/fwrite.3.html">Man page of FREAD</a>
</li>
</ul>
<p>
[sourcecode language=”c” title=”” ]<br /> #include <stdio.h><br /> #include <stdlib.h>
</p>
<p>
#define WRITE_SIZE 1024<br /> #define WRITE_COUNT 1024
</p>
<p>
int main (void)<br /> {<br /> int i;<br /> char r[WRITE_SIZE];<br /> FILE *fp;
</p>
<p>
// generate random value<br /> for (i = 0; i < WRITE_SIZE; i++) { r[i] = rand (); } // open fp = fopen ("/home/tsu-nera/tmp/test", "w"); // write for (i = 0; i < WRITE_COUNT; i++) { fwrite (r, sizeof (char), WRITE_SIZE, fp); } // close fclose (fp); return 0; } [/sourcecode] </div> </div>
<div id="outline-container-sec-3-4" class="outline-3">
<h3 id="sec-3-4">
C 言語 システムコールで実装してみる
</h3>
<div class="outline-text-3" id="text-3-4">
<p>
write 関数で書き込む.
</p>
<ul class="org-ul">
<li>
<a href="http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/write.2.html">Man page of WRITE</a>
</li>
</ul>
<p>
[sourcecode language=”c” title=”” ]<br /> #include <sys/types.h><br /> #include <sys/stat.h><br /> #include <fcntl.h><br /> #include <unistd.h><br /> #include <stdlib.h>
</p>
<p>
#define WRITE_SIZE 1024<br /> #define WRITE_COUNT 1024
</p>
<p>
int main (void)<br /> {<br /> int i;<br /> int fd;<br /> char r[WRITE_SIZE];
</p>
<p>
// generate random value<br /> for (i = 0; i < WRITE_SIZE; i++) { r[i] = rand (); } // open fd = open ("/home/tsu-nera/tmp/test", O_RDWR|O_CREAT, S_IREAD|S_IWRITE); // write for (i = 0; i < WRITE_COUNT; i++) { write (fd, r, WRITE_SIZE); } // close close (fd); return 0; } [/sourcecode] </div> </div> </div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">
Special Thanks
</h2>
<div class="outline-text-2" id="text-4">
<ul class="org-ul">
<li>
<a href="http://www.atmarkit.co.jp/ait/articles/1111/16/news161.html">知ってトクするシステムコール (1):システムコールについてどれくらいご存じですか? (1/2) – @ IT</a>
</li>
<li>
<a href="http://linuxc.info/file/file1/">LinuxC | ファイルのオープン, クローズ</a>
</li>
<li>
<a href="http://curtaincall.weblike.jp/portfolio-unix/api.html">システムコールを理解する | UNIX world</a>
</li>
</ul>
</div>
</div>
TCP の性能を測定する必要があるので,
性能の指標と測定方法について調べてみたまとめです.
特性を表す代表的な数値は以下.
- 帯域幅 (bandwidth)
- 遅延時間 (latency/RTT)
- スループット
帯域幅 (bandwidth)
一定時間に通過できるデータ量.
Windows パフォーマンスモニタでの計測.
Windows 標準でついているツール.
BitMeter OS での計測.
Web 上で結果が見られる.
遅延時間 (latency)
デバイスに対してデータ転送などを要求してから,
その結果が返送されるまでの遅延時間のこと.
インターネットにおける往復レイテンシについては ラウンドトリップタイム
(Round Trip Time, RTT) とも呼ばれる.
遅延 (レイテンシ) というものは 1 パケットとその ACK
(受け取ったという応答) の往復にかかる所要時間 RTT (Round-Trip-Time)
で見る.
伝送経路での個々のパケットの時間遅れ. データ経路の長さ (遠さ)
と考えると良い. 究極的には “距離÷光速” だけの時間遅れがある.
RTT
パケットを送信して受信した側が送信側に ACK パケットを送り,
送信側でそれを受取るまでの時間.
TCP での通信に関しては, ラウンドトリップタイムはセグメント送信と ACK
受信の間の時間を計測することによる 3 ウェイ・ハンドシェイクで計算される.
パケットを送信して受信した側が送信側に ACK パケットを送り,
送信側でそれを受取るまでの時間.
ping を利用して RTT を計測
C:\Users\tsu-nera>ping www.google.co.jp
www.google.co.jp [173.194.117.183] に ping を送信しています 32 バイトのデータ:
173.194.117.183 からの応答: バイト数 =32 時間 =11ms TTL=55
173.194.117.183 からの応答: バイト数 =32 時間 =20ms TTL=55
173.194.117.183 からの応答: バイト数 =32 時間 =10ms TTL=55
173.194.117.183 からの応答: バイト数 =32 時間 =10ms TTL=55
173.194.117.183 の ping 統計:
パケット数: 送信 = 4, 受信 = 4, 損失 = 0 (0% の損失),
ラウンド トリップの概算時間 (ミリ秒):
最小 = 10ms, 最大 = 20ms, 平均 = 12ms
pathping を利用して RTT を計測
Windows のコマンド. ping をよくしたもの.
C:\Users\tsu-nera>pathping www.google.co.jp
www.google.co.jp [173.194.126.216] へのルートをトレースしています
経由するホップ数は最大 30 です:
0 Lets-Win8 [192.168.11.7]
1 192.168.11.1
2 kanagawa12-3.ntt-poi.FreeBit.NET [220.150.74.5]
3 1.74.150.220.ap.yournet.ne.jp [220.150.74.1]
4 43.244.2.61
5 ae0.31.TR1.B9A.FreeBit.NET [219.99.124.178]
6 ae0.109.TR1.B9A.FreeBit.NET [219.99.88.77]
7 210.173.176.243
8 209.85.249.64
9 * 72.14.232.99
10 nrt04s07-in-f24.1e100.net [173.194.126.216]
統計を 250 秒間計算しています...
ソースからここまで このノード/ リンク
ホップ RTT 損失/ 送信 = Pct 損失/ 送信 = Pct アドレス
0 Lets-Win8 [192.168.11.7]
0/ 100 = 0% |
1 5ms 0/ 100 = 0% 0/ 100 = 0% 192.168.11.1
0/ 100 = 0% |
2 11ms 0/ 100 = 0% 0/ 100 = 0% kanagawa12-3.ntt-poi.FreeBit.NET [
220.150.74.5]
0/ 100 = 0% |
3 8ms 0/ 100 = 0% 0/ 100 = 0% 1.74.150.220.ap.yournet.ne.jp [220
.150.74.1]
0/ 100 = 0% |
4 14ms 0/ 100 = 0% 0/ 100 = 0% 43.244.2.61
0/ 100 = 0% |
5 16ms 5/ 100 = 5% 5/ 100 = 5% ae0.31.TR1.B9A.FreeBit.NET [219.99
.124.178]
0/ 100 = 0% |
6 15ms 0/ 100 = 0% 0/ 100 = 0% ae0.109.TR1.B9A.FreeBit.NET [219.9
9.88.77]
2/ 100 = 2% |
7 18ms 5/ 100 = 5% 3/ 100 = 3% 210.173.176.243
0/ 100 = 0% |
8 24ms 2/ 100 = 2% 0/ 100 = 0% 209.85.249.64
1/ 100 = 1% |
9 --- 100/ 100 =100% 97/ 100 = 97% 72.14.232.99
0/ 100 = 0% |
10 15ms 3/ 100 = 3% 0/ 100 = 0% nrt04s07-in-f24.1e100.net [173.194
.126.216]
トレースを完了しました.
スループット
理論的に実現可能な TCP の最大転送速度.
スループット (bps) = TCP ウィンドウサイズ (KB) * 8 / RTT (S)
ping で RTT を調べたら, x 2 をすることを忘れない.
ウィンドウサイズが 64K バイトの場合の TCP
最大スループットの理論値は以下のとおり
RTT 1msec のとき 512Mbps
RTT 5msec のとき 102.4Mbps
RTT 10msec のとき 51.2Mbps
RTT 15msec のとき 34.1Mbps
RTT 20msec のとき 25.6Mbps
RTT 50msec のとき 10.24Mbps
RTT 100msec のとき 5.12Mbps
RTT 200msec のとき 2.56Mbps

Emacs から Eclipse を利用するためにつかうのが Eclim. 動くまで少しハマったので, インストール方法をメモ.
前回の記事は以下.
eclim
インストーラがあるので, ダウンロードする.
コマンドプロンプトから以下で起動.または, ダブルクリックでも起動した.
[sourcecode language=”text” title=”” ]
$ java -jar eclim_2.4.0.jar
[/sourcecode]
インストーラの指示にしたがいインストール.
eclim-emacs
Emacs から利用するためには, eclim-emacs を入れる.
設定ファイルに以下を追記.
[sourcecode language=”elisp” title=”” ]
(require ‘eclim)
(global-eclim-mode)
[/sourcecode]
使い方
デーモン起動.
<div class="outline-text-3" id="text-3-1">
<p>
インストールが完了すると, Eclipse のフォルダに, eclimd.bat があるのでダブルクリックで起動する.
</p>
<p>
これで, eclim デーモンが起動する. 127.0.0.1 の port 9091 で起動する.
</p>
</div>
Emacs からアクセス
<div class="outline-text-3" id="text-3-2">
<p>
Cygwin 上の Emacs から利用するならば, 以下を追加. パスは各自の設定で.
</p>
<p>
[sourcecode language=”emacs-lisp” title=”” ]<br /> (setq eclim-eclipse-dirs “/cygdrive/c/eclipse/luna”)<br /> (setq eclim-executable “/cygdrive/c/eclipse/luna/eclim.bat”)<br /> (setq eclim-port 9091)<br /> [/sourcecode]
</p>
<p>
GUI 上の Emacs から利用するならば, 以下を追加. bat ファイルを Emacs から直接実行できなかった.
</p>
<p>
[sourcecode language=”emacs-lisp” title=”” ]<br /> (setq eclim-eclipse-dirs “C:/eclipse/luna”)<br /> (setq eclim-executable “C:/eclipse/luna/ng.exe –nailgun-port 9091 org.eclim.command.Main”)<br /> (setq eclim-port 9091)<br /> [/sourcecode]
</p>
</div>
coursera で受けている, POSA の講義で出てきた Reactor Pattern について調べてみたまとめです.
Reactor Pattern とは
イベント駆動のためのデザインパターン.
[sourcecode language=”text” title=”” ]
The reactor design pattern is an event handling pattern
for handling service requests delivered concurrently
to a service handler by one or more inputs.
[/sourcecode]
特徴
<div class="outline-text-3" id="text-1-1">
<ul class="org-ul">
<li>
イベント (入力データ) を, 処理や状態を表すハンドラ (メソッド or サブクラス) にディスパッチ (結びつける) する.
</li>
<li>
ハンドラごとに責務を分割できるので OOP 向き.
</li>
<li>
ハンドラ以外の部分はフレームワークに隠蔽されていることがおおい.
</li>
</ul>
<p>
EventMachine は Reactor パターンの高性能な実装さ.
</p>
<ul class="org-ul">
<li>
<a href="http://keijinsonyaban.blogspot.jp/2010/12/eventmachine.html">見えないチカラ: 【翻訳】 EventMachine 入門</a>
</li>
</ul>
<p>
Android は状態ごとにハンドラが呼び出される.
</p>
<ul class="org-ul">
<li>
onCreate ()
</li>
<li>
onResume ()
</li>
<li>
onDestory ()
</li>
</ul>
<p>
Spring Framework では, GET や POST の HTTP request は, それぞれ対応するメソッドにコールバックされる.
</p>
</div>
Structure
<div class="outline-text-3" id="text-1-2">
<ul class="org-ul">
<li>
Resources: 入力データ
</li>
<li>
Synchronous Event Demultiplexer:入力データを拾うためのイベントループ. シングルスレッドで loop していることが特徴 (Synchronous).
</li>
<li>
Dispatcher: ハンドラを管理する. Demultiplexer から通知を受けたら, Resource を Handler に Dispatch する (select など)
</li>
<li>
Handler: Resource に関連付けられた処理.
</li>
</ul>
</div>
Socket Programming における Reactor Pattern
Socket Programming ででてくる Reactor は, 狭義の Reactor Pattern のようだ.
特徴
<div class="outline-text-3" id="text-2-1">
<ul class="org-ul">
<li>
すべての処理をシングルスレッドで実施する.
</li>
<li>
マルチスレッドを利用しなくても, 非同期処理がかける.
</li>
<li>
スレッドやプロセス数の制限なしに, クライアントからの要求に答えることができる.
</li>
</ul>
</div>
実装方法
<div class="outline-text-3" id="text-2-2">
<ul class="org-ul">
<li>
ソケットを select で監視する. 読み取り可能, 書き込み可能なソケットのみに対して処理を実施する.
</li>
<li>
遅い回線があるときに, その回線に引きずられて Reactor が他の処理をできない. すべての処理が Blocking される.そんなときは, non-blocking write を利用する.
</li>
</ul>
</div>
sample
<div class="outline-text-3" id="text-2-3">
<p>
以下のリンクのサンプルをそのまま写経しました.
</p>
<ul class="org-ul">
<li>
<a href="http://gihyo.jp/dev/serial/01/ruby/0030archives/age=1">第 29 回 Reactor で非同期処理をやってみよう (1):Ruby Freaks Lounge|gihyo.jp … 技術評論社</a>
</li>
</ul>
<p>
[sourcecode language=”ruby” title=”” ]<br /> write_socks = hosts.map do |host|<br /> TCPSocket.new (host, 80)<br /> end<br /> read_socks = []
</p>
<p>
# handler<br /> write_proc = lambda{|sock|<br /> sock.write (request)<br /> }
</p>
<p>
# handler<br /> read_proc = lambda{|sock|<br /> sock.read<br /> sock.close<br /> }
</p>
<p>
# Reactor<br /> until (write_socks + read_socks).empty?
</p>
<p>
# Demultiplexer<br /> r_socks, w_socks, e_socks = IO.select (read_socks, write_socks)
</p>
<p>
# Dispatcher<br /> if ws = w_socks.first<br /> write_proc.call (ws)<br /> read_socks << ws write_socks.delete (ws) end # Dispatcher if rs = r_socks.first read_proc.call (rs) read_socks.delete (rs) end end [/sourcecode]
<p>
Working With TCP Socket における Reactor Pattern.
</p>
<ul class="org-ul">
<li>
<a href="http://futurismo.biz/archives/2572">TCP/IP ソケットプログラミングの基礎を集中学習! Working with TCP sockets を読んでる | Futurismo</a>
</li>
<li>
gist: <a href="https://gist.github.com/tsu-nera/0a0930175a3f23641848">https://gist.github.com/tsu-nera/0a0930175a3f23641848</a>
</li>
</ul></div> </div> </div>
13 Sep 2014, 12:32
coursera で受けている, POSA の講義で出てきた Wrapper Facade Pattern について調べてみたまとめです.
Wrapper Facade とは
ソケットなどの OS に依存するような native methods に対してラッパーライブラリを作成すること.
[sourcecode language=”text” title=”” ]
encapsulate low-level functions and data
structures with object-oriented (OO) class interfaces.
[/sourcecode]
メリット
以下のメリットがある.
-
Non-OOP 言語が OOP で利用できたり (Type-safe I/F)
-
OS 依存がなくなったり, (Portable)
-
コンパイル時にエラーをチェックする機能を作り込んだりして, API error-prone (誤りがちな) を防ぐ.
Facade や Bridge と異なり, 薄く, Light weight な実装でオーバヘッドがないことが特徴.
coursera の posa 講義で出てきたパターン. Doug 氏 の論文.
Ruby のソケットライブラリの例
Ruby の Socket Library がよい例. bind や listen を TCPServer メソッドで隠している. 言語レベルでサポートされていることが多い?
[sourcecode language=”ruby” title=”” ]
server = TCPServer.new (4481)
# =>
server = Socket.new (:INET, :STREAM)
addr = Socket.pack_sockaddr_in (4481, “0.0.0.0”)
server.bind (addr)
server.listen (5)
[/sourcecode]
31 Aug 2014, 15:42
はじめに
最近とみに OpenStack という単語をきくようになった.
OpenStack がなんなのか知らないと, 何だか日本人なのに納豆がきらいといって白々しい目で見られるような, 子供にそのうち石をなげられるような惨めさを感じる.
というわけで, OpenStack について調べ, さらにはインストールしてみる.
OpenStack とは
まずは, OpenStack とはなにか, しらべてみた.
OpenStack の特徴
<div class="outline-text-3" id="text-2-1">
<ul class="org-ul">
<li>
オープンソースで構成されるクラウド・インフラストラクチャー.
</li>
<li>
クラウドに・インフラに関わるすべてのことが, 共通化されて自動化される.
</li>
<li>
バイナリの API ではなく Web API で呼び出せるため, それぞれは独立性が担保され, 柔軟で開発しやすく使いやすい.
</li>
<li>
Apache ライセンスを採用.
</li>
<li>
IBM や HP など, 大企業が開発を牽引している.
</li>
<li>
AWS クラウド コンピューティングに対するロックイン回避
</li>
</ul>
</div>
<div id="outline-container-sec-2-1-1" class="outline-4">
<h4 id="sec-2-1-1">
20 年前の Linux のような存在
</h4>
<div class="outline-text-4" id="text-2-1-1">
<p>
Linux は OpenStack のように, オープンソースであることによって, 早い成長を遂げている.しかし, Linux とおなじではない.
</p>
<ul class="org-ul">
<li>
草の根 vs 大企業: Linux はコミュニティが作り, その後ベンダーに採用されたテクノロジ.
</li>
</ul>
<p>
OpenStack は商業的なプロジェクトで, その後コミュニティに公開されたもの.
</p>
<p>
<a href="https://jp.linux.com/news/linuxcom-exclusive/406215-lco201307029">リアリティ チェック: Openstack は第二の Linux ではない</a>
</p>
</div>
</div>
<div id="outline-container-sec-2-1-2" class="outline-4">
<h4 id="sec-2-1-2">
参考
</h4>
<div class="outline-text-4" id="text-2-1-2">
<ul class="org-ul">
<li>
<a href="http://ja.wikipedia.org/wiki/OpenStack">OpenStack – Wikipedia</a>
</li>
<li>
<a href="http://www.atmarkit.co.jp/ait/articles/1406/10/news039.html">NEC の柴田氏に聞く:OpenStack はなぜこれまで成功してきたのか – @ IT</a>
</li>
<li>
<a href="http://itpro.nikkeibp.co.jp/article/Keyword/20121029/433321/">Network キーワード – OpenStack とは:ITpro</a>
</li>
<li>
<a href="http://cloud.watch.impress.co.jp/docs/column/cloud/20140404_642748.html">【クラウド特捜部】プレーヤーがそろい表舞台に立つ OpenStack – クラウド Watch</a>
</li>
</ul>
</div>
</div>
OpenStack のアーキテクチャ
<div class="outline-text-3" id="text-2-2">
複数のサービスコンポーネントが Web ベースの RestAPI でつながっている. 詳細は, 別ページ参照.</p>
<ul class="org-ul">
<li>
<a href="http://thinkit.co.jp/story/2014/06/10/4999">OpenStack のアーキテクチャを理解しよう | Think IT (シンクイット)</a>
</li>
<li>
<a href="http://docs.openstack.org/ja/trunk/install-guide/install/apt-debian/content/ch_overview.html">第 1 章 アーキテクチャー – OpenStack インストールガイド Debian 7.0 (Wheezy) 版 – juno</a>
</li>
</ul>
</div>
OpenStack のインストール方法
OpenStack のインストール方法はいろいろあるようだ.
公式ページのインストール方法.
DevStack
<div class="outline-text-3" id="text-3-1">
簡単にインストールするためには, DevStack というものが有名なようだ.</p>
<ul class="org-ul">
<li>
<a href="http://devstack.org/">DevStack – Deploying OpenStack for Developers</a>
</li>
<li>
<a href="http://www.ospn.jp/press/20120828no27-useit-oss.html"> 「オープンソース」を使ってみよう (第 23 回 DevStack でラクラク導入!</a>
</li>
<li>
<a href="http://momijiame.tumblr.com/post/80665373356/vagrant-devstack-openstack">Vagrant と DevStack で OpenStack をサクッと試す | CUBE SUGAR STORAGE</a>
</li>
<li>
<a href="https://github.com/openstack-dev/devstack.git">https://github.com/openstack-dev/devstack.git</a>
</li>
</ul>
</div>
RDO
<div class="outline-text-3" id="text-3-2">
Linux ディストリビューションを VM 上に入れるという方法もある. RedHat が出している RDO というツールもある.</p>
<ul class="org-ul">
<li>
<a href="https://openstack.redhat.com/Main_Page">RDO</a>
</li>
<li>
<a href="http://momijiame.tumblr.com/post/80582413671/vagrant-rdo-openstack">Vagrant と RDO で OpenStack をサクッと試す | CUBE SUGAR STORAGE</a>
</li>
<li>
<a href="http://www.atmarkit.co.jp/ait/articles/1311/06/news004_2.html">Havana 登場! 何が変わった?/DevStack で Havana を試すには? (2/3) – @ IT</a>
</li>
</ul>
</div>
VMware Integrated OpenStack
<div class="outline-text-3" id="text-3-3">
VMware も ディストリを出す予定らしい.</p>
<ul class="org-ul">
<li>
<a href="http://www.vmware.com/products/openstack">VMware Integrated OpenStack (Beta) | United States</a>
</li>
<li>
<a href="http://www.atmarkit.co.jp/ait/articles/1408/26/news127.html">「 OpenStack の本質は API 」:OpenStack ディストリビューションを発表, ヴイエムウェアは何を考えているか – @ IT</a>
</li>
</ul>
</div>
docker
<div class="outline-text-3" id="text-3-4">
docker のなかに devstack がはいっているという ちなみに, 自分の環境ではインストールできなかった.</p>
<ul class="org-ul">
<li>
<a href="https://registry.hub.docker.com/u/ewindisch/dockenstack/">https://registry.hub.docker.com/u/ewindisch/dockenstack/</a>
</li>
<li>
<a href="https://github.com/ewindisch/dockenstack">https://github.com/ewindisch/dockenstack</a>
</li>
</ul>
</div>
vagrant-openstack にきめた
いろいろ試してみた (正確に表現すると, 失敗してみた) 結果, vagrant をつかうことにした.
vagrant ってなにってひとは, 過去記事を参照のこと.
environment
<div class="outline-text-3" id="text-4-1">
<ul class="org-ul">
<li>
archlinux
</li>
<li>
vagrant 1.6.3
</li>
<li>
virtualBox 4.3
</li>
</ul>
</div>
手順
<div class="outline-text-3" id="text-4-2">
<p>
以下の記事から vagrant box があることを知ったので, それを利用する.
</p>
<ul class="org-ul">
<li>
<a href="http://qiita.com/takuan_osho/items/7f571fb35d282251e5e7">OpenStack 初心者でも Vagrant を使って OpenStack を体験する方法 – Qiita</a>
</li>
<li>
<a href="https://github.com/TelekomLabs/vagrant-devstack">TelekomLabs/vagrant-devstack</a>
</li>
</ul>
<p>
github の README にしたがえば, vagrant up して, お茶を飲めと書いてある. 茶どころか, 回線速度が貧弱なので 1 時間くらいかかって, 喫茶店が閉店時間になって追い出されたのだが・・・ (_’Д`)
</p>
<p>
[sourcecode language=”sh” title=””]<br /> git clone https://github.com/TelekomLabs/vagrant-devstack.git<br /> cd vagrant-devstack<br /> vagrant up<br /> [/sourcecode]
</p>
<p>
<a href="http://192.168.50.10/">http://192.168.50.10/</a> にアクセスして, user: admin/ password: devstack でログイン.
</p>
<div class="figure">
<p>
<img src="http://futurismo.biz/wp-content/uploads/wpid-2014-09-01-003629_632x482_scrot.png" alt="2014-09-01-003629_632x482_scrot.png" />
</p></p>
</div>
</div>
OpenStack で開発する
以下はブックマーク.
github リポジトリは以下.
開発に参加するための手引きがまとまっている.
開発やバグ管理は launchpad で実施されているようだ.
開発のための API や SDK とそのドキュメント.