Shibuya.trac温泉開催しました。

11/23にShibuya.trac温泉をタワーホール船堀+東京健康ランドというコンボで開催してきました。まず各々が思い思いに開発を行い、発表し、その後都内でも入れる温泉に入ろう、という企画でした。3連休の最終日で、しかも日帰りという強行軍でしたが、参加したメンバーは各々成果が出せた上、温泉も楽しんでいただけたようで、とても充実したイベントとすることができました。
自分が作成したのは、gitracというツールで、Tracのチケットリポジトリを中央リポジトリとした、分散型のチケット管理システムです。使い方はこんな感じ。

Usage: gitrac [command] 
  command:
     init [url] - リポジトリ設定の初期化です。URLでTracのXML-RPCのURLを指定してください。URLはこんな感じで指定します。 http://[ユーザー名]:[パスワード]@[プロジェクトのURL]/login/xmlrpc
     add [summary] - ローカルにチケットを作成します。
     list - ローカルにあるチケットを一覧にします。
     push - ローカルに貯められたチケットをTracへ登録します 
     help - 子のメッセージです。

gitrac initでURLを登録し、その他のコマンドを使って登録していきます。rmやeditがないので、pushをするのはまだ怖いところではありますが、http://github.com/kompiro/gitracで公開をはじめました。メインのスクリプトしかなく、細かいメソッドだらけで非常によみにくくてすいません。今後クラスに分割していく予定です。

Pythonに触れたのはかなり久しぶりで、以前はほとんど何もできなかったのですが、今回書いてみたらサクサク書くことができました。クラスにしていく段階で、メソッドにselfを追加し忘れそうですが、メソッドだけであれば結構たのしく書くことができました。パッケージの作成とかもちょっと頑張ったり。おいおいまとめていこうか。

Shinjuku.tracにいってきた。

いつの間に改名したんだろう。Shibuya.trac。そろそろ原点回帰として渋谷でやるべきではないのだろうか。
今回も発表をしました。Slideshareに上げました。


発表でXML-RPCを使ってwiki textをパラメータにすると変換後にHTMLが帰ってくるRPCを紹介しましたが、それを聞いてかおるんさんが内職してTaskTrayTracをさらによいものにしてたとか、そういうの素晴らしいですよね。
最近発表多かったなぁ。来月はEclipSKYやりたいんだけどなぁ…。

0.11でTracMacroを書く

Shibuya.trac新年会で結構みんなの待望だったRSSマクロが公開されていました。このRSSマクロ、最新版のTrac 0.11では動かないみたい。なぜならTracは0.11からClearSilverではなくgenshiというテンプレートエンジンへ載せかえられているから。*1 *2

今日はRSSマクロを0.11へ移植してみた。その際学んだことをつらつら書いていきます。今回はLinux上ではなく、TracLightning2.1-beta4を使ってみました。Windows上です。

え?Tracはマクロとかを修正したときにサーバーの再起動が必要なの?

のっけからビックリしたんですが、Tracはサーバーのソースを修正すると自動的に更新するわけではないようです。否「自動的に更新」じゃなくて、望「毎回スクリプトを実行する」か。サーバとして起動するときにスクリプトをコンパイルして読み込んでおくような動きをしています。mod_pythonのディレクティブの設定でPythonAutoLoadなんてものがあるんで、それをONにしても反応が変わらず。
mod_pythonを使ってるからか?と思ってtracdで起動して、マクロを書き換えても読み込んでくれません。Tracのアプリケーションの特性なんでしょうか?良く分かりません。そこでCGIにしてTracを実行してみました。毎回プロセスを作る、と言われているCGI。要するに毎回新しく"python"コマンドで実行してるんだよな、と理解してるんですが、そういうことでしょうか。実行するたびにTracのスクリプトが読み込まれ、実行されるわけですから、そりゃ遅い。体感で20秒くらいかかります。マクロを書き換えて実行して…って、サーバー再起動するのとおんなじくらい時間かかるやん><
じゃ、気を取り直してFastCGIで動かしてみっか!とやってみたところ、Windows上だと実装していない処理があるから動かないよ、ってTracのドキュメントにかかれてました。*3

じゃ、マクロをコマンドラインから動かせないの?

0.10までのマクロは、スクリプトファイルの直下に直接メソッドを定義していました。これのいいところはそのメソッドをpythonインタプリタから直接実行できたわけです。こんな感じ。

if __name__ == '__main__':
  print execute( None, sys.argv[1], None )

0.11からのマクロはお行儀良く、クラスを作って、IWikiMacroProviderインターフェースを実装せよ、との事。しかもこのクラス、Componentクラスの子クラスでなければならない模様。これからはマクロもpluginsディレクトリにツッコめとなっているので嫌な予感がしてたけど、ほんとにそうなんですね。で、こんな風にしてみたら動いたよ。

from trac.test import EnvironmentStub

if __name__ == '__main__':
  env = EnvironmentStub()
  rss = RSS(env)
  print execute( None, sys.argv[1], None )

EnvironmentStubはテスト用のスタブ。ComponentクラスはコンストラクタでComponentManagerクラスのインスタンスを要求してやがる。だけどtrac.coreで定義されているComponentManagerクラスは、隠蔽されてます。*4なのでどうしたものか、と悩んだ末、EnvironmentStubでいけたので、これを使えばユニットテストも書けますね。
とりあえず今日はこんなところで。って言っても結構悩んだんだよ。

*1:ClearSiverはCで書かれており、OSネイティブなテンプレートエンジンです。そのため、移植性が多少下がってしまいます。できることならpythonで書かれたテンプレートエンジンが望まれていたわけです。そこで登場したのがgenshi。これはPythonで書かれたテンプレートエンジンで、Tracと同じedgewallで開発されているようです。

*2:ほんとか?ClearSilverが入ってたらwiki-macrosディレクトリに入れたら動く気がする。

*3:wiki/TracFastCGIってページです。

*4:__all__=['Component',...で羅列しているのは公開しているクラス、メソッド

kompiro.orgをよろしく!(DreamHostを使い倒そう。)

円高の波にのっかり、DreamHostに申し込んでみたよ。DreamHostでは独自ドメインを取得できるらしいので、ドメインも取ってみた。http://kompiro.org/です。新春特価で$60で2年間使えるらしい。ユーザーホームに環境作ってインストールする限りは、デーモンやりソースを食いつぶすようなものでない限りなんでもいけるらしい。
自分のアプリのビルドサーバーに仕立て上げようとしたんですが、Javaのプロセス+gitでリソース食いつぶしてしまうため、あえなく断念。変わりに自分のサイトや、JAM CircleのTracの公開をするホストにするように色々準備してみた。なお、TracのOne Click Installerは用意されていないので、自分でごにょごにょ頑張る必要がある。でもsourceforge.netで頑張っていたころに比べたらずいぶんまし。英語だけどwiki.dreamhost.comにTracのインストール方法が用意されている。
Tracのインストールもeasy_installが用意されてだいぶ楽にできるようになった。

参考ドキュメント

まずは自分の環境構築から。DreamHostはDebianを使っているみたいだけど、初期状態はほとんど何も設定されてません。Linuxに慣れ親しんだのはVineLinux2.1くらいからだったけど、.bashrc等は一通り揃った状態で使う事が多かった。だからほとんど何も設定されていない環境は新鮮です。一から環境を整えるにはどうしたらいいか、それが書かれています。

続いてアカウントのセットアップ。Environment_Setupとどっちが先?って聞かれるとよく分かりませんが、自分のアカウント以下にLinuxの標準フォルダ構成であるFHSを構築する手順が書かれています。ソフトをインストールする度に散らかす自分にこのドキュメントはありがたい。

Shibuya.trac2009新年会

行ってきたよ!一昨日のイベントだったけど、昨日は風邪引いて寝込んでいました。とりあえずLTでJAM Circle紹介してきた。JAM Circleでググルとソープランドが一番最初に出てくるw。オチが付けられたLTは初めてだ。比較的好評に受け入れられていたけど、これからだなぁ。いきなり英語で作り始めてるからな…。名前もソープランドだしな…。
さて、イベントの感想レポートをしていきたいと思います。

Trac導入事例(管理ツールとしてTracを使う)(u-zさん)

  • Trac-MS-Project連携すげー。簡単にチケットからガントへ変換がかけられるらしい。
  • Tracのよさは標準で最低限の機能しか提供しないところだと思ってる自分は、標準機能が弱いのが…。と言われたところでなびかない。普段仕事でJazz(RTC)使っている身からすると、あれはあれですっごいいいけれども。
  • 生産物の管理にはhudsonが使えないのだろうか。毎回違うものなんだろうか。たぶんそうなんだろうなぁ。Excelもありだけれど、それで済むのであれば実はWikiでよいのかもしれない。

ある保守部隊での利用事例(kanuさん)

  • 夢はスーパープログラマとおっしゃっていたけれども、あのプレゼンスキルがうらやまし。
  • 考え抜かれたチケット設計。ゴテゴテした項目がないシンプルなツールだからこそ。
  • インシデント管理はそういう種別のチケットを作るって言うのはダメなんだろうか。インシデント、と言うのがどういうものなのか、よく分かっていないけど、調べたら「重大な事故につながるかも知れない出来事」とでてきた。そういうものならば種別を切り替えてガシガシ登録すべきだと思う。別のTracインスタンスを作るという手も考えたけど、一つのDBであるところに価値が出てくるんじゃなかろうか。
  • TimingAndEstimatingPluginはいい仕事してくれますね。
  • Tracがあそこまで使い込まれているという、全体的なコーディネートがうらやましい。

PluginをPostgreSQL対応する(hirobeさん)

  • 実は貧弱なホスティングを使ってTracを公開しているので、SQLiteよりもPostgreSQLMySQLに載せ変えようとしたことがありました。結局載せ変えてないんですが、でも実験に使用したマシンのスペックはそんなに悪くなかったので、実際効果がどれだけでるもんなんでしょう?
  • TracがSQLArchemy(でしたっけ?O/Rマッパー)に載せかえられたらPostgreSQLに載せかえたくなった。

結婚式のタスクをTracで管理してみよう(kaorunさん)

  • Wiiリモコンでプレゼンテーション」なんて記事を技評さまで書かせていただいていたり。結構身の回りでは2年位前からふつうに使ってました。
  • 結婚式とか、イベントにTracを使うアイディアは素晴らしいですね。
  • 自分も結婚式とかで使ってみたい(ぉ)

さらにもう一つのTDDによるTrac Lightning2.1の新機能(okamotokさん)

  • ふんどし・フンドシ・褌(急募・著作権フリーの褌画像ってこれのことですか。)
  • Pear Review プラグインに萌える気持ちはすごい分かる。(使う相手がほしい)
  • Trac Lightningはpost-install.batにほぼ全てが詰め込まれている、と直接ご本人から聞けた!
    • しつこく聞いてすいません。okamotoさんのマシンで開発環境を見せてもらえてうれしかったです。
  • Linux環境で動くTrac Lightiningがんばるかー。
    • XDocViewが動かないらしいですが、インストールされるプラグインや、日本語化とかがある程度できていれば自分は十分。(日本語化もしなくてもいいかもね。)

LT部門

Tracのチケットをチケットにしてみませんか?(自分のターン)

  • プレゼン用意できず。実は午前中に「あ、やべ」と思ってTracにチケットを登録するスクリプトを実装してました。その他ゴタゴタしてて全然準備できず。オブラブの時みたいにJAM Circleでやろうかと思ったけど、失敗してるからやめた。
  • 「JAM Circle」でググってソープランドが出てきたのはもうなんと言えば。とりあえずスクリプトでSOAPは使えなくするかw

初めてのプラグイン開発 - SAPとTracの連携 -

  • 自分の手抜きっぷりがゴメンナサイってなるくらい力の入ったLT。
  • SAPってドイツ語圏から産まれたのは知っていたけど、開発もSAP上でやるとか、ソースコードを落とせないとか、全然知らなかった。
  • これってすごいPythonの勉強になったんだろうな。すごい。自分がアプローチするなら、Trac上のソースコードブラウザで連携する

とびこみ(yusiさん)

  • 子供の予定日にShibuya.tracにいらっさる。驚いた。
  • サーバー環境に恵まれてるなぁ。うらやましい。

sourceforge.jpの中の人(tachさん)

  • いつもお世話になってます。
  • RSSプラグインはShibuya.tracもいいけど、きっとTrac Hacks行きでしょう。
  • ビルドマシン化の件はあきらめました。
  • ごめんなさい。sourceforge.netばっか使ってます。

赤本の中の人(espionさん)

  • ごめんなさい。本買ってません。
  • 日本語化プロジェクトにはぜひ参加したいところ。

UST担当id:k_takaさん、宴会幹事のid:kikuhideさんありがとうございました。会場をお貸しいただいたシェアグリッドさんもありがとうございました!

rst2pdfを使うには

設計書をTracのWikiに書いて、後でPDFで出力できないか?というお話があったので、調べてみた。Tracが標準でサポートしているReStructuredText(以下ReST)をだったらPDFに変換できました。たぶんそれをうまく使えばTrac/Wikiで管理している設計書をPDFにできるんじゃなかろうか、ということでメモ。使ったものはPythonで書かれているrst2pdf。世の中これ以外にもrst2latexしてそっからplatex2dvi->dvi2pdfっていう手順を踏むとか、RubyでかかれたReSTを使うとか、ありましたよ。

TracにあるデータをPDFにするんだったら、XML-RPCを使ってWikiからデータ引っこ抜いて"{{{","}}}"をうまくなんとかやっつければ、そのまま変換できますな。

インストール

注意

easy_installを使ってインストールすることもできるけど、ソースを落としてきてコンパイルとかして、こけるこける><easy_installはまだネイティブコードのない奴に限る気がする。

試した環境

最初Windows XP 64bit Professional/Python 2.5って環境でやってたけど、上記の注意で書いたとおり、コンパイル環境を構築できずに断念した。

手順

1. 依存するライブラリからインストールしていく。

rst2pdfが依存するライブラリはPython Imaging Library (PIL)UniConvertorReportLabの3つ。この順にインストールするが、Ubuntuの場合すべてaptitudeでインストール可。PILはPython2.5に同梱されていますのでインストールする必要ないかも。

sudo aptitude install python-imaging
sudo aptitude install python-uniconvertor
sudo aptitude install python-reportlab

2. ".uniconvertor"ディレクトリをホームディレクトリに作る

なんかよくわかんないけど、コマンド叩くと怒られるので、作りました。

mkdir .uniconvertor

3. フォントの設定を書く

日本語のReSTファイルを変換すると文字化けして見えるのは、埋め込まれるフォントが対応していないから。ということでフォントの設定を書きます。フォントの設定等、デフォルトのスタイルは"rst2pdf --print-stylesheet"を叩くとstdoutに出力されるのでそこからファイルに落とします。

rst2pdf --print-stylesheet > rst2pdf_default.style

次に出力されたrst2pdf_default.styleの

    ["normal" , {
      "parent": "base"
    }],

    ["normal" , {
      "fontName": "IPAMonaPGothic"
    }],

と言うように、今使ってる標準truetypeフォントに切り替えました。標準で使っているフォント名が分かんない場合は

fc-match

ってやると出力されているフォントだとおもわれ。

4. いよいよ変換してみる。
標準でないフォントの場合、フォントの配置場所を指定する必要があります。指定しない場合は検索するためめっさ時間がかかるので、探しておいた方が幸せでしょう。今回の場合は下記のようにしたらうまく出力されました。

rst2pdf [RSTファイル名] -s rst2pdf_default.style -o [出力PDFファイル名] --font-path /usr/share/fonts/truetype/ipamona

なおrst2pdfはフィルタとしても使えるので結構ReSTで書かれている文章があれば使えるツールではないでしょうか?サンプルではこんな例が紹介されてました。

curl http://docutils.sourceforge.net/docs/user/rst/quickstart.txt | rst2pdf > quickstart.pdf

rst2pdfのマニュアル
ReSTテキスト PDFばーじょん