Sphinxの拡張(japanesesupport.py)に手を入れた

Sphinxで文書を書いていて気になるのは、謎じゃない謎の空白だ。

これはあちこちで書かれていてそのための拡張その改良版が用意されているが、自分の環境(Python2.6.6+Sphinx1.0.7)ではうごかなかった。

なんでかなーと調べてみるとtype(node.parent)が<type 'instance'>を返してたのでisinstanceで評価するようにしてみた。

def trunc_whitespace(app, doctree, docname):
    from docutils.nodes import Text, paragraph
    if not app.config.japanesesupport_trunc_whitespace:
        return
    for node in doctree.traverse(Text):
        if isinstance(node.parent, paragraph):
            newtext = node.astext()
            for c in "\n\r\t":
                newtext = newtext.replace(c, "")
            newtext = newtext.strip()
            node.parent.replace(node, Text(newtext))

def setup(app):
    app.add_config_value('japanesesupport_trunc_whitespace', True, True)
    app.connect("doctree-resolved", trunc_whitespace)

なんでかなーってのを調べるためにSphinxのソースコードを読み始めたりdocutilsのソースを読み始めたりしたけど、昨日あたりからかなり脱線し始めたのでとっとと成果物を残しておこう。

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


エキスパートPythonも読みなおそうっと

FORM+CODE -デザイン/アート/建築における、かたちとコード

これの日本語訳。サイトにcode exampleや本の中身が少し出てるのでどういう内容かはわかると思う。

ProductName FORM+CODE -デザイン/アート/建築における、かたちとコード

ビー・エヌ・エヌ新社 / 2520円 ( 2011-04-25 )


というわけで、予約した。

またprocessingいじり熱も再発するんだろうなぁ。

Pythonのcmdモジュール

cmdを使えばコマンドラインのツールを簡単に作れる

コマンドループは

line = self.precmd(line)
stop = self.onecmd(line)
stop = self.postcmd(stop, line)

となっているのでpre,postのフックが効く。onecmdのほうはdo_をつけたメソッドを呼び出している。

cmd, arg, line = self.parseline(line)
if cmd == '':
    return self.default(line)
else:
    try:
        func = getattr(self, 'do_' + cmd)
    except AttributeError:
        return self.default(line)
    return func(arg)

getattrでメソッドを呼び出して、引数与えて実行した結果を返している。動的にメソッドの適用したい場合にはこうやればいいのか。

Rパッケージガイドブック

CPANといいCRANといいパッケージガイドが立て続けにでますな。

ProductName Rパッケージガイドブック
岡田 昌史
東京図書 / 3990円 ( 2011-04-09 )


ProductName Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション / 2730円 ( 2011-04-08 )


このながれでPyPIやHackageも出ないかなぁ

フリーライダーってのは仕事に対する認識の違いってのが大きいのかも

4月からチームごと異動になってる。異動先はまぁルーチンワークに全力投球的な部署ですね。保守メインだから仕方ないんだろうけど。意図というのはまぁ薄々感じていて、要するに我々が染まるのか、我々に染めるのかという駆け引きが行われる感満載なわけだけど、実際疲れるからイヤなんだよなぁ。一掃してつくり直すというオプションが存在しないってのは問題だと思っている。年功序列でところてん方式で押し出されたのを押し戻すと組合がうるさいからどうしようもないんだろうなぁ。って、僕らの世代にそういう処理も押し付けても困るわけですが、まぁそういう世代なんだろうなぁと思っている。

本書はちょうど僕らが抱えているそういうジレンマを含んだ給料格差をフリーライダーという観点から分類して分かりやすく説明して、暗黒面に染まらない、またはうまく避けるポイントを提示している。

経験上、真のフリーライダーってのはたしかにいますね。ぱっと思いつくのはこういうヒトとか。

本書のフリーライダーの分類っていうのは積極的にフリーライドしようという人間と、認識の違いとかカルチャーの急激な変化により取り残されたヒトの区分けをあまり明確にしていないかなぁ。なんというか歴史的経緯によるフリーライダーってのは一定数いますよね。上司から与えられた仕事をこなすのが仕事だったはずなのに、気がついたらその仕事はいつからか企画型業務に分類されちゃって困った困ったという。とりあえずやれる範囲で一生懸命やってみよう的な。給料一緒だったら同情すんだけど、結局そういう人達高給なんだよね、本書でいうアガリ系ってやつか。

それからフリーライドに一生懸命な人間というのは意外に組合活動頑張るという側面に触れてないな。これ重要かも。とりあえず組合に前向きなやつとは目を合わすなというのは僕の生きる智慧ですね。結局、ああいうのに染まると研究者的な堕落しか待ってない。キャリアブルスキルが喪失しますね。成果主義とか取り入れていながら組合のベアとか年功序列とかああいうの一生懸命なやつのほうが積極的なフリーライダーだと思うんだよなぁ。

  • ただのり社員とは「自分は楽をしておいて、他人の努力や善意の恩恵に与っているヒト」
  • 現場のノルマや成果管理が厳しくて、現場から本部に異動した人にとって、本部がまるで休憩所のようになっているケース
  • 年功序列から成果主義にスイッチする過程で「無能な上司、有能な部下」という図式ができやすくなる
  • アガリ型フリーライダーが生息しやすい条件は「サボっていてもそれなりの処遇が手に入る」
  • 敗者復活の文化は重要
  • 挑戦奨励、挑戦礼讃
  • 成長努力を怠っている先輩、上司はフリーライダーにみられがち
  • 自分をベテランと思った瞬間から没落は始まる

本書を読んだからといって、モチベーションがあがるわけではないが、なんとなくモヤモヤするシチュエーションってのはフリーライダー絡みではけっこうあるので、そういう時にモヤモヤしないで、自分の心に折り合いをつけるためには読んでおくといいのかも。

Pythonでファイル更新検知して任意のコマンドを実行する簡易コマンドを作った

Sphinx使っているのだけどファイルを更新するたびにmake htmlと打って確認するのがめんどくさい。linuxだったらpyinotifyがあるんだけど、macbookでは使えない。

簡易コマンド書いた。

#!/usr/bin/env python

import os
from time import sleep, strftime, localtime
import sys
import commands

filename = sys.argv[1]
mycommand = sys.argv[2]

def get_mtime():
    return os.stat(filename).st_mtime

mtime = get_mtime()
while 1:
    sleep(1)
    new_mtime = get_mtime()
    if mtime != new_mtime:
        mtime = new_mtime
        commands.getoutput(mycommand)
    print "done: %s ( %s )" % (mycommand, strftime("%a, %d %b %Y %H:%M:%S", localtime(mtime)))

監視対象のファイルを第一引数に、更新されたら実行するコマンドを第二引数に。

$ wdo docutils.rst "make html"
done: make html ( Wed, 06 Apr 2011 05:12:30 )
done: make html ( Wed, 06 Apr 2011 05:26:27 )
done: make html ( Wed, 06 Apr 2011 05:28:36 )
done: make html ( Wed, 06 Apr 2011 05:33:35 )
done: make html ( Wed, 06 Apr 2011 05:33:45 )

そうです、お分かりの通り早朝からdocutilsのソースを読んでいるのです。

ちなみにpyhttpd='python -m SimpleHTTPServer'っていうalias切っているので、makeで生成されたhtmlはlocalhost:8000で見てる

参考

rst.elモードを導入した

docutilsの中見てたら、emacs用のelがあったので入れてみた。

ヘッダの色が分かりづらかったのでM-x customize-faceで変更した。

rst.el

参考

KVM徹底入門が面白い

さくらのVPSで採用されているというKVMに興味を持ったので書籍を探してみたら、これがヒットしたので早速購入して読んでみた。

ProductName KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド
平 初
翔泳社 / 3444円 ( 2010-07-08 )


ちなみにKVMとは

第1回 Linux標準の仮想化技術「KVM」の仕組み

KVMは、Linux Kernel自体をハイパーバイザとする仕組みで、正式名称を「Kernel-based Virtual Machine」といいます。KVMは現時点では、Intel VT-xやAMD-VといったCPUの仮想化支援機能を必要とし、完全仮想化によりOSの仮想化環境を提供します。

本書の内容は、仮想化全般の基礎知識から、インストール、導入まで。あとはコマンドのちょっとしたリファレンスが付いてくる感じ。Amazonのレビューにある通りひと通り試したことある人には物足りない内容かも知れないが、予備知識無しでKVMが知りたいのならば手軽に読めてよいと思う。

僕の場合にはこういう内容が知りたかったのだけど、ライブマイグレーションの話題しか触れてなかったのでそこはちょっと残念だったかな。

自分の職場はサーバー管理のスキルのない人間が管理者をヤラざるを得ず、ハードウェアを移行するたびに、(昔作ったサービスが移行できずに)サーバー環境が劣化していくという結構悲惨な状況だったりするわけだ。そもそもサーバー管理自体が本来の仕事と関係なくて片手間なのでしょうがなかったりするので、仮想化しとけばさくっと移行できて、ハードウェア移行の際のコスト減らせるかなぁという期待感からKVMに興味を持ったのだ。

特に7章でPythonとlibvirtを使ったプログラミングの例が出ているようにPythonを利用して色々できそうなので、サーバー管理の省力化に貢献しそうな気はするんだよなぁ。

  • 仮想マシンの導入には複数の方法がある
  • ホストから見た場合、VCPUはQEMUが立ち上げるスレッドに対応する。
  • 実CPUの数を超えてVCPUを割り当てることも可能だが、あまり意味はない
  • HugePageの利用シーンは?
  • virtio-balloonでメモリの確保と開放
  • live migration
  • ネットワークの設定の仕方は主に2つある
  • libvirtdでのプログラミング

「太陽光発電は本当にトクなのか?」を読んだ

サイエンス入ってんのかなと思ったら、ほとんどなかった。単にお得な住宅の話だったのであんま感想はない。

文字の多いパンフレットか?と問われればまぁイエスだろうな。

ProductName 太陽光発電は本当にトクなのか? (マイコミ新書)
山下 和之
毎日コミュニケーションズ / 819円 ( 2010-04-23 )


著者の他の本も住宅関係だしな。

「太陽光発電付きの一戸建てのお得な買い方」ってほうがタイトルにふさわしいかな。

pythonのsplit

splitの第二引数を与えると分割数を指定できる

>>> "test.tar.gz".rsplit('.')
['test', 'tar', 'gz']
>>> "test.tar.gz".rsplit('.',1)
['test.tar', 'gz']

perlだとこんな感じか(re.plで確認)

$ split /\./, "test.tar.gz"
$VAR1 = 'test';
$VAR2 = 'tar';
$VAR3 = 'gz';
$ split /\./, "test.tar.gz", 2
$VAR1 = 'test';
$VAR2 = 'tar.gz';

perlでrsplit相当のことやるにはどうすんだろか?