为神马我年轻的时候能写出这马牛逼的程序,现在却还是个傻波伊

开源第二波。

这是我06年4-5月份在ibm实习时帮老板干的小私活。这网站关了有一百年了,我当时的nb老板据说已经转去做文化产业…… 所以我估计现在开源出来没人追究,何况当时编小私活,一没协议,二来还是让ibm开的工资,囧……

这是个在地图上进行标注、分享、发现的网站,有点foursquare的意思。可惜06年初,iphone还没个鬼影,google map上非卫星图的北京还只有三条大路,这玩意后来不了了之也不奇怪……

现在读读这程序,我真他马诧异这程序是不是自己写的……比如06年我就写了前后端之间纯api连接的应用;后端我还自己实现了一个微型unit test框架;前端是一个非常良好的可扩展结构,以支持不同类型的地图标注——我当时还真是一个模式和TDD的控。最重要的是这程序五一节左右搞完,而我大概是3月份才开始学的php和js。

忽然想起,《此间的少年》中间一个段落,老校长独孤求败在灯下抚摸着自己年轻时候的学术著作黯然神伤,因为他知道自己再也写不出来了…… 我操……

好了,源代码还是在github上。源于我从来对php都没有爱,所以后端的unit test我今天整理的时候简单试了一下但没能重新搭起来——如果有人php熟能跑起来就真是太给力了。前端我当时做了一个ajax的mock(indexAjaxMock.php),所以即使没有后端这个程序也可以玩——下面的截图也是这么来的:

SproutCore – Client-Side RoR

引:昨天吐了一大篇出来,今天没什么力气,捡要点写。

首先我是Ruby on Rails fan。其次RoR出来之后,很多人都在抄它这事实就不说了。因此考虑如今的web应用和客户端应用已经是同构的了——web应用的架构其实是客户端的MVC的一个简化,所以咱为啥不搞个客户端应用的RoR出来?不偶然的是,现在这世道只要你想得到的就有人做,比如人家JavascriptMVC都tm出到2.0了。这玩意我原来试过,还行。

不过今天又发现之前在feeds被略过(信息过载要命呀)的另一个玩意,SproutCore。1.0RC,亮点是Apple开源出来的,Demo上看性能不错。一句话来说就是一个客户端应用的RoR,framework+building tools,架构就是纯正MVC(包含observer)。

SproutCore这类东西和YUI、Extjs这类的区别,基本上就是PHP和RoR的区别。用SproutCore能做的是YUI完全能做。但我的观点是YUI、PHP这个层次的框架(PHP+一堆包也算个框架了)最大的问题在于不能帮助开发人员构建应用的整体架构。虽然它们的能力完全没有问题,但如果你是一新手,那就很容易在一开始直接晕菜,而老手则经常要在一开始做很多Copy&Paste的dirty work。相反RoR、SproutCore都提供一个强制但合理的完整应用架构。你用这框架就直接得到一个骨架,在上面直接添加具体的应用内容就行了。这类框架同时提供一系列building tool来帮助你跟随这个架构来构建应用,所以构建应用本身也就成了应用架构学习的过程——特别是针对新手。(RoR在开发时的优点其实真不用我废话了。)

当然客户端用到MVC这么重载的架构,一定得是很rich很rich的客户端了。不过我是觉得在未来几年里,客户端一定会变得现在想不到的重载,这个观点不算激进。如果你坚信页面用HTML+jQuery就完事了,那咱就不相与谋了,但如果你有一天你考虑要用到YUI、Extjs这级别的东西,不妨关注下SproutCore的发展。不要小看漂亮架构的力量,现在YUI这玩意ms基本的东西已经做绝了,新加的多是些稀奇古怪的功能。但是看看SproutCore的DataSource实现,这是我现在看到最漂亮的客户端Data Access实现了。

你看我的技术讨论好像有点又大又空,一点实例都没有。告诉你,其实我现在特别讨厌技术,写这些字,耽误我多少看书的时间!所以有兴趣你就自己看SproutCore这项目的wiki去!最后再顺便愤青地表示一下这项目wiki被墙的愤怒,mlgbd!睡觉去,完。

PhoneGap,人人都爱js

phonegap.comWeb 2.0 expo大众选择奖(可惜之前reader里被噪音盖过去的东西)。支持用html+js编跨手机平台(iPhone、Android和黑莓)应用,附加的一个项目是xuijs.com(ms被盾了),可以理解为针对手机浏览器的jQuery,因为去掉了很多针对桌面浏览器兼容性的代码,所以体积小了很多。

乍一看确实不错。不过最近又在新闻里冒出来是因为App Store把基于这个开发的应用都给拒了,囧。

附加阅读:

男1:你看你在我领导下学了多么nb的一门语言呀
男2:你是这么领导的。对面是知识的海岸,我们站在这一岸,你把我踹下去,说游,然后我拼了自己的命学会了。。。

Some Solutions for Pure-javascript Web Application

——–闲着没事备忘下,完全是因为在windows上装couchdb失败后无聊所致——–

其实3年多之前还挺瞧不起js的,结果这几年混下来,糊里糊涂js就成了自己第一称手的语言。

用得顺了也就喜欢起来,而且很多时候js的表达力也挺强的。所以虽然RoR也一直在手边没放下,但是也挺留意用js写server端的项目。毕竟短期来看无论flash还是sl都不能让browser是逃不出js的掌握,如果有特别合适的js写server的东东,我就可以把RoR扔了,完成自己的语言大一统,XD——当然到现在也没看到特合适的,囧。

归正传,题目所谓Pure-js Web App就是只用js这一种编程语言通吃Server和Client端。目前这种项目数量倒是挺多的,不过粗劣分一下类的话,大面上也就两类种东西:一个是维持现在Client-Server-DB这种3-Tiers的体系结构,只是把Server端的编程语言从java、php等等换成js;另一类相对好玩一点,这类基本上抹掉了Server这层,体系结构变成了Client-DB,而全部所谓的业务逻辑代码全都移动到了browser的html页面中。

先说第一类,这类我最早关注的一个是helma——这个是最纯粹的用js写server。我还比较喜欢这个项目:部署简单,内置了jetty,默认情况解压直接跑(其他很多项目需要部署到其他的http或者servlet server中);内建了一个基于xml的对象数据库,不用一开始就配mysql(也可以用mysql);server和app管理和调试工具;文档全;良好的MVC支持。不过helma也有这类的server-side js的通病,他的定位是用js替换php、java、ruby等等server-side语言,这结果是虽然听上去使用这类项目后client和server端代码都是用js写,但是其实这两个地方写出来的js完全不一样。

相对来说,虽然同是server-side js,Aptana旗下的jaxer看上去漂亮得多。jaxer给html中的script标签加了一个runat的属性(M$好像搞过类似的东西?),通过将runat属性设置为server(提供一组用于访问db、调用远程service的api)、both或者client(default),可以决定js运行的位置。而通过一个runat=”server-proxy”的特殊标记,client可以很容易调用server的功能。这样理想下开发人员只需要写包含js的html再部署到jaxer server上就行——咋一看用同一语言同一编程方式挺好的整合了server和client端。不过仔细一想,我还是挺怀疑的。虽然代码文件的区分基本没有了,但是物理上server和client的界限还是存在的。结果就是用helma这类东西,开发人员必须在项目中来回切换server代码和client代码。而用jaxer,开发人员必须在脑子里来回切换server代码和client代码,囧……而且jaxer文档里的例子大多是inline js,真正开发谁这么写呀……一旦外联js,因为这些js文件是区分server和client的,所以很直觉就分到不同的目录,然后……鉴于jaxer并不内建支持mvc,于是我猜会很像js版本的php。补一句,我并没有真正用过jaxer,可能有点信口开河,有兴趣的最好还是去自己看看,如果有jaxer大规模开发经验的,欢迎留言~

第一类我看得多一些就是这两个,另外还有很多在servlet server上跑rinho以及在apache、lighttd上跑spidermonkey的项目。但是总得来说大同小异——我见过比较另类的是把extjs跑到asp服务器上增强jscript能力的,据说很好用,而且鉴于国内虚拟空间的国情,这做法还真挺实惠的。

直接用js作为server side脚本的问题是因为体系结构不变,server和client的区分还在,结果client js和server js完全是不同编程方式。如果只是想用js写server也没什么问题,不过总会觉得有点不优雅。

于是第二类的方案本质上是修改了我们传统中的3 Tiers体系结构。这类方案里,client端直连db。server端基本不再运行任何业务逻辑代码,变成了单纯host html和js的静态服务器。

这类解决方案,我现在知道的就是OpenRestyCouchdb和dojo的Perservere,应该还有其他的。

OpenResty是yahoo一帮人搞的,现在还不开放注册,账号可以发信索要。这个项目提供一组REST和json访问PostgreSQL的接口。用了这个东西,开发的模式变成了,开发人员在前台写html+js客户端,直接操作后台数据库的内容。所有的业务逻辑代码都统一在前端的js代码中。openresty这个作者的blog据说就是用这种模式搭建的。

CouchdbPerservere从思路上和OpenResty没有区别。前者是很热的erlang项目。文档数据库,加之erlang这个东西,传说水平伸缩性无敌。这个项目一直很贴js,view直接用js写,访问走rest和json,包括他自己的管理界面也是直接用html+js做的。这里还有一个用js操作couchdb的例子(windows装couchdb失败的我,没有试……)。后者是dojo的一个子项目,也是对关系数据库的一个包装,好处是与dojo紧密集成。

当然用这种提供REST和json接口的Storage,前台并不一定是js+html,任何通用语言都可以。但是看上去这些项目都很往js贴(比如json而不是xml),毕竟browser上js独大,而现在在desktop上又有了air——air的跨平台还是很诱人。

如果扯大词的话,这种Client-DB直连的模式还可以扯到“云”中。比如OpenResty的服务也可以看成云存储的一种。于是后端用云做存储,前端在浏览器中做计算,大家还真是省事了,XD。(写到这,忽然想起来su27同学写过这么一个东西,gae的js interface。恩,好吧,多么的云计算呀)

不过目前看上去这种模式也有几个问题,一是代码安全,如果全是html+js,那就真是什么秘密都没有了。虽然可以做混淆,但不是万全之策;二是安全性,比如连接远程Storage的用户名和密码总不能放到js中吧?三是跨域,如果用第三方的Storage,这个问题也挺不好解决。综合2,3的话,至少目前来看想完全只用静态服务器也不太可能,还得搭一个Proxy中转。

最后,wiki上还有一个关于Server-side Javascript很完整的列表,可以参考。

虎头蛇尾的结束~

豆瓣海报墙Bookmarklet

2008-10-30 更新

因为google page不能用了,而且豆瓣页面改版,所以原来的东西失效了。

NullPointer提供了一个基于firefox greasemonkey的版本,在这里下载

更多信息欢迎到豆瓣插件小组的相关帖子里讨论

——–原文的分割线———-

原来一直设想把“喜欢这本书的人也喜欢”那个东西搞成Wallop那样的网状结构遍历。不过api迟迟出不来,所以现在那js搞了类似的东西,就是效果差多了(js想画线太恐怖了,svg又不是一般得慢)。周日抽空写了个这个,学del.icio.us director,做成Bookmarklet搞定了跨域的问题。不如原来想的网状遍历那样有用,不过挺好玩的。

到下面链接加“豆瓣海报墙”的Bookmarklet
http://sakinijino.googlepages.com/DoubanBookmarklets.html (已失效)

在任意的电影(书、音乐)详情的页面,点击Bookmarklet,页面会变为随机位置放置该电影(书、音乐)的海报

鼠标移动到海报上,放大并不透明显示
悬停到海报,显示标题
单击海报,把所有“喜欢这部电影(书、音乐)也喜欢的”电影海报随机放到页面上,并锁定放大加边框显示(远程调用需要等待一会儿,等待时间随网速而定)。同时,此后悬停到海报,将显示标题和简介(ff下显示不全)
双击海报,进入该电影(书、音乐)的页面
点击空白处,所有海报缩小尺寸并半透明显示

效果图片:
http://sakinijino.googlepages.com/DoubanPostersWall.JPG
环境:IE6, FF2, Opera9, Safari3下测试过。
已知bug:网速慢时,图片尺寸有可能出问题。

JavaScript2

很久之前看到的了,想了一些问题但是一直没写出来

首先语言的变化蛮大的。这里有个疑问就是语法上很向Java靠,可是微软从来没认可过C系语言用于继承的关键字是extend。虽然这个语言被称为JavaScript,但其实它的官方名字应该是ECMAScript。而作为一个Brower上的语言,微软的支持至关重要。

当然上面的问题只是吹毛求疵。最大的问题实际上是多久之后支持JavaScript2的浏览器才能被广泛使用。B/S架构最大的好处之一就是方便的部署和升级,然而这种架构实际上是将部署升级的责任由应用开发者转移到浏览器开发者,现在有人有能力去升级世界上80%的浏览器去支持JavaScript2吗?即使微软能做到的话,那么这种情况下Avalon也就可以实现了,那微软还会支持JavaScript2吗?就算支持,以微软的性格,恐怕也会先去保证自家的Avalon吧。

转机的地方是来自Java社区的掣肘。像我原来说的,OS与AS的对立会使Avalon得不到任何Java的主流厂商的支持,那么Avalon会处于很尴尬的境地。这样JavaScript2会作为JavaScript的升级,保持现在的地位而被接受。但这种局面真的好吗?因为这像是一个双输的局面,我们得不到一个完美、优雅的RIA方案,而只是在如今的结构上修修补补尴尬度日。