月別:3月2009年

TurboGearsバージョンアップしたら動かない-3

2009年3月8日 (日)

このブログの2月16日記事TurboGearsバージョンアップしたら動かないと、2月22日の記事TurboGearsバージョンアップしたら動かない-2で書いたとおり、TurboGearsを1.0.8にバージョンアップした際に様々な問題が発生した。今日はその続編。

ちょっとしたWEBアプリをTurboGearsで作ることにした。少しは違うことをしたくなり、ビューテンプレートをCheetahにしてみた。標準のテンプレートはKidだが柔軟性に欠けるのと重いことがマイナス要因となり、速いと評判のCheetahにした。TurboGearsは少し前のバージョンからCheetahも使えるようになっている。なお次期バージョンではGenshiがデフォルトとなりCheetahはサポートされないようだが、Genshiは少々難しそうなのでとりあえずは使ったことの無いCheetahにした。

考え方の若干の違いはあるが様々なテンプレートエンジンを使用したことのある私にはそれほど大きな問題ではなく、とりあえずのテスト表示は上手く行った。ところが、プログラム中から与えた日本語文字が表示できない。表示できないのではなく、実行時エラーで止まってしまうのだ。次のようなメッセージが表示される。

File “c:\progra~1\python25\lib\site-packages\Cheetah-2.0.1-py2.5-win32.egg\Cheetah\DummyTransaction.py”, line 32,
in getvalue return ‘’.join(outputChunks)
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3 in position 428: ordinal not in range(128)

良くある日本語文字コードの問題だ。そこで思い当たる箇所をチェックしてみたが問題はない。私のプログラムは文字列は原則としてUNICODEベースでプログラミングしている。問題の文字列をUTF-8文字列にしたところ、上手く行った。ビューはUTF-8なので与える文字列は同じUTF-8にしなければならない、ということか。

いや、それは困る。いままでKidではUNICODE文字列を直接与えても問題なく表示できていた。テンプレートをCheetahに変えるとプログラミングを変更しなければならないのでは話にならない。ちなみにTurboGearsの設計では本体のプログラムミング変更無しでテンプレートだけ変えれば良いはずなのだ。

エラーメッセージを良く見ると、CheetahのDummyTransaction.py という箇所でエラーが発生している。”DummyTransaction”とは、なにやら本質的ではない処理のようだ。その本質的でない箇所のエラーでCheetahが使えないのでは癪に障るので、DummyTransaction.pyの問題の箇所を修正した。

修正前:

        def getvalue(outputChunks=outputChunks):
            return ''.join(outputChunks)

修正後:

import types
...
        def getvalue(outputChunks=outputChunks):
            strJoin = ""
            for chunk in outputChunks:
                if isinstance(chunk,types.UnicodeType):
                    chunk = chunk.encode('utf-8','ignore')
                strJoin = strJoin + chunk
            return strJoin

これで問題なく動くようになった。

PHP言語のエラーメッセージ

2009年3月4日 (水)

2回連続で書いたとおり、いまPHP言語のWEBフレームワークを使ったWEBアプリケーションをプログラミングしている。PHPはC/C++言語に似ているのでマスターするのは速かったが、少々戸惑うこともある。それは、エラー時のエラーメッセージだ。WEBアプリなのにPHP側からのエラー文字列がブラウザに表示されてしまうのだ。それでは困るので、関数の前に@ マークを付けてエラー出力を抑止している。しかしこれではエラーが発生したときのエラーメッセージがこんどはわからなくなってしまう。

このような場合は、通常は例外を発生させるべきで、例外インスタンスからエラーメッセージ文字列が取得されるべきだ。おそらくPHPの古い部分、例外実装前のコードが原因だろう。このあたりは、古い言語だから起きる問題とも言えよう。

 

QLOOK ANALYTICS