HOME | ドキュメント |  ブログ  |  BBS  |  瓦版  | 将棋プロジェクト |  物置小屋   

象歩 ドキュメント

Categories
Zope (46 items)
歳時記 (26 items)
工作 (19 items)
将棋 (25 items)
料理 (2 items)
Vine (27 items)
Squeak (2 items)
(1 items)
雑記 (4 items)
Python (19 items)
ZOPE3 (3 items)
Linux (6 items)
(1 items)
道具 (3 items)
買い物 (1 items)
PC工作 (2 items)
ボート (3 items)
Recent Entries XML
Recent Comments
Recent Trackbacks
Archives
Zope
Zopeの話

21 November 2003

手始めにいじぐり回すことが肝心。

COREBlog
Zope  

ものは理解しないと何も生まれません。
「スキンをカスタマイズしてください。blog_headerとstyle_cssを変えるだけで,大分いろいろ遊べるはずです。」by Ats.
ということで、試してみよう。
少し邪道ですが、試しで象歩に似せてみることに;;


22 December 2003

面白い^^

COREBlog
Zope  

既存のサイトに組み込むのもあっけなく終わった。
スキンでオリジナルにすぐに戻せるのでカスタマイズに不安はない。
記事の文字なども見易い。こういう細やかなセンス好きです。
較べるレベルじゃ無いけど、象歩のスタイルシートひど過ぎるので直すことにしました。
さっき IE で見たら最低 (T_T;)


23 December 2003

どこぞで恥じさらしてきたので

COREBlog
Zope  

COREBlog バグフィックス版 rpm 作りました。(fixed_utility053.py )
また新規に JapaneseCodecs の rpm 作りました。
Download に置いてあります。
JapaneseCodecs は Seed 版 Python には最初から組み込まれているので問題ありませんが、Vine-2.5 マシンには今まで入れてませんでした。
unicode メソッドで encoding が未定義と出て初めて気が付きました。

今まで mozilla と IE があまりにも表示が違っていたのですが、
mozilla のフォントを 16 ドットにしたら似たような感じになりました。
今まで kterm を 14 ドットにしてたので mozilla も同じにしてました。
井の中の蛙は世間を知らないものですねー、ゲロゲロ


24 December 2003

既存のサイトへの取り込み方

COREBlog
Zope  

此処のサイトでは既存の構成の一部として COREBlog を取り込みましたが、plone で取り込んでる方もおられるようです。
http://tomster.org/blog
やり方は簡単で skin の中の blog_header と blog_footer を自分のサイトにあるヘッダとフッタに置き換えるだけです。(plone は知らないけど)
この時 style_css へのリンクは残して置きます。
http://coreblog.org/ping/
これ見ながら斬新なサイト現れないかと期待しているところです。
逆に、あおられてる気もしなくも無いですが。


25 December 2003

utility.py のパッチを作りました

COREBlog
Zope  

excerpt に文字化けが発生するのでパッチ作りました。
文字列を指定された長さで切り出すモジュールが UTF-8 に対応していないようです。Shift_JIS もついでにコードを修正しました。
ここに修正したソースとパッチ置いてみました。

UTF-8 は今のところうまく動作しているようですが、Shift_JIS の方は単体でしか試験していません。環境のある方に試していただけると助かります。
さて、初めて Trackback 使ってみよう。ドキドキ

補足:これは元々 kiyo さんが発見して BBSに投稿してくれた問題です。


Trackback は成功したけど

COREBlog
Zope  

無事 Trackback は成功したみたいだけど、COREBlog 本家でタイトルが化けている。本文は excerpt の文面通りで問題ないようです。ブラウザの表示を UTF-8 に切替えるとタイトルはちゃんと表示されました。ただ最下行の Posted by の次からやっぱり文字が化けている。
やはり UTF-8 の短い文字列は Shift_JIS と判定されてしまうのかなー

あと Entry 追加画面で [Preview Entry] 押すと
Error Type: KeyError
Error Value: rendered_body
と Zope のエラーが出ます。ゆっくり調べよう。


26 December 2003

COREBlog 04b から 053b にアップしてるので

Zope  

最初に入れたのは COREBlog04b で徐々に 053b までバージョンあげているので、此処のスキンに少し不具合がありました。rss が表示されないとか、trackback の url が表示されないとか。
だいたい一ヶ月もほったらかしにしといた私がいけないのですが。
昔の skin/default と最新のものと diff して必要なところを手で書き換えたので、だいたい最新版に近くなりました。
うまい具合に [Preview Entry] でのエラーも出なくなりました。

もう一つ RSS/RDF をクリックした時にエラーが出たのですが、contents タグの rdf91_xml, rdx10_xml を修正したら直りました。
最初の <dtml-call...> と次の <?xml...> の間の改行が良くないようです。私は手で消しました。最新の COREBlog053 では直っていますので、最新版入れれば解決します。家の COREBlog はバージョンがいろいろなのでした。


27 December 2003

JCodeChangerをSourceForgeに登録

Zope  

この前こしらえた Zope オブジェクトの文字コード変換ツールを SourceForge に登録しました。
ドキュメント等未整備ですがサイトを UTF-8 化しようとしているなら役立つかもしれません。ただサイトを UTF-8 化した場合いろいろ問題が出ると思うけど、まだあまり良く理解できてません。google で "zope utf-8" などで検索すると、zope 入れるなら最初から UTF-8 が良いなどと云うアドバイスがよく目に付きますが、今のところ自分はまったくそう思って居りません。

SourceForge の使いかた良く判らなかったけど何度か試しているうちになんとかなったようです。ちとレスポンスが遅いので時間がある時じゃないと辛いかもしれないけど、設定したものが間違っていても大部分は後で修正できるのでなんとかなるようです。
CVS は詳しくないので cvsbook日本語訳に一通りは目を通しました。他にも良さそうなサイトあったけど。


29 December 2003

COREBlog BugTracker に投稿

Zope  

小さなバグ二つ見付けたのでBugTrackerに投稿してみました。
なかなか云いたいこと書けませんね。最近は日本語も怪しくなってきたので少し言語系を勉強してみようかと考えて居ります。
今からでも遅くはないはず、だってまだ先は長いはずだから。

投稿内容は下記二点です。
1. mozillaでsideboxの右側が切れてしまうこと。
2. previewするとbodyに書いた特殊文字が変換されてしまう件。
一応こちらで直してみたけど、それで良いのか判らないし。


10 January 2004

忙しい週末

COREBlog06a, Zope-2.6.3
Zope  

COREBlog に検索機能が追加されたので使ってみました。ejSplitter-0.3 で UTF-8 の場合に不具合ありましたが、柴田さんに教えていただいた方法でうまく検索できるようになりました。

昨日急に Zope-2.6.3 がリリースされ、多くのセキュリティ問題が解消したらしいのですが、オブジェクトの rename ができないという問題があります。このへんは深町さんの記事がとても参考になりました。いつもながら感謝してます。もう脆弱性が公開されてしまったのだから多少の不具合があってもアップデートするしかないということで公開鯖だけ Zope-2.6.3 に切替えました。rpm も作ったので ftp に置きました。

まだまだあるけど、それはまたあとで...
そして娘の誕生日でもあります。幸せは至ところに、ヱーメン。


14 January 2004

Vine 用の zope パッケージについて

ちゃんと説明を書かんといかんな、と思ってました。
Zope  

昨日 Vine の rpm の話が出たのでちょっとだけ説明します。
Vine 用 zope rpm (vine-plusのものも同じ) でインストールした場合、/usr/share/zope26 は zope 本体なので普通いじる必用はありません (zope をハックする時は別です)。ユーザ (zope26)用として /var/zope26/var 以下にインスタンスが出来、追加 product や import ファイルは /var/zope26/Products, /var/zope26/import 以下に入れます。

立ち上げスクリプトは /etc/rc.d/init.d/zope26 になっているので Vine のブート時に自動で立ち上がるはずです。手動で立ち上げる場合は、スーパユーザで /etc/rc.d/init.d/zope26 start を実行します。

あと glibc とかバージョンが合わない場合には、ソース rpm をダウンロードして、
$ rpm --rebuild ***.src.rpm
と環境にあったバイナリを自分で作成できます。なお RPMSにはバイナリ版、 SRPMSにはソース版を置いています。
Zope-2.6.3+パッチの rpm作りました。rename のバグ直ってます。

最後になってしまいましたが、昨日はとても楽しい時間過ごせました。どうもありがとうございました。また機会があれば参加したいです。御迷惑かけた方いらっしゃったら、ごめんなさい。煙が目にしみた方にも...


17 January 2004

Zope-2.7 がリリースされる前に

中神さんが help 求めてます!
Zope  

zope-devから始まるスレッドで議論が起き、zope-memoで問題提起されていますけど、なさけないことに理解できてません。日本のユーザにとっては、こういうことが極めて大事なことなのだけど、ついつい逃げてしまってました。明日はこれ考えないとまずいと思ってます。
最初はmooyaさんのところで見付け、次に見付けたのが深町さんの記事投稿なのですが、内容を良く理解してないまま時間がたってしまいました。危機管理とか行動の優先順位がなまぬるいと反省。後からパッチあてるんじゃ自分の仕事と一緒じゃないのと。オッ


18 January 2004

ZODB の pack でエラー

うーん
Zope  

下記のようなエラーが出てしまいました。とりあえず報告のみですが。環境は Zope 2.6.3 + rename パッチ, python 2.1.3 です。

Zope has encountered an error while publishing this resource.

Error Type: CorruptedError
Error Value: /var/zope26/var/Data.fs:7848055:time-stamp reduction: 032933760daf50bb <= 03524d3118b6b077

Traceback (innermost last):

  • Module ZPublisher.Publish, line 98, in publish
  • Module ZPublisher.mapply, line 88, in mapply
  • Module ZPublisher.Publish, line 39, in call_object
  • Module App.ApplicationManager, line 354, in manage_pack
  • Module ZODB.DB, line 526, in pack
  • Module ZODB.FileStorage, line 1503, in pack
  • Module ZODB.fspack, line 680, in pack
  • Module ZODB.fspack, line 464, in findReachable
  • Module ZODB.fspack, line 478, in buildPackIndex
  • Module ZODB.fspack, line 175, in checkTxn
  • Module ZODB.fspack, line 170, in fail
CorruptedError: /var/zope26/var/Data.fs:7848055:time-stamp reduction: 032933760daf50bb <= 03524d3118b6b077


04 February 2004

Zope-2.6.4rc2のバグ

こまかい話だけど
Zope  

Zope-2.6.4rc2でファイナルかと思っていたら zope-dev にちょっとしたバグ報告があります。python script でデフォルト引数を使用する場合、"=" 等号の前に " " 空白を入れてはいけないようです。今、実際に確認してみました。でもこれって前からじゃなかったっけ?


21 March 2004

COREBlog カテゴリのロゴを表示

だんだんと繁雑な感じになってきたかなー
Zope  

Category 編集フォームに icon_path 欄があるがどう使うのかと考えて居たところ、princoさんの処でカテゴリにロゴが付いてるのを見付けたので、早速ものまねしてみた。ちなみに将棋は「宗歩」の名人駒です (笑


スキンの中に entry_body というドキュメントメソッドがあるので、カテゴリ表示の部分を書き換えただけです。

<dtml-comment>* Show categories.</dtml-comment>
<div class="category">
<dtml-in entry_category_list>
<a href="<dtml-var blogurl missing="">/categorylist_html?cat_id=<dtml-var id>">
<dtml-if icon_path><img src="&dtml-icon_path;" border=0 style="float:right;" alt="&dtml-name;"><dtml-else>
[&dtml-name;]</dtml-if></a> 
</dtml-in>
</div>

22 March 2004

LocalFS 1.2 andreas

Zope  

zope 2.7 系で LocalFS 1.0.0 がエラーになります。 CVS から持ってきた 1.1.0 では動作するようですが、管理画面の View タグが効かないし、URL 指定してもファイル一覧が表示されません。ところが、今 LocalFS-1.2-andreas 試してみまたらうまく動作するようです。zope-devの記事で見付けました。View タグも URL 呼出しもちゃんと表示されます。


他にも最近出た ZFSPathなどと云う低レベルの関数群を使えるプロダクトも便利そうです。Python Script からローカルなファイルを操作したり、ディレクトリを辿ったりできます。管理画面で Document タグをクリックすると説明が表示されます。これはpath.pyというモジュールを使うので python 2.2 以降が必要になります。一応 rpm も作って置きました。

24 May 2004

CBEditor-0.1 公開

Zope  




COREBlog クライアント作ったので、公開します。
ここに置きました。


展開した後、実行用シェルスクリプト cbeditor を起動してください。
一応 COREBlog0.7b (UTF-8, EUC-JP) で確認してあります。
COREBlog の "Settings" タブの "Blog client Settings" で UTFー8 を指定しないと継りません。

28 June 2004

ディレクトリをクエリのように使う?

Zope  

僕は今日まで知らなかったので...

例えば '/mysite/test1' という python script 作ります。

return container.REQUEST

これをブラウザから 'http://***/mysite/test1/123' などとして見ると REQUEST.traverse_subpath に '123' と設定されます。これって CGI っぽいですよね。で、


DTML DOCUMENT を /mysite/mydoc なんて名前で作ります。

<dtml-var standard_html_header>
<dtml-var REQUEST>
<dtml-var standard_html_footer>

そして '/mysite/test2' という python script を作り

return container['mydoc'](container, container.REQUEST)

ブラウザから 'http://***/mysite/test2/123' を覗くと Document 'mydoc' に '123' が渡ってます。 何を言いたいか? ディレクトリをクエリのように使えるという事。ただそれだけですが、なにか。

03 July 2004

象歩BBSを改造してみた

改良になってると思うけど
Zope  

うちのBBSをちと改造しました。URLも若干変更になってます。以前のURLでもリダイレクトしているので大丈夫なはずです。説明はここに書きました。もしリンクをクリックして移動できたら成功です。不具合あったら教えてください。


13 July 2004

今は道しるべがないかも

Zope Changelog なんかも必要なのかなー
Zope  

現在 Zope 使っている人達は腕に自身があるし、経験もあるので断片的な情報でも次に進めます。でも、なにも知らず入って来た初心者は迷うのではないのかなどと考えてました。
例えば世間では子供が遠足に行くときには、親は水筒やおにぎり、そして雨カッパくらいは持たせてやるものだろう。まして一人なら地図くらいもたせてやらないと。
(以前 koyoshi さんが作られた BeginnersHandicap のような初心者向けイントロを置いてあるサイトなど、現在は無いも同然)
あぁ、入門者の道標になる zope の日本語サイトなど今は無いことに気付いてしまった。


仮に自分が初心者になったとすれば、信用してついていけるサイトがほしいと思うし、zope をインストールするにもなるべく最新の情報がほしいなどと贅沢なことを思う。ところがちょっとした小石にもすぐ躓くの判っているので "てにをは" 程度の typo も無いにこしたことはない。でもそういうサイトを維持すのはとても大変だと思し、僕にはできない。ちょっと無責任だけど、そう思いました。(能力すらない)

14 July 2004

Hotfix_2004-07-13

Zope  

夜中に突然失礼します。Zope サイトに Hotfix 出てます。これは Page Templates のセキュリティバグの修正らしい。
影響範囲は Zope 2.7.0, 2.7.1。僕は樽使いじゃないので解かりません、正確な情報は本家で確認してください。
とりあえず Hotfix_2004-07-13.tar.gz を解凍しプロダクトディレクトリにコピーすれば良いらしい。


Hotfix で METALError 発生

Zope  

さっそく Hotfix をローカルなマシンにインストールしたのですが、ZWiki-0.32 の FrontPage を開くと "METALError" が発生します。うちはテンプレートは関係ないと思ってたけど意外なところで使ってました。

zope-mlでも報告が上がってます。いまのところ最終の投稿は Josef Meileさんの Zope-2.7.2RC1 をインストールしたらうまくいったと言う話。


2004-july/151797 -- Fred Drake

This hotfix product fixes a security bug in Page Templates. This fix ensures that values substituted in named slots in translated elements are properly encoded. If encoding is not desired and the source of the replacement text is trusted, the "structure" modifier can be used with the tal:content or tal:replace attribute to explicitly disable encoding.

2004-july/151798 -- Mike Ekstrand

I installed the hotfix on my Zope 2.7.1 install (platform: win32), and am now getting errors in some pages using METAL.

2004-july/151802 -- Fred Drake

This is surprising. Did you restart Zope or did you somehow add the product to a running Zope process?

2004-july/151804 -- Mike Ekstrand

I restarted Zope via the Restart button in the Control Panel (have not tried restarting it via Win 2K3 Service Manager). Most of the site does not use any METAL and is working fine. Just the METAL portion is broken.

2004-july/151820 -- Florian Schulze

I get the same for every plone site in my zope installation.

2004-july/151825 -- Josef Meile

Yup, same here. I'm running Zope 2.7.1 + Hotfix_20040713 under gentoo linux kernel 2.4.22. I have a product which uses some macros and with the patch doesn't work. Removing it everything works perfectly.

2004-july/151827 -- Josef Meile

Ok, I solved it by installing 2.7.2-RC1. It seems that there is something wrong with the hotfix.

Zope-2.7.2-RC1

Zope  

と云うわけで Zope-2.7.2-RC1 をインストールしました。ZWiki も快調です。


21 July 2004

logrotate ログの更新

Zope  

一般的に Zope 2.7 のログを保存するには

# cd /var/log/zope
# mv event.log event.log.bak
# mv Z2.log Z2.log.bak
# /var/lib/zope/bin/zopectl logreopen

などとしますが、バックアップを履歴管理するとなるとシェルスクリプトを書いて、 cron で処理することになると思います。

もし logrotate がインストールしてあればもう少し容易にできます。実際 Vine では syslog や apache など主だったものが logrotate を使っています。


たとえば次のようなファイルを /etc/logrotate.d/ の下に作ります。(ファイル名は zope とでもします)

/var/log/zope/event.log /var/log/zope/Z2.log {
    missingok
    notifempty
    postrotate
        /var/lib/zope/bin/zopectl logreopen > /dev/null 2>&1 || true
    endscript
}

これだけで一日単位のローテーションができます。設定ファイルはこれと /etc/logrotate.conf です。詳しくは man logrotate で調べてください。

他にも便利な方法あるかもしれません。同じく logrotate を使う方法、zope の logger を使う方法など。私はとりあえず Vine の環境に合わせる?スタンスです。

06 August 2004

reStructuredText

今のうちになんとか
Zope  

書式に関しては LowLife瀬戸山春輝 さんのところが参考になるようです。まだ試していませんけど;;

"ReStructuredText Document" オブジェクトは ZMI で add すれば作れますが、そのままではちゃんと表示されません。properties タグで encode 指定が必要です。

input-encoding  [utf-8    ]
output-encoding [utf-8    ]

他のプロダクト(ZWikiなど)でも使う場合、zope.conf で設定するほうが良いみたい。

rest-input-encoding utf-8
rest-output-encoding utf-8

さて、COREBlog で使用するには若干変更が必要です。 COREBlog HowtosSomething Red さん に説明があります。


ところが、どうも Zope で Locale の扱いに問題 があるようです。 原因を見付けた方 が居られました。で対処方法は、

zope/lib/python/docutils/languages
zope/lib/python/docutils/parsers/rst/languages
の en.py をコピーして ja.py というファイルを作れば良いそうです。ということで原因は ja.py が無いこと (それで落ちるコードもなんだかな) らしい。

最新の docutils-0.3.5 でも ja.py はありませんでした。そう云えば ZWiki-0.33.0 にも ja.po ファイル無かったですね;;

ちなみに vine は /etc/sysconfig/i18n で LANG="ja_JP.eucJP" を設定してあります。 python の中では 変更しないほうが無難 のようです。

16 August 2004

docutilsのUnitTestを試す

reStructuredTextで落ちる理由
Zope  

reStructuredText で落ちるのは、 docutils に ja.py ファイルが無いためであることの再確認。

docutils-0.3.5.tar.gz をダウンロードして試してみました。 PYTHONPATH には zope のパスを指定します。

$ tar xvzf docutils-0.3.5.tar.gz
$ cd docutils-0.3.5/test
$ export PYTHONPATH="/usr/lib/zope/lib/python"
$ python test_language.py en
....
----------------------------------------------------------------------
Ran 4 tests in 0.056s

OK

このように language code に "en" を指定すればユニットテストは通りますが、"ja" を指定した場合エラーになります。


$ python test_language.py ja
FFFF
======================================================================
FAIL: test_language.py: ja.py; test_labels (__main__.LanguageTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_language.py", line 99, in test_labels
    self.fail('No docutils.languages.%s module.' % self.language)
  File "/usr/lib/python2.3/unittest.py", line 270, in fail
    raise self.failureException, msg
AssertionError: No docutils.languages.ja module.
.
.
.

"docutils-0.3.5/docs/howto/i18n.txt" を読んでみると、Locale の設定で "en" とか "fr" などの切替えはできるようですが、"ja" などの場合、モジュールが入ってないのでエラーになる (デフォルトに置き換えたりしない) ようです。 新しいモジュールが必要なら 「"en.py" をコピーして作れ」と云うことらしい。

と云うことで "ja" モジュールを二個作ります。

$ su
# cd /usr/lib/zope/lib/python/docutils/languages
# cp en.py ja.py
# cd ../parsers/rst/languages
# cp en.py ja.py

そうすれば、ユニットテストも通ります。

$ python test_language.py ja
....
----------------------------------------------------------------------
Ran 4 tests in 0.056s

OK
モジュールが無い場合デフォルトモジュール (en とか) を読み込んでくれてもよさそうですが、あえてエラーにしてあるのかも (そのほうがモジュールの提供がはかどる?) と、いけない想像をしてしまうのはソースも読まずにいけません;;

やはり "ja" モジュールを docutils本家 に提供しないと。

26 August 2004

reStructuredText (3)

Zope  

問題解決かなー

<dtml-var reST fmt="reStructuredText">

が通らない件は zope collector Issue 1426 にありました。 docutils の方は分かりませんが、少なくとも zope 側には修正コードが入るようです。 また zope.conf に "rest-language-code" の設定が追加されるようです。たぶん zope 2.7.3 で。


reStructuredText 記法は ZWiki などでも使えるのでお徳です。

http://lowlife.jp/yasusii/wiki/restructuredtext.html

http://www.planewave.org/translations/rst/quickstart.ja.html

http://sakito.s2.xrea.com/moin/moin.cgi/reStructuredText

COREBlog を 074b 以前からアップデートした場合は skin の entry_body を修正する必要があります。

http://coreblog.org/jp/howtos/restructuredtext_howto_html

zope.conf に reStructuredText の言語コードも設定しないといけません。

http://somethingred.dip.jp/blog/ReST/

http://zope.fubyshare.net/Max/randomnotes/Zope27Conf

ついでと言ってはもったいないが、こんな記事で道草を。

http://zope.fubyshare.net/Max/randomnotes/Zope27ctrl

http://zopewiki.org/HowToRunUnitTests

http://sandbox.rulemaker.net/ngps/97

01 September 2004

ゾープ・ジャパン株式会社発足

Zope Japan Corporation
Zope  

公式サイトは http://www.zope.co.jp/ です。 プレス向け記事 の中の「経営陣のご紹介」を見て二度びっくり...

ニュース速報

検索は、今日からオープンした 「Google ニュース 日本版」 を早速利用させて貰いました。タイミングが良過ぎ (^^

blog系にもぼちぼちエントリされて来ましたが、 「日本のZope情報」早かったですね。

世界中の Zope 環境に幸あれ。乾杯 (^^


14 September 2004

Zope Developer Camp 2004

Zope  






とても濃過ぎ。とりあえず忘れないうちに。


Camp 一日目

7:00 出発
朝食をとって余裕の出発。
ところが箱崎まで二時間、意外に時間を費す。

11:30 河口湖
余裕が無いのでコンビニでおにぎり買って運転しながら昼食。
下りてから結構あった。

12:04 到着
すぐにノートの準備をする。心配してた無線 LAN は無事起動。
ところが web に継らないので教えを乞う。
田原さん曰く「それは zenkai さんに継らないだけですよ」
なるほど yahoo.jp にはすぐ継った (汗

13:00 頃から柴田さんの Zope 講義開始
CGI についての説明から始まり、まだ落ち着かないうちに解答を求められる。
しどろもどろで答えるが、運よく正解 (冷汗

product の手法では
「URL でアクセスしてほしくない関数に docstring をつけない」
んっ、こういう見方は完全に抜け落ちてました (大汗

17:00 講義終了
庭のウッドテーブルで雑談。
韓流の名字?は N 世代でローテーションするとか言う話を park さんに聞く。

18:00 夕食
あるべきものが無いので、それとなく打診してみましたが、
柿崎さんにたしなめられました (恥し
数十年ぶりにビールの無い夕食をありがたく頂く。
夕食の後は軽く寝るのが習慣です。

20:20 ころ田原さんの CMF 講義開始
離れた席にいたので若干不利。
こういう場合には心眼を使うしかない。
具体例は理解できなくても MVC モデルの雰囲気は掴めたような気が少し。

後半、欄水さんのツッコミが入る。
「ユーザ入力チェックはどこでするのか?」
skin ではしないし、共通化されたツールでもできません。
僕には解かりませんでしたが、考えるネタができました。

CMF サイトフォルダの下で共通の環境を使うらしい。
Acquisition との大きな違い。

23:20 講義終了

23:40 乾杯
Zope Developer Sprint と Zope Japan 設立を祝って乾杯
山本さん秘蔵のスライドを観賞する。
柴田さんが当初家族をさそっての会を考えていた理由もわかるような気がした。

昔スキー合宿で廃校になった小学校に泊まったことを思い出しました。
好きな趣味もってる人どうしが畳の上で雑魚寝した頃を。
同じ夢を見ながらの就寝でした。

Camp ニ日目

6:00 起床
まだみんな寝てるので、ゆっくり露天風呂に。そのあとは散歩。
宿に戻ると庭のウッドテーブルで中神さんが勉強してました。

8:00 朝食
おいしいコーヒーと共に食事。
その後休んでいると柴田さんがわざわざチェックアウトの連絡を伝えに、
これじゃいかんな。役割は分担しないと、と考えた。

10:00 少し前に田原氏の講義開始
COREBlog を CMF 化途中のソースを頂き説明をうける。
柴田さん曰く
「プロダクトは設計(幹)と実装(枝)に分かれます。COREBlog を CMF 化する場合には、
実装部分は利用して、幹の部分は CMF で設計しなおすと云う手も考えられます」
以後フリーハック的な雰囲気になりました。
将棋プロダクトのお店も少しだけ開けたので嬉しゅうございました。
liris さんに P2P の話が聞けなかったのが残念。

12:00 講義終了
宿の前で記念撮影

13:00 昼食
コーナーハウスでシチューを頂きました。
最初、欄水さんに半分あげると言いながら全部食べてしまいました。ごめんなさい。

15:00 出発(お別れ;;)
食べ過ぎでとても眠い。危ういので河口湖インター手前の駐車場で少しだけ休憩。
気合いを入れて、以後ノンストップ。

20:00 帰宅
なんとか無事に家に帰りました。


記入されてる時刻はあまり正確ではないと思います。
Product と CMF については別に書こうと思います。整理するには少し時間が必要です。

06 October 2004

COREBlog 1.0FC3

もう一年経ちますか
Zope  

COREBlog10FC3 が出たので入れました。 おまけに COREBlogRefererPlugin09b も。 COREBlog も相当枯れて来た(失礼;;)ようで不具合もあまり見付かりません。 スキンの設定画面で [Chenge Skin] ボタンのタイポくらいしか。 記事の [Preview] で "Error Value: 'previous_entry_item'" とエラーが出るのは既知の問題。

最初の版から約一年、良質のソフトを開発するのは確かに時間がかかると思います。1.0 を出すまではβを外さないと云う作者の頑固な姿勢はぜひ見習いたいと思います。

久しぶりにリファラ表示して見たところ、 エッチなサイトらしきリンクが表示されてしまいました。 どうも Zope や X3 という文字列がフェロモンを出してるらしい。 いらないリファラサイトを ZMI で削除しても消せません。 一回消えるのですが、また復活してしまいます。
少し前からコメントスパムらしきものも来てます。 とにかくリンクをバラまいているだけのようです。


08 October 2004

COREBlog 1.0 リリース

Vine でも使えますよー
Zope  

とうとう COREBlog 1.0 がリリースされました。 β版と云いながら、この一年有意義に利用させて頂きました。感謝。

Vine-3.0 から apt-get で Python-2.3.4 と Zope-2.7.2 がインストールできます。起動するには このへん の手順を参考にしてください。個別の設定は /etc/zope.config を修正します。

Python と Zope は下記のディレクトリにインストールされるはずです。

/usr/lib/python2.3 -- python
/usr/lib/zope -- zope 本体
/var/lib/zope -- zope インスタンス
/var/log/zope -- ログ
/etc/zope.conf -- 設定ファイル
/etc/rc.d/init.d/zope -- 起動スクリプト

rpm 作ったので右上の Download からダウンロードできます。

Zope-COREBlog-1.0-uvl1.noarch.rpm
Zope-ejSplitter-0.3-uvl4.noarch.rpm
python-pykf-0.3.3-uvl2.i386.rpm
python-kconv-1.1.8p3-uvl1.i386.rpm
最初のインストールで注意するところは、文字コードとスプリッタの選択だと思います。このへんは COREBlog の HowTo に説明があります。


18 October 2004

Zope-2.8.0-a1 を試す

Zope  

Zope-2.8.0-a1 が出たので試してみました。 Vine 3.0 用 rpm は ここ。 Python 2.3.4 以上が必須です。 Zope28 の HTTP ポートは 8280 に設定しましたが、起動後に http://localhost:8280 でブラウズできません。 "localhost" を "192.168.xxx.yyy" や host name にすると入れます。 理由は不明です。

コンテンツの移動は Data.fs をコピーしたものではエラーになりましたが、 ZMI で Zope オブジェクトを export/import して可能でした。 ZODB が変わったせいでしょうか?

プロダクトでは TinyTablePlus と ZPsycopgDA の動作があやしいです。 他に COREBlog や ExternalEditor, FSCounter, LocalFS, RDFSummary, UserCounter など試してみましたが正常に動作しているように見えました。


TinyTablePlus

Zope28 起動時に "ImportError: No module named PersistentMapping TinyTablePlus.py line 42" とログ出力されるので、
- from PersistentMapping import PersistentMapping
+ from persistent.mapping import PersistentMapping
とソースを修正してみました。モジュールの名前が変わったようです。 しかし実行時に getRows() メソッドでエラーになりました。 調べて見ないといけません。

ZPsycopgDA

"Z Psycopg Database Connection" は一応継るようですが、 SQL で検索テストするとエラーになりました。下記のトレースバックが出ます。
...

・ Module Shared.DC.ZRDB.Connection, line 123, in manage_test
・ Module Shared.DC.ZRDB.Results, line 76, in __init__
TypeError: object does not support item assignment (Also, an error occurred
while attempting to render the standard error message.)

リリースされるころには、どちらも fix されているとは思いますが、 良く使うものなので、もう少し調べてみる必要がありそうです。

20 November 2004

Zope 日本語版 Preview

Zope  

ゾープ・ジャパン株式会社から ZMI 日本語版 が公開されました。COREBlog 日本語版 1.1b も含まれてます。 最終目的は総合的な日本語化で、今回の版はプレビュー的位置付けらしい。 報道発表資料 を読めば判るけど Zope 日本語版は ZPL ライセンスでの公開です。 一部 weblog サイトで商用製品と勘違いされてる方がおられたので、 念のため。

で本体の ZMILocalizer の話ですが、どうも ExternelEditor と競合してるようです。 BBS に書いたのですが、ペンアイコンが表示されなくなります。 一方 ExternelEditor を Products フォルダから外すと、 ZMI のタグが日本語表示されるようになります。これは Loose End さんに先に見付けられてしまいました^^


また「キャッシュの除去」画面で「最小化」ボタンをクリックするとエラーになります (本家に報告済み)。実を云うと家では、どうしてもエラーがでる Zope サーバがあったのですが、zope.conf で "cache-size 0" を設定していたせいでした。理屈は解かりませんが、多分同じ原因なのだろうと想像しています。

一通り試した後、アンインストールしようとしましたが、うまく出来ません。 ZMILocalizer を Products から外すと ZMI で Products リストが開けなくなりました。 いろいろ試行錯誤の結果、次の手順でアンインストールできるようです。

Zope を起動して ZMI 画面で、
1. /Control_Panel/TranslationService のコンテンツをすべて削除する。
2. /Control_Panel/Products から ZMILocalizer を削除する。
3. /Control_Panel/Database/main で DB を Pack する。
4. Zope を停止する
5. ZMILocalizer を Products フォルダから削除
6. Zope を再起動
ただ、この手順でうまくいかない場合もあれば、 単に Products フォルダから外しただけで OK の場合もあったような気がして、 いまいち不確かです。何かの時の参考にでもなればと思うので書いて置きます。

一方 PlacelessTranslationService プロダクトの方は同じような手順で削除しても、 再起動時に

ZODB Could not import class 'PlacelessTranslationService'
と云うようなエラーが出ます。ZODB にゴミが残ってしまうようです。 こちらの解決策は判りません。

色々書きましたが、基本的に問題なく動作してします。 Zope のバージョンアップにもあまり影響されない方式で実装されているようです。 ちょっとだけソースを見たのですが、参考にさせて頂ける処が随所にありました。 ats さん曰く「ZMI Localizer は ZODB を汚さない。というのが一つのコンセプト」 と云うことなので、今後も期待して居ります。

28 February 2005

zope-2.7.5-b1

Zope  

zope-2.7.5-b1 出たので python 2.4 がらみで少しだけ;;調べて見ました。 rotor モジュール廃止の件は対応してないようです

$ grep -Rl rotor Zope-2.7.5-b1
Zope-2.7.5-b1/lib/python/App/Product.py
Zope-2.7.5-b1/lib/python/App/Extensions.py

まあ zope-2.8a1 でも対応してませんから、そういうもんなのでしょう

$ grep -Rl rotor Zope-2.8.0-a1
Zope-2.8.0-a1/lib/python/App/Extensions.py
Zope-2.8.0-a1/lib/python/App/Product.py

ちなみに ZopeX3 では対応しているようです。 サンプル数が少ないのでたまたまかもしれません。

$ grep -R rotor 3.0.0
(sysout なし)


lambda 構文廃止の件は私の勘違いでした。 PEP3000(日本語訳) など参照してください。

ZopeX3 のソースを調べると、394 行も使われてます。

$ grep -R lambda 3.0.0 | wc
    394    2398   57848

また対処方法は ここ に書いてあります。

python-2.4 で lambda 廃止という誤った情報を掲載し web 上で御迷惑かけましたことを深く反省しております。ごめんなさい。

06 March 2005

Zope Developers Camp 2005/Winter

Zope  

くそぉ〜 スキー場でコーディングなんてうらやましい。 どんな気分なんでしょう。僕には想像つかない。 マンモススキー場 の景色いいなー。 板履いて山登りしたくなって来た。


26 March 2005

Python2.4 + Zope2.7.5

Zope  

Python2.4 で Zope が動くのかと云えば、一応動いてるようです。 立ち上げ時にワーニングが少し出るだけです。

/usr/lib/python2.4/whrandom.py:38: DeprecationWarning: the whrandom module is deprecated; please use the random module DeprecationWarning)
/usr/lib/python2.4/xmllib.py:9: DeprecationWarning: The xmllib module is obsolete. Use xml.sax instead. warnings.warn("The xmllib module is obsolete. Use xml.sax instead.", DeprecationWarning)

COREBlog, Psycopg や PIL などのプロダクトもちゃんと動いてます。 プロダクトはなるべく最新のものを使った方が良さそうです。 Plone は使ってないので解かりません;;

細かい話ですが Zope の HTTPRequest クラスに小さなバグがありました。

<dtml-var "REQUEST.form">

と DTML Method に書くと REQUEST.form の値が {'-C', ''} などと返って来てます。 たとえば一回 submit したりすると正常に戻るので REQUEST.form の初期化がうまくいってないのだと思いますが原因不明です。 python2.3.5 + zope2.7.5 では正しく空の dict が返ってきます。


関係無いですが lib/python/ZPublisher/HTTPRequest.py に getClientAddr() というメソッドがあります。 何時からなのかは判りませんが Zope-2.7.0 のソース見たら既にありました。 DTML で使うときは、

<dtml-var "REQUEST.getClientAddr()">

のようにして使えます。HTTP_X_FORWARDED_FOR にも対応してるので フロントに apache 使ってる人には便利です。 (知らぬは私だけだったりして;)

07 April 2005

Zope-2.8.0-a2

with python-2.4.1
Zope  

Zope-2.8.0-a2 が出たので一応試してみた。 a1 と比べてサイズが二倍に膨れてます。一応 Vine 用rpm も作りました。

a1 での障害は改善されてるようです。 ZPsycopgDA は使えそう。 TinyTablePlus に関しては Zope のメソッドが変更されたので、プロダクトを修正するか、 自家製メソッドに置き換えないといけない。 とりあえずのパッチは ここ。 こういう変更は今後も続くと思われるので、 外部プロダクトへの盲信的依存は注意。 たとえメジャーなプロダクトを利用していると思っても安心はできない。

日本語化 Zope (zope-j10n_pb1.tgz) を入れてみた。Zope 立ち上げ時に ZMILocalizer/__init__.py 処理でエラー。

257         #Add patch methods to special namespace('_').
258         from DocumentTemplate.cDocumentTemplate import TemplateDict
259         TemplateDict.__dict__['translate_tab'] = label_patcher
260         TemplateDict.__dict__['translate_message'] = message_patcher

【追記】現在、CVS では対処済みのようです。詳しくは SourceForge.jp サイトにある zope japanization プロジェクトを御覧ください。


11 June 2005

Zope-2.8.0 をインストールする前に

Zope  

明日(06/11)に Zope 2.8 がリリースされるようですが、 やみくもにインストールする前に、確認しましょう。 とても意欲的なバージョンらしいです。


Vine3.1 に Zope 2.8.0 をインストール

Zope   Vine  

まずは、恐いもの見たさで VineSeed で動いてる Zope 2.7.6 に、 Zope 2.8.0 をそのまま上書きでインストールしてみた。 起動時のエラーも無く、動いてる。β2版より安定してるようす。 でも、RDB 関連でエラーが出て、BBS が見られない。 いつ御釈迦になるやも知れないので、お遊びはここまで。

公開 Zope 鯖の更新作業

Vine3.1 で運用中の鯖はそのままにして、別にインストールすることにした。 新規に Zope28, Zope28-zserver, Zope28-TinyTablePlus を作り、 ここに置いた。 Zope2.7系と競合しないように、HTTP デフォルトポート番号は 8280。 ディレクトリ構成は $ rpm -ql Zope28-zserver などで確認してください。

手順は以下の通り (自分のための備忘録)。

  • 稼働中の鯖で、必要なコンテンツをすべて export
  • Zope28, Zope28-zserver をインストール後起動し、 ZMI でアカウント {"admin","123"} を変更
  • 一旦 Zope28 を停止し、Zope27 の Products をすべてコピー
  • $ su -
    % cd /var/lib/zope28/Products
    % cp -a /var/lib/zope/Products/* .
    % chown -R zope28:zope28 *
    
  • Zope28-TinyTablePlus をインストール
  • Zope28 を起動し、Zope 27 で export したコンテンツを import
  • ルートのプロパティに {"management_page_charset": "utf-8"} を追加
  • ルートに置くコンテンツ (UserCounter など) を作成
  • 瓦版を更新する cron を修正
  • ログローテーション /etc/logrotete.d/zope を zope28 用に修正

ブラウザで、一通りサイト内をチェック後、apache の RewriteRule を書き換える。 とりあえず、そんなところで、ちゃんと動いてるようです。


ちなみに、うちで今使ってるプロダクトは下記のもの。

  • COREBlog
  • ExternalEditor
  • FSCounter
  • LocalFS
  • RDFSummary
  • TinyTablePlus
  • UserCounter
  • ZPsycopgDA
  • ZShogi
  • ejSplitter

障害が出たり、なんか抜けてたりしたら、書き足します。

参考サイト

18 August 2005

夏の終わりに

Zope  

左のポスターは、恒例となった Zope 有志による デベロッパーキャンプ のお知らせです。 夏の終わりには LL (軽量言語) のお祭り や、 P2P の旗艦 Skype のカンファレンス も開かれる予定だそうです。う〜ん行きたい。

(π_π;) 私事があり、どれも参加できません。残念です...
歳取って、地元の祭りとか、法事とか、子供の面倒などで制約されること多くなりました。 そう云えば、去年は田舎に越して来たことを言い訳にしてたような。

今しか出来ない事ってあると思います。そう、今しか出来ないこと、ありますよねー


15 September 2006

Plone 2.5.1 RC1

Zope  

Plone 2.5.1 rc1 が出ました。そして、あわててインストールして大失敗。 Five のバージョンに注意しないといけないようです。 papasan に見付けられてしまったサイト shogi on plone もなんか変になってしまった;;

忘れないうちにパッケージ (Plone-2.5.1-uvl0.c1.noarch.rpm) を作りました。 もし download するなら Vine 3.2Vine 4.0 置場からどうぞ。 Plone 本家 ですら Experimental releases と言ってる上に、うちの野良ビルドでは信用なりませんが。


The tarball for this release is intended for Zope 2.9.4 and includes Five 1.3.7, if you want to use it with Zope 2.9.5+ (currently unreleased) you may remove Five from your instance Products directory. Additionally, if you want to use it with Zope 2.8 you will need to download the latest Five 1.2. The prior Plone 2.5 tarball was packaged for Zope 2.8, Plone 2.5.1 will work with Zope 2.8 only if you explicitly downgrade the included version of Five.

Zope 2.9.4 の場合は、 (いままで Zope 側の Five を使用するので、Plone 2.5 の Five は捨てていたのだけれど) 今回は Plone 側の Five 1.3.7 を使いなさい。 Zope 2.8 の場合は Five 1.2.x の最新を持って来て使いなさい、と言うことかな。 確かに Zope 2.8 に Plone 2.5.1 rc1 をそのまま入れたら、 めちゃくちゃになってしまった。ご用心カンカンッ。

追記です。2.5.1-rc1 へのアップグレードに関しては なごすい さんのところに詳しい記事がありました。

08 April 2007

COREBlog 1.2.5 でスパムを掃除する

いまごろになって...ですが;;
Zope  

コメントやトラックバックでのフィルタを掛けると、 モデレートされないゴミが溜ってきます。 これを削除する作業が行ったり来たりで結構面倒ですが、 SiteBytes サイトに コメント管理の一覧リンクを出す と云うありがたい記事があります。 ただモデレートされないもの (つまりスパム) が表示されません。 ちょっとだけ COREBlog の本体にパッチを当てることにしました。

--- COREBlog/COREBlog.py.orig
+++ COREBlog/COREBlog.py
@@ -1100,7 +1100,7 @@
     security.declareProtected(View, 'rev_comment_items')
-    def rev_comment_items(self,start=0,count=-1):
+    def rev_comment_items(self,start=0,count=-1,consider_moderation=1):
         """Return list of Comment(reversed indexing)."""
         start = r2i(start,0)
         count = r2i(count,-1)
@@ -1115,7 +1115,7 @@
             id = self.comment_list[l_e]
             obj = self.getComment(id)
             l_e = l_e - 1
-            if obj.moderated:
+            if obj.moderated or not consider_moderation:
                 l.append(obj)
                 count = count - 1
         return l


COREBlog の「最近のコメント一覧」を真似て、 以下のような DTML メソッドを作り表示できます。 オブジェクトは COREBlog の methods フォルダの中にでも置きます。

<dtml-var standard_html_header>
<h2>最近のコメント一覧</h2>
<ul>
<dtml-in "rev_comment_items(0, -1, 0)">
  <dtml-if moderated><li><dtml-else><li style="background-color:#ffa"></dtml-if>
    <dtml-var "ZopeTime(created)" fmt="%Y-%m-%d %H:%M"> 
    <a href="<dtml-var blogurl missing="">/<dtml-var parent_id>/manage_comments">
      <dtml-if "title==''">(no title)<dtml-else><dtml-var title></dtml-if>
    </a>
  </li>
<dtml-else>
  There are no comments.
</dtml-in>
</ul>
<dtml-var standard_html_footer>

ついでにトラックバックの方も同じ方式でやることにしました。

--- COREBlog/COREBlog.py.orig
+++ COREBlog/COREBlog.py
@@ -1163,7 +1163,7 @@
     security.declareProtected(View, 'rev_trackback_items')
-    def rev_trackback_items(self,start=0,count=-1):
+    def rev_trackback_items(self,start=0,count=-1,consider_moderation=1):
         """Return list of Trackback(reversed indexing)."""
         start = r2i(start,0)
         count = r2i(count,-1)
@@ -1178,7 +1178,7 @@
             id = self.trackback_list[l_e]
             obj = self.getTrackback(id)
             l_e = l_e - 1
-            if obj.moderated:
+            if obj.moderated or not consider_moderation:
                 l.append(obj)
                 count = count - 1
         return l

表示する DTML メソッドは以下の通り。

<dtml-var standard_html_header>
<h3>最近のトラックバック一覧</h3>
<ul>
<dtml-in "rev_trackback_items(0, -1, 0)">
  <dtml-if moderated><li><dtml-else><li style="background-color:#ffa"></dtml-if>
    <dtml-var "ZopeTime(created)" fmt="%Y-%m-%d %H:%M"> 
    <a href="<dtml-var blogurl missing="">/<dtml-var parent_id>/manage_trackbacks">
      <dtml-if "title==''">(no title)<dtml-else><dtml-var title></dtml-if>
    </a>
  </li>
<dtml-else>
  There are no trackbacks.
</dtml-in>
</ul>
<dtml-var standard_html_footer>

参考サイト

というか、全部上記サイト内容の泥棒です。恥ずかしい;;

17 July 2007

ZShogi 0.5.0 をリリースしました

zope shogi product
Zope  

久々に Zope 将棋 を更新しました。 対局者名、手数などを取得する public メソッドを追加しました。 これは Java Applet 表示 で利用できます。 また ZShogi-object/index_html が XML を返すようにしました。 たとえば /zope/shogi/Games/Ryuou/R14_5 などをブラウザで見ると、それなりに見えます。 これはクライアント側の 棋譜ブラウザ で利用するのが目的です。 (仕様変更です。もし積極的に index_html を利用してる方が居られたらごめんなさい。 多分居ないと思うけど;;)


たとえば平手戦 (第14期竜王戦 第5局) の場合は次のような XML を返します。

<?xml version="1.0" encoding="utf-8" ?>
<ZShogi version="0.5">
    <uri>http://owa.as.wakwak.ne.jp/zope/shogi/Games/Ryuou/R14_5</uri>
    <filepath></filepath>
    <title>第14期竜王戦(第5局)</title>
    <comment></comment>
    <author></author>
    <white>藤井猛(竜王)</white>
    <black>羽生善治(名人)</black>
    <diagram type="H0" side="1" />
    <moving cursor="109">
        7677343326274443483942826859949396977271786832315657433258496251
        3637716268798271576833222526121168691413161713124647544337293241
        66576463555663545748433245467463565735342628344344454433451P3635
        4445c736545554535766842N531B4142f45335342926462Pd3444341b288d746
        21226343546458475868472P491P38372729532P5554542G7755363517273738
        661N273754661727d254382R591P2817432119285242542L391Pa83853525363
        534356545657572P6858652N6677852S6556657465667684381L
    </moving>
</ZShogi>


詰め将棋 (将棋無双 第1番) の場合は次のような XML を返します。

<?xml version="1.0" encoding="utf-8" ?>
<ZShogi version="0.5">
    <uri>http://owa.as.wakwak.ne.jp/zope/shogi/Puzzles/Musou/M01/musou001</uri>
    <filepath></filepath>
    <title>将棋無双 第1番</title>
    <comment></comment>
    <author>伊藤宗看(三代目)</author>
    <white></white>
    <black></black>
    <diagram type="S0" side="1">
        2G61,N41,L21,P72,G52,R32,K43,P54,+P65,B,L*3,P*15,S*2,
        1S13,N34,+R24,N26,B97,G*2,N,S
    </diagram>
    <moving cursor="0">
        d2344252331G3342441S443333243343451N4544341G
    </moving>
</ZShogi>

なお、この XML はまだ暫定的なものです。悪しからず。

09 September 2007

ZShogi に If-Modified-Since

ZShogi-0.5.1, PyShogi-0.5.5
Zope  

ZShogi-0.5.1 で HTTP ヘッダ If-Modified-Since を受け取った場合の対応をしてみました。 今まで局面を動的に返すことしか考慮してなかったのですが、 クライアントから棋譜全体を静的に get することもあるので。 以下のようなコードを追加。

# ZShogi.py
...
from App.Common import rfc1123_date
...
def index_html(self, REQUEST=None):
    if REQUEST is not None:
        last = REQUEST.get('HTTP_IF_MODIFIED_SINCE', '')
        mtime = rfc1123_date(self.bobobase_modification_time())
        # 棋譜が更新されてない場合は HTTP ステータス 304 を返す
        if mtime == last:
            REQUEST.RESPONSE.setStatus(304) # Not Modified
            return ''
        # 棋譜データを返す
        _set_header = REQUEST.RESPONSE.setHeader
        _set_header('last-modified', mtime)
        _set_header('X-Zope-Product', 'ZShogi-%s' % __version__)
        _set_header('Content-Type', 'application/xml')
        ...


telnet を使って確認すると、 一回目のアクセスでは Last-Modified が返ってきます。

$ telnet owa.as.wakwak.ne.jp 80
...
Escape character is '^]'.
GET /zope/shogi/Games/Meijin/M63_1 HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 09 Sep 2007 13:56:27 GMT
Server: Zope/(Zope 2.9.7-final, python 2.4.4, linux2) ZServer/1.1
Last-Modified: Sat, 11 Jun 2005 11:39:15 GMT
Content-Length: 814
Content-Type: application/xml; charset=utf-8
X-Zope-Product: ZShogi-0.5.1.0
Connection: close

<?xml version="1.0" encoding="utf-8" ?>
<ZShogi version="0.5">
...
</ZShogi>

二回目のリクエストで If-Modified-Since をそのままの文字列で設定してみると、 ちゃんとステータス 304 を返します。

$ telnet owa.as.wakwak.ne.jp 80
...
Escape character is '^]'.
GET /zope/shogi/Games/Meijin/M63_1 HTTP/1.0
If-Modified-Since: Sat, 11 Jun 2005 11:39:15 GMT

HTTP/1.1 304 Not Modified
Date: Sun, 09 Sep 2007 13:58:25 GMT
Server: Zope/(Zope 2.9.7-final, python 2.4.4, linux2) ZServer/1.1
Connection: close

と云うことでクライアント側の ZBrowser も If-Modified-Since を発行するように修正しました。

これで竜王戦を怒られずに観戦できるかなー;;

02 July 2008

SpamBayes を Zope で使う

JSpamFilter-0.1.3 リリース
Zope  

梅雨時の虫のように時々コメントスパムが大量に発生します。 以前から思案して居た SpamBayes を利用するフィルタリングを実装してみました。 この二週間ほど 象歩BBS で実際に使用してかなり効果ありと思えたので Zope プロダクト JSpamFilter-0.1.3 として公開します。 簡単に言えば SpamBayes の wrapper プロダクトです。

インストールは通常の Zope プロダクトと同様に JSpamFilter-0.1.3.tar.gz を解凍し、 $INSTANCE/Products/ 配下にコピーするだけ。 (もちろん SpamBayes がインストールされてることが条件)



試すには、まず ZMI (管理画面) で JSpamFilter のオブジェクトを作成します。 それを開いて、たとえばスパムを登録するには [Train] タグを選択します。 {名前、アドレス、記事} を入力し [Spam] ボタンをクリックします。 スパムじゃないものを登録するには [Good] ボタンをクリックします。


さて、コメントのスパム度を評価するには [Test] タグを選択します。 適当に {名前、アドレス、記事} を入力し [Get score] ボタンをクリックします。 画面の下の方に "スパム確率値" が表示されます。 Spam と Good をたかだか数個登録するだけで、結構まともな数値を表示するようです。


Zope の中から JSpamFilter を呼び出すには

PythonScript を使ってコメント登録するには以下のようにしてメソッドを呼び出します。

context.SpamDB.trainAsSpam(Comment, Name, Addr)   # スパム登録
context.SpamDB.trainAsGood(Comment, Name, Addr)   # 非スパム登録

上記では JSpamFilter のオブジェクトを SpamDB としています。 そしてスパム確率値を得るのは以下のコードです。0.0〜1.0の値を返します。

context.SpamDB.prob(Comment, Name, Addr)

対応するソースコードは JSpamFilter.pyです。 Zope ベースの掲示板やブログの類で、たぶん使えると思います。

18 November 2008

COREBlog でも SpamBayes を使う

Zope  

もう冬眠すれば良いのにコメントスパムが大量に発生してます。 今回はこのブログでも SpamBayes を利用しフィルタリングしてみました。 Spam データベースは BBS 用に作成したもの をそのまま利用したので楽でしたし、結果は良好。

以下の説明は COREBlog の中から SpamDB (JSpamFilter インスタンス) が呼び出せるものとしてあります。 たとえば SpamDB は Zope のルート直下に置きます。


1. Spam確率値を得るスクリプト

まず Spam確率値を得る Python Script メソッドを追加します。 COREBlog から呼び出せるフォルダに probSpam と云う名前で保存します。 私の環境では COREBlog インスタンス直下に methods と云うフォルダが作ってあるので、 その中に置きました。

## Script (Python) "probSpam"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=body='',name='',addr=''
##title=スパム値を得る
##
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
response =  request.response
body = html_quote(body)
name = html_quote(name)
addr = html_quote(addr)
r = container.SpamDB.prob(body, name, addr)
return ('%.2f') % (r * 100,)

これを呼び出すには COREBlog エントリ表示を修正します。 修正するソースは COREBlog/dtml ディレクトリ内にある manage_listCommentForm.dtml です。 そうすれば先頭に表示してあるような画像がみられます。 (なんて不親切な;;)

<td align="left" valign="top">
    <dtml-var "methods.probSpam(body, author, url)"> %
</td>

2. コメント編集画面の修正

次に SpamDB をトレーニングしないといけません。 それはコメント編集画面でおこないます。


コメント編集画面 manage_editCommentForm.dtml の先頭あたりに次のコードを挿入します。

<p class="form-help">Spam Comment informations.</p>
<table border="0"  cellpadding="0" cellspacing="1">
<dtml-with "getComment(comment_id=comment_id)">
<form action="methods" METHOD="POST">
<input type="hidden" name="SpamName" value="<dtml-var author html_quote missing="">" />
<input type="hidden" name="SpamAddr" value="<dtml-var url html_quote missing="">" />
<input type="hidden" name="SpamBody" value="<dtml-var body html_quote missing="">" />
<tr>
    <td align="left" valign="top">
    <div class="form-label">
    Spam:
    <dtml-var "methods.probSpam(body, author, url)"> %
    </div>
    <input class="form-element" type="submit"
        name="trainAsGood:method" value="Train as Good" />
    <input class="form-element" type="submit"
        name="trainAsSpam:method" value="Train as Spam" />
    </td>
</tr>
</form>
</dtml-with>
</table>

ここで trainAsGood, trainAsSpam と云う二つの新しいメソッドがあります。 ともに引数なしの Python Script です。

request = container.REQUEST
response =  request.response
body = request.get('SpamBody', '')
name = request.get('SpamName', '')
addr = request.get('SpamAddr', '')
container.SpamDB.trainAsGood(body, name, addr)
return response.redirect(request['HTTP_REFERER'])
request = container.REQUEST
response =  request.response
body = request.get('SpamBody', '')
name = request.get('SpamName', '')
addr = request.get('SpamAddr', '')
container.SpamDB.trainAsSpam(body, name, addr)
return response.redirect(request['HTTP_REFERER'])

3. フィルタリング

最後にフィルタリングスクリプト beforeAddComment です。

## Script (Python) "beforeAddComment"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=md
##title=コメント受付チェック(SpamBayes版)
##
if md.get('moderated', 0):
  try:
    from Products.PythonScripts.standard import html_quote
    body = html_quote(md.get('body', ''))
    name = html_quote(md.get('author', ''))
    addr = html_quote(md.get('url', ''))
    r = container.SpamDB.prob(body, name, addr)
    if r > 0.4:
      md['moderated'] = 0
  except:
    pass
return md

参考サイト