2011

February 5th, 2012 § 0 comments § permalink

总该为过去的 365 天写点什么。前段一直没什么时间,所以拖到今天。

2011 年我的记忆被分成三段,暑假前,暑假,暑假后。

暑假前我一直在为最后的本科毕业 project 忙活,现在回想起来,每天的生活都是 Eclipse 和 TextMate,在那个有些阴郁的房间里。四月的 easter 假期也哪都没去,宅在家里写一万字的 report。虽然最终没有拿到我想要的高分,但问心无愧,这个 project 让我学会了太多东西,最深的体会是如果不动手做一件事,很多问题永远都不会思考。比如,什么是 cool url?如何设计 url 结构?如何写出维护性高语义强的 HTML?比如 Twitter 的 RT 和官方 retweet 有什么区别?哪些内容可以构成长尾分布?这些问题每天都活在我们眼皮底下,可是只有实际去建造他们,才能看到他们的奥妙。我想这也是「建造」的乐趣。

暑假前也开始思考将来自己究竟要去哪的问题。看到朋友说拿到了 Google UK 的 interview 邀请,也把自己的简历投了过去。结果收到 HR 回邮说现在已经没实习生位置了,请来年一定申请,并和她保持联系。于是又开始打伦敦本地一些创业公司的主意,可是有趣的地方着实不多。面试了一家外包公司,使用 Ruby on Rails,面试过程中,我说了很多东西,包括一些很酷的技术和应用,两位面我的人竟然不知道我在说什么。两个星期后,他们说文化不和,到也不出奇。再后来,我看到了豆瓣的实习生招聘,想也没想就把简历发了过去。

这就是一个无比欢快暑假的开始。This is probably the best decision I have ever made.

工作内容细节我已经写过一篇软文:http://site.douban.com/widget/notes/2238024/note/172724855/

 

在这,我想写一些其他的。

我在英国的生活是这样的:一个人上课,一个人吃饭,一个人回家,一个人看电影。近乎所有的事情我都是独自完成。而在北京的生活则截然相反。任何事情,都是一群人嘻嘻哈哈的做。有时候算法哥搂着豪子说枕边话时,我在想,回英国我是否还能适应。所以在北京的三个月我过的非常开心。而且,在离开北京的前一天,我还见到了张玮玮、郭龙、马世芳这些久仰的人们。

北京后,我去了杭州,并以光速爱上这座城市。

冷不丁,就到了 10 月初。我搭上阿联酋的 A380,回到英国。搬了新家,有了新室友。

新的房间朝南,每天的天气不用查天气预报拉开窗帘就知一二。楼下的厨房配备明火,不像之前的住处只提供电炉。新的室友都是同胞,我做好的菜让他们尝尝他们会试一口然后点头说还不错。

我已经在上篇 blog 里抱怨了过去的学期,这或许是我在南安呆过最糟糕的一次。以至于我不会再向任何人推荐这里的课程。

然后,一年又结束。在我写 2011 的文章时,2012 已经过去了 1/12。妈逼的,时间过的太妈逼快了。

来不知深浅的说说咱们的国家吧。

可能不少人以为他们在豆瓣甚至在微博看到的中国就是他们以为的中国。看到对一些不公平事件成千上万的转发和吐槽就认为国家有希望。可是,我不清楚微博到底是消化了人们的愤怒,还是启蒙民智。至少从方舟子和韩寒的争论看,是前者。

这个政权的可怕之处在于将大部分人纳入体制的一部分,在这大部分人里,他们又被残酷的分裂开来。每一拨人都成为一座孤岛,夺取各自的利益。没有人愿意为了其他人放弃已经夺得的。所以像阿拉伯世界里的革命不可能在我们国家发生。唯一能期望的,就是我们的国家能像三百年前的英国,二十年前的捷克。

但更绝望的是,近乎所有有些能力的人都在逃离这个国家。于是这就成了一个悖论。没人知道,那天什么时候能来。今年不会和 2011 有什么区别,或许会更加绝望。

不过,文章最后,俺要推荐天师的一篇文章:http://blog.sina.com.cn/s/blog_4912b6e80102dv31.html

 

自由最可贵。没有什么能阻挡自由,哪怕政治。

好好吃饭,好好生活,再变得更强一点儿。

 

 

学期结束

December 16th, 2011 § 3 comments § permalink

这个学期又结束了。下午走在放学回家的路上似乎都不太相信这个事实。这两个月发生很多于我而言很重要的事情,不过这会不急着说。

还是想想这学期干了什么吧。

与以往最大不同是生活规律了许多。熬夜次数减少,早上贪睡的时间减少。连续工作时间变长。解决了一些注意力容易被分散的问题。对于这点,我自己很高兴。能更好的控制自己是一种进步。我也喜爱上每天早上去实验室抢所谓的 spot 然后开始一天的工作。这种良好习惯直接的好处是,某天早上管理实验室的 Toby 发放免费十几个个键盘,我抢到了一个。打开盒子一看,操,Cherry 机械键盘,还是我最喜欢的青轴(Click Action)。

学业上似乎没有太多变化。对无知的感悟与感悟有知成正比,承认自己无能并不以为耻。这个学期的作业除了 Genetic Algorithm, 其他都有些扯淡。尤其是 Web Services,module leader 是一个十足的 cunt(原谅我用英语世界里的终极粗口),不可耻的教一些没有人再用的东西,设计一份整个互联网都没有人在讨论的作业。同一个小组的 Phil 说,这个作业就是蒙着眼睛瞎 Google,一边 Google 一边 fuck。当然,能设计出 WSDL,甚至整个 WS-* 标准的都是奇葩。

对技术没有判断力是很糟糕的事情,不管你的头衔是 Prof 还是 Dr。也别在你那些没人关注的研究领域沾沾自喜了,醒醒吧。

越来越忙,所以看 Google Reader 的时间直线下滑。却也没发现有什么损失。微博也基本不再使用,也没发现有何不适。反而想到那无尽的「转发」就让我毛骨悚然。

I love and hate things both with a passion.

早安,中国。

 

 

 

杭州(2)

October 29th, 2011 § 4 comments § permalink

这里的 2 是可以是一个量词,可以是一个象声词,但不是形容词。

2 与 1 不经意间就已划过一个月。这一个月之间,无数扇贝死于暴徒之手。我于心不忍,尤其不能忍受他们不是死在我的嘴下。

脑里打过无数草稿,却都不喜欢。4 天很短,却发生很多事,我好像没法一口气写出来。把他们拆开来吧。

 

 

环湖

不绕着西湖转一圈似乎对不起父母给的双脚,更对不起法国人发明的单车。在西湖的第一个白天,辛夷带着我和妹妹就从杨公堤开始骑起。一路上骑骑停停,最终也没能绕一圈。所以第三天,借来辛夷的单车又和枫以及水妖开始环湖。

枫骑的是一辆羊角公路车,穿着紧身骑行衣。遗憾的是,他的骑行裤略显短,一双白色的短袜露出它们皎洁的微笑。不过比起隐蔽的白袜,我的娘炮似乎更显而易见。夜晚路过苏堤,前方有一群人,枫拉风的从他们中穿过。我骑着一辆女式永久双腿外八从后面气喘吁吁追赶。群众的心理活动似乎都可以预见,看到枫:啊,好专业的小伙子。看到我:啊,这是怎么回事?

水妖见到我的时候大笑我的车。我一生气,就把他拽过来,抱了一下。早在三个月前,我在饭否上看到 Amour 童鞋说起她要和水妖在泰国骑车相见,更早她俩也问过我间隔年网站的问题。我一直以为是个姑娘,结果是个小伙。所以拥抱的时候,我很气愤。所以你看,再持久的美好幻想可以瞬间澌灭。

剩下的环湖路,就是我踩着车气喘吁吁的追赶他们二人。

你看,这哪是环湖。一点湖景都没写嘛。可是,经过苏堤望着两边湖色我胡思乱想的事情肯定不会写出来的。

除了骑车环湖,我还步行迷你环湖。所谓迷你,即是穿越苏堤再走上杨公堤。以现在网络标准,我在苏堤上背苏轼的词必然是二逼青年干的文艺事。没辙,我喜欢苏辙他哥。苏堤的两端人很多,中间却只是稀稀拉拉的游客。这证明了大多数人们依然只是进行下车,拍照,撒尿,上车,睡觉这样的行为艺术。苏堤靠近南山路的出口有苏轼的纪念馆,里面细述了他的生平还有他在杭州的一些趣事,这些如果你看过林语堂的《苏东坡传》想必都不陌生。二楼的纪念馆展览苏老师一家的书法作品,摆在门口的是《念奴娇 赤壁怀古》,这是苏轼醉酒之后的作品。我站在那盯了很久,憋出一句话:这字真他妈漂亮。

从纪念馆走出来,恍如隔世。还得多谢刚从一辆旅游车走下来的大妈们,她们把我拉回现实。她们的导游,看上去很年轻,年纪估计与我相仿。用麦克风介绍苏堤由来,末尾说:呐,那边有苏堤两个大字,不和那两个字合影以后别说你们来过西湖哈。大妈们一听完不干了,一个个拉着伙伴,说:走,走,快去合照去。然后剪刀手在我眼前飞舞。

哦,对了,如果我没记错,苏堤上一共有 6 个拱桥。

 

爬山

送完妹妹离开杭州,我和她的两个朋友一起坐公交车回在外东山弄的住处。路途不短,公共交通综合症发作(一种病,一上公共交通工具就犯困)一路昏睡。下午暖洋洋,阳光照进车里,这样钓鱼却也舒适。到了住处,简单收拾一下,和小白约好去爬山。这小姑娘要过一会才能到,我决定先去拜会岳飞先生。

走到一个大路口,一个看上去像正在散步的大妈突然和我攀谈起来。具体对白我已经记不清。但是她向我建议应该给父母买什么作为礼物带回家,并且为我指了路。说完这些,连再见也不说,她又飘然离去,全然不顾我的莫名其妙。

岳飞庙在西湖的北边。他老人家占据一个风水宝地,所谓坐北望南。于是,这样的风水宝地便需要门票费 25 元,且不接受学生票。我大为恼火。走进去转一圈,更火,他妈的什么都没有。介绍岳飞战事的文字还把「扬州」写成「杨州」,错别字却也可以饶恕,这俨然是一片爱国主义教育基地的架势。实在忍不住这样一股味道,捏住鼻子,撤。

和小白约在爱国主义教育基地旁的肯德基见。

说实话,在北京时,除了卖萌,好像没有其他交流。所以她说要爬山时,我有些怕冷场。结果,该死的,没多穿衣服,在山顶冷死了。爬山时,她和我说起以前在这爬山的趣事以证明这条路她走过,我则在内心不断怀疑其正确性。虽然比起过往暑假爬过的所有山,宝塔山不过是他们其中一天行程的 1/100,但还是让我在爬的过程中有些怀疑人生。在聊了些八卦,谈及些许人生理想后,我们来到山顶。

一片开阔。脚下是西湖,近一点儿的是白堤,远一点的是苏堤。东边是城区。或许西湖最大魅力在于此,抬头是当代中国,低头是千年中国。

我带了相机,但无奈天色已暗。正想着放弃。小白向在山顶一群摄影爱好大叔借来三脚架,摆在我面前,说,拍吧。我仔细想想,懒惰如斯,上回用三脚架是啥时候,我都想不起来。借我脚架的大叔问我是哪人,我说,珠海来的。他回我:「从珠海来能到这很了不起,这里才是最好的杭州。」

我臭屁了大概 1 秒,然后反应过来,我靠,大叔,我朋友是杭州人啊。没她,我也不知道有这地。

反应时间如此长,因为实在太冷。养肥千日,用肥一时。冷风来袭,赘肉为稀。

但是,当白堤和保俶塔的上的灯亮起,冷似乎已经不是最重要的感受。我在苏堤走的时,想了想,曾经把杭州作为首都的朝代,没有想到(后来查,五代的吴越国选过杭州作为首都)。再想,为什么没有统治者愿意这么做,因为无论从哪个角度杭州都是一个很好的选择。我猜,如果首都是正房,杭州大致为小妾,正房不可丢,小妾不可无。从乾隆来这么多次杭州就可看出(西湖十景都为他所题)他对这里的喜爱。谁愿意毁一座美丽的城市呢?

 

从味道上说,杭州不算美食之城。浙大旁边的西溪滋味很好吃,外婆家和绿茶却也不错。可是总是觉得差些东西。在北京,大槐树烤肉永远让我牵肠挂肚,就更别提家里的什么白切鸡、干炒牛河、三丝炒米线等等等等了。盛名之下的知味观和新丰其实难付。

而中国人总能赋予吃饭很多意义,所以和谁吃往往比吃什么重要。让我难忘的,除了在西溪滋味里要葡萄,还有在路边的两次大排挡。第二次,我不会写。

那是和水妖、枫骑完车,我们在浙大正门对面挑了一间大排档,也叫上了辛夷。

水妖说他最多只能喝两瓶啤酒。可是当我叫加几瓶时,他又从服务生中拿过去一瓶。我问他在东南亚骑车的故事,他说的风生水起。我心里被挠得直痒痒。他问我,我和 Amour 如何相识。我又被自己过往数次的藏区之行挠得直痒痒。席间说到他求职之事,我突然意识到,所谓臭味相投,就是这几年认识的朋友虽然分散祖国各地,但慢慢都要在北京聚集了。

那晚大致就是如此,干着我一生中最喜欢的事情之一,喝啤酒,扯无尽的淡。内容记不清了,但记得拿啤酒瓶走一个的情景,还有每个人笑起来的样子,比如枫龇牙咧嘴的样子。

后来水妖太冷,操起雨衣就套到身上。那一刻,我知道,这哥们醉了。

 

寺庙

大吃大喝后,当应大彻大悟。

在第一天辛夷带我们环湖的路上,我们舍弃雷峰塔,转向这个没太多人光顾的寺庙。那会寺庙里桂花已开,辛夷仔细闻了闻,然后说,桂花香搭配着香火位,好香啊。旁边一个僧人听到她的话,轻轻的笑了笑。我看着那位僧人,也轻轻的笑了笑。

净慈寺依山而建。我们爬到半山的一个大殿时,有一只小兔子朝门口蹦去。我也跟着兔子追去。外国友人还以为在拍 Alice in Wonderland 呢。我以为某位僧人如此有爱,竟以兔为宠物。遇见一个僧人站在门口,便好奇问:「这兔子是怎么回事」,僧人笑答:「这是别人在我们这放生的。」

大约半个月后,我来到广州的一个寺庙。这里很奇特,他在广州越秀老城区,北京路附近,地处广州最繁华路段。寺庙周边都是高层建筑,所以造成寺庙里的广场犹如澡盆的错觉。悲哀的人们依然在无尽的烧香,真正有信仰的人们在不懈的念经磕头,无聊的游人如我在漫步四方,更无聊的游人在不停拍照留念。溜到厕所的时候,有一只小猫慢慢走过来,然后一头钻到我的脚上。我轻轻的拿起他的头,离开几步,他又贴上来,把头依偎在我脚上。如此反复,他还是不放弃。我从来没有遇见这样的场景。一旁的阿姨说,这是佛缘啊,你就带他走吧。那一刻,我也动了念头,可是几天后我也要走,还不知道谁收留我呢。Modern Family 里 Phil 的话也在我脑里飘荡:Adopting a pet is a big family decision,于是想想作罢。

回到杭州。在寺庙这么高雅的地方,不思考低俗问题是不行的。我和辛夷商量了一下西湖边的房价发现没有比在这出家更划算的事了。更何况,济公也曾在这修行。每天早起早课,扫地。下午看书、晚课。周末可以转西湖爬宝塔山。甚至从僧人们的日记还得知他们还有组织去其他寺庙进修的机会(你可以想想有多少名刹是在著名风景区的)。

相比起来,写代码住孙家村可真是逊爆了。于是,在杭州的倒数第二天,我和辛夷又去了灵隐寺。

 

 

Zeijiang University

就不写,就不写,就不写。^_^

 

我是听着张过年,喝着啤酒写完这篇 blog 的,脸上不时微笑连连,因为我知道,我拯救了很多无辜的扇贝。

Buongiorno, mio principessa!

我在杭州 (1)

September 27th, 2011 § 3 comments § permalink

去杭州的原因很简单,都在那。爸爸妈妈一如既往的支持,只是问,去那干嘛,我回答,有事。小叔说,带上妹妹吧。我说,好。

出发前两天,辛夷发来短信,说,我和枫决定了,你来的时候帮你找一辆车,我们去绕西湖。看到短信的时候,我在老爸的饭局上喝醉,甚至到第二天我想起酒精还是反胃,这可从来没有过。我有些担心,在杭州不能没有酒精。

出发前一天,我拿到了车票。淡蓝色的背景,黑体字写着,合肥至杭州南。我又要去一个新的城市。

杭州南在萧山,与杭州市区隔着钱塘江,所以后来我看到地图的时候才反应过来,原来第一个晚上野的就带我们过了一次江。

野的在城站放下我们。现代化的交通工具魅力就在于此,早上你还可以在合肥的家中赖床,享受家里的安静和懒惰,几个小时后,你就背着背包站在一个崭新的城市,两耳边飘荡着蒋介石口音的普通话,还有,无数量空车的士的拒载。无奈之下,只好搭理一直在搭理我们的野的。

给我们开车的是一个小伙子,光头,不到 30 岁,外地口音,与我和妹妹一样。他解释道,「我们就是干出租车不干的生意,放心,保证把你们送到。」

「你是哪人?」 我好奇的问。

「苏北淮阴。」

「江苏也很好啊,为什么要来这?」

「我一家人都在这,爸爸妈妈,朋友,都在。」

我在杭州的最后一天读完《寻路中国》,所以对这样的对话记忆深刻。

就在这会,一个电话打了进来。他说句不好意思,然后接起电话。里面传来一个女性的声音。他解释了一番,挂了电话。

「你老婆?检查呢?」 不要怪我八卦。^_^

他不太好意思的点了点头。

我对杭州的初始设置一直是风花雪月。连痴情男子苏轼老师也在这里点化了一个歌妓。所以当我看到「解放路」、「求是路」 这样的路名时,有些幻灭。不知当年起名时,他们是多么的没有美学观念。西湖十景里的名每一个都很美丽,比如柳浪闻莺、曲院风荷。可是当你指路时,你却需要说出这样的话语:柳浪闻莺在解放路附近。任何一颗风花雪月的心也被染红了。

不过这样的路名不能阻挡我对杭州美好的的第一印象,路两旁的枫树实在夷人。快到住处的时候,一阵凉风吹过,我问,是不是在西湖边?开车的小哥说,是,很凉爽吧。我问他怎么看待杭州,他回我:「这是有钱人的天堂,对于我们,哪里都一样。」

这位小哥没能按他承诺那样把我们送到酒店门口,因为他也不知道如何进入酒店门前的单行道。我还是按照说好的价钱付好钱,拖着妹妹的拉杆箱,一路问,一路走到住处。

辛夷上完了瑜伽课,枫也从学校赶过来,7 天,整整一个星期,又要在杭州见了。

在一家用鸡精煲鸡汤的火锅店匆匆吃过夜宵,枫冒着大雨骑回学校。两个姑娘都说这很冒险,两个小伙都说,没事,回去洗个澡会很爽。这让我想起小时候,一下雨我就冲出去,嘴里喊着:冲啊。所以,每个小伙心里天生都有一股英雄主义,甚至连淋雨都是一种表现形式。

可是我身边还有俩小姑娘呢,所以我就很娘炮的陪着她们坐在麦当劳,等着外面的雨消停下来。

也就是这场雨后,杭州市民从夏装变成秋装。

我和妹妹睡到第二天 10 点,慢悠悠的走去浙大正门。隔着玉古路,看到辛夷坐在单车上,昨晚的短裤已经换成牛仔长裤,脚蹬在地面上。

浙大校园很漂亮,草地、绿树无处不在。可我还是很费解,一个在西湖边上的校区,有着玉泉这样的名字,却树立了一个巨大的毛泽东像,就好像他在监督每一对在校园里打野炮的情侣。

辛夷给我们弄来两辆女式单车,一顿韩国料理后,我们骑去西湖。

后面的事情,就需要 2 了。

一个县城

September 19th, 2011 § 1 comment § permalink

因为家里有事,时隔 N 年,我回到生活过 7 年的县城。

以前从肥东去合肥大东门需要花两块钱坐 40 分钟的汽车,从大东门到市区还需要再坐其他公交车。所以当小叔开车用时不到 20 分钟就从合肥的家抵达肥东县城时,我的所有回忆就崩塌了。

我们的车停在县委门口。县委门口是一个斜坡,在我印象中,那一直是一个巨大的斜坡,如今再看,俨然迷你。我在这个斜坡的右手边的一家医院里做过大拇指手术,因为小时候把钉子钉到指甲里了。如今,取而代之的是一堵墙,上面写满了我党的口号。小时候,爸爸要喝啤酒家里又没有的时候,我就会揣着钱走到县委办公大楼后面的一个小广场买酒,这次经过的时候已经面目全非,还是我的姑妈说,这就是你以前买酒的地方啊。我按照指示看过去,只见一个大门,门口堵了数量车,喇叭按的镇天响。

我努力的在脑里挖出过往的记忆,为的是与现在场景挂上钩。不过这是徒劳。时间和推土机已经彻底把这个县城在我心中毁掉。远处的街道上人头攒动,但是与我无关。我站在斜坡上,决定哪都不去。

斜坡的左手边有一栋破旧的建筑,三楼是一家英文培训学校,名字是:高而基。我费劲心思也没想出它和英语的关系。唯一的可能性是,老板,高,而,基。

站在斜坡上的时候,有一个大妈塞给我一张印刷粗劣的传单,上面写着:炸鸡中的战斗机,made in america。

晚上,爸爸的旧友请吃饭。其中有几位和爸爸是生死之交。我讨厌敬酒这样的事情,但看在场合特殊,却也破例。酒过三巡,其中一个以前和我呆过一个暑假的朋友得知我在英国读书,开始语重心长的和我说大道理,歌词大意:

我知道你现在觉得英国好,但是我跟你说,其实还是中国好。你回国后就知道了。很多留学生都是这样,出去都说外国好,其实不是的。共产党还是很厉害的。

我有点醉,听了听,笑了笑。

吃完饭,他和他的哥哥说,走,叫上你的妹妹,我们去玩肥东特色的东西。

我还是笑了笑,用不知道什么理由搪塞过去。

之前给我说大道理的朋友的母亲和妈妈是同学,也是老爸的旧同事,她今年已经抱孙子。

没有交集的十几年后,就是这样。这是一个县城而已。

屌!

September 13th, 2011 § 2 comments § permalink

在等着巴萨和 AC 米兰的欧冠比赛。于是终于有时间码点儿字。

我要说一件让我激动到爆的事。

上个中秋前的周末,广西师大出版社组织了理想国的活动, 13 号要赶回家办事,正好 11 号下午是张玮玮和郭龙的表演。本来 10 号就计划离开北京的俺,为了他们俩,把飞机票定在了 11 号早上。

这两年来,我最想看的现场就是他们。

结果,周六下雨,北京的天气也直接迈入了冬天。我算计着演出会被推迟或者取消,所以懒洋洋的从东四环晃悠到前门大街。到了现场,保安说,演出转到地下。仔细一听,远处已经听到了手风琴声。我一个不淡定,冲了进去,然后淡定了,还没到他们。

所以我一边不认真的听着另一支乐队,一边在找玮玮和郭龙。眼睛还没扫过 180 度,就看到了马世芳,内心的基友之情便开始勃发。后来我也不知道为什么,我回头看了一下大门,结果,看到一个穿着黑色西装的背影飘过:张铁志!

然后捏,俺的追星族模式就被开启了。

我在去年去英国之前带了一本书叫《声音与愤怒》,讲的是音乐与社会运动间的关系,换一个虚无缥缈的说法是,音乐能改变世界吗?封面的内页就采用了这个标题,我把它拆下来,挂在写字台前的墙上整整一年,每每在学业上遇到难题时,我就仰望 45 度角开始怀疑人生:音乐能改变世界吗?

后来在伦敦,我把这本书漏在了该死的 135 路公交车上。于是今年暑假回国,我上淘宝的第一件事就是在老罗的书店又买了一本继续看完。

我内心把这个故事想了一遍,啄磨着下次见到铁志的时候让他感动一下。

因为演出在地下,而我到晚了,所以一直只能在上面等着基友们从我背后的楼梯上来。追星模式被开启后,我的脑袋大概以 5HZ 的频率转动,生怕错过。

很快,有鱼上来了,还是铁志,他站在背后入口,无所事事。

虽然我内心已经把见面稿说了一遍,但是他妈的脸皮薄,我还是按耐了一下。等我再回头的时候,我崩溃了,张玮玮和他并排站着。

俺作为一名新兴基友的矜持和北京的夏天一样,迅速消失。

「你好,玮玮!」

「你好!」 玮玮淡淡回应。

不能冷落另一个基友,俺对着铁志说了一声,「铁志,你好!」,铁志微笑回应,「Hi,你好!」

事已至此,事先编好的剧本已经不顶用了。我不会说话了。

还是铁志接过话茬,开始聊我穿的豆 T,玮玮也有了兴趣,我问他:「你要吗?我可以给你一件。」

玮玮回:「算了,我还是别给豆瓣做广告了。」 这种变相要地址要电话的方式失败了。

中间一个姑娘插入我们的对话:「我很喜欢豆瓣!尤其是豆瓣电台,他们推荐的歌我都爱听!」

我只能娇羞的说:「俺一定转达。」

聊到这,一个可耻的想法在我心中冉冉升起,我要合影!

可是身边没相机,我找了个远处的姑娘,用她手里的 iPhone 4,拍下了铁志、玮玮、郭龙和我的合影。后来看照片,真是传说中的笑的合不拢嘴啊。

后来,玮玮和铁志离开。郭龙留下来继续和我们聊,我问了新专辑什么时候出,他说,在等万晓利给他们做后期,明年开春就发。中间又来一个姑娘,特别认真的对我说:「刚才听他们现场,他们的音乐可棒了!」

我想,能这么近距离的接触在认真做好音乐的人真是一件幸福的事。无论你是刚发现他们,还是发现他们很久。

更重要的是,面对每一个这样的赞美,郭龙都会轻轻鞠躬说:谢谢。

音乐会结束,郭龙先下去收拾乐器。我一直在上面等着,就像在女生宿舍下苦等两小时然后对着心仪姑娘说好巧啊一样。过了好一会,郭龙背着乐器上来,看见我,先打声招呼,说,兄弟,走了啊。88。

跟在他后面的是,玮玮,铁志,还有马世芳。

我决定跟在他们后面,也跟马世芳打声招呼。

于是我又不淡定的冲了出去。

「Hello,马芳!」

「嘿,你好!」 和铁志一样,他很开心的回应我。

接着我就在搜刮下一句了,甚至差点回了一句,nice to meet you。

我他妈当然不可能那么搓啊,所以俺回了一句:「很高兴认识你。」

马芳的回复还是很让人温暖:「我也是呢。也很高兴认识你。」

我笑了笑,像见老朋友问:「天师呢(张晓舟),怎么没看到他?」

「哦,他去逛书店啦。」

「这个混蛋。」 我俩相视一笑。

「什么时候出新书?」

「年底吧,会把在诚品讲堂的内容整理起来。」

剩下的,就好像是很久没见到的朋友开始攀谈。最后,还是可耻的要求合影一张。

他上车后,我又懊悔起来,应该跟他说我有多么羡慕他和天师还有陈升去台南玩这件事的!!

一个下午,将两年来所有想见的人都见到了,还认真的聊了天。

我只能摇头晃脑,在周六淅淅沥沥的北京城,暗爽到内伤。

Revolution

July 20th, 2011 § 0 comments § permalink

来北京一周,认识了很多有意思的人。

其中一位 so called 「算法哥」,我看了他的博客。如果不是每天忙于工作和笑,一定会仔细通读完。

本身中文博客写的好的就没几个,能让我想长时间读的就更少了。

尤其是跟他戏虐的聊过几个话题后,对于将来想做什么事情又更加清晰了一些。

仔细想想,过往几年,我的认知过程有些不少变化。从一开始的什么都关注,努力做一名知道主义者,慢慢的,关注的范围越来越窄,直到最近,我发现,Google Reader 已经有些日子没打开了。

对新的信息似乎已经没有新鲜感。尤其是对于浅层的「告诉你」形式的信息更是没有兴趣。与之相反,读技术型(不限定 IT)的长文分析甚至书籍的兴趣比以往任何时候都大。

我想,当你知道一定量的东西后,对于很多信息的存在和事情的发生都可预期。而真正有意思的是,他们为什么存在,又为什么发生,他们的遵循的规律又是什么。

我不知道的东西还是太多了。很可惜,每天忙的最多事是过滤信息噪音。

每一年都察觉到一些变化。但是对于记录的兴趣一直没有改变。大概在 07、08 年的时候我读到陈晓卿谈纪录片,包括看 BBC 的一系列纪录片我意识到,记录这样东西不会因为时间而贬值,也不会因为时间而失去 context。反而会因为时间的推移而变得愈发珍贵。所以在 08 年开始的 Blog 我一直在记录,在记录我看到的两个国家。去年在开罗的埃及国家博物馆参观时这种想法更加强烈,尤其是我盯着一张拍于 80 年前的一张黑白照片的时候。那张照片构图用光都很糟糕,但是它忠实的还原了一架法老使用的金色马车出土时的样子。我站在那看了很久,然后恍然大悟:操,我他妈为什么拍照片的时候就要想那么多花招呢?

此文是为标记。We will see in the near future.

晚安中国。

I’ll Find Another You

July 6th, 2011 § 0 comments § permalink

这篇文章本来的题目叫伦敦、迪拜、香港三日游,我一直都很烂俗,所以这种烂俗题目太适合我了。但是转念一想,我应该高数玛利雅一点,所以换了这个题目。

我对伦敦的感情太复杂了,所以不写。从迪拜开始写起。

到迪拜是当地早上,英国的凌晨。几天只睡了不到 5 个小时的俺恍惚的走下飞机,迎接我的,自然是中东的酷热。飞机降落前窗户外是波斯湾的一片蓝色大海,飞机在迪拜市中心上空逗了一圈,对准跑道 30 R,这台载着两百多号人的波音 777 300-ER 稳稳落地。我喜欢阿联酋航空在机顶上放了一个摄像头,让所有乘客都能确认,飞行员在把我们带去一个正确的地方。

我自小爱飞机,尤其是民航客机。从机翼、尾翼、发动机布局就能看出一架飞机型号是多年练就的本领。我甚至可以就这么站在机场,看着飞机起飞降落起飞降落,这么看一天。因为我一直觉得,能够精确控制几十吨的金属物体在空中飞行是尼玛很牛逼的一件事情。

但是小时候一直坐的是小飞机,能坐 757 都开心的半死。London Heathrow 和香港 HKG 让俺过足了大飞机瘾。但是直到迪拜,这个不知道应该说是富到流油还是流油到富的城市,我才发现,他们都是浮云。

坐摆渡车绕机场跑的时候,我至少看到了 30 架 波音 777-300 ER 和 A330-200,还有数不过来的 A340-300 or 600,当然还有零星的 A380。第一次,第一次,看飞机看到有点恶心了。

有钱佬真讨厌。^_^

走进迪拜机场 Terminal 3,一个三层楼高的喷泉霸气侧漏的摆在你面前。上到出发候机楼,以为走入菜市场。Chanel,Gucci 这些牌子犹如猪肉摆在路两旁,人来人往。我揣着 5 英镑,走到兑换外币的地方,想着为老爸换些外国钱币。招待我的是一个戴着金丝脚架无框镜片的中国男子。我顿时恍如隔世,好久没见到这幅装扮的中国人了。我是在国外吗?他的同事是一个印度裔样子的女子。他们身后,是穿着西装的阿拉伯上司。

我拿着换来的阿联酋货币,一边塞入钱包一边融入机场里的人流。耳边有英国口音、美国口音的英语以及各种鸟语花香。广播里阿拉伯口音的英语在不断提示,伦敦的要登机了,休斯顿要登机了,我甚至听到了杜塞尔多夫。

你知道吗?当记者问维珍创始人 Richard Brandson 怎样成为一名百万富翁时,拥有维珍航空的他说,先成为一名亿万富翁,然后买一家航空公司。

迪拜机场第一眼看上去很牛逼,其实细节上很糟糕。指示牌颜色对比度低,高度也不合适,从远处甚至看不到闸口号码。竟然去男厕也要在外面排队,人流导向也很差,所以有了上述的嘈杂感觉。

所以,钱不是万能的。设计,更不是花钱就能解决的事。光鲜下,人们热爱追捧光鲜,却看不到随处可在的衰败。

飞机起飞后,我在窗口看到了那座一公里高的怪物。迪拜本身就是一座怪物城市,我在看 Human Planet 的时候就觉得,这不就是 Wall E 废墟城市的背景吗?

快离开这座城市吧。

在 online checkin 的时候我就知道这架飞机要经过北印度,所以特地选了 A 窗口,因为这样可以见到珠穆朗玛峰。所以从迪拜起飞后,一直留意着时间,当飞进北印度的时候,就打开一点点窗户,顶着烈日,在找那一排排雪线。

当然,给我找到了。这种去了藏区留下来的雪山情节想必就这么随我一生。

到香港的飞机是在 07R 自西向东降落的。所以降落前,飞机飞过了广州珠海,横跨伶仃洋。我望着隔着 30 海里的另一岸,一阵悲伤:回去的船没了,今晚要在机场坐一晚。

这是亚洲最繁忙的机场,但在凌晨 4 点时,到达大厅也空无一人。只有零星的工作人在远处打着瞌睡。我身边也坐着一批人,不知道他们为什么也像我一样耷拉着头,在半睡与半醒中期盼着这一夜快些过去。在离我一个座位的地方,有一个大叔,躺平,呼声震天,俨然把机场当家。而我拘谨的把放电脑的包栓在腿上,然后再用两只脚押着装衣服的大包。5 点的时候,机场人越来越多。不远处的商家也开了门,话说昨晚才在它家买了一杯饮品。地球自转几小时候后,他们又开始了新的一天。本来 14 大大说今天会是台风,但是清晨,阳光还是照进了这个曾经世界上最大的单体航站楼。耳边的语言从在 Gatwick 的英语变成了熟悉的广东话,还是恍惚的告诉了自己,我回来了。

起身去厕所。拿出洗漱包,认认真真的刷牙洗脸和眼镜。过往三天近乎无睡眠的疲倦仿佛一扫而空。我背着两个沉的要命的包,从厕所走出。

行李似乎总是这样,明明你已经在打包时减重了,可他们依然还是那么沉。

走回原本坐的位置时,发现那个位置旁边坐了一个中年男子。他看我走了过去,便问,:「小弟,你叫什么名字?」

「叫我 Andy 就好。」

「你信耶稣吗?」

我内心一阵独白:「耶稣啊,为什么我都离开英国了,你还是要找我啊!」

「我不信」俺还是很有礼貌的微笑答道。

「没事,我来接我从多伦多来的女儿,可是到现在也没找到她,能帮我想办法吗?」

这可有点麻烦,我说,帮你上网查查看看航班几点到的吧。

他回:「航班已经安全到了,可我们就是没找到她啊。她也没香港手机,也不知道我们的通讯方式。」

「那她肯定不会离开机场啊,为什么不去找呢?」我很不解的问。

「我在这里祈祷呢,孩子的妈妈和妹妹去找了。」

在那样的场合笑出来实在太失敬了,但我差点笑出来。

我想最重要的是让他放弃祈祷,起身去找。

半个小时候后,他回来了,和他的妻子和小女儿。依然没找到女儿,但是他对妻子说:「这是今天早上 God 赐给我们的天使 Andy。」

这个我真的没法忍住,只能把对自己的放荡嘲笑内伤地化解成一点点微笑,然后挤满脸庞。

又是半个小时后,和 14 约好的时间要到了。我背起两个包,朝机场快线走去。穿梭人流间,看到那个戴着眼镜的虔诚基督徒抱着他痛哭流涕的大女儿。

这让我想起早上,他在起身找女儿前,将他手上的一本迷你版圣经塞到我手里,说:「祝你父母安康,祝你学业有成,God bless you。」

那一下,我真觉得无以言谢。只得以起身轻轻鞠躬,用最无力的语言说:「谢谢。」

痛苦的漫漫长夜因为清早的这一件小事而变得微不足道。

—————————–One More Thing——————————————-

我在回香港的飞机上,其实一直在读 Kindle 上的书。并没有怎么用小桌板上方的娱乐系统。大概是在找喜马拉雅山的时候,闲来无事,随便乱点小屏幕。意外的发现他们竟然有 60 年代 UK 金曲集。我仿佛捡到宝贝,赶紧带上耳机听。很多歌都听过了,但是这一首一听到便深深的爱上:I’ll Never Find Another You

我他妈才不管身旁的坐着一美女呢,跟着旋律就摇头晃脑起来了。^_^

能把人心底里的美好通通勾出来的音乐总是让人上瘾。

Google App Engine 开发总结

May 19th, 2011 § 2 comments § permalink

我的毕业 project 是在 Google App Engine 上完成的。

当初选这个平台有很多原因。曾经也考虑过其他平台,比如 Amazon Web Service,但是后来考虑到开发速度,还是使用了 GAE,毕竟 AWS 还需要自己去搭建一个完整的 web 服务。而且 V2EXLivid 也给了我很大信心。

而在 GAE 上,一切都准备好,需要做的只是写好代码,部署,job done。

当然,便捷就意味这有很多约束,需要根据 Google 制定的规则来玩。这也是写这篇的文章原因。还有一个原因是因为我明天要 viva,算是对这个平台技术细节的复习。

部署在 GAE 上的应用在国内是全部访问不了的,这确实带来了一些麻烦。但我现在已经基本不考虑这个因素了,翻墙应该成为一个公民的生存技能。不过为了方便我国内的朋友们,我最终还是使用 nginx 和 AWS 用反向代理解决这个问题。

我在 project 里使用了 GAE 提供的 以下服务:Images, Memcached, Task Queue, Blobstore,当然还有每一个 web app 都无法不用到的 GAE datastore。

Images 的 API 很简单,其实 Google 提供的这一系列服务,还包括其他的诸如 Mail, Users, Channel 都能很快上手。文档写得也很清楚。即便有疑惑,去相应的 Google 小组也很快能获得答案。回到正题,GAE 提供了一套工具能完成剪裁、旋转、缩放等操作。对于储存在 Blobstore(Binary Large Object)里的图片还能调用一个函数直接获得图片 URL 并同时进行剪裁和缩放。Project 里的所有头像因此都采用这种方式,用户上传,放在 Blobstore 里,app 读出来,根据相应的尺寸进行缩放。曾经图片服务考虑使用 Yupoo(又拍),但是考虑到他们数据中心在国内,和 GAE 通信很难通畅。最终作罢。

Blobstore 的 API 稍微复杂一些。Blobstore 最多支持用户上传 2G 的文件,所以叫 Binary Large Object。类似的课题其实已经在很多学校的 database 课程里提到过了。在 GAE 里,用户使用 POST 方式将文件直接传到 Blobstore 里(因此在生成上传页面的时候,需要先调用 createUploadUrl() 这个函数,生成一个动态的 Blobstore 地址),Blobstore 收到数据后,存储数据,重写收到的 HTTP request,将原来 request 里的文件变成对应的 BlobKey 然后传回对应的 handler。Handler 再做相应的处理。我用 Blobstore 主要是用来存储头像,如上段所说,Images service 和 Blobstore 有很好的整合。所以直接将 BlobKey 储存,下次调用即可。

Memcached 或者类似的中间缓存机制已经成为每一个 web app 的出家旅行必备了。我很惊讶的是,Twitter 最早的网页端没有使用 cache ,当然现在他们已经严重依赖 cache 了。新浪微博则使用了 与 Memcached 类似的 Redis 作为 cache 实现工具。使用 cache 的最大原因是,数据是存储在内存而不是硬盘中,所以读取速度要快很多。我对 GAE Memcached 的理解是,它是一个巨大的分布式 HashMap。这其实也能用来理解大部分 Key-Value 式的数据库。Livid 的 V2EX 已经证明了使用 Memcached 后访问速度的巨大提升,更重要的是,使用 cache 节省了很多 CPU 资源。所以到后来在写代码的时候,我发现,架构上的优化不仅是一种精神洁癖的表现,更直接的是,省钱。(如果超过免费额度,Google 会收费。其中 CPU 资源是最容易超的,而且为了使用 Blobstore,我的银行卡已经绑定了,所以未来的某一天是一定被扣钱的。)

如何使用和何时使用 cache 是一门大学问,这个问题包括 Twitter,新浪微博和豆瓣相信都在持续研究。所以也不就不在这讨论了。但是有一个小窍门是,由于 GAE 是分布式架构,如果有一个常量你的 app 会经常用到,可以放在 Memcached 中,然后用到的时候读出来。而不是将这个常量使用 static 储存。

最后一个是我的最爱,Task Queue。每次写到它,我都觉得内心幸福的像开花一样。实在是太爱 Google 提供这个服务了。为什么?因为它实在解决太多的问题。一一列举,1)在传统 Computer Science 领域,有一个问题是不管什么应用都会遇到,concurrency。而队列是一个解决这问题很好的方式,synchronised => asynchronised。也就是说,别抢,大家排队来做事。Task Queue 可以用来解决这个问题。2)有些时候,用户发起请求后,app 需要计算大量数据。如果不用 Task Queue,用户就一直在那傻等着等结果而且有些时候这些结果并没有实时的要求。使用 Task Queue 则可以解决这个需求。3)这一条和 1) 很类似,那就是使用 queue 缓解大量的并发请求。Twitter 的数据是,在奥巴马就任的那天,他们平均每秒收到成百上千的 Tweet,正是他们用 Scala 设计的 Message Queue 解决了这个问题。

Task Queue 的 API 并不是很复杂,简单一句就是将 task 传给一个 handler,剩下的就是 app 的事了。

说完这些其实还没到核心。GAE Datastore 才是重点。

与传统的 Relational Database 不同,datastore 是 Key-Value 型的 NoSQL,也就是一个大型的分布式 HashMap。很多思维方式都与传统的 RDMS 不同。

比如,在传统的 RDMS 中,每一个 table 都遵循一个 schema,而 datastore 不需要。每一个 column 里的值都必须 atomic,而在 datastore 里,可以允许 List 和 Set。在 RDMS 里,你可以使用 join 将两个表联系在一起,但是 datastore 不允许 join。(不过这个有办法 work around,使用 List)。在传统 RDMS 里,比如豆瓣、新浪微博都用的 MySQL,没有 explicit hierarchy,datastore 确有。

而这些都是在进行数据库设计时必须考虑到的,有些时候错误的理解会带来很大麻烦。

比如接下来讨论的问题,Transaction。

在 datastore 里,每一个 data object 称为 entity,每一个 entity 可以有若干 properties。比如,一个 member entity,可以有性别、家庭住址这些 property。之前说 datastore 可以存在 hierarchy,所以 member 也可以属于某一个 department entity。这个 department entity 也就和 这个 member entity 组成一个 entity group,department 是 parent。(如果 entities 不属于任何一个 parent,他们自己就组成了自己的 entity groups。)

Transaction 的存在也是为了解决 concurrency 的。而 GAE 的 transaction 原则是,每一个transaction 只能修改一个 entity group。在最开始的时候,没有充分理解 GAE 关于 entity group 的概念,所以很不解:当时我以为,所有 member entities 都属于一个 group,更新其中一个 member 会导致同时更新另外一个 member 的操作失败。当时我觉得这设计太傻逼和不合理,仔细一查,才发现,这是与 RDMS 的 table 概念混淆了。事实上,每一个 entity 都组成了自己的 entity group。如果 member 有 1000 个 entities,那就有 1000 个 data entities groups。所以当 app 更新 A 时不会导致 B 的数据不能更新。不过当 app 更新用户 A 的性别(比如他去泰国了)时,就不能再同时更新他的女朋友性别。所以这也提醒了所有开发者,如果某些 entities 很热门,经常更新,他们需要减小 entity group size,essentially, shard oft-written entities。

使用 Transaction 就必然带来了另外一个问题,Transaction isolation。这是一个蛮有意思的东西。

Isolation level 的定义是,when the changes made by one operation become visible to other concurrent operations。

一句话,Transaction 导致的数据变化什么时候能被其他并发请求读取或者操作。

在 datastore 里,每一个 transaction 都有两个 milestone,第一个 milestone 是改变 value(比如某一个 member 的身高),第二个 milestone 是改变 indices。如果有两个 request 几乎同时到达 app,一个是 transaction 更新数据,一个是读取数据。读取数据的 request 如果在两个 milestone 之前,则不会得到更新后的数据。如果在两个 milestone 之间,因为 index 仍然没有更新所以采用 predicate(「where」clause in SQL)来读取的话也得不到更新结果,而使用 getEntityByKey则能读到最新修改的数据。

这个概念比较复杂,Google 员工也专门写了一篇文章来解释这个问题。

刚才说到 sharding 的问题,其实这已经成为优化数据库性能的重要方式。FriendFeed 就使用了这种办法解决了 MySQL 在面对大数据量和 schemaless 遇到的困难。相信 Facebook 也才采用了这种方式。

说的有点远,我其实只是想说 sharding counter 的问题。Concurrency 确实是很讨厌的东西,用 trasanction 来保护也只是下策,如果遇到频繁更新的 entity,整个 app 就近乎没法工作了。比如某一个 counter 可能每秒更新 3 次。这时候就只能使用 sharding counter 了。原理很简单,多存储几个 counter,每次更新的时候随机选一个,最后统计的时候加起来就行了。

我一开始觉得这个概念很爽,便想采用。但是仔细一算,发现自己太自恋了,我们假设如果有一个 entity 能有每秒 3 次更新的频率。这是一个什么的访问量?假设 app 每天的活跃时间是 10 小时,这个 app 每天至少能获得 108,000 的访问量。

算完后,我就乖乖的去写 transaction 了。

其实我挺喜欢 schemaless 的数据库,至少维护数据库的时候太方便了。而且新的 feature 更新也很方便。

但是 datastore 有一个特性很讨厌,它其实有挺多讨厌的特性,不过都被我躲过去了,但是这个没法躲。那就是分页。

我一开始觉得分页很简单,无非就是 start = size – (page – 1) * PAGE_SIZE – 1,bla bla。但是 datastore 比较操蛋的是,一个 query 只能返回 1000 个结果(如果你不使用 primary key 进行 query)。一开始,我为了完美解决这个问题,想了很多方法。包括使用 datastore cursor,可以用,但是 it was pain in the ass。我动用了无数资源去完成这件事。后来 stackoverflow 上一位大侠敲醒了我,你 Google 的时候,会翻到第 50 页去看结果吗?

于是我又乖乖的去用笨方法了。

总体上说,Google App Engine 上开发很轻松,技术上没有太多需要担心的事情。文档很全面,而且 Google 非常重视这个项目,有很多 Googler 都参与到这个项目中,包括 Python(豆瓣使用的语言) 作者也有参与。今年 Google I/O 之后(我必须要吐槽一下,我他妈的因为签证没去成,可能是全世界唯一一个有票但是没去的人),又增加一堆新特性和新的语言,Go。

当然唯一需要担心的事是如何让国内人访问。不过这个问题也不是难事,找一个没被封的 VPS 做反向代理就行了。

这段时间在缓慢的读 Chris Anderson 的名著 Long Tail,一本其实是经济类型的书却说的我很激动。这个世界在慢慢的变成一个 niche 的世界,有头,更有长长的尾巴,而对于每一个 computer scientist/engineer 来说,我们的目标是让更多的人接触以前从来见不到的尾巴,让信息比以前更流畅更有组织的流到你的眼前。

谢谢 Amazon,谢谢 Google,还有许多其他,让这一切变得简单。

三年

May 12th, 2011 § 0 comments § permalink

现在什么事都如一阵烟,还没反应过来就过去了。很多事都如昨天,所以都在感叹,白马,为什么你跑得这么快呢。

唯独三年前发生的事我觉得好像已经过去很久很久了。

手动历史上的今天:

2010:两年

2009:一年

2009年的文里有张照片因为图片托管商已经不做了,看不到照片,我上传到这里,这张照片拍摄于 2008 年 5 月 10 号