modulefinderでimportされているモジュールを列挙する

引数にファイルを指定して呼び出せばそのファイルでimportされているモジュールを列挙してくれる

import cPickle

with open("list.txt","w") as f:
    cPickle.dump([1,2,3,4,5],f)

with open("list.txt","r") as f:
    a = cPickle.load(f)

print a

こんなのだと

  Name                      File
  ----                      ----
m __main__                  pickletest.py
m cPickle                   /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/cPickle.so

こんな感じ。

手芸+電子工作=テクノ手芸

テクノ手芸部の本

眺めているだけで創作意欲を刺激されるが同時に物欲度もあがる

ProductName テクノ手芸
テクノ手芸部
ワークスコーポレーション / 3570円 ( 2010-11-29 )


ホットボンド欲しくなった

娘にはまだフェルトとか早いだろうから、一緒に遊ぶならテクノ折り紙かな

LEDは色々持っているのでCRC-2032多めに買っておこうっと

reをコンパイルしとくと速いってのは割と単純な理由だった

ソース見ると毎度毎度コンパイルしてた

def match(pattern, string, flags=0):
    """Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).match(string)

def search(pattern, string, flags=0):
    """Scan through string looking for a match to the pattern, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).search(string)

あとはこれで使ったexperimentalなScannerクラスのコード読んだ。

class Scanner:
    def __init__(self, lexicon, flags=0):
        from sre_constants import BRANCH, SUBPATTERN
        self.lexicon = lexicon
        # combine phrases into a compound pattern
        p = []
        s = sre_parse.Pattern()
        s.flags = flags
        for phrase, action in lexicon:
            p.append(sre_parse.SubPattern(s, [
                (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))),
                ]))
        s.groups = len(p)+1
        p = sre_parse.SubPattern(s, [(BRANCH, (None, p))])
        self.scanner = sre_compile.compile(p)
    def scan(self, string):
        result = []
        append = result.append
        match = self.scanner.scanner(string).match
        i = 0
        while 1:
            m = match()
            if not m:
                break
            j = m.end()
            if i == j:
                break
            action = self.lexicon[m.lastindex-1][1]
            if hasattr(action, '__call__'):
                self.match = m
                action = action(self, m.group())
            if action is not None:
                append(action)
            i = j
        return result, string[i:]

ダンボール掘ってみた(12)

Individual Orchestra インタビュー

1295003330

ProductName MIND THE GAP-singles 2000-2006
INDIVIDUAL ORCHESTRA
インディーズ・メーカー / 2680円 ( 2006-07-07 )


Electrospective / Vector Lovers

somaの中ではAlex Smokeと並んで最も好きなアーティストの一人であるVector Loversのベストトラック+新曲

3,4,6,9,10,11と名曲揃い。

ProductName Electrospective
Vector Lovers
Soma / 1990円 ( 2011-03-30 )


チルっぽい遅めのテクノというかエレクトロニカというか、とにかく柔らかい感じのメロディーが好きならオススメです。

未読のPython標準モジュール

最近朝早く起きて読みまくっているので、結構減った

標準モジュール読むと、コードのお作法とか勉強になるし、あーこうなってんのか!という気付きが何度もあって階段登ってるという実感があって楽しい。

ProductName 初めてのPython 第3版
Mark Lutz
オライリージャパン / 4830円 ( 2009-02-26 )


  • bdb.py
  • cProfile.py
  • code.py
  • difflib.py
  • doctest.py
  • gettext.py
  • htmllib.py
  • httplib.py
  • modulefinder.py
  • optparse.py
  • pdb.py
  • pipes.py
  • profile.py
  • pstats.py
  • pydoc.py
  • random.py
  • re.py
  • repr.py
  • shutil.py
  • socket.py
  • subprocess.py
  • threading.py
  • token.py
  • tokenize.py
  • unittest.py
  • urllib.py
  • urllib2.py
  • xmllib.py
  • xmlrpclib.py

cPythonのソースコードも読むと楽しいのかな?

Pythonのsiteモジュールはサイト固有のパスをモジュール検索パスに追加するわけだが

addpackage関数を読んでいたら

for line in f:
    if line.startswith("#"):
        continue
    if line.startswith(("import ", "import\t")):
        exec line
        continue
    line = line.rstrip()
    dir, dircase = makepath(sitedir, line)
    if not dircase in known_paths and os.path.exists(dir):
        sys.path.append(dir)
        known_paths.add(dircase)

最初のifはコメント対応で次はpthでimportではじまる場合にはimportするってことだ。最後は行のパスがまだモジュール検索パスに含まれていなかったら追加するようになっている。

またmain関数は設定が出力されるようになっている。

$ python /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site.py
sys.path = [
    '/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6',
    ...
    '/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PyObjC',
    '/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/wx-2.8-mac-unicode',
]
USER_BASE: '/Users/kzfm/.local' (exists)
USER_SITE: '/Users/kzfm/.local/lib/python2.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

あれ、USER_SITEってことはローカルにライブラリインストールして使えるってことか?

easy_installのヘルプを見たら--userオプション入れればローカルにインストールすることが出来るって書いてあった。いつもvirtualenv使っているから知らなかった。

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


デザインの骨格はドラッグデザイナーも読むべし的な超良書です

僕はドラッグデザインにはアートの要素が沢山含まれていて楽しい仕事だと思っているし、工業デザインの範疇に入ると考えている。

例えば

  • 技術者は常に性能向上を目指します。しかし新しい価値は、性能のいかんにかかわらず、はじめからその技術自体に遺伝子のように組み込まれているように思います

これは、スキャフォールドのポテンシャルは決まっていて、リードオプティマイゼーションってのはスキャフォールドをできるだけ磨いて薬剤としての美しさを引き出す行為とも捉えることができるし

  • 形を描こうとしてはいけない。構造を描くことによって自然に形が生まれる
  • 絵を描くことは、ものの輪郭を描くことではない。重要なのは向こう側にあって見えてないものや、中心軸のような仮想の線を描く事。そうやって立体や空間の構造を把握したときに迷いなく輪郭を決定することができる

これはファーマコフォアをきちんと認識することの重要性ともろかぶりする

ドラッグデザインを工業デザインとして捉えるヒトはあんまり知らないけど、ケミストやケモインフォマティストが本書を読めば新たな視点が開けると思う

ProductName デザインの骨格
山中俊治
日経BP社 / 1680円 ( 2011-01-29 )


  • 技術者は常に性能向上を目指します。しかし新しい価値は、性能のいかんにかかわらず、はじめからその技術自体に遺伝子のように組み込まれているように思います
  • 生物らしい形の典型は、螺旋と節
  • 携帯電話機の一番重要な機能は「私であることの証明」なんじゃないか
  • 形を描こうとしてはいけない。構造を描くことによって自然に形が生まれる
  • 絵を描くことは、ものの輪郭を描くことではない。重要なのは向こう側にあって見えてないものや、中心軸のような仮想の線を描く事。そうやって立体や空間の構造を把握したときに迷いなく輪郭を決定することができる
  • インボリュート曲線
  • 図面というのは、設計者と製作者をつなぐ言葉のような物

pycとは一体何なのか?

pycはバイトコードのキャッシュファイルなんだが、実際に中身がどうなっているかはpy_compile.pyのソースコードを読んで理解した。

with open(cfile, 'wb') as fc:
    fc.write('\0\0\0\0')
    wr_long(fc, timestamp)
    marshal.dump(codeobject, fc)
    fc.flush()
    fc.seek(0, 0)
    fc.write(MAGIC)

ここで、codeobjectは

codeobject = __builtin__.compile(codestring, dfile or file,'exec')

でコンパイルしたコードでMAGICはimp.get_magic()で得られたマジックナンバー、wr_longはリトルエンディアンで32bitの整数値を書きこむ関数(py_compileで定義されてる)

つまり、先頭の4バイトがマジックナンバーで次の4バイトにタイムスタンプが続き、その後にmarshalでダンプされたコードオブジェクトが続いたものがpycファイルということだ

実際にpy_compile.pycで確かめてみる。まずマジックナンバーは

>>> import imp
>>> imp.get_magic()
'\x03\xf3\r\n'

タイムスタンプ

>>> l = long(os.stat('py_compile.py').st_mtime)
>>> hex(l & 0xff)
'0xbbL'
>>> hex((l >>8) & 0xff)
'0x8L'
>>> hex((l >>16) & 0xff)
'0x8fL'
>>> hex((l >>24) & 0xff)
'0x4dL'

pycをbviで開いて確かめてみる

00000000  03 F3 0D 0A BB 08 8F 4D 63 00 00 00 00 00 00 00 00

確かに先頭からマジックナンバー、タイムスタンプの順に入っていることがわかる。

ところで、なぜ最初に'\0\0\0\0'を入れてからfseekで先頭に戻ってきて改めてマジックナンバーを書き出しているんだろうか?

「Webデザインのためのデジカメ基礎講座」を読んだ

僕がよく撮るような「料理」とか「日本酒」は天逆光で撮れと。

ProductName Webデザインのためのデジカメ基礎講座
内田 広由紀
視覚デザイン研究所 / ?円 ( 2002-08 )