カテゴリー:TurboGears

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

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

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

2009年2月22日 (日)

このブログの2月16日記事TurboGearsバージョンアップしたら動かないで、TurboGearsを最新バージョン1.0.8にバージョンアップしたときの問題点について書いた。

今日は別の問題だ。TuboGearsを利用するには、コマンド tg-aminを使う必要がある。そのヘルプは

> tg-admin help

だ。これは問題ない。

次に、tg-adminにはsqlコマンドがあり、たとえばDB作成時には

> tg-admin sql create

とすればよい。これもOK。このsqlコマンドにはcreateなどのサブコマンドがあり、それを知るには、次のヘルプを入力すればよい。いままでは次のような答えが返ってきた。

> tg-admin sql help
Available commands:
  (use "tg-admin-script.py help COMMAND" or "tg-admin-script.py COMMAN
  for more information)
create:  Create tables
drop:    Drop tables
execute: Execute SQL statements
help:    Show help
list:    Show all SQLObject classes found
record:  Record historical information about the database status
sql:     Show SQL CREATE statements
status:  Show status of classes vs. database
upgrade: Update the database to a new version (as created by record)

ところが、最新バージョンでは次のようになってしまう。

> tg-admin sql help
Usage: tg-admin-script.py help [options]
Show help

tg-admin-script.py help: error: no such option: --egg

新バージョンのバグと思う。

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

2009年2月16日 (月)

TurboGearsをバージョンアップした。以前はバージョン1.0.1.1と、大分古いバージョン。新プロジェクトにTurboGearsを使用することにしたためのバージョンアップだ。新バージョンは1.0.8だ。

さてこの新バージョンでテストのため新プロジェクトを作成し、動かしたところ、動かない。WEBアクセス用のポートが既に使用されている、というエラーだ。そこで、ポートをいろいろ変更してみた。すべて同じエラーで起動できない。これは変だ。何かTurboGearsにバグがあるようだ。

ネットでいろいろ調べた。やっと行き当たったのがerror: port not freeだ。この記事(ML)では、(予想されたとおり)「そのポートが使用済みなのでは」という回答が延々続くが、最後にやっと回答があった。それは、TurboGearsではなく、Cherrypyのソースを修正しなければならない、というもの。

> i can use turbogears now..
> my solution:
> go to C:\Python25\Lib\site-packages\cherrypy-2.3.0-py2.5.egg\cherrypy
> open _cpserver.py
> find function “start_http_server()”
> comment this function “wait_for_free_port(host, port)”
> then try again..

ここに書いてあるとおり、”wait_for_free_port(host, port)”行をコメントにすることで、無事に正常動作させることができるようになった。

これはCherrypyのバグだったが、TurboGears1.0.8にはちょっとしたバグが残っているようだ。機会があれば報告する。

Validatorメッセージの日本語化(1)

2007年7月18日 (水)

WEBアプリケーションにはValidatorの機能は必須だ。Validatorとは、WEBアプリケーションの画面で入力された各フィールドの値の正当性チェック機能だ。たとえば、フィールドの入力有無チェック、整数フィールドの整数チェックや値の範囲チェックなどである。

このValidator機能はJava/Servletなら自作しなければならないが、WEBアプリケーションフレームワークであればその機能はそのフレームワークに存在している。たとえばJava/Strutsの場合には各フィールドのチェック機能をXMLファイルに設定するValidatorが付いている。Python/TurboGearsにももちろんValidator機能は存在する。それはFormEncodeパッケージのValidator機能をTurboGearsが利用したものだ。

このTurblGearsによるValidator機能は、ドキュメントや解説書どおりにプログラミングしても、エラーメッセージは英語である。たとえば入力必須フィールドに何も入力しなかった場合、TurboGearsのValidatorは’Please enter a value’というメッセージを出力する。さすがに英語のメッセージでは日本語アプリケーションには使えない。そこでこのValidatorメッセージの日本語化が必須なのだが、これがなかなか難物。そこでこの日本語化の過程を数回に分けて報告する。(結論としては、最上位のレベルでの日本語メッセージ化には成功していない。)

最初にやるべきことは、TurboGearsのValidator機能の大元であるFormEncodeのエラーメッセージファイルの日本語化だ。これは、FormEncodeドキュメントによれば次の手順でやるように書いてある。

$ svn co http://svn.formencode.org/FormEncode/trunk/“
$ cd formencode/i18n
$ mkdir <lang>/LC_MESSAGES
$ cp FormEncode.pot <lang>/LC_MESSAGES/FormEncode.po
$ emacs <lang>/LC_MESSAGES/FormEncode.po # or whatever editor you prefer
# make the translation
$ python msgfmt.py <lang>/LC_MESSAGES/FormEncode.po

最初の行のsvnコマンドは、既にインストール済みなので無視。<lang>は日本語なので”ja”とする。”jp”ではない。

emacsの行は、エディターでメッセージファイルを日本語で記述するの意。なおこのファイルの文字コードはutf-8でなければならない。そして結論を先に言うと、FormEncode.poファイル先頭部分の2行も次のように設定する必要がある。

“Content-Type: text/plain; charset=UTF-8\n”
“Content-Transfer-Encoding: 8bit\n”

そして、手順最後の行のmsgfmt.py は、\python\tools下に存在する。最後の行は、こちらの環境(Windows,Python25を”Program Files”下にインストール)では次のようになる。

> python C:\progra~1\Python25\Tools\i18n\msgfmt.py ja/LC_MESSAGES/FormEncode.po

この結果、FormEncode.poと同じディレクトリにバイナリメッセージファイルのFormEncode.moファイルが生成される。

次のステップは、日本語FormEncode.moファイルが正しく表示されるかどうかのテストだ。先ず一番下のgettextレベルでテストした。

...
    trans = gettext.translation(domain="FormEncode",
 	    localedir="C:\\PROGRA~1\\Python25\\Lib\\SITE-P~1\\
                                 FORMEN~1.EGG\\FORMEN~1\\i18n",
            languages=["ja"])
    msg = trans.gettext("Please enter a value")
...

(localedirパラメータは1行。)
ここで重要なことは、translation()メソッドのlocaledirパラメータだ。このパラメータにはFormEncodeのi18nディレクトリを指定するが、Windows環境ではファイルのロング名を指定してはならないのだ。

localedir=”C:\\Program Files\\Python25\\…

では駄目。完全なショート名でなければならない。この周辺の話題はこのブログの記事Pythonは空白がお嫌いにある。

上記テストの結果、最後にある変数msgに”Please enter a value”に対応する日本語メッセージが正しく格納されていることを確認した。

ここまでは割りと順調。この後が大変だった。(続く。)

TurboGears

2007年7月12日 (木)

PythonによるWEBアプリケーションフレームワークのTurboGearsを使い始めたところだ。Java/Strutsよりどれだけ効率良く開発できるのか、見極めたいと思っている。慣れればJava/Strutsより効率が良いだろうが、まだ慣れていないため現在はかなり開発は遅い。

そもそもTurboGearsには日本語情報が少ないことが致命的だ。日本語による書籍は次のとおりである。

  1. TurboGears×Python
    TurboGearsについてのみ書かれた、日本語で唯一の本である。小さなサイズの本で190ページしかない。内容はTurboGearsの概要をさらっと紹介しただけで、非常に物足りない。
  2. Pythonプログラミング入門
    TurboGearsについては50ページほど書かれている。説明は少ないがプログラム例は参考になる。
  3. 最新Pythonエクスプローラ Django,TurboGears,Twisted,IronPython 完全攻略
    TurboGearsについては25ページほど。著者は「1」と同一人物。
  4. Web2.0ビギナーズバイブル
    900数十ページの分厚い本だが、TurboGearsについては170ページもある。TurboGearsについて書かれた専門の本「1」より少しページ数は少ないが、内容はこちらの方が圧倒的に充実している。とはいえ、この本だけではビジネス用アプリは書けない。
  5. 最新LLフレームワークエクスプローラ Ruby on Rails, Maple/Ethna(PHP),Catalyst(Perl),TurboGears(Python) 5大フレームワーク徹底攻略
    約1年前に出版された本。少し古いので持っていない。

以上の本をすべて読んでも、まだまだ情報不足。TurboGearsや周辺ソースを調べなければならないことばかりだ。

なおアマゾンで”TurboGears”をキーワードにして洋書を検索すると、次の1冊のみである。(あと2冊あるが、未発売本とドイツ語本である。)

  1. Rapid Web Applications With Turbogears: Using Python to Create Ajax-powered Sites
    購入した。必要時に必要項目を読んだが、現在の私に必要な情報はTurboGearsサイトの方が得られる。

ということで、TurboGearsについて書籍はあることはあるが、ビジネスアプリを構築するだけのレベルの書籍は残念ながら今は無い。ちなみに私が欲しいのは、Java/Strutsの開発時に非常に役立ったSTRUTS・イン・アクションのような本だ。

Pythonのコミュニティはおそらく、「判らなければソースを見ろ」と言うだろう。Python言語はわかりやすいのでそれがPython流かもしれないが、情報の網羅された本が無いとPython/TurboGearsの発展は無いだろう。誰か書かないかなぁ。

それまでは自分用のメモも兼ね、今後このブログでTurboGearsのTips記事を時々アップすることにする。

 

QLOOK ANALYTICS