Python」カテゴリーアーカイブ

Pythonで/dev/urandomから乱数をゲットしてみた

Pythonで暗号論的に正しい乱数を取得する必要があったので/dev/urandomから乱数を取得してみた。
最初からos.urandom()なんてそのものズバリな関数があるので、こいつを使うぜ。
試しに128ビットの乱数を取得してみた。

>>> import os
>>> random128bitdata = os.urandom(16)
>>> random128bitdata
'\x19\x96\xfe\xd5J\xf7\xd1\xb1B|Y\xbd\xe01\xe2\xdd'

うむ、取得成功。

ちなみに16進表記にしたければbinasciiモジュールで変換すると便利。

>>> import binascii
>>> binascii.hexlify(random128bitdata)
'1996fed54af7d1b1427c59bde031e2dd'

さらに、文字列でなく数値で欲しいならこんな感じで。

>>> int(binascii.hexlify(random128bitdata), 16)
34014713054242549678150113052966642397L

そう、int()の第二引数は基数を指定できるのだ

Pythonで変数の型を知る

コネタ。
Pythonで変数の型を調べたくなったので、調べてみた。
組み込み関数typeを使えばいいみたい。
早速試してみた。

>>> a = 1
>>> b = '1'
>>> c = u'ゆにこーど'
>>> d = [1,2,3]
>>> e = { 'a': 1, 'b': 2 }
>>> f = (1,2,3)
>>> type(a)
<type 'int'>
>>> type(b)
<type 'str'>
>>> type(c)
<type 'unicode'>
>>> type(d)
<type 'list'>
>>> type(e)
<type 'dict'>
>>> type(f)
<type 'tuple'>

やってみたら簡単でしたとさ。

PythonでHMAC-SHA256を扱う

ちょいとHMAC-SHA256を使った簡単なお仕事があったので、Pythonでいじってみた。
HMACってなんじゃなホイという方はRFC2104へどうぞー。
Pythonには最初からHMAC取り扱えるようになっているのでラクチンですよ。

import hmac
import hashlib

secretkey = '秘密鍵'
message = 'メッセージ検証したいなにものか'

signature = hmac.new(secretkey, message, hashlib.sha256).hexdigest()

hmac.new()の第三引数がハッシュ関数なので、MD5にしたいならhashlib.md5とか指定すればよし。
詳しいところは、Pythonライブラリリファレンスのhmacの項を読んでね。

GoogleAppEngineでsimplejson使ってJSONでレスポンス返してみた

GoogleAppEngineで、クライアントにJSONでデータ返そうとして import json とかやったら使えなかった…orz
まあ当たり前で、GoogleAppEngineのPythonは2.5ベースなのでJSONサポートが組み込まれてないのですな。組み込まれるのは2.6以降だったね。すっかり2.6に慣れててすっかり忘れてたよ。
ということで代替案を考えたところ、GoogleAppEngineには最初からDjangoが入ってるからsimplejson使えるんじゃね、と思ってサンプルコード書いてみた。

# -*- coding: utf-8 -*-

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

from django.utils import simplejson

class MainPage(webapp.RequestHandler):
    def get(self):
        test_data = {
            "data1": u"日本語",
            "data2": "ascii",
            "data3": u"長い文字列を入れてみたいと思いましたが力尽きました。",
            "data4": u"テストデータ作るのもめんどくさいですね",
            "data5": {
                "subdata1": u"入れ子データ1",
                "subdata2": u"入れ子データ2",
                },
            }

        self.response.headers['Content-Type'] = 'application/json; charset=utf-8'
        self.response.out.write(simplejson.dumps(test_data,
                                                 ensure_ascii=False,
                                                 sort_keys=True))

application = webapp.WSGIApplication(
    [('/', MainPage)],
    debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

出力結果はこんな感じ。

{"data1": "日本語", "data2": "ascii", "data3": "長い文字列を入れてみたいと思いましたが力尽きました。", "data4": "テストデータ作るのもめんどくさいですね", "data5": {"subdata1": "入れ子データ1", "subdata2": "入れ子データ2"}}

見事にビンゴでしたとさ。

PythonでRSSフィード取得してみた

RSSフィードを使って悪だくみをしようと思い立ち、久しぶりにRSS周りをいじることに。そんでもって、たまにはイマドキの言語で書こうとPythonで書いてみることに。
いろいろGoogle様にお伺いを立てたところ、Pythonではfeedparserを使うのが手っ取り早い模様。
ということで、早速feedparserをインストール。
Ubuntu上でいじっているのでこんな感じ。

$ sudo apt-get install python-feedparser

インストールできたので、Google様にお伺いを立てつつ、サンプルコード作成。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# feedparser のサンプルコード
#

import feedparser

rssurl = "http://d.hatena.ne.jp/calnarsa/rss"
fdp = feedparser.parse( rssurl )
	
for entry in fdp[ 'entries' ]:
    print "Title: ", entry[ 'title' ]
    print "URL: ", entry[ 'link' ]
    print "Description: ", entry[ 'description' ]
    print "Date: ", entry[ 'updated' ]

上のコードを実行してみたら、こんな感じ。

$ ./rss.py
Title:  Bazaarのある生活
Description:  基本的に古いタイプのプログラマなもので、バージョン管理とかメンドクセーとか言い出す奴なのです。 なので、自分しか使わねーソースはバージョン管理無視、あるいはがんばってrcs使えばじゅーぶんじゃん、で済ませるヤローなのですが、さすがにヤバくなってきました。 と
Date:  2010-08-23T16:59:12+09:00
Title:  はじまり
Description:  いまごろになってはじめてみた。 特に意味はない。 ただ思いついただけ。
Date:  2010-08-20T16:34:25+09:00

うん、ちゃんと取れてるね。
上のサンプルコードではRSS1.0形式を想定してるけど、feedparserはRSS1.0, 2.0, Atomに対応している感じ。
RSS2.0は試したけど、このまんまで動いた。ちゃんと検証してないけど。