Skip to content

Dance me to the end of love

15-Apr-10

再次打开Leonard Cohen的音乐已是完全不同的环境。第一次听Leonard Cohen的时候还是在研究生宿舍里,无拘无束的心情下,听着他苍老的声音诉说发生在异国他乡的心情和故事。这就像在一个安静的小岛上吹海风的时候,一个阅历丰富的人要和你聊聊他的过去,也许也想听听你的故事。他可能是个诗人,作家,也可能是个吟游歌者。有很多事,很多心情,也许你只能说给他听。

Baby, I’ve been waiting, I’ve been waiting night and day. I didn’t see the time, I waited half my life away. There were lots of invitations and I know you sent me some, but I was waiting for the miracle, for the miracle to come. (《Waiting for the miracle》Leonard Cohen)

我曾一直讲给自己听:人一生最重要的就是要有一个守候,矢志不渝。就如树丛中守候猎物的枪手,黑暗中等待黎明的守夜人,目标明确,坚韧不拔,就算生命毁灭,身体也要化作一座雕像,眼朝守候的方向。

但这句我的个人箴言并没有让我摆脱自己的本性。我曾认为一种等候将是我的生命所旨,我曾为此坚持,哭泣,纠结,迷茫,甚至背叛。但最终我还是没有拗过自己的轻率和狂躁。我看着自己在这种守候中萎靡、退缩。

于是我给自己找了应一个借口:人最尴尬的地方就是人一生有无数选择,而你每次只能选一个,且不能重来。根据熵定律,每次试图重做选择的努力都会使最终结果变得更糟。所以我一直努力不向后看,不去看当年自己的向往,虽然心里依然存在很多幻想和侥幸。最终一种情愫种在了心里,如影随形,使我能在那些挣扎的夜里能平静的睡着,不会惧怕梦里涌出来的无限渴望。

后来,我发现自己开始模仿博尔赫斯,每天开始讲述我和我的朋友Garriot的故事。那个和我一样的人和我拥有一样的习惯却有着完全不同的心境。我怪戾、暴躁、轻率,而他却总是用一种相当理性的眼光审视我的行为,并向我诉说着他对我行为的疑惑、不解和愤怒。但幸好他还足够宽容,能继续耐心的陪我在一起,并向我说一些那些美好的回忆、故事和众多美好的传说。有时候我们会一起去酒吧,叫几杯烈酒,高谈一些人生得失,相互安慰,相互嘲笑。在那一刻,我们都会感觉生命如那些浅吟低唱般漫长,有时我们会为彼此的无奈相互赠予温婉的眼泪。

我总是想着那些故事,那些歌,希望有一个如《我心狂野》中白天使一般的人将我从这种回忆的挣扎和现实的泥淖中拯救出来,并给我指条不二选择的光辉大道,让我在白亮的日光中飘然而去。但我的那个好朋友总是善意地提醒一下我那是不现实的存在,而我可能也从未犯错,缺憾是人生最好的调味料。他指点我,当你无法成为一个真正的守望者的时候,就把自己放轻,让自己去做一个影随者,跟随时间一起流淌一起消逝,默默地陪着那些在乎的人一起变老,最终消失在所有的记忆和故事里,如同光芒落幕后的影子。

好吧,他总是能用这个理由说服我。我告诉他,我也许会成为他说的那个样子。他很自豪,他告诉我他会在我消失以后去买一个花园,做一个又老又胖的园丁,天天躺在慵懒的躺椅上晒那些亮白的日光,并把我们俩的故事讲给那些来玩的孩子们。其实他始终不承认,但我知道,他也相信有白天使,就像他知道我当年听那些歌的感觉。

Dance me to the end of love (Leonard Cohen)

Dance me to your beauty with a burning violin
Dance me through the panic ’til I’m gathered safely in
Lift me like an olive branch and be my homeward dove
Dance me to the end of love
Dance me to the end of love
Oh let me see your beauty when the witnesses are gone
Let me feel you moving like they do in Babylon
Show me slowly what I only know the limits of
Dance me to the end of love
Dance me to the end of love
Dance me to the wedding now, dance me on and on
Dance me very tenderly and dance me very long
We’re both of us beneath our love, we’re both of us above
Dance me to the end of love
Dance me to the end of love
Dance me to the children who are asking to be born
Dance me through the curtains that our kisses have outworn
Raise a tent of shelter now, though every thread is torn
Dance me to the end of love
Dance me to your beauty with a burning violin
Dance me through the panic till I’m gathered safely in
Touch me with your naked hand or touch me with your glove
Dance me to the end of love

网络英雄纪念碑

24-Mar-10

为了忘却的纪念。Google.cn, google.com也许即将上榜

唉,这事不能细说

升级到Ubuntu 10.04了

21-Mar-10

周五看到新闻Ubuntu 10.04的beta 1放出来了,晚上就把我的9.10升级了上去

打开terminal,运行sudo update-manager -d,就会提示你已经有了一个新版本,选择更新就可以。下载速度非常快,当时安装过程需要两个多小时。

更新完重启还出了点小问题。我的机器是win7,ubuntu双系统。更新完ubuntu10.04,第一次启动的时候,启动界面停在wait for window drive上那一步不动了。控制台输出一个moutall.c错误。用命令行登录进去发现syslog有很多挂载的错误。初步断定是服务器挂载windows的NTFS驱动器出错了。用命令行登录进去,把/etc/fstab里面的windows分区注释掉。启动就没问题了。

首先启动画面变了。也说不上来漂亮不漂亮,看9.10的时间长了再看这个觉得也挺好的。进去以后没发现什么大变化,就是social network的工具图标添加到右上角用户名旁边了,有twitter,flickr,facebook的支持。可惜在功夫网的保护下,这些功能对咱们来说都是浮云。内核变成了2.6.32.16。FireFox的默认搜索引擎变成了Yahoo。

Ubuntu 10.04的相关更新和信息可以看下面两个link

http://www.ubuntugeek.com/ubuntu-10-04-beta-1-released-and-download-links-included.html

http://www.ubuntugeek.com/ubuntu-10-04-lucid-beta-1-screenshots-gallery.html

另外,现在在Ubuntu 64bit上,还没有正式版的Flash 10的插件,可以根据下面的这个link用个试用版

http://www.ubuntugeek.com/adobe-flash-player-10-for-64-bit-linux-released-and-ubuntu-installation-instructions.html

(如果根据这个介绍里面你发现用locate找出来的不是那个flash的so的名字,拷贝的时候要按照找出来的名字拷贝)

豆瓣提供了一个简单的SSO应用场景

21-Mar-10

豆瓣电台上线以后,有人在twitter上问了一句douban.com和douban.fm之间的相互认证是怎么做的,是不是用到了cross-domain cookie。

实际上,cookie本身就不是为了跨域访问的设计的,我现在还不知道有真正的跨域cookie访问存在。如果存在,在一定程度上,我也认为那是个安全漏洞。

豆瓣的这个多个域名的共享认证是个典型的跨域SSO(单点登录)案例。虽然中间机关众多,但说一下其中的道理还是很简单的。

SSO,单点登录,有几个前提概念需要先说清楚:

1. 现在的SSO,大部分场景,都由一个专门的应用来提供认证。认证功能不像以前一样是内嵌在具体应用内部的。这个提供认证的应用一般都叫做identity provider,它所在的域我们称为认证域。这个应用会在你访问的时候简历你的基础认证信息,表明你在这个域里有个基础账户和基础权限。豆瓣的identity provider是http://www.douban.com/service/account/

2. 具体的应用,比如douban.fm,称作service provider。service provider里会有一个优先级相当高的模块负责检查用户请求是否是认证过的。如果不是,它会将当前用户请求用某种方式保留并重新导向用户到认证域去做认证。这种模块在apache里设置在最前的mod,在IIS里就是一个priority是High的ISAPI filter。它能在一切应用处理以前检查请求内的认证信息。

3. 虽然说cookie不是跨域认证的解决方案,但cookie在跨域认证的过程中却是必需的。因为HTTP协议的无状态特性,服务器端要知道新收到的请求是不是来自于过去认证过的用户,它必须在客户端留下一些信息,一般就是cookie的方式保存。也有例外,比如HTTP Basic的认证方式,cookie不参与认证,但用户名和密码是被浏览器保存在内存里的,每次都会跟随请求发送。

4. 关于整个认证流程,浏览器可能会在identity provider和service provider之间跳转多次,一些HTTP的监视工具可以帮助你发现这些跳转,比如ieHTTPHeaders。

一个简单跨域SSO的认识过程应该是这样的(以豆瓣的域名为例,但并不是说豆瓣一定就是这么做的):

用户发请求到douban.fm。douban.fm就是一个service provider,它上面的那个检查模块会先检查这个请求里有没有有效的认证信息。如果没有,它就把用户导向到http://www.douban.com/service/account/去做认证。这时的跳转URL类似http://www.douban.com/service/account/?return_to=http://douban.fm/ 。 最后的参数告诉identity provider,认证完要回到什么地方。

http://www.douban.com/service/account/作为identity provider会提示用户登录,并建立本地的认证信息,包括本域的认证cookie,和本域的session。然后根据跳转过来的URL return_to参数再把用户送回去。这时,除了return_to参数的URL以外,它还会附加一些认证相关的信息,比如在本域的认证id或者session id之类的。我刚登录的时候豆瓣重新导向我的url是http://douban.fm?sig=c3a7f19879&response_nonce=1269147513&data=%C9%ACVt%60%2C%C4K%89c%BD%07%B0Al%25%DD%F6%5D%D2%B2%E0%AC%16W%D9znW%935%AF%84%D4Vz%8C%9B%85g+%C3%C6%5D%FED9%96%84%D4Vz%8C%9B%85g+%C3%C6%5D%FED9%96&mode=id_res&return_to=http%3A%2F%2Fdouban.fm

后面的sig和response_nonce,data三个字段估计就是用于验证登录的相关信息。

当用户通过这个URL再次回到douban.fm的时候,那个检查认证的模块会发现这次回来的时候sig,response_nonce,data三个字段,然后用这三个信息从后台去identity provider寻求认证(比如socket去链接identity provider上的认证信息提供端口)。如果有效,就马上建立本地session和相关cookie信息以完成认证。然后再将请求放进具体的应用中去。这时候这个应用就得到了认证的用户信息了。

完整的跨域SSO应用场景:

上述只是一个简单的跨域SSO场景。真正的跨域场景还是要复杂很多。比如Google有自己的identity provider,service provider。但它收购一个不同域名的新公司,这个公司也有自己的identity provider和service provider,这种集成就要复杂一层,但大体流程还是这样的,只不过service provider和identity provider的概念稍微有些改变。双方需要有公认的IDP,而针对于这个IDP,其他的IDP就成了SP。而如果只在自己的域内,自己的IDP还是IDP,SP还是SP。

SSO的其它问题:

SSO是个安全问题。安全肯定是第一位的,信息传递时如何加密,如何仿冒,如何防止各种攻击(比如跨站脚本攻击)。除此以外,还得考虑如何保持用户认证session的有效期和同步,如何高性能的处理session过期。还有各种服务器的集成。

其实现在讨论认证,往往是认证和授权一起讨论的,但实际的SSO环境中,可能还要考虑认证和针对应用授权的操作和分离。

代码,有时不写也罢。

15-Feb-10

近来依然忙于SSO和ESB两个项目。这两个项目基本都不需要手写什么代码。SSO只需要从web console里配置好服务器和相关的安全策略。额外做的工作最多是用工具或者找个页面检查一下HTTP Head和Cookie里的安全信息。ESB需要的可能要复杂点,需要手写一些Xquery,甚至Java代码,而整个流程只需要在web console或者workshop里像visio一样拖拽节点就可以了,简单明了。我旁边的哥们不无沮丧的给我说:“唉,整天的任务就是连连看”。

我也已经记不起自己的上一行JAVA代码是什么时候写的了,可能是一年半以前写了一个更新LDAP信息的JAVA模块。我曾向Mr. V抱怨:唉,我离代码已经太远了,我可能已经什么都不会写了。Mr.V的回应向我传达了两个信息:第一,写代码的思想和能力就像骑自行车,一旦你学会了,就算很久不骑也不会忘记;第二,谁想一遍一遍的重复写那些代码。

我曾经也很纳闷,编码这么有创造性的事,为什么我们不干呢。有人也建议我们自己使用甚至写个domain specified language来处理web service可能还会比从头开始学ALSB,WLI更直观更顺手更快更令人兴奋。但谁会去做呢。

原因很简单:第一,我们不想重复发明轮子。既然已经有了ALSB,WLI这么成熟的Web Service集成模式,我们没必要从头开始按照自己的习惯早一个不知道会不会圆的新轮子。第二,手写的代码越多,项目的风险越大。项目的进程多多少少都是悲观的,最后我们往往会被淹没在漫无边际的代码里。ALSB和WLI这种开发模式只是让我们有了更好的方式去关注我们的处理流程,而不是代码细节。

重复每天的CRUD的java代码很难说就比画画节点的WLI强多少,但风险却很大。而在WLI过程中,我们同样会面对很多更深层次的技术设计和分析。不落窠臼的创造性更来源于对技术的挖掘,而不是门类。

Android上的应用,享受一下在云上的感觉

01-Feb-10

去年11月份,把手机换成HTC Hero了,就是坊间称呼的G3,决定把Google带在身上了。

换了3G号,装上一大坨软件,无论走到哪里,不自觉的看一眼手机,所有想要的信息都在上面,终于有点“云应用”的感觉了。

手机第一次启动的时候就会让你输入你的Google帐号,然后同步Google联系人,Gmail邮件等等到手机上,还会把Gtalk的头像也同步下来,很方便。我现在完全使用Google 联系人来同步通讯录了,不用担心换设备的时候丢失信息了。而且还能绑定Twitter、Flickr、Facebook帐号,让你无时无刻SNS。(这个大家还是无视吧,因为……墙依然屹立……)

More…

服务器搬家

01-Feb-10

安静了3个多月,就做了一件事:服务器搬到linode上了。搬着搬着,2009年都过去了。

从DreamHost上搬出来并不是觉得DreamHost不够好,而是觉得需要一点更独立的东西做更多的事。更多的自由度能让我觉得安全。

Linode 360的plan对我来说已经够了,用Nginx+ PHP(Fast CGI)的方式放了blog在上面。性能还可以,比想象的360M内存的机器好。据说Nginx + PHP-FPM才是现在php最awesome的运行方式,但php-fpm还不是php默认的配置,需要重新编译。我被ubuntu的apt-get养懒了,先这么跑吧。

另外,在用的过程中,我发现我的宽带服务商(杭州)华数竟然限制了SSH的访问。我从本地SSH到服务器的时候,5分钟能建立连接就不错了,大多数时间都不能建立连接,但是从我的手机上却可以轻松的SSH获取,使用VPN也可以SSH。我有点无语了,难道是因为SSH Proxy最近太火爆,连这个都受限了?!

2009年的年底实在是太sucks了,有几个经常去的blog都不能访问了。很多人都在向国外搬家,直接养肥了Godaddy,Dreamhost,Linode这些服务商。GoDaddy都支持支付宝了,令人大跌眼镜。

More…

有人自美国来

18-Sep-09

在Golive开始的时候,客户的一个架构师从美国来我们公司做一天的访问。

客户是一个北美非常出名的通信公司。我们team主要负责他们的SSO系统整合的解决方案与测试,公司还有其他team在做它的CRM系统和性能测试。这个架构师主要是负责SSO和很多应用系统的。

这个架构师是个非常有意思的人,看平时开会时的口气应该是职位不低,也许他boss的boss的boss就是VP了。平时我们在工作中有了失误,如果他说这个事已经捅到他boss的boss那里去了,那就意味着我们要看到“blood on the floor”了。
More…

GoLive, 结束了? 还是没结束?

18-Sep-09

断断续续4个星期了,Golive到底结束了吗?谁知道呢。

这次Golive真是惊心动魄,很多问题都没见过,而且在staging环境上都没出现过。
More…

RDD,新名词,简历驱动开发,以及架构设计杂谈

28-Jul-09

Golive不出意料的被推迟,总算有了点喘气的时间。

忙里也有偷闲的时候,看了几篇Mr.V推荐的文章。

其中一篇是关于MULE的CTO关于如何选择ESB的文章。文章里有一句话提到,那些滥用ESB的架构师和开发人员都是“简历驱动开发”(Resume-driven development)。他们使用ESB大多是为了面对下一次面试的时候,当面试官问“用没有过ESB”的时候能回答一个“yes”。

事实上,简历驱动开发(RDD)已经不是一个新鲜单词了。《架构师应该知道的97件事》里面,第一条就是“不要把简历看得比需求重要”。
More…