by matobaa

旧来の稟議書には必ず入ってるので、それをそのままtracに移行する場合「承認日」「承認者」とかいうフィールドを用意して解決しよう、ということになりがち*1。
すると、「クローズする際は、承認日フィールドに現在の日時を、承認者フィールドに自分の名前を入れてクローズボタンを押す」とかいうルールで運用されることになる。ワークフローシステムをつかえばこのへんは自動的にできるのに、チケットシステムだと泥臭い運用になってしまう。
こんなの絶対おかしいよ。
そこで、tracが持っている「ステータスを変えた日時」を取り出して使おう。SQLはこんなかんじ:
SELECT ticket, max(time) FROM ticket_change
WHERE
field = 'status' AND
newvalue = "closed"
GROUP BY ticket;
closed以外でも使えるように条件からはずして、tracのレポートから使えるようにビューにしておく:
CREATE VIEW status_change AS
SELECT ticket, author, newvalue AS status, max(time) AS time
FROM ticket_change WHERE field = 'status'
GROUP BY ticket, newvalue;
これで、tracのレポートで以下のように使えるようになる:
select id, summary, ticket.time,
a.time as Accepted_Date,
c.time as Closed_Date, c.author as Closer
from ticket
left join status_change AS a on (a.ticket = ticket.id and a.status = "accepted")
left join status_change AS c on (c.ticket = ticket.id and c.status = "closed")*1 TracLightningでは、日付を意味するフィールドは DateFieldPluginを使うことで日付文字列を文字列としてそのまま格納するようになっている。これが「承認日」とかいうフィールドを作ろうとさせる要因のひとつになっているんだろうね。
オリジナルのTracを使う場合、チケットの作成日などの日付フィールドは、date, time, datetime, created, modified といった特定のカラム名の場合だけ 日付文字列(YYYY-MM-DDなど)で表示され、それ以外は unixtimeである整数値(16桁の数値)で表示されてしまうという問題がある。具体的には、tracのレポートで、チケットの作成日を created 以外のカラム名で表示しようとした際に、16桁の数字で表示されてしまう。

ネットを検索してみると、SQLiteのdatetime関数で日付文字列に変換する処理を入れる、というやり方が見つかった。こんなかんじ:
select id, summary, ticket.time,
datetime(a.time/1e6,'unixepoch') as Accepted_Date,
datetime(c.time/1e6,'unixepoch') as Closed_Date, c.author as Closer
from ticket
left join status_change AS a on (a.ticket = ticket.id and a.status = "accepted")
left join status_change AS c on (c.ticket = ticket.id and c.status = "closed")
まぁこれでもいいのだけど、以下の二つの点でいけてない:
Genshiが日付文字列に変換する処理そのものはユーザのタイムゾーンを意識した変換をしてくれるのだが、残念ながら「どのカラムを対象とするか」がTracに含まれるGenshiテンプレートでハードコードされている*1。このファイルをどうにか差し替えてやることで、closed.date なども、ユーザのタイムゾーンを意識した変換ができるはず。
そこで、ITemplateProviderインタフェースを実装したプラグインを作って、ちょっと改造したテンプレートを同じ名前でをプラグイン側から提供するようにしてみたところ、あっさり report_view.html を差し替えることができた。
*1 なお、InterActが提供している Trac-Ja ではテンプレートそのものに修正を直接加えて、「日付」「日時」が後ろにあるカラム名、つまり例えば「作成日時」といったカラム名でも YYYY/MM/DD形式で表示されるように手が加えてある。
同じ名前のテンプレートを提供するプラグインが複数あったら、そっちに負ける可能性があるよね。そこで、tracにおいてgenshiテンプレートがどういう順番で読まれるのか。tracdをデバッガで追いかけてみたところ、優先順位は以下のようになっていた:
つまり。trac本体の/trac/ticket/templates/フォルダはtrac.ticket.web_ui.TicketModule が提供しているので、アルファベット順で若い名前のプラグインが提供しているテンプレートが優先されることになる。今回差し替えたかった report_view.html は /trac/ticket/templates にあったので、プラグインで割り込むことができた。
次に考えることのメモ。
久々に。apache reverse proxy + apache という構成で、その間でのネゴに失敗するようで、表が 502 Bad Gateway を返す、というトラブル。必ず発生するわけではないところが厄介。
tcpdump -w でダンプをとりつつ、再発させるリクエストをがんがん投げ込んでみて、なにに失敗しているかを調査してみている。まだ突き止められていない。
CLOSE_WAIT がぞろぞろ出てる。これが原因か? それとも 502 Bad Gateway の結果か? なんで TCPスタックの整合性が取れなくなってるのか不明。ひきつづき追求中。
# yum install wget gcc
; get dependencies
# yum install openssl-devel
# yum install db4-devel
; get sources then build
# wget ftp://ftp.dti.ad.jp/pub/net/OpenLDAP/openldap-release/openldap-2.4.26.tgz
# tar xzf openldap-2.4.26.tgz
# cd openldap-2.4.26/
# ./configure --with-tls=openssl --enable-dynamic
# make depend
# make
# make test
# make install
既定値だと、バイナリが /usr/local/bin、設定ファイルは /usr/local/etc/openldap に入る。
CentOS5だと失敗する。
BerkeleyDB version incompatible with BDB/HDB backends
だって。
ぐぐってみると、CentOS 5 に入ってる BerkeleyDBは4.3で、OpenLDAPは「4.2以降、ただし4.3を除く」なんだそうだ。
めんどくせー。CentOS6でやる。
Eclipseのコードフォーマッタって、マルチバイト文字の幅をきちんと計算してくれない。「80文字で折り返し」という設定をしてても、日本語だろうがアルファベットだろうが80文字で折り返そうとするので、日本語が入ってると右側がでっぱってしまう、という問題があった。

Ubuntu10.10に入ってる TakaoGothic.ttfをもとに、FontForgeでこんな感じで生成した。
$ sudo apt-get install fontforge
#!/usr/bin/fontforge
Open("/usr/share/fonts/truetype/takao/TakaoGothic.ttf")
Select(0x00a0, 0x00ac, 0x00ae,0x00bf, 0x0180,0x02fffe, 0x110000,0x1104fd)
Print("Transforming...")
foreach
if(GlyphInfo("PointCount") > 0)
Print(GlyphInfo("Name") + "/" + GlyphInfo("Encoding"))
Scale(50,100,0,0)
endif
endloop
Print("Saving...")
SetFontNames("TakaoGothic-HalfWidth","TakaoGothic","TakaoGothic Halfwidth","Book")
Generate("TakaoGothicHW.ttf","",0x14)
Close()
しかしいまのところ、情報の埋め込みに失敗したらしく、フォントサイズ9,12,18,24とかでしかまともに使えない。
↑ matobaa [ツッコミのテスト]