python
Python Developers Camp 2007 Winter 0日目
というわけで、先週末 Python Developers Camp 2007 Winter に参加してきたので、そのレポートや感想など書きたいと思います。
まずは0日目(事前準備~宿に着くまで)
Django と TurboGears の両方のプログラムに参加予定なので、とりあえず宿に着くまでに Windows の PC にインストールしてチュートリアルを終わらせておくことを目標としておきました。
というわけで、インストール。Django は 0.95 ではなく svn の最新版、TurboGears は多分 1.0.1 を使用するだろうということでインストールします。
PySqlite インストール
Database はどっちも SQLite を使うことにするので、 pysqlite をインストール。
Windows 上の Python 2.4 用バイナリ があるので、それをダウンロードして実行してインストールは終了(楽)
パスの設定
python とこれからインストールされるスクリプトのためにパスを設定しておきます。
マイコンピュータで右クリックしてプロパティ→詳細設定→環境変数をクリックして
Path の一番最初に c:\Python24;C:\Python24\Scripts; を追加しておきます。
Django インストール
Django | Download のページにしたがって svn を使って最新版をチェックアウトします。
URL は http://code.djangoproject.com/svn/django/trunk/
チェックアウトが終わったら trunk の下に django っていうフォルダができているので、それを
C:\Python24\Lib\site-packages に移動。
さらに django\bin の下を
C:\Python24\Scripts に移動。
私の環境では、コマンドプロンプトで django-admin.py と入力しても動作しないので、実行ファイルを作ることにしました。
ExeMaker Tool
ってのを落としてきて、
exemaker django-admin.py と実行すると django-admin.exe
ができあがります。
もう一回コマンドプロンプトで django-admin と入力してちゃんとオプションの説明がでました。よかったよかった。
TurboGears インストール
1.0/InstallWindows - TurboGears Documentation のページにしたがってインストールを実行。
tbsetup.py
というファイルをダウンロードして、コマンドプロンプト上で
python tgsetup.py を実行。
なんかすごい数の egg をダウンロードしてがしがしインストールしてくれます。
インストールが終わったらコマンドプロンプトで
tg-admin info を実行してちゃんと動作することを確認します。
次は、Django と TurboGears のチュートリアルです。(0日目つづく)
- カテゴリ
-
python
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/685/tbping
Python Developers Camp 2007 Winter 0日目(その2)
Django チュートリアル
多分 Django をやっている人ならみんなが見ていると思われる ymasuda さんのところ のドキュメントを参照しながら進めます。
チュートリアルはこちら。
チュートリアル3の途中で時間切れになったので、荷物を用意して Django と TurboGears のチュートリアルのページを firefox で開いてあとでやるために移動開始。
行きは 柴田さん の車に乗せてもらうために、待ち合わせ場所に移動。
待ち合わせ時刻は3時で、場所は家からタクシーで向かうのに微妙な場所だったので、終電で移動して駅近くのファミレス(ジョナサン)があるので、そこで待つことに。
というわけで、その待っている間に残りのチュートリアルをやっておこうという作戦です。
1時ころに駅に到着して一緒の車に乗っていく 村岡さん と合流。村岡さんはなんか別の言語の本を読んでいました。(なんだっけ?)
とりあえずドリンクバーのジュースを飲みまくりながらチュートリアルの続きを行う。
つまりつつも無事、終了。ふむふむ、とりあえず入力してデータまとめるサイトとか作るのはさくっとできそうでいい感じです。
あ、そうそう、Model 作るだけで admin 画面からデータ扱えたりするのはだいぶいい感じです。
TurboGears チュートリアル
続いて TurboGears です。
チュートリアルは The 20 Minute Wiki というものです。(とても20分ではできません。)
しかし、1ページ目 に驚愕の事実が!!
docutils をインストールしてくださいと書いてあります。用意してないよ...ネットここつながらないよ...
とりあえず気を取り直して docutils なしでできるところまで続けようと思ったんですが、早々にひっかかって断念。しょうがないので残った時間は話したりメール読んだりとかして終わりました。
行きの車の中で柴田さんにその話をしたら「zope 入ってたら中に docutils あるからそれを使って...」と指摘されました。確かに。考えが足りませんでした。
そして、後で全部チュートリアルを終えてみると、実際には docutils がなくてもチュートリアルは続けられることも判明。
移動
3:30ころに柴田さんが車で到着。乗せてもらって志賀高原まで移動開始。
途中少し私の時間が飛んだりしていましたが、無事長野県に到着。途中 SA での休憩とファミレスでの朝ごはんをはさんで志賀高原に着きました。(運転ごくろうさまでした & ありがとうございました)
宿に着くとすでに数名の方が到着していましたので、あいさつなどして荷物搬入。
さぁ、滑るぞ。(1日目につづく)
- カテゴリ
-
python
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/687/tbping
Mailman + SpamBayes
Mailman 運用しているメーリングリストに大量の SPAM メールがくるので、対策をしようと思いました。
参考にさせていただいたのは ウノウラボ Unoh Labs: ベンチャー流のスパムメール対策術(後編) のエントリ。
ただ、ここの例ではスパムフィルタに SpamAssassin を使用しています。
私は(一応) Pythonista なので、スパムフィルタに SpamBayes を普段使っています。
この学習した内容を使わないのはもったいないので、 SpamBayes で同じようにやってみました。
mailman の aliases は /usr/local/mailman/data/aliases にあるので、スパムフィルタを通したいメーリングリスト(この場合は test)について以下のように書き換えます。
test: "|/usr/bin/procmail -m /etc/postfix/ml_procmailrc" #test: "|/usr/local/mailman/mail/mailman post mailman"
で、次に procmail の振り分けルール /etc/postfix/ml_procmailrc を、以下のように記述しました。
# SPAM メールの転送先 SPAM_TO=spam@takanory.net # フィルタコマンド FILTER=/usr/bin/sb_filter.py # フィルタが使用するデータベース DB=/home/takanori/.hammiedb # ログの出力先 LOGFILE=/tmp/procmaillog :0 fw:hamlock | $FILTER -d $DB :0 * ^X-Spambayes-Classification: spam ! $SPAM_TO :0 * ^.*test |/usr/local/mailman/mail/mailman post test
参考にした Blog と違うのは当然ですがフィルタのかけ方です。
フィルタとして SpamBayes のフィルタコマンド sb_filter.py を呼んでいます。SPAM のデータとしては私が蓄積しているデータを -d オプションで指定しています。
それから、SPAM と判断された場合のヘッダにつく文字列が違うので、そこも書き換えています。
それから、動作がうまくいっているか確認するために、procmail のログを出力するようにしておきました。動作が安定したら LOGFILE=/tmp/procmaillog の行はコメントアウトしていいと思います。
で、フィルタを通すようにしてみて、以前は保存書庫がひどいことになっていたんですが、だいぶフィルタにひっかかってくれるようになりました。満足満足。
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/739/tbping
Google Maps API を使って大きい画像を表示(後編)
Google Maps API を使って大きい画像を表示(中編) で書いた
さて、次回こそは「大きい一枚の画像から Google Maps を使って表示するためのタイル画像を生成する」python スクリプトについて書きますかね。
です。完結編。
言うまでもありませんが Python Imaging Library (PIL) は必須です。
で、タイル画像を生成するコードは create_tiles.py です。
コマンドラインで create_types.py hogehoge.png とかいう感じで画像ファイルを渡すと、 hogehoge ディレクトリの下に各ズームレベルのディレクトリを作成して、 (X座標)_(Y座標).png という画像ファイルを作成します。 渡した画像が jpeg の場合はタイル画像も jpeg になっています。
というわけで、以下に簡単にコードの解説など。
create_tiles(basename, suffix, image, zoom): メソッドは、指定された画像から指定されたズームレベル(0以上)のタイル画像を生成します。 image には(必要ならば)すでに縮小された画像が入っています。
基本的にタイル画像を生成するためのコードだけを抜粋するとこんな感じです。 画像サイズから、タテヨコにそれぞれ何枚のタイル画像(256x256)が必要かを数えて、ぐるぐると crop(左X座標、上Y座標、右X座標、下Y座標) で切り取っていきます。
(width, height) = image.size
x_l = int(math.ceil(width/256.0))
y_l = int(math.ceil(height/256.0))
for x in range(x_l):
for y in range(y_l):
tile = image.crop((x*256, y*256, (x+1)*256, (y+1)*256))
tile.save("%s/%d/%s_%s.%s" % (basename, zoom, x, y, suffix))
ただし、画像のいちばんはしっこを切り取った場合には、画像が 256x256 サイズにならないため、用意しておいた 256x256 のグレーの画像に重ね合わせます。
その処理だけ抜き出すとこんな感じです。
crop() で画像を抜き出すのは同じですが、ハンパなサイズなので、あらかじめ作成しておいたグレーの 256x256 サイズの画像に paste() で貼り付けます。貼り付け位置は左上(0, 0)。
gray = Image.new("RGB", (256, 256), (231, 227, 222))
for x in range(x_l):
for y in range(y_l):
tile = ""
if (x == x_l-1 or y == y_l-1):
# はじっこはサイズを 256x256 に整える
tile = gray.copy()
right = (x+1)*256
low = (y+1)*256
if right > width:
right = width
if low > height:
low = height
tile.paste(image.crop((x*256, y*256, right, low)), (0, 0))
次に、ズームレベルをいくつまでにするか判断して、ズームレベルごとの画像を生成する create(basename, suffix, image) メソッドです。(名前がアレですが)
最初に画像のサイズからズームレベルをいくつにすべきかを求めます。
size で画像の幅と高さが取得できるので、大きいほうの値を使用します。 ズームレベルはタイルの多いほうの枚数が 2 の何乗で足りるか?で計算しています。(8枚だったら3、16枚だったら4) log とかすっごい久しぶりに使いました。
(width, height) = image.size
length = float(height)
if (width > height):
length = float(width)
length = length/256
# log2(x)をもとめて zoom を決める
zoom_size = int(math.ceil(math.log(length) / math.log(2)))
あとは各ズームレベル用の縮小画像を作成して、先ほど説明した create_tiles() を呼びます。
画像の縮小は resize(サイズ、フィルタ) で実行します。 ここではフィルタには ANTIALIAS を使っていますが、好みで BICUBIC とかを使ってみてもいいのかも。
ズームレベル 0(縮小しない)もあることをお忘れなく。
for count in range(zoom_size+1):
zoom = zoom_size - count
print "zoom", zoom
map_image = ""
if count != 0:
# 1/2^n に縮小した画像を生成する
map_image = image.resize((width/(2**count), height/(2**count)), Image.ANTIALIAS)
else:
map_image = image.copy()
map_image.save("%s-%d.%s" % (basename, zoom, suffix))
# 各 zoom 単位のタイル画像を生成する
create_tiles(basename, suffix, map_image, zoom)
といった感じで PIL の練習がてらやってみましたが、結構 PIL もいい感じで使えるなというのが今回の印象でした。
今までだとこういう処理は ImageMagick の convert コマンドをシェルとかの中から呼び出してやっていたんですけど、 PIL を使うと全部 python スクリプトの中でおさまるのですっきりしていい感じです。
PIL の Image モジュールについてのマニュアルは The Image Module を参照してください。
create_tiles.py
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/762/tbping
ArchGenXML 1.6.0 beta をインストール
クラス図から plone のプロダクトを作ってくれる、超便利なプロダクト ArchGenXML の plone 3.0 対応版が出ていたので、久しぶりにインストールしてみました。
以前とはインストールの手順が変わっていて、 ArchGenXML そのものや、 i18ndude は EasyInstall でインストールできるようになったようです。
というわけで、以下 Windows 上でのインストールの手順です。
(python 2.4 が C:\Python24 に plone 3.0 が
C:\Program Files\Plone
にすでにインストールされているものとします)
- easy_install をインストール
EasyInstall のページから ez_setup.py をダウンロードして、実行します。
- PATH の設定
easy_install コマンドは
C:\Python24\Scriptsにインストールされるので、コマンドラインから実行しやすくするために、PATH の設定をします。マイコンピュータで右クリック→プロパティ→詳細設計→環境変数で環境変数 PATH に
C:\Python24;C:\Python24\Scripts;みたいな感じで追加します。 - strip-o-gram をインストール
これは、今までと同じ手順でインストールします。
ここ から stripogram-1-4.tgz をダウンロードして解凍。
あとは
python setup.py installでインストールします。 - i18ndude, ArchGenXML をインストール
この2つは easy_install でインストールできます。
easy_install i18ndudeとeasy_install archgenxmlでインストールできます。なんか ArchGenXML のインストール時に SyntaxError が出てますが、ここでは気にしないことにします。
- PYTHONPATH を設定
ArchGenXML が正常にインストールされると、
C:\Python24\Scriptsに archgenxml.exe ができるのですが、これを実行すると 「zope3 コンポーネントがインストールできない」というエラーがでます。このエラーを回避するために、環境変数 PYTHONPATH に
C:\Program Files\Plone\Zope\lib\pythonを設定します。archgenxml をコマンドプロンプトなどで実行して、長~いヘルプが表示されたら成功です。
さて、次は実際にプロダクトを作ってみましょう。(多分)
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/763/tbping
trac 0.11 を入れてみた
まだ正式リリースされていませんが、 trac 0.11 にアップグレードしてみました。
インストール手順 は以下のとおり、 setuptools が入っていると簡単です。
# easy_install genshi # easy_install pygments # easy_install http://svn.edgewall.com/repos/trac/trunk/
インストール後は 0.11/TracUpgrade を参考に環境を upgrade し、サーバを再起動します。
# trac-admin /var/trac/takanory upgrade # trac-admin /var/trac/takanory wiki upgrade # /etc/init.d/apache2 restart
これで、trac 0.10 から 0.11 の開発版に移行できました。
trac 0.10 か 0.11 で大きく変わったのは リリースノート によると以下の7点です。
- ページを作成するテンプレートエンジンが ClearSilver から Genshi に変わった
- チケットの ワークフロー の設定を変更できるようになった
- Finer-grained control of permissions (ごめんなさい、よく意味がわかりません)
- ソースコードに色を付ける仕組みが SilverCity から Pygments に変わった
- リポジトリブラウザでディレクトリの階層を、画面遷移しないで開けるようになった
- 設定(Preferences)画面で、タイムゾーンとアクセスキーの有効無効が設定できるようになった
- WebAdmin が最初から入るようになった
5番めの動的にデータを書き換える部分は JavaScript ライブラリの jQuery を使っているようです。
trac の リポジトリブラウザ で △マークをクリックすることによって、ディレクトリを開いたり閉じたりできます。
7番目の WebAdmin が最初から入るのは、かなりいいですね。自分的には必須な機能なので。
2番目のワークフローのカスタマイズがほしかったって人は結構多いかなーと思うのですが、会社で入れている trac ではワークフローをちょっといじっているので、今度はそのことを書こうかと思います。
(多分、続く)
-
- ¦
- 固定リンク
- ¦
- コメント (2)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/779/tbping
trac 0.11 ワークフローのカスタマイズ
trac 0.11 の新機能の一つに
「チケットの ワークフロー の設定を変更できるようになった」
というものがあります。
デフォルトとのチケットのワークフローは
new (新規作成) -> assigned (担当が決まった) -> closed (終了した)
となっていますが、これだと担当者が「修正した!」と思ったら、他の誰も確認できずに closed になってしまいます。
これだといまいちなので、会社に入れた trac 0.11 では closed の前に resolved (解決した) という状態を増やしました。
そのために trac.ini のワークフロー設定をこんな風に書き換えました。
変更前:
[ticket-workflow] : reopen = closed -> reopened reopen.operations = del_resolution reopen.permissions = TICKET_CREATE resolve = new,assigned,reopened -> closed resolve.operations = set_resolution resolve.permissions = TICKET_MODIFY
変更後:
[ticket-workflow] : reopen = resolved,closed -> reopened reopen.operations = del_resolution reopen.permissions = TICKET_CREATE resolve = new,assigned,reopened -> resolved resolve.operations = set_resolution resolve.permissions = TICKET_MODIFY close = resolved -> closed close.permissions = TICKET_MODIFY
これで、状態に resolved が加わりました。
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/782/tbping
trac 0.11 でメール送信
trac では、簡単な設定でチケットが変更になったときにお知らせメールが飛ぶようにできます。
メール送信設定は trac.ini の下記の部分を修正することでできます。
[notification] : smtp_always_cc = (送信先メールアドレス) smtp_enabled = true
上記の設定でメールが送信できますが、メールの形式は utf-8 + base64 encoding になります。
最近のメーラなら大丈夫ですが、古いメーラなどではうまく読めない場合があります。
というわけで、よくある日本語メールのように iso-2022-jp でメールを送信するようにします。
"OZACC.blog: trac 0.10.4":http://blog.ozacc.com/archives/001563.html に書いてある内容を参考にしました。
trac に入っている notification.py を以下のように書き換えます。
変更前:
self._charset.input_charset = 'utf-8'
pref = self.env.config.get('notification', 'mime_encoding').lower()
if pref == 'base64':
self._charset.header_encoding = BASE64
self._charset.body_encoding = BASE64
self._charset.output_charset = 'utf-8'
:
:
# sanity check
if not self._charset.body_encoding:
try:
dummy = body.encode('ascii')
変更後:
self._charset.input_charset = 'utf-8'
pref = self.env.config.get('notification', 'mime_encoding').lower()
if pref == 'iso-2022-jp':
self._charset = Charset('iso-2022-jp')
elif pref == 'base64':
self._charset.header_encoding = BASE64
self._charset.body_encoding = BASE64
self._charset.output_charset = 'utf-8'
:
:
# sanity check
if self._charset.input_charset == 'iso-2022-jp':
body = unicode(body, 'utf-8').replace(u'\uff5e', u'\u301c')
body = body.encode('iso-2022-jp')
elif not self._charset.body_encoding:
try:
dummy = body.encode('ascii')
これで、日本語のお知らせメールが iso-2022-jp 形式で送られるようになりました。
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/787/tbping
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。
zope/plone関係の技術的な内容については
"Finer-grained control of permissions"って、もっときめ細かくパーミッション設定が出来るということですね
ふむふむ。
コメントどうもです。 > ロバートさん
その「もっときめ細かく」ってのはどうやって設定することを言ってるんでしょうかねぇ。
Wiki のページ単位とかに誰が参照できるかを指定できるようになったのかな?