Pythonの最近のブログ記事

 以前、「Twitterクライアントで名前だすしくみ、どうやってんだろう」と思って、軽く Pythonで書いて放置してたけど、OAuthで困ってる人が私以外にもおられるよーなので、さらしてみます。
 ただし、テキトーにやったので妙なことあるかもしれません。そこは気にせずどーぞ!(まぁ軽く軽く)

■ はうつー作成 twitter desktop client(全自動版) ■ 

 必要なものは twitter.comに client登録したときのメールにだいたい書いてあります。

  • Consumer key
  • Consumer secret
  • ログインするための自分のアカウント(当然ですね)

 これだけを元に、一気に自作クライアントで TL取得&発言できるところまでもっていきます。
で、その sample code(Python)はこちら。twitapi_test.py 

 ちなみに、oauth, simplejson, BeautifulSoupを easy_installしておいてください。本当に必須なのは oauthぐらいなもんですが。

● この sample codeの 動作手順 ●
  1. Request Token URLに対して、Consumer Key,Consumer Secretに HMAC_SHA1でサインしたリクエストを投げます。
    URL(get_unauthorized_request_token): https://twitter.com/oauth/request_token?oauth_nonce=XXXXXXX&oauth_timesta mp=XXXXXXXXX&oauth_consumer_key=(もらったConsumerKey)&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oaut h_signature=XXXXXXXXXXXXXX

  2. その返事として、oauth_token_secret, oauth_token等がかえってきます。
    Token(authorize): oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXX&oauth_callback_confirmed=true

  3. もらった tokenをつかって認証用URLを作成します。
    URL(get_authorization_url): http://twitter.com/oauth/authorize?oauth_nonce=XXXXXXXXXX&oauth_timestamp=XXXXXXXXXXXXXXXXXXX&oauth_consumer_key=(もらったConsumerKey)&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=(さっきもらったoauth_token)&oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXX

  4. その URLでアクセスすると、たぶんログインページに飛ばされるので、とりあえず自分の ID/passをつっこんで submitします。(twitter.comに client申請したときに loginいらないよモードだったら、このへんいらないかも?)

  5. ログインすると、画面に PINコードを表示する HTMLがかえってきます。このへん、desktopではなくサーバー上クライアントで申請するとリダイレクトURLになって返ってくるようですが、今回は無視。

  6. その HTMLから PINコードをバラします。(表示させて入力してもらうのも良いのですが、面倒なので直接ひっこぬきます)
    pin: (7桁くらいの数字)

  7. 最初にもらった認証用tokenとさっきもらった PINコード(OAuth的には verifierです)をつかって、TL見たり書きこんだりするためのアクセス用tokenを発行してもらいます。
    URL(access_token): https://twitter.com/oauth/access_token?oauth_nonce=XXXXXXXX&oauth_timestamp=XXXXXXXXXXX&oauth _signature_method=HMAC-SHA1&oauth_consumer_key=(もらったConsumerKey)&oauth_verifier=(ひろったPINコード)&oauth_version=1.0& oauth_token=(さっきもらったoauth_token)&oauth_signature=XXXXXXXXXXXXXXXXXXXX

  8. アクセス用tokenを取得。最初にもらった認証用tokenのことは忘れます。
    Token(access): oauth_token_secret=XXXXXXXXXXXXXXXXXXXX&oauth_token=XXXXXXXXXXXXXXXXXXXXXXXX

  9. あとは、適当にTwitter API referenceにのってる URLにアクセスしてやれば ok。読み書き自由な感じです。
    URL(home_timeline): http://twitter.com/statuses/home_timeline.json?oauth_nonce=XXXXXXXX&oauth_timestamp=XXXXXXX&oauth_signature_method=HMAC-SHA1&oauth_consumer_key=(もらったConsumerKey)&oauth_verifier=(ひろったPINコード)&oauth_version=1.0&oauth_token=(アクセス用token)&oauth_signature=XXXXXXXXXXXXXXXXXX

● 大切なこと ● 
 だいたい2つ。

  • 認証用トークンと、アクセス用トークンは別もの。
  • 何かするたびに、HMAC-SHA1でサインかけたリクエストで、GET/POSTする。

これさえ守れば、あとは適当にいけるかなと思います。
いじょ。

Scons, Scons, おいしいScons

| トラックバック(0)
 カリッとサクッと。
最近、自前project用に Sconsをおためし中。Makefileを書くよりは楽かなー。なんせ、単純に hello.cを compileするだけだと、設定ファイルSconstruct(Makefileのかわりね)に
Program('hello.c')
とか書くだけ。めっちゃsimple。antもいいんだけどね。でも手書きは面倒なので Sconsを try。

例えば、ちょいと Squirrelの codeを書くときなら
% cat SConstruct
env = Environment( CC='gcc-4.2', CCFLAGS='-O2', CXX='g++-4.2' )
env['BUILDERS']['Squirrel'] = Builder( action='sq -o $TARGET -c $SOURCE', suffix='.cnut', src_suffix='.nut' )

cpp_files = [ 'test.cpp' ]
lib_files = [ 'sqstdlib', 'squirrel' ]

env.Squirrel('test.nut')
env.Program('mytest', cpp_files, LIBS=lib_files )
という感じで書ける。これを実行すると、
% scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++-4.2 -o test.o -c -O2 test.cpp
g++-4.2 -o mytest test.o -lsqstdlib -lsquirrel
sq -o test.cnut -c test.nut
scons: done building targets.

 判りやすい設定ファイルになるのと、ややこしい ruleを書くときに普通に Pythonで書けてしまうのが魅力かな。普通に単一環境とか on unixで書くにはあまり魅力はないんだけど、特殊なターゲットやらツールやら外部アクセスやらを全部一発でさせようと思うと悪くないかなと。
 なんでかってーと、継続的インテグレーションを公私共に導入していきたいなーという表れなのでした。

 そろそろ iPhone2.0の$99版も公開されるしね〜。備えておきたいのさ(笑)

SubversionからMercurialへ。

| トラックバック(0)

 時間がかかりましたorz
何やってたかというと titleどおりなんですが、rubyの repositoryをまるっと mercurial用に変換してみたのでした。

 先日、ircで rubyの repositoryを hg convertするとうまくいかないという話を聞き(というか読み)、じゃあ最近 hgつかってるから debugにいいかな〜と思ってチャレンジしてみたわけです。
 最初、hg convert http://svn.ruby-lang.org/repos/ruby/trunk ruby だけしてみた時はすんなり動いたので報告してみると「trunkだけでは足りない」って御言葉が。というわけでじゃあ単純にでかくなるだけだろーと思って始めてみたわけですが。

 時間がかかるので放置していたら、

hgext/convert/subversion.py: libsvn._core.SubversionException: ('child raised exception', 175002)
とかなんかで .pyが例外で落ちてるわけです。しかも普通に cPickle.load(stdout)してるだけなんですな。こりゃ実は何か隱れた bugか?と喜んで(喜ぶなよ)今度は(片手でFFXIやりながら)画面をみていると、swapがごりごりいってるわけです。で、はたと。cPickleさんがコケるのはもしやして memoryまわりか?と。
 そんでまぁ適当に使わない applicationおとして試してみてもまだmemory fullになる。こりゃ実は memory eatで暴走か?とかおもって出来る限り memoryをあけて(OSXで1.7GBあけてみた) try. すると最大1.6GBちょい(本当にギリギリ)を時々消費してるんですな。なにか sortか searchかしてるんでしょう。ぐわっと heapとって見てはまた数十MBにもどり、また1GB over食っては戻り、を繰り返して今度はなんとか passしそうな感じに。

 で。それを一晩放置して朝おきて。まだおわってないので放置して晩になり。とだいたい丸1日消費して、hg convertは無事おわったのでした。 hg logも hg clone --revも動いたので、まぁひっぱるのはokかな?
 そんな感じで、Subversionから Mercurialへ hg convertをする場合、空きメモリには要注意してくださいという話でした。Python+swigでメモリ不足なことって初体験だったわけですが、良い回避or検出方法ってないものですかね。

Stackless Pythonって。

| トラックバック(0)
 先日かってきた SoftwareDesign 2008/05。その Python conference 2008の記事をみていて面白そうなものを発見。
 それが Stackless Python。まぁ簡単に言えば Erlangくさい another Python(笑)

 とりあえず、download and installはして sample動かしたり過去のブツを動かしたりで互換性とかは問題なさそーだなーという感じ。wxPythonとかも普通に動くので安心。
まぁ、単純に stack overflowを防ぐだけなら CPythonのままでも 'from itertools import ifilter' とか使えば解決するんだけど、細かいものをウジャウジャ動かすのが楽というのもまた良い。というか、networkで複数 connectionで処理かましながら、同時に GUIや local storageをつついたり、とかを書こうとすると多少なりとも面倒だったりするわけで、それを楽にできるのならいいなぁと。
 まぁ HiPE@erlangが OSXでも普通に動いたりすると幸せなんだけど、どうも面倒そうなので Stackless Pythonは悪くなさそーだなーと。あまり環境依存してなさそーだし。

 ところで資料みてたりすると、ネトゲである所の EVE Onlineが Stackless Python使ってるそうなんですな。面白い。そういうところで開発コストと信頼性を確保してるんだな〜と納得。
 まだ入れていじりだした所なので、何がどうとかいうわけでもないけど、cometdとかの真似やらせると得意そうだし、ちょいと興味が。まぁ fiber実装の良い使い道の1つとして勉強もしたいですしね。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちPythonカテゴリに属しているものが含まれています。

前のカテゴリはMacです。

次のカテゴリはRubyです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。