葡萄の蒸しパン

先週のチェンツォンカオのドライフルーツはもう一つだったみたいで、今回は干し葡萄のみを使って葡萄蒸しパンにしてみた。

あとはつまみやすいように前回よりも小さく切ってみた。

1302323713

今回は二度目なので一次発酵、二次発酵を逆算してうまく空き時間に押し込むことが出来て効率的に作ることが出来たな。

The King of Limbs / radiohead

以前買ったベスト盤よりは、こっちのほうが好きだな。

ProductName The King of Limbs
Radiohead
Hostess Entertainment / 1668円 ( 2011-04-05 )


ダビーで内省的、癒し度高し。

rcsbから結晶構造データをダウンロードするコマンドをPythonで

pdbgetというpdb-idを引数にとって構造データをまとめてダウンロードするコマンド使っていたんだけど、ちょっと前のサーバリプレースでPDBのミラリング環境が失われたので使えなくなってた。こういうの致命的だよなとは思うが今時はネットワークが太いので別にミラリングする必要性はあまりないのかな?でも遅いよなぁ。

とりあえず、自分用に。プロキシ使いたいのでFancyURLopener

import urllib
import sys
pdblist = sys.argv[1:]

proxies = {'http': 'http://[hostname]:[port]/'}
opener = urllib.FancyURLopener(proxies)

for pdbid in pdblist:
   f = opener.open('http://www.rcsb.org/pdb/files/%s.pdb.gz' % pdbid.upper())
   data = f.read()
   with open('%s.pdb.gz' % pdbid.upper(),'wb') as wf:
       wf.write(data)

ちなみに初代はperlで書いてあった。これいつ書いたんだろう?多分7,8年よりは前だと思うんだよなぁ。

use strict;
use Net::FTP;

die "usage:$0 [pdb_id] ...\n" unless @ARGV;

my $ftp = Net::FTP->new("[hostname]", Debug => 0)
    or die "Cannot connect to [hostname]: $@";
$ftp->login("pdb",'pdb')
  or die "Cannot login ", $ftp->message;

$ftp->binary();

for my $pdbid (@ARGV){
  $pdbid =~ tr/[A-Z]/[a-z]/;
  my $pdbdir = substr($pdbid,1,2);
  my $pdbfile = "pdb" . $pdbid . ".ent.gz";

  $ftp->cwd($pdbdir)
    or warn "Cannot change PDB directory ", $ftp->message;

  $ftp->get($pdbfile)
    or warn "$pdbfile : ", $ftp->message;

  $ftp->cwd('..')
    or warn "Cannot change PDB directory ", $ftp->message;
}

$ftp->quit;

ProductName Bioinformatics Programming Using Python
Mitchell L. Model
Oreilly & Associates Inc / 5119円 ( 2009-12-23 )


Virtual Screening: Principles, Challenges, and Practical Guidelines

目次見たけど概要をつかむにはよさげ。

ただ、スコア関数の方法論がもう限界ですからな。もっと丁寧なモデル化が望まれているような気はするし、そういったあたりのもっとイノベーティブなアプローチが議論されない限りはつまんないフィールドになっていっちゃうと思っている。

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で見てる

参考