タグ

ブックマーク / atsuoishimoto.hatenablog.com (23)

  • PythonはDSLが苦手? - atsuoishimoto's diary

    PythonはDSLが苦手でしょうか、って話をチラッと目にした。あんまりDSLって知らないけど、そんなに得意ってことはないんじゃないかと思う。Pythonってのは構文的に遊びが少ないように考慮して作られてるし、そもそもPythonは「実行可能な擬似コード」って言われるぐらいにシンプルなんで、わざわざ新しくDSLを仕立てなくても、って気もする。 ただまあ、工夫の余地がないかというとそうでもなくて、例えば if not INPUT: EXIT SORT REVERSE PRINT のような、独自言語っぽい見栄えのコードを書けないってこともない。上のコードは、コンソールから一行読み込んで、文字をソートしてひっくり返し、コンソールに出力するPythonスクリプトだ。 えーと、上のコード、Pythonスクリプトと言ったのは嘘ではないけど、実行時にちょっと細工がいる。こんな感じで起動しなければならない

    PythonはDSLが苦手? - atsuoishimoto's diary
  • python.jpの明日はどっちだ - atsuoishimoto's diary

    最近「PYJUGって何なの?」「網元衆って何なの?」「何してるの?」「誰なの?」 って話を聞く機会が多いように思えます。 Pyjug-discussへの投稿も凄く減っていますし また網元衆が再編成されて5年も経っています。 外から見ていると、そろそろ運営が実態に合っていないようにも見えます。 なので、網元衆に参加をしてその辺をもっと透明化したいと考えました。 そこで http://www.python.jp/Zope/pyjug/webmasters にある通りにメールをしたのですが 権限がなくて送信出来ずに困っています。 どうしたら良いのか教えて頂けるとありがたいです。 よろしくお願いします。 http://www.python.jp/pipermail/pyjug-discuss/2012-July/000232.html このメールに一日以上応答すらないというのは、もうpython.

    Surgo
    Surgo 2012/07/31
  • あなたの知らないPython3の秘密 - atsuoishimoto's diary

    関数の引数は最大255個まで def f(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41, p42, p43, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p57, p58, p59, p60, p61, p62, p63, p64, p65, p66, p67, p68, p69, p70, p71, p72, p73, p74, p75, p76, p77,

    あなたの知らないPython3の秘密 - atsuoishimoto's diary
    Surgo
    Surgo 2012/06/03
  • Zipファイル一個で実行可能なPythonアプリケーションを作ってみる - 第2夜 - atsuoishimoto's diary

    さて、先日 http://d.hatena.ne.jp/atsuoishimoto/20120503/1336050988 を紹介したが、Flaskアプリケーションの Blueprint 機能を使うと正しく動作しないようだ。Blueprintでは独自にテンプレートや静的ファイルのディレクトリを指定できるようになっているため、こちらも対処する必要があるのだ。 ということで、 class ResourceMixin(object): PACKAGENAME = "demo_pkgrsrc" @helpers.locked_cached_property def jinja_loader(self): return loaders.PackageLoader(self.PACKAGENAME, self.template_folder) def send_static_file(self, fi

    Zipファイル一個で実行可能なPythonアプリケーションを作ってみる - 第2夜 - atsuoishimoto's diary
    Surgo
    Surgo 2012/05/15
  • mockはこう使え - atsuoishimoto's diary

    最近、Mockライブラリ http://www.voidspace.org.uk/python/mock/ を使ってみたのでメモ。 このライブラリは、その性質上、動的にメソッドや属性を作成するケースが多く、普通のPythonライブラリのようにイントロスペクションに頼って使い方を調べるのは難しい。気で使うならまじめにドキュメントを読み込む必要がある。 関数の置き換え テスト中に呼び出される関数をMockで置き換える例。ここでは、関数 myapp.utils.func1() を置き換える。 from mock import Mock import myapp.utils # myapp.utils.func1 を、常に100を返す関数に置き換える myapp.utils.func1 = Mock(return_value=100) 戻り値が定数でない場合は、Mock()にside_effec

    mockはこう使え - atsuoishimoto's diary
    Surgo
    Surgo 2012/03/10
  • 僕たちPythonistaは、プログラミングに、Excelを使います! - atsuoishimoto's diary

    みんな、Excel使ってますか!?もちろん使ってますね!?休暇届も、作業日報も、見積書も、スケジュール表も、みーんなExcelですね!? もちろん、プログラミングだってExcelですね!? 当然です!みんなそうやって仕事してるんです! Excel版のTwitter公式クライアントはまだリリースされないんでしょうか!? だけど、Excelでコーディングしてると、ときどきちょっとだけ不便に感じることがありますね!いちいちテキストファイルに落としてから実行しなければならないからです!テキストファイルなんて低級なフォーマットには関わりたくないですね! でもPythonなら!Pythonなら大丈夫!Pythonなら直接Excelファイルを実行できます!Pythonにはパッケージの配布フォーマットとしてeggという形式が普及していますが、eggはもう古いですね! これからはxls形式を使いましょう!x

    僕たちPythonistaは、プログラミングに、Excelを使います! - atsuoishimoto's diary
    Surgo
    Surgo 2011/12/23
    なるほど!これは便利そうなのでぜひ使わせて頂きます。
  • お前ら効率悪い勉強してんなー - atsuoishimoto's diary

    って思う人たちがたくさんいる。何かを学びながら、その対象の悪口をTwitterとかに書き込んでるような人たちだ。 勉強するなら、嘘でもいいからその対象を愛した方が良い。気に入らなくても、どっか褒めるところがあるだろう。キャバ嬢になったつもりでコビまくれ。欠点には目をつぶれ。アバタもエクボというものだ。アホみたいにテンション上げろ。 批判的な目を向けてしまうとどうしてもテンションが上がらないし、気が散りやすい。嫌いな物事に集中するなんて誰だって嫌だ。だから批判は後回しにして、ただ受け入れろ。いっぺん鵜呑みにしてみよう。だいたい、学習途中で批判するなんて生意気だ。せめて実践的に身についたと言えるようになるまでは、抑えておけ。 別に生涯の愛と忠誠を誓え、と言っているわけではない。用が済んだら好きなだけ嫌えば良いだろう。この点でもキャバ嬢を見習うべきだ。 まあ、勉強が思うように進まない苛立ち・不安

    お前ら効率悪い勉強してんなー - atsuoishimoto's diary
    Surgo
    Surgo 2011/08/31
  • オープンソースstackoverflowクローン OSQA - atsuoishimoto's diary

    IT技術者の皆さんなら、Stack Overflow というサイトをご存じだろう。いわゆるQ&Aサイトだが、非常に使い勝手の良いサービスで、この手のサイトにはあまり足を運ばないようなプログラマでも、ここでは書き込んでいるのを見かけることも多い。 Stack Overflowのクローンサイトを構築するアプリはいくつかリリースされているのだが、今回、その中から OSQA というアプリを日語化したので、ついでにサイトを立ち上げてみた。 http://answer.pythonpath.jp ドメイン名はpytonpath.jpだが、Python関係なく質問・回答を寄せていただきたい。プログラミングやシステム管理などに関するものであれば、なんでもOKだ。 掲示板との違い これはいわゆる掲示板サービスではないし、「Yahoo知恵袋」のようなQ&Aサービスともちょっと違う。単に質問と回答を繰り返すの

    オープンソースstackoverflowクローン OSQA - atsuoishimoto's diary
    Surgo
    Surgo 2011/05/09
  • メソッドオブジェクトの不思議とid()の落とし穴 - atsuoishimoto's diary

    さて、@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さんはメソッドオブジェクトがどこに隠れているのか調べていたようだ。この二つのprint文で出力される結果はおわかりだろうか。 c.foo is c.__class__.foo まず、二番目のprint文から見てみよう。 c.fooは見た通り、Cクラスのインスタンス c からメソッド foo を取得する式である。 >>> c.foo <bound method C.foo of <__main__.C object at 0x02A8B3B0>> c.fooでは、

    メソッドオブジェクトの不思議とid()の落とし穴 - atsuoishimoto's diary
    Surgo
    Surgo 2011/04/26
  • Python2のstrは死んだ - atsuoishimoto's diary

    Python3の概略をざっと聞くと、Python3ではPython2のユニコード型が文字列型になり、文字列型はバイト文字列型になった、というイメージを持ってしまう人も多いだろう。Python2の s="spamspamspam" は、Python3の s=b"spamspamspam" と同じだ、と。 しかし、Python3に"バイト文字列"なんて存在しない。あるのは "bytes"だ。複数形を示す "s"に注意しよう。bytesはバイトのコンテナであり、バイトとは整数値だ。バイトは文字ですらないのだ。 そう、だからもう認めよう。Python2のstrは死んだ。Python3にはもう存在しない。strは消え去った。お亡くなりになった。お隠れになった。成仏した。主の御許に召された。バージョン履歴に残るゴミクズとなった。その生涯は幕を閉じ、アンコールに応じることもないのである。 strとbyt

    Python2のstrは死んだ - atsuoishimoto's diary
    Surgo
    Surgo 2011/04/25
    (-人-)
  • is演算子のふしぎ - atsuoishimoto's diary

    Pythonには、二つのオブジェクトが同じオブジェクトかどうか判定する is演算子というのがある。==演算子とちょっと似ているが、==演算子は二つのオブジェクトの値が等しいかどうかを判定し、is演算子は値に関わらず異なるオブジェクトが指定されればFalseを返す。 >>> list1 = [1,2,3] >>> also_list1 = list1 >>> list2 = [2,3,4] >>> equal_to_list1 = [1,2,3] >>> list1 is also_list1 # list1 と also_list1 は同じオブジェクト True >>> list1 is list2 # list1 と list2 は異なるオブジェクト False >>> list1 == list2 # list1 と list2 は異なる値を持つ False >>> list1 is

    is演算子のふしぎ - atsuoishimoto's diary
    Surgo
    Surgo 2011/04/14
    intern. 知らない built-in 大杉だな。。。
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その12) 第12章 高度な入出力 - atsuoishimoto's diary

    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, val | os.O_NONBLOCK) # set nonblocking while True: try: n = os.write(fno, buf) except OSError, e: print >>sys.stderr, "errno: {0}".format(e.errno) continue else: print >>s

    Pythonで学ぶ「詳解 UNIXプログラミング」(その12) 第12章 高度な入出力 - atsuoishimoto's diary
    Surgo
    Surgo 2011/03/30
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その10) 第10章 シグナル - atsuoishimoto's diary

    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) signal.signal(signal.SIGUSR2, sigusr) while True: signal.pause() 10.2 シグナルハンドラからの再入不可能な関数の呼び出し import signal, pwd def my_alarm(signo, frame): print "in signal handler" rec = pwd.ge

    Pythonで学ぶ「詳解 UNIXプログラミング」(その10) 第10章 シグナル - atsuoishimoto's diary
    Surgo
    Surgo 2011/03/28
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その8) 第8章 プロセス制御 - atsuoishimoto's diary

    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 "before fork" pid = os.fork() if pid == 0: # child glob += 1 # modify variables var += 1 else: # parent time.sleep(2) print "pid={0}, glob={1}, var={2}".format(os.getp

    Pythonで学ぶ「詳解 UNIXプログラミング」(その8) 第8章 プロセス制御 - atsuoishimoto's diary
    Surgo
    Surgo 2011/03/24
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ - atsuoishimoto's diary

    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) Pythonにはgetc()/putc()/fgetc()/fput()がないので、ここでは似たような機能で再実装してみた。 サンプル5.1 はsys.stdin.read()を使って、一文字ずつ読み込んでいる。サンプル5.2では、sys.stdinをfor文を使って読み込み、一行ずつ出力している。 5.3 さまざまな標準入出力ストリームのバッファリング方式を表示する 残念ながら、Pyth

    Pythonで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ - atsuoishimoto's diary
    Surgo
    Surgo 2011/03/17
  • UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング - atsuoishimoto's diary

    最近、ときどきTwitterで「Python」を検索して眺めていたのだが、Pythonの分かりにくいところとして「UnicodeDecodeErrorが出てうざい」という不満をよく見かけるようだ。 確かに、Pythonでは、数字やアルファベット以外のユニコード文字を使おうとすると、対応する処理を書かなければUnicodeEncodeErrorやUnicodeDecodeErrorが出てしまう。Python3では色々改善されているのだが、Python2では分かりにくい点も多い。 このUnicodeDecodeErrorを見て、「Pythonは日語が苦手だ」と考えてしまう人も多いだろう。確かにそう思ってしまっても仕方がないが、それは正しくない。日人だけでなく、アメリカ人でもフランス人でもドイツ人でも、ユニコードを使う時はみんな等しく平等にこのエラーを出しているのである。 もちろん、慣れてし

    UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング - atsuoishimoto's diary
    Surgo
    Surgo 2011/03/11
    なるほど・・・
  • あなたの知らないPythonのひみつ - atsuoishimoto's diary

    Pythonでは、ループ・try・withブロックは最大20までしかネストできない。 >>> def spam(): ... while 1: ... while 2: ... while 3: ... while 4: ... while 5: ... while 6: ... while 7: ... while 8: ... while 9: ... while 10: ... while 11: ... while 12: ... while 13: ... while 14: ... while 15: ... while 16: ... while 17: ... while 18: ... while 19: ... while 20: ... while 21: ... print "Deep!" ... SystemError: too many statically n

    あなたの知らないPythonのひみつ - atsuoishimoto's diary
    Surgo
    Surgo 2011/03/01
    な、なんだってー!
  • 【お詫びして訂正】Pythonの粗大ゴミ - atsuoishimoto's diary

    昨夜、Pythonの粗大ゴミというエントリを書いたが、このエントリを公開し、風呂に入ってさて寝ようとした時、ふと気になったことがあった。try-finally付きのジェネレータがgcで解放されないのなら、withブロックも一緒ではないだろうか? あの記事は昔ジェネレータでtry-finallyが使えるようになった時(そう、最初はジェネレータ内でtry-finallyを使うとコンパイルエラーだったのだ)、ふと気になって調べた記憶を元に書いた。あの頃はたぶんまだwith文が無かった頃なので、withブロック中での動きは把握していない。 で、調べてみると、やっぱりwithブロック中のジェネレータオブジェクトが循環参照に含まれていると、try-finallyの場合と同様に解放されない事がわかった。次のようなジェネレータ def uncollectable(arg): with context: y

    【お詫びして訂正】Pythonの粗大ゴミ - atsuoishimoto's diary
    Surgo
    Surgo 2011/02/28
  • Pythonの粗大ゴミ - atsuoishimoto's diary

    なんかgcネタが続いてしまうが、先日のPython Hack-a-thon で発表した中で、「ジェネレータオブジェクトが解放されない場合がある」というのは、あまり知られていないようだ。Python公式ドキュメントを確認してみると、どうやらこちらにも書かれていない。知らないとハマってしまう場合もあるので、もうちょっと詳しく解説しておこう。 ガベージコレクションで解放されないオブジェクト まず、ちょっと復習しておこう。Pythonのガベージコレクション機構では、__del__() メソッドを持ったオブジェクトで循環参照を作ってしまうと、そのオブジェクトは自動的には解放されなくなってしまう。 例えば、次のように __del__() メソッドを持つクラスを定義する。 class UnCollectable: "__del__()メソッド付きクラス" def __del__(self): print

    Pythonの粗大ゴミ - atsuoishimoto's diary
    Surgo
    Surgo 2011/02/27
  • Pythonのガベージコレクタは「マーク&スイープ」? - atsuoishimoto's diary

    昨日公開した Pythonのガベージコレクション にこんな突っ込みをいただいた。 マークアンドスイープGCじゃないそうです PythonのGarbageCollection http://www.narihiro.info/translate/garbage_collection_for_python_jp.html 確かに、Pythonで使用しているのは教科書で言うマーク&スイープとは異なるアルゴリズムである。上記のページにあるように、いわゆるマーク&スイープは、ルートオブジェクトと呼ばれる生きていることが確実なオブジェクトを見つけ出し、そこから参照されているオブジェクトをどんどん探り出して、最終的に誰からも参照されていないオブジェクトをあぶり出すというものだ。Pythonではルートからオブジェクトを探すというアプローチを取っておらず、私も会場の説明では「マークアンドスイープの一種」のよ

    Pythonのガベージコレクタは「マーク&スイープ」? - atsuoishimoto's diary