2011年7月18日月曜日

collectionsモジュール

EuroPython 2011 のレポートを見て知ったのですが、python 2.7 で Counter というクラスが追加されているんですね。

リスト内の要素数をカウントしたい時、こんな感じで書いていましたが、
>>> cnt = {}
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...     cnt[word] = cnt.get(word, 0) + 1
...
>>> cnt
{'blue': 3, 'green': 1, 'red': 2}

Counter を使うとこんな感じで書けます。
>>> from collections import Counter
>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...     cnt[word] += 1
... 
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})

すっきりしていて、いいですね。

2011年7月3日日曜日

curl がすごく便利

名前は聞いた事があるけれど、使った事がなかったコマンド。
(いまさらだけど)Webアプリケーションの脆弱性チェックなどで、すごく便利だと実感。

チェックしたいWebアプリケーションにPOSTリクエストを色々変えながら、レスポンスを確認したいときに Paros のようなProxyを使うけれど、curl だとコマンドラインで操作できるので、ターミナル上でも手軽に実行できるし、同じことを繰り返す場合も便利。

ログイン画面などで、テストする場合はこんな感じ。

$ curl http://foo.co.jp/login -c cookie.txt
セッションIDがCookieに保存される場合は、一度ログインページを表示してCookieの内容をファイルに保存。

$ curl -v http://foo.co.jp/login \
    -d username=guest -d password=guest \
    -b cookie.txt -L
そして、POSTを送ってログインを試みる。フォームの送信は -d オプションで指定。また、先ほど取得したCookieを -b オプションで一緒に送信。POSTが成功した場合、リダイレクトで別のページに遷移することが多いので、-L を指定しておくとブラウザの動作に近くなります。HTTPのリクエスト/レスポンスが見たい場合は -v も指定。

あとは、SSLのページでも Ubuntu などでパッケージから curl をインストールすると主要な証明書も一緒にインストールされているから問題なし。
これから、どんどん使っていこう。