Archive@2008/01
Twitter Updates for 2008-01-31
- オライリーの実践パケット解析を買ったのでWiresharkをMacPortsで入れてるんだけど、実用レベルではない遅さ。30分くらいはかかりそうだなあ。 #
- MacPortsって遅いものなんでしょうか。それともPPCが・・・ #
Powered by Twitter Tools.
- Posted at:
- 2008/01/31 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/31/twitter-updates-for-2008-01-31/trackback/
DjangoのQを使ってTwitterのタイムラインっぽいもの
前回はManyToManyを使ってFollowingとFollowersあたりを作ったんですが、 今度は、マイページのタイムラインを作ってみようかと思います。 マイページのタイムラインっていうのは、自分がFollowしてる人の発言と自分の発言を一緒に並べて表示するものです。 で、前回Followingを実装したので、 [python]user.get_profile().contacts.all()[/python] で自分(ここではuserは自分を表します)がFollowしてる人たちがとれました。 今度はPostという発言を管理しているクラスがあるので、照らし合わせて必要なPostだけを抽出しないといけません。 まず、Postクラスはこんな感じ。 [python] class Post(models.Model): user = models.ForeignKey(User) message = models.CharField(u'ひとりごと', max_length=150) posted_at = models.DateTimeField(default=datetime.datetime.now()) [/python] Userクラスへのリレーションとメッセージと投稿時間があるシンプルなクラスです。 とりあえず考えつくのは、Post.objects.all()で全部データ持ってきてそっからFollowしてる人のだけを抜き出す っていうことなんですけど、データが1億件あったり100万人Followしてたりすると困るので、 効率のよさそうなことを考えたいものです。Q オブジェクトを使った複雑な照合 filter() などで複数のキーワード引数を指定してクエリを行うと、各々のキーワード引数の表す照合条件は違いに "AND" で結ばれます。より複雑なクエリ (例えば OR を使ったクエリ) を実行する必要がある場合には Q オブジェクトを使えます。ということなんですが、こんな感じで使ってみました。 [python] from django.db.models.query import Q contacts = user.get_profile().contacts.all() # 自分がFollowしてる人たちを取り出す query = Q(user=user) # まずは自分が入っているという条件を入れる for contact in contacts: # Followしてる人たちを一人ずつ条件に追加 query |= Q(user=contact.user) # 「|=」って初めて使った Post.objects.filter(query)[:100] # Followしている人たちでしぼったPostを100件取得 [/python] こんな感じで動いてます。でも100万人いなくても1000人くらいFollowしてたらきついよなー。 大規模開発経験とかないにわかプログラマなのでこういうあたりが大変弱いです。
- Posted at:
- 2008/01/31 02:14:38
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/31/django_q_twitter_timeline/trackback/
Twitter Updates for 2008-01-30
Powered by Twitter Tools.
- Posted at:
- 2008/01/30 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/30/twitter-updates-for-2008-01-30/trackback/
Twitter Updates for 2008-01-29
- @tokibito おめー。いいなーわかいなー #
Powered by Twitter Tools.
- Posted at:
- 2008/01/29 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/29/twitter-updates-for-2008-01-29/trackback/
DjangoでISO-2022-JPなメール送信
この話って一時期Lingrのdjango-jaでも話題になってましたけど、 今は普通にエンコードを指定できるようになってるんですね。 [追記:2008/03/04] soundkitchen氏からのコメントのとおり、全然指定できるようになっていませんでした。 運良く化けない端末で受信していただけでした。早く使えるようになるといいなあ。 登録完了メールだとかコメントがあったときのメールだとかのあたりで使ってみました。 メールの本文とタイトルはテンプレートファイルを用意して変更しやすいようにしました。 ちょっとアクティベーションメールを送るあたりのコードを。 [python] from django.core.mail import SMTPConnection, EmailMessage from django.template.loader import get_template from django.template import Context def create_inactive_user(request): """create an inactive user and send a email including activation key""" ### (略)formをバリデートしたり、new_userを作ったりしてとりあえずnew_user.is_activeをFalseにする ### タイトルが書いてあるテンプレート t = get_template('email/registration_subject.txt') ### 末尾の改行は消しておく(これContextいらない場合も指定しないとだめかな?Noneとかでいいかな) subject = t.render(Context({})).rstrip('\n') ### 本文が書いてあるテンプレート t = get_template('email/registration_body.txt') ### テンプレートにはユーザー名とかアクティベーションキーを入れます c = Context({ 'user': new_user, 'activation_key': activation_key }) body = t.render(c) to = [new_user.email] ### settings.pyで指定した送信サーバとポートを使うようにする ### デフォルト(localhostの25番)でいい場合は、ここいらないかも connection = SMTPConnection() connection.host = settings.SMTP_HOST connection.port = settings.SMTP_PORT ### EmailMessageインスタンス作成 email = EmailMessage( subject=subject, body=body, from_email='送信元のアドレス', to=to, #bcc=[], connection=connection, ### デフォルトの場合これもいらない #headers={} ) ### ここでエンコーディングをISO-2022-JPに email.encoding = 'ISO-2022-JP' ### あとは送るだけ email.send() ### (略)成功したらリダイレクトしたりする [/python] まあ、こんな感じで今のところちゃんと動いてます。 コードへの突っ込みを歓迎しています。- Posted at:
- 2008/01/29 23:30:27
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/29/django_jis_email/trackback/
Twitter Updates for 2008-01-27
- WordPressが頼んでもないのに<user>を</user>とかってつけて閉じる。迷惑です。 #
- @issm 完璧です。感動です。ありがとうございます! #
- @nksm 今週はいまのところいつでも大丈夫です。 #
- @nksm よろしくおねがいしますー #
- @soundkitchen 勢いが持てばwCocoaブームなのでモチベーションがもってかれますw #
- @voluntas いきたいんだけどなー #
Powered by Twitter Tools.
- Posted at:
- 2008/01/27 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/27/twitter-updates-for-2008-01-27/trackback/
DjangoのManyToManyFieldでTwitterのFollowingとFollower
これいいなぁ - Twisted Mind という発言を受けまして、調子に乗ってオープンソース化しようと思って作り直してます。 以前は95%くらいGenericViewsを使ってたんですが、今回は95%くらいviews.pyを書いてます。 で、ついさっきひっかかったとこをメモっておきます。 TwitterにはFollowingとFollowerという概念がありますが、これの実装の為に以下のようなmodels.pyを書きました。 ちなみに、このAccountクラスは、settings.pyでAUTH_PROFILE_MODULEとして設定されています。 [python] # 実際のソースは他にもフィールドがあります class Account(models.Model): user = models.ForeignKey(User) contacts = models.ManyToManyField('self') [/python] ManyToManyFieldにselfを指定すると自分(Account)を複数持つフィールドができます。 ちょっと追加してみます。 [python] >>> from django.contrib.auth.models import User >>> user1 = User.objects.get(pk=1) >>> user2 = User.objects.get(pk=2) >>> user1 >>> user2 >>> user1.get_profile().contacts.add(user2.get_profile()) #hfunaiがuser1をfollowする >>> user1.get_profile().contacts.all() #followしている人を表示してみる [] # さっき追加したuser1が入ってる >>> user2.get_profile().contacts.all() #user1がfollowしてる人を表示してみる。 [] #user1はhfunaiを追加してないのにhfunaiが入ってる [/python] これはhfunaiが寂しがりやなので自分がfollowした人にはfollowしてもらいたいという機能を 実装しているわけではなく、ManyToManyFieldのデフォルトではこうなるみたいです。Django がこのモデルを処理する際、自分自身に対する ManyToManyField が定義されていることを認識して、 Person クラスに person_set 属性を追加しないようにします。その代り、 ManyToManyField を対称的 (symmetrical) であるとみなします。すなわち、私があなたの友達なら、あなたは私の友達である、というようにです。 self に対する ManyToMany の関係に対称性を望まない場合は、 symmetrical を False にしてください。これにより、 Django に逆参照用のデスクリプタを追加させ、 ManyToMany を非対称にできます。 モデル API リファレンス : Django オンラインドキュメント和訳 : 多対多のリレーション http://michilu.com/django/doc-ja/model-api/#id17マニュアルにちゃんと書いてありました。 models.pyを書き換えてみましょう。 [python] # 実際のソースは他にもフィールドがあります class Account(models.Model): user = models.ForeignKey(User) contacts = models.ManyToManyField('self', symmetrical=False) [/python] [python] >>> from django.contrib.auth.models import User >>> user1 = User.objects.get(pk=1) >>> user2 = User.objects.get(pk=2) >>> user1 >>> user2 >>> user1.get_profile().contacts.add(user2.get_profile()) #hfunaiがuser1をfollowする >>> user1.get_profile().contacts.all() #followしている人を表示してみる [] # さっき追加したuser1が入ってる >>> user2.get_profile().contacts.all() #user1がfollowしてる人を表示してみる。 [] #hfunaiは入ってない [/python] これでhfunaiは涙目になりましたが、機能としては正しく実装されました。 さてと続きを作ります。
Twitter Updates for 2008-01-26
- 今日はwcan mini actionscriptに行ってきて、じゃんけん大会でflexの本もらっちゃいました #
- それほどflexに興味なかったけど、今日の発表とかみて気になったのでラッキーです #
- というわけでねるぞ #
Powered by Twitter Tools.
- Posted at:
- 2008/01/26 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/26/twitter-updates-for-2008-01-26/trackback/
Twitter Updates for 2008-01-25
- Leopard初期状態ではPILでJPEGが扱えませんでした #
- sudo port install jpeg #
- っていれてもだめじゃーねーかー。jpeg support okになったのに。 #
- このへんかなー http://tinyurl.com/yqzjzy #
- 明日はハードな一日なので寝る #
- あ、buildディレクトリとインストール先のディレクトリ削除して、build&installをし直したら使えるようになりました。 #
Powered by Twitter Tools.
- Posted at:
- 2008/01/25 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/25/twitter-updates-for-2008-01-25/trackback/
Twitter Updates for 2008-01-22
- ipod touch指5本認識してくれるのかーなんかいろいろできそうな予感 http://d.hatena.ne.jp/kstn/20080119/1200737860 #
- Athlon XP 3200+高いなあ #
- ヤフオクでもAthlon XPは人気っぽいなあ #
Powered by Twitter Tools.
- Posted at:
- 2008/01/22 23:59:59
- 0 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/01/22/twitter-updates-for-2008-01-22/trackback/