14 Dec 2014, 08:51

データフロー変数 (Oz) で実現する Producer-Consumer Pattern

はじめに

以下の記事の続編です.

前回は, Java の 共有メモリモデルを利用して Producer-Consumer Pattern を実装した.

今回は, Oz のもつ決定性データフローモデルを利用して実装してみる.

決定性データフローモデル

データフロー変数をもつモデル.

データフロー変数

<div class="outline-text-3" id="text-unnumbered-3">
  <p>
    変数に値が束縛されるまでプログラムの実行を待ち合わせるような宣言的変数.
  </p>

  <p>
    あるスレッドがデータフロー変数を利用しようとしたとき, その変数に値が束縛されていない場合は, 別のスレッドが束縛するまで待ち合わせを行う.
  </p>

  <p>
    束縛されたときの実行を データフロー実行 という.
  </p>
</div>

実行例

Java

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    まずは, Java でのサンプル. 平行性を実現するためには, キューを共有する.
  </p>

  <p>
    結構コードがながくなってしまった&#x2026;
  </p>

  <p>
    [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221;]<br /> import java.util.concurrent.LinkedBlockingQueue;<br /> import java.util.concurrent.BlockingQueue;<br /> import java.util.LinkedList;<br /> import java.util.List;
  </p>

  <p>
    public class ProducerConsumerPattern {<br /> public static void main (String args[]) {<br /> BlockingQueue<List<Integer>> queue = new LinkedBlockingQueue<List<Integer>>();
  </p>

  <p>
    Producer producer = new Producer (queue, 10);<br /> Consumer consumer = new Consumer (queue);
  </p>

  <p>
    producer.start ();<br /> consumer.start ();<br /> }<br /> }
  </p>

  <p>
    class Producer extends Thread {<br /> BlockingQueue<List<Integer>> queue;<br /> List<Integer> list;<br /> int limit;
  </p>

  <p>
    public Producer (BlockingQueue<List<Integer>> queue, int limit) {<br /> this.queue = queue;<br /> this.limit = limit;<br /> list = new LinkedList<Integer>();<br /> }
  </p>

  <p>
    public void run () {<br /> try {<br /> for (int i=1; i <= limit; i++) {<br /> System.out.println (i);<br /> sleep (1000);<br /> list.add (i);<br /> }<br /> queue.put (list);<br /> }<br /> catch (Exception e) {}<br /> }<br /> }
  </p>

  <p>
    class Consumer extends Thread {<br /> BlockingQueue<List<Integer>> queue;<br /> Integer sum;<br /> public Consumer (BlockingQueue<List<Integer>> queue) {<br /> this.queue = queue;<br /> this.sum = 0;<br /> }
  </p>

  <p>
    public void run () {<br /> try {<br /> List<Integer> list = queue.take ();<br /> for (Integer i: list) {<br /> sum += i;<br /> }<br /> System.out.println (sum);<br /> }<br /> catch (Exception e) {}<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

Oz

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    つづいて, データフロー変数をサポートする Oz.
  </p>

  <p>
    とてもシンプルにかつ安全に書くことができる. データフロー変数の未来を感じることができるコード.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221;]<br /> declare<br /> fun {Producer N}<br /> fun {Producer1 X N}<br /> {Delay 1000}<br /> if X < N+1 then<br /> {Show X}<br /> X|{Producer1 X+1 N}<br /> else nil<br /> end<br /> end<br /> in<br /> {Producer1 1 N}<br /> end
  </p>

  <p>
    fun {Consumer S}<br /> fun {Sum S Acc}<br /> case S of X|Xr then {Sum Xr Acc+X}<br /> [] nil then Acc<br /> end<br /> end<br /> in<br /> {Sum S 0}<br /> end
  </p>

  <p>
    local Xs Ys S in<br /> thread Xs = {Producer 10} end<br /> thread<br /> Ys = {Consumer Xs}<br /> {Show Ys}<br /> end<br /> end<br /> [/sourcecode]
  </p>
</div>

20 Oct 2014, 15:45

Java で Producer-Consumer Pattern を実装してみた

二つのスレッドで同期キューを用いて情報をやりとりするときに利用する アーキテクチャ・パターンに, Producer-Consumer Pattern というものがある.

Publisher-Subscriber パターン, 生産者-消費者パターンともいう.

これを Java で実装する場合は, BlockingQueue インターフェースを利用できる.

syncronised/wait/notify を利用してもできるが, BlockingQueue を利用したほうが楽.

以下, coursera の POSA での Assignment を改造してみて, 簡易版の Producer-consumer Pattern を書いてみた.

source

[sourcecode language=”java” title=”” ]
import java.util.concurrent.*;

public class SynchronizedQueue {
// Keep track of the number of times the producer test iterates.
static volatile int mProducerCounter = 0;

// Keep track of the number of times the consumer test iterates.
static volatile int mConsumerCounter = 0;

// Maximum timeout.
static final int TIMEOUT_SECONDS = 5;

// Error value for a timeout.
static final int TIMEOUT_OCCURRED = -1;

// Error value for a failure.
static final int FAILURE_OCCURRED = -2;

public static class QueueAdapter {
private BlockingQueue mQueue;

public QueueAdapter (BlockingQueue queue) {
mQueue = queue;
}

/**
* Insert msg at the tail of the queue.
*/
public void put (E msg) throws InterruptedException, TimeoutException {
// Keep track of how many times we’re called.
mProducerCounter++;
boolean timeoutValue = mQueue.offer (msg,
TIMEOUT_SECONDS,
TimeUnit.SECONDS);
if (timeoutValue == false)
throw new TimeoutException ();
}

/**
* Remove msg from the head of the queue.
*/
public E take () throws InterruptedException, TimeoutException {
// Keep track of how many times we’re called.
mConsumerCounter++;
E rValue = mQueue.poll (TIMEOUT_SECONDS,
TimeUnit.SECONDS);

if (rValue == null)
throw new TimeoutException ();

return rValue;
}
}

private static QueueAdapter mQueue = null;

static Runnable producerRunnable = new Runnable () {
public void run () {
for (int i = 0; i < mMaxIterations; i++) try { mQueue.put (i); if (Thread.interrupted ()) throw new InterruptedException (); } catch (InterruptedException e) { System.out.println ("Thread properly interrupted by " + e.toString () + " in producerRunnable"); // This isn't an error - it just means that // we've been interrupted by the main Thread. return; } catch (TimeoutException e) { System.out.println ("Exception " + e.toString () + " occurred in producerRunnable"); // Indicate a timeout. mProducerCounter = TIMEOUT_OCCURRED; return; } catch (Exception e) { System.out.println ("Exception " + e.toString () + " occurred in producerRunnable"); // Indicate a failure. mProducerCounter = FAILURE_OCCURRED; return; } } }; static Runnable consumerRunnable = new Runnable () { public void run () { for (int i = 0; i < mMaxIterations; i++) try { if (Thread.interrupted ()) { throw new InterruptedException (); } Integer result = (Integer) mQueue.take (); System.out.println ("iteration = " + result); } catch (InterruptedException e) { System.out.println ("Thread properly interrupted by " + e.toString () + " in consumerRunnable"); // This isn't an error - it just means that // we've been interrupted by the main Thread. return; } catch (TimeoutException e) { System.out.println ("Exception " + e.toString () + " occurred in consumerRunnable"); // Indicate a timeout. mConsumerCounter = TIMEOUT_OCCURRED; return; } catch (Exception e) { System.out.println ("Exception " + e.toString () + " occurred in consumerRunnable"); // Indicate a failure. mConsumerCounter = FAILURE_OCCURRED; return; } } }; // Number of iterations to test public static int mMaxIterations = 1000000; public static int mMaxQueueSize = (mMaxIterations / 10); public static void main (String[] args) { try { mQueue = new QueueAdapter(new ArrayBlockingQueue(mMaxQueueSize));
// mQueue = new QueueAdapter(new LinkedBlockingQueue ());

// create threads
Thread consumer = new Thread (consumerRunnable);
Thread producer = new Thread (producerRunnable);

// start the threads.
consumer.start ();
producer.start ();

// Give the Threads a chance to run before interrupting them.
Thread.sleep (100);

// interrupt the threads.
consumer.interrupt ();
producer.interrupt ();

// wait for the threads to exit.
consumer.join ();
producer.join ();

} catch (Exception e) {
}
}
}
[/sourcecode]

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>

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]

20 Jul 2014, 06:42

オブジェクト指向設計と並列プログラミングをAndoirdで学ぶ!Pattern-Oriented Software Architecturesを受けた

Courseraで Pattern-Oriented Software Architecturesを学びました。

[toc]

なぜPOSAを学んだか?

POSAを学んだ目的は、自分のオブジェクト指向設計能力を向上させるためだ。

デザインパターンを身につける

今年の目標の一つが、デザインパターンを身につけること。

去年はRubyやC++を学ぶことで、オブジェクト指向を身につけた。

そして今年は更なる成長のために、 デザインパターンを身につけることを本年度の目標にしたのだった。

アーキテクチャ・パターンという新しい考え方を身につける

今回学んだPOSAというものは、デザインパターンとは違う。 デザインパターンの上位に位置する、アーキテクチャ・パターンというものだ。

デザイン・パターンはクラス間の関係を示すのに対して、 アーキテチャ・パターンは、システムやモジュール同士の関係を示す。 アーキテクャ・パターンのなかに、デザインパターンが現れる。

あまりメジャーではないけれども、だからこそ人より抜きん出るためには、 デザインパターンとともに、アーキテクチャパターンをみにつけたいと思った。

並列プログラミングを身につける

これは棚からぼたもちだったのだけれども、 このCourseraのコースは平行プログラミングについても一通り説明されている。

今まで、平行プログラミングを真面目に学んだことがなかったため、 網羅的に学べるとてもよい機会だった。

Androidと平行プログラミング、そしてパターン

パターンだけが、学習の対象ではなかった。以下のことが学べた。

  • Android
  • 平行プログラミング
  • パターン

Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects

Douglas Schmidt先生は、以下の本の著者の一人。Schmidt先生、渾身の著作!

Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects

講義はこの本に書いてある内容、すなわち、

平行プログラミングに関するアーキテチャ・パターン

が中心的な話題となっている。

また、その学習のためのプラットフォームとしてAndroidOSが 採用されているという内容。 パターンが体系的に、順番に、解説されていくものを想定していたため、 このような進め方は予想外だった。

詳しく解説されたGofのパターンは以下。軽く触れたものはもう少しある。

  • Factory Method
  • Bridge
  • Command
  • Strategy
  • Template Method

また、POSAについては以下。

  • Half-Sync/Harf-Async
  • Active Object
  • Monitor Object
  • Producer-Consumer

とても熱い講義

Schmidt先生は、教えることにたいしてとても熱心に感じた。 やや早口だが、とても生き生きとはなしいている。 また、掲示板にしょっちゅう出没してコメントを精力的に書き込んでいるのにも驚く。

Douglas Schmidtさん本人のYoutubeチャンネルから、実際の動画を見ることができる。

そして、なぞのPDF群。いろいろなパターンに関する覚え書きがたくさんある。貴重な資料。

Assignmentは簡単

Assignmentは、とても簡単な内容。 githubから課題を落として、TODOとなっている場所を10箇所くらい修正する。

スケジュールの前半は、JavaのConcurrencyに関する話題が課題。

  • RentrantLock
  • ReadWriteLock
  • Semaphore
  • ConditionObject
  • CountdownLatch

Ping-Poigというプログラミングを作成した。

スケジュールの後半になって、ようやくAndroidの話題がでる。 Androidのライブラリを利用した並列処理について学ぶ。

  • HaMeR framework
  • AsyncTask framework

中級・上級を目指してガチにAndroidを極める人のための講義

ServiceやIntentがどういう思想のもとに設計されているかが、 パターンという観点から整理されて解説される。

並列プログラミングを題材にして、パターンが解説されていく。 実例を通して学べるところがよい。

市場にでているAndroidの参考書は、技術的な詳細よりも、 動くアプリを作成することに重点が置かれてかかれている。

この講義は、フレームワークの仕組みをJavaや設計の観点から詳しく解説しているので、 世の中の参考書にはない、貴重な学習材料だ。

中級・上級を目指して本気でにAndroidを学ぼうとする人に最適だと思う。

POSAをどう生かすか?

実例にそってパターンを学ぶ

正直、この講義だけではPOSAが分からない。Gofも部分的にしか紹介されない。

Androidと平行プログラミング、そしてパターン、いろいろ覚えることが多く、 頭の中で整理できないでいる。

思ったことは、パターンはパターンそのものとして学習するのではなくて、 コードや実例を通じて学んだ方がわかりやすいということだ。 そういう意味では、Androidが題材にされいてるところはよかった。

パターンは、折にふれてリファレンスを参照して、 繰り返し慣れ親しむことで覚えていくのがよいだろう。 普段のコードリーディングで、『これってパターンかも』と思ったら、 その度ごとにGoogleで調べるように心がけたい。

オブジェクト指向設計をもっく詳しく

パターンというのは、課題があってその解決策として導かれるもの。 GofやPOSAは、オブジェクト指向を大前提にしている。 オブジェクト指向の課題から、必然的に導かれたものがパターンとなる。

なので、パターンの本質を身につけるためには、 もっと深くオブジェクト指向設計を学ぶ必要を感じる。 オブジェクト指向設計の解説書として定評のある以下の本を買った。 これで、オブジェクト指向の本質的な部分を学びたい。

あと、POSA2の日本語訳、出版されないかな。