April 2009

April 21, 2009

Zope 3について

Zope 3の特長はコンポーネントアーキテクチャです。

コンポーネントアーキテクチャのキーワードは、『インターフェイス』と『アダプタ』です。

『アダプタ』とは、GoFのデザインパターンの中のAdapter Patternのアダプタです。

アダプタの役割はインターフェイスの変換です。

コンポーネントアーキテクチャでは、ほとんど全ての要素はインターフェイスを持ちます。

例えば、Zope3におけるMVCアーキテクチャのModelは、○○の属性を保持する、といったインターフェイスを持ちます。

Viewは、このModelのインターフェイスをHTML出力という別インターフェイスに変換するアダプタとして実装されます。

ここでポイントなのは、ViewがModelそのものではなくて、Modelが提供する(であろう)インターフェイスに対して実装される、ということです。

Viewが参照しているのがあくまでインターフェイスなので、Modelの中身が変更されてもViewが影響を受けることはありません。

また、異なる実装を持つModelであっても、同じインターフェイスを提供していれば、既存のViewを適用することができます。

おそらく、優れたソフトウェア設計者であれば自然と身につけているであろう設計方針を、Zope 3ではフレームワークとしてサポート(ある意味では強制)している訳です。

この方針の問題点は、学習コストが高いことです。
Zope 3では、学習を始めたばかりの開発者に対しても、インターフェイスやアダプタ、といった抽象的な概念を隠すことはしません。

ブログのエントリ内容をブラウザに表示する、というだけのことをやるにしても、
・ブログエントリの持つインターフェイスの定義の仕方
・ブログエントリを表すクラスの実装の仕方
・ブログエントリのインターフェイスをHTMLに変換するViewアダプタの実装の仕方
(・Viewアダプタが用いるテンプレートの書式)
・上記の要素を結びつける設定ファイル(XML形式)の書き方
と、うんざりするほど多くのことを学ばなくてはなりません。

matssaku at 22:00|PermalinkComments(0)TrackBack(0)clip!Zope | Python

April 08, 2009

Ocsigenインストール

OCamlのWebアプリケーションフレームワーク、Ocsigenをインストールしてみました。

依存ライブラリが多いので、できる限りディストロ付属のパッケージ管理システムを利用するのが良いです。

パッケージ管理システムが利用できない場合は、GODIという、OCaml用のパッケージ管理システムを利用することもできるのですが、インターフェイスが直観的でない上、コンパイルに結構時間がかかるので、あまりお勧めできません。
# EC2でdebianのインスタンスを立ち上げる方が早いかも

今回はdebianを利用しました。Ocsigen本体は最新のものを利用したかったので、依存ライブラリのみaptitudeでインストールしました。

依存パッケージのインストール:
# aptitude install ocaml-nox \
camlp4-extra \
ocamlduce \
liblwt-ocaml-dev \
libpcre-ocaml-dev \
libocamlnet-ssl-ocaml-dev \
libsqlite3-ocaml-dev \
libzip-ocaml-dev \
libcryptokit-ocaml-dev

Ocsigenのインストール:
# tar xvfz /path_to/ocsigen-1.2.0.tar.gz
# cd ocsigen-1.2.0
# ./configure
# make
# make install
モジュールの作り方の基本は本家チュートリアルが参考になります。
日本語では、じじぃの日記様の記事を参考にすることができます。
注意点としては、ocamlduceを利用する場合、コンパイルにocamlfindの代わりにocamlducefindを利用する必要があります。
(例
$ ocamlducefind ocamlc -thread -c -package ocsigen hello.ml



matssaku at 22:45|PermalinkComments(0)TrackBack(0)clip!OCaml 

April 03, 2009

鬼車とマルチスレッド

高速で日本語に対応した正規表現ライブラリとして著名な鬼車ですが、何も考えずにコンパイルするとマルチスレッドに対応してくれません。mregexpなんかと一緒に利用するときは注意が必要です。

一応、スレッドアンセーフな状態の鬼車がマルチスレッド環境で落ちた時のログを載せておきます。
*** glibc detected *** double free or corruption (fasttop): 0x....... ***
======= Backtrace: =========
/lib64/libc.so.6
/lib64/libc.so.6(cfree)
/usr/local/lib/libonig.so.2(onig_free_node_list)
鬼車に付属のドキュメント(doc/FAQ.ja)には以下のように記されています。
2. スレッドセーフ

スレッドセーフにするには、以下の(A)と(B)のどちらかを行なえば
よい。

(A) Oniguruma Layer

oniguruma/regint.hの中の以下のマクロを定義する。

USE_MULTI_THREAD_SYSTEM
THREAD_ATOMIC_START
THREAD_ATOMIC_END
THREAD_PASS

何らかの初期化/終了処理が必要であれば、以下のマクロに定義する。
THREAD_SYSTEM_INIT
THREAD_SYSTEM_END


(B) Application Layer

同時に複数のスレッドが、正規表現オブジェクトを作成する、
または解放する、ことを行なってはならない。
それらのオブジェクトが全く別のものであっても。

もう少し詳しい説明は、このドキュメントの中の
"スレッドセーフに関する補足"に書いておいた。

例えば、Linux(POSIX環境)ではどうするか、といったことはこのドキュメントの中には記述されていないので、多くの人は自分でマクロ定義を記述することになると思います。

C言語の知識が無い人や、できれば既存のものを利用したい人は、Oniguruma for Javaという拡張パッチを利用することができます。

Windows、およびGNU/LINUX向けのマルチスレッド対応用マクロが定義済みです。

Java向けの拡張機能は、フラグMORE_SUPERIOR_JAVA_SUPPORTを定義した場合にのみ有効になります。

matssaku at 21:34|PermalinkComments(0)TrackBack(0)clip!C