不得已又用上了VPN

这边网通也不知道出了什么问题appspot一直不能访问,单位倒是能打开不过还是老发生解析错误。于是想起了以前用过一个英国的VPN服务linkideo,再次登陆的时候发现账号已经失效,原来linkideo早就过了免费期开始收费了。然后换用了Riku上看到的一个免费VPN服务alonwebalonweb用起来倒也简单,只需要下载alonweb上的这个OpenVPN软件然后用在alonweb上申请的账号登陆就可以了。比起linkideo用windows自带的VPN程序就能登陆还是麻烦了点,访问站点时候也有跳转到alonweb上需要等待几十秒钟的情况,速度倒是还不错。

Wolfram|Alpha计算引擎发布

Wolfram|Alpha发布了,用开发者的话来说它并非一个传统意义上的搜索引擎,而是一个计算知识引擎或者一个在线版的Mathematica,它返还的搜索结果是经过其服务器内部数据计算产生的,并非像Google那样是通过存储网页数据产生的。Wolfram|Alpha似乎更像是wikipedia这类百科全书样的程序,不过Wolfram|Alpha靠的是计算而不是像wikipedia是用户输入。

Wolfram|Alpha涵盖的范围看起来也很广泛各种领域的信息都有涉足。比方说搜索"weather"这个单词它会直接给你返还你当前IP的地理位置的天气情况和相关的天气信息。Wolfram|Alpha作为Mathematica的功能用起来也很强大。可以直接输入5*9+(sqrt 10)^3=这样的等式计算结果,还可以对方程式组进行求值等运算。Wolfram|Alpha会通过用户输入提出正确的公式,这一点用起来也很方便。

GAE数据备份及恢复程序Gaebar

Github的Blog Rebase 9在本周介绍了这个程序,作者又在圣诞节这一天制作了视频来演示Gaebar的使用方法。Gaebar是一个独立的基于Django的程序,可以作为插件集成在使用Google App Engine Django或者app-engine-patch开发的应用中来备份和恢复Appengine上存储的数据。

Gaebar可以将Appengine的数据备份到Python代码中,而且可以执行这些代码来进行数据恢复。作者在程序中使用了Ajax来调用备份程序以避免产生Appengine不支持的长时间数据操作。为了避免产生过高的Cpu负载Gaebar默认每次备份五行数据,产生的备份文件也被分割为约300KB以避免发生Appengine 1m文件的限制。

源代码地址:

使用Zoho Creator和App Engine Site Creator构建GAE程序

这是appengine官方blog上的一篇文章。

首先先是Zoho Creator的开发人员已经为Zoho Creator添加了生成GAE代码的功能。在用Zoho Creator创建了应用之后,在上面的More Actions的下拉菜单里有一个Deploy in Google Appengine的选项可以直接下载这个应用的python代码。目前Zoho Creator仍旧有一些在Appengine上不能实现的功能,包括:

  • 文件上传和Notes field
  • 使用Criteria的Views
  • 使用运算符的分组
  • HTML, Summary和Calendar视图
  • Zoho Creator的主题支持
  • 受限制的Deluge Scripting支持(仅支持邮件通告)

App Engine Site Creator,可以说这是一个简单的内容管理系统(CMS),类似Drupal这样的程序。目前感觉功能还不完善,毕竟开发才刚起步,GUI风格感觉很像Google Cookbook - Google App Engine。不过按照他们的说法这个程序还是很值得期待的:

The resulting managed site is designed to be themed and branded, and the back end Site Creator code was written with readability and extensibility in mind.

很期待GAE上能有类似Drupal和Movable Type这样的程序出现。

Google Chrome 1.0正式版发布

Google Chrome

自从Google Chrome浏览器发布第一个测试版到现在已经一百天了,现在Google终于发布了第一个Google Chrome稳定版1.0.154.36,拿掉了beta的标签。

回想当初发布的时候因为不堪Google Chrome的Flash Bug我还是放弃使用了这个浏览器,而现在Google Chrome在处理Flash的时候cup占用得到了明显的优化,书签管理器也有所改善,另外Google Chrome最新的V8引擎又在SunSpider benchmarkV8 benchmark中领先其他浏览器。在安全方面Google Chrome的独特的sandbox technology会为用户提供一个防御恶意程序的保护层使得浏览器更加安全。

据Google方面称:在这发布的一百天里Google Chrome在世界范围内已经得到了一千万的活跃用户。实际上Google Chrome浏览器的开发应该说到现在仅仅完成了一些浏览器必须具备的功能,要像Firefox那样获得广泛的扩展功能更全面的设置相信Google Chrome还有很长的路要走。

TypePad的新评论工具Connect

TPC Nick O'Neill-a

改评论页面的时候想起来前几天在webware上看到的Six Apart发布的TypePad评论管理工具connect已经可以支持很多平台了,于是在自己的wordpress和Blzinsider.cn/connect尝试了一下。TypePad.com/connect目前支持的平台包括:TypePad、Movable Type、Wordpress.org、Blogger、Tumblr,还提供了可供用户制订的代码。

TPC Dashboard-thumb-500x391

用户可以通过TypePad.com/connect提供的代码替代原有blog平台的评论代码,这样读者在你blog上发布的评论就通过javascript代码被提交到TypePad.com/connect。TypePad.com/connect可以支持多个blog系统,所有通过TypePad.com/connect代码提交的评论都会还会出现在TypePad的另一个新程序Profiles里面,用户可以通过TypePad.com/connect的settings页面对留言进行管理,包括设置发布、删除、标记Spam,还可以对TypePad.com/connect的样式和各种功能进行一些设置,其中提供的CAPTCHAs和邮件提醒功能我觉得都还是不错的。

其实用这个工具配合appengine做个Blog简直是太舒服了,自己只要弄好一个Post的页面,评论页面交给TypePad.com/connect管理就行了,antiSpam、用户注册、评论管理TypePad.com/connect都做的非常不错。另外,由于TypePad.com/connect不仅支持Typepad的账户,同时还支持Openid,所以你的Blog也就间接支持Openid了。

gist.github的一些插件

logo_gist

gist.github是一个类似pastie的代码存储服务。最近Github的博客上介绍了几个在vim、emaces和textmate中使用gist.github的插件。emacs我不怎么用,而textmate我也没有Mac,单介绍一下vim的这个插件Gist.vim。

首先可以从vim的网站或者gihub repo下载这个vim插件,然后复制到vim的plugin目录里面。启动vim,如果你之前没有设定git的环境变量的话需要首先通过下面命令设置:

git config --global github.user yourname
git config --global github.token your API Token

你可以在https://github.com/account这个页面的Global Git Config连接找到你的设置命令。

gist.vim提供了一些命令可以在vim中提交或者查询你在gist中的文件:

:Gist
post whole text to gist.
:'<,'>Gist
post selected text to gist.
:Gist -p
post whole text to gist with private.
:Gist XXXXX
edit gist XXXXX.
:Gist -l
list gists from mine.
:Gist -la
list gists from all. 

当然如果你在安装了gist.vim运行vim的以后vim提示你缺少git或者curl命令的时候你需要首先安装这两个命令。

sudo apt-get install git
sudo apt-get install curl

Linux下设置Aptana Studio的appengine开发环境

Aptana Studio是一个非常不错的Web程序开发环境支持Php、RoR、Jaxer,自从Aptana收购了pydev以后,在Aptana Studio里开发使用python语言的程序框架就变成了现实,对我来说有一个可视化的开发环境有时候还是很方便的。Aptana Studio配置插件的方法基本和eclipse一样:
  1. 安装Aptana的pydev插件
    菜单里选择:
    Help>Software Update>Find and Install...>Search for new feathures to install>New remote site...输入
    • name:pydev
    • url:http://pydev.sourceforge.net/updates/
  2. 然后finish,不要勾选Pydev Optional Extensions一路next下去,intall all。
  3. 为pydev插件设置python环境变量:
    Windows>Preference...>Pydev>Interpreter - Python
    在Python Interpreters(eg.:python.ext)选卡的New...里面选中你的python文件位置,ubuntu下是/usr/bin/python这个文件,OK。
  4. 新建pydev项目:
    File>New>Other...>Pydev>Pydev Project
    Project type里面选择python 2.5,finish。
  5. 为项目添加google_appengine支持:
    在Pydev Package Explorer里面右键点选中项目,菜单里选择Properties,在External Source Folders里面使用Add source folder添加你google_appengine程序的位置:
    • google_appengine
    • google_appengine/lib/django/
    • google_appengine/lib/webob/
    • google_appengine/lib/yaml/lib/
  6. 配置运行环境:
    菜单里面选择Run>run...>Python Run
    • Project里面选择你的项目
    • Main Module里面选中google_appengine/dev_appserver.py
    • (x) = Arguments的Program arguments里面添加:
      • "${project_loc}/src"
      • --port=9999
  7. 最后Run。

微软发布名为“Windows Azure”的云计算服务

azure
目前互联网上最流行的仍然是用户产生内容的网站形式(ser-generated content, UGC),比如微软的Live Space、谷歌的Youtube以及XXX社区等,比起这类网站服务,云计算是一种技术层面上的服务。随着谷歌、亚马逊等公司相继推出自己的云计算服务微软终于也坐不住了,Windows Azure正是微软准备进行互联网策略转型的产品。
Windows® Azure is a cloud services operating system that serves as the development, service hosting and service management environment for the Azure Services Platform. Windows Azure provides developers with on-demand compute and storage to host, scale, and manage Web applications on the Internet through Microsoft® data centers.

Windows Azure从介绍上来看应该是一个类似Appengine的服务,用户通过Azure的服务平台可以管理自己的网络应用程序。
Azure的WindowsSDK很NB的不支持Windows XP,目前只支持Windows Server 2009和Windows Vista SP1,对于我这样只买了正版XP的用户可能就只有放弃了,比起GAE可能唯一的优势就是Azure支持的程序语言比较多。

另外微软还发布了OpenID for Windows Live预览,使用Windows Live ID的用户可以使用Windows Live ID直接登陆支持OpenID的网站了。看来我也该研究一下在JIEblog上实现OpenID。

JIEblog source code host on Github.com

JIEblog Source Code
以前一直是用Google Code+Subversion管理代码,现在迁移到ubuntu以后决定尝试一下使用Git,服务器端使用了github.com,唯一不太方便的地方就是github.com在国内不能正常访问。
我最早接触到使用Git的项目既不是linux kernel也不是Rails等什么的开源项目,而是从forum.wowace.com上看到的一些WOW插件作者在使用git管理插件代码,这里面最著名的是oUF等插件的作者Haste的git,还有tekkub等人。我想他们选择git大概是因为开发插件这种东西需要不断的快速的提交,git自然是在适合不过了。

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,毕竟这种方法应该可以直接进行用户的验证。

在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相关的这些东西真得是显得非常没用。

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中新特性的文章
  • 准备我们的新网站的预览

对网通有些无奈了

据说有的地方appspot还是能正常访问的,但是appspot目前的访问情况还是和GFW脱不了关系:
一会页面打不开,一会后台不能访问,要么就是页面能打开后台也正常就是不能上传文件,真是无奈了。。。

Creative Commons 3.0 BY