关机不等于重启

这是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里应用的质量,不是靠赞助几个海天学院就行的。

新传媒

最近做项目,常常需要跑到MediaCorp去。从家里过去,路程不算近,但有直达的公车,也还算方便。只是从公车站到MediaCorp门口没有遮雨的走廊,下起雨来就很麻烦。就像今早,我在公车站等了半个小时,暴雨也没有丝毫减弱的意思,不得已只得拦了辆出租。司机大爷待人不错,没因为只是U turn的距离而拒载,使我免受了雨淋之苦。
在MediaCorp做项目,中午总在他们的canteen吃饭。这个canteen和新加坡其他的食阁没多大区别,不同的是在这里时常能看到一些新传媒的艺人和主播。可能对我这个外人来说新鲜,会多看他们几眼,其他人根本不会留意他们,不知是不是早已见怪不怪了。

说起传媒和娱乐来,新加坡现在是没法和大陆比了。最近东方卫视在播的几个现代剧,比如《大生活》,我妈是忠实观众。而8频道的本土电视剧,我妈就不怎么爱看。在海外频道这方面,我觉得东方卫视比CCTV4做的好。东方卫视会播“百里挑一”这样的娱乐节目和现代生活剧,让人能了解现在的中国人是怎么生活的。CCTV4就整天主旋律的调子,缺少娱乐元素。黄金档的电视剧播的是《毛岸英》,一堆的假大空,让人怎么对中国有好印象呢?

Now, Powered by Windows Azure

azure

早在年初的TechReady上,就看过Scott Guthrie演示在Windows Azure上跑WordPress。当时我正因为这个blog的主机商时不时掉线而伤脑筋,看了他的演示就想,不如将这个blog搬到Windows Azure上来。可是事情一直很多,直拖到现在。

Windows Azure的服务我在一两年前测试过,当时还只支持.NET。现在已经可以支持PHP,node.js,Java等等非微软系的技术了。对于在Windows Azure上部署WordPress,其实也很简单,下面这篇文档就包含了所有必要的信息:

How to deploy WordPress Multisite to Windows Azure using the WordPress scaffold

实际部署时,还是有些小细节需要注意:

  1. 这篇文档里的.phar下载的WordPress 3.2.1,不是最新的版本。可以将Scaffold原名从github上下载下来,修改相应的下载链接,来下载最新版的WordPress。
  2. 在Azure上部署的PHP程序,程序目录里的文件不是永久有效的。当Azure的虚机重启之后,会重新部署整个package。所以,在WordPress里下载theme和plugin不可行,需要先将需要的theme和plugin下载到项目的对应文件夹里,package在一起部署。
  3. 1.1.4版的数据库抽象库有一个小bug,在wp-contentmu-pluginswp-db-abstractiontranslationssqlsrvtranslations.php的第726行,正确代码是:$pattern = ”/LIMITs*(d+)((s*,?s*)(d+)*);{0,1}$/is”;
  4. 我在部署时遇到一个E:SiteRoot目录的写入问题。在倒入post或者在线安装plugin时,WordPress需要向这个目录写入临时文件,如果这个目录无法写入,则这些操作都无法做了。具体的原因我没找到,最终我是通过RDP到WebRole,手工修改目录权限解决的。这些权限会在下次VM重启之后被还原,还好我不是经常需要向这个目录写入文件。
  5. 另外,RDP的配置,可以参考这篇文章

HTML4,HTML5,XHTML 之间有什么区别?

又一个知乎上的问题和我的回答。

我来从HTML的历史谈谈他们3者的区别。

在HTML的早期发展中,W3C成立之前,很多标准的制定都是在浏览器的开发者们互相讨论的情况下完成的,比如HTML 2.0, 3.2直到4.0, 4.01,这些标准大部分都是所谓的retro-spec,即先有实现后有标准。在这种情况下,HTML标准不是很规范,浏览器也对HTML页面中的错误相当宽容。这反过来又导致了HTML作者写出了大量的含有错误的HTML页面。据说,时至今日web上99%的页面都含有HTML错误。

W3C 随后意识到了这个问题,并认为这是互联网的一个基础性问题,应该加以解决。为了规范HTML,W3C结合XML制定了XHTML 1.0标准,这个标准没有增加任何新的tag,只是按照XML的要求来规范HTML,并定义了一个新的MIME type,application/xhtml+xml。W3C的初衷是对这个MIME type浏览器要实行强错误检查,既如果页面有HTML错误,就要显示错误信息。但是由于已有的web页面中已经有了大量的错误,很多开发者拒绝使用新的 MIME type。W3C不得已,在XHTML 1.0的标准之后加了一个附录C,允许开发者使用XHTML语法来写页面,同时使用旧的MIME type,application/html,来分发页面。这个旧的MIME type不会触发浏览器的强错误检查。这就是我们今天看到的情况,很多网站宣称自己遵守XHTML 1.0标准,那只不过是说,他的页面中用了XHTML语法,但并不能保证完全没有错误。要验证XHTML有没有真正起效,需要查看web服务器使用哪种 MIME type来分发页面的。

W3C随后在XHTML 1.1中取消了附录C,即使用XHTML 1.1标准的页面必须用新的MIME type来分发。于是这个标准并没有很多人采用。这种情况同样发生在尚未完成的XHTML 2.0身上,它要求强错误检查,于是没有人采用。XHTML的故事也告诉我们,有时候先有标准再来实现,是行不通的。

有了XHTML的教训,WHAT Working Group和W3C在制定下一代HTML标准,也就是HTML5的时候,就将向后兼容作为了一个很重要的原则。HTML5确实引入了许多新的特性,但是它最重要的一个特性是,不会break已有的网页。你可以将任何已有的网页的第一行改成<!DOCTYPE html>,它就成也一个HTML5页面,并且可以照样在浏览器里正常的展示。

Windows Phone 7 系统的体验相对 Android 和 iOS 来说究竟怎么样?

一个知乎上的问题,下面是我的答案。

我来说两句吧,Windows Phone 7我从一发布就开始用,HTC HD7一直用到现在,几个月前就升级到芒果了。下个星期Nokia Lumia系列就发布了,还在考虑要不要换个Lumia 800。基于WP7的Silverlight应用也开发过两个发布到Macket Place了,不过一直忙工作,程序没有更新到芒果,现在在芒果上运行会时不时地崩溃。WP7之前,我用了几个月的iPhone 4,Andriod还没机会用。

WP7区别于iOS和Andriod的最大特点是,以人为中心,而不是以应用为中心,这一点在Mango之后得到了显著的加强。什么是以人为中心呢?举个例子来说,在iOS上,用户要了解朋友状态,需要通过不同的应用,比如要找facebook的朋友需要 facebook应用,要找twitter上的朋友,需要twitter的应用等等。而在WP7上,通过People Hub,不管是facebook上的朋友还是其他哪里的朋友,都可以通过这一个地方了解到他们的动态。沟通也是,短信,MSN,Facebook chat等等通通集成在一个地方,而且可以无缝切换。比如你正用WP7和你的facebook朋友通过facebook chat聊天,对方下线了,那么消息就会通过短信发到对方手机,或者对方从MSN登录了,那消息又会自动发到它的MSN上,你不需要切换应用,在短信界面里就全部搞定了,你甚至不需要知道对方在用那种方式和你沟通。

另外一点区别是,WP7希望提供所谓“一目了然”的特性,来节省用户的时间,减少对用户注意力的分散。比如WP7的待机画面提供了时间,日期,约会,邮件,短信,未接电话等等信息,用户不需要解锁屏幕就可以了解这些状态。WP7主屏幕上的应用程序图标也具有显示缩略信息的功能。比如你想知道最近是不是有facebook朋友给你留言,你不需要等到打开facebook应用才知道,那个Me应用的图标就有提醒功能,如果有更新,你会在图标上看到缩略信息,然后你可以决定是否要打开应用做处理。

其他可称为Killer应用的当然是微软的看家产品Office系列了。WP7上的Outlook我觉得是我用过最棒的手机邮件客户端了,它可以完美支持HTML格式邮件,不会因为你用WP7回了一下邮件,就把整个邮件的格式搞乱掉,比iPhone自带的邮件客户端强很多。Mobile版本的Word, Excel配合SkyDrive也很不错,对需要经常查看这些文档的用户很实用。OneNote虽然还没发和PC上的OneNote比,不过配合 SkyDrive也算得上是不错的手机笔记软件了。

最后说说WP7的开发模型,一共有两套,基于Silverlight的和基于XNA的。前者用来开发一般的应用程序,后者则用来开发有一定规模的游戏。看看Microsoft Game Studio的出品的从Xbox上移植的那些经典游戏就知道,用XNA还是能开发出大规模的手机游戏的。至于一般应用,开发者需要一些基本的 Silverlight知识,不过不需要太深。微软的开发工具还是很给力的,UI设计可以通过Expression Blend做,所见即所得。代码自然是通过Visual Studio,WP7的SDK自带Visual Studio和Blend的Express版本。如果是对微软技术有经验的开发者,上手很容易。

我的HD7用了一年多,我觉得完全够用。对比iPhone 4,HD7最不让我满意的地方就是它的相机了。RTM的时候拍照需要用实体按键,HD7的那个键在机身侧面又细又长,还很硬,使劲按总会导致手抖。芒果之后拍照可以不用实体键了,这个问题有所改善。不过成像质量和iPhone 4还是有差距,不知道Nokia Lumia 800的卡尔蔡斯镜头会不会在这方面有帮助。

GTD工具

Windows平台上有许多GTD工具,但是没几个做的像Omni Focus这样出色的,即便是能用的也不多。我用过一阵子ToDoList,这个tool该有的功能都有,甚至能用来做简单的项目管理,但是它的UI实在土了点,而且它用自己的数据格式做存储,不利于知识管理。一些Online的GTD工具我也试过,但实际上我并不需要把我的todo list放到网络上,或者在好几个设备之间同步。我只需要一个简单的工具来管理自己的todo list罢了。

最近我在用的是Jello Dashboard,这个软件是目前我觉得最适合我的GTD工具。它是一个和Outlook结合的轻量级GTD工具,由于Outlook是我日常最常用的软件,基本上一开电脑,第一个打开的就是它,因此Jello Dashboard显得非常实用。它本身没有数据存储,而是利用Outlook的Task, Appointment, Contact和Notes,并同tags结合起来方便管理。它提供不同的视图来管理tasks。实际上这个工具是一个基于HTML和JavaScript的应用,如果你不满意它的视图,你可以通过定制CSS来修改它们。它的Collect功能可以用来快速创建task,非常实用。由于它用的都是标准的Outlook对象,所有的内容可以方便地在Outlook里查找,而且数据都存储在Exchange中,不用为备份操心。最近我的HD7升级到Mango之后,可以自动同步Exchange的task列表了,这对我来说已经足够了。

其实每个人对GTD工具可能都有自己的需求,很难说一个工具能满足所有人。比如现在许多工具都以网络和设备间的同步作为重点和卖点,但我实际上并不太需要这样的功能。同时在适应了某一款GTD工具之后,你可能会对GTD的概念有新的认识。这是不是应了那句话:We Shape Our Tools and Our Tools Shape Us.

手工安装VirtualBox Guest Additions驱动

我在Windows 7上使用的虚拟机软件是VirtualBox,它支持x64的虚拟机,而且是免费的。不像Hyper-V和VMWare Workstation,一个不支持客户端操作系统,另一个的License很贵。

在我的这台笔记本上,我最开始用的VirtualBox版本是4.0.4,很不稳定,虚机动不动就失去响应死机了。后来升级到4.0.6,稳定了许多,不太会死机了,不过虚机的网络驱动似乎有点问题,时间一长就连不上host的网络了。前几天出了4.0.8,我就又顺手升级了。可是在升级其中一个虚机的Guest Additions的时候遇到了问题,主要是我没有先卸载4.0.6的Additions,而是直接安装4.0.8的。以前我也是这么做的,一直没问题,这次不知怎么回事,4.0.8的装显卡驱动报错,导致显卡,鼠标和一个system设备统统没装上。糟糕的是4.0.6的驱动还被它卸掉了,虚机一下变得没法用了。

看了VirtualBox论坛里相关的问题,大部分都说没救了。可是这个虚机里有正在做的一个项目代码,不能轻易废掉。研究了半天各种帖子,终于找到一个方法,记在这里。

  1. 显卡驱动装不上可以通过修改VBoxVideo.inf解决。这个文件在C:Program FilesOracleVirtualBox Guest Additions目录下,打开,删掉NTAmd64.6.0相关的项目,保存。
  2. 执行下面的命令来安装显卡驱动:
  3. VBoxDrvInst /i “PCIVEN_80EE&DEV_BEEF&SUBSYS_00000000&REV_00″ “VBoxVideo.inf” “Display”

  4. 鼠标驱动比较简单,在VBoxMouse.inf上右击,选安装应该就能装上。
  5. 用下面的命令手工安装系统设备驱动,添加网络驱动和鼠标驱动

VBoxDrvInst /i “PCIVEN_80ee&DEV_cafe&SUBSYS_00000000&REV_00″ “VBoxGuest.inf” “System”

VBoxDrvInst /addnetprovider VBoxSF 1

这样,重启之后Guest Additions的功能就恢复了。美中不足的是,在添加删除程序里看不到Guest Additions对应的项目,意味着它没法被轻易卸载了。要卸载只能通过手工来进行了。以后再升级还会是个麻烦。

所以升级VirtualBox Guest Additions的最好方式还是先卸载旧的Additions,再安装新的。