微博把妞利器预览版开源了

痛恨各种年终总结,所以年底不写总结。好久没有更新博客内容了,一则因为最近学习的Java是自己并不是很喜欢的东西,二则是一松弛下来就变的很懒。

前一阵申请了SAE的python测试,拖了性浪微博的一个python SDK写了一个简单的半成品脚本。名字比较唬人,应用叫做“微博把妞利器”,这个闷骚的名字可能名不副实,不过已经一年多两年没折腾过性浪微博接口了,生疏了很多。

微博把妞利器这个东西可以填写你需要关注的微博用户个性域名(不包含http://weibo.com/),然后页面打开状态会自动每隔一分钟(这一版暂定此种方式)抓取一次最后一次微博时间然后显示出来。

源代码地址:https://bitbucket.org/chairo/7ats

此次代码使用了bottle框架+sinaweibopy

如图:
20120101000600.png

因为是短时间作为熟悉性浪微博SDK的产物,请不要期待功能很完善。之后版本预计会增加各种邮件、QQ机器人等方式自动提醒功能…

Via:Chairo@2012年01月01日-EOF-

Java反射执行方法时候捕获InvocationTargetException异常

公司项目中使用了Java的反射,通过反射执行别人的方法时候抛出了一个“java.lang.reflect.InvocationTargetException”的异常,百度了一下看的云里雾里的。

查看Java手册的解释是:InvocationTargetException 是一种包装由调用方法或构造方法所抛出异常的经过检查的异常。依然是很难理解。

因为涉及到跨组调试等问题,只能继续Google。最终还是在stackoverflow看到一个比较靠谱的解释“From the Javadoc of Method.invoke()
Throws: InvocationTargetException - if the underlying method throws an exception.
This exception is throw if the method called threw an exception.
”,应该是因为反射执行的方法里抛出了异常造成的。

Via:Chairo@2011年12月21日-EOF-

新开送知乎邀请,这次有足足10枚

之前有发贴送一些邀请码,旧帖子在这里,帖子很老了,其他类似IFTTT之类的也已经消沉下去了,最近在知乎游荡的时间比较久,突然发现居然已经积攒了足足10枚邀请。所以此帖仅仅赠送知乎邀请。

同旧帖规则,留言自然发邀请到你邮箱。有图有真相:
20111214222134.png

Via:Chairo@2011年12月14日-EOF-

免费发放Google的Schemer邀请

这次明码发放,一个链接可供20人注册。 Google的Schemer邀请

Via:Chairo@2011年12月09日-EOF-

给tornado的database.py增加dbutils支持

忘记什么时候在邮件订阅中看到smallfish的一个给tornado的database.py增加dbutils支持的文章了,去smaillfish的blog看了一下居然是09年写的一篇文章。小鱼修改的代码为:

def reconnect(self):
        """Closes the existing database connection and re-opens it."""
        self.close()
        try:
            from DBUtils import PooledDB
            pool_con = PooledDB.PooledDB(creator=MySQLdb, **self._db_args)
            self._db = pool_con.connection()
        except:
            self._db = MySQLdb.connect(**self._db_args)
            self._db.autocommit(True)

小鱼干掉了原有的设置autocommit(True)这一行代码,我估计主要是因为DBUtils没有autocommit()这个方法。干掉此行代码后会有一个小问题,就是如果mysql配置的autocommit=0的话,每次对数据库的修改是不会实时反馈给mysql数据库的。而原版的self._db.autocommit(True)这一行就是为了在保证在执行完一条SQL后,修改内容马上反馈给mysql。

Google一圈后我找到两个解决方案:

  • 一个是利用DBUtils的的setsession命令:
    def reconnect(self):
            """Closes the existing database connection and re-opens it."""
            self.close()
            try:
                from DBUtils import PooledDB
                pool_con = PooledDB.PooledDB(creator=MySQLdb, setsession=['SET AUTOCOMMIT = 1'], **self._db_args)
                self._db = pool_con.connection()
            except:
                self._db = MySQLdb.connect(**self._db_args)
                self._db.autocommit(True)
  • 另一个就是类似tornado的做法给每个cursors的connection设置autocommit属性为True
    def reconnect(self):
            """Closes the existing database connection and re-opens it."""
            self.close()
            try:
                from DBUtils import PooledDB
                pool_con = PooledDB.PooledDB(creator=MySQLdb, **self._db_args)
                self._db = pool_con.connection()
                self._db.cursor().connection.autocommit(True)
            except:
                self._db = MySQLdb.connect(**self._db_args)
                self._db.autocommit(True)

Via:Chairo@2011年12月05日-EOF-