Paranoid Android - T-Mobile G1 Release

T-MobileAndroid的手机HTC Dream G1终于面世了,Android SDK也更新到了1.0版本。

硬件规格:
  • 尺寸:4.6 x 2.16 x 0.63 英寸
  • 网络:3G
  • 重量:5.6盎司
  • 通话时间:5小时;待机时间:130小时
  • 显示:65K彩色屏幕, HVGA (480 x320 )
  • 相机:310万像素,不支持录制视频
  • 存储扩展:8GB

HTC Dream G1采用了侧滑盖的设计,感觉有点像T-MobileSidekick手机.从发布会上的视频来看HTC Dream G1的应用程序和Google高度整合,直接在手机上使用众多网络应用程序是这款手机的亮点。这仅仅是Android的问世之作,前些天看到的Android UI概念设计真是让人对Android充满了期待啊。

开始编写JIEblog后台

如果只是自己用这个Blog就像以前一样有个富文本编辑器就足够了,但是我准备把这个Blog做成一个简易的个人Blog系统,这势必就需要编写一个能够让用户轻松使用的后台,以后可能还会添加一些导入和导出数据的功能。

自从添加了TinyMCE以后JIEblog的文件已经达到12m,于是决定用YUI Rich Text Editor来替换这个TinyMCE。不过YUI的文件也不小,最后按照Rich Text Editor需要的文件精简下来也有1m左右。另外在submit表单的时候遇到个问题,textarea总是显示没有字符因而不能通过django的表单验证。开始我以为是beform.py这个文件哪里出了问题,最后终于在邮件列表上搜到YUI需要在配置脚本里加入这个属性handleSubmit: true。

App Engine项目app-engine-patch

app-engine-patch是一个类似appengine-helper的开源项目,主要作用还是在App Engine上更好的实现django的一些功能,与appengine-helper不同的是app-engine-patch支持的东西更多一些,按照他们的说法app-engine-patch最低限度支持django1.0。

主要特性:

  • 支持manage.py
  • 支持Django的authentication framework(不需要google帐户)
  • 支持Django的后台数据库和线程
  • 支持Memcache
  • 支持Django的电子邮件功能
  • 支持django.forms包中的大部分ModelForms
  • 支持Django的testing framework
  • 取代Python原有的httplib(支持boto)
  • 集成profiler
  • 支持通用视图

ragendja(代码库):

  • 增强管理框架:你可以使用你自己的用户类
  • LoginRequiredMiddlewar中间件能够使你不再需在视图前添加@login_required
  • 基于RequestContext的render_to_response()(这个好像本身app engine就支持)
  • 改进的模板载入功能去掉了文件名称空间的前缀
  • 全局的模板tag
  • @transaction decorator
  • JSONResponse
  • ModelTestCase可以改变DB内容
  • 更多

Windows Live Writer的Customization API

WLW的Customization API实际上是通过读取站点上一个xml文件——wlwmanifest.xml来实现的,WLW在设置的时候按照这个文件设置API兼容性、侧边栏链接按钮、自定义布局和预览。

weblayout.htm和webpreview.htm分别用来设置Edit和Preview,需要在里面加入{post-title}和{post-body}来进行表示文章的标题和内容。

按照Blog的各种属性设置好wlwmanifest.xml,然后在head中加入:<link href="url wlwmanifest.xml" type="application/wlwmanifest+xml" rel="wlwmanifest">

这样WLW就能自动使用Blog主题了。

在JIEblog上实现XML-RPC

虽然写这篇文章的时候我的这个API还有好多问题,但我还是迫不及待的想把实现这个功能的过程记录一下。最初的动力就是想能够使用WLW(Windows Live Writer)来发布文章,实际上也就是实现一个简单的XML-RPC。所谓XML-RPC就是:remote procedure call,即远程程序调用。它采用HTTP 作为传输协议,并使用XML词汇表作为消息的载体。

这里要实现的是一个XML-RPC的服务端,Python中的SimpleXMLRPCServer,就是用来实现XML-RPC服务端的模块。首先要导入SimpleXMLRPCServer的SimpleXMLRPCDispatcher模块和django的HttpResponse:

from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
from django.http import HttpResponse

然后使用POST方法写入:

response = HttpResponse()
if len(request.POST):
response.write(
dispatcher._marshaled_dispatch(request.raw_post_data)
)

最后通过把函数注册给dispather:

dispatcher.register_function(
server_function_name,'client_function_name'
)

WLW支持的API的确是非常全,包括很多知名和未知名的Blog API,比如BloggerWordpressdasBlogTypepadMovable Type等,最终还是选择了Metaweblog API…这个能参考的代码比较多。

Metaweblog API主要的三个函数是:

  • metaWeblog.newPost (blogid, username, password, struct, publish)用来发布新文章并返还字符串
  • metaWeblog.editPost (postid, username, password, struct, publish)用来编辑文章并返还一个布尔值
  • metaWeblog.getPost (postid, username, password) 用来获得一篇文章并返还struct

此外还需要使用Blogger API中的一些函数来完善:

  • blogger.getUsersBlogs(appkey,username, password)返还程序的根目录、ID和名字
  • blogger.deletePost(appkey,username, password)用来删除一篇文章

Metaweblog API中还定义了一些方法:

  • metaWeblog.newMediaObject(blogid, username, password, struct)返还struct
  • metaWeblog.getCategories (blogid, username, password)返还structs
  • metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts)返还struct的数组

在看了这篇文章后发现原来blogger已经实现了新的Blogger Data API,以后可能会考虑在JIEblog上实现这个新的api,毕竟这种方法应该可以直接进行用户的验证。

谷歌发布中文开发者首页

谷歌黑板报上是这样写得:

欢迎你来访谷歌中国开发者博客网! 请尽情浏览我们的开发者首页,参阅大量的有关 APIs 和开发者产品的参考文件、录像、以及许多档案资料。我们还将有包含开源和托管项目的内容,这些内容丰富的参考资料和源代码的样本,将使您获得前无所有的编程效率和速度。

原来我订阅半年多的谷歌黑板报现在才正式发布?不过中文开发者首页的确是不错的东西,里面大量文档目录已经翻译成中文,看来中文化还有很长的道路要走...

另外Google App Engine SDK 1.13也已经可以下载了,更新:

何为中间件,自定义错误页面遇到的问题

在JIEblog里面请求一个不存在的url返还的并不是django定义的错误页面,而是一个appengine的google服务器错误页面:

Error: Server Error

The server encountered an error and could not complete your request. If the problem persists, please report your problem and mention this error message and the query that caused it.

查看代码以后发现是因为在生成setting.py文件的时候留了一行中间件的定义:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
)

所谓中间件the django book这样解释:

中间件组件是遵循特定API规则的简单Python类

而这个django.middleware.common.CommonMiddleware的主要作用是:

  • 禁止用户访问没有在url列表中列出的url地址
  • 标准化url请求,在地址后面自动添加"/"
  • 依据USE_ETAGS的设置处理Etag

这个中间件会在用户连续请求不存在的url时,暂时禁止用户访问网站。不过这个错误页面好像没有错误代码,因而不能自定义这个页面。最后我还是决定保留这个setting,因为这好像是GAE中唯一能用的CommonMiddleware。

参考:

Chrome浏览器的一些消息

Matt Cutts介绍了Codeweavers版的Chrome——Chromium已经可以运行在Mac OS和linux上了(曾经用这个软件在linux上运行魔兽世界),并且放出了二进制文件的下载,不过要等google官方发布其他平台的版本估计还早。Chrome最近也一直在用,问题还是蛮多的,莫名其妙的程序出错就不说了,在打开flash的网站的时候经常会出问题,基本上没法打开photoshopexpress等网站,感觉上这个版本的Chrome还不实用。

Matt Cutts还介绍了这个能把firefox外观改成Chrome的插件 ,能把firefox的标签栏弄到窗口顶端,不过我还是更喜欢这个firefox的这个Chrome主题,如果只喜欢Chrome外观的话只用这个主题就足够了。

Solidot上的这篇文章《当WebKit如此受欢迎,Mozilla为何还死抱Gecko不放》貌似讲的也很有道理firefox的内存占用的确是大,不过windows上的Chrome和Safari比firefox也少不到哪去,我倒是很喜欢Safari的字体渲染技术,无奈这个浏览器比Chrome更不实用。

GAE在线网址搜藏项目——meja

http://meja.blzinsider.cn
http://meja.appspot.com
启动一个在线网址搜藏项目,依然是GAE+django,因为这个应用可能用到javascript的地方比较多,所以决定加入yui。(meja是以前一位朋友所钟爱的瑞典女歌手的名字,碰巧在appspot还能用)

meja需要的一些功能:

  • 多用户支持
  • 从firefox收藏夹导入导出
  • 输出atom和json
  • ajax编辑界面
  • 简单后台

在GAE中实现的文件上传和下载

blzinsider uploader

作为一个djangoGAE的初学者,直接使用GAE支持的那部分django编写程序并不是一个很好的选择,而这个Blog就是用这种方法写的,不过既然开始就错了,还是让这个错误继续下去吧...

使用这种方法在很多情况下都可能遇到django手册中无法实现的东西,在编写这段程序的时候首先就发现djangoforms没法使用FileField(),不过手册里面也有其他的方法:

if request.method == 'POST':
for f,file_info in request.FILES.items():
file=models.FileUpload(filename=file_info['filename'],
content_type=file_info['content-type'],
content=db.Blob(file_info['content']),
owner=users.get_current_user(),
size=len(db.Blob(file_info['content'])))
file.put()
return HttpResponseRedirect('/uploader')

首先构建一个名为FileUpload并且包含上面属性的model,Blob用来存放二进制的文件。上面这段代码是的django的一个HttpRequest object,request.FILES是一个包括三个属性的字典类型:content,filename,content-type。这样文件就会存放在数据库的content属性里。

接下来是要在网页上输出这个文件,首先注意的是上传的文件并没有存放在网站上而是存放在FileUpload这个数据库的content里,所以输出这个文件只要通过每个字段的key就可以了。

the_file=models.FileUpload.get(the_key)
response=HttpResponse(the_file.content)
response['Content-Type']=the_file.content_type
return response

这段代码是生成一个django的HttpResponse objects,指定Content-Type是为了让程序能够识别文件类型,也可一写成:

response=HttpResponse(
the_file.content,mimetype=the_file.content_type)

或者直接指定文件的类型。如果加入Content-Disposition会使程序直接下载该文件:

response['Content-Disposition']=
'attachment;filename=%s'%the_file.filename

参考:

Apple发布iTunes8.0

iTunes 8.0

苹果Let's Rock特别媒体活动上发布了很多新玩意,其中包括最新的iTunes8.0。添加了一些新特性,变化不是太大,重点是那个和iTunes Store相关的Genius。当Genius启用的时候它会把你的曲库信息上传到 iTunes8.0并且将你的音乐品味和别人比较,而且在播放歌曲的时候在Genius Siderbar显示一个根据你的品味你可能会喜欢个歌曲列表。

新添加的可视化效果果然是非常华丽,不过搞得我的CPU有点吃不消。显示歌曲列表的方式又多了一个采用专辑封面做的Grid,这个改进还是不错的。 现在iTunesHD也可以收看高清电视节目,标清(SD)版本售价1.99 美元,高清(HD)版本售价 2.99 美元。

说白了iTunes8.0这东西在美国估计是相当流行,我记得电影《后窗惊魂》里面有段情结:男主人公的因为自己的iTunes服务被母亲注销了而且自己又被警方限制在家中于是开始用望远镜观察周围邻居的活动。不过在国内又于大家都没有购买歌曲的习惯,所以iTunes Store相关的这些东西真得是显得非常没用。

使用Atom Feed

抽空看了看atom的wiki,决定还是从RSS2.0改回来。现在用的这个生成atom的模板虽然很简单,但是难免以后要有个扩展什么的。毕竟atom支持的东西更多一些,就是要比RSS2.0复杂。这么改来改去最后弄的Google Reader里的feed乱七八糟的,而且一旦从Reader里面订阅过的feed就被Google缓存了无法改动,我尝试了下重写一个feed的ID但是居然没有用,不知道Reader是凭什么鉴定feed的。

话说自从Google Reader换了新的用户界面后就我就一直没有换过阅读器,什么鲜果抓瞎Blogline啦感觉跟Google做的东西还是差着一个档次,Google Reader的功能也所有阅读器里面最全而且更新最快的。这些年下来Google Reader的地位已经取代了Firefox的收藏夹了,不过feed的这东西唯一不好的地方就是阅读器抓取的速度跟网站更新的不同步...

使用.CN域名注册Google Apps

出于某些原因Google Apps并不支持.cn的域名,而我又非常想把这个域名用在Gae上。按照plog的做法:使用一个非.CN域名注册Google Apps然后把你的.cn域名注册成该非.cn域名的别名,完成后回到Gae的Version设置上,添加这个.cn域名。

但是我做到这一步就死活添加不了我的这个.cn域名,难道这种方法已经不能再用了?最后发现Google Apps虽然不支持.cn域名,但是如果你把它改成.CN,就可以注册了。我彻底的囧了,这究竟是Google大意了还是里面另有文章...

在GAE中使用Favicon

首先需要把favicon上传到一个静态目录里:

- url: /images
static_dir: images

然后在head标签中加入:

<link href="/images/favicon.ico" rel="shortcut icon" type="image/x-icon">

在app.yaml中指定favicon的位置:

- url: /favicon.ico
static_files: images/favicon.ico
upload: images/favicon.ico
mime_type: image/x-icon

一个在线制作favicon的工具,一般来说合成后的ico文件最好是包含16x16和32x32两种像素的,16x16可以显示在浏览器的地址栏而32x32则可以显示为桌面快捷方式。

利用google提取favicon,像这样:
http://www.google.com/s2/favicons?domain=jieblog.appspot.com

添加了WordPress Audio Player的standalone版本

先来首《i will survive》By Diana Ross

i will survive By Diana Ross

加入google的代码高亮工具prettify

class Post(db.Model):
title = db.StringProperty(required=True)
content = db.TextProperty()
author = db.UserProperty()
post_on = db.DateTimeProperty(auto_now_add=True)
tags = db.StringListProperty()
comments_count = db.IntegerProperty(0)

def __str__ (self):
return '%s' %self.title

def get_absolute_url (self):
return '%s' %self.key().id()

def get_comments_count(self):
return Comments.all().filter("post",self).count()

prettify应该是google在code.google.com上使用的一个代码高亮工具,非常小巧配置也很简单。支持类似C、Bash、和xml的语言,不需要指定语言类型就能够自动识别语法。a44fda46

Intype0.3.5代号Newcastle功能前瞻

intype

Hello. HELLO! Anybody here? We finaly figured the blog password out, so we can procede with posting… Ehm, ok, I know, not a good joke at all…

好吧我真的已经等了很久甚至以为他们销声匿迹了,但我还在使用Intype Alpha 0.3.1.734 Unstable。

这篇文章里

search updates
由于内核方面的升级,所以不得不先着手改进查询功能

  • Quick find — 使用类似Firefox那样的查询栏将会替代标准的查询对话框,替代功能仍旧会是用目前的对话框
  • Advanced regular expression editor — 由于UI framework和许多对编程的改进,我们现在能够使用Intype自己的编辑组件(Janed)。一个标准的查询对话框将会使用Janed作为编辑工具。一旦你要同时使用正则表达式和escapes模式,你将会看到能够嵌入JavaScript命令或者代码片段的语法高亮;或者你甚至可以添加你自己的
  • Search targets — 添加了两个常用查询目标:文档和selections,新的查询将会支持查询工程文件(或者文件夹)

UI framework

开发代号Newcastle版本的主要时间都用在新的widget/UI framework和相关改进上。在以前的版本中我们使用第三方的SmartWin framework,这也引发了许多兼容性和扩展性的问题。我们所创造的新framework叫做AFW,用来实现这个编辑器的我们功能和想法。

  • Improved stability and responses — AFW提升了intype的稳定性和速度,这是以前的framework所达不到的。
  • JavaScript ready — 自从AFW按照我们未来的需求开发以来,我们也移植了使用JavaScript的功能。一个可以创造你自己UI的或者自定义Intype当前UI的API不久将会实现
  • Multi-platform ready — AFW是一个可以创造windows移植程序的抽象层。任何将来对平台的开发将不需要在内核上做深度的改动
  • Windows XP/Vista themes support — AFW可以在不同版本的windows中进行不同的渲染。目前我们已经支持XP和Vista的主题渲染。这些渲染都是可选的(所以你仍然可以享受原始的UI)

bundle editor
目前实现的Bundle编辑器将不会影响到未来的Bundle编辑器。一个重要的原因是使用新的UI framework开发的Bundle编辑器将会被引入Newcastle中。

  • Snippet and grammar editors with syntax-highlighting — Bundle编辑器现在将会使用你自己编辑的组件这会对你在使用commands和snippets的制作自己的bundles时候更有帮助
  • Logging errors and error-prone UI — 由于Bundle编辑器本身的功能,将会有许多需要功能被开发:error-prone UI和debugging tools
  • Default editor for any type of bundle item — 一旦bundle项目中出现错误,新的Bundle编辑器将会是你能够直接编辑bundle的源文件

Drap & Drop
拖拽功能在论坛已经被讨论很久。自从我们能够直接嵌入这些功能到新的UI framework以来,我们已经开发了许多新的拖拽的新特性。

  • 可拖拽的tabs
  • 从其他程序拖拽文件
  • 在工程面板和tabs之间拖拽文件
  • 将文件拖入编辑器
  • 拖拽选择的文本到tabs和工程面板

Paired Characters
一个新的高级编辑行为将会包含在马上发布的Newcastl中:paired characters。在这个范围基础上我们将会开发:

  • Paired characters autocompletition — 自动插入右边的paired charcter当你插如左边字符的时候。退格键将会同时删除这两个字符,删除键将会删除右侧的字符
  • Wrapping in paired characters — 使你能够包含选择范围内的paired characters
  • Paired characters highlighting — 鼠标位于paired characters的时候将会高亮另一个paired characters

Editing
编辑功能特性的升级将会和其他升级一起进行。我们目前正致力于开发预览screencast以向您展示这些工作。现在你可以看看这些功能:

  • Virtual caret — 使你能够将caret 放到文档的任何可见位置
  • Improved rectangle selections — 由于virtual caret的特性,我们能够改变矩形选框的行为,现在可以分别从文档任何可见位置进行拖拽。还会有创造多重矩形选框的可能
  • Backward rectangle selections — 很容易解释:创造一个矩形选框对齐到行末。screencast将会完成剩下的工作
  • Indent guides rendering — 新的渲染器现在会渲染缩进具有导航  — 一个垂直的直线来控制代码缩进的结构
  • Different theme for different grammars — 成功的外观偏好选项将会变得更加有用。现在你可以为每个文件类型指定特定的主题
  • Unicode RTL rendering upgrades — Intype是一个Unicode-ready编辑器。由于AFW,我们现在能够为为RTL和升/ RTL级混合文本提供更好的caret导航和渲染。
  • Unicode font fallback — 现在能够使用标准的courier代码和当地的字体特殊字符

JavaScript

  • SpiderMonkey JavaScript engine — 我不确定这是否被强调过:我们将会使用Firefox SpiderMonkey的JavaScript引擎来处理高级的JavaScript函数
  • Backend scripting support for editing (MVC style) — 编辑的基础构架将会给予你类似MVC的API来处理文件和编辑器
  • 有很多的支持和后台的API计划为成为intype的重要组成部分,他们大多是将会在0.4版本实现,所以0.5版本将会具有功能齐全的编程环境

Files

  • Improved working with Recent files and Session — 有很多抱怨目前无法自定义会议和重开最近的文件。在Newcastle中,您将可以使用这个功能
  • Project manager file operations — 新建文件,复制,粘贴,删除和更为正在引入Newcastle中。

Release planning
就像在论坛上写的那样,我们计划发布到1.5版。这里有一个直到1.0版本的发布计划列表

Alpha阶段,有两个版本的计划:

  • Alpha 0.3.5 (Newcastle) — 主要在致力于新UI framework和准备scripting的改进。将会分为ommunity previews (CP1 and CP2) 两个阶段,下载将会在论坛放出。第三个将会是最终和稳定的版本
  • Alpha 0.4 (Brighton) — 实现基础JavaScript APIs和Theme editor

Beta阶段,有两个版本的计划:

  • Beta 0.5 (Blackpool) — 致力与升级文件处理的功能(如:在后台使用ftp),CURL API处理远程文件,查询文件,自动升级功能
  • Beta 0.6 (Sheffield) — 查询和JavaScript APIs,文件模板 ,bundles帮助文档

Finnal阶段,有两个版本的计划:

  • RC 0.9 (Merthyr) — 工程框架模板,代码折叠,UI JavaScript API
  • Final 1.0 (Swansea) — 最终发布版本

很多主要的功能现在仍然秘密,我们将会在以后的文章中介绍。

除了主要的功能外,我们目前致力于:

  • 开发预览视频来展示我们Newcastle完成的成果
  • 编写介绍Newcastle中新特性的文章
  • 准备我们的新网站的预览
Creative Commons 3.0 BY