2008年12月7日日曜日

Guido's new method definition idea

http://groups.google.com/group/comp.lang.python/browse_thread/thread/5457b8649040f7ea

最近のホットな話題
  1. class C:  
  2.    def self.method( arg ):  
  3.        self.value = arg  
  4.        return self.value  

というシンタックスシュガーを3.1で入れようかっていう話題。


self.method = lambda arg: foo(arg)

に似てていいじゃんってな意見もある。
ただ、そこから、Rubyチックにしろとかみんながすき放題言いまくって大盛況。
とりあえず、現時点ではまとめ人おつ。

2008年12月4日木曜日

Pythonの配列操作

http://d.hatena.ne.jp/tachikawa844/20081204/1228381610

joinについては
",".join(str(s) for s in score)

",".join(map(lambda s:str(s), score))
が主流なはず

あと、
spliceについて
removed = array[1:5]
array[1:5] = xyz
とすれば実現できるはずだけど、1:5の指定を一度にしたいなー。
よく考えたら配列の切り出しと改変を両方行っているわけか。
こんな風に使ったことがないけど、どういうときに便利なんだろうか。
spliceって変な関数だな。
あ、popと一緒か。
でも代入だしなー。

tailfでエンコード

tailf log|iconv -feucjp -tutf8

ではバッファリングされて出力されない。

nkfがあれば
tailf log|nkf -wu

perlがあれば
tailf log|perl -MEncode -pe'$_=decode('eucjp',$_)'

シェルでがんばるなら
tailf log|while read LINE;do echo $LINE|iconv -feucjp -tutf8;done


iconvにnobufオプションがほしい

2008年11月21日金曜日

python urllib.urlretrieve で進捗表示しつつダウンロードのメモ

  1. import sys  
  2. import urllib  
  3.   
  4. def _reporthook(blocknum, bs, size):  
  5.     sys.stdout.write("%4d%%\r"%(blocknum*bs*100/size))  
  6.     sys.stdout.flush()  
  7.   
  8. if __name__ == "__main__":  
  9.     uri = sys.argv[1]  
  10.     dest = uri[uri.rfind('/')+1:]  
  11.     urllib.urlretrieve(uri, dest, _reporthook)  
  12.     print  

参考: http://subtech.g.hatena.ne.jp/cho45/20081120/1227178806
http://blog.livedoor.jp/dankogai/archives/51141631.html
printfやputsはflushいらんの?
pythonはprintでもダメだった
よくわからない

2008年7月30日水曜日

傷んだ野菜は大嫌い

http://mono.kmc.gr.jp/~yhara/d/?date=20080730#p01
天才発見。
帰ったら即、携帯メール=>Gmail=>iCalのPyhabuプラグインを書く。
収納場所も書けるかも。
いろいろ応用範囲が広そうだな。
http://codespeak.net/icalendar/
このライブラリは使えるかな?

RTMみたいなあいまいな日付解析ライブラリはないかな。
数値のみ入力可能にして
2桁以下 => 当日以降でもっとも近いn日
4桁以下 => mmdd
5桁 => Ymmddで、Y年後のmmdd
6桁以上 => YYmmdd
が妥当かな。
5桁を入れるか悩ましい。

これを機会にレシート打ち込んで家計簿作るかな。
やっぱ面倒だから無理

2008年7月8日火曜日

Djangoとメールサーバ

簡易なSMTPDを作った。
appname/management/commands/smtpd.py
  1. class Command(BaseCommand):  
  2.     def handle(self, *args, **options):  
  3.         daemon_kwargs = {}  
  4.         daemon_kwargs['out_log'] = options.get('outlog''smtp_out.log')  
  5.         daemon_kwargs['err_log'] = options.get('errlog''smtp_err.log')  
  6.         from django.utils.daemonize import become_daemon  
  7.         become_daemon(**daemon_kwargs)  
  8.   
  9.         foo = MySMTPServer((settings.EMAIL_HOST, settings.EMAIL_PORT),  
  10.                 (settings.PARENT_SMTP_HOST, settings.PARENT_SMTP_PORT))  
  11.         try:  
  12.             asyncore.loop()  
  13.         except KeyboardInterrupt:  
  14.             pass  
  15. class MySMTPServer(smtpd.SMTPServer):  
  16.     def process_message(self, peer, mailfrom, rcpttos, data):  
  17.         """ なんか素敵なことをする """  


たった1行でDaemon化できるのが素敵。

2008年7月5日土曜日

数字キーと記号を入れ替える

キーボードカスタマイズの魅力
数字と記号を入れ替えるとは。
思いついたことはあったけど、やっている人がいるとは思わなかった。
窓使いの憂鬱で設定してみたが、使いづらい。
一週間使ってみる。

# SandS SpaceをShiftとして使う。押しっぱなしで取り消し
mod shift += !!space
key R-*Space = &Ignore

# 数字を記号と入れ替え
key _1 = $EXCLAMATION_MARK
key _2 = $QUOTATION_MARK
key _3 = $NUMBER_SIGN
key _4 = $DOLLAR_SIGN
key _5 = $PERCENT_SIGN
key _6 = $AMPERSAND
key _7 = $APOSTROPHE
key _8 = $LEFT_PARENTHESIS
key _9 = $RIGHT_PARENTHESIS
key _0 = BackSpace
key S-*_1 = _1
key S-*_2 = _2
key S-*_3 = _3
key S-*_4 = _4
key S-*_5 = _5
key S-*_6 = _6
key S-*_7 = _7
key S-*_8 = _8
key S-*_9 = _9
key S-*_0 = _0

# via t.masui
key semicolon = Enter
# 右下の\をセミコロンに
key BackSlash = semicolon

2008年6月23日月曜日

ぐぐらんとす

http://satoshi.blogs.com/life/2008/06/post-2.html
回答を、楽をして手に入れることがなぜいけないの?

時代が違うから課題の出し方を変えればいいのに。
ぐぐること前提で、それでヒットすることに対する意見とか。
得られる知識の不備を予測して出題するとか。

出題者がぐぐり不足ではないのかな。
なぜ調べて出てくるようなことを求めるのか。

2008年6月20日金曜日

VimのPythonコメント

vimでPython編集中にコメントを入力しようと"#"を入力すると、行頭にカーソルが移動してしまう。

~/.vim/indent/python.vimに以下を入力すれば、適切な位置でコメントを書ける。

setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except,0#

via http://henry.precheur.org/2008/4/18/Indenting%20Python%20with%20VIM.html

2008年6月11日水曜日

netmask

IPアドレスの制限で、ネットマスクの対応が見つからなかった。
128.255.63.0/24なら
アドレスを16進数に直して80ff3f00と2**24-1<<(32-24) & targetを比較すればいいのかな?

式はいくつか思いつくけど、正攻法はどんなものだろうか。
  • 2**32-(1<<32-m)
  • 2**m-1<<32-m
  1. def ip_valid(addr):  
  2.   for s in IP_RANGE:  
  3.     t = s.split('/')  
  4.     if len(t) == 1:  
  5.       ip = t[0]  
  6.       mask = '32'  
  7.     else:  
  8.       ip = t[0]  
  9.       mask = t[1]  
  10.     mask = int(mask)  
  11.     n = ip2num(ip)  
  12.     if ip2num(addr) & 2**32-(1<<32-mask) == n:  
  13.       return True  
  14.   return False  
  15.   
  16. def ip2num(ip):  
  17.     n = 0  
  18.     for i in ip.split('.'):  
  19.         n <<= 8  
  20.         n += int(i)  
  21.     return n  
  22.   
  23. IP_RANGE = [  
  24. '210.153.84.0/24',  
  25. '123.108.237.9',  
  26. '202.179.204.0/24',  
  27. '61.202.3.0/24',  
  28. ]  

2008年6月3日火曜日

sqldiffが非常に便利
./manage.py sqldiff appname
とすると、DBとappname/models.pyの相違を表示してくれる。
今まで、models.pyを変更すると差分がつかみづらい部分があったのでこれは便利。
Migrationまでの道のりは遠いけど。

DBMigrationが使えればもっと便利なんだろうけど、とりあえずはこれでOK。