PyDS @ Floating Log

2010-02-03 (*)

# Cheetah と PyDS

世の中にあと何人 PyDS を使い続けている人間がいるのだろう、という疑問はあるわけだが、移行を面倒臭がる私は Cheetah 対応をしてまだ使う。

去年の11月に str と unicode 辺りの挙動が 2.2 で大きく変わったためだろう (Cheetah) とか書いていたが、微妙に違った。 問題は二つあって、一つは request という名前が Cheetah に横取りされたという問題、もう一つはテンプレートに渡すオブジェクトの問題。

request が横取りされる、というのは、元々 PyDS がテンプレートに request という名前であるオブジェクトを渡していたが、それが渡らなくなった。 その原因がどうやら Cheetah が request という名前のオブジェクトを先に用意してしまう為らしい、ということ。Cheetah Users' Guide の 5.6 Namespace cascading and the searchList に次のようにある。

When Cheetah maps a variable name in a template to a Python value, it searches several namespaces in order:

  1. Local variables: created by #set, #for, or predefined by Cheetah.
  2. The searchList, consisting of:
    1. #set global variables.
    2. The searchList containers you passed to the Template constructor, if any.
    3. The Template instance (``self''). This contains any attributes you assigned, #def methods and #block methods, attributes/methods inherited via #extends, and other attributes/methods built into Template or inherited by it (there's a list of all these methods in section 13.5).
  3. Python globals: created by #import, #from ... import, or otherwise predefined by Cheetah.
  4. Python builtins: None, max, etc.

PyDS から渡している request は searchList の中なので、predefined by Cheetah に負けていると推測される。 何が前もって定義されているのかという記述は見当たらなかったが多分そういうこと。

二つめの問題は、どこで誰がどうやって str を unicode に直すか、という問題。 今までは utf-8 エンコードの str を渡していて問題はなかった。 ところが最近の Cheetah では、内部で unicode への変換を試みることになっており、なおかつこのとき encoding の指定をしていない。 そこで、デフォルトの ascii ではエンコードできないことでエラーが発生する。 ということで、Cheetah の Template クラスに渡す文字列は str ではなく unicode にしておく方が無難となる。 こうすれば unicode には encoding が元から指定できるので、再変換で死ぬことがなくなる。

以上二つの変更で、なんとか持ちこたえられそう。 まだ検索結果だけは化けるが、とりあえず日記が書ければいいや。

posted at 13:28:48    #
 
2009-11-24 (*)

# Cheetah

Cheetah 2.4 にしたら PyDS が動かない、という理由でしばらく更新が途絶えていた。 これもその問題が解決したわけではなくて、単に古い環境で動かしているだけ。 str と unicode 辺りの挙動が 2.2 で大きく変わったためだろうということは判ったが、いま直す気力がない。 というかドキュメントを読む気力がない。

posted at 23:43:12    #
 
2009-04-25 (*)

# PyDS を Python 2.6 に対応させる

騙し騙し使いつづけている PyDS だが、Python 2.6 では起動すらしなくなった。PyDS が動きません。メタクラスに渡すものが間違っているとか何とか、ssl モジュールで死ぬ。Python 2.6 すら時期尚早 に書いた通り。 具体的にトレースバックを晒すと、

Traceback (most recent call last):
  File "/Users/tetsushi/Gentoo26/usr/bin/pyds-start", line 34, in <module>
    import PyDS.Server
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/Server.py", line 45, in <module>
    import PyDS.Tool
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/Tool.py", line 50, in <module>
    import PyDS.StructuredText
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/StructuredText.py", line 43, in <module>
    import PyDS.docpytils
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/docpytils.py", line 2, in <module>
    from urllib2 import urlopen, URLError
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/urllib2.py", line 92, in <module>
    import httplib
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/httplib.py", line 1054, in <module>
    import ssl
  File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/ssl.py", line 81, in <module>
    class SSLSocket (socket):
TypeError: Error when calling the metaclass bases
    function() argument 1 must be code, not str

標準モジュールで死なれて、しかもメッセージがメタクラスの呼び出し方が悪い、というようなもの。 手の出しようが思い浮かばない。 まあしかし、将来それも遠くない将来 Python 2.6 に移行するとき、PyDS だけは 2.5 でないと動かないというのは困る。 手掛かりを探してググった。

引っ掛かった中にあったのが、 TypeError: ssl() argument 1 must be _socket.socket, not _socketobject -> Solution という2005年のメール。 timeoutsocket はもういらないんだ、と解決が謳われている。 timeoutsocket? そういえば使っていたぞ。

ということで、Server.py の import timeoutsocket を無くして、代わりに socket でタイムアウトを設定する。 (もしかすると、もっとユーザー側のところでタイムアウトが設定できるようになっていたかもしれないが、ともかく応急手当) このポストがアップロードされれば、とりあえず使えるということにはなるだろう。

posted at 22:30:40    #
 
2009-03-27 (*)

# DISQUS

コメントシステムを導入してみた。

その昔はこのブログにも作り付けのコメント機能があったのだが、サーバー側でこれを停止して久しい。 トラックバックは未だしも、コメントは付けたいときもあるだろうと思わなくもなかった、とは見えなかったかもしれないが、実はそうなのである。

で、DISQUS は、誰かが他の誰かに紹介していた時にブックマークしていたのだが、それが誰だったかまでは記憶に残っていない。 ということでお礼を言わなければならない人が判らないが、まあともかく、しばらく試用期間である。

PyDS に乗っけるのに面倒なのは、パーマリンクに # が入るという PyDS の仕様とどうもあまり相性が良くなさそうという点。 上手くスレッドが切れていれば問題は無いはずだが、期待し過ぎは禁物。

うん、やっぱり記事毎には分かれないで日付になるようだ。サイドに置こう! 日付ごとのには日付の横のコメント数リンクを辿ってから、になるが、この程度が限界か。

posted at 11:18:40    #
 
2009-02-19 (*)

# PyDS と docutils 0.5

その昔、約2年前のこと PyDS と docutils 0.4 という題で記事をものしたことがある。 季節は巡り、今度は 0.5 に対応する。 しばらく前から Gentoo prefix の更新パッケージに docutils の名は見ていたのだが、前回のこともあり躊躇っていた。 しかし、いつまでも先延ばしにしていることが何かを解決するわけではないので、重い腰を上げてみた。

とりあえず、公開しないストーリを作ってテスト。 出てきたエラーは HTMLFragmentWriter instance has no attribute 'stylesheet' だった。 問題の箇所は StructuredText.py だ。

--- StructuredText.py.orig	2004-07-06 02:37:02 +0900
+++ StructuredText.py	2009-02-19 12:38:02 +0900
@@ -141,11 +141,8 @@
 		self.document.walkabout(visitor)
 		self.visitor = visitor
 		self.output = visitor.astext()
-		self.head_prefix = visitor.head_prefix
-		self.head = visitor.head
-		self.body_prefix = visitor.body_prefix
-		self.body = visitor.body
-		self.body_suffix = visitor.body_suffix
+		for attr in docutils.writers.html4css1.Writer.visitor_attributes:
+			setattr(self, attr, getattr(visitor, attr, None))
 
 _Transforms = []
 

他は大丈夫かな。 しばらくは様子を見てみる期間なので、エラーを吐いていても寛容に願います。

posted at 12:44:00    #
 
2008-03-21 (*)

# AWS 4

過日pyamazon から pyaws に移行しないといけないらしいに書いた通り、Amazon の Web サービスを叩く方法が変わるので対応しないといけない。 pyaws を使おうと思っていたのだが、文書も無いし、直接 http の URL を開いて XML をパースすればいいや、と方針を転換。 どうせ画像の取得にしか使ってないしね(画像の URL を規則に従って生成してしまえばいいという話もあるが…)。

ということで書いた PyDS 用マクロ。 別に PyDS の機能は使ってないから、他でも適当に使えると思うけど。

一番訳の解らないエラーが出てたのは、IdType の指定に ISBN を使うところ。 Amazon の文書では、jp の場合に使える IdType は ASIN, EAN, JAN, SKU と書いてあるのに、JAN を指定したらエラーになった。 そして使えないはずの ISBN が通るという。

とりあえず、こんな感じに出る→

posted at 22:54:08    #
 
2007-11-07 (*)

# bundle

ソフトウェアアップデートで再起動したら、PyDS が立ち上がらなくなった。 Mk4py が import できない、と。 前にファイルタイプが違ってやはり import できなかった(eapify で済まなかった話)が、今回はもっと単純にファイルが見つからないと言われる。 勿論 site-packages に Mk4py.dylib はある。

見つからないって何だよ、と思いながら再インストールしたり、いろいろしてみたが良く判らない。 最終的に import のことは import 用のモジュールが知っているだろう、ということで、imp モジュールの登場。

>>> import imp
>>> imp.get_suffixes()
[('.bundle', 'rb', 3), ('module.bundle', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

認識される拡張子は .bundle, .module.bundle, …あれ、dylib は入ってないなあ。

ということで、いつどこでこんな変更が行われたのか知らないが、とりあえず拡張子 .bundle にコピーしてしのぐ。 そのうち ebuild を書き換えて入れ直す。 その前にメーリングリストで訊くかな。

とか書いたけど metakit 以外は再インストールで全部 bundle になった(多分親切な eclass のおかげ)。

posted at 08:53:36    #
 
2007-10-22 (*)

# Cheetah 2.0

少し前に Cheetah を 1.0 から 2.0 にして、あまり影響ないかと思っていたが、先ほどの スケッチブック 4 でマクロを使ったらエンコーディング関係のエラーがぼろぼろと。

マクロの出力を一旦ユニコードオブジェクトにしておいて、encode('latin-1') とやったらエラーが消えたが、理屈が良く判らない。 ブラウザから入力する文字列は(多分)元々 utf-8 で、その変換によって結局 utf-8 を格納した文字列を戻しているだけなわけで、何が問題になって何が問題を解消したのだか。

posted at 17:02:08    #
 
2007-08-31 (*)

# Cheetah 1.0

from __future__ import generators が他の変数の代入の後に来ているので、Python 2.5 だとエラーになる。 generators が必要なのは 2.2 だけだと思うので、手元ではその行を削除した。

Cheetah を 2.0 (現在 RC8 とか)にして、PyDS は平気だろうか。

posted at 15:47:28    #
 
2007-05-14 (*)

# PyDS の引っ越し

旧機から PyDS を MacBook に移動した。

手順は: (1) 旧機の PyDS を停止。 (2) .PyDS ディレクトリーを MacBook にコピー。 (3) MacBook で、先日何とかした PyDS を動かす。

意外と簡単。

posted at 23:09:04    #
 
2007-05-07 (*)

# eapify で済まなかった話

Gentoo prefix はパッケージ数が少ないが、通常の Portage ツリーから ebuild ファイルを持ってきて eapify というスクリプトを通してやればだいたいなんとかなるので、試しに PyDS を動かしてみることにする。

依存パッケージはたくさんある。 しかも全部ではないが、ほとんど prefix に存在しない。

RDEPEND="media-libs/jpeg
        sys-libs/zlib
        >=dev-lang/python-2.2.2
        >=dev-python/medusa-0.5.4
        >=dev-db/metakit-2.4.9.2
        >=dev-python/cheetah-0.9.15
        >=dev-python/pyxml-0.8.2
        >=dev-python/pyrex-0.5
        >=dev-python/docutils-0.3
        >=dev-python/imaging-1.1.3
        >=dev-python/soappy-0.11.1"

ということで片っ端から、こんな感じのことをした。

% mkdir dev-python/soappy
% scp ...soappy-0.12.0.ebuild !$
% cd !$
% eapify
% vi soappy-0.12.0.ebuild
(KEYWORD に ~x86-macos を追加)
% ebuild soappy-0.12.0.ebuild manifest

いくつかの間接依存ファイルも同様に。 最後に emerge pyds。 (ebuildjp にある pyds-svn を使いたかったけど、サーバー止まっているらしく subversion で接続できなかったので)

さて、インストールできたところで、pyds-start してみる。 が、metakit が Mk4py の import をするところで 以下のような ImportError になってしまった。

  File "/Users/tetsushi/Gentoo/usr/lib/python2.4/site-packages/metakit.py", line 22, in ?
    from Mk4py import *
ImportError: Inappropriate file type for dynamic loading

Mk4py は dylib という拡張子で、

% file Mk4py.dylib 
Mk4py.dylib: Mach-O dynamically linked shared library i386

ということで、共有ライブラリだし問題なさそうだ。 と、この時点では思ったのだが、意外な問題が潜んでいた。

問題を認識したのはこの Fink - 移植 - 共有コード というページ。

Mach-0 の仕様の一つであ,多くの人を驚かせるものとして, 共有ライブラリ と 動的ローダブル・モジュールを厳密に区別します. ELF システムでは両者は同質で,共有コードのどの部分でも,ライブラリとしても動的ローディングにも使うことができます.

しばし茫然とする。 分けて考えたことがないものを分けて考えなければいけないので意味がなかなか把握できない。 が、ショックから立ち直って、こんなことを試す。

% file ../lib-dynload/readline.dylib
../lib-dynload/readline.dylib: Mach-O bundle i386

readline のものは bundle で、これがもう一つのタイプということだ。 ということは、Python から import できるものはこちらの bundle タイプということになり、metakit のコンパイル過程が間違っているということだ。

少し古いが、metakit のメーリングリストの Re: unable to use Mk4py on Mac OS X (jaguar, 10.2.2) という Nicholas Riley のコメントなど見つつ、patch を作る。 そして、ebuild の中でこれを当てて、(configure.in に当てるので)autoconf も呼んで、という作業をどうにかやり遂げた。

ということで、興味のある人はまとめて置いておくので持って行ってください→http://lowlife.jp/mft/static/prefix_overlay-20070507.tar.gz

posted at 22:56:16    #
 
2007-03-31 (*)

# PyDS と docutils 0.4

PyDS の開発が停滞して久しいが、PyDS が利用しているライブラリはそうではない。 ということで、今日は docutils 0.4 に対応する。 イベントログに出てくるエラーはこんなの:

Background thread exception exceptions.AttributeError: document instance has no attribute 'substitution_refs'

で、substitution_refs でぐぐると docutils 0.4 の HISTORY.txt が出てきて、この属性は廃止されました、とある。 それはまあ、知ってる。 使っていた人はどうすればいいのか、が知りたいのだ。 が、その情報は見当たらない。

仕方が無いので、Google Code Search で substitution_refs の使用例を探す。 と、どうも、docutils.references.Substitutions.apply の昔のコード自体を使いまわしているような感じがする。 そこで、0.4 の当該部分と見比べて、作ってみたのが次のパッチ。

--- ShortcutTool.py.orig	2007-03-31 20:11:08.000000000 +0900
+++ ShortcutTool.py	2007-03-31 20:17:21.000000000 +0900
@@ -31,6 +31,7 @@
 import PyDS.StructuredText
 import metakit
 import re
+import docutils.nodes
 import docutils.transforms
 
 shorties = {
@@ -237,7 +238,10 @@
 			except KeyError: # ShortcutTool not yet registered with Tool? 
 				return
 		defs = self.document.substitution_defs
-		for refname, refs in self.document.substitution_refs.items():
+		normed = self.document.substitution_names
+		subreflist = self.document.traverse(docutils.nodes.substitution_reference)
+		for ref in subreflist:
+			refname = ref['refname']
 			if defs.has_key(refname): 
 				continue
 			subtext = resolver(refname)

やれやれ、万事解決…とはいかなかった。 このパッチを当てた状態で再起動して走らせてみると、

Background thread exception exceptions.IOError: [Errno 2] No such file or directory: '../docutils/writers/html4css1/html4css1.css'

と出てくる。 どう見ても相対パスとカレントディレクトリーが食い違っている状態だ。 またぐぐって、今度は sourceforge のメーリングリストのログを読むことになる。 他のスクリプトから呼び出した時の挙動、という例はなかったが、とにかく設定次第でどうにかなるらしい。 今度は設定ファイルの書き方を(インストールしてあるドキュメントで)読んで、~/.docutils に設定したのがこちら:

[html4css1 writer]
stylesheet_path=/usr/lib/python2.4/site-packages/docutils/writers/html4css1/html4css1.css

これで自分のところではエラーを吐かなくなった。

posted at 22:34:56    #
 
2007-03-29 (*)

# RSS 出力について

ときどきの雑記帖 リターンズ"不思議不思議"エントリがあるように見えるのですが実際にそれを見ようとするとないといった混乱を招いているようなので、このサイトの RSS 出力についての簡単な解説(RSS 出力について)を書いてみた。 要するに、この PyDS が作るウェブログページの RSS はウェブログだけのフィードになっていない、という話(この説明が既にややこしいな)。

posted at 17:44:48    #
 
2007-03-11 (*)

# 検索機能

このサイトの全文検索機能が復活しましたというお知らせをもらったので、このページにも検索フォームを付けてみる。 というかそんな機能あったの?

ついでに、xmlfeed に置き換えてみる。

過去に遡ってのレンダリングし直しは、とりあえず保留。 気が向いたらやろう。

posted at 00:49:20    #
 
2007-03-04 (*)

# まあそういうこともある

サーバのディスクが飛んでしまいました

ということで、コメントが消えたし、コメント機能もなくなった。 ダウンする直前に leftmost にもらったコメントは読めなかったので、あしからず。

とりあえず、この記事はテストを兼ねて。

posted at 22:45:36    #
2月 2010
  1 2 3 4 5 6
7 8 910111213
14151617181920
21222324252627
28      
1月
2010
 3月
2010

Python Desctop Server のインストールとか設定とか改造とか。

Feed Icon Letterimage

Python
Desktop
Server

© 2010, Matsui Fe2+ Tetsushi