pythonでループがスコープはみ出す件はいつ直るんだ?

むしろ意図的なのだろうか。

Python3では、リスト内包表記のスコープ漏れ出し問題が解決している:

x = 'string'
a = [x for x in (1, 2, 3)]
print(x) # 'string'

Python2.xまではx=3だった。

だけど、普通のforの場合には相変わらずもれる。まあ速度の問題が大きいんだろうけど。

x = 'string'
for x in (1, 2, 3):
    pass
print(x) # 3

まあ何が言いたいかって言うと、forループに使う一時変数の名前は良く考えてつけましょうってこと。
例えば私は'i'だけはfor以外では使わないようにしている。

逆にk,vとかは辞書絡みで結構適当につかっちゃってるので見直さないとなー。幸いまだ問題にぶつかって無いけど。

GoAruna

ここから登録すると250MBボーナスがもらえます(私ももらえます)

こちらは同期サービスではなく、オンラインストレージサービスです。2GB無料で使えます。
オンラインストレージなので、ファイルサイズ上限100MB, 月転送量?1GBまで。

メール添付によるアップロードに対応します。

また、iOSアプリ単体でURL指定のダウンロード内製ブラウザを使ったダウンロード、アップロードができます。
URLアップロードが出来れば最高だったんですが。

私はiOS単体で完結できる外部ストレージ用としてまずは使ってみようかと考えています。アプリも安定してるし。

他にもBox.netとか、論文管理が出来るMendeleyとか、Evernoteにファイル添付とかありましたが、とりあえず様子見。

Mendeleyはよさげなんですがフリープランが500MBと少なめなところがネックなんですよねー。まあテキスト主体のものなら1MBいかないから大丈夫かな。。。こちらも使ってみたらレビューします。


あと、iPad運用をする時にmemopalとその公式アプリは地雷です。アップロードできないし、OpenInすらできない。

SugarSync

ここから登録すると500MBボーナスがもらえます(私ももらえます)

Dropboxとほぼ同じサービス内容で、5GBまで無料です。

Dropboxに比べて有利な点は無料で使える容量が大きめ(5GB)な点、メール添付でのアップロードがデフォルトでできる点、同期するフォルダが細かく選べる点でしょうか。

その反面、Dropboxに比べるとやや複雑、Windowsクライアントがやや重い気がする(私の感覚ですが)点。

GoodReaderは対応しています。

私は写真のバックアップに使っています。容量でかいし。

Dropbox

ここから登録すると250MBボーナスがもらえます(私ももらえます。そういうのが嫌じゃ無い人はぜひ。)

はじめに使うならこれ一択。無料で2GBまで使える、オンラインファイル同期サービス。

複数マシンの特定フォルダと、オンラインストレージとを同期させる事ができます。
つまり、オンラインでも参照できるし、複数マシンのファイル同期もできます。

色んなAppがDropbox連携を打ち出しているのでiOSと親和性が高い。また、クライアントも使いやすい。

私はとりあえずPCでバックアップしておきたい小さいファイル、主にソースコードやスクリプトを置いています。

iPadで運用するときの一番のネックは、iPad上からDropboxにURLを直接アップロードする術が無いこと。
PCの場合はダウンロードすれば勝手に同期するんですが、iPad上でダウンロードせずにアップだけしておきたいって場合に困ります。

GoodReaderを持っている方は同期ができるので、ダウンロードすればいいんですけどね。但しこのアプリは有料。

e-mail添付とかは第3者サービスを使えばできるんですがねー。

参考リンク

Dropboxを有効活用するためのネタまとめ 仕事の効率化にどうぞ - WEBマーケティング ブログ

chromeに乗り換え

先日、メインブラウザをFirefox4.0から
Chromeに乗り換えました。
理由はいくつかあるけど、Firefoxが何故か起動しっぱなしにしているとメモリ消費が勝手に上がっていくのが一番。決め手はSpringpadのエクステンションがあったから。

まあ、まだまだかゆいところに手が届かない部分もありますが。特にKeysnailが無くてemacs キーバインドが快適にできないので、何とかxkeymacsでごまかしています。

pythonで直積、順列、組み合わせ

標準ライブラリのitertoolsモジュールにありました。
但し、python2.6から。

>>> list(itertools.product('ABC', 'abc')) # 直積
[('A', 'a'), ('A', 'b'), ('A', 'c'), ('B', 'a'), ('B', 'b'), ('B', 'c'), ('C', 'a'), ('C', 'b'), ('C', 'c')]
>>> list(itertools.product('ABC', repeat=2)) # repeatは'ABC'の繰り返し数
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
>>> list(itertools.permutations(range(3))) # 順列
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
>>> list(itertools.permutations([0,0,1])) # 要素の値の重複は気にしない
[(0, 0, 1), (0, 1, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (1, 0, 0)]
>>> list(itertools.permutations(range(3), 2)) # 2要素取り出す
[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
>>> list(itertools.combinations(range(3), 2)) # 3つから二つ取り出す組み合わせ
[(0, 1), (0, 2), (1, 2)]

調べればあるもんだなあ。特に多重ループを簡単にiteratorで置き換えられるのは便利。
つまり、

>>> for x in range(3):
...     for y in range(3):

for x,y in itertools.product(range(3), repeat=2):

に置き換えられる。こっちのほうがコードがすっきりする。
応用として、

for x,y in itertools.permutation(range(3), 2): # 行列の非対角要素にアクセス
for x,y in itertools.combination(range(3), 2): # x < y の要素にアクセス

なんかもできる。