窗外

工具的力量

Sophy最近在帮人翻译一些资料,翻译是在一个用Java写的软件中进行的。翻译结束交工的时候,对方发来一个字数统计,问有没有意见。我们起初没有统计字数,但对方既然问了,我们就想算算看是不是和对方的统计一样。

这个Java软件本身没有字数统计功能,而且编辑功能很差,也不方便复制,总不能一个一个字数吧?我看它的文件是XLIFF,是翻译界通用的一种文件格式,本身是基于XML的。文件处理不正是计算机的老本行嘛,于是我用PowerShell写了一个脚本,将XLIFF中的翻译源提取出来,统计每个翻译源项目的字数,再将结果导入到一个csv里,用Excel加总出合计字数。PowerShell干这个还真是方便,几行脚本就搞定了。要写个功能差不多的C#程序,估计还要麻烦,关键是C#还得在机器上装Visual Studio呢。

一算不要紧,结果和对方给的差别还挺大。于是我们就将我们生成的Excel和统计结果都发给了对方。他们一查,原来是他们少算了一个XLIFF文件。他们统计字数的方法更原始,是将他们原来对应每个XLIFF的Excel文件内容复制到Word中,用Word的字数统计来看到底有多少字。对方倒是很容易说话,承认了错误,也二话没说同意用我们的统计结果来计算工作量。这一点上,新加坡的机构到确实要比国内规范一些。

像PowerShell这种脚本程序在许多程序员看来是雕虫小技,可是对于翻译来说,这么一小段脚步就可以帮助他们解决类似字数统计这样的问题。技术跨界的时候,确实可以带来意想不到的效果。前几天网上暴红的那篇程序员降级论,说的也就是这个意思吧。

Chinese Company

有一次和同事聊天,问起他的客户怎么样,他说你知道的,Chinese company嘛。千言万语就被这两个英文单词给表示了,而这两个单词也能让我感同身受。同事口中的Chinese company不是指中国公司,放在新加坡的语境里,是指华人开的公司。比起政府机构或西方公司来,华人公司一般对产品和服务的要求更高。我们中国人不是有句老话吗,给一分钱,办两分事。对像我们这些卖产品或服务的人来说,这就意味着,东西难卖,项目难做,钱难收。

最近我也给一个Chinese company的客户做项目。客户会经常找我们讨论,某个具体工作是否多花了0.5个小时,一个三天的工作能不能在半天之中就完成,一个额外的小工作能不能不收钱等等,真是精打细算到了极致。

从甲方的角度来说,这样做也许是好的,因为钱都花在了刀刃上,真正让一分钱办了两分事。可是如果换个角度想想,花许多精力去讨论这些在项目开始前就确定的事情,无端浪费了双方许多精力,而且可能还会损害彼此间的信任,降低项目团队成员的士气,从项目的角度,也不一定好吧?!

新加坡的图书馆

上午去红山的图书馆借了几本书:

  • Search Inside Yourself
  • 常识
  • 妞妞
  • 文化@私生活
  • 中时出版社出的一本关于习近平的书

Search Inside Yourself是2012年的新书,上次在书店看到,觉得有点意思,可是价钱太贵,没买。在图书馆的网上查了一下,居然有,就预定了一本。昨天图书馆的邮件说,书到了。

以前在国内的时候,不管是在西安还是在上海,基本上没怎么用过公共图书馆,看书基本靠买。我对图书馆的印象一直停留在大学时代,能够借阅的书都残破不堪,热门书永远也接不到。到了新加坡,发现书店里的书都比较贵,只靠买是看不了几本书的。而新加坡的公共图书馆则相当不错,所有的市镇都有分馆。离我家最近的红山图书馆,只要从楼下坐几站公交车。而且基本上什么书都有,中英文书,儿童书籍,报纸期刊,音像资料,应有尽有,甚至人民日报,解放日报这样的报纸也有。我妈来新加坡,一个主要的打法时间的方式是看图书馆借来的书,都是些在国内看不到的八卦性质的书,类似我今天借的,中时出的关于习近平的书。对于我等永久居民来说,只要付一次性10块钱的注册费,就可以免费借书了。新加坡人连着10块钱也不用出。

很多人说新加坡是文化沙漠,新加坡人都不读书的。一些书店关门的新闻报导也加深了这种印象。但是我感觉新加坡人还是爱读书的,图书馆无论什么时候去,里面总是有许多读者。也总是有许多父母带着孩子来看书借书。传统书店面对互联网的竞争,本身就难以为继,在新加坡这个弹丸之地又有如此方便的公共图书馆,生存自然更是问题了。

升级Windows Azure中的应用

昨天blog页面打开突然变成空的了,post无法显示,但是tags和comments列表是正常的。这说明不是数据库连接的问题。我连上Windows Azure的管理页面看了一下,两台WebRole的机器昨天被重启了。Windows Azure的机器重启之后,系统会被重置,应用会重新部署。我在前面的post里说过,WordPress for SQL的plug-in有一个bug,以前我是通过手工上传更新后的文件解决的,并没有更新安装包。应用重新部署后,就的文件又回来了,bug就又出现了。

为了一劳永逸,我昨天重新做了安装包,用升级的方式更新了应用的部署。Windows Azure支持增量更新和完全更新,我用的是增量更新的方式,因为我只需要更新一点点代码。步骤如下:

  1. 在Windows Azure管理界面,选择对WebRole升级,上传新的安装包和配置文件。因为我不需要升级配置,因此我将Azure中已有的配置拷贝了一份,作为新的配置文件。这能保证新配置和原配置一摸一样。
  2. 选择升级之后,两个node会被先后升级。升级完成后,可能会出现HTTP 500。我想主要是因为应用被重新部署了,但是机器没有重启,状态有混淆。
  3. 分别重启两个node之后,一切就恢复正常了。

完全更新的方式稍有不同,它需要新建一个staging部署,将新的安装包和配置文件部署在staging中,测试完成之后切换production和staging。这种方式适合有重大代码和配置更新的情况。

现在,似乎通过页面来发布新post会有问题,而用Windows Live Writer就没问题,我也就懒得管页面发布到底是什么问题了。Windows Live这个品牌不会继续了,Live Writer怎么办呢?

麦里芝蓄水池

MediaCorp就在麦里芝蓄水池边上,中间隔着条罗尼路而已。要不是天气太热,这蓄水池到真是个午饭后散步的好地方。MediaCorp的午饭时间是两小时,从12点到下午2点,而且到了点门禁就启动了,我拿的这种访客的通行证,在这段时间是开不了门的。这样挺好,让员工午休散散步,有利于健康。就这样,今天中午我跑去蓄水池走了走。
麦里芝蓄水池的环境挺好的,边上的林子里生活着许多蜥蜴啦,松鼠啦这样的小动物。还有一群为数不少的猴子,有大有小。中午也许是热了,小猴们纷纷从树上扑通扑通跳下水,然后爬上树再跳,玩的不亦乐乎。我临走的时候,这群猴子正爬到一棵榴莲树上,摘榴莲吃呢,那叫一个自在。

关机不等于重启

这是Windows 8消费者预览版中的新逻辑。

事情是这样的,Windows 8消费者预览版我用了有一段时间了,其间各种不稳定,作为测试版可以理解。可是让我难以理解的是,有些本来好好的东西,在关机再重新开机之后,反而变坏了,只有重启才能解决。最典型的是USB端口了,可能是Windows 8的USB 3驱动有问题吧,经常在关机断电重新开机之后,USB端口就不可识别了,只有重启能够解决问题。其他比如网络连接等等,不一而足,以至于我养成了一个习惯,早上开机之后,先重启一下,免得什么东西不工作了,troubleshooting半天浪费时间。

我能理解Windows 8为了加快开机速度,关机的时候是会保留内存快照,类似休眠那样。可是像这样关键反而不如重启,也太让人凌乱了。问题大概是出在休眠有bug吧,希望正是RTM的时候,这样的bug能修复。

Git

以前做支持的时候,不怎么写应用到生产环境的代码,最多是写写demo,发给客户的时候有免责声明,demo也是写到可以工作就行了,不需要反复修改,对版本控制没要求。内部的项目就使用IT的TFS,能访问内部网络就可以用,也很方便。因此一直没操心过代码管理和版本控制的事情。

现在情况不同了,给客户做项目,写的代码都是要用到生产环境的,对质量有要求,测试和反复修改就免不了,没有版本控制根本不行。公司内部的TFS不适用,因为项目期间我基本上都是在客户那里,访问公司的内部网络不方便。自建TFS太麻烦了,还要维护一台VM。我需要的是一个通过internet可以访问的版本控制工具。但是现在提供版本控制服务的网站,类似codeplex, Github等等,都是免费给开源项目的,私有的版本控制需要交服务费。不适合用在给客户的代码上。最终我还是选择用Git加上Dropbox或者SkyDrive,来实现自己的版本控制方案。

大部分版本控制软件,只在本地存储最后一个版本的拷贝,要查看历史或取得以前的版本,需要连接的服务器。Git的设计有别于其他的版本控制软件,使用Git在本地有整个repository的clone,查看历史或版本回朔并不需要访问远程的repository。如果不是做distribution,其实只要将repository存储在网络上某处,让团队其他人能够访问就可以了,不一定需要专门的服务器来host。因此,它其实可以完美地和Dropbox, SkyDrive等云存储服务结合起来使用。

用Git结合Dropbox (SkyDrive也类似)的工作流程如下:

  1. Clone本地repository到Dropbox中,$ git clone . ~/Dropbox/git/project.git。
  2. 增加一个remote: $ git remote add dropboxproj ~/Dropbox/git/project.git。
  3. 当本地有commit时,push到remote里:$ git push dropboxproj master。

团队成员从其他计算机上访问的流程如下:

  1. 建立一个remote: $ git remote add dropboxproj ~/Dropbox/git/project.git。
  2. Clone到本地:$ git clone dropboxproj。
  3. 当本有commit时,push到remote:$ git push dropboxproj master。

背后的同步由Dropbox完成了,十分方便。

文档里的bug害死人

项目需要用脚本来部署SharePoint farm,因为对脚本的需求挺简单的,我没用AutoSPInstaller这样的大块头,而是自己写了一个轻量级的PowerShell脚本,安装完binaries之后通过调用psconfig.exe来配置farm。为了确定SharePoint 2010的psconfig.exe的用法和MOSS 2007没区别,我还专门查了一下它的文档:http://technet.microsoft.com/en-us/library/cc263093.aspx

没想到脚步运行时还是出问题了,而且就是出在psconfig.exe这里。为了确定到底是哪里不对,我不得不把代码拆开,把输出结果用命令行来跑,结果发现是在创建configdb的时候,参数少了-passphrase。可是在那个文档里,configdb这个命令的参数列表里根本没有passphrase。显然,这个温度是直接从MOSS 2007搬过来的。

为这一个小错误,浪费了许多时间,文档不清楚真是害人。

Lumia 800

Sophy一直在用的一部iPhone4最近常常死机,拍Video的时候是必死机的,拍照片和浏览网页有时也会死机,连上数据线也有可能死机。常常是iPhone死机了还无法立即重启,放那不管,过一段时间它自己又恢复了,十分难以捉摸。甚至我们出门之前要约好,如果iPhone死机了,我们在什么时间哪里碰头。总之iPhone不稳定到让人无法忍受了。这部机器是2010年8月份的,早已过了一年的保修期,送修的价钱抵得上一部新手机了。所以我们决定干脆换一部新的好了。

我们决定买哪家的新手机过程也很简单,iPhone用过不想再用了,而且新加坡大街上人手一部iPhone,一点也不cool。Android手机品牌多型号杂,要研究比较出到底是选HTC One还是Samsung Galaxy S2,还是等S3,得花不少功夫。相比而言还是Windows Phone简单,Nokia Lumia 800是不二之选,Windows Phone没什么人用,离街机还远,我一直用HTC HD7,基本功能完全能满足Sophy的使用需要,而且她在iPhone之前一直用Nokia的手机,对Nokia相当有好感,于是就这么决定了。我们签的是SingTel的3G iFlex里最便宜的那个带数据的plan,手机只需付198块,plan包括100分钟免费电话,500条短信,12GB 3G数据,每月30多块。说实话,新加坡的电信服务真不错。

Lumia 800的设计确实不错,相比之下,HTC HD7就差远了。当然,HD7已经出了快两年了,属于过时的机型。有了Nokia这个伙伴,Windows Phone应该说是很有前途的。但按照现在的版本升级速度,估计WP还是无法追上Android和iPhone的,如果不被拉开的更远,就是万幸了。

我平时用手机,就是上上网,看看facebook和twitter,已经很久没关注过Windows Phone上的应用了,帮Sophy在Lumia 800上装应用的时候,才发现现在MarketPlace里的应用已经挺全的了。虽然WP7的竞争对手一直用应用数量来黑WP,但实际上常用的应用WP上都有了。Nokia的专属应用就不说了,一些新加坡local的应用也是很不错的,比如图书馆应用NLB Singapore,Channel News Asia的新闻应用等等。国内的微博,豆瓣电台等也都有WP的应用。所以我觉着数量不是问题,质量倒是关键。提高MarketPlace里应用的质量,不是靠赞助几个海天学院就行的。