fukuoka.py参加

fukuoka.pyに参加しました。何で福岡って?それは、大学時代福岡で過ごしていい町だったし、何かしらつながりを持っておきたかった、それだけです。

あっちではPython関連のことを書いて、こっちではそれ以外を書こうかな。tracのように両方関わるやつは、両方コピーするかも。

福岡とかに住んでいなくてもOKですが、参加された方は、そのうち福岡に住んでください。

fukuoka.pyのはてなグループ

とりあえず今週末帰省する予定なので、4日だけ福岡に住みますw

みんなのPython、読了!

多分10日ほどで読了。とは言っても一通り目を通したってだけで、これから実際に触っていくに従って疑問点も出てくるのでしょうが。

みんなのPython

みんなのPython


↑の本には詳しく述べられていなかったことの補足で、下記サイトを。

[http
//www.oldriver.org/python/pep-0008j.html:title]:コーディング規約。Pythonに限った話ではないところも多い。
[http
//www.python.jp/doc/release/lib/module-unittest.html:title]:ユニットテスト。みんなのPythonではdoctestが紹介されていたけど、ある程度網羅的なテストをやるならこっちかな。
[http
//www.r-stone.net/blogs/satoshi/2008/02/pydev.html:title]:カバレッジ測定。PyDevにコマンドがあるのはすぐに分かったけど、使い方が分かりませんでした。リンク元の人も触れているけど、結果がエラーとして扱われるのがちょっとやだな…

まだPythonデビューしてちょっとだけど、コーディングしてて何か小気味いい感じ。(SIer的な)業務でやるならJavaとかの方が無難だろうけど、自分一人とか少数精鋭ならLLだと生産性が上がりそう。

あとは、PyDev on Eclipseがちょっと重いのでそれさえ何とかなれば。ま、次のマシンに換えたら大丈夫でしょう。

初めてのPython

一応、Tracの改造をちょこちょこやった時に若干触れてはいるのですが、体系的にという意味で。


  • 今回やったこと
  • 身につけたもの

勉強中

時間が空いたらすぐに↓の本を取り出して読んでいます。新しい言語を(体系的に)勉強するのは久しぶりで、何かすごく新鮮な感じ!

みんなのPython

みんなのPython

Python組み込みのデータ型らへんまでは読了。今週末ぐらいで、Hello, World的にFizzBuzzPythonバージョンでも書いてみるか。EclipsePython開発環境のPyDevも入れたことですし、環境に慣れるためにも。


作りたいものはあって大体の構想も練れてきているのですが、実際にコード作成に入るのはもうちょっと後かな。せめてクラスの作成方法とユニットテストのやり方までは踏まえた上で取り掛かりたいので。

特に今回作成したいものは色々なモジュール(Trac・SAP・Subversion)をまたがるため、それらをインターフェイスとして切り離しておかないとテストもままならないので。この辺の感覚は、インターフェイス指向設計を読んだからかな。正直難しくて多分半分も理解できてないのですがw

インターフェイス指向設計 ―アジャイル手法によるオブジェクト指向設計の実践

インターフェイス指向設計 ―アジャイル手法によるオブジェクト指向設計の実践

メール通知日本語化計画

会社で導入できないっていうのに、懲りずにtracネタを。

けど、何で最近tracだったりABAPUnit(xUnit)にこんなに構成管理ツールに惹かれるのでしょう…?


今日やろうとしたことは、メール通知のカスタマイズ。

tracには、チケットが更新されたときに関係者にメールを送るという機能があります。で、これですがデフォルトだと項目名が英語の状態で表示されます。こんな風に。

--------------------+-------------------------------------------------------
 Reporter:  guest  |            Owner:  guest
     Type:  タスク    |           Status:  new
 Priority:  普通     |        Milestone:
 Component:  その他    |          Version:
 Keywords:         |   Estimatedhours:  0
Due_assign:         |            Hours:  0
 Due_close:         |       Totalhours:  0
 Billable:  1      |         Complete:
--------------------+-------------------------------------------------------
Condition:


--------------------+-------------------------------------------------------
テストコメント

↑でも意味は分かるのですが、もしこの先プロジェクトにtrac導入を検討しようとなったときに、英語表記だとそれだけで敬遠される可能性があります。こういうところでマイナスされたくないので、少しでもとっつきやすいように日本語表記にできないかと、ここ2週間ぐらい仕事から帰ってPython&tracと格闘してました。


とは言っても、Pythonなんて初めてなので、初歩的な文法すら分からない状態。さすがに素のテキストエディタでは厳しいので、@nifty:@homepage:エラーとか入れてみました。

とりあえず、403 Forbiddenを見てどのクラスのどのメソッドらへんでやっているかは理解しました。あとは、愚直にトライアンドエラー。適当にソースファイルを修正した後にチケットを更新してメールを飛ばす。そのメールの中身を見て望み通りになっていないなら、もう一度最初から。せめてデバッグ手法でも知っておけば、少しは効率よくできたかもしれませんが…。

で、いろいろごちゃごちゃしたあげく、format_props()の↓の部分が怪しいかもとあたりをつける。

...

for f in [f for f in fields if f['name'] != 'description']: 
  fname = f['name'] 

...

if f['type'] == 'textarea' or '\n' in unicode(fval):
  big.append((fname.capitalize(), CRLF.join(fval.splitlines()))) 
else:

...

「fname」って変数が英語表記の項目名っぽいな。ここを日本語表記にすればいいんだ。そういや、どっかで「label」って変数を見たな。試してみよう!

...

for f in [f for f in fields if f['name'] != 'description']: 
  fname = f['name'] 
  flabel = f['label'] # この行追加

...

if f['type'] == 'textarea' or '\n' in unicode(fval):
  big.append((flabel.capitalize(), CRLF.join(fval.splitlines())))  # この行修正
else:

...

結果は、以下のように。日本語化ができました!!

------------------------+---------------------------------------------------
    報告者:  guest  |    担当者:  guest
       分類:  タスク    |   ステータス:  assigned
    優先度:  普通     |   マイルストーン:
コンポーネント:  その他    |   バージョン:
 解決方法:         |   キーワード:
         見積時間:  0      |        着手予定日:
      今日の作業時間:  0      |        終了予定日:
        総作業時間:  0      |        集計対象?:  1
       進捗率(%):         |
------------------------+---------------------------------------------------
進捗状況:


------------------------+---------------------------------------------------
コメント (by guest):

 項目名を日本語化


ただ、これだとあまりよろしくないのですよね。というのは、文面がきれいにフォーマットされていない。

どうやらマルチバイト文字をフォーマット書式で出すときに、文字数のカウントがうまくいっていないためにバラバラに出力されるみたい。メール通知の文字コードUTF-8だからまずいのかなと思って、OZACC.blog: trac 0.10.4とかWhiteDog@Blog: 2007/06も試したのですが、結局無理でした…orz

なので、二段組は諦めて一行一項目作戦に。完璧に逃げですw。上と同じく、format_propsの一部分を↓のように変更してみました。

...

#  txt += format[i % 2] % (fname.capitalize(), fval)       # この行削除
   txt += '%s : %s%s' % (flabel.capitalize(), fval, CRLF)  # この行追加

...

結果は、こんな感じ。

------------------------+---------------------------------------------------
報告者 : guest
担当者 : guest
分類 : タスク
ステータス : assigned
優先度 : 普通
マイルストーン :
コンポーネント : その他
バージョン :
解決方法 :
キーワード :
見積時間 : 0
着手予定日 :
今日の作業時間 : 0
終了予定日 :
総作業時間 : 0
集計対象? : 1
進捗率(%) :
------------------------+---------------------------------------------------
進捗状況:


------------------------+---------------------------------------------------
コメント (by guest):

 一段組み出力


途中長くなったけど、結局やった修正はこんな感じ。

--- TracLight/python/Lib/site-packages/trac/ticket/notification.py (リビジョン 49)
+++ TracLight/python/Lib/site-packages/trac/ticket/notification.py (リビジョン 51)
@@ -152,16 +152,14 @@
         i = 0
         for f in [f for f in fields if f['name'] != 'description']:
             fname = f['name']
+            flabel = f['label']
             if not tkt.values.has_key(fname):
                 continue
             fval = tkt[fname]
             if f['type'] == 'textarea' or '\n' in unicode(fval):
-                big.append((fname.capitalize(), CRLF.join(fval.splitlines())))
+                big.append((flabel.capitalize(), CRLF.join(fval.splitlines())))
             else:
-                txt += format[i % 2] % (fname.capitalize(), fval)
-                i += 1
-        if i % 2:
-            txt += CRLF
+                txt += '%s : %s%s' % (flabel.capitalize(), fval, CRLF)
         if big:
             txt += sep
             for name, value in big:

あー、疲れた。けど、日本語で出力するっていう要望ありそうなのに、ネット調べても見つからなかったのですよね。それともあまりに簡単過ぎて、敢えて誰も取り上げないだけ…?