2007年5月30日星期三

Microsoft Surface 发布啦!

非常cool的Microsoft Surface技术终于发布了,之前在YouTube上看过一些demo显示这是Microsoft正在研究的技术,以为要多少年之后才能变为实用,因为实在太Sci-Fi了。

值得注意的是,Microsoft Surface官方网站演示中所用到的UI技术正是WPF以及其基于的.NET Framework,这在ScottGu的blog中有所提及

另外,Microsoft考虑优先将这台售价五千到一万美元的机器卖给商业合作伙伴,例如高档的餐厅、赌场、影院等,并且可能将于2007年底就开始投入使用,所以这东西是一点都不Sci-Fi的。

Popular Mechanics有另外一段视频深入解释了一些技术细节,可以在这篇名为Microsoft Surface: Behind-the-Scenes First Look的文章里看到。

Less Coke and Chocolate

昨天去补了很多只牙,估计都是可乐和朱古力惹的祸。平时经常吃完甜食,没有清理口腔的习惯,所以糖分就留在牙上面导致蛀牙了,而且这次还蛀得很深了,哎……

另外感觉省口腔医院很废,看上去设施和服务态度一流,不过总是治不好就是了。大半年前我已经开始有一点牙肉痛了,但中间去过几次省口腔医院他们都没告诉我有蛀牙,搞到拖了那么久。

2007年5月28日星期一

探索 ASP.NET Futures (Part 1 - Search & Sitemaps)

如果你在使用ASP.NET站点,同时又希望它Search Engine Friendly一些,很可能你就希望它有一个Sitemaps。在这里我们说的不是ASP.NET的SiteMap,而是Sitemaps.org定义的基于XML的Sitemaps协议,注意这两个名字的大小写以及单复数,之后我都会这样区分它们。Sitemaps协议有点类似RSS或者Atom,只不过它描述的不是最近的内容更新,而是整个站点的地图,主要用来描述特定URL的重要程度、更新时间及频率等。搜索引擎如Google是支持Sitemaps的,通过Google Webmaster Tools(以前叫做Google Sitemaps)你可以提交你的站点的Sitemaps,以便Google更好地索引你的网站。

简单调用

在ASP.NET Futures (May CTP)之前,如果你想要为你的ASP.NET站点增加Sitemaps支持,恐怕必须自己实现一个特殊的页面(或者HttpHandler)用于读取ASP.NET SiteMap并输出为Sitemaps协议。而现在这工作可以交给ASP.NET Futures的AspNetSiteMapSearchSiteMapProvider来做了,你需要做的仅仅是在web.config中写上几句。由于这个功能属于ASP.NET Futures中SearchSiteMap这个类别,所以需要在web.config中对该节进行配置:
<microsoft.web.preview>
  <searchSiteMap enabled="true">
    <providers>
      <add name="Navigation" type="Microsoft.Web.Preview.Search.AspNetSiteMapSearchSiteMapProvider, Microsoft.Web.Preview"/>
    </providers>
  </searchSiteMap>
</microsoft.web.preview>

在这个配置里面,我们启用了SearchSiteMap,然后配置了一个名为"Navigation"的Provider,此Provider使用AspNetSiteMapSearchSiteMapProvider类,就这么简单,和配置任何其他Provider的形式完全一致。之后你还需要确保一下有关的HttpHandler配置好了,如果你新建网站时使用的模板是ASP.NET Futures的,那么HttpHandler就应该配置好的了,配置信息如下:
<add verb="*" path="SearchSiteMaps.axd" type="Microsoft.Web.Preview.Search.SearchSiteMapHandler" validate="True"/>

这时候,如果你的网站已经正常启用ASP.NET自身的SiteMap功能,例如使用静态的Web.sitemap,那么访问SearchSiteMap.axd就应该能看到按照Sitemaps协议输出的结果。这时候或许你会很奇怪,为什么结果只有一条记录呢?这就是Sitemaps的递归调用了,这个主Sitemaps仅仅声名了我们之前配置的那个名为"Navigation"的Sitemaps的地址,也就是SearchSiteMaps.axd?sitemap=Navigation。打开这个地址,你会发现仍然是一个Sitemaps,它里面包含的就是ASP.NET SiteMap提供的数据了。

深入看看

接下来,我们用Reflector来看看Microsoft.Web.Preview.Search下面的一些类的实现方式。我不准备详细分析代码了,因为代码都很简单,直接说说看完的结果吧。如果你之前浏览根据SiteMap生成的Sitemaps时发现少了些东西,在这里你就知道如何把这些项目补充上去了。Sitemaps协议中关于一个URL能够包括以下几样信息:

  • 地址:也就是URL本身
  • 最后更新时间
  • 更新频率:此URL的内容多久更新一次
  • 重要程度:一个0到1的值,默认值为0.5,搜索引擎并不一定根据这个值来判断URL的真正重要程度

然而自动生成的Sitemaps仅仅包括前两项信息,如果我们需要后两项信息就需要手动增加。怎样手动增加呢?因为SiteMapNode类似于字典,能够访问this [string key],所以只要SiteMapNode[]存在"lastModified"/"changeFrequency"/"priority"这几个值就能自动输出到Sitemaps中,而且"lastModified"会覆盖对应Page的aspx文件的真实最后更新时间。

简单举例说明这功能怎么用,假设你使用的是静态的Web.sitemap,我们已经习惯这样定义一个SiteMapNode:
<siteMapNode url="Default.aspx" title="Welcome" description="" />

而增加特定的属性只需要这样定义:
<siteMapNode url="Default.aspx" title="Welcome" description="" changeFrequency="daily" priority="0.8" />

支持Dynamic Data

上面说了那么多,也就仅仅能做到支持系统自带的SiteMap,而实际上SearchSiteMap还能够对Dynamic Data提供特殊的支持。Dynamic Data简单易用,好像Ruby on Rails那样支持scaffolding,预览了ASP.NET将来在敏捷方面的发展。有关Dynamic Data Control的详细信息,请参考Dflying的文章,我们这里仅讨论SearchSiteMap的支持:

需要支持Dynamic Data的话,首先你要实现自己的DynamicDataSearchSiteMapProvider。大家不要一看到要继承自系统类实现自己的类就觉得是非常复杂的事情,其实这里我们仅需要override掉一个函数,也就是DynamicDataSearchSiteMapProvider.DataQuery()。在这个函数中,我们需要返回一个IEnumerable,其中的元素需要具有主键列名属性以及以下属性:

  • SiteMapLastModified
  • SiteMapChangeFrequency
  • SiteMapPriority

你很可能会问,为什么要是不确定类型的IEnumerable而不是确定类型的List<>呢?想想.NET Framework的什么部分用IEnumerable用得最多吧,那就是LINQ。如果你在QueryData()中直接使用LINQ来筛选数据,你就不需要创建自定义类型并且自己填充IEnumerable了。况且,主键列名也不是确定的,如果用一个属性记录其名称用另外一个属性记录其值那就很麻烦了,所以ASP.NET Futures选择了上述充分发挥LINQ优势的做法。

最后,我个人感觉SearchSiteMapProviderBase的设计有点问题,它作为AspNetSiteMapSearchSiteMapProvider与DynamicDataSearchSiteMapProvider的基类,其中包括QueryData()方法,然而此方法只有DynamicDataSearchSiteMapProvider用到,很显然就应该将它放置到DynamicDataSearchSiteMapProvider里面。

2007年5月24日星期四

被急 call 去参加 Google 面试

早上起来后,本来是计划帮一位老师把他的个人网站的模板设计好的,10:30突然收到电话通知叫我去面试。

开头我说大学城出市区起码一个多小时,很难赶上,但对方没有改时间的意思,说“那就只能另外约时间了”。这时候我当然不会选择让电话挂掉然后等下一次通知啦,所以马上问她下午是否可以,这时候才知道原来下午的时间都排满了,才一定要我上午去,然后我就答应上午赶过去咯,她说超过12:00到也没问题。

跑到大学城北部枢纽的时候,发现刚刚走了一部3线,而且最近的司机都很守规则离站了就不开门,所以想着可能还要很久才开下一班车,结果发现10分钟左右就有下一部3线准备开出了。出市区用了我半个小时,然后打的去东方宾馆又用了半个小时,去到刚刚过了12:00。

至于面试,就是签了NDA再进行的,所以就没什么好说的啦,自我感觉不怎么样,没有很突出的表现。之前听说Google的面试都是一个早上几轮面试一起来的,如果你被通知可以走了然后就没消息了,那么你也不知道是在哪一轮面试被刷下来的。不过今天我面试完临走时问了一下,才知道过了的话会有二面通知,希望自己能顺利提供第一轮面试吧。

2007年5月22日星期二

Google SE 笔试通不过

之前浪费了那么多时间wandering,该报应的时间终于来了,Google SE笔试通不过,收不到面试通知。总结出来就两点:

  1. 改拓展与利用人脉的时候一定要利用好。人脉一方面要拓展,另一方面更要利用,就如钱一样花得值了的才是你真正得到的。其实早些时候就有人大家帮我做Google的推荐,当时一心想着去申ID,就不怎么重视SE笔试,也就没在这之前作推荐,笔势完才发现原来身边那么多人是找人做了推荐的,也就是说他们来参加笔试只是玩下,有推荐可以直接进入面试的。
  2. 该做好的事情一定要全方面重视。其实对于SE笔试我也是很认真的,提前咨询了别的学校举行笔试的方式等等,然而却疏忽了推荐着一个重要的项目。

Move on. Next Target. 继续努力,由于最近对Product Manager的职位比较花痴,所以决定目标是早日有足够的能力获得一个PM职位。

Keywords: cnblogs, profit, future and more

上个星期六下午参加完博客园广州的聚会,讨论议题是博客园的盈利与发展,那么我也来说说这事情。

您为什么愿意使用博客园

要探讨这件事,我觉得首要问题应该是“您为什么愿意使用博客园”,这个问题决定了博客园当前的价值曲线何在,然后你才能确定博客园是否应该迁移到新的价值曲线上面去。如果你问我为什么愿意使用博客园的话,我的回答会很简单:因为用它来写blog简单易用咯。

看到这个答案,你是不是已经笑到肚子痛了?好,那么你先捂着肚子,回想1999年Blogger刚刚创立时候的样子。那时候还没有免费的Blog*Spot,如果你是Blogger的用户你必须有自己的空间,而且要是支持FTP上传的,Blogger所负责的仅仅是根据你设计的HTML模板套用你保存在他们数据库中的数据,然后生成静态HTML并且上传到你的FTP。免费的域名和空间?没有,你自己想办法买去。漂亮的模板?没有,除非你自己精通设计与HTML。看到这里我想你的痛症已经从腹部转移到头部了,这么辛苦才能弄一个blog难道不是一件非常头痛的事情?

我们再来看一个例子,VeryCD与传统的ed2k network有什么不同?理论上整个ed2k network是连通的,资源是完全共享的,当然有些客户端mod设计为同类mod之间优先传输,不过我们暂时忽略掉这类情况。VeryCD的成功就在于它让资源下载变成了非常便利的事情,甚至不仅仅是资源下载,而应该说资源的消费(consume),包括搜索、预览、下载、使用全过程。很早很早之前就在Dash的blog看到一张brain storm的图,画着用户现在消费VeryCD资源时都会遇到什么障碍,其中包括例如播放DVDRip需要安装codec和字幕插件,不是专业用户不知道什么是codec更不知道codec存在版本冲突等问题。之后VeryCD是有致力于解决这些问题的,例如通过制作Storm Player来方便用户播放DVDRip,并且保证此播放器是无捆绑的,这就让用户摆脱了既想装codec又害怕惹上捆绑软件的困境。

总结一下,是否简单易用对产品能否进入大众市场起到关键作用。相信博客园不是想做1999年的Blogger那样的高端用户服务平台,所以易用性就成为了关键。星期六的讨论有人说到了开源项目,有人说到了出书,这些好主意最终能否让大众受惠也就看是否便利(convenience)了。

什么是便利

那么到底便利是什么?我们拿开源项目来说说吧。如果一个开源项目必须要你下载源代码后自行配置和编译,你会不会用?如果好像Community Server那样下载后就是一个Installer可以直接安装使用,你又会不会用?无论对于开源项目的开发者还是使用者来说,是否便利都是很重要的一个因素。例如我想参与到博客园主持的一个开源项目吧,我该如何做呢?先装个SVN吧,这谁不知道,说起来可真简单。但对于没经验的人来说,选择什么SVN客户端,装完之后如何用,这就是个大问题。先说说题外话,知道什么方法能够最有效增加你的feed订阅量吗?那就是在订阅链接旁边加上一个帮助链接,用户打开后能看到一篇文章详细解释什么是feed以及如何使用feed订阅。因此,如果想要有更多人参与到开源项目中来,第一件事应该是普及SVN的使用方法,这就减少了用户自己摸索恰当的SVN使用方式所需要的时间成本。

事实上,我觉得4C理论可以合并为3C,因为convenience也就是cost,不过不是你的cost,而是你的服务对象的cost。星期六讨论时大家的思维方向都是如何能让博客园的写作者能够从写作本身受惠,从而增加粘滞度以及吸引新人。实际上我们可以尝试反过来思考,就是如何降低写作者的成本,从而达到同样的效果。这种成本可以是任何东西,而不仅限于便利性。而且这种策略还可以推广到写作者以外的群体,例如读者、广告商,甚至其他潜在客户。

价值与成本的问题

服务业本身就不在于创造实物商品,而在于创造服务,如果你多观察美国的Web2.0网站创业模式,你就会发现他们有时候会用到一种思维——“如果我能够帮你减少一百万的成本,你肯定乐意从这一百万中分一部分给我”。然而中国人的思维不是这样的,中国人就想着“我如何能赚一百万”。这样想的话,第一条答案肯定是去银行抢,第二条答案可能是坑别人一百二十万扣除成本自己获利一百万,这种思维再想下去就肯定都是和“假冒伪劣”有关的事情,做出来的结果肯定是零和博弈——你所有的收益都基于其他人的损失。因此,如果你很诚实,你想要一个双赢(win-win)的盈利方案,你必须优先考虑如何帮别人赚一百万,而不是自己赚到一百万。

博客园要盈利,思维的重点就不应该在于自身如何盈利上面,而应该在于当前客户甚至是潜在客户如何盈利的问题上面。因此,我们无论讨论出书还是悬赏求技术求人才都好,第一个关注点是客户而不是博客园本身。例如悬赏求技术吧,想着别人一个题目悬赏¥1000那么博客园能收益多少是没有任何意义的,正确的思维应该是想想客户乐意为一个问题悬赏多少钱。例如一个问题,客户估计要自己解决的话要¥1000的成本,那么他的悬赏肯定在¥1000以下,例如他估计来竞标的人肯定不少,那么悬赏可能就是¥900,这时候我们就去思考博客园是否可能使用不超过¥900的成本找到一个合适的人把这个问题解决掉。

总结起来,就是以下步骤:

  1. 博客园能够为客户提供什么样的价值
  2. 博客园能否在特定的成本下完成该价值

产品化——前方200米处

是不是两步就能完事呢?实际上这和最终产品化还有一定距离。

我们来说说出书的事情,其实现在我们都知道有博客园出书团队,但到底找博客园出书的途径是如何的呢,对比其他出书途径有什么pros&cons呢,这些暂时都无法在方便的在博客园或者出书团队的首页上找到,使用搜索引擎也找不到,这就让出书看起来更像是一个内测(private beta)的服务。这时候我觉得博客园就需要一位PM(Product Manager)来把出书服务变为正式版了,至少是公测(public beta)吧,这样才能让更多的人接触到这项服务。虽然出书的人仍然只占一个非常小的比例,但完善的服务总能给需要出书的人一个更好的体验,同时对于读者来说也更有影响力。

因此,最终我们还要加上第三个步骤,从而变成:

  1. 能够为客户提供什么样的价值
  2. 能否在特定的成本下完成该价值
  3. 是否有人能负责产品化

最后,还是照例推介一下我自己的blog,喜欢的话可以进行订阅哦:

2007年5月21日星期一

Google Recruiting Event

今晚去听了宣讲会、交了简历、做了笔试。如果成功获得面试机会的话,明天下午就会有通知,紧张的等待中……

题目当然如传说中的那么基础,但是和其他学校考过的题你全无关系,甚至你不可能通过一份题考的技术范围来猜另外一份题考的技术范围。做完之后,也不知道自己到底算是怎样,大家都是大部分做对了然后错了一点点吧,但到底哪题是关键,错了就死定了,那是不知道的。所以现在除了等,也没办法预测什么,或者作出什么抉择。

比较奇怪的一件事情是,实习职位列表上竟然没有Interactive Design Intern一项,然而网站和海报上是有的,难道因为招的人少而且不属于需要笔试的职位所以在宣讲中以及笔试的职位列表上都去掉了?另外一件事情就是,我越来越觉得Associate Produt Manager职位有吸引力了,可惜Intern不要本科的,Full-Time才收本科毕业生。APM职位给我的良好印象是它什么领域都能接触到,Technology、Design、Marketing、Legal等等,而且Google招收毕业生为APM后两年就能转为PM,其他企业的PM一般都是SE(Software Engineer)凭借多年经验晋升而来的。如果真的有机会进入Google,就一定要试试自己是否有足够的实力获得APM的位置。

2007年5月17日星期四

Cat2 模板系列开始预览啦!

什么是Cat2

Cat2 = Cat * Cat,两位Cat合作的意思,也就是我Cat Chen猫窝猫影组成的小团队。

什么是Cat2模板?

这是一个XHTML+CSS+JavaScript的模板系列,暂时只包括blog模板,并且优先提供Blogger与WordPress立即可用的模板,同时也会考虑为其他常见的blog平台(例如DotText)提供立即可用的模板。

如何获取Cat2模板?

我们的模板存放在Google CodeProject Hosting,地址为:http://code.google.com/p/cat2/。您可以直接在Cat2的SVN上下载模板,或者预览模板的效果。暂时我们仅提供SilverBlack两个模板的预览,这两个模板都还没有100%完成XHTML+CSS的设计,大家可以根据预览的效果为这两个模板提出一些建议。

如何使用Cat2模板?

在我们的模板正式发布之后,您可以将我们的模板直接应用于您当前使用的blog,也可以修改后应用于您的blog或者其他形式的网站。Cat2模板使用的许可是MIT License

2007年5月16日星期三

What turns me on?

CC说我是一个非常清楚自己想要什么的人,这应该和我小时候经常努力争取到一样东西然后发现并非真正想要有关。现在我无论决定要获取什么,我都必须先确定我是真的想要,不是一时刺激让我对此有占有欲而已。

不过对于what turns me on这个问题呢,我却没有任何确认的答案,或许因为还没有足够多的like/dislike test呱,所以暂时处于untrained状态,无法预知我对一样东西最终的态度是like还是dislike,也就无法确认what turns me on。

2007年5月15日星期二

更新了 Blog Roll

大家如果看到“榜上有名”的话,可以考虑在你的blog上也增加我的链接哦。如果发现自己“下榜”了,则可能是因为你的blog已经长期没更新了,所以我就把链接给去掉了。

花了一整天终于把 Universal Resume 呕出来了

参考着几份不同人的简历,从去年8月份那份Google Camp简历上面把信息复制到新简历上来,同时又做了一些增删,最终做好了一份最新版本的通用型简历。另外还完成了简历翻译工作,现在有中英对照两个版本,要感谢的是Google Translate,很多时候不知道怎么翻译好的时候就参考它给出的翻译,能够获得很好的灵感的哦。

然后开始要做portfolio,因为申请designer类的职位都要portfolio啦,而且就算申请engineer类职位有个portfolio也没什么坏处。

2007年5月13日星期日

No Way Back

要学Piggest那样做到“谷底反弹”只有一个选择,就是告诉自己没有任何的退路。在大学那么久了,不是没有进步,而是总觉得自己可以吃老本,总是有后备选择,“最多不久怎样怎样”,这样下去就只能一直选后备方案。虽然后备选择也在plan中,所以看起来还是It was planned,但其实都是worst plan。

以前我们说起沟女的时候,说到“我们做你的坚实后盾”何解,意思并不是在你有危机的时候我们会如何出手帮你,而是说我们在后面顶着你把你向前推,让你毫无退路,如果你不奋力向前就会给我们压扁。现在我觉得我需要一个“坚实后盾”了,至少是一个reminder,在我想选择backup plan的时候提醒我不能再向后退了,必须全力奋斗才能survive。

Keep Busy

发现自己太过闲了,太多时间做一些wandering的事情。

在你的生活太专注于一个项目的时候,wandering一下还是好的,往往能够有不少意外收获,随机获取的信息总能激发一些创意,有助于当前项目的进展。但如果生活本身就是wandering,而且做的任何小项目都是wandering性质,那就死人了,出来的结果总是没有集中的价值,也就没什么实际用途。

从现在开始,我要设置一些目标然后keep busy,拒绝wandering,提高时间利用率。

2007年5月5日星期六

一个事件三种解释

最近读过或者在读的书包括:《魔鬼经济学/Freakonomics》、《蓝海战略/Blue Ocean Strategy》、《引爆流行/The Tipping Point》。这三本书都说到了纽约犯罪率持续上升30年后在90年代突然下降这回事,并且尝试用自己的观点来解释。

第一本书说,这是因为30年前的堕胎合法化,导致很多不应该出生的人没有出生,而这部分人如果出生了,因为他们来自未婚或低龄母亲,不可能接受良好的家庭教育,所以成为罪犯的可能性很高,现在这批人没有出现在世上,犯罪率就下降了。书中希望突出的是,“揭示隐藏在表象之下的真实世界”,传统人士认为正确的所谓“传统智慧”往往是错的,只不过更符合人们直观的逻辑思维,更容易被接受,所以例如加强警力导致此次犯罪率下降就不是真的,数据表明其他城市加强警力也不可能达到此次犯罪率下降那么明显的效果。

第二本书尝试强调执行蓝海战略时如何排除合作方的障碍,让大家都接受新战略规划。因此,书中认为加强警力是有效的,并且叙述了当时的纽约警察局长如何在这件事上实现了蓝海战略,排除障碍,让市民获得了更高的安全保障。

第三本书的副标题是“How Little Things Can Make a Big Difference”,所以它尝试把此次犯罪率下降解释为某一个little thing的结果,从而引爆的一次流行,让潜在的犯罪分子不再想着要犯罪。

其实这是非常好笑的一件事,同一个事件被用作素材而用于论证不同的问题,差别只在于论证的目标不同,所以引述的数据也不同。曾经在Google Sitemaps上面见到一句话,说使用相同的数据推导出不同的结论正是统计学家们的工作,看来这次真的一个明显的例子。