Google apps + Saleforce,新mashup,新SAAS

半年前我在InfoQ上面报道了一下SAAS的事情,现在看到这个,想想mashup的益处,很快这张大网就要收了。Google花了这么久来织网,我们看到了facebook和amazon也挤进了这班车,可怜MS,我看及时收购了Yahoo也搭不上这班车了,因为Yahoo自己也没买到车票。

在Mac下启动多个Firefox实例方便JsUnit运行

项目中的JsUnit是使用ant脚本运行的,里面需要设置BROWSER_PATH的环境变量来启动浏览器。在本地check in代码的时候,我们会运行一下测试来减少愚蠢错误被提交到代码控制系统。但是在我的mac下Firefox只能启动一个实例,在运行JsUnit test的时候会提醒我已经打开了Firefox,不能打开另外一个实例,这样我必须关闭正在运行的Firefox。而且由于我比较喜欢打开非常多的Tabs来保持浏览状态,所以关闭Firefox让我很不爽,再说,因为重新启动的Firefox里面带了很多的Tabs,所以经常造成实际运行的JsUnit test发生随机性的超时错误,这个就不能容忍了,因为这无法保证我们的信心。

那么,为什么FF不能启动多个实例呢?原因是它们共享同一个Firefox的profile,所以没法多个实例并发访问。但是通过命令行参数是可以创建多个profile给firefox的,简单了。不过遇到的问题是JsUnit的ant任务会检测BROWSER_PATH是否存在,所以如果我把带参数的命令行写到环境变量里面Ant无法检测到这个文件就会报错。那么如果关闭检测可以么?还是不行。因为JsUnit的StandaloneTest里面实际最后会调用DefaultProcessStarter的execute方法,这个方法调用Runtime.getRuntime().exec(command),这个实现非常直接,不过因为parameters如果直接写到命令行里会发生文件无法找到的问题(应该用数组将命令和参数传入)所以没有办法传入,还是无法运行。

放弃hack吧,我可以修改Ant task和JsUnit的方法,但是绝对不好,因为这个hack没有提交回去的意义。
所以换个思路,这样做:我们去写个shell来解决它。

先在终端运行/Applications/Firefox.app/Contents/MacOS/firefox-bin -CreateProfile jsunit,这时候会弹出窗口让你确认创建这个profile,选择一下不使用extensions和各种工具条,这样减少这些设置对测试的不良影响。
然后在你的home目录创建一个firefox.sh,里面写上:

/Applications/Firefox.app/Contents/MacOS/firefox-bin -P jsunit $1

前提是你的Mac使用的是默认的bash,否则修改$1为对应的引用字符。然后chmod firefox.sh 555,让它可以运行。

下面就是修改你的~/.profile:

export BROWSER_PATH=/Users/[User path]/firefox.sh

source ~/.profile让修改生效再运行JsUnit就OK啦。如法炮制想开几个Firefox实例都可以啦。同样方法也适用于让Firefox2和Firefox3共同运行!非常简单。还可以做到开发和浏览分开……以此类推。

回顾一下JsUnit的代码写的不好,如果像Selenium一样能够自动创建一个profile就好了,因为那样可以减少测试之间的影响,还可以让Selenium并行执行。我想,如果有空我可以做一下这个工作:D

Yahoo的“前端优化突破” slide共享

这是一篇很好的讲前端页面优化的slide,当然有不少内容我们都看过很多遍了,我以前做过的:

里面的内容也有一些重复。不过这次我还是很有收获,比如IBM的Page detailer就是个不错的profiler工具。还有使用document.getElementsByTagName(‘*’).length简单判断dom复杂度的方法也是不错的。结果是:

  • 新浪首页是3109
  • 财经首页是4260
  • 新浪邮箱是169
  • 纸条箱251
  • sohu是2k4
  • netease是1k4

很有意思。

结绳记事。

[迟到的游记]08印度之行1

我去年加入ThoughtWorks以后就被加入参加TWI(ThoughtWorks Immersion)的队列,不过由于工作比较忙,所以一直没有成行。到了今年的3月,公司终于安排我去参加这个“新”员工培训了,目的是印度的Pune,英文以前也有拼为Poonar的,中文叫普内或者普纳。这个地方离孟买城不算很远,4个小时的出租车就可以到达了。这里是印度的文化中心之一,主要是因为这里分布了不少的高等学府,所以在印度还是有一定的影响力的城市。这个城市地处高原,空气相对来说凉爽一些。下面就是行程的记录:

我乘坐的是阿联酋航空公司的飞机,从迪拜转机到达孟买,早上6:50起飞,当地时间13:30到达迪拜,然后17:45到达孟买。

进安全检查非常顺利,本来排了长队,可是人家看我面相好,就让我走了外交通道,所以省去了不少时间。

我在北京机场的免税区逛了一下,国内的化妆品不便宜,但是也绝对不会比商场里面贵。p1020414.jpg

酒什么的还是挺多的,不过我对它们没有什么兴趣。国内牌子的烟很多,不过价格我没有看。走的那天是早晨,所以所有餐馆都是关闭的,没有考察。
等飞机的时候发现有很多民工,呆着统一的行李,而且行李都是非常的大,他门应该都是建筑工人,身上都散发着不爽的味道,当然我绝对没有歧视的意思。p1020422.jpg
登记很顺利,乘务员有1/4是中国人吧,其它的都是阿拉伯人吧,帅哥也挺不错。不过你会发现亚洲脸孔的乘务员身材都很好,而欧美和阿拉伯的乘务员体型多种多样,也可以看到乘务员在国外并不象国内这样吃香。
上飞机以后发现旁边做了一个女的,年轻。没怎么和她说话,一开始。后来聊了两句,她说是去苏黎世,也是迪拜转机,好像飞机上的大部分人都是转机的。而且她说最近机票不好订,只有阿联酋的有票。

p1020429.jpg飞机上第一顿是早餐,是那种西餐常见的煎蛋,里面带馅的,里面很软,配一些蘑菇青椒什么的佐料,西餐,挺好吃的。还有橙汁和面包黄油。

 p1020451.jpg

吃完以后看看窗外,发现遍地都是沙丘,估计是内蒙古吧。

p1020455.jpg

后来看了看飞机上的电影,每个人的座椅前面都有一个显示屏,可以自己选节目(还可以玩游戏和听广播,挺强大的)。

p1020449.jpg

我看了一会那个蜜蜂的电影(奥斯卡颁奖礼上面有的那个),别的台还有朱诺、老无所依等奥斯卡获奖影片,还有喜剧和阿拉伯电影等很多电台,很有趣。还有飞行地图的电台,所以阿联酋航空还是比较厉害的。p1020447.jpg看完以后我就拿枕头睡了一下,两个小时过去了吧。然后醒来看还是不同样子的沙丘,但是根据地图,这个是新疆附近了。然后我好像看了一会儿朱诺,看了个片段,还挺有趣的。然后乘务员过来要求吧飞机的窗子都关上,因为换了飞行方向,窗扣只有强光了,看不到别的。所以我就继续睡觉了。睡了很久以后我开电视看了一会儿喜剧,好像是辛普森,还有一些别的节目。然后我开始看不朽,就是我带的那本米兰昆德拉的书,看了半个小时,困了又睡。
然后醒来好像是因为开始提供午餐了,这个时候有7个小时过去了吧。午餐有虾仁面条(中国菜)和烤鸡腿肉,我要的后者,配以一些蔬菜还有土豆泥的烤鸡腿比较好吃,还有芝士蛋糕纯净水沙拉什么的,还有小面包,吃的挺饱的。然后我好象继续看了一会儿姜文的太阳照常升起,里面降到了婚姻和爱情,当然是上一代人的。我记得一句话:”你的肚子就像天鹅绒一样……”。然后我开始看飞机上提供的各种免费品和奢侈品相关的杂志,p1020469.jpg不过发现要么是买不起,要么是不怎么好,不过我看的非常认真,准备在迪拜多看看。此时我的屁股已经很不舒服了。下飞机前和那个女孩聊了两句,她去那里是搞金融的,当然后面下飞机时候她帮我照了像,所以这个谈话还是很值得。

p1020537.jpg
然后我们就到迪拜了,下飞机发现只有11:30,当地时间,我的飞机13:30起飞。过安检的时候我看人家都脱鞋,我自细看了指示,不需要呀,所以就没拖,也过了,不过必须解掉皮带。看来大部分中国人英语都不好,随大流,一个人拖鞋,大家都拖鞋,当然大部分老外也随大流了,哈哈。我倒了机场的二层,问了航班登机的时间,大约13:00或者13:10来就可以,然后我就先去免税区(1层)仔细逛,首先逛了电器区,看了鼠标和笔记本电脑和各种电子产品,都是阿联酋的币,第纳尔,不知道汇率。但是经过与美元标价的对比,发现比中国贵。看了CD,有非常多国内没有的好CD,有很多我非常习惯的歌手,它们很就已前的CD也有卖,所以应该说很全,不过要55第奈尔,很贵,DVD要80第纳尔,也很贵。然后我去看了迪拜的纪念品,神灯(銅),7美元,很小的一套铜制的阿拉伯壶和杯子(工艺品,非常小)要15美元。水烟袋有很便宜的,8美元,不过十份粗糙。好的要50美元到70美元。骆驼制品,木头的看起来没意思,都在十多美元,而真正骆驼毛的则要70美元左右。毯子非常有趣,不过很贵,我觉得也很有可能made in china。

p1020546.jpg 在这里,如果你购物,可能赢得宝马或者保时捷,还有哈雷戴维森的摩托,都有展示,当然没见人抽到。
后来仔细逛了3-4家免税店,卖化妆品的,发现价格差不多,欧莱雅的懒百相见的日霜和晚霜都是10.9x美元,三件套美白的30美元。你的倩碧的SPF15的city protecotor是19.3美元,然后黄油是43美元(没注意是油性还是干性),兰蔻因为是法文看不懂,其它牌子的我不熟悉,但是便宜的不多。资生堂有,大都在30-50美元的价位,看起来也满贵的。香水基本没有卖的,都是化妆品。
看了烟,没有中华(后来发现有36.x刀),好像万宝路什么的比较多吧。
名表非常多,不过价格都不便宜,因为都是奢侈的款式和品牌。
金子好像是1x美元一克,不过首饰不像国内,体积都爆大,样式非常豪华,所以估计我的钱卖不了,以为每一套都很重。
衣服倒是有一些品牌,不过都是高档货。

p1020556.jpg我看了巧克力,发现好时的巧克力在国外的确是底价品牌,不过其它的古怪品味的巧克力没法带,以为内天气热,买完会化。
我看了看阿拉伯糖果,样子都和你精致,有模仿水果外形的还有各种有趣的样子,价格也不贵(当然,特别精美的还是非常贵),我想回来的时候我会带一些。有趣的是,这里也有我们常见的品牌,不过都是阿拉伯文,挺有趣,我照了一些像。
然后我发现擦身上的廉价油的确便宜,凡士林是3.x美元,中号洗发水那么大,妮维雅的东西很便宜,大概有15厘米直径的厚4厘米那么一铁盒的妮维雅润肤爽也就是3.8美元,还有妮维雅的防晒爽也就是3.x美元,酒我没啥兴趣没有仔细看。其它的没有仔细看。
后来回到上面一层,看了看餐馆,没啥意思,不过人家登机口超级多。

p1020564.jpg
到点登机,对了看了下一个美元可以兑换3.7第纳尔,还可以。

p1020571.jpg

p1020605.jpg后来登上去印度的飞机,还是空中客车的A330-200,这个是空客最大的飞机之一。这次是和一个印度老大妈坐在一起。没说什么话。看了看电影,睡觉。然后吃了一顿印度的便餐,比较变态。有两种酱,一种是鸡肉咖喱,另外一种看来是红豆和绿豆混合在一起发酵出来的酸的酱,飞到都非常怪异,里面还有一个博饼。小菜非常奇怪,好像是水果,但是却加了咖喱粉,还有加了咖喱的酸奶(非常酸,不甜)……不爽,吃完感觉胃要罢工了,然后睡觉了。
快到的时候印度大妈让我帮她填入境卡,我帮了忙。
后来下飞机还问了她一些印度的气候情况,但是发现她基本听不太懂。

p1020613.jpg
飞机降落的时候发现这个地方的房子都是贫民窟一样,很多房子建在山顶上,旁边就是悬崖,不知道当地人怎么生活。不过已经可以看到很多人在一些脏乱的地方聚集在一起,看起来好像……。还有就是城市的公路以外就是一片巨大的丛林……

p1020608.jpg
倒了这里,很简陋,走了很远,就是安检,排多过了。
然后是领行李,等了半天,我帖的白纸条都磨下去了,可见……
然后是通关的检查,很容易就过了,人家看是中国人就直接盖章了。我看本地人却要被问半天。
然后还要再过一轮安检,排队很长。正要排队,被一个看似警察人叫出来,指出口就让我走了。挺怪的。
然后我去换了50美元到当地的货币。当时非常匆忙,点钱,赶路,结果就是这个时候把护照丢在了换钱的柜台,引发了后面发生的一系列围绕护照的故事……

然后出来发现这个机场非常小,很容易发现了ThoughtWorks Immertion的牌子,接头成功。
然后是当地的support接我,我问问题他好像都听起来非常苦难,我要求他说慢点……
然后接我的车是丰田的,类似previa,不过名字不同。p1020635.jpg
开始了以后发现赶上交通堵塞时期,这里交通很差。我问了他这里不是孟买的中心,因为政府担心如果机场在市中心,如果飞机坠毁会造成更多伤亡,所以建在市外。我们穿过市区,发现这里的出租车如牛毛一样多,不过路上充斥着蹦蹦车。p1020631.jpg所有的印度车都装饰的非常过火,花花绿绿,卡车都花枝招展,和我们一点都不一样,超级有趣。p1020636.jpg满大街都是人,满大街鹅车都飞奔,挺恐怖的。
黑布隆冬的……司机在每次超车的时候都况闪大灯,超级凶猛,这里的司机看起来挺不容易的。
中间在一个服务区 休息了一下,这里的高速公路还没有我们的普通公路看起来像公路,而且左行,奇怪。服务区看起来像自由市场,但是不许吸烟,看每个人都像坏人,所以每乱动,在汽车旁边等人家回来。
然后,开车以后挺困的,反正用了4个小时到的,挺远的。中间还发现旁边山上有山林火灾,神奇的国家。
到了pune感觉倒了乡下……反正挺有趣,满大街都是摆地摊的。

p1020647.jpg住处是家庭别墅,都是3层小洋楼,每个人一个单间。我到了以后实验了网络,连不上,就放弃了睡觉了。
早上7:30起床,洗澡发现不太会用那个喷头……凑合洗。然后下楼吃了薄饼蘸酱,还有酸奶,红茶,凑合。不过housekeeper实在不懂英语,结合昨天在车上的经验,发现绝大多数本地印度人都说不好英语,完全不懂……

看到了印度的蔬菜摊位,卖的是一些“味道”见长的蔬菜,而且这些蔬菜明显不像我们这边施了太多化肥,个头小小但是味道不错。

p1020693.jpg

在街角处看到了甘蔗车,颜色像救火车,上面有个摇臂,旋转以后会把甘蔗扎出水……然后过滤后就卖给你,好像10卢比。

p1020699.jpgp1020716.jpg

早上上班去office 10分钟路程,旁边都是比较落后的小摊。p1020689.jpg不过我们的office所在的地方比较豪华。上午是TW历史介绍,下午是Values的介绍,不多说。中午吃的印度饭,所有的我都尝了一下,也有印度的同事热情的介绍,人家还是非常友好的。这里有芒果汁,不错,粘粘的。p1020666.jpg因为我介绍了Tin这个短名字,所以大家都非常快速的记住了我的名字,我敢说我的名字是它们第一个记下来的。因为在叫名字传东西的环节,我被传的机会最多,印度同事的名字都不好发音,麻烦。p1020720.jpg
对了中午教练和我说老婆给公司打电话问情况了,她说报了平安。我中午可以用公司的电话与老婆联系,我太高兴了。吃了点东西就和老婆通了电话。
下午的课程结束以后有个欢迎仪式,没啥意思。然后吃了一种印度小吃,就是米花,炸粗面条,炸细面条,香菜,洋葱,西红柿还有糖,还有一些不知名的东西炒在一起,味道奇特,我还可以接受,照片。

p1020680.jpg
然后我看它们打了一会儿乒乓球,我发现印度人非常喜欢乒乓球,而且它们对规则特别熟悉。而且它们觉得中国人打的都很好,不过我不是。它们显得很专业。我们打了双打,我和一个叫Vainy得印度同事3局2胜赢了另外一对,出了不少汗,是21分一句得呀。
然后我和另外两个同事出去dinner,结果发现它们不过是买啤酒,我就半懂不懂得一起去了,它们非要请客,买了一些啤酒。
然后回来就喝啤酒,澳大利亚产得,要68卢比一瓶。我喝了一瓶,然后订了indian-chinese食品,这个不是中国菜,是印度人做得一种伪中国菜。
然后聊了下,发现印度公司的工资比我们略低一丁点。

待续……

友人的Macbook摔了

上上周日一位友人的Macbook摔了,这是一件很衰的事情。询问了一下伤情,似乎外壳开裂了,屏幕也不亮了,只能送修了。是水货,不过没有入关证明也正常在国内保修了,我觉得这个是令人欣慰的事情。

在和友人聊这个问题的时候,他抱怨Macbook也太不耐摔了,他说他的IBM进水、被摔很多次,都幸免下来了,而Macbook就不可以,他有些失望。我则解释到Pro也许更耐摔一些吧……但是无可争辩的是苹果笔记本的抗击打能力的确很弱,最近IBM一直在宣传X300的耐摔能力,号称……我就不八卦这个了。

朋友说到苹果的质量也许是个问题,我不完全认同,质量也许不是最好的,但是绝不差。而像Macbook这样的本还要分什么人来用……

我的另外一位友人清风同学,用了几年的Macbook G4外观还是完美,还是白白的,没有严重的磨损痕迹,而他可是每天都用很久的。所以对于苹果这样的设计偏视觉优先的产品可能也需要使用者的养护,不是粗粗的用就能长久的。当然,如果你有钱总是换新的另当别论。

Macbook figure

重复一下这位友人摔本的经过,因为Macbook的电源是磁力的接头,所以如果放在桌面不会因为拌到电源线把笔记本带到地上(有人说由于吸力太大,也不完全管用,但是实际上是如果你把本子放在腿上,摩擦力不够,那么磁力还是会足够把本本拽到地上,但是如果是正常桌面,摩擦力足够让磁力的电源口脱开的)。而我的这位友人当时在用耳机Skype,结果电话过程中说到兴起,忘记了耳机还挂(挂耳式)在耳朵上,然后信步离开工作间,虽然耳机线很长……但是当他就要走出屋子的时候笔记本被拽到地上,然后他当时就意识到Macbook必定牺牲了。如果用过Macbook的人估计都对它薄薄的塑料外壳有所感触吧,稍微大一点的力量就足以破坏它了……

嗯,带Macbook挤地铁,尤其是八通线的时候,是很容易造成Macbook破裂的,包括其它的很多……我也不知道的因素。

这篇Blog的意思就是提醒你,不要忘记插口上的线很有可能是笔记本杀手,尤其是macbook这样的美丽本本。

写javascript单元测试是挺爽的事,可惜不要在safari上?

对于javascript来说,通过单元测试,你也可以实现TDD。对你非常有好处,一是减少了js变动带来的代码退化问题,另外一方面是TDD可以改变你设计程序的方式。
举个简单的例子,写javascript很多情况下是和BOM(也就是文档模型)和DOM打交道的,这样可以说javascript程序很容易与dom高度耦合,这样的程序运行起来没有问题,但是应对需求变化的能力会比较地。但是根据人的思维方式,javascript很多时候是先出页面,然后根据页面逐渐调试着写出javascript,对于开发者来说,脑子里并不是真正的清楚自己要什么,而是在想界面的结果……这样产生的高耦合代码不容易测试,也难以面对多变的界面。
所以,换一种方式思考。如果用单元测试的方式去写,你就需要考虑程序的可测试性,这会细化你的程序的模块粒度,因为细粒度的抽象容易单元测试。同时由于js单元测试的页面是mock出来的,所以一般都会尽量的简单,这样会减少程序远对界面的依赖。同时由于界面的可测是性问题,也许会减少对element的style的修改,转而使用语义话的css。例如如果一个元素高亮,你可以element.style[‘font-size’]=’bold’;element.style.color=’red’l….,当然你也可以element.addClassName(‘highlight’),然后那些不好验证的界面的约束条件可以放到css里面去,放给可用性和用户验收测试去验证。这样的单元测试的验证条件(assertion)会简单很多,如果写过单元测试的朋友肯定会有感触的。
那么,常见的Javascript的单元测试框架有JsUnit和scrit.aculo.us的单元测试框架两个。前者方便用ant调用和分析结果,适合使用了ant的项目。而后者的优点就是界面好看,直接运行产生的报告清楚漂亮。所以小型项目我倾向后者,而大型项目我倾向前者。当然,由于js的动态特性,其实做个单元测试框架非常简单,所以自己动手也无妨。关键是要写,而且争取做到测试先行。

前面是个引子,其实写这个的原因是今天上午的一个郁闷的事。
前面的blog entry说道我升级了Firefox3,结果遇到了getElementsByClassName问题。但是今天换到另外一个项目组,没有用那个方法,程序也正常。可是我TDD的写一个新的feature的时候却发现可爱的JsUnit的testRunner在Firefox3里面无法工作,从firebug里面看到了一堆安全性问题。估计是firefox3的新安全模型造成的吧。那么,由于firefox3覆盖了firefox2,所以难道我没法写程序了?当然不可以,还有safari嘛。马上开始去写测试了,写好测试执行测试,发现红条。嗯,很满意,因为TDD的红-绿-红-绿的节奏就是这样的。然后我开始去写实现来满足这个测试……结果忙活了一上午就是不行……而且发现一些原来的测试也无法通过了……我仔细寻找问题,diff修改的内容,可是最后实在没有发现任何让它不能通过的原因,因为手工在firebug里面都已经验证了写的实现是没有问题的呀……崩溃。此时我突然想起来我们的持续集成服务器里面没有跑safari的JsUnit测试……也就是说不能确定在safari下全绿(此时的背景是我们的持续集成显示全部绿色,也就是说所有的测试都可以同过,包括windows和linux平台还有IE及Firefox),那么我可能衰了。马上开动camino(靠,一上午都忘记用它执行JsUnit了,因为我的习惯是Camino里面保存to read list),运行一下全绿。很兴奋,但是感觉刚才寻找问题的1个多小时被无辜的浪费了,心疼呀。

那么,请注意啦,我只是想提醒,jsUnit可能不能在safari下正常工作(大部分测试没有问题,少量在其它浏览器正常的测试在safari下无法工作),我用的是safari3.0.4……

Firefox3 beta2带来的getElementsByClassName问题

Firefox3解决了一些内存泄露问题,或者说主要的是解决了一些长时间运行以后的内存占用问题。由于使用mac的习惯是休眠不关机,所还是在正式版出来之前选择了升级到firefox beta2。
那么作为开发人员肯定遇到firebug不能用的问题,还好,我们可以用firebug的beta版本来解决这个问题,当然这个firebug还是会出现莫名其妙的问题,无所谓啦,不久就会发布正式版本了。
这些都是废话,问题集中在firefox beta2提供了原生的getElementsByClassName方法,而我们大家都很愿意使用的prototype库正巧也给Element封装过getElementsByClassName方法,看起来两者的作用是一样的,但是不巧……其实两者还是有很大差别的,所以造成了如果你的项目正巧用了getElementsByClassName方法,而后你又用习惯的prototype方式便利了它……那么你的程序就不能在Firefox3 beta2工作了……
我们以前的习惯就是不用考虑新浏览器的javascript兼容行问题,只需要考虑向后兼容,但是这次问题还是出现了变化。
其实原因是简单的:
1、Firefox3实现的原生getElementsByClassName方法返回的不是javascript数组(Array),而是html element collection,这个东西可以用标准的方式遍历,但是却与Array没有共同的prototype(这个指javascript里面的原型继承的prototype)。所以,很不幸,如果你用了Prototype库的那个返回Array的方法写程序,然后使用了Array增强方法里面的first()等方法或者Emmerable里面的each()等方法,那么程序一定会出错。此时你可以$A一下这个html element collection,但是这不是好方法。因为其实Prototype在1.6以后就不推荐使用getElementsByClassName方法了。
2、那么解决的方法就是使用select方法代替原来的getElementsByClassName方法,不过记得要给参数的前面加个”.”。比如oneElement.getElementsByClassName(‘someClass’)应该修改为oneElement.select(‘.someClass’)。而其实select方法由于接受css selector语法,可以实现更强大的选择操作。

嗯,非常废话。
那么简单的说:如果你在Firefox3里面发现你的基于Prototype库的js程序的getElementsByClassName以后出现了method null的错误,那么你需要用select方法代替它。且考虑到长时间的不兼容状态,最好完全消除你的程序中的getElementsByClassName同名方法调用,不关你用什么js库。

Pragmatic Programmer的穿着

来到ThoughtWorks以后有一个很有意思的发现,这里可能是我见到的穿赠品衣物最多的公司。赠品衣物就是公司为了宣传而印刷的T-shirt或者大衣,质量一般,上面还有鲜艳的商标或者口号,所以一般大家收到后都是不穿的。可是在一家重视实践的咨询公司里面却有这样有趣的现象,我们来思考一下。

1、好的程序员可能会有一些Geek的特性,他们愿意搞清楚事物运行的方式,但是却忽略了自己。他们的精力愿意用来学习和娱乐,而外貌问题,可能不是非常重要。除非是去找伴侣的时候……所以他们的时间用来上网,写作,玩游戏,但是不会用来逛街买衣服。

2、程序员的实用价值观。从敏捷逻辑上来说要消除浪费,减少预先的需求,而外貌本身不是直接收益的,而是潜在的影响,所以花很多钱在衣服上会被认为是一种需求浪费,因为你过度要求了(类比于过度设计)。所以要在非要不可的最后一刻再解决它。可能程序员在参加重要活动的时候可以穿西服,但是哪一定不是程序员聚会,而是……所以,可以从节省钱的角度来说,赠品是成本最小话却可以满足基本要求的选择。

3、程序员相信自己,胜过别人。所以程序员更以来于自己的工具,电脑和网络……那么减少了砍价这个非常麻烦的人与人沟通的方式,如果我们可以尽量的利用身边的资源,那么……所以你看到参加各种活动的时候程序员真的会非常在意厂商发放的服装……

4、ThoughtWorkers很多都自豪自己的公司和产品,所以他们愿意穿公司产品的宣传服装。比如背包……我看的男女ThoughtWorkers几乎都背的……虽然这样的商标在大街上被认出来的可能是非常小的,但是大家还是愿意背它,原因可能是一种发自内心的认可。

小处见大。我想第四条是非常有意义的,你愿意背出你的IT公司的包么?你的公司值得你自豪么?你是个不在乎着装的程序员么?我们应该不停思考。

补上这个空白

从5月初到现在我做了什么呢?
1、结婚了,我答应了朋友一定会补照片上来。
2、去旅行了一次,是杭州。希望下次是马尔代夫。
3、顺利的主管了那个大网站的邮箱系统的RIA,哈哈,管过2个人。
4、做了InfoQ的社区编辑,大家可以去www.infoq.com/cn定期看到我的文章(每周一篇)。
5、将工作环境完全从Windows迁移到Ubuntu,而且工作的很好。
6、我承认我是一个Mac fans。
7、并行的联系了很多外国友人,谈技术联系项目,以后也许有更更有意思的挑战等着我。
8、和我的朋友们保持联系,都很快乐。同时还结交了很多新的朋友。如nicholas、yonglin、清风等。
9、从那个大网站离职,找到一份新的工作。新工作团队很小,也不稳定,但是离我所期待的自由可能会近一些。
……
反正,我想我就快回来了!