blockdiag 1.1.3以降ビルド時のエラーの原因。

結構ハマったので、後々のためにメモっておきました。

フォントの検出部分でのエラー。

blockdiagシリーズがmain入りしました。” で書いたとおり、blockdiag 1.1.3以降、SidでのDebianパッケージ作成時に下記のエラーが出ていました。エラーが出るようになったのは、以前はdebuild時にnosetestsを実行していなかったのを、実行するように変更したのがきっかけですが、そのままにはできないので原因を調べてみました。

======================================================================
FAIL: test_auto_font_detection (blockdiag.tests.test_boot_params.TestBootParams)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/debpkg/blockdiag/blockdiag-1.1.4/src/blockdiag/tests/utils.py", line 14, in wrap
    func(*args, **kwargs)
  File "/home/user/debpkg/blockdiag/blockdiag-1.1.4/src/blockdiag/tests/test_boot_params.py", line 158, in test_auto_font_detection
    self.assertTrue(fontpath)
AssertionError: None is not True
    'None is not True' = self._formatMessage('None is not True', "%s is not True" % safe_repr(None))
>>  raise self.failureException('None is not True')


----------------------------------------------------------------------
Ran 295 tests in 3.400s

FAILED (failures=1)
make[1]: *** [override_dh_auto_test] エラー 1

この原因は、src/blockdiag/utils/bootstrap.pyの下記の部分でした。

def detectfont(options):
    fonts = ['c:/windows/fonts/VL-Gothic-Regular.ttf',  # for Windows
             'c:/windows/fonts/msgothic.ttf',  # for Windows
             'c:/windows/fonts/msgoth04.ttc',  # for Windows
             '/usr/share/fonts/truetype/ipafont/ipagp.ttf',  # for Debian
             '/usr/local/share/font-ipa/ipagp.otf',  # for FreeBSD
             '/Library/Fonts/Hiragino Sans GB W3.otf',  # for MacOS
             '/System/Library/Fonts/AppleGothic.ttf']  # for MacOS

テストでipafontのチェックが行われるようになったのですが、このパスのipagp.ttfはttf-ipafont-gothicパッケージに含まれています。Sidではfonts-ipafont-gothicに変わっており、パスも下記のように変わっています。

$ apt-file search ipagp.ttf
fonts-ipafont-gothic: /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf

おまけに、私の環境ではそもそもIPAフォントをインストールしていなかったので、エラーになっていたワケです。インストールするフォントは人によって異なるので、インストールしてある何らかのTrueTypeフォントが検出されればOKになるようにパッチを作成しました。

$ quilt diff
Index: blockdiag-1.1.4/src/blockdiag/utils/bootstrap.py
===================================================================
--- blockdiag-1.1.4.orig/src/blockdiag/utils/bootstrap.py       2012-02-13 18:59:29.0000000
+++ blockdiag-1.1.4/src/blockdiag/utils/bootstrap.py    2012-04-14 13:17:48.066795947 +0900
@@ -181,13 +181,21 @@


 def detectfont(options):
-    fonts = ['c:/windows/fonts/VL-Gothic-Regular.ttf',  # for Windows
-             'c:/windows/fonts/msgothic.ttf',  # for Windows
-             'c:/windows/fonts/msgoth04.ttc',  # for Windows
-             '/usr/share/fonts/truetype/ipafont/ipagp.ttf',  # for Debian
-             '/usr/local/share/font-ipa/ipagp.otf',  # for FreeBSD
-             '/Library/Fonts/Hiragino Sans GB W3.otf',  # for MacOS
-             '/System/Library/Fonts/AppleGothic.ttf']  # for MacOS
+    fonts = [
+             # for Windows
+             'c:/windows/fonts/VL-Gothic-Regular.ttf',
+             'c:/windows/fonts/msgothic.ttf',
+             'c:/windows/fonts/msgoth04.ttc',
+             # for FreeBSD
+             '/usr/local/share/font-ipa/ipagp.otf',
+             # for MacOS
+             '/Library/Fonts/Hiragino Sans GB W3.otf',
+             '/System/Library/Fonts/AppleGothic.ttf']
+
+    # fot Debian
+    import glob
+    for f in glob.glob('/usr/share/fonts/truetype/*/*.ttf'):
+        fonts.append(f)

     fontpath = None
     if options.font:

コメントの位置を変更したのは、pep8のポリシーでは元の位置のままだとエラーになるためです。ttf-ipafont-gothicパッケージをインストールして、リストのttf-ipafont-gothicのパスになるように変更した場合に発生しました。”for Debian”のコメント部分を含めると一行が長すぎるため、下記のようなエラーが発生します。

======================================================================
FAIL: blockdiag.tests.test_pep8.test_pep8
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/home/user/debpkg/blockdiag/blockdiag-1.1.4/src/blockdiag/tests/test_pep8.py", line 38, in test_pep8
    assert errors + warnings == 0, message
AssertionError: pep8: 1 errors / 0 warnings
    0 = <module 'pep8' from '/usr/lib/pymodules/python2.7/pep8.pyc'>.get_count('W')
    'pep8: 1 errors / 0 warnings' = 'pep8: %d errors / %d warnings' % (1, 0)
    print 'pep8: 1 errors / 0 warnings'
>>  assert 1 + 0 == 0, 'pep8: 1 errors / 0 warnings'

-------------------- >> begin captured stdout << ---------------------
/home/user/debpkg/blockdiag/blockdiag-1.1.4/src/blockdiag/utils/bootstrap.py:187:80: E501 line too long (80 characters)
             '/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf',  # for Debian
                                                                            ^
1       E501 line too long (80 characters)
pep8: 1 errors / 0 warnings

--------------------- >> end captured stdout << ----------------------

----------------------------------------------------------------------
Ran 295 tests in 3.676s

FAILED (failures=1)
make[1]: *** [override_dh_auto_test] エラー 1
make[1]: ディレクトリ `/home/user/debpkg/blockdiag/blockdiag-1.1.4' から出ます
make: *** [build] エラー 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2
debuild: fatal error at line 1350:
dpkg-buildpackage -rfakeroot -D -us -uc failed

ちなみに、下記の位置にコメントを書くとE261エラーになります。

fonts = [# for Windows
         'c:/windows/fonts/VL-Gothic-Regular.ttf',

override_dh_auto_testでハマった箇所。

前述したとおり1.1.2-1まではoverride_dh_auto_testを行っていませんでした。1.1.2の時点で既にupstreamにはテストが含まれていましたが、debianパッケージ作成時にはnosetestsを実行できていませんでした。src/blockdiag/testsディレクトリ以下のテストを実行するには、blockdiagのモジュールをちゃんとimportしないとpbuilderなどのようなクリーン環境ではコケます。そこでdebian/rulesに下記のようの追記を行いビルド時にテストを行うようにしました。

override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
        set -e; \
        PYTHONPATH=$(CURDIR)/src nosetests -d
endif

PYTHONPATHに$(CURDIR)/srcを指定するというのが分かるまで、_build/lib.linux-x86_64-2.7や、debian/python-blockdiag/usr/share/pysharedを指定してみて上手くいかず、プギャーと言ってました…。orz

なお、debian/controlのBuild-Dependsに何らかのフォントパッケージを指定しておかないと、pbuilder環境ではフォントが全くインストールされません。なので、前述のようにglobパターンでTrueTypeフォントを検出するようにしてもテストがこけてしまう問題が結局あります。IPAフォントよりも標準的にインストールされるVL Gothic(fonts-vlgothic)を指定したのですが、それなら前述のパッチもVL Gothicのパスをハードコーディングしておけば良いのではないかと、迷いますね…。

λ式でdictionaryを返す。

Pythonのλ式って、こういう書き方もできるんですね。便利。

>>> hoge = lambda act: {"records": 1 } if act else {"name": "moge", "records": 2}
>>> hoge(1)
{'records': 1}
>>> hoge(0)
{'records': 2, 'name': 'moge'}
>>> hoge(True)
{'records': 1}
>>> hoge(False)
{'records': 2, 'name': 'moge'}
>>> import json
>>> json.JSONEncoder().encode(hoge(False))
'{"records": 2, "name": "moge"}'

圧縮されたテキストファイルを編集する。

先ほど気がついたのですが、vimやemacsだと圧縮されたテキストファイルを直接編集できるのですね。ちょっと調べてみました。

tool(ver) / compress

gzip

bzip2

xz

cat (8.13)

NG

NG

NG

more (2.20.1)

NG

NG

NG

less (444)

NG

NG

NG

lv (4.51.a)

OK

OK

NG

vim.tiny (7.3.429)

NG

NG

NG

vim.basic (7.3.429)

OK

OK

OK

emacs 23.3.1

OK

OK

OK

vimでもemacsでも行けるようです。lvはそのうちxzも対応するんでしょうか。ところで、catはさておき、lvがあるのにmoreやlessなんて、もはや普段は使いませんよねえ。

tinkererの下書きをGitで管理する。

まずは、tinkererで下書きを使う場合の手順のおさらいです。下書き用のreSTファイルを生成するには-dオプションを使います。

$ tinker -d hoge
New draft created as '/home/user/myblog/drafts/host.rst'

生成されたreSTファイルを編集します。完成したら日付のディレクトリを作り、そこに下書きのreSTファイルを移動させます。master.rstにエントリを登録してビルドしたら終わりです。

$ mkdir -p 2012/04/10
$ mv draft/host.rst 2012/04/10/
$ vi master.rst
$ tinker -b -q

簡単ですね。

reSTをGitで管理する。

tinkererをGitで管理する場合、pagesディレクトリ、ブログ用のYYYY/MM/DDディレクトリ以下の各reSTファイル、toctree用のmaster.rst、設定ファイルのconf.py、_staticディレクトリの下のファイルを対象にします 1 。コミットしたらどこかのリモートリポジトリに置いておけば、どこからでもブログを書けるようになります。

ところで、作成途中の下書きは別で管理したいですよね。公開済みのブログの原稿のreSTファイルは、ブログで公開しているのですから、別に公開したところで何も変わりませんが、下書きは公開したくない情報を入れているかもしれません。文章も公開用に推敲されていないかもしれません。下書きだけに。

そこで、下書き用のdraftsブランチを作成します。対象はdraftsディレクトリ以下の下書き用のreSTファイルだけで大丈夫です 2 。下書きが完成するまで、適当にコミットし、完成したら、先ほどの手順でYYYY/MM/DD形式の日付のディレクトリを作成し、reSTファイルを移動しコミットします。

$ git branch
* drafts
  master
$ git add drafts/hoge.rst
$ git commit -sm "Add draft of hoge"
$ git add drafts/hoge.rst
$ git commit -sm "Update draft of hoge"
$ git add drafts/hoge.rst
$ git commit -sm "Finish draft of hoge"
$ mkdir 2012/04/10
$ git mv drafts/hoge.rst 2012/04/10/hoge.rst
$ git commit -sm "Add entry hoge"

これをmasterブランチに取り込みたいのですが、masterブランチにmergeしてしまうと、他のdraftsディレクトリで管理されている下書きも追加されてしまいます。困りました。そこでcherry-pickですよ。cherry-pickを使えば、先ほどのコミットだけを取り込むことができます。

$ git checkout master
$ git log drafts
$ git cherry-pick 6890c74 270c118 4f2a0df 2acd8a3
[master 1c28f33] Add draft of hoge
 0 files changed
 create mode 100644 drafts/hoge.rst
[master 503e07a] Update draft of hoge
 1 file changed, 428 insertions(+)
[master 84be7d7] Finish draft of hoge
 1 file changed, 428 insertions(+)
[master 265ec60] Add entry hoge
 1 file changed, 0 insertions(+), 0 deletions(-)
rename drafts/hoge.rst => 2012/04/10/hoge.rst (100%)

コミットを取り込んだら、master.rstを編集し、先ほどのエントリを追加して、git commit –amendすれば、取り込んだ下書きと同じコミットとして管理することができます。あるいは、git cherry-pickで–no-commitオプションをつければ、indexに登録するだけなので、そっちの方が良いかもしれません。

1

_staticディレクトリに何もファイルが無ければ、.gitkeepを作って管理しておくと、ビルド時に余計なエラーが発生しません。

2

draftsディレクトリ以下のreSTファイルはビルドの対象にはならないので、下書き用のreSTファイルだけを管理すれば良いわけです。

おまめちゃん、初物づくし。

今日はおまめちゃんの初物づくしの一日でした。

まず、大國魂神社が自宅から程近いところにあり、産後1ヶ月も経過したこともあったので親子三人でお参りに行ってきました。桜がとても綺麗でした。ちゃんとベビードレス&着物来て、というのはお食い初めのころに実家の近くの神社で行う予定なので、お宮参りというよりは普通にお参りしてきただけの感じですね。

大國魂神社の桜。

ちなみにおまめちゃんは自宅ではよくグズりおしっこでもうんちでも、おっぱいでもなく、抱っこしても泣き止まないということもままあるのですが、外出すると大人しくしています。というか大抵寝ています。自宅でも寝ていてくれると助かるのですが、泣くことが彼女の仕事であり、コミュニケーションの手段なので、こればかりはワシたち夫婦が勉強するしかありませんね。

2つめはお宮参りの帰り道のお花見。ヨメさんが弁当を作ってくれていたので家の近所の公園に寄ってお花見、しようとしたのですが思いの外肌寒く、公園のベンチではおくるみを二重にしていたといえ、おまめちゃんが寒そうで可哀想なのと、お花見したいというのは親のエゴでしか無いよね、ということで車の中で弁当を食べることにしました。来年はおまめちゃん連れて家族皆でお花見したいですね。

そして3つめは、お風呂デビュー。昨日まではヨメさんが沐浴していたのですが、本日初めて一緒にお風呂に入りました。一度沐浴させていたので、お風呂入れるのはさほど苦労はしませんでしたが、シャワーヘッドからのお湯の出し方やシャワーや湯船のお湯の温度など、結構微妙な違いで嫌がったりするのは難しいですね。沐浴よりは上がった後に寒さで震えてはいなかったので、取り敢えず及第点でしょうか。