2008年12月7日日曜日

Guido's new method definition idea

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

最近のホットな話題

class C:
def self.method( arg ):
self.value = arg
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 で進捗表示しつつダウンロードのメモ


import sys
import urllib

def _reporthook(blocknum, bs, size):
sys.stdout.write("%4d%%\r"%(blocknum*bs*100/size))
sys.stdout.flush()

if __name__ == "__main__":
uri = sys.argv[1]
dest = uri[uri.rfind('/')+1:]
urllib.urlretrieve(uri, dest, _reporthook)
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

class Command(BaseCommand):
def handle(self, *args, **options):
daemon_kwargs = {}
daemon_kwargs['out_log'] = options.get('outlog', 'smtp_out.log')
daemon_kwargs['err_log'] = options.get('errlog', 'smtp_err.log')
from django.utils.daemonize import become_daemon
become_daemon(**daemon_kwargs)

foo = MySMTPServer((settings.EMAIL_HOST, settings.EMAIL_PORT),
(settings.PARENT_SMTP_HOST, settings.PARENT_SMTP_PORT))
try:
asyncore.loop()
except KeyboardInterrupt:
pass
class MySMTPServer(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data):
""" なんか素敵なことをする """


たった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

def ip_valid(addr):
for s in IP_RANGE:
t = s.split('/')
if len(t) == 1:
ip = t[0]
mask = '32'
else:
ip = t[0]
mask = t[1]
mask = int(mask)
n = ip2num(ip)
if ip2num(addr) & 2**32-(1<<32-mask) == n:
return True
return False

def ip2num(ip):
n = 0
for i in ip.split('.'):
n <<= 8
n += int(i)
return n

IP_RANGE = [
'210.153.84.0/24',
'123.108.237.9',
'202.179.204.0/24',
'61.202.3.0/24',
]

2008年6月3日火曜日

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

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