Monthly Archives: 八月 2008

2008-8-30 Google AppEngine Camp小记

有幸参加了谷歌上海组织的Google AppEngine Camp的技术交流会。很惭愧的是我还没有好好地去研究Google AppEngine(以下简称GAE),就来滥竽充数了,而且还因为某些原因,迟到了半个小时。 Google愧为开发者心目中的圣地,谷歌上海也充分反应了Google的企业文化。当我这个乡下人刚进入来福仕广场的办公楼的时候,顿时有一种非常豪华的感觉。进入了谷歌上海的办公室,第一印象就是专业,(非公司成员进入办公室都需要贴个条子,条子是用标签机打印出来的)。房间的配色给人感觉非常明亮,办公室的每一样设备都非常专业/高档:会议室的投影设备、视频、音频点播系统(恕我老土吧,我不知道那个机柜里面放的都是什么)。会议室旁边应该是一个很大的休息区域,估计也是活动区域,还放了电子琴、电吉他等。有一排书柜上放了不少杂志和书籍(有金庸全集),还有两个冰柜,放了各种饮料可以各取所需。甚至还有一个吧台,有微波炉、咖啡机等等。甚至(男)厕所都非常有个性。办公区域的显示屏也倍儿有面子,每个人桌上的东西也很有个性(各种谷歌的小玩意儿)。墙上随处可见Google的Doodle。 此次参加活动,除了以上的印象外,还有一个印象就是帅哥多,MacBook多。最大的遗憾就是没有带相机,否则可以将照片贴出来。 不过还是有一些我觉得不好的地方: 一部分人在演讲人讲话的同时在下面开小会讨论自己的问题。我认为这个是对演讲人和想听演讲的人的不尊重。其实完全可以走出去到活动厅讨论么。 演讲的同时,我还曾听见有人直接在底下接电话。 虽然演讲人说可以随时打断他的讲话并提问,但我认为既然有人主讲而不是以完全的沙龙形式,就应该控制时间,总是打断不利于提高效率,很多东西可以私下交流。 主讲人也应该注意控制时间,5分钟演讲大部分都大大超过这个时间。 此次活动最大的收获估计就是能参观一下传说中的谷歌办公室。希望下次还有机会去吧。

ORDER BY RAND()

原文地址:http://jan.kneschke.de/projects/mysql/order-by-rand 翻译:ShiningRay 译者序 之前有位朋友提到从MySQL随机取1条记录其实只要SELECT * FROM table ORDER BY RAND() LIMIT 1即可。其实这个语句有很大的性能问题,对于大表的效率是非常低下的。我们可以看一下MySQL对其的解释: EXPLAIN SELECT * FROM `money_logs` ORDER BY RAND( ) LIMIT 1 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE table ALL NULL NULL NULL NULL 173784 Using temporary; Using filesort 这个SQL语句无法使用任何索引,还必须使用临时表和文件排序,在一个15万条记录的MyISAM表需要花大约0.3秒。已经是相当慢的了。如何优化,请往下看:

上海的洪水

今天是到渡维上班的第一天,结果遇上了百年一遇的暴雨,造成上海多个地方积水严重。我9点出门,等69路等了1个小时,找出租车用了半个小时,上了出租车之后绕绕绕,绕到虹井路延安西路,结果到了快一点,还没走多远,打车就85元了。然后路边随便找了一个饭店草草解决了午饭,长途跋涉,沿延安西路一直走到古北路兴义路。途中历经艰难险阻,过中环的时候都是趟着没过膝盖的污水经过的。到这个69路公交车站的时候已经是下午3点了,然后等69路最后坐到长宁路,到达公司的时候已经是4点多。 所幸,我还是到了。 晚上回来时乘坐69路则一路畅通,但我仍然看到中环靠近吴中路那边非常堵。

东西一流行就容易变味

以前朋友带我去上海的一些店里吃东西,经常说“店大了,东西没有以前好吃了”。然而,我也和朋友去过另外一些小店,味道和店面都一如既往十几年(除了物价上涨)。 这时候我发现身边很多东西一旦开始流行,就立刻变味——也许这就叫量变到质变。身边的例子很多,记得05年的时候,我还和同学们一起吃一种叫做“掉渣大饼“的东西,那时候这玩意儿突然很流行,但没过多久,突然又消失匿迹了。有人分析原因是这样:“流行风,不适合在一个固定地点开店,适合流动售卖。 口味比较重,油也挺大,不是健康食品。所以刚出来时,大家出于好奇,买的人较多,但不适合常吃。”[1]然而也有人分析是因为“无序加盟”造成的[2]。 掉渣大饼的例子算是一类典型,但它的“潮流”,也许还不是那么地引人注目。只能说,它的“流行”只是相对于其他接近的东西,在短时间内聚集了大量关注。也许标题改成“公司在快速扩张过程中容易出现问题”更能符合我所想说的。因为公司产品突然地流行起来,意味着公司更加有利可图,那么公司会想办法扩张,而在扩张过程中,由于某些方面做得不到位,或另些方面做得太过分等,而导致产品不能如公司或者受众的期望继续发展,甚至最终导致公司扩张失败、甚至市场萎缩。 我很想探究其中的道理。不过我认为应该首先定义“流行”是什么。百度百科上这样解释[3]: 比如一些事物,刚开始没有太多人去注意,慢慢的引起了很多的注视,后来越来越多的人开始关注它,这就是所谓的“流行" 不过这似乎与我要阐述的流行有所不同,在这里我所谓的流行是指受众比原有变的多,且增长速度也在提升。当然还有受众的问题,当受众之间个体之间相同点少,那么可以说是大众流行,反之,就是小众流行;如果小众是属于有钱人,似乎就是高档的奢侈品;如果在受众中的接受程度高,那么就是该群体中的“主流”;如果在大众中接受程度高,那就可以算“主流”了。 我把在潮流中的三个类角色划分出来:A. 通过这个事物引领、制造(有意或无意的)潮流的公司或个体,B. 在潮流中模仿A,想分一杯羹的跟风者,C. 潮流的受众们。 C是原动力,A是导火索,B是推波助澜的。没有广泛的C,就不能成就A所需要的市场,没有市场带来的利益,也就不会有B的跟风。当A不能注重品质,东西就变味了。 往往当潮流来临的时候,没有人会意识到它有多大,它能持续多长,普通的公司往往都只想在潮流中能捞多少捞多少,而不管自己是不是真的有实力。我归结这些个公司在潮流中失败的原因往往有: 只注重扩张,而不注重品质:只知道要多捞点,不知道要全面均衡发展。 有各方面条件更好的后来者居上:没想到被巨头盯上了。 市场需求被透支:过分炒作流行的概念,等受众回头醒悟发现被骗了。 所以我想问问,那些准备制造、或刚刚制造了潮流的商家们,你们真的准备好了吗? 关于Apple 其实突然想写本文其实也是因为Apple。随着Apple的一系列优秀产品iPod、iPhone等一下子流行起来。最近Apple的日子不好过: 3G版iPhone遭遇质量门 苹果称暂无召回计划 3G版iPhone后盖开裂遭遇质量门 多部3G iPhone手机曝出塑料外壳无故开裂 掉漆又断裂 iPhone 3G质量缺陷曝光 高价不高质 iPhone 3G外壳龟裂曝光不断 种种负面消息传出,我就会说,Apple,你的iPhone还没准备好吧?不可否认,Apple的iPhone的外观设计是出色的、操作系统是优秀的,软件服务也是很棒的,可惜,Apple你本来不是做手机的。iPhone的流行导致这个苹果变味儿了。 过去的定位与未来目标的冲突 Apple的产品定位一直是高端用户群体。以前,我对Apple的Mac是有一些好感的,当然我也不讨厌Windows。我一直认为Apple的东西很酷,很有形,用Apple的是设计师,非常有个性的人,他们很有创造力。然而在国外,iPod已然变成了是一个日用品。而在国内,则是一个时尚的代名词,用iPod,就可以显得很前卫,很潮流。其实当用的人多了,也就没有什么前卫不前卫的。因为直到有一天,我发现送外卖的小弟也揣着一个iPod。同时,模仿iPod的MP3、MP4公司越来越多,功能也会超越iPod,iPod虽然能因为Apple的种种魅力保持他的地位,但它在这个领域的份额也会逐渐减少——就好比现在手机与山寨机;如果iPod的份额不减少,甚至越来越高,那么说明市场正在衰退,因为用的人实在太多了,没有人会觉得这很前卫、很时尚。 其实Apple过去做的东西是有点“奢侈品”的意思在里面,然而,将来它要面对的是自己的产品变得大众化。 盲目扩张,忽视了品质 也许并非Apple不注重品质,而是对于手机的设计制造还缺乏经验,所以才出现了种种“瑕疵”。正因为对iPhone前景过于充满信心而到处签约,却忽视了iPhone的产能问题。这些问题非常容易导致iPhone的品牌被做烂掉。 Apple没有做过手机,难免会出现一些问题,但是因为Apple之前太成功了,所以iPhone理应成功,人们的期望总是很高。这种突然的潮流,搞不好就会淹没Apple自己。 其实iPod,在2001年出现第一代iPod,也是出现了很多问题,我的印象中,到05年,国内才开始流行iPod。这种稳步的渐进式的,也许更加符合发展规律。 这点Google就非常聪明,Google也希望进军手机领域,但它清楚,一方面自己没有做过手机,另一方面蛋糕要一起吃,只有拉拢手机巨头们,才 能抢占这个市场,所以它推出了Open Handset Alliance,自己主导做系统,然后推自己服务。当时Gmail的推出,引发了无限/超大容量邮箱的革命时,Google也是用了类似策略,因为 Google清楚自己无法应付过多的用户,所以他在Gmail推出初期,只有被邀请才能加入,并且刺激别的邮件供应商跟进。这样在占据了合理的市场份额的 同时,保证了Gmail的品质和发展。 摊子铺太广、独来独往 有人经常拿Apple和Microsoft比,其实我觉得两者除了在操作系统上可以进行比较外,其他方面没有很多交集。 历史上任何一个大浪潮,都不是单单某一个公司能够凭借一己之力完成的,PC机和Windows的流行,并不是一朝一夕的事情,而是顺应历史的必然。在Windows95流行之前,微软就已经做了十几年操作系统,而微软的联盟者,已经做了十几年的PC机。微软从来没有想着自己做硬件去统治整个市场。这就是为何微软抄了苹果的界面,却比苹果更流行的原因。 因为苹果什么都做,同时又几乎完全封闭自己的架构,一个公司的能力是有限的,所以它一直只能走小众路线。苹果从硬件方面的芯片、机箱、显示器,到软件上的操作系统、各种“i”系列的应用软件,从台式机到服务器,到现在的电子产品、手机,Apple可谓无所不包(虽然不是每个零件都自己做)。这也就是为何苹果机没有最终广泛流行的原因,因为微软不是一个人在战斗,微软的背后有Intel,有IBM,有各大中小PC制造商,有无数共享软件开发者,有无数的游戏厂商。苹果的封闭而又追求完美的面面俱到的开发,使他开发出来的只能是曲高和寡的艺术品。 当然,苹果也走了几招妙棋。MacOSX是基于BSD系统开发的操作系统,BSD是开源Unix系统家族中的一员,而且苹果也开放了一些东西让广大开发者一起维护。这就使得MacOSX可以兼容相当多的*nix软件,一下子吸引了很多*nix的开发人员。然后苹果又与Intel结盟,采用Intel芯片。 总结上述一些问题,我认为苹果目前其实处境还是很危险的。希望苹果不要再变味了。

并行的快速排序

快速排序是一种应用了“分治法”的算法,所谓分治法(divid & conquer),就是把大的问题分割为结构相同的小问题,然后进行解决的方法。因为都是相同的小问题,所以我们可以利用并行计算来并行处理这些问题,使用Erlang可以非常方便非常清晰地利用这种方法解决问题。 由于Erlang是一种声明式、函数式编程语言,所以要表述基本的快速排序算法非常方便: qsort(_, []) -> []; qsort(F, [H|T]) -> qsort(F, [X || X <- T, F(X, H)]) ++ [H] ++ qsort(F, [X || X <- T, not F(X, H)]). qsort(L) -> qsort(fun(X, Y) -> X < Y end, L). 其中F是一个用于比较的函数。这种描述方式非常精炼,不过效率不高,原因在于1. 不是尾递归, 2.  该代码中应用了两个列表领悟( list comprehension ),其结果是对同一个列表进行了两次遍历。不过这些问题我们稍后考虑。 在erlang中,创建和维护进程是非常方便的,可以很容易地将以上的顺序算法变成创建单独的进程解决对每个子问题: psort(Pid, _Fun, []) -> Pid ! [...]

电信的宽带迁移更人性化了

在上海搬了好几次家,每次都要把自己的宽带迁移,前几次电信的方法是这样的:交迁移手续费,并且将过去的欠帐结清,迁移到新的地址之后,帐号和密码都会重新更换,最奇怪的是当月到办理迁移当天剩下的钱却会重新有一个帐单寄到原来的地址,然而我肯定是不会回去拿那个帐单了。 而这一次非常方便,迁移手续费会直接算入下一个月的帐单中,并且也不需要更改帐号和密码了,很好。

Programming in Erlang

上上周搬了家,把宽带迁了,借着青黄不接的几天不能上网的光景,看完了”Programming in Erlang“。 Erlang是一门面向并发和分布式的编程语言。Programming in Erlang以非常浅显的语言,介绍了Erlang的各个方面的基础,是一本合适的入门教材。作为入门教材,能够提到OTP的一些常用内容和常用的分布式设计的思想,已经非常不错了,加上书后的参考。我更感兴趣的是如何使用erlang来构建高并发、分布式系统,包括它的设计模式、部署模式等等,并没有在本书中涉及,非常关键的OTP、Mnesia也仅仅只涉及了一些基础。当然它还是给出了深入学习的途径。 看完了本书,加上翻阅了一些资料,我对Erlang有了更深入的了解,也纠正了一些错误概念: 过去曾认为Erlang就代表高并发,高并发就代表高性能,同时认为Erlang就只是高并发的代名词。其实,Erlang的并发性能也并非最强。首先Erlang的虚拟机是C写的,其次诸如Haskell、OCaml + JoCaml,以及Python的PyPy,其实都能提供不弱于Erlang的并发能力。 同时Erlang在顺序计算上的性能也不佳,甚至不能超过Python、Lua这类脚本语言(也许是和其本身的特殊性质有关)。所以就更落后于Haskell和OCaml这类可编译的语言。然而即使并发和并行也需要顺序计算,所以单从并发性能上来说,Erlang还不是最强的。 Erlang写的Yaws这个Web服务器,虽然能承受高并发,但性能,尤其是IO性能依然无法与lighttpd、nginx这种C写的Web服务相比——Erlang的虚拟机本身也是C写的。 同时,Erlang本身设计为一个结构化编程语言而非面向对象编程语言。这就令其较难应用更有开发效率的面向对象的项目开发流程和方法。 那么为何Erlang在并发、分布式编程中如此受推崇?我认为因为它本身是并发和并行在语义、处理上的一致,所以它编写此类程序更加方便。同时,它提供的是一个关于并发、并行以及分布式的统一的解决方案,而不仅仅是高并发。它的目的是构建有容错能力、有伸缩性的可靠系统,同时又能最简化编程工作。这就是它的真正的优势。