01 Oct 2014, 12:05

Windows で JCIFS を利用してみる

CIFS を Java から利用するためのライブラリ JCIFS を試してみたメモです.

JCIFS とは

JCIFS は Java で書かれた CIFS/SMB クライアントライブラリ.

File Read

code

<div class="outline-text-3" id="text-2-1">
  [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> import java.io.BufferedReader;<br /> import java.io.IOException;<br /> import java.io.InputStreamReader;<br /> import java.io.PrintWriter;<br /> import java.util.Properties;</p> 

  <p>
    import jcifs.Config;<br /> import jcifs.smb.SmbFileInputStream;<br /> import jcifs.smb.SmbFileOutputStream;
  </p>

  <p>
    public class JCIFSSample {<br /> public static void main (String[] args) throws IOException {
  </p>

  <p>
    Properties prop = new Properties ();<br /> prop.setProperty (&#8220;jcifs.smb.client.username&#8221;, &#8220;TSUNEMICHI&#8221;);<br /> prop.setProperty (&#8220;jcifs.smb.client.password&#8221;, &#8220;****************&#8221;);<br /> Config.setProperties (prop);
  </p>

  <p>
    SmbFileInputStream sfis = new SmbFileInputStream (&#8220;smb://TSUNEMICHI-VAIO/Users/TSUNEMICHI/temp/test.txt&#8221;);<br /> BufferedReader br = new BufferedReader (new InputStreamReader (sfis));
  </p>

  <p>
    String line = null;
  </p>

  <p>
    while ((line = br.readLine ())!=null){<br /> System.out.println (line);<br /> }<br /> br.close ();<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

compile and run

<div class="outline-text-3" id="text-2-2">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> C:\cygwin64\home\tsu-nera\tmp>javac -cp .;jcifs-1.3.17.jar FileRead.java</p> 

  <p>
    C:\cygwin64\home\tsu-nera\tmp>java -cp .;jcifs-1.3.17.jar FileRead<br /> Hello CIFS!!<br /> [/sourcecode]
  </p>
</div>

WireShark

<div class="outline-text-3" id="text-2-3">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> Negotiate Protocol Request<br /> Negotiate Protocol Response, ACCEPTOR_NEGO, ACCEPTOR_META_DATA<br /> Session Setup AndX Request, NTLMSSP_NEGOTIATE<br /> Session Setup AndX Response, NTLMSSP_CHALLENGE, Error: STATUS_MORE_PROCESSING_REQUIRED<br /> Session Setup AndX Request, NTLMSSP_AUTH, User: ?\TSUNEMICHI<br /> Session Setup AndX Response<br /> Tree Connect AndX Request, Path: \\TSUNEMICHI-VAIO\USERS<br /> Tree Connect AndX Response<br /> NT Create AndX Request, FID: 0x4000, Path: \TSUNEMICHI\temp\test.txt<br /> NT Create AndX Response, FID: 0x4000<br /> Read AndX Request, FID: 0x4000, 4286 bytes at offset 0<br /> Read AndX Response, FID: 0x4000, 12 bytes<br /> Read AndX Request, FID: 0x4000, 4286 bytes at offset 12<br /> Read AndX Response, FID: 0x4000, 0 bytes<br /> Read AndX Request, FID: 0x4000, 4286 bytes at offset 12<br /> Read AndX Response, FID: 0x4000, 0 bytes<br /> Close Request, FID: 0x4000<br /> Close Response, FID: 0x4000<br /> [/sourcecode]
</div>

File Write

code

<div class="outline-text-3" id="text-3-1">
  [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> import java.io.BufferedReader;<br /> import java.io.IOException;<br /> import java.io.InputStreamReader;<br /> import java.io.PrintWriter;<br /> import java.util.Properties;</p> 

  <p>
    import jcifs.Config;<br /> import jcifs.smb.SmbFileOutputStream;
  </p>

  <p>
    public class FileWrite {<br /> public static void main (String[] args) throws IOException {
  </p>

  <p>
    Properties prop = new Properties ();<br /> prop.setProperty (&#8220;jcifs.smb.client.username&#8221;, &#8220;TSUNEMICHI&#8221;);<br /> prop.setProperty (&#8220;jcifs.smb.client.password&#8221;, &#8220;****************&#8221;);<br /> Config.setProperties (prop);
  </p>

  <p>
    SmbFileOutputStream sfos = new SmbFileOutputStream (&#8220;smb://TSUNEMICHI-VAIO/Users/TSUNEMICHI/temp/test.txt&#8221;);<br /> PrintWriter pw = new PrintWriter (sfos);<br /> pw.println (&#8220;GoodBye JCIFS&#8221;);<br /> pw.close ();<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

WireShark

<div class="outline-text-3" id="text-3-2">
  [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> Negotiate Protocol Request<br /> Negotiate Protocol Response, ACCEPTOR_NEGO, ACCEPTOR_META_DATA<br /> Session Setup AndX Request, NTLMSSP_NEGOTIATE<br /> Session Setup AndX Response, NTLMSSP_CHALLENGE, Error: STATUS_MORE_PROCESSING_REQUIRED<br /> Session Setup AndX Request, NTLMSSP_AUTH, User: ?\TSUNEMICHI<br /> Session Setup AndX Response<br /> Tree Connect AndX Request, Path: \\TSUNEMICHI-VAIO\USERS<br /> Tree Connect AndX Response<br /> NT Create AndX Request, FID: 0x4000, Path: \TSUNEMICHI\temp\test.txt<br /> NT Create AndX Response, FID: 0x4000<br /> Write AndX Request, FID: 0x4000, 15 bytes at offset 0<br /> Write AndX Response, FID: 0x4000, 15 bytes<br /> Close Request, FID: 0x4000<br /> Close Response, FID: 0x4000<br /> [/sourcecode]
</div>

その他

ローカルファイルとネットワーク上のファイルを 同じように扱う方法がわからなかった.

以下のような方法があるようだが, 自分の環境では動作せず.

28 Sep 2014, 04:59

TCP のしくみと実装という本を読んだ

TCP の仕組みを学ぶために本を一冊読んだ.

Motivation

WireShark とにらめっこをする日々が続くが, 不具合の原因を推測するためには TCP 制御の仕組みを理解する必要があると考えた.

よくわからないことが起こったとき, TCP の知識がないとまったく太刀打ちできないことがこの一ヶ月に何度もあった.

Web 上でもいくつかよくまとまっているページがあるけれども, 書籍でまとめて学ぶために読んだ.

内容について

TCP と IP がセットで一冊の本になっていることがほとんどだけれども, この本は TCP に特化しているところがよかった.

前半は, TCP についての一通りのことがコンパクトにまとめられているので, あまり時間をかけずに読むことができる.

  • バイトストリームコネクション
  • マルチプレクシング (多重化)
  • 信頼性の確保
    • ACK 応答
    • 再送制御
    • 順序制御 (シーケンス番号)
    • ウィンドウ方式
  • フロー制御
    • ウィンドウ制御

後半はかなりマニアック. TCP の実装モデルについてサンプルコードをウォークスルーで解説される. ここまで詳しい知識は必要ないので自分は読まなかった.

26 Sep 2014, 12:43

C 言語でシステムコールを利用してファイル操作をしてみる.

はじめに

CIFS プロトコルを勉強している.

CIFS プロトコルは, ファイル読み書きのシステムコールを そのままネットワーク上に流したような仕様になっている.

エクスプローラから見れば, ファイルシステムがリモートにあろうが ローカルにあろうが, 意識することなくファイルにアクセスできる. それは, ファイルアクセスをすると, Windows のカーネル・モードにあるリダイレクタが呼び出されて, 適切なデバイスに対してコマンドを発行してくれるから.

つまり, ファイルアクセスの仕組みを理解すれば, CIFS のプロトコルも理解が深まると言うことだ!

ということで, C 言語で システムコールを利用して ファイルアクセスをしてみた.

つごうにより, 環境は ArchLinux だけど…

ファイル作成

やること

<div class="outline-text-3" id="text-2-1">
  <p>
    /home/tsu-nera/tmp 配下に test というファイルを新規作成する.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://gist.github.com/tsu-nera/f0be86e0a704471372b3">https://gist.github.com/tsu-nera/f0be86e0a704471372b3</a>
    </li>
  </ul>
</div>

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) &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<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 &#8211; Wikipedia</a>
      </li>
    </ul>

    <p>
      [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> strace touch /home/tsu-nera/tmp/test<br /> [/sourcecode]
    </p>

    <p>
      こうなった.
    </p>

    <p>
      [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> execve (&#8220;/usr/bin/touch&#8221;, [&#8220;touch&#8221;, &#8220;/home/tsu-nera/tmp/test&#8221;], [/* 50 vars */]) = 0<br /> brk (0) = 0x6ce000<br /> access (&#8220;/etc/ld.so.preload&#8221;, R_OK) = -1 ENOENT (No such file or directory)<br /> open (&#8220;/usr/local/lib/tls/x86_64/libc.so.6&#8221;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (&#8220;/usr/local/lib/tls/x86_64&#8221;, 0x7ffffbbac6d0) = -1 ENOENT (No such file or directory)<br /> open (&#8220;/usr/local/lib/tls/libc.so.6&#8221;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (&#8220;/usr/local/lib/tls&#8221;, 0x7ffffbbac6d0) = -1 ENOENT (No such file or directory)<br /> open (&#8220;/usr/local/lib/x86_64/libc.so.6&#8221;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (&#8220;/usr/local/lib/x86_64&#8221;, 0x7ffffbbac6d0) = -1 ENOENT (No such file or directory)<br /> open (&#8220;/usr/local/lib/libc.so.6&#8221;, O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)<br /> stat (&#8220;/usr/local/lib&#8221;, {st_mode=S_IFDIR|0755, st_size=4096, &#8230;}) = 0<br /> open (&#8220;/etc/ld.so.cache&#8221;, O_RDONLY|O_CLOEXEC) = 4<br /> fstat (4, {st_mode=S_IFREG|0644, st_size=166490, &#8230;}) = 0<br /> mmap (NULL, 166490, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7f042abdd000<br /> close (4) = 0<br /> open (&#8220;/usr/lib/libc.so.6&#8221;, O_RDONLY|O_CLOEXEC) = 4<br /> read (4, &#8220;\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&#8243;&#8230;, 832) = 832<br /> fstat (4, {st_mode=S_IFREG|0755, st_size=1984416, &#8230;}) = 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 (&#8220;/usr/lib/locale/locale-archive&#8221;, O_RDONLY|O_CLOEXEC) = 4<br /> fstat (4, {st_mode=S_IFREG|0644, st_size=2581856, &#8230;}) = 0<br /> mmap (NULL, 2581856, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7f042a3cb000<br /> close (4) = 0<br /> open (&#8220;/home/tsu-nera/tmp/test&#8221;, 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=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> [tsu-nera]% strace -c touch /home/tsu-nera/tmp/test<br /> % time seconds usecs/call calls errors syscall<br /> &#8212;&#8212; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212; &#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;-<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 /> &#8212;&#8212; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212; &#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;-<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=&#8221;c&#8221; title=&#8221;&#8221; ]<br /> #include <stdio.h><br /> int main (void)<br /> {<br /> FILE *fp;<br /> fp = fopen (&#8220;/home/tsu-nera/tmp/test&#8221;, &#8220;w&#8221;);<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 (低水準入出力) の違い &#8211; skyjoker (飛びます)</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;c&#8221; title=&#8221;&#8221; ]<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 (&#8220;/home/tsu-nera/tmp/test&#8221;, 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=&#8221;bash&#8221; title=&#8221;&#8221; ]<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=&#8221;c&#8221; title=&#8221;&#8221; ]<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=&#8221;c&#8221; title=&#8221;&#8221; ]<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=&#8221;c&#8221; title=&#8221;&#8221; ]<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) &#8211; @ 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>

24 Sep 2014, 16:06

TCP の性能測定指標とその計測方法について

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

23 Sep 2014, 06:00

Web サービスのアーキテクチャを学ぶ! coursera で Programming Cloud Services for Android Handheld Systems を受けた

内容について

全 10week 中,

  • 7week は C. Jules White さんのはなし.
  • 3week は Douglas C. Schmidt さんのはなし.

タイトルで Android と書いてあるにも関わらず, なんと Android の実装は出てこなかった.

ウェブアプリケーション技術を徹底解説

<div class="outline-text-3" id="text-2-1">
  <p>
    前半は, Jules さんの講義.Java の Spring フレームワークを例に, Web アプリケーション技術を網羅的に解説されるという,かなり実践的な内容.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">ウェブアプリケーション &#8211; Wikipedia</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-2-1-1" class="outline-4">
  <h4 id="sec-2-1-1">
    Spring Framework
  </h4>

  <div class="outline-text-4" id="text-2-1-1">
    <p>
      Spring フレームワークは, Java で Web アプリケーションを開発するさいの デファクトスタンダードだ.
    </p>

    <ul class="org-ul">
      <li>
        公式; <a href="http://projects.spring.io/spring-framework/">http://projects.spring.io/spring-framework/</a>
      </li>
      <li>
        <a href="http://ja.wikipedia.org/wiki/Spring_Framework">Spring Framework &#8211; Wikipedia</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-2-1-2" class="outline-4">
  <h4 id="sec-2-1-2">
    幅広い Web 知識
  </h4>

  <div class="outline-text-4" id="text-2-1-2">
    <p>
      HTTP Protocol, サーブレット, セッションとクッキー, セキュリティと認証などなど, 幅広い知識が解説される.
    </p>

    <p>
      自分は, 以下の本を副読本として読んでいた.
    </p>

    <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
      <div class='amazlink-list' style='clear: both;'>
        <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
          <a href='http://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774142352' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/614GgCmIuPL._SL160_.jpg' style='border: none;' /></a>
        </div>

        <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
          <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
            <a href='http://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774142352' rel='nofollow' target='_blank'>「プロになるための Web 技術入門」 &#8211;なぜ, あなたは Web システムを開発できないのか</a>
          </div>

          <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
            posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.09.23
          </div>

          <div class='amazlink-detail'>
            小森 裕介
          </div>

          <div class='amazlink-sub-info' style='float: left;'>
            <div class='amazlink-link' style='margin-top: 5px'>
              <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774142352' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6416565%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D6416565%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
            </div>
          </div>
        </div>
      </div>
    </div>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/2575">HTTP も知らないのぉ~? にカチンときたら読むべき! プロになるための Web 技術入門を読んだ. | Futurismo</a>
      </li>
    </ul>

    <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
      <div class='amazlink-list' style='clear: both;'>
        <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
          <a href='http://www.amazon.co.jp/Spring3%E5%85%A5%E9%96%80-%E2%80%95%E2%80%95Java%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%A8%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E9%95%B7%E8%B0%B7%E5%B7%9D-%E8%A3%95%E4%B8%80/dp/477415380X%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D477415380X' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/51aJP0oNtkL._SL160_.jpg' style='border: none;' /></a>
        </div>

        <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
          <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
            <a href='http://www.amazon.co.jp/Spring3%E5%85%A5%E9%96%80-%E2%80%95%E2%80%95Java%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%A8%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E9%95%B7%E8%B0%B7%E5%B7%9D-%E8%A3%95%E4%B8%80/dp/477415380X%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D477415380X' rel='nofollow' target='_blank'>Spring3 入門 &#8211;Java フレームワーク・より良い設計とアーキテクチャ</a>
          </div>

          <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
            posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.09.23
          </div>

          <div class='amazlink-detail'>
            長谷川 裕一
          </div>

          <div class='amazlink-sub-info' style='float: left;'>
            <div class='amazlink-link' style='margin-top: 5px'>
              <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/Spring3%E5%85%A5%E9%96%80-%E2%80%95%E2%80%95Java%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%A8%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E9%95%B7%E8%B0%B7%E5%B7%9D-%E8%A3%95%E4%B8%80/dp/477415380X%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D477415380X' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F12055186%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D12055186%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

<div id="outline-container-sec-2-1-3" class="outline-4">
  <h4 id="sec-2-1-3">
    Assignments
  </h4>

  <div class="outline-text-4" id="text-2-1-3">
    <p>
      Assignments は 2 つ.
    </p>

    <p>
      1 つは, Spring を利用して mp3 をアップロードする Web サービスを作成す る. HTTP GET, POST をどのようにしてプログラミングするのかを理解で きた. Spring の Annotation が便利過ぎてビックリする.
    </p>

    <p>
      もう 1 つは, OAuth 2.0 による認証の実装. これは一度理解したけど,忘れてしまったな&#x2026;. orz.
    </p>
  </div>
</div>

ウェブアプリケーションのアーキテクチャを徹底解説

<div class="outline-text-3" id="text-2-2">
  <p>
    後半は, Doug 氏による, Pattern Oriented Software Archtecture のお話.
  </p>

  <p>
    C++ のネットワーク/Web アプリケーション用フレームワークである ACE を利 用しつつ, POSA2 の全パターンを次から次へと解説していく.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.cs.wustl.edu/~schmidt/ACE.html">The ADAPTIVE Communication Environment (ACE)</a>
    </li>
  </ul>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/Pattern-Oriented-Software-Architecture-Concurrent-Networked-ebook/dp/B00CHK5SIA%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00CHK5SIA' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/41JQiq8T4QL._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/Pattern-Oriented-Software-Architecture-Concurrent-Networked-ebook/dp/B00CHK5SIA%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00CHK5SIA' rel='nofollow' target='_blank'>Pattern-Oriented Software Architecture, Patterns for Concurrent and Networked Objects: Volume 2 (Wiley Software Patterns Series)</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.09.23
        </div>

        <div class='amazlink-detail'>
          Douglas C. Schmidt
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/Pattern-Oriented-Software-Architecture-Concurrent-Networked-ebook/dp/B00CHK5SIA%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00CHK5SIA' rel='nofollow' target='_blank'>Amazon</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <p>
    POSA2 については, 講義についていくために Kindle で購入.
  </p>

  <blockquote class="twitter-tweet" data-cards="hidden" lang="ja">
    <p>
      買った. Amazon Clowd Reader が便利だ:Douglas C. Schmidt 『 Pattern-Oriented Software&#8230; <a href="http://t.co/FPcev3N74p">http://t.co/FPcev3N74p</a>
    </p>

    <p>
      &mdash; きつね (@tsu_nera) <a href="https://twitter.com/tsu_nera/status/513282459069198336">2014, 9 月 20</a>
    </p>
  </blockquote>

  <p>
  </p>

  <p>
    また, ネットワークアーキテクチャの副読本として, 以下の本も読んだ.
  </p>

  <ul class="org-ul">
    <li>
      <p>
        <a href="http://futurismo.biz/archives/2572">TCP/IP ソケットプログラミングの基礎を集中学習! Working with TCP sockets を読んでる | Futurismo</a>
      </p>

      <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
        <div class='amazlink-list' style='clear: both;'>
          <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
            <a href='http://www.amazon.co.jp/Working-With-Sockets-Jesse-Storimer-ebook/dp/B00BPYT6PK%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00BPYT6PK' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/51uNC60Jm4L._SL160_.jpg' style='border: none;' /></a>
          </div>

          <div class='amazlink-info' style='height:124; margin-bottom: 10px'>
            <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
              <a href='http://www.amazon.co.jp/Working-With-Sockets-Jesse-Storimer-ebook/dp/B00BPYT6PK%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00BPYT6PK' rel='nofollow' target='_blank'>Working With TCP Sockets</a>
            </div>

            <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
              posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.09.23
            </div>

            <div class='amazlink-detail'>
              Jesse Storimer
            </div>

            <div class='amazlink-sub-info' style='float: left;'>
              <div class='amazlink-link' style='margin-top: 5px'>
                <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/Working-With-Sockets-Jesse-Storimer-ebook/dp/B00BPYT6PK%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00BPYT6PK' rel='nofollow' target='_blank'>Amazon</a>
              </div>
            </div>
          </div>
        </div>
      </div>
    </li>
  </ul>
</div>

<div id="outline-container-sec-2-2-1" class="outline-4">
  <h4 id="sec-2-2-1">
    Assignments
  </h4>

  <div class="outline-text-4" id="text-2-2-1">
    <p>
      POSA2 で解説される, 以下のパターンを実装する課題.
    </p>

    <ul class="org-ul">
      <li>
        Wrapper Facade
      </li>
      <li>
        Reactor
      </li>
      <li>
        Acceptor-Connector
      </li>
      <li>
        Half-Sync/Half-Async
      </li>
    </ul>

    <p>
      Java の Network 用フレームワーク, Netty を利用して実装した.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://netty.io/">Netty: Home</a>
      </li>
    </ul>
  </div>
</div>

感想について

HTTP Protocol の仕組みを理解できた

<div class="outline-text-3" id="text-3-1">
  <p>
    HTTP Protocol を理解できたことは有益だった.
  </p>

  <p>
    ブラウザを利用してネットを閲覧するという, 毎日当たり前のようにやっていることの裏側について, 自分は今まで理解していなかったのだ.
  </p>
</div>

オブジェクトストレージのアーキを理解できた

<div class="outline-text-3" id="text-3-2">
  <p>
    また, ストレージ業界に身をおく自分としては, オブジェクトストレージのアーキテクチャを垣間見たことは有益だった. 今までは, 本や WEB で知識を読んでもどうもピンとこなかった. コードから 学ぶことで,構造や機能が頭に思い浮かべられるようになった.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.ctc-g.co.jp/~ctcsp//sp/ostf_02.html">新たな潮流, オブジェクトストレージとは? 『オブジェクトストレージが求められる背景』</a>
    </li>
  </ul>
</div>

ネットワークアーキテクチャについて学べた

<div class="outline-text-3" id="text-3-3">
  <p>
    今仕事では, CIFS プロトコルを利用して ミドルウェアのアプリケーションを作成しようとしてる. ネットワークの知識がまるでない自分にとって, ネットワークの知識ことは差し迫った急務だった.
  </p>

  <p>
    そんな自分にとって, HTTP Protocol の仕組みや Archtectore Pattern を学ぶ機会は, 絶好のタイミングだった. ソケットプログラミングのアーキテクチャパターンなどは, すぐにでも仕事に応用できそうな知識だ.
  </p>

  <p>
    その一方で, POSA2 については消化不良も否めない. 折に触れて, 再度復習しなければと思う.
  </p>
</div>

学習メモ

最後に, POSA2 の主要パターンについて書いて終わりにしようと思う. POSA2 の本によると, まずは以下の最重要パターン 4 つを身につけようとのこと.

Wrapper Facade Pattern

<div class="outline-text-3" id="text-4-1">
  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2613">Wrapper Facade Pattern について調べてみたまとめ | Futurismo</a>
    </li>
  </ul>
</div>

Acceptor-Connector Pattern

<div class="outline-text-3" id="text-4-2">
  <p>
    通信の初期化処理と実際の処理を分離することで, 構造を整理するパターン.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.cs.wustl.edu/~schmidt/PDF/Acc-Con.pdf">http://www.cs.wustl.edu/~schmidt/PDF/Acc-Con.pdf</a>
    </li>
  </ul>

  <p>
    Reactor Pattern において, Handler と Reactor の仲介を行う. Handler に Dispatch する前に, 一連の手続きが必要な場合には,
  </p>

  <ul class="org-ul">
    <li>
      Acceptor が Handler に対して手続きを実施してから (Accept)
    </li>
    <li>
      Reactor から Handler への Dispatch をさせる (Connect)
    </li>
  </ul>

  <p>
    Acceptor がサーバ側の仲介者, Connector がクライアント側の仲介者.
  </p>

  <p>
    クラス図的には,EventHandler のサブクラスに Handler や Acceptor, Connector がいる.
  </p>

  <p>
    EventHandler
  </p>

  <ul class="org-ul">
    <li>
      CifsAcceptor <ul class="org-ul">
        <li>
          negotiate
        </li>
        <li>
          session
        </li>
      </ul>
    </li>

    <li>
      CifsHandler <ul class="org-ul">
        <li>
          read
        </li>
        <li>
          write
        </li>
      </ul>
    </li>

    <li>
      CifsConnector <ul class="org-ul">
        <li>
          negotiate
        </li>
        <li>
          session
        </li>
      </ul>
    </li>
  </ul>
</div>

Reactor Pattern

<div class="outline-text-3" id="text-4-3">
  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2616">Reactor Pattern について調べてみたまとめ | Futurismo</a>
    </li>
  </ul>
</div>

Active Object Pattern

<div class="outline-text-3" id="text-4-4">
  <p>
    メソッドの呼び出しとメソッドの実際の実行を分離することで並行性を導入する. 各オブジェクトは利用者からの要求を管理するための メッセージキューとスケジューラを持つ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.cs.wustl.edu/~schmidt/PDF/Act-Obj.pdf">http://www.cs.wustl.edu/~schmidt/PDF/Act-Obj.pdf</a>
    </li>
  </ul>

  <p>
    外部の Client スレッドから非同期にメッセージを受け取っても, 自分固有の Active Object スレッドで, 自分の都合のいいタイミングで処理を実行させたい場合に利用する.
  </p>

  <p>
    起動 (invocation) と実行 (execution) の分離.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> Active Object defines units of concurrency as service requests<br /> on components & runs service requests on a component in a different<br /> thread from the requesting client thread.<br /> [/sourcecode]
  </p>
</div>

<div id="outline-container-sec-4-4-1" class="outline-4">
  <h4 id="sec-4-4-1">
    他のパターンとの関係
  </h4>

  <div class="outline-text-4" id="text-4-4-1">
    <ul class="org-ul">
      <li>
        Acceptor-Connector / Reactor
      </li>
    </ul>

    <p>
      Acceptor-Connector Pattern における Handler 部分をスレッド化すればよい. (i.e. Thread per connection) Reactor の Minor Change で実現できる.
    </p>

    <ul class="org-ul">
      <li>
        Half-Sync/Half-Async Active Object はスレッド/ スレッドを分離する. Half-Sync/Half-Async は, 非同期プロセスと同期プロセスを分離する.
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-4-4-2" class="outline-4">
  <h4 id="sec-4-4-2">
    Sample
  </h4>

  <div class="outline-text-4" id="text-4-4-2">
    <p>
      Java のサンプル
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://en.wikipedia.org/wiki/Active_object">Active object &#8211; Wikipedia, the free encyclopedia</a>
      </li>
    </ul>

    <p>
      Ruby のサンプル
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://alpha-netzilla.blogspot.jp/2010/11/design-pattern.html">Blog Alpha Networking: マルチスレッド デザインパターン (Active Object パターン) Ruby 編</a>
      </li>
      <li>
        <a href="http://takuya-1st.hatenablog.jp/entry/20101124/1290573115">Ruby でマルチスレッド 14 #ActiveObject &#8211; それマグで!</a>
      </li>
    </ul>
  </div>
</div>

22 Sep 2014, 10:22

Eclim を Windows で利用するためのメモ

Emacs から Eclipse を利用するためにつかうのが Eclim. 動くまで少しハマったので, インストール方法をメモ.

前回の記事は以下.

Environment

  • Windows 7 64bit

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=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (setq eclim-eclipse-dirs &#8220;/cygdrive/c/eclipse/luna&#8221;)<br /> (setq eclim-executable &#8220;/cygdrive/c/eclipse/luna/eclim.bat&#8221;)<br /> (setq eclim-port 9091)<br /> [/sourcecode]
  </p>

  <p>
    GUI 上の Emacs から利用するならば, 以下を追加. bat ファイルを Emacs から直接実行できなかった.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (setq eclim-eclipse-dirs &#8220;C:/eclipse/luna&#8221;)<br /> (setq eclim-executable &#8220;C:/eclipse/luna/ng.exe &#8211;nailgun-port 9091 org.eclim.command.Main&#8221;)<br /> (setq eclim-port 9091)<br /> [/sourcecode]
  </p>
</div>

16 Sep 2014, 12:40

Windows8 で Loopback Adapter を利用するためのメモ

はじめに

仕事では, windows 環境でネットワークの開発をしている.

開発用には ローカルホストがあると便利だけれども, Windows では Linux のように簡単にはローカルホストを利用できなかった.

LoopBack Adapter というものを利用するとよいことを知ったので, 導入手順をメモします.

WireShark で LoopBack Adapter をみる方法もメモします.

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Windows8
    </li>
  </ul>
</div>

Loopback Adapter とは

Loopback とは

<div class="outline-text-3" id="text-2-1">
  <p>
    ip アドレスは必ずしもリモートホストと関連付けられている必要はない. 得に開発環境では, ローカルな IP アドレスが役に立つ.
  </p>

  <p>
    自端末に対して通信することを LoopBack という. LoopBack で指定するアドレスを Loopback Address という.
  </p>

  <ul class="org-ul">
    <li>
      ハードウェアと関係ない, 論理的なインタフェース.
    </li>
    <li>
      Linux では, localhost と言われている. IP は 127.0.0.1
    </li>
  </ul>

  <p>
    <a href="http://e-words.jp/w/E383ABE383BCE38397E38390E38383E382AF.html">ループバックとは 〔 ローカルループバック 〕</a>
  </p>
</div>

Windows LoopBack Adapter とは

<div class="outline-text-3" id="text-2-2">
  <p>
    Windows で Loopback Address を利用するためのアダプター. Microsoft から無料で提供されている.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://support.microsoft.com/kb/236869/ja">Microsoft Loopback Adapter をインストールする方法</a>
    </li>
  </ul>
</div>

Loopback Adapter をインストールする

以下のページに画像付きの手順があるので参考にした.

Windows7 とほぼ手順はおなじだけれども, インストールする際の名称が Microsoft KM-TEST Loopback Adapter だった.

Loopback Adapter を設定する

以下のページに画像付きの手順があるので参考にした.

IP はとりあえず以下を利用.

  • ip: 10.0.0.2
  • subnet: 255.255.255.0
  • gateway: 10.0.0.1
  • DNS: 127.0.0.1

WireShark でパケットキャプチャーする

WireShark Wiki ページによると, 3 つの方法があるようだ.

  • route add
  • Proxocket
  • RawCap

CaptureSetup/Loopback – The Wireshark Wiki

結論としては, RawCap がうまくいった.

ローカルマシンに route add する方法

<div class="outline-text-3" id="text-5-1">
  <p>
    Add a route to your local machine going through the network gateway
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> route add <your_IP> mask 255.255.255.255 <the_gateway> metric 1<br /> [/sourcecode]
  </p>

  <p>
    自分の環境で頑張ってみたのだが, どうも動かなかった. Gateway の設定が違う気がするが&#x2026;
  </p>

  <p>
    以下の記事によると, Loopback Adapter より先に WireShark を インストールしていた場合は, WireShark の再インストールが必要?
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://stackoverflow.com/questions/5847168/wireshark-localhost-traffic-capture">Wireshark localhost traffic capture &#8211; Stack Overflow</a>
    </li>
  </ul>
</div>

Proxocket をつかう方法

<div class="outline-text-3" id="text-5-2">
  <p>
    Proxocket という dll を キャプチャしたいアプリと同じフォルダにいれて おくと, パケットキャプチャできるらしい. これは自分は未検証.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.netresec.com/archives/age=Blog&#038;month=2011-01&#038;post=Proxocket---A-Winsock-Proxy-Sniffer">Proxocket &#8211; A Winsock Proxy Sniffer &#8211; NETRESEC Blog</a>
    </li>
  </ul>
</div>

RawCap

<div class="outline-text-3" id="text-5-3">
  <p>
    唯一うまくいった方法.RawCap というツールを使う.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.netresec.com/archives/age=RawCap">RawCap &#8211; A raw socket sniffer for Windows</a>
    </li>
  </ul>

  <p>
    使い方は簡単. ダブルクリックで起動して, キャプチャしたいインタフェースを選択するだけ.
  </p>

  <p>
    キャプチャを終了するときには, Ctrl+C で終了させる. pcap 形式のファイ ルが作成されるため, これを wireshark で開けばよい.
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-SnapCrab_NoName_2014-9-16_12-31-47_No-00.png" alt="SnapCrab_NoName_2014-9-16_12-31-47_No-00.png" />
    </p></p>
  </div>
</div>

14 Sep 2014, 05:02

Reactor Pattern について調べてみたまとめ

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=&#8221;ruby&#8221; title=&#8221;&#8221; ]<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

Wrapper Facade Pattern について調べてみたまとめ

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 をとりあえず動かしてみたい! vagrant で OpenStack を初体験したメモ

はじめに

最近とみに 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 &#8211; Wikipedia</a>
      </li>
      <li>
        <a href="http://www.atmarkit.co.jp/ait/articles/1406/10/news039.html">NEC の柴田氏に聞く:OpenStack はなぜこれまで成功してきたのか &#8211; @ IT</a>
      </li>
      <li>
        <a href="http://itpro.nikkeibp.co.jp/article/Keyword/20121029/433321/">Network キーワード &#8211; OpenStack とは:ITpro</a>
      </li>
      <li>
        <a href="http://cloud.watch.impress.co.jp/docs/column/cloud/20140404_642748.html">【クラウド特捜部】プレーヤーがそろい表舞台に立つ OpenStack &#8211; クラウド 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 章 アーキテクチャー &#8211; OpenStack インストールガイド Debian 7.0 (Wheezy) 版 &#8211; 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 &#8211; 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) &#8211; @ 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 ディストリビューションを発表, ヴイエムウェアは何を考えているか &#8211; @ 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 を体験する方法 &#8211; Qiita</a>
    </li>
    <li>
      <a href="https://github.com/TelekomLabs/vagrant-devstack">TelekomLabs/vagrant-devstack</a>
    </li>
  </ul>

  <p>
    github の README にしたがえば, vagrant up して, お茶を飲めと書いてある. 茶どころか, 回線速度が貧弱なので 1 時間くらいかかって, 喫茶店が閉店時間になって追い出されたのだが・・・ (_&#8217;Д`)
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<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 とそのドキュメント.