新项目: Story Board

大约在前年,我就开始使用Python写Blog程序并将其Hosted在GAE上,并一度有将其开源的打算,后由于GAE数据库读取价格策略改变,代价太高而放弃;期间还写了一个简单的图片存储程序承诺将其开源,由于代码过于草稿没时间整理也一拖再拖。两者,代码至今都没有释放出来。

而在今年年初,GAE完美支持Django+MySQL,给原本失去的希望又重新点燃,用其托管一个小访问量的站点又有了规避方案,另一方面Cloud SQL可以方便的导出数据,数据备份不需要再经过复杂的操作。在二月结束的时候,我写了一个小的网站原型,后经过改进,并将其命名为Story Board托管在GitHub上开源出来。

同时用它替换原来的Oh Bug!。希望Oh Bug!不再单单只是一个Blog,也是一个小众技术讨论区,欢迎任何人参与进来讨论~

Project Story Board
https://github.com/darcyliu/storyboard

Oh Bug!
http://www.ohbug.com/

You are very welcome.

-EOF-

Media Temple ProDev API

Media Temple也耐不住寂寞出API了,这年头不提供API的服务不是好服务。既然有API那就试试吧。登录帐号,获取api key以后便可以开始编程了。
需要注意的是尽管文档里有提全局的HTTP 请求headers里包含Authorization为api key用以访问api。但我发现使用header的形式并不能访问成功,实际的api key还是需要在URL里以参数的形式携带(API Query parameters)。
以下示例用以访问Get all service details接口。

#!/usr/bin/env python
# encoding: utf-8
"""
mtapi.py

Created by 枯藤昏鸦 on 2011-05-14.
Copyright (c) 2011 IoIo.NaMe. All rights reserved.
"""
import urllib,httplib

def main():
	url = 'api.mediatemple.net'
	apikey = 'your api key'
	urls = '/api/v1/services.json?apikey='+apikey
	form_fields = {}
	params = urllib.urlencode(form_fields)
	headers = {}
	conn = httplib.HTTPSConnection(url)
	conn.request(method='GET', url=urls, body=params, headers=headers)
	response = conn.getresponse()
	res = response.read()
	h = response.getheaders()
	print 'Response Status:',response.status
	print 'Response Header:'
	for i in h:
	    print i[0],':',i[1]
	print 'Response Content:',res
	conn.close()
	
if __name__ == '__main__':
	main()

记得是使用https链接(httplib.HTTPSConnection)。
相关资料:API文档(PDF)
-EOF-

Google App Engine Roadmap 2011

这是今天(2011年2月22日)GAE站点上的Roadmap,可以看到近期会有如下这些特性将会添加到GAE中。
Features on Deck

  • SSL access on non-appspot.com domains
  • Full-text Search over Datastore
  • Support for Python 2.7
  • Background servers capable of running for longer than 30s
  • Support for running MapReduce jobs across App Engine datasets
  • Bulk Datastore Import and Export tool
  • Improved monitoring and alerting of application serving
  • Logging system improvements to remove limits on size and storage
  • Raise HTTP request and response size limits
  • Integration with Google Storage for Developers
  • Programmatic Blob creation in Blobstore
  • Quota and presence improvements for Channel API

其中SSL不用说了,去年是说Q4发布的,被延期到了2011年,只希望不会是在年底。一直被要求的全文检索终于被提上了开发日程,是一个非常不错的好消息。接着是将会支持Python 2.7,这也是迟早的事情,话说我每次在Mac下降级Python配环境那个折腾呐,同时目前在其1.4.2版本中已经可以使用use_library() 来指定Django的版本。HTTP返回数大小限制已经提升到30M了,只是请求数目前还没有放宽限制。另外还会整合Google Storage for Developers到GAE中,不知道将会是以何种方式提供服务,这些功能项都挺值得期待的。
-EOF-

Python文件编码

Python文件编码格式声明是以源文件第一二行上的注释内容标识,以下三种用都是可以的:
1.直接进行声明

# coding=

2.解释器声明后进行声明

#!/usr/bin/python
# -*- coding:  -*-

3.或者一些编辑器可以识别的形式

#!/usr/bin/python
# vim: set fileencoding= :

实际确定文件编码其实是在源文件头两行搜索下面这个正则表达式。

coding[:=]\s*([-\w.]+)

如果没有进行代码级的编码声明但是文件是以UTF-8形式保存(带有’\xef\xbb\xbf’ 标识)也会被认为是UTF-8编码。如果文件带有UTF-8 BOM标识但是注释声明的不是UTF-8,则会引起错误。

下面的声明都是正确的

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import os, sys
# This Python file uses the following encoding: utf-8
import os, sys

编码声明不在第一二行则会被忽略。

#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
import os, sys

via PEP 0263
-EOF-

Google App Engine SDK 1.3.8 预览版放出

SDK 1.3.8的评估版现在已经可以下载:
http://code.google.com/p/googleappengine/downloads/list

我们来看看有哪些新特性:

  • 上传app的开发者可以使用appcfg.py download_app命令下载所上传版本的代码。
  • 内建app.yaml中处理程序可用于常见的应用功能,如appstats。
  • Admin Console 提供了工具删除数据库中所有的实体或者给定类型的实体。
  • 可以在Admin Console立即执行queue tasks。
  • 可以在执行图像API的execute_transforms函数时指定jpeg图像的质量。
  • 支持多帐户登录。
  • 在queue.yaml中 bucket size 提升到100。
  • 默认开启Precompilation预编译。
  • BlobInfo拥有一个返回BlobReader值的open方法。
  • BlobReader接受BlobInfo类型的参数。
  • 移除了zigzag merge-join queries的限制。

via Prerelease SDK 1.3.8 is out!

好吧,没我期望的特性,希望Google Storage能成为内置支持(允许大文件传输),希望Prediction API和BigQuery也成为内置支持。版本号在上升,有新特性总是好的。
-EOF-