VB6開発者に贈るGoFデザインパターン【予告編】

あまり知られていないような気がしますが、VB6にも不完全ながらオブジェクト指向プログラミングを実現するための機能は備わっています。

  • public, friend, private でのスコープ制御によるカプセル化の実現。
  • インターフェースによる多態性。
  • 継承はサポートされていませんが、委譲を使って継承と似たことは実現できます。(かなり実装が大変ですが)

と、いうことで VB6 で GoF のデザインパターンを実装してみて、どのようなケースでそのパターンが有効なのか、という点を VB6 の開発者目線で紹介するシリーズとして記事を書いてみようと思います。

以下、Wikipediaから拾ってきた GoF のデザインパターンを列挙しておきます。
記事を書く毎にその記事へのリンクを挿入していきたいと思います。

生成に関するパターン

Abstract Factory パターン
関連する一連のインスタンスを状況に応じて適切に生成する方法を提供する。
Builder パターン
複合化されたインスタンスの生成過程を隠蔽する。
Factory Method パターン
実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。
Prototype パターン
同様のインスタンスを生成するために、原型のインスタンスを複製する。
Singleton パターン
あるクラスについて、インスタンスが単一であることを保証する。

構造に関するパターン

Adapter パターン
元々関連性のない2つのクラスを接続するクラスを作る。
Bridge パターン
クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する。
Composite パターン
再帰的な構造を表現する。
Decorator パターン
あるインスタンスに対し、動的に付加機能を追加する。Filterとも呼ばれる。
Facade パターン
複数のサブシステムの窓口となる共通のインタフェースを提供する。
Flyweight パターン
多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす。
Proxy パターン
共通のインタフェースをもつインスタンスを内包し、利用者からのアクセスを代理する。Wrapperとも呼ばれる。

振る舞いに関するパターン

Chain of Responsibility パターン
イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。
Command パターン
複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで操作の切替えを実現する。
Interpreter パターン
構文解析のために、文法規則を反映するクラス構造を作る。
Iterator パターン
複数の要素を内包するオブジェクトのすべての要素に順にアクセスする方法を提供する。反復子。
Mediator パターン
オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。
Memento パターン
データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。
Observer パターン
インスタンスの変化を他のインスタンスから監視できるようにする。Listenerとも呼ばれる。
State パターン
オブジェクトの状態を変化させることで、処理内容を変えられるようにする。
Strategy パターン
データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替えを容易にする。
Template Method パターン
あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする。
Visitor パターン
データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。

※上記のパターン名称および説明の文章は「デザインパターン (ソフトウェア) - Wikipedia」より引用していますが、それぞれのリンク先は。このブログに掲載されている記事へのリンクです*1。

*1:これから記事を投稿するごとにリンクしていく予定です

「GAEでカスタムテンプレートタグを使う」というのを書きました

ウェブブラウザでSVNリポジトリの特定のリビジョンを参照するURI

Subversion 1.6 のリリースノートから抜粋


mod_dav_svn now supports a new public URI syntax for examining older versions of files or directories. The intent here is to allow users to examine history without the use of an svn client, and to make it easier for 3rd-party tools (e.g. code-review services) to work directly against repositories without using svn libraries.

[]http://host/repos/path?[p=PEG][&r=REV][]

The new syntax works similarly to the way URIs work with the svn commandline client. Simply requesting http://host/repos/path fetches "path" in the HEAD revision. Adding a "p" query argument specifies a different peg revision instead, so that:

[]http://host/repos/path?p=38[]

...is similar to specifying "path@38" on the commandline. Adding a "r" query argument is like specifying "-r" on the commandline, causing the repository to follow history backwards from the peg revision to the older operative revision:

[]http://host/repos/path?p=38&r=20[]

As with the commandline, the peg revision defaults to HEAD if unspecified, and the operative revision defaults to the peg revision. The online Subversion Book has a section explaining peg and operative revisions in great detail.
New public 'historical' HTTP URI syntax for mod_dav_svn (server) - Apache Subversion 1.6 Release Notes

通常のURIに対して、p=でペグリビジョン、r=で操作対象リビジョンが指定できるらしい。

SlimTimerをデスクトップアプリケーションとして使う

Bubblesのサービスが終了してしまって、動かなくなってたので、この機会に Mozilla の Prism に移行した。

prism.exe を起動して、以下のように設定すると Slim Timer があたかもデスクトップアプリケーションのように利用できます。


  • URL : http://slimtimer.com/client
  • Name : 任意("Slim Timer"とか、自分の分かりやすい名前に)
  • Create Shortcut : 任意(適当に"Desktop"とかに作っておきます)

これで、「OK」を押すと以下のようにデスクトップに Slim Timer のアイコンが出来て、そこから Slim Timer が起動できるようになります。

便利ですね。

Proxy サーバを通す必要がある場合

念のため、社内LANなどからProxyを通してアクセスする必要がある場合の設定方法についても書いておきます。

そのようなケースでは「Preference」で、WebアプリケーションごとにProxyの設定を行う必要があります。また、「Preference」画面にアクセスするためには、ステータスバーを表示していないとアクセスすることが出来ないという罠があるため注意が必要です。

ステータスバーを表示するためには、最初のWebアプリケーションのセットアップ画面で

のように、"Show status and messages" のチェックを付けておく必要があります。
そうすると、以下のようにステータスバーにアイコンから開くメニューから"Preference..."を選んで、

"Advanced"タブで Proxy の設定が行えます。


Proxy 設定(ハッカーな人用)

C:\Documents and Settings\(ユーザID)\Application Data\Prism\SlimTimer\Profiles\xxxxxxx.xxxxxxx\prefs.js

に、Mozilla アプリケーションでおなじみの、Prefs.js がありますので、そこに、

user_pref("network.proxy.autoconfig_url", "http://proxy.hoge.com/proxy.pac");
user_pref("network.proxy.type", 2);

とか書いておけば、ステータスバーを開かなくてもよかったりします。

「ANTLRでBrainf*ckインタプリタ」というのを書きました

ちょっと前になりますが、以下のような記事を新ブログに書きました。

ブログ移行計画(Tumblrへ)

新しい年も始まったことだし、気分を変えて、新しくブログを立ち上げた。

http://blog.snaka.info/

この、はてなダイアリーとの使い分けは、まだ考え中...

2012.2.26 追記

  • 日々の細かいメモとか断片的な考えとかは、ダイアリーへ。
  • まとめたノウハウ/情報的なものは、新ブログへ。

という感じにしてみる。

httpd.conf で mod_dav_svn.so を読み込ませると httpd が起動しなくなった

Apache2(Windows版)でSubversionをネットワークに対応 - てんぷらメモ
を参考にセットアップした。

それぞれ普通にインストール。
mod_dav_svn.so を Apache の modules フォルダに配置した後、http.conf に以下の行を追加

LoadModule  dav_svn_module    modules/mod_dav_svn.so

すると、httpdが起動しなくなった。

イベントログを見ると

The Apache service named  reported the following error:
>>> 2\x83W\x83\x85\x81[\x83\x8b\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B   

というメッセージ。

手元に W32notes.txt が無かったので、ググッて見つけたもの
W32notes.txt
を見ると。

mod_dav_svn.so が動作するために必要なdllが読み込めていないっぽいので、Subversion\bin の *.dll を Apache\bin にコピー*1

この対応で一応、httpdが起動するようになった。

あとは、以下のように http.conf に記述すれば、http経由でのリポジトリが可能になる。

  <Location /repos>
    DAV svn
    SVNPath x:/svn/repos
  </Location>

上記の場合、ブラウザから http://localhost/repos でリポジトリにアクセスできたらOK

*1:同じ名前のファイルがある場合は上書きせずに元(Apache)のファイルをそのままにした