2009年8月15日星期六

Tumblr vs Publr

现在才写似乎有些Out了,不过我的确是最近才开始用类似的东西。因为就是用来贴图而已,所以我只关注了这两家网站关于贴图的相关功能。

因为墙的关系,最先开始用的是Publr。本以为作为Tumblr的后来者,功能方面应该较弱才对,结果用了一段时间发现事实并非如此。Publr可以自定义Theme,网站提供的三款也都是设计优良的作品。发布照片的界面也很好用,能够一次选择多张图片,并且在上传的时候去写文字内容。基本上我介意的核心功能,Publr都能很好地提供。

要说缺点,不能设置Post发布时间算一个,无法调整Photoset顺序也算一个,不过都还可以忍受就是。真正让我起意尝试其他相似服务的原因并不在于功能,而是出于对数据安全性的担心。

Tumblelog,看名字就知道,这一类网站Tumblr肯定才是老大,Publr是否能找到自己的位置?上线有一年了吧,我只用了月余就抓出了三个Bug,用户少到没人发现?API至今还很不完整,站方想要添加的SNS功能也进展缓慢,种种迹象让我觉得至少要找个备份的地方才算保险。

于是我慕名翻墙来到了Tumblr,可是却有那么点失望。Tumblr的功能的确较Publr丰富,创建多个Blog、SNS,等等等等。可是我看了官方网站才知道,发布Photoset的功能七月才上线,无论可用性还是易用性都有不小的缺陷。

Tumblr将单张的Photo和多张的Photoset分成了两种不同的Content类型,假如第一次发布时只选择了一张照片,Post类型即为Photo,以后修改也不能再添加照片并转化为Photoset了。呈现方面,如浏览器安装了Flash插件则Photoset会被显示为一个Flash相册,否则就是所有大图的堆叠,相比Publr点击略所图用Javascript放大的方式差了不少。另外Tumblr的Photoset还有最多十张的限制,上传时必须逐张进行选择,用起来实在有些不太舒服。

综合来看,仍然是Publr更为契合我的需求。至于备份,写了一个Ruby脚本将Photo类型的Content从Publr同步至Tumblr,而Photoset就只能手工处理了。

2009年8月6日星期四

利用GAE实现Twitter短信通知

简介

随着国内Twitter Clone集体被自杀,利用叽歪绑定飞信,通过手机短信获取Twitter更新的法子就失效了,于是我再一次开始折腾。

这次用到的东西包括cocobear写的PyFetion、Yahoo Pipes和Google App Engine。基本思路就是利用GAE的Cron功能定时检查Yahoo Pipes抓取的RSS,如果有新的东西就用PyFetion给自己的手机发短信。

除了Twitter,这个程序可以用来做的事情挺多,比如接收实时天气预报之类,各位可以自由发挥。

安装及使用说明

由于PyFetion、FeedParser等第三方库都采用GPL许可证发布,所以我的代码也使用GPL v2许可证,使用及再发布请留意相关限制。

代码放到Github上了,下载请走这里,点击download即可获得最新源文件的压缩包。

我并没有为本程序单独建立一个代码仓库,目前还整合了杜晓刚GAppProxy等其他程序。用得上的话就不用为本程序单独建立一个GAE了,不然的话放在那里也成,并不影响使用。

下载及解压后需要修改的文件有两个。app.yaml中第一行“application: ogaeo”,将ogaeo改为你的GAE项目名称。另外则是Conf.py中RSS2Fetion的相关配置信息。

默认的RSS只抓取Twitte的replies和direct messages,应该不至于太烦人。据说用飞信给自己发短信有每天600条、每月1000条的限制,如需要自定义抓取来源请留意。

我将Cron任务设置为每5分钟执行一次,实际延迟约在5到10分钟的样子。如需要更改,请查阅cron.yaml文件。

需要GAE申请及上传帮助,请查阅GAppProxy帮助文档。使用中出现问题,请在本页留言。

使用本程序会造成飞信PC及手机客户端掉线,如果你经常使用飞信聊天并且只有一个移动的号码,本程序并不适合你。

如果希望临时关闭本程序,可以采用短信修改飞信密码的办法来实现。编辑短信,内容为新密码,发送至12520050。详情请查阅飞信帮助说明

更新历史

Update 22:36 2009-8-11:

本想偷懒直接用memcache,可是发现memcache无法提供长时间的缓存,所以还是得用数据库。

另外还发现GAE一个问题,pickle反序列化似乎得这样用:pickle.loads(str(dbcache.txt))。

Update 23:56 2009-8-13:

用pickle序列化数据并保存至数据库仍然会有重复发送的问题,而且两次重复发送都在凌晨6点多。找不到问题出在哪里,于是再次修改缓存机制,将RSS永久保存在数据库中。

一定要记住两件事:一、TextProperty不可查询,只能用StringProperty;二、看文档需要仔细些,再仔细些……

Update 14:43 2009-8-17

经过上次修改后没有再出现重复发送短信的情况,问题应该是解决了吧,只是出错的原因还不太确定。

嫌疑集中在Model(Query、GqlQuery)类的get方法上。按照文档的说法,query.get()应该返回数据库中符合查询条件的第一条纪录,没有则返回None。可是用query.get() == None进行条件判断时就会出现重复发送的情况,改用query.count() == 0时则不会。初步判断,有可能是get方法在发生错误(如超时)时,并没有抛出异常所致。

Update 22:57 2009-8-20

上次将get()修改为count()后忘记上传代码了,汗。

Update 23:15 2009-8-30

有人说希望可以用父母的手机申请飞信并给自己的手机发短信,这样就不影响飞信使用。貌似的确会有这样的需求,所以加上。

Update 21:46 2009-9-17

某人提意见,去掉replay里[@自己的用户名]看起来会怪怪的。想想也是,反正省不了几个字符,于是小改一下默认的Pipe。