Twisted勉強中 パート1: さあ、はじめましょう
パート1: さあ、はじめましょう
http://skitazaki.appspot.com/translation/twisted-intro-ja/p01.html
同期モデル、スレッドモデルと比較しながらの非同期モデルについての説明。基本的なところから説明してくれるのはとても助かる。画像付きで分かりやすい。各モデルについてはドキュメントで説明されているので省略。
このパートで重要な個所は、非同期モデルが性能を発揮できる条件。
1.大量のタスクがあり、ほとんど常に少なくともひとつは進められるタスクがあるとき。
2.タスクが大量の入出力をさばき、他のタスクが実行できるかもしれないのに、同期プログラムがブロックして大量に時間を無駄にさせてしまうとき。
3.タスクがお互いに独立で、タスク間の通信がほとんど必要ないとき。(それゆえ、あるタスクが他のタスクを待つ必要がない)
要するに
各モデルの使いどころをしっかりと見極めること
が大切だってことかな。効率がいいからとなんでもスレッド、なんでも非同期はダメ。「金槌しかもっていないと、すべてのものが釘に見える」と言うしね。
処理モデルの使い分けについて
- 上記の条件の1番がNOである場合
- すべてのタスクが順序通りに実行されなければならない場合と考えられるので、同期モデルが適切。
- 1番がYESでも2番がNOの場合
- I/O処理ではなくCPU処理が重い場合と考えられる。この場合、CPUがシングルコアであれば同期モデル。マルチコアであればスレッドモデルが適切。
- 1番2番がYESでも、3番がNO
- つまりタスク間で協調が必要な場合と考えられる。この場合はスレッドモデルが適切。
- 全ての条件がYESの場合
- 非同期モデルが適切。
こんな感じだろうか。まだタスク間の協調っていうのが具体的にどんな処理に当たるのかはいまいち分かってないんだけど…。並列処理も要勉強。
ネットワークサーバーの実装は非同期モデルにとって最も当てはまりやすく、それゆえに Twisted は何と言ってもネットワークのためのライブラリなのです。
なるほど。
参考になった資料
第10回InfoTalkの開催報告
http://pk.aiit.ac.jp/index.php?InfoTalk%2F20090918%2FReport
アリエル・ネットワークの大谷さんが作った資料がとても分かりやすかった。パート1の範囲だと、10ページ目くらいまで読めばいいかも。動画もあるので後で見てみよう。
このInfoTalkっていうのは初めて知ったけど、他にも色々と面白そうな内容やってるので時間があったら他のも見ようかな。
Twistedに入門しました
仕事でとあるバッチ処理を書いたことがきっかけで、最近Pythonの並列処理について調べはじめて、今まで手を付けたことが無かったけどなかなか面白いもんだなあと思っていた。並列で処理をすべきなのはI/Oバウンドなプログラムだそうだ。I/Oが発生するプログラムの代表格というとネットワーク経由で通信するようなプログラム。ということで、これまたまったくの未経験であるネットワークプログラミングにちょっと興味が出てきたのだ。
Twistedの名前だけは知っていて、Pythonの非同期プログラミングライブラリで、ネットワークサーバやクライアントが書けるらしい。くらいの知識だった。で、ネットワークプログラミングやってみるついでに非同期プログラミングについても勉強すれば一石二鳥じゃね?ということでTwisted入門することにした。
教材
入門として良さそうな、しかも日本語訳されているドキュメントがあったので、これを読みながら進めることに。
Twisted入門
http://skitazaki.appspot.com/translation/twisted-intro-ja/index.html
もうちょっとアウトプットしないといかんなあと思っていたところなので、これ読んで勉強したことをブログに書いていこうと思う。最後まで頑張りたいところ…。
とりあえずパート3の途中までは読んだので、そのうちまとめ終わったところから上げていく予定。
最初で最後のPython温泉に参加してきた
@voluntas さん主催の 第10回Python温泉 に参加してきました。今回が最終回です。参加者29人のうち、初参加は自分ともう一人の方だけというから、リピーター率半端ないですね。
Python温泉に参加した経緯をちょっと説明。Pythonは何年か前から個人的なスクリプトを書くのにちちまちま利用していまして、Pythonの技術情報を検索するときたまにヒットしていた為「Python温泉というナニヤラ奇妙なイベント」があるというのは認識していました。もう少しまともに使えるようになりたいと思ったのが半年前程で、ちょうど最終回の参加者を募集していたのを目にして、勢いで参加を申し込みました。ちなみに、これ以前は勉強会などコミュニティ系のイベントには一切参加したことがありませんでした。
補欠枠だったので参加できないかなーと思ってたけど、事前にキャンセルが出たおかげで参加できることになりました。実のところ、参加できると連絡を受けたときには迷いました。「常連はすごそうな人たちばっかりなのに、自分のようなPython初心者と言っていい人間が参加してもいいものか…」とかそんな感じ。ついでに言うとかなりの人見知りということもあり。
結局、事前に会ったことがある人が参加していたのと、このエントリを読んだりしたことで後押しを受けて参加することに決めました。
あと、Python温泉に申し込んだことをきっかけに、PyConJP 2011を始めPython系のハッカソンだとか勉強会に参加しはじめて、その中で知り合いができたりしたことも影響あるだろうなあ。
ぐだぐだと書きましたが、参加した感想は「楽しかった」です。運営に携わった方々、参加者のみなさん、ありがとうございました!
感想
- よかったこと
- Twitterアカウントと顔が一致する人が増えた
- ロビーでとんでもなく面白い話が聞けた
- 並列処理についての基本的な部分が少し理解できた
- 悪かったこと
- 準備不足(PCが立ち上がらなかった, ACアダプタ忘れた)
- ネコに遭遇できなかった
- 座り過ぎで尻が痛くなった
活動報告
1日目
- 会社上がって直行。小田原駅のコンビニで買い物してたら電車を逃して予定より1時間遅れて22:30頃に旅館に到着。
- 前日の夜3時までかかってMacBook AirにインストールしたUbuntuが起動しないというトラブル発生。
- @rokujyouhitoma にMacOSのインターネット復元を教えてもらう。
- 数回チャレンジするが復元はうまくいかず。(原因は家帰ってから判明)
- 初参加で緊張してたり、到着が遅れたり、PC動かなかったりして、この日はかなりいっぱいいっぱいだった。
- 慌ててコンビニにUSBメモリを探しに行こうとする。(AM2:00)
- ロビー組に諭されて、とりあえずこの日は寝ることにした。
2日目
3日目
- この日の朝はおかみさんではなく、館内放送が流れて起きた。
- PySpa缶バッジをGET。Githubステッカーが欲しくて争奪戦に参加するも最後の一対一で敗れる。
- 旅館を出た後にみんなで集合写真。(写真はこちら)
- 人生初のグリーン車に乗って帰宅。
Macのインターネット復元についてのメモ
MacOS X Lionにはインターネット経由でOSを再インストールする機能がある。
インターネット復元の概要
command + R を押しながら電源入れると、復元用HDから起動するか、それが無い場合はインターネット復元のプロセスが始まる。
インターネット復元は、名前の通りインターネット経由で復元システムをダウンロードし、それを使ってMacOSの再インストールが可能。
ダウンロードの通信には有線、無線どちらも使える。
復元システムのダウンロードが完了するとインストールウィザードが起動するので、基本的にはそれにしたがって手続きを進めればよい。
ハマったところ
MacBook AirにはUbuntuをインストールしていたが、その過程ですべてのパーティションをLinux向けのファイルシステムでフォーマットしていた。
インストールウィザードの手続きでOSのインストール先の領域を選択する必要があるが、Mac向けのファイルシステムでフォーマットされた領域しか表示されない。その為、インストール先の選択肢に何も出てこなかった。
こういうケースではウィザードに入る前にディスクユーティリティを使ってMac用にフォーマットし直す必要がある。(ディスクユーティリティは復元システムの一部として提供されている)
tweepyで2-legged OAuth
twitter連携するアプリケーションを書いてみようかと思ってちょっと試してみたのでメモ。
tweepyを選んだのはこのページで強調されてたのでメジャーなのかなあと思ったから。
https://dev.twitter.com/docs/twitter-libraries
コード
アプリケーションの登録だとかaccess tokenの発行だとか諸々の手続きを先にやっておく。
>>> import tweepy >>> consumer_key = "xxxxxxxxxxxxxxxxxxx" >>> consumer_secret = "xxxxxxxxxxxxxxxxxxx" >>> access_token = "xxxxxxxxxxxxxxxxxxx" >>> access_seecret = "xxxxxxxxxxxxxxxxxxx" >>> handle = tweepy.OAuthHandler(concumer_key, concumer_secret) >>> handle.set_access_token(access_token, access_secret) >>> api = tweepy.API(handle) >>> api.update_status("tweet from script") <tweepy.models.Status at 0xa8de8cc>
tweet from script
参考URL
ほぼここのコードを利用。
http://blog.kzfmix.com/entry/1266577646
これに引っかかったのでntpdate入れた。
http://d.hatena.ne.jp/jonki/20110211