在GAE上搭建XML-RPC服务

标签:Google App Engine, Python

前些日子有人问Doodle是否支持Windows Live Writer,我只是回答了不支持而已。原因很简单,我的Windows XP很奇怪,几次装Live Writer都失败,对微软已经绝望了。
不过现在已经转移到Mac OS X上了,装软件没这么奇葩的兼容性问题,于是就研究起weblog publishing API来。

博客发布API大致有2类:一类是基于XML-RPC服务的,包括Blogger API、MetaWeblog API、MovableType API和WordPress API等;另一类则是Atom Publishing Protocol。
后者虽然技术上比前者强大,但较为复杂(例如认证是基于HTTP的认证机制),而且由于出现得较晚,支持它的也比较少。当然,对我来说更重要的是文档很难找,因为这个协议并不只用于blog,一些细节上的东西就不知道怎么搜索了。
于是比较了1天后,还是选择了XML-RPC。简单来说,它就是用XML封装方法名和各个参数,POST给XML-RPC服务器,再由服务器返回XML封装的方法运行结果。至于各种API,实际上只是方法和参数的差异,原理都是一致的。

下面举个提供加法的XML-RPC例子。

GAE SDK 1.5.1版发布

标签:Google App Engine

前几天GAE SDK 1.5.0 Prerelease版发布了,由于新特性没文档,我也就没介绍了。这几天部署应用时老提示有新SDK,不过就是没放出下载。而今天,1.5.1正式版终于发布了,更新如下:
  • 外部请求将带上X-AppEngine-Country头,基于用户的IP,以ISO-3166-1 alpha-2国家码来标明的访问者的国家。CGI环境下可用os.environ['HTTP_X_APPENGINE_COUNTRY']获取,我自己测试时可以拿到'CN',不过使用代理和反向代理的就只能拿到代理服务器所在的国家了。
  • Channel API可以检测用户状态。需要在app.yaml的inbound_services里增加xmpp_presence,详情可见User Presence文档。
  • Images API支持WebP格式。(本地是用PIL,所以不支持)
  • 本地开发服务器新增--high_replication参数,模拟High Replication Datastore的行为(查询实体时,最近改写的实体可能不会返回)。
  • 管理页面的后台记录可以选择时区了。(以前为PST,还得考虑夏时令的问题。注意没有北京时间,而上海时间不会显示最近6分钟的请求,所以建议设为香港时间。)
  • Python SDK增加ProtoRPC API。这个API还是实验性质的,我只是粗略看了下,大致是用于构建基于HTTP的RPC服务的。简单来说,按照它预定义的格式来进行请求,再返回一个预定义格式的响应。感觉没多大用处,因为自己实现JSON或XML格式的RPC服务也不难。
  • 增加app_identity API,可用于获取应用id和默认版本的域名(例如my-app.appspot.com);此外还在请求其他服务时,能对请求进行认证(也就是签名啦)。

记录一些Mac OS X技巧

标签:Mac OS X

用了几个月Mac OS X,发现很多东西不记录下来就会找不到,于是就有了这篇日志。

jQuery 1.6版发布,区分DOM的attributes和properties

标签:jQuery, JavaScript

今天jQuery 1.6版发布了。

新增的API和性能改进我就不提了,只提一个重要的改动:区分DOM的attributes和properties。
这2个词的中文翻译都是属性,有时候后者会被译为特性,不过我还是直接用英文吧。前者表示从文档中获取的状态信息,后者则表示文档的动态状态信息。更通俗地来说,HTML文档里是怎么样的状态,attributes就是怎样的;而JavaScript可以通过DOM API来更改DOM的状态,表单控件(如文本框)的状态也可以被用户使用键盘、鼠标等修改,这些被动态更改后的状态就由properties表示。

GAE SDK 1.5.0 Prerelease版发布

标签:Google App Engine

今天凌晨,GAE SDK 1.5.0 Prerelease版发布了。改动很多,但是由于没文档,不少东西我也不清楚,所以只翻译一些我感兴趣的:

  • 任务队列的参数大小增大。(超过后只能使用数据库来保存参数,所以这个改动很有意义。)
  • HTTP请求和响应大小增大为32MB。(做代理更方便了。)
  • 创建新应用时,High Replication Datastore将作为缺省设置,以取代Master/Slave Datastore。
  • 任务队列的执行速率增大到500/s。(貌似一般应用也有500QPS的限制。)
  • db.py新增异步操作:get_async()、put_async()、delete_async()和allocate_ids_async(),调用函数返回值的get_result会阻塞直到拿到数据。

其他的就等正式版发布再翻译吧~

记录Chrome使用状态

标签:Google Chrome

作为一个Chrome重度依赖者,我总想知道自己在Chrome上花了多少时间,访问过多少个网页。于是乎花了2天时间,捣鼓出了My Counter这个插件。

判断Chrome是否为当前窗口

标签:Google Chrome

最近在做一个记录Chrome使用时间的插件,遇到了一个小问题:我有事没事就开着Chrome,当它在后台运行时,也算入使用时间就显得不合理了。

翻了一下文档,没有找到这样的API,于是只能组合起来尝试了。最终发现先用chrome.windows.getLastFocused()获取最后被选中的窗口,然后判断它的focused属性,就能知道是否为当前窗口了。

« 看看还有什么好玩意