## Woolpack

本ドキュメントを閲覧するには。
  Firefox1.5で表示確認している。以下の特殊機能を使用している。
  1. XHTMLを使用している。
  2. JavaScriptを使用してアンカーを加工している。
  3. JavaScriptを使用してソースコードを加工している。
Woolpackとは。
  Woolpack は インタープリタ デザインパターン を利用した Java による ウェブアプリケーション の API または 部品群 または フレームワーク である。
  Woolpack is A Java Web Application API or Parts or Framework using interpreter design pattern.
用語の定義。

  用語 | 意味
  --- | ---
  ユーザ | Woolpack の API を利用してウェブアプリケーションを開発する役割の者。
  開発者 | Woolpack の API を拡張する役割の者。
  Context 役 | インタープリタ デザインパターンにおける Context の役割。
  Expession 役 | インタープリタ デザインパターンにおける Expression の役割。
  コンストラクタツリー | コンストラクタの引数としてコンストラクタが定義されコンストラクタが入れ子になったツリー状の宣言。

対象ユーザは。
  以下のいずれかを目的とするユーザを対象とする。
  1. インタープリタ デザインパターンのメタファを得る。
  2. インタープリタ デザインパターンと LISP の対応関係を得る。
  3. インタープリタ デザインパターンとオブジェクト指向用語の対応関係を得る。
  4. ウェブアプリケーションを作成する。
  5. Java を使用する。
インタープリタ デザインパターンのメタファとは。
  デザインパターンの各解説書ではインタープリタ デザインパターンのメタファとして「文法表現」を与えているが、 ここではより現実的な実態として「組立式コンベア」をメタファとして与える。 インタープリタ デザインパターンのメタファを以下に示す。

  概念 | メタファ | notion | metaphor
  --- | --- | --- | ---
  インタープリタ デザインパターン | 加工対象を加工するための組立式の生産ライン/流れ作業/コンベア | interpreter design pattern | knockdown conveyor
  Expression 役 | コンベア | expression role | conveyor
  Context 役 | コンベアに乗って流れてくる、加工対象を入れるトレーに注文書を付加したもの | context role | tray and purchase order
  Expression 役の interpret メソッド | コンベア同士をつなぐための接続点/ジョイント(受動側) | interpret method | passive joint for conveyor
  Expression 役の各実装 | 加工対象を加工する機能を付加したコンベア | expression implementation | conveyor implementation
  Expression 役の各実装のコンストラクタに指定された委譲先の Expression 役 | コンベア同士をつなぐための接続点/ジョイント(能動側) | constructor paramater that type is expression | active joint for conveyor
  Expression 役の各実装のコンストラクタに指定された Expression 役を除いたオブジェクト | 機能を付加したコンベアの初期操作レバー | constructor paramater that type is not expression | lever of conveyor

Woolpack のメタファとは。
  Woolpackは インタープリタ デザインパターンを適用しているため「パソコン生産ライン組み立てキット」をメタファとして与えることができる。 Woolpack のメタファを以下に示す。

  概念 | メタファ
  --- | ---
  Woolpack API | オーダーメードパソコンを製造するラインを組み立てるキット
  Woolpackを使用したアプリケーション | オーダーメードパソコンを製造する工場とその営業所
  Servlet コンテナ | 営業所
  web.xml | 営業所と工場を行き来するトラックの経路情報
  コンストラクタツリー | パソコンの製造するための組み立て完了した工場
  HTTP リクエストの URL | 注文書に記載されたパソコンの製品番号
  HTTP リクエストのパラメータ | 注文書に記載されたオプション品の明細
  Context 役のコンテナ定義に記載されたコンポーネント定義 | パソコンの各製品の基本仕様
  HTML ファイル | パソコンの筐体
  HTTP レスポンス | 組み立て完了したパソコン

インタープリタ デザインパターンと LISP の論理的な関係とは。
  デザインパターンの各解説書ではインタープリタ デザインパターンのメタファとして「文法表現」を与えているが、 文法表現を表現するために利用するインタープリタ デザインパターンに対し LISP の概念との対応を与えることができる。 インタープリタ デザインパターンと LISP との論理的な関係を以下に示す。

  LISP の概念による説明 | インタープリタ デザインパターンの概念による説明(必要なら Java 言語や Woolpack の API の用語を用いる)
  --- | ---
  型が付けられたS式(LISP には静的な型はないのでこのように表現した) | Expression 役
  let 関数で定義された局所変数 | Context 役
  c言語や機械語で実装された関数の実装 | Expression 役を実装したクラスの interpret メソッド
  関数 | Expression 役を実装したクラス
  LISP 文 | コンストラクタツリー
  defun 関数 | コンストラクタツリーをコンストラクタ内で定義した、 Expression 役を実装したクラス
  リスト | 配列またはリスト(Java言語の場合は java.util.List インターフェイス)
  ハッシュテーブル | マップ(Java言語の場合は java.util.Map インターフェイス)
  if 関数 | Expression 役を実装した分岐処理クラス(Woolpack の場合は woolpack.validator.IfValidator など)
  progn 関数 | Expression 役を実装した順次処理クラス(Woolpack の場合は woolpack.dom.Serial など)
  nil | Expression 役を実装した null オブジェクト(Woolpack の場合は woolpack.dom.DomConstants#NULL など)

オブジェクト指向の用語とインタープリタ デザインパターンの関係とは。
  オブジェクト指向の用語(Java コミュニティ上の用語も含む)とインタープリタ デザインパターンの関係を以下に示す。

  用語 | 関係
  --- | ---
  DI(dependency injection)または IoC(inversion of control) | コンストラクタツリーを定義する位置で各 Expression 役実装間の依存性が定義される。
  AOP(Aspect Oriented Program) | Expression 役は AOP における作用子(interceptor)と作用対象(interceptee)を兼務している。子 Expression 役に対するアスペクトを親 Expression 役として定義する。
  Servlet Filter | 委譲先がひとつであり、javax.servlet.ServletRequest と javax.servlet.ServletResponse が Context 役である インタープリタ デザインパターンとみなすことができる。
  コマンド デザインパターン(command) | インタープリタ デザインパターンの Expession 役が コマンド デザインパターンの Invoker 役を兼務することができる。
  オブザーバ デザインパターン(observer) | 関係を抽出することができなかった。
  ステート デザインパターン(state) | 関係を抽出することができなかった。
  アダプタ デザインパターン(adapter) | 異なる種類の Expression 役を結合するために使用する。Woolpack では woolpack.dom.DomExpression と woolpack.validator.ValidatorExpression を結合する woolpack.ee.ValidatorBuilder がある。
  ブリッジ デザインパターン(bridge) | 関係を抽出することができなかった。
  コンポジット デザインパターン(composite) | インタープリタ デザインパターンと同様の木構造を持つ。インタープリタ デザインパターンでは木構造を操作するメソッドが定義されないこともある。
  ファサード デザインパターン(facade) | 関係を抽出することができなかった。
  メディエータ デザインパターン(mediator) | 関係を抽出することができなかった。
  テンプレート メソッド デザインパターン(template method) | 木構造のない インタープリタ デザインパターンとみなすことができる。ただし特定の振る舞いと共通の振る舞いを関連づける方法として継承よりは委譲を多用する。
  ビジター デザインパターン(visitor) | ユーザが操作を拡張する必要性が低くかつ Expression 役の実装を多数作成する必要がある場合にビジターを適用すると、 Expression 役の追加とともに Visitor 役のオーバロード定義を追加する必要があるため、拡張性が維持されない。
  チェイン オブ レスポンシビリティ デザインパターン(chain of responsibility) | チェイン オブ レスポンシビリティ デザインパターンが木構造の葉から根に向かって処理を委譲するのに対し、 インタープリタ デザインパターンは木構造の根から葉に向かって処理を委譲する。
  デコレータ デザインパターン(decorator) | 委譲先がひとつの インタープリタ デザインパターンとみなすことができる。
  フライウェイト デザインパターン(flyweight) | インタープリタ デザインパターンの Expession 役が フライウェイト デザインパターンの FlyweightFactory 役を兼務することができる。
  イテレータ デザインパターン(iterator) | Expression 役を実装した順次処理クラスにおいて、子の Expression 役を Iterator 役を使用して走査する。
  メメント デザインパターン(memento) | 関係を抽出することができなかった。
  プロキシ デザインパターン(proxy) | インタープリタ デザインパターンの Expession 役がプロキシ デザインパターンの Proxy 役を兼務することができる。アクセス数カウント/並行性制御/通過ログなどの機能を付加する。
  ストラテジ デザインパターン(strategy) | インタープリタ デザインパターンの Expession 役がストラテジ デザインパターンの Context 役または Strategy 役を兼務することができる。 Woolpack では ValidatorIterable インターフェイスとその実装を Strategy 役とみなすことができる。
  アブストラクト ファクトリ デザインパターン(abstract factory) | リエントラントでもスレッドセーフでもないオブジェクトを Expression 役の実装から使用する場合に、スレッド毎のオブジェクトを生成するために利用する。
  ビルダ デザインパターン(builder) | 協調して動作する複数の Expression 役を生成するために利用する。Woolpack では ActionBuilder を Builder 役とみなすことができる。
  ファクトリ メソッド デザインパターン(factory method) | リエントラントでもスレッドセーフでもないオブジェクトを Expression 役の実装から使用する場合に、スレッド毎のオブジェクトを生成するために利用する。
  プロトタイプ デザインパターン(prototype) | リエントラントでもスレッドセーフでもないオブジェクトを Expression 役の実装から使用する場合に、スレッド毎のオブジェクトを生成するために利用する。
  シングルトン デザインパターン(singleton) | null オブジェクト役など固定の Expression 役を宣言する際に利用する。定数として宣言することがほとんどである。

特徴は。
  Woolpack の特徴を以下に示す。

  特徴 | 理由 | 利点 | 概念上・実装上の欠点 | 該当モジュール
  --- | --- | --- | --- | ---
  インタープリタ デザインパターンを使用する。 | 利点に同じ。 | Context 役に作用する共通の Expression 役を共通化・部品化することが創発される。特にリクエスト(HTTP)をまたがった横断的な部品(DOM ノードの加工・値検証)を定義することができる。 | Context 役で直接管理するプロパティを選定する難易度が高い。 | dom/html/config/validator の各パッケージ
  なるべく設定に XML を使用しない。コンストラクタのパラメータで設定する。 | 柔軟性を確保するスキーマ設計と XML をインスタンスツリーに変換する設計の難易度が高い。シリアル化(サーバ間で設定を通信するなど)を必要としない。 | 設定の構造化が維持される。 設定の分割が容易。 部品化が創発される。 Java エディタ以外のエディタ(eclipse の設定ファイル編集専用プラグインなど)必要としない。 全ての機能が Java の API として表現されているため、API のリファレンスが Javadoc のみである。 | Java 言語は new 宣言の引数に変数名を付けることができないため可読性が悪い。動作定義の動的変更機能を具備しない。 ユーザのソースコードに文字列が直接指定する記述になるため、文字列を ResourceBundle 化するなど一部のコーディング規約を遵守することができない(遵守すると可読性が低下する)。 | API 全体
  コンストラクタツリーとしてユーザが設定を定義(構文木をパース)する。 | 利点に同じ。 | 設定が構造化される。 | 複雑になると丸括弧の入れ子が増えるため可読性が悪い。 | dom/html/config/validator の各パッケージ
  HTML 雛型と変換定義を分離する。 | HTML 雛型と変換定義を疎結合化。Mayaa にインスパイアされた。 | HTML 雛型をまたがった変換定義を共通化・部品化することが創発される。 | 特定の HTML 雛型に固有の処理を記述する柔軟性がない。 | dom/html の各パッケージ
  HTML での入力値・妥当性チェック・モデル層のコンポーネントの間で、プロパティ名により値を自動バインドする。 | 利点に同じ。 | HTML での入力値・妥当性チェック・モデル層のコンポーネントでプロパティ名を統一することにより、個別に値をバインドする定義が不要になる。 | 識別子の値を個別に変換してバインドする仕掛けを用意していない。 | validator パッケージ, AutoUpdate, ActionInvoker
  Struts の Tiles に相当する機能として HTML フレームを HTML テーブルに変換する機能を具備する。 | 利点に同じ。 | HTML で作成したレイアウトをそのまま利用することができる。 | target 属性値の判定機能を具備しない。コンストラクタツリーで作用対象の HTML を指定する必要がある。 | Frame2Table
  Context 役の各プロパティを J2SE の API に限定している。 | 利点に同じ。 | JUnit によるテストの容易性が維持される。設計の抽象化が維持される。Servlet API に依存する部品が局所化される。 | クライアント情報(Locale や OS/ブラウザ名など)による処理の分岐をするためにはコレクションフレームワークを媒介するか ThreadLocal を使用する必要がある。 | DomContext
  コンテキスト役へのアクセスに OGNL を利用することができる。 | 利点に同じ。 | 型チェックがゆるい(実行時チェック)ため記述が容易。 | OGNL 文を Java ソースの String 値として定義するため、エスケープ文字(バックスラッシュ)の定義の可読性が悪い。 | API 全体
  Java 言語の final キーワードを多用する。 | 再入可能の保証とソースコード可読性。 | 動点固定法の効果により設計上のアイデアが創発される。「見える化」が維持される。 | 動的に設定を更新することができない。ソースコード上の final 宣言がくどい。配列やコレクションインターフェイスの各値を固定化する実装はしていない。 | AP I全体
  Generics を多用する。 | 利点に同じ。 | ソースの可読性が維持される。 | 1.4 以前の JRE では動作しない。 | API 全体
  dom/html の各パッケージのクラス名が名詞になっていない。 | Expression 役は文法規則を表すため、名詞にする効果が弱いと判断したため。 | コンストラクタツリーが読みやすい。 | 一般的なクラス名の命名規則に従っていない。 | dom/html の各パッケージ
  Woolpack が利用するライブラリで発生した RuntimeException のサブクラスでない例外は全て RuntimeException でラップして投げる。 | Woolpack がまだ例外設計をする段階に達していない。 | 部品の設計が単純化されている。 | 呼び出し元で Throwable#getCause() を解析する必要がある。 | API 全体
  Context　役に　Prototype　デザインパターンを適用することにより、変数スコープを表現している。 | Expression　役のコンストラクタツリーで変数スコープを実現する。 | Expression　役の作用範囲を制御することができる。 | 言語の変数スコープ程の柔軟性はない。 | DomContext, ConfigContext
  フレームワーク自体はログを出力しない。 | Woolpack　がまだログ設計をする段階に達していない。 | 部品の設計が単純化されている。 | デバッグ用のデータが不足する可能性がある。 | API　全体

Hello World は。
  次を参照する。
ダウンロードの場所は。
  sourceforge のダウンロードサイトを参照。 ひとつは開発者用の eclipse3.1 プロジェクト(外部ライブラリ無し)、 ひとつは eclipse3.1 の SYSDEO Tomcat プロジェクト(外部ライブラリ無し)になっている。
Javadoc API を参照するには。
  次を参照する。
必要な JDK のバージョンは。
  以下の機能を使用するため 1.5 を必要とする。
  1. Generics
  2. javax.xml.xpath パッケージ
  3. java.util.concurrent パッケージ
  4. Collection API の 1.5 で追加された機能
  5. 標準アノテーション
  6. StringBuilder,Appendable などの1.5で追加された機能
使用するライブラリは。
  以下に示すライブラリを使用する。
  1. Servlet API 2.3 以上(JSP は不要)
  2. CyberNeko HTML Parser ()(HTML 雛型に整形式 XML を使用する場合は不要)
  3. OGNL ()(EL に Java を使用する場合は不要)
必要とする前提知識は。
  以下の知識を必要とする。(順不同)
  1. Java 言語
  2. OGNL(Object Graph Navigation Language)
     式言語の一種。Woolpack では Context 役に対する作用として定義することがほとんどである。 Woolpack では式言語を woolpack.el.EL インターフェイスとして抽象化している。 EL インターフェイスを実装してJava言語で表記することもできるが、OGNLを利用することにより表記が単純化される。 次の例はリクエストスコープのプロパティ名 "key0" に値 "value0" を設定する操作を表す。

     次の例はノードの属性 "name" の値が "name0" の場合、マップ config のキー "name0" の値を表す。

     Java 言語の文字列として OGNL を指定する必要があるため、ダブルクォートがエスケープされることに注意する必要がある。
  3. XPath
     XML の位置を表すパス言語。Woolpack では基点から任意の距離を表す表現 "//" を多用する。 次の例はノードの属性 "id" の値が "dummy" であるか属性 "name" の値が "dummy" である基点以下の全てのエレメントを表す。

  4. Generics(汎用型)
     型をパラメータ化して扱う言語機構。Java ではバージョン 5 からサポートされている。 型宣言の見える化により可読性が維持される。また型の静的チェックにより品質が維持される。 次の例はキー・値とも文字列型の HashMap の初期化宣言である。

  5. DOM(Document Object Model)
     HTML または XML をオブジェクトで表現し操作するための API。 Woolpack では DOM による操作を Expression 役の実装でカプセル化するため、 ユーザが直接 DOM を操作することは少ない。
  6. 正規表現(java.util.regex パッケージ)
     文字列の集合を一つの形式で表現する言語(Wikipediaより)。 Woolpack では java.util.regex パッケージの正規表現を利用する。 Woolpack では url の変換・id(リクエスト・html)の変換・id による条件分岐・入力値の変換に正規表現を使用する。 次の正規表現は "user_registerConfirm","user_registerResult","user_updateConfirm","user_updateResult" にマッチする。

     正規表現を利用して値を変換することができる。 次の例は例えば"a0/a1/a2"を"a2"に変換するフォーマットの初期化宣言である。"$1"は1番目の丸括弧に該当する文字列を示す。

  7. コレクションフレームワーク(java.util パッケージ)
     コレクションとはオブジェクトのグループを表すオブジェクトのこと(j2se のドキュメントより)。 重複要素を持たない Set、順序付けられた一覧を表す List、キーと値の組の集合を表す Map、一覧を表す Collection、一覧の反復子を表す Iterator などの概念を持つ。 コレクションフレームワークには含まれないが、反復可能であることを表す Iterable を Woolpack では多用する。
  8. Servlet API
  9. HTML(Hyper Text Markup Language)
  10. JavaScript
  11. MVC2(Model-View-Controller2)アーキテクチャ
類似テンプレート技術との対応関係とは。
  類似テンプレート技術との対応関係を以下に示す。

  | Woolpack | Mayaa | JSP | XSLT
  --- | --- | --- | --- | ---
  治工具 | DomExpression の実装クラス | タグライブラリ | タグライブラリ | XSLTスキーマ
  コンテキスト | DomContext | request,session など | request,session など | 変換前 XML 表現
  テンプレート | 識別子(コンストラクタで定義)の値を調整した HTML 表現 | 識別子("id"のみ)の値を調整した HTML 表現 | HTML と XML 類似のタグ言語とスキーマ付きXMLの混合体 | XSLT スキーマ付 XML
  ユーザの変換ルール記述言語 | Java 言語と XPath(OGNL を使用することもできる) | Mayaa/JSTL などのスキーマ付 XML と EL | HTML と XML 類似のタグ言語と JSTL などのスキーマ付き XML の混合体と EL | XSLT スキーマ付 XML
  処理の共通化の実装方式 | DomExpression インターフェイスの実装(カプセル化) | インクルード機能の利用(関数による共通化)またはタグライブラリの実装(カプセル化) | インクルード機能の利用(関数による共通化)またはタグライブラリの実装(カプセル化) | の利用(関数による共通化)
  拡張機能開発者の記述言語 | Java 言語と XPath(OGNL を使用することもできる) | Java 言語と TLD の DTD 付 XML | Java 言語と TLD の DTD 付 XML | XSLT1.0では拡張機能の実装を定義するためのメカニズムを具備していない。(注1)
  文字セット(文字エンコーディング)の定義方法 | InputStreamReaderFactory クラスのコンストラクタ | HTML の META タグ | 各 JSP ファイルの JSP ヘッダ | 各 XML ファイルの XML ヘッダ

  注1：参照。
類似ウェブアプリケーションフレームワーク技術との対応関係とは。
  類似ウェブアプリケーションフレームワーク技術との対応関係を以下に示す。

  | Woolpack | Struts | JSF
  --- | --- | --- | ---
  アーキテクチャ | MVC2 | MVC2 | MVC2+イベント駆動
  DIコンテナ | 仕様はない(ただし DI の概念はデザインパターンに潜在している) | 仕様はない | 仕様化されている
  AOPコンテナ | 仕様はない(ただし AOP の概念はデザインパターンに潜在している) | 仕様はない | 仕様はない
  初期化 | 仕様はない | 仕様はない | 自動的に処理する仕様
  型変換 | コレクションと基本型変換は自動処理。フォーマット変換は入力チェックで定義。 | アクションフォームへの基本型変換は自動処理 | コンバータが仕様化されている
  値検証記述言語 | Java 言語(コンストラクタツリー) | commons validator の DTD 付 XML | Java 言語と JSF スキーマ付 XML
  クライアント値検証 | 設計中 | あり(Validator プラグイン) | 仕様はない
  コマンドオブジェクトの種類 | 一般の Java オブジェクト | Action を継承したクラス | 一般の Java オブジェクト
  呼び出すメソッド | Java でアクセス可能なメソッド | 特定のクラスをオーバライドしたメソッド | 引数無しで返却値が文字列のメソッド
  メソッド返却値の判定 | インターフェイスを定義。標準実装(null/オブジェクト/クラス/全許容/否定/例外以外)を用意。 | アクションに対しては文字列判定のみ。例外に対しては全アクション共通の指定のみ可能。 | 文字列判定のみ。
  レイアウト | フレームをテーブルに変換 | Tiles プラグイン | 仕様はない
  拡張方式 | Java 言語によるコンストラクタツリーの組み立て(buildable/knockdown) | XML によるプラグイン(pluggable) | XML によるプラグイン(pluggable)
  標準テンプレート技術 | 独自 | JSP | JSP

  上記の表の項目はを参考にした。
目的別のイディオムは。
  目的別のイディオムを以下に示す。

  目的 | イディオム
  --- | ---
  複数の ResourceBundle を読み込む |
  セレクトでデフォルト選択値にのみスタイルを定義する |
  ラジオボタン・チェックボックスでデフォルト選択値にのみスタイルを定義する |
  Seasar2 のコンポーネントを取得する |
  ラジオボタン・チェックボックスの再生成する(プロパティ名を指定する場合はダミー識別子を使用せずに不要な部品を削除することが可能) |
  ActionDef で比較判定を定義する |
  プリミティブ型で null とみなした値を削除する |
  一定の単位でコンストラクタツリーを分割する |
  コンストラクタツリーの生成に XML を使用する |

HTML のselect/checkbox/radio の値とラベルの組を ResourceBundle で管理するには。
  以下の内容の設定ファイルを用意する。

  以下の内容を含むConfigExpressionコンストラクタツリーを定義する。

  以下の内容を含むDomExpressionコンストラクタツリーを定義する。

  コンテキストのノードが以下の内容の場合、

  以下の内容に変換される(改行・スペースは説明用に調節している)。

  コンテキストのノードが以下の内容の場合、

  以下の内容に変換される(改行・スペースは説明用に調節している)。

編集中
  編集中。
実装予定の機能とは。
  以下の実装予定の機能は実装されることを保証するものではない。 また表示順に実行することを意図したものでもない。 (validator)メッセージをキーのみでなくインデックスも付加して管理。 (ee)画面表示値のフォーマット。 (validator)クライアント値検証。 (html)パッケージ全体のリファクタリング(処理時間・メモリ使用量)。 (html)HTML雛型の空白・改行・コメント(js以外)を削除する。 (all)ライブラリのコンパイル時の型検証ワーニングの解消。 (text)FieldPositionとParsePositionのテスト。 (other)画面設定MapとDOMの事前読み込み。
更新履歴
  1. 2006/06/05 ver0.01a 新規公開。
  2. 2006/06/19 ver0.02a DomContext の session と application の型を java.util.ConcurrentMap に変更。 java.util.concurrent パッケージを利用した並行性制御用 DomExpression を4種類追加。 switch を表現する Switchable インターフェイスを導入。 java.util.Map を使用して実現していた switch 機能を Switchable に置き換え。 LocaleConstants#search() を削除し、近い java.util.Locale を検索する機能として LocaleConstants#nearLocaleSwitch() を追加。 XmlToNode を追加。woolpack.html.ToNode を woolpack.adapter.ToNodeUsingNeko に変更。 UtilsConstants#injectiveMap() を追加。 OGE#setValues() の機能を ActionInvoker に移動。 EL をインターフェイス化し OGE がその実装クラスになるように変更。 OGE#invoke() を削除し OGE#getValue() に統合。 テストで OGE に依存する箇所を削減。 BuilderMap の API を変更。 本ページの説明を変更。
筆者紹介
  仲村貴大。沖縄出身。 大学2年の終わり頃からjavaを始めた1.0.2からのjavaプログラマ。 2006年4月現在で入社満4年。strutsを利用した開発を2件担当。 MDに録音したラジオ番組を通勤中に聞くことを楽しみとしている。
著作権
  Copyright (C) 2006 Takahiro Nakamura.
ライセンス
  Woolpack は以下のライセンスでリリースしている。
  Apache License, Version 2.0
  ただし利用している外部ライブラリのライセンスはそれぞれに従う。
参考資料
  オブジェクト指向における再利用のためのデザインパターン(改訂版) エリック・ガンマ他著 吉田和樹/本位田真一監訳 ソフトバンクパブリッシング刊
  Javaデザインパターンハンドブック 細谷竜一・矢野令著 ソフトバンクパブリッシング刊
  Java言語で学ぶデザインパターン入門　マルチスレッド編　結城浩著 ソフトバンクパブリッシング刊

以上