except でエラーを指定しなかった時にどんなエラーが発生したか見る

try:
    hogehoge()
except:
    print sys.exc_info()[0]

って書こうとしてたら

id:nishiohirokazu 先生に

exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()

ってやるといいよ
[0]は1年後に困る羽目になるから


と教えていただいた!!!

1年後の自分が「なんじゃこりゃ」って言うという意味で
絶対言う、僕なら間違いなく言う。
あと「0番目が何なのかドキュメント見て調べるのめんどい」ともいいそう


すいませんでした><
僕も言うと思うので書き直します!!!

twitter で 60 日以上発言が無い人を remove する

いつのまにやら Twitter に Follow 制限とか出来て
色々な人の発言が見たいのに Follow 追加出来なくなって
コンピュータの癖に人間様の処理能力に制限かけるんじゃねーよと
お怒りのみなさまこんにちは


オープンソースとバザールモデルの御祭に参加出来なくてさみしい僕ですが、
みなさんいかがおすごしですか?


そんなこんなで Twitter にむかついても
「サポートに連絡しても制限解除するつもりはネーYO!!」
と言われてしまいますし、
かといってむかついたままなのも精神衛生上良くないので
60 日以上発言の無いユーザを remove するスクリプト書きますた。


pit と simplejson が入ってれば動くはずですwwww

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, simplejson, urllib2, urllib
from pit import Pit

class TwitterClone(object):
    def __init__(self, user, passwd,url):
        self.user = user
        self.passwd = passwd
        self.url = url

    def post(self, text):
        text = text.encode('utf-8')
        self.getOpener().open(self.url + 'statuses/update.json',
                              urllib.urlencode({'status':text}))
        
    def destroyFriend(self,id):
        url = self.url + ('friendships/destroy/%s.json' % id)
        r = self.getOpener().open(url,{})
        data = simplejson.loads(r.read())
        return data

    def getTimeline(self):
        url = self.url + 'statuses/friends_timeline.json'
        r = self.getOpener().open(url)
        data = simplejson.loads(r.read())
        return data

    def getReplies(self):
        url = self.url + 'statuses/replies.json'
        r = self.getOpener().open(url)
        data = simplejson.loads(r.read())
        return data

    def getFriends(self,page=1):
        url = self.url + 'statuses/friends.json?' + urllib.urlencode({'page':page})
        r = self.getOpener().open(url)
        data = simplejson.loads(r.read())
        return data

    def getOpener(self):
        passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
        passman.add_password(None, self.url , self.user, self.passwd)
        authhandler = urllib2.HTTPBasicAuthHandler(passman)
        opener = urllib2.build_opener(authhandler)
        opener.addheaders = [('User-agent',
                              'TwitterCloneClient(http://d.hatena.ne.jp/jYoshiori/)')]
        return opener

if __name__ == '__main__':
    twitter_config = Pit.get('twitter.com',{'require' : {
        'user' : 'Your twitter name',
        'password' : 'Your twitter password'
        }})
    twitter = TwitterClone(twitter_config['user'],
                           twitter_config['password'],
                           'http://twitter.com/')
    import rfc822
    from datetime import datetime, timedelta
    from time import sleep

    lastMonth = datetime.now() - timedelta(days=60)
    wait = 45
    removeCount = 0
    print 'start'
    for index in range(1,1000):
        print 'page ' + str(index)
        friends = twitter.getFriends(index)
        if 0 == len(friends):
            break
        for user in friends:
            if user.has_key('status'):
                date = datetime(*rfc822.parsedate(user['status']['created_at'])[:7])
                if lastMonth > date:
                    print '%s is remov. last update %s' % (user['screen_name'],date)
                    twitter.destroyFriend(user['id'])
                    removeCount += removeCount
                    sleep(wait)
            else :
                print '%s is remov.' % user['screen_name']
                twitter.destroyFriend(user['id'])
                removeCount += removeCount
                sleep(wait)

        sleep(wait)
    print 'finish!!. %s remove' % str(removeCount) 

これまたむかつく API 制限に引っかからないように
sleep を 45秒 入れてますので、寝るまえにでも起動しておけば朝には終ってると思います。


ちなみに僕は
4800人くらい → 3286人
になりました。
コアリズムより効果大です!!

※ 効果は個人によって差があります。

super() での疑問

                  • -

解決 :mechanize.Browser が object を継承しない古いタイプのクラスだったみたい

                  • -

これは OK

>>> class Foo(object):
    def __init__(self,text):
        super(Foo,self).__init__(self)
... 
>>> foo = Foo('test')


で、mechanize.Browser 継承して親のコンストラクタ呼ぼうとしたら

>>> import mechanize
>>> class MyBrowser(mechanize.Browser):
...     def __init__(self,userid,passwd):
...         super(MyBrowser,self).__init__(self)
... 
>>> foo = MyBrowser('test','test')
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
  File "<ipython console>", line 3, in __init__
TypeError: super() argument 1 must be type, not classobj

なんで!?!?
教えてエロい人!!!

...         super(MyBrowser,self).__init__(self)

...         mechanize.Browser.__init__(self)

にすれば動くんだけど、なんかキモイなぁ><

東條さん!!大変です!!


僕、良くわかってないのですが、大変です!!
美人時計の画像を自分のサーバに保存して公開してる人がいます!!

http://image.baidu.jp/i?tn=baiduimage&ct=201326592&cl=2&word=site%3Abijint.com&lm=-1&z=0

baidu

これってすっごく不味いですよね!!
良くわかりませんけど><

権利に基づいた対応をとらせて頂くべきだと思います!!!

担当/東條 2009/03/12 02:28 いつも美人時計を拝見して頂き、ありがとうございます。

拝見させて頂きました。

現在、当社はプライバシーポリシーに違反する誘導、使用の取りやめのご協力をお願いしております。

3日以内に公開、使用の取りやめ行わない場合、権利に基づいた対応をとらせて頂く場合がございます。

ご協力宜しくお願いします。


東條
info@bijint.com

http://d.hatena.ne.jp/jYoshiori/20090311/1236768388#c1236792483

RE: 美人時計の画像ファイルが欲しい

http://d.hatena.ne.jp/Yamashiro0217/20090310/1236674979
のはてぶのタグに何故か Python タグがあったので、
これは Python で書けって事かなぁと思って書いてみました。

import sys,os,urllib,time;[[[globals().__setitem__('url','http://www.bijint.com/jp/img/photo/%02d%02d.jpg' % (i, j))] and [globals().__setitem__('file',open(os.path.basename(url), 'wb'))] and [file.write(urllib.urlopen(url).read())] and [file.close()] and [time.sleep(5)] for j in range(60)] for i in range(24)]

上記との違いは僕が外道では無いので sleep 入れてみたくらいでしょうか?
エラー処理とかはしてません><

ご利用は計画的に!!

RE:pythonの引数にある*hogeとか**mapとか

http://d.hatena.ne.jp/a2c/20090301/1235909666
を読んで……

>>> def func(userid,password):
...     print userid , password
... 
>>> hoge= {'userid':'foo','password':'bar'}
>>> func(**hoge)
foo bar
>>> def func2(foo,bar):
...     print foo , bar
... 
>>> hoge=[1,2]
>>> func2(*hoge)
1 2

関数を呼び出す側でも使える!!!!
これは超便利!!!

>>> value = '2008-03-10'
>>> datetime(*map((lambda x: int(x)),value.split('-')))
datetime.datetime(2008, 3, 10, 0, 0)

LDR の未読をはてなグラフへ投稿する

id:tfunato
「それ,Python でも出来るよ!!」
と,言った手前,コードを晒してみる

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from hatenagraph import HatenaGraph
from pit import Pit
import urllib2

hatena_conf = Pit.get('hatena.ne.jp',{'require' : {'userid':'Your hatena.ne.jp userid','password':'Your hatena.ne.jp password'}})
livedoor_conf = Pit.get('livedoor.com',{'require' : {'userid':'Your livedoor.com userid'}})

r = urllib2.urlopen('http://rpc.reader.livedoor.com/notify?user=%s' % livedoor_conf['userid'])
count = r.read().replace('|','')
graph = HatenaGraph(hatena_conf['userid'],hatena_conf['password'])
graph.post_data('LDR未読数',count)

あぁ,HatenaGraph の実装書きなおしたいなぁ……