パーソナルツール
現在の場所: ホーム takalog Categories python
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2017March »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
twitter facebook linkedin foursquare
カテゴリ
android (16)
av (27)
books (35)
coreblog (49)
ds (22)
emacs (8)
ferret (24)
google (34)
icecream (44)
lego (71)
mac (22)
misc (75)
moblog (277)
movie (33)
pc (44)
plone (339)
puzzle (43)
python (66)
server (67)
snowscoot (9)
software (125)
sports (40)
suidou (30)
winds (47)
 
文書操作

python

python
zope/plone 関連以外の python ネタを広く

文書操作

Python Developers Camp 2007 Winter 0日目

作成者 takanori投稿日 2007年03月07日 12時49分 最終変更日時 2007年03月07日 12時50分

というわけで、先週末 Python Developers Camp 2007 Winter に参加してきたので、そのレポートや感想など書きたいと思います。

まずは0日目(事前準備~宿に着くまで)

DjangoTurboGears の両方のプログラムに参加予定なので、とりあえず宿に着くまでに 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 python
トラックバック用URL:
http://takanory.net/takalog/685/tbping

Python Developers Camp 2007 Winter 0日目(その2)

作成者 takanori投稿日 2007年03月13日 00時20分 最終変更日時 2007年03月13日 00時20分

Python Developers Camp 2007 Winter 0日目 の続きです。

インストールは一通り終わったのでチュートリアルをはじめます。

まずは Django のチュートリアルから。

Django チュートリアル

多分 Django をやっている人ならみんなが見ていると思われる ymasuda さんのところ のドキュメントを参照しながら進めます。

チュートリアルはこちら。

  1. 初期化,モデル作成,データベース API
  2. 自動生成の admin サイトを探究する
  3. 公開用のインタフェースビューを作成する
  4. 簡単なフォームデータ処理と汎用ビュー

チュートリアル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 python
トラックバック用URL:
http://takanory.net/takalog/687/tbping

Mailman + SpamBayes

作成者 takanori投稿日 2007年08月06日 23時58分 最終変更日時 2007年08月06日 23時59分

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 の行はコメントアウトしていいと思います。

で、フィルタを通すようにしてみて、以前は保存書庫がひどいことになっていたんですが、だいぶフィルタにひっかかってくれるようになりました。満足満足。

カテゴリ
server server
python python
トラックバック用URL:
http://takanory.net/takalog/739/tbping

Google Maps API を使って大きい画像を表示(後編)

作成者 takanori投稿日 2007年09月09日 02時30分 最終変更日時 2009年06月12日 19時00分

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 もいい感じで使えるなというのが今回の印象でした。

今までだとこういう処理は ImageMagickconvert コマンドをシェルとかの中から呼び出してやっていたんですけど、 PIL を使うと全部 python スクリプトの中でおさまるのですっきりしていい感じです。

PIL の Image モジュールについてのマニュアルは The Image Module を参照してください。

カテゴリ
google google
python python
トラックバック用URL:
http://takanory.net/takalog/762/tbping

ArchGenXML 1.6.0 beta をインストール

作成者 takanori投稿日 2007年09月11日 00時00分 最終変更日時 2007年09月11日 00時02分

クラス図から plone のプロダクトを作ってくれる、超便利なプロダクト ArchGenXML の plone 3.0 対応版が出ていたので、久しぶりにインストールしてみました。

以前とはインストールの手順が変わっていて、 ArchGenXML そのものや、 i18ndudeEasyInstall でインストールできるようになったようです。

というわけで、以下 Windows 上でのインストールの手順です。

(python 2.4 が C:\Python24 に plone 3.0 が C:\Program Files\Plone にすでにインストールされているものとします)

  1. easy_install をインストール

    EasyInstall のページから ez_setup.py をダウンロードして、実行します。

  2. PATH の設定

    easy_install コマンドは C:\Python24\Scripts にインストールされるので、コマンドラインから実行しやすくするために、PATH の設定をします。

    マイコンピュータで右クリック→プロパティ→詳細設計→環境変数で環境変数 PATH に C:\Python24;C:\Python24\Scripts; みたいな感じで追加します。

  3. strip-o-gram をインストール

    これは、今までと同じ手順でインストールします。

    ここ から stripogram-1-4.tgz をダウンロードして解凍。

    あとは python setup.py install でインストールします。

  4. i18ndude, ArchGenXML をインストール

    この2つは easy_install でインストールできます。

    easy_install i18ndudeeasy_install archgenxml でインストールできます。

    なんか ArchGenXML のインストール時に SyntaxError が出てますが、ここでは気にしないことにします。

  5. PYTHONPATH を設定

    ArchGenXML が正常にインストールされると、 C:\Python24\Scriptsarchgenxml.exe ができるのですが、これを実行すると 「zope3 コンポーネントがインストールできない」というエラーがでます。

    このエラーを回避するために、環境変数 PYTHONPATH に C:\Program Files\Plone\Zope\lib\python を設定します。

    archgenxml をコマンドプロンプトなどで実行して、長~いヘルプが表示されたら成功です。

さて、次は実際にプロダクトを作ってみましょう。(多分)

カテゴリ
plone plone
python python
トラックバック用URL:
http://takanory.net/takalog/763/tbping

trac 0.11 を入れてみた

作成者 takanori投稿日 2007年10月06日 22時42分 最終変更日時 2007年10月14日 23時44分
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点です。

  1. ページを作成するテンプレートエンジンが ClearSilver から Genshi に変わった
  2. チケットの ワークフロー の設定を変更できるようになった
  3. Finer-grained control of permissions (ごめんなさい、よく意味がわかりません)
  4. ソースコードに色を付ける仕組みが SilverCity から Pygments に変わった
  5. リポジトリブラウザでディレクトリの階層を、画面遷移しないで開けるようになった
  6. 設定(Preferences)画面で、タイムゾーンとアクセスキーの有効無効が設定できるようになった
  7. WebAdmin が最初から入るようになった

5番めの動的にデータを書き換える部分は JavaScript ライブラリの jQuery を使っているようです。

trac の リポジトリブラウザ で △マークをクリックすることによって、ディレクトリを開いたり閉じたりできます。

7番目の WebAdmin が最初から入るのは、かなりいいですね。自分的には必須な機能なので。

2番目のワークフローのカスタマイズがほしかったって人は結構多いかなーと思うのですが、会社で入れている trac ではワークフローをちょっといじっているので、今度はそのことを書こうかと思います。

(多分、続く)

カテゴリ
server server
python python
トラックバック用URL:
http://takanory.net/takalog/779/tbping

trac 0.11 ワークフローのカスタマイズ

作成者 takanori投稿日 2007年10月09日 23時59分 最終変更日時 2007年10月14日 23時44分

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 が加わりました。

カテゴリ
server server
python python
トラックバック用URL:
http://takanory.net/takalog/782/tbping

trac 0.11 でメール送信

作成者 takanori投稿日 2007年10月14日 23時51分 最終変更日時 2007年10月14日 23時54分

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 形式で送られるようになりました。

カテゴリ
server server
python python
トラックバック用URL:
http://takanory.net/takalog/787/tbping

Powered by vine linux, python, zope, plone, coreblog