読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

Python の GC のデバッグ機能

Python のデーモン型のプログラム(具体的に言うと Loggerhead という bzr のリポジトリブラウザ)が大量(具体的に言うと100MB以上)メモリを食っていたので、それを調べた時のメモ。まず、本当にそれだけのメモリを利用しているのかどうかを meliae という…

Python3 Advent Calender 3日目 - New GIL を理解する

2011 Pythonアドベントカレンダー(Python3) - connpass の3日目を担当します。Python 3 がリリースされてから、 Python の進化は主に Python 3 で行われ、そこから Python 2 にバックポートできるものがバックポートされています(例: GCのチューニング、辞…

bdist_dumb --relative を使って絶対パスを固定せずにインストールできるバイナリ配布物を作る

Python のバイナリパッケージは、Linux 環境ではあまり使われない。 ソースからインストールする文化があるのと、Unicode の内部表現を選択する configure オプションなどによってバイナリ互換性が失われるケースがあるからだ。でも、同じLinuxディストリビ…

Python の GIL 排除のために Software Transactional Memory が注目されている理由

あるいは、Pythonは参照カウント方式だからGILを排除できないという誤解に対する回答。参照カウントってアトミックなインクリメント・デクリメントさえあればセマフォとか使わないでも並列化できるんで、パフォーマンスが滅茶苦茶落ちるということはない。参…

Google Developer Day 2011 の DevQuiz に Python で挑戦した (スライドパズル)

一部の問題は解くのに利用したパラメータがハードコードされている値と違うことがありますが、一応5000問全部解きました。全体: https://github.com/methane/gdd11/tree/master/slideCythonコード: https://github.com/methane/gdd11/blob/master/slide/_sli…

Google Developer Day 2011 の DevQuiz に Python で挑戦した (一人ゲーム)

https://github.com/methane/gdd11/blob/master/hitori/hitori.py問題読んだあとシャワー浴びながら考えて、深さ優先探索で事足りることを確信して一気に書いた。

Google Developer Day 2011 の DevQuiz に Python で挑戦した (webgame)

https://github.com/methane/gdd11/tree/master/webgame普通は Chrome エクステンションとか FireBug のコンソールとかで挑戦すると思うんだけど、HTMLのソースを見た方が早いので、スクレイピングで解いた。

watchdog と paramiko を使って、ローカルで編集したファイルを瞬時にサーバーにアップロードする

ローカルのファイルシステムの監視。WindowsではGetDirectoryChangesW(だったっけ?)とかいうAPIがあって、Linuxにはinotifyがあるし、Macにもなにか手段があるはずなんだけど、 http://packages.python.org/watchdog/installation.html watchdog というラ…

スレッドを使うプログラムが Ctrl-C で止まらない件

常識かと思ってたけど、、、 while True: thread.join(0.5) join() メソッドを呼ぶときに、タイムアウトを設定して、ループする。こうすると、KeyboardInterruptを受け取れる。

シグナルを使って statistical profiler をつくろう

Pythonの標準ライブラリにはプロファイラがあるが、これは deterministic profiler という種類のプロファイラだ。関数が呼び出されたときと関数から抜けるときに登録したコールバック関数を呼び出す仕組みが用意されており、そのコールバック関数で時間を測…

gevent で proxy server を作る

Flash製アプリの試験用のアクセスパターンを作りたくて gevent を使って簡単なproxy serverを作った。localhostの8000版で立ち上がるので、FoxyProxy などで、特定のドメインに対する proxy として登録してやると、リクエストを再現するのに必要なデータをms…

バッチがわりに Python を使うときは、 os.system よりも subprocess.call を使おう

次の2つのスクリプトは同じに見える。 #!/usr/bin/env python import os for i in xrange(100): cmd = "tail -f /var/log/syslog | cat " os.system(cmd) #!/usr/bin/env python import subprocess for i in xrange(100): cmd = "tail -f /var/log/syslog | …

Ubuntu 11.04 Natty で PIL をビルドする方法

原則として、PILはeasy_installやpipで問題が起こりやすいので、手動で python setup.py install を行う。*1Ubuntu Natty では、 libjpeg や libpng をはじめ、多くのライブラリファイルが /usr/lib ではなくて /usr/lib/x86_64-linux-gnu *2に置かれている…

Python でファイルを直接イテレータとして使うのが適切でない場合

Pythonでサブプロセスと対話する - 西尾泰和のはてなダイアリーPython のファイルは、通常のファイルの読み込みの効率を考えて大きめ(8192バイト)のバッファリングを行っているので、ソケット通信やパイプで問題になるケースがある。問題になるケースの一つ…

優れた Python プログラマを見つける n の質問(改)(書きかけ)

+ "", "0", [], [0], [1], 0, 1 のうち、 bool(obj) が True になるのはどれか? + True, False, None との比較に == ではなく is を使うことが推奨されるのはなぜか? + s = 'foo'; t = 'foo'; print s is t; の結果が未定義なのはなぜか? + [[0] for i in…

textwrap は覚えとこう

文字列を適当な長さで区切って diff を表示する - forest book のお題だけど、読み逃してる条件が無ければ textwrap で充分。 import textwrap def limit_characters(line, start, width): return textwrap.wrap(line[start:], width) def test_limit_charac…

Paverをインストール不要な方法で使う

ごちゃっとしたプロジェクトで、setup.pyみたいなファイルだけでそのプロジェクトのビルドや配置が完結できない場合に役に立つのが paver。でも、そのためにみんなに paver をインストールしてもらうのが気が引ける、という場合、 paver minilib というコマ…

ビルダーメソッドを作るときはstaticmethodよりもclassmethodを使おう

Javaだとよくビルダーメソッドをstaticで定義するけど、Pythonの場合はできるだけクラスメソッドを使った方が良いだろう。 例えば、float.fromhex http://docs.python.org/library/stdtypes.html#float.fromhex はクラスメソッドなので、 >>> class Foo(floa…

エキスパートPythonプログラミング 予約開始

去年から翻訳していた本が、今月末やっと発売になります。 エキスパートPythonプログラミング作者: Tarek Ziade,稲田直哉,渋川よしき,清水川貴之,森本哲也出版社/メーカー: アスキー・メディアワークス発売日: 2010/05/28メディア: 大型本購入: 31人 クリッ…

unionとintersection

http://blog.livedoor.jp/dankogai/archives/51441112.html一方、Pythonはsetの演算子を定義した。 >>> a = "0 1 2 3 4 5 6 7 8 9".split() >>> b = "0 2 4 6 8 10 12 14 16 18".split() >>> print set(a) & set(b) set(['0', '8', '2', '4', '6']) >>> prin…

DebianでPythonを自分でビルドするときに入れておいた方が良い lib***-dev パッケージ

libbz2-dev libbdb-dev libgdbm-dev libncurses5-dev libreadline5-dev libsqlite3-dev libssl-dev libz-devこれだけあれば、まず使わないようなものをのぞいて、標準ライブラリがビルドできるはず。

Pythonの配列操作

いまさらだけど、 http://0xcc.net/blog/archives/000043.html の Python の部分を添削。 len(a) == 0 は、 if a: のようにリスト自体が空の時に偽になるので使わない。 a.pop(0) は del a[0] とも書ける。どちらでも良いが、多分属性参照が無い分 del の方…

reStructuredText のヘッダを書く

http://blog.tuxcoder.com/2008/12/vim-restructure-text-macros.html を参考に、日本語タイトルに対応する。 vimスクリプトが全く判らないので、Pythonに頼った。 キーマップとか、もっと賢い方法があると思う。 python <

Python Imaging Library (PIL) で、パレット形式のPNGを扱う

PIL のパレットは色々と問題がある。256色あることしか考えてないとか。 んで、PngImagePlugin も、 PNG の "tRNS" チャンクのうちαが0のところを見つけて、そのインデックスを info['transparency'] に突っ込むだけしかしてくれない。PNGのパレット形式はパ…

日本語のdocstringはunicode literalで書こう

# coding: utf-8 def foo(): """ほにゃらら""" 一般的にdocstringと言われていて標準的に使われるドキュメント形式なんだけど、上記のように通常の文字列として書いた場合は (Python 2.xでは) byte string になり、utf-8でエンコードされているという情報が…

Expert Python Programming

eBookにて購入。いいなこの本。 チュートリアルを読み終えてしばらくPythonを触った人〜独学でPythonパッケージをPyPIに登録するようになった人まで、入門者を除く広い層にお勧めできる。 Pythonって、標準で、Python以外の言語は使えるプログラマ向けチュー…

Python2.xでは __str__ が unicode を返しても良い

ソースはこれ: http://mail.python.org/pipermail/python-dev/2006-December/070238.html例えばパスをwrapするオブジェクトを作るときに、パスをunicodeで扱うのであれば、その文字列表現もunicodeにしたい。 そのオブジェクトに文字列表現を与えるとすると …

今週の成果

builtin の compile() 関数に encoding オプションをつけた IPythonやIDLEといったPython製Pythonインタラクティブシェルは、compile()関数を使ってユーザーが入力したコード片をコンパイルするんだけど、そのコード片をutf-8のコンテキストでコンパイルして…

Qtの新しいbinding PySide

PySide – Python for Qt RiverbankのPyQt4と別のQt Python binding. Nokiaが出資しているらしい。 PyQt4がGPLなのに対して、LGPLで使えるPython bindingがほしかったけどRiverbankとの交渉がまとまらなかったので新プロジェクトが立ち上がったらしい。 まだ…

s.decode('utf8') よりも unicode(s, 'utf-8') の方が速い

http://groups.google.com/group/comp.lang.python/browse_thread/thread/314a3043ea63319f/ unicode vs s.decode unicodeはLOAD_GLOBALで、s.decodeはLOAD_ATTRでスタックに積まれる。で、LOAD_GLOBALの方が速い。 さらに言えば、何度もデコードを行うので…

bytearray の罠

mutableなクセにメソッドはstrと同じくout-placeという中途半端なbytearray. strとの違いは変更が可能 In [4]: ba = bytearray('foo') In [5]: ba[1] = 'O' In [6]: ba Out[6]: bytearray(b'fOo') というだけだと思っていたのだが、実はこんな所にも変更が I…

勝手に採点 (Re: 自分ならこう書く - pythonでA*)

自分ならこう書く - pythonでA* - ラシウラより def astar(init, goal, nexts, distance=lambda path: len(path), heuristic=lambda pos: 0): import heapq queue = [] checked = [init] heapq.heappush(queue, (distance([init]) + heuristic(init), [init]…

Pythonは他の言語の慣習の持ち込みを嫌う

拡張引用構文覚えた! こういう経験があると、たかが「List = list」ごときで何を大げさなと思ってしまうけど、Pythonista的にはこういうのも受け入れられないんだろう。 Pythonistaはtypedefすら拒絶する? (Re: Python での組み込み型をより自然な名前にす…

file.encoding の convention が判らない

http://docs.python.org/library/stdtypes.html#file.encoding file.encoding The encoding that this file uses. When Unicode strings are written to a file, they will be converted to byte strings using this encoding. In addition, when the file i…

len が py3k でも 関数のままである理由

結局は http://d.hatena.ne.jp/methane/20090702/1246556675 なんだけど、ソースを提示しておく。まず、Python FAQにはこんな風に書いてある。 http://www.python.org/doc/faq/general/#why-does-python-use-methods-for-some-functionality-e-g-list-index-…

unladen swallow 2009Q2がリリースされてた

http://code.google.com/p/unladen-swallow/wiki/Release2009Q2 後で試そう。

MessagePack 0.1.1 リリース

会社のBlogでも告知しているんだけど、会社のBlogはPythonistaのアンテナにあまり登録されていない気がするのでこちらでも告知しておく。 http://dsas.blog.klab.org/archives/51456004.htmlMessagePackはjson相当の機能をもつけれどもjsonと違いバイナリフ…

len が関数になっている理由

http://d.hatena.ne.jp/pashango_p/20090702/1246550203 len()がリストのメソッドでないのも同じ理由です。 オブジェクト指向的に考えれば、リストのメソッドであるべきなのに、わざわざビルトイン関数にしたんです。 「オブジェクト指向的に考えれば、リス…

hg-fixutf8 を改造してみた

hg-fixutf8 は、出力しようとしているutf-8文字列の中に、現在のコードページで出力できない文字が存在した場合、SetOutputCP(65001) して utf-8 をそのまま出力する。 でも、これ、実際にやってみるとコードページを切り替えるときにコンソールの内容が化け…

そんなに Array.join がいいのか

「(ruby|javascript)でstr.join(array)、pythonでlist.join(str)」http://blog.livedoor.jp/dankogai/archives/51226075.html ここではlistを継承したListクラスをこさえて、そこにjoinメソッドを追加しているが、listに直にメソッド追加する方法はないのだ…

','.join() がなぜキモイのか

Ruby厨とPython厨が平行線の議論をしていたので、まとめてみる。 オブジェクト指向的にキモイ? str.join() 処理での登場人物は2人いる。連結文字(区切り文字=separator)、連結される文字列の列だ。 この二つを比べると、「連結される文字列の列」が情報的に…

Windows上での IPython というか Python+readline について

Windows 用 Python に移植された readline は二つある。 ひとつは、 UNC Python Tools の Python readline http://sourceforge.net/project/showfiles.php?group_id=82407&package_id=84552 もうひとつは、 IPython の開発元が開発している PyReadline http:…

PyQt 4.5 リリース

ダウンロードページはこちら。 http://www.riverbankcomputing.co.uk/software/pyqt/download今回から Python 3.0 がサポートされている。

print_function

http://d.hatena.ne.jp/kazkun/20090529/1243560131 他の言語の経験が長いためか、Pythonの面倒なところ、嫌なところはたくさんでてくる。※例えばprintで最後を改行もせず空白も空けない事ができないとか、副作用を持ったプロシジャが値を返してくれないとか…

PyQT 4.5 もうすぐ

Python 3.0 に対応したり、signal/slot周りをPythonicに改良した PyQT 4.5 が早ければ今週末にもリリースされる。 PyQtアプリの開発環境構築〜開発〜配布までをまとめた本でも書けば流行るのかな。

logging.basicConfig() はすべてのログ出力に先立って呼び出す必要がある

logging.basicConfig() はルートロガーがまだ初期化されていない場合に初期化する関数だけど、一度でもログを出力すると自動でルートロガーが初期化されてしまうので basicConfig() は無効になってしまう。 import logging import foo ... if __name__ == '_…

IPython の起動が重くなったら

history のためすぎを疑う。%clear shadow_compress か %clear shadow_nuke かを試すと良い。詳しくは %clear?

Pythonプログラムがメモリを大量に使っているとき

もし想定以上のメモリを Python プログラムが消費しているのであれば、ループの中で循環参照が生まれていることや、回収不能オブジェクト(循環参照なうえに __del__ メソッドが存在するためにgcがどこから循環を切っていいのか判らないオブジェクト)が存在し…

lxml ではなるべく attrib を使わない方が良い

lxml の Element.attrib は、 _Attrib という libxml への Proxy オブジェクトを生成する。この Proxy オブジェクトは、 _Element という Proxy オブジェクトと循環参照になっている。 大規模なxml処理においては、この循環参照によって gc の間にメモリを食…

PyQt で画像を扱う等するプログラムをfreezeするときの注意

"site-packages/PyQt4/plugins" 以下に配置されているファイルはQtのプラグインで、たとえば "plugins/imageformats" 配下に gif やら jpeg やらの codec が入ってる。 PyQtを使うアプリをpy2exeなどでfreezeすると、これらのcodecが利用不可能になり、JPEG…