SSブログ

Zope4Intranets 日本語版リリース [Zope 3]

1月という予定はちょっと遅れたけど、無事リリースされてよかったですね。

http://www.zope.co.jp/pr/z4i3jrelease
確か、Zope2 版の Zope4Intranets は 1000万くらいしたような気が。
#今回リリースされたのは Zope3 をベースにした製品。
それを思えば、180万からなら、まぁまぁリーズナブルな価格かと
(私が買えないことに変わりはありませんが)
・・・いや、「から」っていうのがポイントなのか?

なんだか、リリースのお知らせが控えめすぎないか?
Open Souce Japan のトップにも載せてあげればいいのに
http://www.opensource.co.jp/


Zope interface とは [Zope 3]

Zope 3 では、Zope 3 の開発過程で発明された zope.interface というのを使っています。
twisted でも、この zope.interface を使ってます。
じゃ、ここでいう interface っていうのは何なんでしょうか?

ひとことでいうと、
「クラスのインスタンスがどんなメソッドを持っているか外部(そのインスタンスを使う側)に知らせるもの」
でしょうか。
宣言しているところを見ると、C++ の抽象基底クラスみたいなもんです。
(宣言だけあって実装コードがない)

Java にも interface っていうのがあって、zope.interface に似ているように思えます。
でも、私は Java の interface とはちょっと違うと思います。
私は、 Java のことをとやかく言える程の人間ではありませんが、Java の interface は、
1.Java は多重継承ができないので、制限された Class として継承する基底のもの
2.Class の外部からアクセスできる機能を提示するもの
の意味があると思います。
そもそも Python では、多重継承ができるので(できれば偉いってわけじゃありませんが)zope.interface には、1. の必要はありません。
で、zope.interface って、2. の意味合いで存在していると思うんです。

だから、zope.interface は、Java の interface じゃなくて、むしろ Microsoft の COM(Component Object Model) のインターフェースに似てるなぁと思ってます。

http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/components.html
によると、Mozilla API っていうのが、Zope 3 の Component Architecture に似てるそうです

「じゃあ、COM のインターフェースって何?」っていうのにちょうど良さそうな文章発見。
COM プログラミングの基本(上)
http://www.microsoft.com/japan/msdn/thisweek/combasics/combasics1.asp
(中とか下になると、COM 固有な話になるので、COM については知りたくない人は上だけ読めばいいかと)

COM で C++ の場合、QueryInterface() で、インターフェースを取得して、そのメソッドを呼び出してますが、(同時にインターフェースが実装されているかどうかも判定)同じようなことを Zope3 でもやってます。

たとえばクラスのインスタンス foo について、IFoo インターフェースで定義されてるメソッド fooMethod() を呼びたい場合

COM の場合

foo->QueryIntreface(IID_IFoo, &pi)
if (pi) {
  pi->fooMethod()
}


zope.interface の場合

if IFoo.providedBy(foo):
  foo.fooMethod()
else:
  print "not implements fooMethod()"


みたいな感じ。
#ん、そうすると zope.interface では、異なるインターフェースで同じ名前のメソッドが宣言できないのか
Zope3 では、あるクラスがどのクラスを継承してるか?ではなくて、どのインターフェースを implements しているかが問題なんです。


The Zope 3 Developer's Handbook の 23章 [Zope 3]

Availability via XML-RPC
http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/xmlrpc.html
REST と XML-RPC についてちょっと調べたので、
http://blog.so-net.ne.jp/nakagami/2006-01-16
Zope 3 の Content で XML-RPC をどう取り扱えばよいか、Zope3Book を読んでみた。

以下、気付いた点

Zope 3 とは関係ないけど、XML-RPC は、UNICODE と None に対応する型をもてないので注意。

Zope3Book の例では、
Message に実装する XML-RPC のメソッドが MessageMethods
MessageBoard に実装する XML-RPC のメソッドが MessageBoardMethods
さらに、上の両方のクラスの基底クラスとして MessageContainerMethods が定義されているのでちょっと分かりづらいが、要するに、Zope3 の Content に XML-RPC のメソッドを実装するには

1.zope.app.publisher.xmlrpc.MethodPublisher を継承したクラスを作る
2.新しい Content object を追加した場合
 zope.event.notify(zope.app.event.objectevent.ObjectCreateEvent(obj)) してあげる
3.Content object のプロパティを変更した場合
 zope.event.notify(zope.app.event.objectevent.ObjectModifiedEvent(self.context)) してあげる
4. configure.zcml で xmlrpc という namespace に view というディレクティブがあるので、XML-RPC で使えるようにするメソッド名とクラス名を書いてあげる
 
XML-RPC サーバーを作るのはとっても簡単そう。
(・・・本の内容についてはここまで)

REST については、XMLを返す browser:view を作ればなんとかなるかなぁと思ってるけど、
Zope 3 の View の ZPT で content-type に text/xml を渡すのがうまく行くかどうかは調べてない。


Zope 3 のインスタンスを作って起動 [Zope 3]

http://blog.so-net.ne.jp/nakagami/2006-01-15-1 の続き
下記の手順(太字のところを入力)すると、C:\Zope3Instance にインスタンスができます。

C:\>C:\Python24\Scripts\mkzopeinstance
Please choose a directory in which you'd like to install Zope
'instance home' files such as database files, configuration files,
etc.

Directory: C:\Zope3Instance ←インスタンスをインストールするディレクトリを指定

Please choose a username for the initial administrator account.
This is required to allow Zope's management interface to be used.

Username: admin ←管理者の ID (この管理者のパスワード設定に続く)

Please select a password manager which will be used for encode the password of
the initial administrator account.

 1. Plain Text
 2. MD5
 3. SHA1

Password Manager Number [1]: 3←パスワードのエンコード方式を選択
'SHA1' password manager selected

Please provide a password for the initial administrator account.

Password:secret password←パスワード(実際には表示されません )
Verify password:secret password←上と同じパスワード(確認用)


Windows 固有のパスの指定の仕方を除けば、Unix/Linux でも同様です。

C:\Zope3Instance\bin\runzope を実行すると Zope3 が起動し、
http://localhost:8080/manage から、上で設定した管理者のユーザーID/パスワードでログインできます。


Zope 3 を Windows にインストール [Zope 3]

バージョンが変わると、微妙に変わるけど、以下は Zope 3.2 をインストールする場合

あらかじめ Python 2.4.2 をインストールしておきます。
http://blog.so-net.ne.jp/nakagami/2006-01-15

http://www.zope.org/Products/Zope3 から
Zope-3.2.0.win32-py2.4.exe をダウンロードして実行します。

「次へ」のボタンで進んでいくと、インストールが完了します。

Unix/Linux の場合は、Nagosui.org さんところの README.txt の日本語訳参照
http://nagosui.org/Nagosui/COREBlog2/zope3-install-readme


Zope Corporation が Zope3 package 寄贈 [Zope 3]

英語の ML なんて読む読解力がないのだが、なんとなく Subject に反応して読んだ。
http://mail.zope.org/pipermail/zope3-dev/2006-January/017406.html
Zope Corporation が、自社のリポジトリから zope.org の Subversion リポジトリに package のソースを移した(=寄贈した)そうな。

(1)zc.catalog
 既存の Catalog の拡張
(2)zope.locking
 zope.app.locking の代わりになるもの
(3)zc.i18n
 一義的には、(2)zope.locking の中の zope.locking.browser で使ってるから

ということだそうだ。どういうもんか良く分からないが、喜ばしいことには違いない。
(1)(3) は、zc. と付いてるから、最終的には整理されて zope.app とかのソースにマージされてリリースされるんだろうなぁ、と思う。
いずれにせよ、IBM が Linux に力を入れて利益を上げているように、Zope Corporation も、こういう活動で利益が出て、Guido さんを社内で遊ばせておけるくらいになるといいなぁ・・・。

ところで、上の package を入れなくても、Zope3 に Site の中に Catalog というオブジェクトが追加できるようになってるけど、使い方が分からない。
Zope3 も 3.2 になって、あとは Catalog さえ使えれば十分実用になるとおもってるんだけど・・・
だれか教えて!


Zope 3 のメッセージの国際化 [Zope 3]

なんだかゴチャゴチャしているようにも見えたけど、整理するとそうでもないか。
Plone や GNU でメッセージ翻訳をしている人には難しくないんだろう。
だんだん、自分専用メモになりつつあるが・・・
かなり、怪しい理解なので、間違ってたらつっこみを希望!

CMF/Plone と同じように、GNU gettext のフレームワークで国際化がなされている。
http://ja.wikipedia.org/wiki/Gettext

日本語(や、その他英語以外)のメッセージファイルはなくても動くので、
まず、英語メッセージで Zope3 の国際化フレームワークで動くようにパッケージを書いても良い。

翻訳単位(範囲)として translation domain というのを決める。 パッケージ単位になるのが普通。
translation domain というのを決めたら・・・

【メッセージの埋め込み】
メッセージの埋め込む場所は、大きく分けて3種類ある。
1.ZPT のメッセージ
 i18n:domaon="xxxx" でドメインを指定して、i18n:translate="yyyy" でメッセージ変換
http://www.zope.org/DevHome/Wikis/DevSite/Projects/ComponentArchitecture/ZPTInternationalizationExamples

2.Python コードのメッセージ
http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/i18noverview.html の 10.5..1 あたり

3.ZCML の borwser schema view のメッセージ
 Message ID をブラケットで囲んで label="[label-edit] Edit" とかする。
 ブラケットで囲んであるのの次が fallback message

Message ID に意味の通る英語を書いて置けば、該当する言語のメッセージファイルがない場合は、その Message ID を fallback message として表示する
(上記 3. は fallback message の指定はちと違うけど)

【pot/.po/.mo ファイルの作り方】
基本的に GNU gettext↓ と同じく、.pot → .po → .mo の順番にファイルを作る。
http://ja.wikipedia.org/wiki/Gettext
.pot → .po は、コピーしてファイルの編集
    (poEdit とか専用のもあるし、UTF-8 が編集できる普通のエディタでも良い)
.po → .mo は、GNU の msgfmt を使う
なので、Zope 3 特有なのは、パッケージのディレクトリを指定して、その中にある
1.ZPT/2.Python/3.ZCML browser schema view からメッセージを抽出して .pot を作成する操作。

Zope3 に含まれる i18nextract というコマンドで、オプションに
-p パッケージの保存してあるディレクトリ
-d translation domain
-o 出力するディレクトリ
を指定する。

【translation domain と .mo ファイルの指定】
ZCML で i18n_domaon="xxxxx" としてtranslation domain の指定
.mo ファイルのありかは i18n:registerTranslations directory="yyyyy" とディレクトリを指定しする
そうすると、Zope3 君は、yyyyy/ja/LC_MESSAGE/xxxxx.mo に、日本語メッセージの .mo ファイルがないか探す。

(その他参考リンク)
GNU gettextユーティリティ
http://ring.atr.jp/archives/doc/gnu-info-j/gettext/gettext-ja.html


Zope 3.2.0 からは twisted 付き [Zope 3]

http://enbug.tdiary.net/20051226.html#p01
>何にもしないでただ読むだけの場合、 ZopeはApacheより18倍遅いです。
なるほど、まぁまぁですね。
ところで、
>Twisted化されたら、どうなるんだろうとか
とのことですが、Zope 3.2.0 から(正確には 3.2.0 beta1 から)は、
組み込みの Web サーバーは twisted になってます。
#と、書いておけば誰か速度比較してくれないかな

Twisted になったからといって、速くなるとは思えませんが zope.conf をみると、
(twisted ベールになったおかげで) https プロトコルも喋れるみたいです

ここ↓の最後にあるやつは、twisted ベースでメールを受け取って処理してます。すばらしい!
http://www.freeml.com/message/zope-memo@freeml.com/0000907
(残念ながら、今はアクセスできませんなぁ・・・以前見たときはそうでした)

というわけで、Zope 3 Develper's Handbook の 19 章はもはや動かない気がします。
http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/events.html
たとえ、動くにしても、内容的にはもはや古くなっちゃってるわけで、ナウな Zope 3 君には、なかなか追いつけません。


The Zope 3 Developer's Handbook の 14章と24章と 28章 [Zope 3]

HTTP の View に関する章の主だったところで、ざっと気付いたことを書いた、かなりいい加減なメモ。

[14章] Content の View を定義
Plone でいうところの、portal_types の、type 毎の、 Initial view name で指定しているものや、Action で指定しているもののように、Content に関連付けられた View を ZPT で書く
#configure.zcml で簡単な、入力フォーム、編集、一覧表示を出すのは 13章でやった

ポイントは、configure.zcml の browser:page ディレクティブで
1.name = URL として参照できるファイル名 xxxxx.html
2.for = どのインターフェースに対してのビューか
3.class = ZPT から呼ばれる View クラス
4.template = ZPT のファイル名
5.permission = アクセスするパーミッション
7.menu と title = ZMI に追加するメニューの項目
を指定すること。3. と 7. は必要なければ、指定しなくても良い。

3.で指定する class に、Content のオブジェクトがコンストラクタの2番目の引数として渡される。
このリスト↓で言うと、context が Content のオブジェクト。
http://svn.zope.org/book/trunk/messageboard/step02/browser/thread.py?rev=27149&view=auto
View クラスでは、def __init__() で、2番目のパラメータ(context)を自分のメンバー変数に設定して、メソッド(上の例では listContentInfo)が呼ばれたときには、その変数を参照して操作するのがお決まりパターン。

ZPT からは "context/title" とするとオブジェクトのプロパティが、"view/author" とすると View クラスのメソッドが呼べる。
View クラスのメソッドが辞書を返し、それを ZPT で参照している例は ↓の parent_info の所。
http://svn.zope.org/book/trunk/messageboard/step02/browser/message.py?rev=27149&view=auto
http://svn.zope.org/book/trunk/messageboard/step02/browser/details.pt?rev=27149&view=auto

View クラスから ZPT を呼ぶのは ViewPageTemplateFile を使う
ここ↓で、再帰的に subthread.pt を呼んで、ツリー構造を作ってる。
http://svn.zope.org/book/trunk/messageboard/step02/browser/thread.py?rev=27149&view=auto

ここ↓では、metadata(DublinCore)からプロパティ値を取得してる。
http://svn.zope.org/book/trunk/messageboard/step02/browser/message.py?rev=27149&view=auto
(ZPT で直接 Dublin Core の中身は見れなくて、class のメソッドを経由しないとダメ)

View の namespace にアクセスするには、URL で @@ を頭に付ける。
たとえば、ルートにある foo オブジェクトに bar.html という page でアクセスしたい場合、 http://somehost/foo/@@bar.html とする。

[24章] Skin の話
例えば、SomeSkin というスキンでは、http://hostname/++skin++SomeSkin/foo/@@bar.html
という感じで、++skin++ のあとに skin 名を指定してアクセスする。
(もしくは、デフォルトの skin を etc/overrides.zcml に書く)
インストールした状態で、
・Basic(zope.app.basicskin)
 基本的な機能だけを持った skin。default レイヤーは zope.component で定義されてる
・Rotterdam(zope.app.rotterdam)
 デフォルトの skin
・StaticTree(zope.app.tree)
 Rotterdam との違いは、ナビゲーションに JavaScriptを使わないところ
・Debug(zope.app.debugskin)
 エラーの時の Traceback を画面に出力する
という skin があって、Subversion から取ってきたソースでは、さらに ZopeTop というカラフルな skin がある。
skin が書けるようになるためには、ここらへんの skin がどうなっているか見るのが一番速そう。
パッケージを書くというのと、skin を書くというのは分けて考えたほうがいいと思う。
(専用の skin のないパッケージもあるし、新規の Content を定義しないで、skin だけ書いても良いわけで、)

Zope 3 の skin は、CMF/Plone のように TTW で設定・定義できないが考え方は同じで
・skin は、skin ディレクティブで定義して、いくつかの layer で構成されている(順番あり)
・layer は layer ディレクティブの中で宣言
・page ディレクティブで、ZPT がどの layer に属するかを書く
という感じ。

[28章] Content に結びつかない Browser リソースを定義する方法
・・・だけど、Content に結びつかないリソースで、skin でもないものをわざわざ定義する場面(使い道)を思いつかない。
データの中身をPython で処理しないリソース(テキスト、ファイル、イメージ等)を配置するのに使う


The Zope 3 Developer's Handbook の 16章  [Zope 3]

http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/secureobjects.html
Zope 3 のセキュリティ設定に関する章ですが、本の内容とはちょっと離れて説明することにします。

Zope 3 のセキュリティ設定に関する単位として
1.Permission
2.Role
3.Principal
の3つのものがあります。

Permission は、Zope2 の Permission と同じで、許可・不許可の単位みたいなものです。
この章では、configure.zcml で
・book.messageboard.View(表示)
・book.messageboard.Add(追加)
・book.messageboard.Edit(編集)
・book.messageboard.Delete(削除)
という4つの Permission を定義しています。
よりたくさんの Permission を定義して、インターフェース毎に別々の Permission を
付けていけば、権限設定がより細かく出来ることになります。

Principal は、Zope 2 とか、Linux でいうところのユーザーに相当するものですが、
PAU の Group Folder Plugin http://blog.so-net.ne.jp/nakagami/2005-11-21
のように、1つの Principal が複数のユーザーを表している場合もあります。

Role も Zope 2 の Role と同じで権限の単位みたいなものです。

以上をふまえ、Zope 3 のセキュリティの設定とは
・Permission を定義 (confiugre.zcml の permission ディレクティブ)
・インターフェースを Permission に関連付ける (configure.zcml の require ディレクティブ)
・Permission を Role に与える
・その Role を Principal に与える
という操作をすることになります。

Zope3Book では、Role の設定も、Principal の設定も configure.zcml にしてますが、
Zope 3.1 では、Site に Local Utility で Role や Principal が定義・設定できるので、 configure.zcml をいじるっていうのは(やれば出来ますが)あんまりないような気がします。
Permission も Site に追加できるみたいですけど、今のところ良い使い道を思い付きません。

以上、ゴチャゴチャしてますが、考え方は Zope2 と変わりないので、
Zope2 でセキュリティの設定をしたことがある人は分かってもらえる気がします。

(参考)Zope3 の PAU の設定
http://blog.so-net.ne.jp/nakagami/2005-11-17
http://blog.so-net.ne.jp/nakagami/2005-11-21