2009/11/17

OMakeでSphinxを自動継続ビルドしてみよう

題名通りです。Sphinxっていうドキュメント作成ツールがあって、これがなかなか簡単に作れる、かつ様々なフォーマットの書き出しに対応してるのですごく使いやすい。

Sphinxについて詳しく知りたい方は以下のURLを参照すればいいような気がします。

Pythonって何?という人のためのSphinxインストール入門

しかしSphinxには自動でプロジェクトのMakefileが生成されるので簡単にビルドできるようになっているんですけど、それでもhtmlファイルをrstファイルが変更される度に自動ビルドしてくれたらもっと便利になるのにとか思うのが人の常。

というわけで、前回の記事と絡めて、OMakeでSphinxを自動継続ビルドしてみようというのが今回の記事の目的です。

まずはOMakeのインストールから

まず、OMakeっていうのはGNU/BSDのmakeもどきみたいなソフトです。でも「もどき」っていうのは失礼で、従来のmakeとは比べ物にならないほど多くの機能を備えているソフトです。今回使う自動継続ビルドもOMakeの機能の一つです。

OMakeは標準では入っていないため、面倒くさいかもしれませんがOMakeをインストールする必要があります。とはいっても大抵のリポジトリに入っているので、

sudo apt-get install omake

の一行で完了します。Macは持っていないので分からないですが、恐らくportで十分いけるような気がします。

SphinxをOMakeに対応させる

次にSphinxのプロジェクトをOMakeに対応させます。まずプロジェクトの構成は以下のようなものとします。
  • Sphinxのビルドコマンドは"sphinx-build"
  • ビルドディレクトリは"_build"
  • A4用紙を使用する
  • ソースファイルはプロジェクトのルートディレクトリ
別にこれと全く同じじゃなくても勝手に変えればいい話なんですが…

それではOMakeのファイルをインストールしてみます。プロジェクトのルートディレクトリに移動してから、

omake --install

でインストール完了です。OMakerootとOMakefileという2つのファイルができたはずです。

ここでのOMakerootは別にいじらなくていいので無視します。それではOMakefileを改造してみます。

まず開くと変なコードが羅列してありますが、すべて削除。Makefileを開くと
# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
とかいうhtmlを生成するコマンドがずらっと並んでいるので、その流儀に従ってOMakefileに以下を記述。
# OMakefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_a4) $(SPHINXOPTS) .

SRCS = $(glob *.rst)

.DEFAULT: $(SRCS)
    $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html

ここで.DEFAULTの依存先にglob関数を用いてすべてのカレントディレクトリ以下のrstファイルを指定してるのがミソ。これで.DEFAULTターゲットの依存先はすべてのrstファイルになったので、このうちのどれかが変更されたら自動的にビルドが開始されるみたいな。

途中の変数を変更したのは、OMakeではその書き方が禁止されているためです。まーそりゃあそうかもしれません(makeの流儀なのかもしれないけど、自分は最初見たときキモいなーって思った)。

これだけでもうすべての手順は終わり。あとはルートディレクトリから継続監視ビルドの-Pオプションをつけて、

omake -P --verbose

を実行すればomakeが立ち上がり

$ omake -P --verbose
*** omake: reading OMakefiles
*** omake: finished reading OMakefiles (0.01 sec)
- build . <.DEFAULT>
+ sphinx-build -b html -d _build/doctrees -D latex_paper_size=a4 . _build/html
Running Sphinx v0.6.3
loading translations [ja]... done
loading pickled environment... done
building [html]: targets for 0 source files that are out of date
updating environment: 0 added, 0 changed, 0 removed
looking for now-outdated files... none found
no targets are out of date.
- exit . <.DEFAULT>, 0.56 sec, code 0
*** omake: done (0.57 sec, 0/0 scans, 1/1 rules, 0/74 digests)
*** omake: polling for filesystem changes

と監視してくれるのが分かります。あとはてきとーにrstファイルを変更すれば、自動的にOMakeが変更されたことを感知して勝手にビルドしてくれます。いちいち変更する度にmake htmlなどと打たなくてとっても便利。まさに悦楽の境地。

というように、OMakeはこっちが楽できるような仕掛けを大量に用意してくれています。なにかと便利なので覚えると楽かもしれないです。

ついでに

今思うと「継続監視」っていう機能は別にビルド用途だけじゃなく、他のことにも使えるかもしれないです。例えばhtmlファイルを変更したり追加したら差分だけ勝手にアップロードしてくれるとか、グループ作業で他の人の沢山の画像ファイルを別フォルダで縮小しなきゃなんない(しかもそれが頻繁に変更される)場合とか。

グループ作業にありがちな「どれが変更されてどれが変更されてないのかごっちゃになってわかんねーよ!誰かリスト作ってくれリスト」みたいなのにも威力を発揮しそうな気がします(ていうか今がまさにそんな感じ)。

2009/11/14

OMakeのマニュアルを日本語訳してみた


はじめに

OMakeは従来のGNU/BSDのmakeに取って代わる、新しいビルドシステムです。自動的に依存関係を解析してビルドしてくれたり、変更点を監視して自動的にビルドを実行できたりするなど、一回知ったら従来のmakeを使いたくなくなるくらい強力なシステムを持っています(すんごいコード量が少なくなる)。
OMakeについての大雑把な説明は以下の記事を読むとわかりやすいと思います。
少なくとも、卒論とか研究とかでOCaml/C/C++/LaTeXを積極的にビルドする人にとっては、大分恩恵を受けるんじゃないでしょうか。

ですが、さあOMakeを使用してプロジェクトを作ろうとすると、どうしても日本語の文献というものがほとんどない。GNU/BSDのmakeは結構あるんですけど。
「いや、オフィシャルに詳しい英語の説明が載ってるじゃん」って人もいるとは思います。そりゃあそうなんですけど、英語できるだけ読みたくないって人も(自分含めて)少なからずいるわけで、日本語の文献を充実させることは、少なくともマイナスにはならないはずです。

といったポリシーの元に、OMakeのマニュアルを日本語訳してみました。現在15章あるうちの8章まで翻訳してありますが、残りは殆どリファレンス的な存在なのでとりあえず以下のURLに公開してみます。

『OMake マニュアル 日本語訳』
http://omake-japanese.sourceforge.jp/

もちろん、残りの章も翻訳する予定です。たぶん翻訳の不備とかいろいろあると思うので、なにかありましたらメールなどで連絡おねがいします。

とりあえず翻訳してみて、OMakeはユーザーが望んでいる機能は大抵実現されているというか、これは現場で大分助かるんじゃないかなとか、そういう痒いところに手が届く孫の手みたいな言語なので、みんなとりあえず使ってみるといいとおもいます。べんりべんり。

あ、最近Goっていう新しい言語が注目されていますが、これを使えばGoでも継続監視ビルドを行えますし、誰かGo用のOMakefileを書くかもしれませんね。

各章の印象

ざっと翻訳した感じですと、2章、3章はOMakeについてのガイダンスになっています。4から8章はOMakeの言語や仕様についてより詳しく書いてあります。9章以降は各関数や変数についてのリファレンスです。
とりあえずどんな感じなのか使ってみたいという方は2章、やる気があれば3章を読めばいいような気がします。OMakeについてより詳しく調べたい方は4章以降、といった感じでしょうか。

ソースファイル

ソースというほどではないのですが、翻訳に用いたSphinx(参考: 1日〜1週間でOSSに貢献する方法)用のドキュメントソースをSourceForge.JPのgitリポジトリにアップロードしました。

git clone git://git.sourceforge.jp/gitroot/omake-japanese/omake_trans.git

で参照できます。LaTeX用のドキュメントが欲しい方などはここから各自ビルドしてください。

心がけたこと

  • 逐語訳を避けて、できるだけわかりやすい表現に置き換えました。
  • かといって文が持つ本来の意味をなるべく崩さないようにも注意しました。
  • 用語の表現を統一しました。
  • あっちのマニュアルでは索引がなかったので、ついでに索引をつけました。
そんくらいでしょうか。とにかく今日は疲れました。なんせ量が半端無く多いー!!

2009/10/12

忘備録:cvCalibrateCamera2()について

これは完全に個人用のメモです。

OpenCVを使っていたときに次の記事を発見。

因果応報 | cvCalibrateCamera2関数

で、そこに世界座標系におけるカメラの位置と姿勢が数式で書いてあったんだけど、まだ3Dを始めたばっかりの自分は((なんで?))ってなった。で、考えて見た結果以下のような理由だという結論に至った。

まず、世界座標系 X = (X, Y, Z)T からカメラ座標系 x = (x, y, z)T に変換するためには4x4のカメラ行列を利用して以下の式で表現することができる:

ここで、Rは3x3の回転行列、tは3次元のベクトルとする。OpenCVのcvCalibrateCamera2()が返すRとtはこれ。

それじゃあカメラ座標系から世界座標系に変換するにはどうすればいいのよっていうと、逆行列を用いて以下のように表現できる:

つまり世界座標系におけるカメラの位置と姿勢を求めるためには、この逆行列を利用しなければならない、と。たぶんこんな感じかな…

2009/10/07

(追記)郵便局で作る日本全国の光の地図

これは前回の記事
『住所一覧からマックと吉野家の光の地図を作ってみた』
の続きです。今回はデータとして、郵便局の住所一覧を用いました。
また、データは『全国郵便局名一覧』からダウンロードしました。ありがとうございます。


















当たり前ですけど、郵便局はやっぱり多いですね。解析にまる3,4日くらいかかったような気がします。
しかも日本全国に散らばっているあたり、郵政事業がいかに重要なのか思い知らされます。

2009/10/04

住所一覧からマックと吉野家の光の地図を作ってみた

おひさしぶりです。

お久しぶりです。どうやら巷ではアクセスアップのコツとして「内容よりも一日の更新頻度を上げたほうが人気が出る」らしいですが、ここはそんなこと全く気にせずにのんびりと更新していきます。(かと言って質が高いかと言えば疑問ですが…)

さて、更新してみようと思い立ったきっかけはこんな記事からでした。
「マックまでの近さ」が光で表された米国地図 | WIRED JAPAN
この地図を作成したのは、Steven Von Worley氏。ロサンゼルス盆地の、本当に何もないようなところで目にしたマクドナルドに刺激されてこの地図の作成を思い立ったという。
で、ブックマークのコメントを見たらこんなものが。
はてなブックマーク - 「マックまでの近さ」が光で表された米国地図 | WIRED VISION
Layzie food, ネタ 東と西でクッキリ分れてるねえ。誰か、日本で「吉野家」バージョンで作らないだろうか。
やってみようじゃないの。

というわけでちょっとした思いつきで吉野家地図の日本版を作ってみました。ちなみに本家ではきちんと距離を計算してそこからの最短距離で色を作っているらしいですが、そんなことしても面倒くさい割にそんな役に立たないので単純な加算処理にしてあります。

工程は後述するとして、画像は以下。

これが吉野家の光…

東京や大阪、京都の大都市は吉野家が密集していることが伺えます。また各種国道や高速自動車道をなぞるように点在しているようですね(*1)。しかし海岸沿いなどにはほとんどなく、東北地方、特に札幌を除く北海道は悲惨です。これが地方格差ってやつか。

ついでにマクドナルドの地図も作って見ました。結果の画像は以下。

やっぱり吉野家と比べると明るいですね。でも吉野家の光の密度が多くなったような感じで、全体的な傾向としてはあまり変わらないような気がします。
ちなみに2つとも画像映えを良くするために少しのグロー効果も入れてあります。

メイキング

作った流れとしては以下のような感じです。
  1. まずマックのすべての店舗の住所一覧を取得する。
  2. 住所から経度と緯度のペアに変換する。
  3. Proce55ingにデータを読み込ませ、パーティクルとして処理する。
店舗一覧はマックの場合は47都道府県すべてを検索し、電話番号などの不要なデータを消去し住所だけを抜き出すpythonスクリプトを組んで対応。吉野家は件数が少ないのでコピペと手動で対応しました。

住所から経度、緯度のペアに変換する手順では、今回はGoogleのウェブAPIサービスを利用しました。住所のデータを投げればXML形式で返ってくるので、ペアから経度と緯度部分だけを抜きだし、csv形式で保存するスクリプトを組みました(*2)。

最後にProce55ingを用いてデータを読み込ませ、経度、緯度を単なるXY座標のデータとして処理させました。ただし、座標軸の違いによりこのままでは日本が上下反対になってしまうので、単純に-1をかけて反転させてあります。
あとは見やすいように座標変換を行って、完成です。

ソースコード

今回のスクリプトをcodereposのリポジトリ上にアップしました。
svn checkout http://svn.coderepos.org/share/lang/java/misc/light
でチェックアウトしてください。

外部ライブラリに依存していないので単純にproce55ingを使えば動くと思います。ついでにpythonスクリプトも同様にアップしてみました(trans.py)。参考までに。
ちなみに使い方ですが、座標が書いてあるCSVファイルを指定した後はProce55ing側が勝手に読み取ってプロットしてくれます。

ドラッグで見たい場所を移動できます(Google Mapsと同じ)。
'f'キーでズームイン、'g'キーでズームアウトを行います。マウスポインタを中心としてズームを行います。
'j'キーでパーティクルサイズを大きく、'h'キーでパーティクルサイズを小さくします。
's'キーでフレームを保存します。

(ズームして分かる、東京都のマックの様子)

'b'キーで日本地図(Thanks http://www.freemap.jp/)をバックに表示します。

まぁ、おまけ機能です。なんで位置合わせしないかというと、そこまでするときちんと経度、緯度を座標変換しなきゃなんなくて面倒だからです。

終わりに

作業時間としては大体3日間くらいかかりました。そんなに難しくありませんが、いろんな知識が複合的に絡んでいたのでそれなりに面白かったです。
ちなみに、郵便局バージョンでも作れないかと今住所一覧を経度、緯度に変換しているんですがこれ3万件くらいあってすごい時間かかるんですよね…現在2日間くらい回してるんですがまだ1万件しか処理できていません。できたらちゃんと報告します。

*1 個人的に、国道にはよく吉野家が点在しているイメージがあります。
*2 もちろんこのままではサーバに過負荷(単なるDoS攻撃になってしまう)がかかってしまうので5秒のスリープを入れてあります。

追記
typo ×吉野屋 ○吉野家