(18日目) blockdiag を Trac wiki で使ってみよう

Sphinx & blockdiag アドベントカレンダーに戻って 18日目です。
もう少しでクリスマスですね。この荒行のような毎日が終わると思うと心も弾みます。

今日は blockdiag を Trac 上の Wiki で動かしてみます。
TracPython で記述されたプロジェクト管理ツールで、
イシュートラッカーや Wiki などのメインの機能に加えて、
豊富なプラグインが提供されているので多くの人に利用されているツールです。

Trac プラグインのひとつとして、Wiki に blockdiag の図を埋め込む TracBlockDiagPlugin があります。
TrackBlockDiagPlugin は @wonderful_panda さんによって開発されたプラグインです。
今日はこのプラグインを利用して blockdiag を使ってみようと思います。

インストール

TracDebian パッケージになっていますが、最新版の 0.12 が強くおすすめとのことなので、
easy_install でインストールすることにします。
TracBlockDiagPlugin も URL を指定することで easy_install 経由でインストールできます。

$ sudo easy_install trac
$ sudo easy_install http://trac-hacks.org/svn/tracblockdiagplugin/0.12

Trac はインストールした後、trac-admin コマンドをつかってプロジェクト関係のファイルを生成する必要があります。
この部分はちょっと Sphinx に似ているかもしれません。
ここでは /var/lib/trac 以下にプロジェクト関係のファイルを設置しています。

途中で尋ねられる質問はふたつで、プロジェクト名称とデータベース設定です。
プロジェクト名称はちゃんと設定しておきましょう。

$ hash -r
$ sudo mkdir -p /var/lib/trac/
$ cd /var/lib/trac/
$ sudo trac-admin test-proj initenv
Creating a new Trac environment at /var/lib/trac/test-proj

Trac will first ask a few questions about your environment
in order to initialize and prepare the project database.

 Please enter the name of your project.
 This name will be used in page titles and descriptions.

Project Name [My Project]>

 Please specify the connection string for the database to use.
 By default, a local SQLite database is created in the environment
 directory. It is also possible to use an already existing
 PostgreSQL database (check the Trac documentation for the exact
 connection string syntax).

Database connection string [sqlite:db/trac.db]>
ask a few questions about your environment

Creating and Initializing Project
 Installing default wiki pages
  TracBackup imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracBackup
  TitleIndex imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TitleIndex
  WikiRestructuredText imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiRestructuredText
  WikiPageNames imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiPageNames
  TracPlugins imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracPlugins
  TracRepositoryAdmin imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracRepositoryAdmin
  TracEnvironment imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracEnvironment
  WikiRestructuredTextLinks imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiRestructuredTextLinks
  TracReports imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracReports
  TracPermissions imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracPermissions
  InterMapTxt imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/InterMapTxt
  TracGuide imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracGuide
  TracModWSGI imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracModWSGI
  TracUpgrade imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracUpgrade
  TracBrowser imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracBrowser
  TracQuery imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracQuery
  WikiStart imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiStart
  TracWiki imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracWiki
  TracNotification imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracNotification
  TracTickets imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracTickets
  TracIni imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracIni
  TracAdmin imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracAdmin
  TracTicketsCustomFields imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracTicketsCustomFields
  TracChangeset imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracChangeset
  TracRoadmap imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracRoadmap
  TracUnicode imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracUnicode
  TracLogging imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracLogging
  SandBox imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/SandBox
  TracNavigation imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracNavigation
  TracAccessibility imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracAccessibility
  InterWiki imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/InterWiki
  TracFineGrainedPermissions imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracFineGrainedPermissions
  InterTrac imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/InterTrac
  WikiNewPage imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiNewPage
  WikiFormatting imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiFormatting
  TracSearch imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracSearch
  TracSupport imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracSupport
  WikiProcessors imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiProcessors
  WikiMacros imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiMacros
  TracTimeline imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracTimeline
  TracRss imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracRss
  TracInterfaceCustomization imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracInterfaceCustomization
  TracInstall imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracInstall
  TracFastCgi imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracFastCgi
  TracStandalone imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracStandalone
  TracLinks imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracLinks
  RecentChanges imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/RecentChanges
  PageTemplates imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/PageTemplates
  TracSyntaxColoring imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracSyntaxColoring
  TracWorkflow imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracWorkflow
  TracImport imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracImport
  TracCgi imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracCgi
  TracModPython imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracModPython
  WikiHtml imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiHtml
  WikiDeletePage imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/WikiDeletePage
  CamelCase imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/CamelCase
  TracRevisionLog imported from /usr/local/lib/python2.6/dist-packages/Trac-0.12.2-py2.6.egg/trac/wiki/default-pages/TracRevisionLog

---------------------------------------------------------------------
Project environment for 'My Project' created.

You may now configure the environment by editing the file:

  /var/lib/trac/test-proj/conf/trac.ini

If you'd like to take this new project environment for a test drive,
try running the Trac standalone web server `tracd`:

  tracd --port 8000 /var/lib/trac/test-proj

Then point your browser to http://localhost:8000/test-proj.
There you can also browse the documentation for your installed
version of Trac, including information on further setup (such as
deploying Trac to a real web server).

The latest documentation can also always be found on the project
website:

  http://trac.edgewall.org/

Congratulations!

次に TracBlockDiagPlugin の設定を行います。
プロジェクトのディレクトリ配下の conf/trac.ini を以下のように編集します。

$ sudo vi /var/lib/trac/test-proj/conf/trac.ini
[components]
blockdiagplugin.* = enabled

[blockdiag]
font = /usr/share/fonts/truetype/ipafont/ipagp.ttf
>||

プロジェクトを作成した後、Web 公開を行うための設定をします。
trac-admin コマンドの deploy オプションで公開用ファイル群を生成します。
>|sh|
$ sudo trac-admin /var/lib/trac/test-proj/ deploy /var/www/trac/test-proj
$ sudo chown -R www-data /var/lib/trac
$ sudo chown -R www-data /var/www/trac

次に認証用のアカウント定義ファイルを作成します。
htpasswd 形式ですので他のツールで生成してもよいでしょう。

$ sudo htpasswd -c /var/lib/trac/test-proj/trac.htpasswd tk0miya
$ sudochown -R www-data /var/lib/trac/test-proj/trac.htpasswd

Trac の動かし方には CGI, FastCGI, デーモン起動などいくつかやり方があるようですが、
今回はデーモンとして起動して、Apache をリバースプロキシとして利用する設定にします。

まずは Trac デーモンを自動起動させるために init スクリプトを設置します。
以下のスクリプトを /etc/init.d/tracd-test-proj として保存します。
ポート番号やディレクトリなどは必要に応じて適宜設定を書き換えてご利用ください。

#!/bin/sh

set -e

TRACD=/usr/local/bin/tracd
USER=www-data
PORT=8082
OPTION='/var/lib/trac/test-proj'
PIDFILE='/var/lib/trac/test-proj/tracd.pid'
AUTH=`basename $OPTION`',/var/lib/trac/test-proj/trac.htpasswd,realm'

case "$1" in
'restart')
        $0 stop
        sleep 1
        $0 start
        ;;

'start')
        /bin/su - $USER -c "$TRACD --daemonize --port $PORT --pidfile $PIDFILE \
                                   --basic-auth $AUTH $OPTION"

'stop')
        if [ -e $PIDFILE ]; then
                /bin/su - $USER -c "/bin/kill `cat $PIDFILE`"
                rm $PIDFILE
        fi
        ;;

*)
        echo "Usage: $0 { start | stop | restart }"
        exit 1
        ;;
esac

生成した init スクリプトに実行権限を与えて、起動設定をします。

$ sudo chmod +x /etc/init.d/tracd-test-proj
$ sudo update-rc.d tracd-test-proj defaults 80
$ sudo /etc/init.d/tracd-test-proj start

次に Apache の設定をします。
mod_proxy を有効にし、trac 用のプロキシ設定を追加します。
これも VirtualHost やパスなどは必要に応じて適宜書き換えてください。

$ sudo a2enmod proxy proxy_http
$ sudo sudo vi /etc/apache2/conf.d/trac
ProxyRequests Off # Disable forward proxy
ProxyPass /test-proj http://localhost:8082/test-proj
ProxyPassReverse /test-proj http://localhost:8082/test-proj
$ sudo /etc/init.d/apache restart

使ってみる

Trac の画面から Wiki の編集を選択します。
サンプルとして以下のテキストを入力してみます。

{{{#blockdiag(type=png)
{
  A -> B -> C, D;
}
}}}
{{{#!seqdiag(type=png)
{
  A -> B -> C -> B;
}
}}}

保存すると次のように Trac の Wiki ページ内に blockdiag や seqdiag の図を埋め込むことができます。

すこし前後に {{{ や }}} などの記号が必要ですが、それ以外は普段の blockdiag の書き方と一緒です。

blockdiag を使うことで、Trac の Wiki にも図を簡単に埋めこむことができるようになりました。
これで少しドキュメンテーションが楽になるのではないでしょうか。