このBlogは移転しました。今後は aish.dev を御覧ください。

python

uniq()あれこれ

ふとこちらの記事を拝見して、頭に浮かんだことをメモってみる。id:aroma_blackさんの [y for x,y in enumerate(seq) if seq[:x+1].count(y) == 1] や、id:cocoatomoさんの [x for i, x in enumerate(a) if i == a.index(x)] でも良いんだけど、あえて別解を…

許されざる悪事

djangoの中に、こんな処理がある。 def get_cache(backend_uri): scheme, host, params = parse_backend_uri(backend_uri) … … … return getattr(module, 'CacheClass')(host, params) cache = get_cache(settings.CACHE_BACKEND) (http://code.djangoprojec…

オープンソースQ&Aシステム OSQAのインストール方法

さて、 昨日紹介した オープンソースQ&Aシステム OSQAのインストール方法を解説する。ここではUnuntu Linux 10.4 を対象に、インストール先ディレクトリは /home/osqa とした。 動作環境 Python 2.6以上 ソースの取得 まだ正式なリリースが出ていないので、S…

オープンソースstackoverflowクローン OSQA

IT技術者の皆さんなら、Stack Overflow というサイトをご存じだろう。いわゆるQ&Aサイトだが、非常に使い勝手の良いサービスで、この手のサイトにはあまり足を運ばないようなプログラマでも、ここでは書き込んでいるのを見かけることも多い。Stack Overflow…

はてなダイアリのURL一覧を取得してみる

はてなダイアリの記事一覧を取得し、lxmlを使って日記一覧とタイトルをcsv形式で出力してみるテスト。なんかAPIとかないのか? import urllib2, re, csv, sys, locale from lxml import etree def fetchentries(hatenaid, n): url = "http://d.hatena.ne.jp/…

メソッドオブジェクトの不思議とid()の落とし穴

さて、@aroma_blackさんがこんなスクリプトで悩んでおられたのである。 class C(object): def foo(self): pass c = C() print id(c.foo) == id(c.__class__.foo) print c.foo is c.__class__.foo @aroma_blackさんはメソッドオブジェクトがどこに隠れている…

Python2のstrは死んだ

Python3の概略をざっと聞くと、Python3ではPython2のユニコード型が文字列型になり、文字列型はバイト文字列型になった、というイメージを持ってしまう人も多いだろう。Python2の s="spamspamspam" は、Python3の s=b"spamspamspam" と同じだ、と。しかし、P…

internのひみつ

Pythonにはintern()という組み込み関数がある。結構特別扱いで重要な組み込み関数なのだが、使い道が今ひとつ分かりにくいのか知らない人も多いようだ。 intern (一定の区域内に)拘禁する, 抑留する. [新英和(第7版)・和英(第5版)中辞典 株式会社研究…

is演算子のふしぎ

Pythonには、二つのオブジェクトが同じオブジェクトかどうか判定する is演算子というのがある。==演算子とちょっと似ているが、==演算子は二つのオブジェクトの値が等しいかどうかを判定し、is演算子は値に関わらず異なるオブジェクトが指定されればFalseを…

リストのかけ算

Python初学者が引っかかる落とし穴に、 seq = [[]] * 5 seq[0].append('A') print(seq) としたとき、どのような出力が出るか?というのがある。 一見、 [['A'], [], [], [], []] となりそうだが、実際には [['A'], ['A'], ['A'], ['A'], ['A']] となる。 seq…

Pythonバージョンの選びかた

Pythonはおよそ18ヶ月ごとに新しいメジャーバージョンをリリースする慣習になっていて、これまでにたくさんのバージョンがリリースされ、広く利用されてきた。Pythonの開発では後方互換性を保つことが非常に重視されていて、通常のアプリケーションであれば…

Pythonで学ぶ「詳解 UNIXプログラミング」(その17) おしまい

以上でPythonで学ぶ「詳解 UNIXプログラミング」シリーズを終える。軽いネタのつもりで書き始めたが、サンプル一つ一つにきちんと目を通すのはなかなか楽しく、思ったよりも時間がかかってしまった。短期間にこんなにたくさんのos.fork()を書いたのは初めて…

Pythonで学ぶ「詳解 UNIXプログラミング」(その16) 第19章 擬似端末

19.1 〜 19.3 Pythonのpty.fork()でptyのオープンとforkを行うことができる。pty.fork()はこのサンプルと同等の機能が実装されており、Linux/BSD/Solaris/Cygwin等の各プラットフォーム対応のコードが入っている。ただし、子プロセス側でのtermioとウィンド…

デコレータの元関数を保存する

テスト等でデコレータのデコレート前の関数を保存する必要があるなら、こんなのはどうだろう? import sys def tee(f): sys._getframe(1).f_locals['_raw_'+f.func_name] = f return f デコレートした関数オブジェクトから元の関数を取り出すのは難しいし、…

func_closureのひみつ

Pythonでデコレータで修飾した関数から、修飾される前の関数を取り出したいというニーズは多いようでデコレータ式を適用した関数から元の関数名を探す - gumi Engineer’s Blog デコレータを外す - logiqboard デコレータを取り除いて見たかった。 - podhmoの…

Pythonで学ぶ「詳解 UNIXプログラミング」(その15) 第15章〜第18章

以下の章 第15章 高度なプロセス間通信 第16章データベースライブラリ 第17章 PostScriptプリンタとの通信 第19章 モデムの発信 のサンプルは省略する。第15章ではプロセス間でファイルディスクリプタを受け渡す技法を解説しているが、この技法はPythonでは…

Pythonで学ぶ「詳解 UNIXプログラミング」(その14) 第14章 プロセス間通信

14.1 パイプを介して親から子へデータを転送する import sys, os r, w = os.pipe() pid = os.fork() if pid: # parent os.close(r) os.write(w, "hello world\n") else: # child os.close(w) line = os.read(r, 80) print line 14.2 ページ表示プログラムへ…

Pythonで学ぶ「詳解 UNIXプログラミング」(その13) 第13章 デーモンプロセス

13.1 デーモンプロセスの初期化 import sys, os pid = os.fork() if pid: sys.exit(0) # parent goes bye-bye # child continues os.setsid() # become session leader os.chdir("/") # change working directory os.umask(0) # clear out file mode creatio…

Pythonで学ぶ「詳解 UNIXプログラミング」(その12) 第12章 高度な入出力

12.1 ブロックしない大量のwrite import os, sys, fcntl buf = sys.stdin.read() print >>sys.stderr, "read {0} bytes".format(len(buf)) wrote = 0 fno = sys.stdout.fileno() val = fcntl.fcntl(fno, fcntl.F_GETFL, 0) fcntl.fcntl(fno, fcntl.F_SETFL, …

Pythonで学ぶ「詳解 UNIXプログラミング」(その11) 第11章 端末入出力

11.1 割り込み文字を無効にし、ファイルの終わりの文字を変更する import os, sys, termios if not os.isatty(0): sys.exit("standard input is not a terminal device") vdisable = os.fpathconf(sys.stdin.fileno(), "PC_VDISABLE") if vdisable < 0: sys.…

Pythonで学ぶ「詳解 UNIXプログラミング」(その10) 第10章 シグナル

10.1 SIGUSR1とSIGUSR2を捕捉する簡単なプログラム import signal def sigusr(signo, frame): # one signal handler for both signals print "received", "SIGUSR1" if signo == signal.SIGUSR1 else "SIGUSR2" signal.signal(signal.SIGUSR1, sigusr) signa…

Pythonで学ぶ「詳解 UNIXプログラミング」(その9) 第9章 プロセスの関係

9.1 オーファンドプロセスグループの作成 import sys, os, time, signal, traceback def pr_ids(name): print "{0} pid={1} ppid={2} pgrp={3}".format( name, os.getpid(), os.getppid(), os.getpgrp()) def sig_hup(signum, frame): print "SIGHUP receive…

Pythonで学ぶ「詳解 UNIXプログラミング」(その8) 第8章 プロセス制御

8.1 fork関数の例 import sys, os, time glob = 6 buf = "a write to stdout\n" STDOUT_FILENO = sys.stdout.fileno() def main(): global glob var = 88 # automatic variable on the stack os.write(STDOUT_FILENO, buf) # we don't flush stdout print "b…

Pythonで学ぶ「詳解 UNIXプログラミング」(その7) 第7章 プロセスの環境

7.1 終了ハンドラの例 import atexit def my_exit1(): print "first exit handler" def my_exit2(): print "second exit handler" atexit.register(my_exit2) atexit.register(my_exit1) atexit.register(my_exit1) print "main is done" Python 2.6以降では…

Pythonで学ぶ「詳解 UNIXプログラミング」(その6) 第6章 システムデータファイルと情報

6.1 getpwnam関数 import pwd def getpwnam(name): for rec in pwd.getpwall(): if rec.pw_name == name: return rec パスワードファイル関連の関数はpwdモジュール、シャドウパスワード関連の関数はspwdモジュール、グループファイル関連の関数はgrpモジュ…

Pythonで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ

5.1 getc()とputc()を用いて標準出力へコピーする import sys while True: c = sys.stdin.read(1) if not c: break sys.stdout.write(c) 5.2 fgets()とfputs()を用いて標準出力へコピーする import sys for line in sys.stdin: sys.stdout.write(line) Pytho…

Pythonで学ぶ「詳解 UNIXプログラミング」(その4) 第4章 ファイルとディレクトリ

4.1 指定したファイルの種類を出力する import sys, os, stat for filename in sys.argv[1:]: print "{0}:".format(filename), try: st = os.lstat(filename) except Exception, e: sys.exit("lstat error") mode = st[stat.ST_MODE] if stat.S_ISREG(mode):…

UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング

最近、ときどきTwitterで「Python」を検索して眺めていたのだが、Pythonの分かりにくいところとして「UnicodeDecodeErrorが出てうざい」という不満をよく見かけるようだ。 確かに、Pythonでは、数字やアルファベット以外のユニコード文字を使おうとすると、…

Pythonで学ぶ「詳解 UNIXプログラミング」(その3) 第3章 ファイル入出力

3.1 標準入力ファイルがシーク可能で有るかどうかを調べる import os try: os.lseek(0,0,os.SEEK_CUR) except OSError: print "cannot seek" else: print "seek OK" lseek()が失敗すると、OSError例外が発生する。 3.2 lseek()でファイル内部に間隙を作成す…

Pythonで学ぶ「詳解 UNIXプログラミング」(その2) 第2章 UNIXの標準化と実装

2.1 sysconfとpathconfの定義値を出力する import os, sys for name in sorted(os.sysconf_names): try: value = os.sysconf(name) except OSError: value = "(not defined)" print name, value for name in sorted(os.pathconf_names): try: value = os.pat…