Twitter Updates

    follow me on Twitter

    December 25, 2009

    基于Windows 7内核的Chrome OS

    我们知道Google的Chrome OS是基于Linux内核的,那么我们能不能制作出基于Windows 7内核的Chrome OS呢?答案是肯定的。经过我的实验成功制作出基于Windows 7的Chrome OS,并且运行良好。我是这样制作的,

    1. 打开注册表编辑器regedit.exe
    2. 找到HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
    3. 创建一个字符串类型的value “Shell”
    4. 赋值"%userprofile%\AppData\Local\Google\Chrome\Application\chrome.exe, cmd.exe”
    5. Logoff and Logon

    你将会得到一个基于Windows 7的Chrome OS。这个OS上将会有两个窗口,一个是Chrome窗口,一个是命令行窗口。你可以通过Chrome窗口上网,命令行窗口执行各种系统命令,以及文件的管理等等。

    chrome

    November 30, 2009

    Google Chrome OS 问题解答(2)

    1. 只能用Gmail帐号登录Chrome OS吗?

    现在是这样的,不过Google至少在正式发布之前会支持OpenID的。

    2. SSO只支持Google的应用吗?

    Google至少会支持OpenID的应用,其他应用也基本肯定会支持,账户,密码会同步到服务器。

    3. 必须通过帐号,密码才能登录吗?

    Google会提供自动登录的功能。

    4. 任何人通过他们的Gmail帐号都能登录我的机器吗?

    Google会提供白名单的设置,使得你可以决定谁可以登录。

    5. 怎样更改密码?

    我发现一个更简单的方法。

    sudo –i

    mount –o remount /

    sudo passwd chronos

    6. Chrome OS 不支持硬盘?

    这是一个典型的误解。我从Google的反馈认为,Chrome OS的专用机没有硬盘,但是Chrome OS本身并不是不支持硬盘。从我的实验来看,Chrome OS支持SCSI和SATA硬盘,不支持IDE硬盘。

    We didn't say that Chromium OS doesn't support hard disks, that's a common misunderstanding.

    You should be able to install Chromium OS on pretty much any HDD.  Support for other hardware...well, check out the supported hardware list at dev.chromium.org.

    Ah, yes...but, as you say in that other thread, IDE doesn't work :-)

    7. 为什么Ping不到机器名?

    Chrome OS不支持Netbios协议。

    November 29, 2009

    成功安装Chrome OS到硬盘上

    Chrome OS open source 之后,人们有两种方式来使用它,一种是用虚拟机,另外一种就是通过U盘启动。Google说不支持硬盘,而我们最需要的就是把Chrome OS安装到自己的计算机的硬盘上直接启动,从而作为我们机器的主操作系统。那么到底有没有可能把它安装到硬盘上呢?我今天做了一个实验,成功地安装到了我的机器上,我的机器上是SCSI硬盘。步骤如下:

    1. 通过U盘启动,进入Chrome OS。
    2. Ctrl+Alt+T, 打开terminal。
    3. /usr/sbin/chromeos-install
    4. 成功之后,关机,拔下U盘,开机。机器就会从硬盘启动到Chrome了。

    Chrome在我硬盘的分区如下:

    /dev/sda1 15xxxxx Linux

    /dev/sda2 972800 EFI (FAT-12/16/32)

    /dev/sda3 972800 Linux

    /dev/sda4 972800 Linux

    不知道IDE硬盘如何,大家可以尝试一下.

    November 28, 2009

    我为什么推崇Chrome OS?

    今天看到有朋友在我以前的老文章留言,我又重新回顾了一下,这文章是我批判Live Mesh的。当时我还没有接触过Windows Azure,更加没有Google要出操作系统的消息。当时的我对于Web OS的理解以及对当时情况的迷惑,绝大部分Chrome OS都给了我一个答案,以及印证了我当时的想法。最有意思的是,我对Live Mesh最反对的一点就是那个sync,把云上的数据要sync到本地才能运行应用。而Google的Chrome OS的设计竟然是不支持硬盘,也就是说根本就不需要云和本地数据的sync(当然cache还是需要的,这跟你把所有数据都sync是不同的)。从这点来看,就知道Google的系统是多么符合我对Web OS的理解了。当初写文章的时候找不到一款符合我定义的Web OS,现在已经有答案了。网友如果感兴趣可以看看我以前的老文章。

    Live Mesh 跟我对云计算的理解格格不入 (一)

    Live Mesh 跟我对云计算的理解格格不入 (二)

    Live Mesh 跟我对云计算的理解格格不入 (三):云平台

    Live Mesh 跟我对云计算的理解格格不入 (四):云应用和云共享

    November 27, 2009

    再谈一下UI自动化吧

    本来不想再谈这些内容了,因为太基本,简单了。可是最近竟然发现一直不屑于UI自动化的我,仿佛都成为一个UI自动化专家了。我发现很多人,包括论坛上的网友,还有很多身边的同事都对UI自动化充满了一些恐惧感,从而不敢触及它。当然也有一定的原因是觉得UI自动化没太深的技术含量,这也是我讨厌UI自动化的唯一原因。但是,一旦让这些人去做UI自动化的话,是很难做好的,因为UI自动化需要一定的经验,而我个人认为一年的经验,一个正规的项目应该都能具备编写良好UI自动化测试的能力。因此,对于后来的人,我想把UI自动化关键的几条再谈一谈,UI自动化确实没什么技术含量,你掌握了以下几点也能成为一个小专家了。

    1. 用高级语言编写自动化程序,在UI的部分调用UI自动化工具。我反对纯用UI自动化工具去写自动化,因为那样就太死板了,而且功能不强大,不灵活。我推荐学好一门高级语言,把大多数的自动化都用这门高级语言实现,只在需要UI操作的时候才调用UI工具。
    2. 只在你测试的UI模块上进行自动化的测试,其他地方避免用UI去操作,使用高级语言去实现。这样你需要用UI的地方就进行了最小化,从而使得只有在真正需要UI的地方才自动化UI,因此测试程序会相对更稳定。
    3. UI自动化最基本的操作就是发现控件和操作控件。尽量避免用text来发现控件,而使用一些固定的控件属性来发现,比如Control ID等等。这样的话,测试程序会更稳定,开发改变文本不会影响到你,而你也不用担心localization的问题。
    4. 操作控件分为模拟用户操作和事件驱动。简单的例子就是,模拟用户操作就是鼠标真的去点一下,而事件驱动则是跳过点击直接引发点击的事件。我以前用过具有这种功能的工具,但是最近几年用的工具不具备这个功能。
    5. 解决好同步问题。UI自动化最不稳定的地方就是同步问题了,你不能连续点击,而需要等待到一定的情况才能进行下一次点击。各种情况都不太一样,需要一些经验进行良好的程序设计。但是,简单来讲,要做到等待的情况发生能立刻返回到程序,不能空等。
    6. 减少其他UI对你自动化程序的影响,比如关闭Windows balloon,等等。一般来说是发现了有其他UI影响你的情况,就想一下workaround, 不会有什么大问题。

    从我的经验上来看,一般UI自动化有问题都能归结于以上几点,而一旦你解决了以上几点的话,UI自动化就变成了一个熟练工的工作了,没什么挑战性。我本人的有些模块的UI自动化基本可以达到100%的通过率,而所有模块的自动化也能达到95%以上的通过率。不过我基本已经脱离UI自动化了,因为太没有技术含量了,不过我还是认为如果你刚刚进入测试的工作,或者从来没有接触过UI自动化,或者从来都没有做好过UI自动化的话,在这上边工作个2,3年会有一定的收获的。

    November 26, 2009

    Google Chrome OS 问题解答(1)

    在使用Chrome OS的时候自己也有些疑问,有些找到了解答,有些是推测,写下来想跟使用Chrome OS的网友分享。

    1. Chrome会不会支持插件,比如Flash,Silverlight等等?

    Google在Web开发上非常推荐用开放的标准和技术。他们认为使用Javascript和HTML5完全可以做到不再需要Flash,Silverlight这类插件。并且,Chrome OS是不允许安装任何程序的,因此用户也不可以安装插件。所以,像Silverlight,Java,Quicktime等等目前浏览器比较流行的插件,Chrome都不会提供官方支持。但是,我估计是因为Flash的应用实在是太广泛了,Chrome内置了对Flash的支持。这就给微软出了个难题,“如何通过Silverlight服务所有的用户?”。微软的Silverlight战略终于开始尝到些苦头了,需要看别人的脸色行事了。如果Chrome能够流行开来,还有什么开发商会选择Silverlight呢?

    2. Chrome将会怎样支持离线应用?

    目前看来,Chrome很可能会倾向于HTML5的离线支持,而不是Gears,毕竟HTML5是开发的标准。也许这也是为什么Google并没有在自己的产品里大范围使用Gears的原因。我尝试在Chrome OS上安装Gears,并没有成功。

    3. Chrome 不能安装传统的软件?

    传统的软件有一个很大的问题就是需要安装。比如,你重装了系统需要重新安装所有的软件,你使用另外一台新计算机也需要安装所有的软件才能正常工作,娱乐。Google的Chrome是不允许安装软件的,很大的原因就是想解决这个问题。但是,这并不代表你不能使用传统的软件,只是你会更方便,比如输入网址,或者点击一个链接就可以使用了。Chrome提供Native code的支持,因此,现在所有的传统软件其实都是可以通过一定的修改和特殊的编译在Chrome上运行的。当然这需要Chrome占据一定市场份额之后才有软件开发商愿意和值得去这么做。

    4. Chrome 不能打游戏?

    跟上一个问题类似,游戏商完全可以编写在Chrome上运行的游戏。虽然现在没有这样的游戏,但是Chrome并不是一个不能打游戏的系统,未来的潜力还是有的。

    5. Chrome使用Gmail帐号登录,没有网络怎么办?

    第一次登陆Chrome需要网络,你的登录信息会被cache起来,因此以后即使断网,你一样可以登录。

    6. 为什么进入Chrome之后发现很慢,点鼠标要等个2,3秒才有反应?

    很可能你的机器使用的是Nvidia显卡,而Nvidia显卡没有open source 的显卡驱动,所以Chrome都是通过软件的方式来显示,因此很慢。

    7. 怎么调分辨率?

    进入到Terminal, 然后 /usr/bin/xrandr –size 1280x1024

    8. 怎样调音量?

    进入到Terminal, 然后 /usr/bin/alsamixer

    November 25, 2009

    从Chrome来看Google和微软的战略,现状及未来展望

    互联网已经发展到了云计算时代,而云计算一个非常重要的问题就是支持多设备,比如PC,Netbook,Mobile等等,以及多系统,比如Windows,Mac,Linux等等,而一个公司能否成功,很大程度上在于对他们支持的多少。我今天就想简单分析一下微软和Google的各自战略以及对未来的展望。因为有很多话要说,所以可能会有点乱,有些没有整理好的思路,以后补上。

    毫无疑问,微软的战略核心就是Windows,因此出现了Windows 7, Windows phone, Windows Live, Windows Azure 等等术语。而微软的直接想法就是把在PC上的操作系统Windows的品牌和优势扩展到手机,互联网和云计算上来。 而Google的战略核心则是在Chrome。很多人奇怪为什么Google把OS和Browser都叫一个名字,其实这正体现了Chrome在Google战略的核心地位,跟微软一样,把什么东西都贴上了Windows的标签。那么我想从底层到上层来分析一下微软和Google的情况。

    • OS: PC windows和windows mobile其实是两个系统,而Google虽然有Chrome和Android,但是将来要合二为一,我们有理由相信合并之后的OS还是叫Chrome。看看Mac和iphone其实是用了同一个系统,而且获得了巨大的成功,因此未来微软也非常有可能把两个Windows也合并起来。在这一层来看,双方都支持多设备,不过现在还没什么交集,Chrome OS主要应用在上网本上,而微软的对策则是Windows 7 Starter。相比Chrome OS来讲,Windows的巨大优势在于桌面应用,不知道被限制了很多功能的Starter还能不能像以前的XP对Linux在上网本上产生巨大的优势呢?不过总而言之,微软在OS这一层的垄断地位目前是无人能及的,Chrome只不过是有可能通过上网本去改变一些。
    • Browser:微软的browser就是IE,只能运行在Windows上。Google的Browser是Chrome,可以运行在不同的操作系统。由于历史原因,无论IE怎么烂,兼容性也是其他浏览器不可比拟的。由于很多网站只能通过IE才能良好地浏览,使得互联网用户必须在某种程度上粘在IE上,从而也就是粘在了Windows上。由于桌面程序在不断地,快速地往Web上转移,Windows通过桌面应用来粘住用户的可能性越来越低,因此IE就显得非常重要,更像是Windows的一道护身符。而Google Chrome浏览器则是新一代的浏览器,支持不同的系统平台,甚至通过Frame可以运行在其他浏览器之上。我说过Chrome OS不是那么重要,Chrome Browser才是Google的战略关键,Google的目的就是想在Browser这一个层面一统江湖,从而确定像微软在OS上那种垄断地位。一旦这种情况发生,Google就可以通过浏览器控制Web服务提供商,就像微软通过OS来控制软件商一样。当然这是Google的目标,在实现目标之前肯定会有一番龙争虎斗,Google也未必最终会成功,但是今后几年的互联网焦点都会落在浏览器竞争上。
    • 应用: Google在Web应用这个层面是全面地取得了领先,并且比微软走得要远很多。现在微软的唯一领先之处也许就是Live Messenger了,可是它毕竟是一个桌面程序,论Web应用的话,GTalk肯定要更强。Google的Web应用是依赖所有浏览器都支持的Javascript,而微软基本放弃了Javascript而强力推自己的Silverlight。由于IE只支持Windows,而互联网又需要支持多系统,Silverlight则是微软的多系统支持的解决方案。从需要安装这个角度,我就更倾向于Javascript,但是从开发人员来说Silverlight应该更合理,方便。由于Web2.0的这股热潮正是靠AJAX推动的,使我们看到很多通过Javascript实现的Web应用典范,比如Gmail, Facebook, Twitter, 还有Javascript的巅峰之作Gwave。而我并没有看到什么热门网站是通过Silverlight来实现的,毕竟Silverlight出道的时间也不短了。因此,我很怀疑Silverlight能够改变游戏规则。而Silverlight完全是微软自己的标准,并不是开放的,而对于以开放为基础的互联网来说,还是有些格格不入。

    综上所述,目前来看,Google在Web应用是全面地领先微软,而微软在OS上的垄断地位也很难撼动,双方今后几年的争夺焦点主要会集中在浏览器上。由于微软一向是以OS为中心,而Google是很明显以Browser为中心,所以胜利的天平很可能像Google一边倾斜。而一旦Google在Browser上取得胜利,微软的OS的优势也会面临相当大的威胁。

    最后回答一下一些网友的典型提问,“Linux这么多年挑战Windows彻底失败,Chrome就是一个Linux怎么可能成功呢?”,“Firefox挑战IE只有一点小成果,Chrome怎么可能成功呢?”我们如果分析一下,Linux挑战Windows是在OS这一层来挑战的,而Firefox挑战IE是在浏览器这一层挑战的,但是Google不同,Google是在三层全面地,立体地发动挑战的。换句话说,Linux做的再好,在应用层没有支持怎么办?Firefox做的再好,应用层都去兼容IE怎么办?而Google本身就是个应用大户,不存在这个问题,它与微软公司的发展是采取了截然相反的路程。微软是通过OS来控制应用,比如通过Windows集成IE打败了Netscape,通过Windows集成Hyper-V打Vmware,通过Windows集成.NET挑战Java, 通过Windows的优势开发杀毒软件因此导致杀毒领域的一片混乱。所以说,微软是采取的自下向上的发展方式,而Google则是采取的自上向下的方式。先有了广泛的应用,比如Search的垄断,Gmail,GReader, GDocs, GVoice, GWave, GTalk, 等等。然后在这个基础之上杀入浏览器领域,并且进一步杀入OS领域。对于用户来说,首要关心的并不是什么OS,浏览器,而是应用。对于一个典型的网友来说,即使用Windows,用IE,还是离不开Google Search。而Google开发了Browser和OS之后,想用Google 的各项服务就可以不用IE和Windows。这就是Google对于微软的最大威胁,你做的再强也离不开我,而我做好了就可以不需要你。我们有理由相信,用Google的各种Web应用,Chrome OS肯定会达到最好的效果,其次就是在其他系统上用Chrome Browser。而Google可以借应用的巨大优势让用户跳过微软,而微软却很难通过Silverlight加自己或者第三方应用去挑战Google的应用。因此,未来的Web应用会决定底层浏览器和OS的成败,而微软的优势还是历史上遗留下来的桌面应用,而这个优势现在越来越小了。这也是为什么由Google去做Browser和OS很可能会产生跟Linux和Firefox不同的效果。

    最后总结,微软的打算是把Windows扩展到多设备,但是解决不了多系统的问题,就出了Silverlight。而Google则是打算通过Chrome Browser解决多设备,多系统,甚至多浏览器的问题。不得不说Google的眼光真是更高一筹。

    November 24, 2009

    Google Chrome OS 试用初步印象

    上次那个虚拟机没搞定,这次的U盘启动这个搞成功了,而且还支持我新买的一台2500廉价东芝笔记本。下面说说自己的一些体会,总的来说跟我心中的设想几乎是完全一致的,甚至更好一点。本来以为因为驱动的原因,基本不支持现有的机器,没想到Chrome现在支持的机器并不少。虽然现在bug还挺多,或者功能还不完善,但我也还没看到什么重要的原因使我不能用它做个Windows替代,毕竟对Windows的很多方面早就忍够了。

    1. 先谈界面。Chrome OS的界面几乎是Windows 7界面的一个翻版。在Web OS的概念中,应用程序就是Web应用,或者说一个个的网站/网页。因此,如果从这个角度上去看,Chrome左上角那个按键就是活生生的Windows开始菜单,虽然现在十几个图标,但是以后扩展的可能是一定的,应该会搞的非常类似开始菜单。靠右的小Tab就是Widnows 7 Pined program再加上Startup,这个设计跟我使用Chrome Browser的习惯不谋而合。我就是设置Chrome启动的时候打开我最常用的Gmail, Reader, Wave等等,因此我很喜欢这个设计。再往右就是一个个Web应用的Tab了,就像Windows Taskbar一样,你可以在应用程序中间来回切换。最后右上角就是Windows的状态条了,包括电池,网络,还有个系统菜单是Windows没有的,但是好像没太大必要出现在那里,因为地址栏右边的工具条也包括了。Home Page则相当于Windows的Desktop,上边列出了你常去网站的快捷链接,Windows里是快捷键,不知道以后会不会加入壁纸的功能呢?总的来说,Chrome Browser就相当于Windows的Desktop,而Chrome OS是支持多个Browser窗口的,但是Windows并不知道多个桌面,当然这个意义也不是很大。
    2. 用途。目前来讲Chrome肯定不能作为主OS来用,比如这个镜像是通过BT下载的,U盘的制作也是通过Windows应用,Chrome都不可能实现。但是,作为一个替代OS给上网本用,给那些像我一样使用计算机几乎100%就是上网的人群来说,我并没有看到有什么大问题。快速启动,无需安装,管理应用,自动更新/恢复系统,设置/数据同步,Single Sign On等等优点都是Windows不具备的,而相反在Windows上表现出来的缺点又是无法让我忍受的。比如,我看着Windows开机/关机那么慢就着急,很多时候还关不掉。我特别不愿意在Windows上安装应用,迫不得已要安装的时候都很恼火,而且极其不信任有些应用,用完卸载的时候也不清楚是否卸载干净了,是不是还留下什么烂七八糟的东西。系统整天自动更新让我要启动机器,系统万一有点什么问题恢复起来也是很不理想,基本就是重装系统,而重装之后又要重新安装软件和配置系统。机器自己有个帐号去登录,登录之后去网站还需要另外的账户。这些恼火的地方,在Chrome上都不存在了,我不知道我为什么不去用Chrome?
    3. 目前的问题。Bug还是很多,刚开始用的时候好像很快就会crash,要关机再开机。后来发现,有些时候不是crash,它自己会恢复,重启什么的,而且如果你老老实实看网页的话,crash不算严重,还算是可以一用,当然希望能够有一个相对稳定的版本出来。Sync现在并不work,菜单也是灰色的。分辨率会变,有的时候重启变低分辨率了,如果再重启就可能又高分辨率了。重启或者关机的时候总是有个disk I/O error。性能并不比Widnows上的Chrome Browser快,而且目前肯定不如在其他系统直接用Chrome Browser好用。
    4. 一些技巧。我基本不怎么懂Linux,因此这些技巧不知道是不是大家都知道呢?
    • 一些有用的快捷键:Ctrl+N (new windows), Shit+ESC (task manager), F11 (full screen), F8 (shortcuts), F12 (windows preview), Ctrl+Alt+T (new terminal),

    Ctrl+Shift+W (close window)。

    • 重启:Ctrl+Alt+T, sudo reboot
    • 关机:Ctrl+Alt+T, sudo shutdown –h now
    • 进入Terminal返回Windows,F12
    • 改密码:在另一台Linux机器上把passwd里的root和chronos的密码删除。
    • 中文输入:在谷奥上看一个网友发的搜狗云输入法,试了一下还不错。

    November 22, 2009

    Chrome OS 就是 Web OS

    Chrome OS发布会已经过去几天了,照理说当天我会写篇文章出来的,可是一来现在比较懒,懒得长篇大论,二来Chrome OS跟我几个月前的想法基本一致,没太多意外,因此就觉得没什么必要写这个文章了。最近这几天看了不少评论,比较意外地是绝大多数人对Chrome OS持有否定的态度。本来按我的设想正面负面的应该是五五开的局面,没想到其实绝大多数网友的思维惯性还是很大的,还深深陷入在PC OS的时代。今天看到一篇文章与我的观点及其一致《Underwhelmed By Chrome OS? That's Kinda the Point》,更觉得没必要再表达些什么,可是由于我还有一个观点没看到人提起,就随便写写表达一下我的看法。

    最近这两年大家被云的概念搞得模模糊糊的,什么是云?什么是云操作系统?这个概念都很少有人能分清楚,更让大家忘记了在炒作云之前的热门话题“Web OS”。在PC刚开始的时候就是个单机系统,后来发展到了网络应用就在PC OS上加入了相应的功能,比如RPC,DCOM等等,又后来由于Internet的发展,PC OS上又加入了浏览器,成为了现在的模样。也就是说,目前的OS实际上还是从单机OS繁衍过来的,根基还是在本地计算。另一方面,在局域网的时代我们开发应用都是C/S结构的,也就是说client/server结构,而在10年前开始往BS,browser/server的结构转变,最近几年转变的尤其快速,甚至单机应用也在很大程度上向B/S的结构转变。那么我们知道,在C/S时代我们的OS是分Client和Server的,比如XP/Server2003。可是在B/S时代,我们的OS还是老的样子,分为Client和Server,比如Windows最新的Win7和Server 2008 R2。那么是不是这个结构有点过时了呢?我的回答是肯定的。在B/S时代,我们应该在操作系统层面有一个全新的结构,那就应该是Web OS和Cloud OS。什么是Web OS?什么又是Cloud OS?有的网友竟然拿Chrome OS跟Windows Azure进行比较,简直是驴唇不对马嘴。按照我的理解,Chrome OS就是Web OS,Windows Azure则是Cloud OS。在一个新的时代,云计算的时代,OS一定要脱离PC时代的概念,而跟云的概念紧密结合起来。Cloud OS是云里的一个虚拟服务器,具体到有多少台服务器,服务器上装的什么操作系统,一点也不重要,重要的是他提供的服务。而Web OS则是云的端,也就是云的接入点。而Web OS不应该仅仅是一个PC上的OS,它可以在多种设备上安装,提供接入到云的服务,比如手机。用户也不在乎到底是用的什么设备,设备上到底装的什么系统,只要通过Web OS能访问云就可以了。因此,Chrome Browser比Chrome OS重要的多。Chrome OS是一个纯Web OS,而Chrome Browser则是其他设备和系统上的虚拟Web OS。以后的真正焦点还是应该集中在Chrome Browser上来。别忘了现在是Browser/Server的时代,Browser才应该是故事的主角。

    在Web OS这个术语很热的时候,我试用过一些所谓的Web OS,没什么满意的。他们大多是建筑在Adobe的Flash上面。而Facebook带给了我不少Web OS的感觉,可是它还远远不够。Chrome Browser的出现使我对Web OS的理解有深了一个层次,而Chrome OS的公布则是第一个让我彻底信服的Web OS。Google这一步走的可能超前了一些,可是事实上也许是微软拖后腿时间太长了,别忘了C/S到B/S的转变可是已经发生了很多年了。也许很多网友并不知道,微软正在研究开发很多Chrome OS已经实现的功能,很遗憾第一步被Google迈出去了,就像Office online一样,Google推出很多年,微软还没有完全实现。所以,Google的Chrome OS的方向是对的,无论成功与否,都是一个非常积极的尝试。(微软完全有时间和资源短时间改善Windows把Chrome打败)

    最后说一下我的失望之处就是由于驱动的问题,Chrome OS不能安装在绝大多数的PC上,而我也不太可能为了使用它而花钱买一台新机器。可是我说过了,以后的真正重点还是在浏览器上,因此Windows7+Chrome Browser也是一个很好的选择。

    August 14, 2009

    我博客的变动

    经过了几天的试验,出于以下几个原因,我决定把博客搬家了。

    1. Blogger的功能比较强大,可是排版格式很不舒服,虽然可能可调,但是由于国内网友反映经常被block,需要翻墙才能访问,因此放弃之。
    2. 测试的文章写得差不多快没的写了,以后虽然会继续写,但会比较少,主要是需要比较长一段时间才能有一些心得体会。因此,文章的主题会跟测试没太大关系,主要会集中在互联网,尤其是云计算上。因为主题的扩展,所以我希望能够跟更多的网友分享我的观点与看法。
    3. Live Space不知道怎么回事,最近的文章在各大搜索引擎上都查不到,这就使得上边的第二点成为了不可能。而看我文章的朋友主要集中在测试领域,我这些新文章未必是他们想读的,因此放弃Live Space。
    4. 由于中国的特殊国情,我还是要不得已放弃把博客放在国外网站,因为读者基本上还是身在国内的。经过CSDN,百度,新浪博客的测试,发现新浪上发表的文章搜索引擎收录还是比较快的,而且使用起来也还算顺手,觉得可以用之。

    以下是新的博客地址以及一些其他的交流方式,有兴趣继续看我文章的朋友,或者想问我问题的朋友可以通过他们和我联系,谢谢。

    其次,相关的文章我会发布到以下网站。

    August 7, 2009

    微软将要大转型

    在微软与Google的大战中,我提过微软占有优势地位,但Google占有方向的优势。也就是说各方面的实力都是微软要高Google一头,但是在两个公司的理念上,我推崇Google。Google讲的是云计算,软件即服务,而微软由于软件霸主的地位使得微软不能放弃传统软件而提出了Software+Service的口号。我其实并不赞成这个口号,以前也批判过一些,而微软在这个口号下也没做出什么优秀的产品出来。倒是Google在云计算上做的风生水起。

    最近微软的一些变化让人感到很惊喜,首先就是Steve Ballmer竟然零代价搞定了Yahoo,简直是让我对他刮目相看。然后就是战略的转变让我重新看到了希望。微软每一年度开始,CEO都会发表下一年度的公司策略,而software+service则是去年的重点。我统计了一下去年与今年的变化,列出了主要的区别如下,

      2008 2009
    Software 出现9次 出现3次
    Cloud 出现2次 出现6次
    Strategy Embrace software plus services Embrace the cloud across all of our businesses

     

    Software的出现频率下降了三分之二,而cloud的出现频率则增长了两倍。可见微软这两年正在经历Software->Software plus Services->Cloud的一个重大历史转变。希望2010年微软能够推出一些重量级的产品出来与Google更好地进行竞争。

    微软,Google云计算基础技术的比较

     

    我想现在几乎没有人没有听说过“云计算”这个术语了,但是能明白云计算是怎么回事的人可能就是少数了,而在云计算的理解上也是因人而异,可能非常不同。这也不算不正常,因为云计算只是个概念,是个方向,很多时候大家都只是看到,抓到,感受到那么一点点,好比盲人摸象。就算大公司的理解也是千差万别,更何况每一个人了。我今天想通过对比微软和Google的云计算的基础技术来阐述一下自己对云计算的理解。首先我想澄清一些概念:

    • 云计算:现在最泛泛的概念就是云计算了。由于计算是其中的重点,我们经常把云上的所有东西统称为云计算,这就很容易使人感到迷惑。我个人认为云计算有两种context,一个就是计算,发生在云上的计算。另外一个是我刚提到的泛泛的概念,比如把云存储也归于云计算了。所以大家看相关文章的时候,一旦看到云计算要搞清楚context,否则就容易迷糊。而且我发现很多文章的作者本身对这两个概念也很迷糊。我在跟很多人讨论云计算的时候,也正是这个原因使得讨论无法进行。我个人倾向于把云和云计算区分开,就像把计算机和CPU的概念区分开,虽然CPU是计算机的核心。当然,这不是由我来作主的。
    • Server和client:我发现在讨论云计算的时候,不但需要区分上边讲的两个context,还需要区分server端和client端。如果从计算的角度来说,那当然server端是重点了,毕竟计算在server上产生。可是如果从云的整体来说,server端和client端就都很重要。而如果从用户的角度来讲,那就应该是client端最重要了,因为计算的发生对用户来讲是透明的,而client端的交互最重要。很多时候在讨论云计算的时候,人们竟然把client端跟server端混着来讨论。比如我在写livemesh与云计算的文章的时候,很多人竟然把windows azure拿进来讨论。我最近还看到有些文章竟然拿Chrome OS和Winows Azure进行讨论。
    • 由于以上原因,为了减少混乱,我会把云计算按照计算的context来讲,而把泛泛的概念直接称为云。我在讨论技术的时候,会把他们分为client和server端分别进行比较的。
    • Cloud OS与Web OS。在云计算概念流行以前,人们更多的是谈论Web OS。现在人们谈论的更多的是云计算,因此Cloud OS和Web OS的概念就又混淆了。可能不少人认为是一个东西,可是从我个方面的得到的信息来看,我们基本上可以用client/server端来区分他们。Cloud OS是server端的,比如微软的windows azure就号称Cloud OS。而Web OS则是客户端的,比如市面上的各种号称Web OS的网站,比如Facebook,比如Google的Chrome Browser,Chrome OS等等。目前来讲,Web OS还没有明确的概念,所有产品基本都是试验性质的,但是Web OS在client端还是比较明确的。
    • 对于云来讲,不同的人关心的重点不同。网络服务提供商,开发人员关心的是server端的cloud OS,而用户关心的是client端的web os。因此,对于大多数人都作为普通用户来讲,就没有太大必要去注意server端的那些新技术,新术语了,也不要被他们的出现搞糊涂了。

    下面的表格列出了微软和Google公司云计算基础技术和产品,随后有我个人的讲解。

    Server/client Technique Google Microsoft
    Server Cloud OS App Engine Windows Azure
    Client Web OS Chrome OS Live Mesh
    Browser Chrome IE
    RIA Javascript+V8 Silverlight
    Offline Gears Live Mesh/Silverlight
    OOB Chrome shortcuts Live Mesh/Silverlight

     

    • Cloud OS:由于Google App Engine只支持Python和Java,而我不想学Python也不喜欢Java,所以没有任何体验。而Windows Azure则体现出了微软强大的实力。从下至上,除了hardware则清一色使用微软自己的产品。OS: Server2008, VM: Hyper-V, Host: IIS, Dev tools: Visual Studio。从Azure来看,微软在云上开发了一套开发平台,从而改变了网络服务提供商的经营和开发模式。他们不再需要买自己的服务器,而转为租用微软的虚拟机,开发则是通过微软提供的接口开发在IIS上的web服务。重点是他们不需要考虑sacalability,而是按计算的需要和使用情况向微软付钱,就好比我们现在买电一样。而云计算的提供商则相当于现在的电力公司一样,使得计算变成一种资源去交易。由于我不是搞这行的,所以,我更多的注意力放在了client端。
    • RIA:要想建立client端的Web OS,则需要依赖于rich internet application。这方面的技术主要有三种,Adobe的Flash,微软的Silverlight以及Google推崇的AJAX。以前用过一些Web OS都是建立在Flash上, 我就感觉很别扭。一是因为既然是OS还需要依赖Flash?二是因为点右键总是有个Adobe的影子,而且不能customize。其实也正是因为这个原因使得Google在很早就放弃使用Flash了,而进行了更灵活的Javascript的大力支持。微软的Silverlight则正像是Flash的翻版,到现在为止我基本上没看到过什么基于Silverlight的应用,好像主要是播放视频。而Google自己基于javascript的Gmail, reader, 以及最近公布的集大成的Ajax的顶尖作品Google Wave等,都让我在RIA这个方向上很支持Google。
    • Browser:前边说过Google大力推行Javascript,而运行速度慢是Javascript的一个致命的问题,使得在和Flash, Silverlight的竞争中处于劣势。基于这个原因,Google推出了自己的Browser Chrome,并且内嵌了V8的JS的引擎,使得javascript的运行效率大大提高,从而可以用javascript开发出更高级的界面。比如,我看过JS实现的一些SD,动画的demo,都还是比较出色。而Chrome又大力支持HTML5,其中重要的一点是支持了视频,从而使得Flash和Silverlight的竞争力进一步降低。而且,javascript的好处在于浏览器本身就支持,不用像Flash, Silverlight还需要单独安装。进一步说,Chrome对JS的优化直接推动了Firefox和IE对JS的优化,而JS的运行效率也成为了浏览器的最重要的指标之一,使得Javascript的前景更加的光明。
    • Web OS:现在已经比较明确的看出来了Google的Web OS就是即将公开源代码的Chrome OS,而对于普通用户来讲,Chrome OS和Chrome Browser基本就是一个东西。因为普通用户对那块Linux内核是透明的,也是不在乎的。所以,我们只要看Chrome Browser的发展,就应该能推断出Chrome OS大概的样子。Chrome OS最大的焦点在于替换掉Windows,而Chrome Browser将要增加的同步功能,使得Google的Web OS更加完善,而谣传了许久的GDrive如果能够稍后推出的话,则Google的Web OS将基本成形。微软目前并没有一个所谓的Web OS,而最像Web OS的产品则是Live Mesh。Live Mesh我以前已经谈论过了,就不再重复了,简单来讲我很失望。
    • Offline:云计算的一个重大问题就是离线怎么办?这也是很多人质疑云计算的一个主要原因。Google的解决方案是Google Gears, 它内嵌于Chrome里,也可以安装到其他浏览器上。Google Gears使得用户在离线的时候还可以访问,操作数据。微软的主要解决方案是Mesh, 通过同步各种设备。最新的Silverlight也加入了一定的离线支持。
    • OOB (Out of Browser): 在浏览器中运行的Web应用界面与传统桌面软件比起来总是死板,不够灵活的。因此,人们就产生了需求,想在浏览器之外运行web应用。Adobe的Air可以实现这个功能,而Google的解决方案是Chrome里的shortcuts。给Web应用建立了shortcuts之后,就可以按照人们习惯的方式启动这个应用,而界面也很传统软件非常接近了。微软的解决方案则是Mesh, 或者最新的Silverlight OOB功能。

    综上所述,我们可以清楚地看到,Google的云技术的client端的核心就是Chrome浏览器,所有相关的技术都嵌入到了浏览器中,甚至操作系统的内核也算嵌到了浏览器中,这也是为什么Google为它Browser和OS起了一个同样的名字。所以,我们可以说Google Chrome未来就是一个Web OS。而反观微软,则是把这些feature分散在了几个不同的产品中:Windows, IE, Silverlight, Live Mesh,并没有一个统一的解决方案。因此,在云计算的战略上,还是感觉Google比微软看的更高更远一些。

    还是回到Live Space吧

    一些人反映blogger被国内封了,所以我又回到了Live Space。

    peking2toronto.spaces.live.com

    May 30, 2009

    Code Review, Debugging, Windows Internals, WDM小结 (一)

    学完Silverlight之后,最近两三个星期集中在了code review, debugging, 以及Windows Internals和WDM的学习上。现在是时候做个小结了。

    逛了一些关于debug,windows内核,驱动等的论坛,发现大家主要集中在了加密/解密,逆向,系统漏洞和反病毒等等专业领域,和我所学习他们的目的并不相同。所以,文章和我所关注的知识点也不很match。对于我来说,我学习他们的主要目的集中在了Debug和Security Test上。在学习的过程中有种知识零散的感觉,昨晚才把他们互相联系起来,因此也就有个立体的感觉(请看下图)。下面想简单地谈谈。

    首先,Debug是一项软件人员应该掌握的既基本,又高级的技能。它并不属于开发人员的专利,测试人员拥有这项技能也如虎添翼。说它基本是因为在你大学学习计算机语言的时候都会或多或少用到debug的技术,是编程中一项必用的技术。说它高级是因为很多疑难杂症都需要高超的debug能力才能去解决,debug的能力很大程度上体现了一个人的软件开发测试的水平。大家debug的目的各不相同,而对于测试人员来说就是在发现一个bug的时候能够通过debug找到root cause。在debug的学习与实践中,我认为以下知识非常重要:

    1. Debugging tools: 微软提供了一套tools,而我们最常用的就是windbg了。windbg使用起来还不算麻烦,学习起来也不难,但是各项命令实在是太多了,需要时间和经验去慢慢积累。
    2. Code review:或者你做专门的code review,或者你在debug的时候做code review。总之,你对代码不熟悉是很难进行debug的。因此,code review也是debug中非常重要的一个方面,你应该熟悉你所测试产品的代码。很多时候,你甚至不用去debug,想想代码流程,或者简单地review一下就能定位bug。而对于code review方面,你需要了解Win32 API (User mode code),以及WDM,WDF (driver)。
    3. Assembly: 如果你没有源代码的访问权利,你就需要逆向的能力了,这个就对汇编的要求很高了。但是,一般来说我们都是测试自己的产品,理所当然具有源代码的访问权利。但是,即使这样,我们仍然在某些时候需要汇编的知识去debug,比如有时windbg的命令不能正确显示结果,或者调试optimized code的时候。不过这些要求不会太高,一般来讲你学习几个小时的汇编就应该够用了。
    4. Windows internals:其实Windows internals是里边最难学的,但又是比较基础的东西。比如,windbg的很多命令的使用需要你了解内核的工作原理及数据结构。而你在调试driver的时候当然需要内核的很多知识。你如果把内核学通了,其他知识都不成什么问题了,所以对内核的掌握程度也直接决定了你的debug水平。这本书我从开始看断断续续的也快三年了,最近才有了立体的感觉,一想能知道这本书都说了些什么,虽然我不确定我到底看懂了多少,但是基本上在debug需要的时候我能够直接找到相应的章节去看,也应该可以短时间内看懂。由于先看了这本书,所以在看WDM的时候就感觉很简单了,虽然作者说话很罗嗦,但是不用太多的推敲都能很快理解。有种感觉,好象是精通了C/C++以后再去学习其他语言的时候的那种感觉。

    image

    May 28, 2009

    你是不是要找病(Bing) ?

    在Google和Yahoo中搜索Bing, 出现提示"你是不是要找病"。

    image

     

     

     

     

     

     

    image

    May 24, 2009

    《Windows Internals》学习心得(2)- Windows Architecture

    Windows

    • kernel32.dll, advapi32.dll: to provide Windows APIs
    • ntdll.dll: to switch from user mode to kernel mode
    • ntoskrnl.exe and drivers: major part of Windows OS
    • hal.dll: hardware abstraction layer

    Ntoskrnl.exe and drivers

    • executive
    • kernel: KeXXX

    Executive

    • system services: NTXXX, ZWXXX
    • executive support routines: ExXXX
    • executive components and relevant services

    Executive components and relevant services

    • Object manager: ObXXX
    • Configuration manager: CmXXX
    • Process and thread manager: PsXXX
    • Memory manager: MmXXX
    • IO manager: IoXXX
    • P&P manager: PpXXX
    • Power manager: PoXXX
    • Cache manager: CcXXX
    • Security reference monitor: SeXXX

    Drivers

    • ntfs.sys
    • volmgr.sys
    • ndis.sys

    May 23, 2009

    xikug谈黑盒,灰盒,白盒,逆向


    早就想写点什么,自己都不知道一天在瞎忙什么,一直到最近才开始动手。。。我想通过这个乱谈系列跟大家分享一些心得。我打算在这个系列文章中讲点方法与思路,当然,很多方法并不是我的原创,只是我用这些方法和思路解决了我的实际问题。由于本人水平有限,很多说法只是我个人的理解,然后用我自己的语言表达出来,可能并不专业,所以在这里不负责任的乱谈一下,欢迎大家拍砖。
    什么是代码逆向
    代码逆向即是在没有源代码的情况下,对目标程序的行为、数据流、及编译器生成的代码进行分析,通过分析我们可以了解、发现程序的功能、流程、规则、及技术实现细节等,通过分析我们能对其进行优化、功能增强、漏洞填补、甚至还原成源代码等。这个分析过程我们可以称作逆向分析或逆向工程,简称逆向。
    对我们个人而言或许我们能够从逆向分析的过程得到的最大好处就是学习到优秀程序的设计思想、及技术实现细节。
    当今,逆向分析技术在很多地方都得到了应用,典型应用包括恶意软件分析、漏洞挖掘、BUG定位、技术探秘等。
    有人可能会说逆向太无耻了,自己不会写就偷别人的代码。。。我就不相信说这话的人什么都会,我就不信他没有分析过别人的东西,学习过别人的东西,我只能说他是无知的。。。殊不知逆向是一个探索未知的方法,是一种学习态度,是代表不屈服于困难的精神。如果没有逆向当前的很多科学进步不了这么快,也可能不能取得进步,科学研究就是探索未知,把我们未知的东西进行分析研究变成已知,不光是软件领域有逆向工程的应用,其他领域如:基因重组、化工、制药、电子、建筑、航空、军事等领域也存在着他们各自的逆向工程应用,逆向工程帮助科研人员把未知的东西进行分解、研究、组合、改进等,甚至创造新的东西出来等,科学就是这样一点点进步的。
    通过逆向得到的好处是显而易见的,然而任何技术都是把双刃剑,逆向分析技术也不例外。可能被人用于学习、解决技术问题或做有益于软件安全的事,也可能被人用于搞破坏。
    逆向方法
    白盒分析
    白盒分析就是从代码级别上(可能是反汇编代码、反编译的伪代码或源代码),通过动态调试或静态反汇编分析和理解程序的功能、逻辑,找到程序的安全问题等。
    黑盒分析
    黑盒分析是指从程序的外部,通过观察程序运行时候的行为,规则等来猜测和断定程序可能的实现方法,是否有存在脆弱点等。
    灰盒分析
    灰盒分析通常需要借助一些专有工具(可能需要自己编写),如api监视工具,陷阱工具,内存比较工具,文件监视工具等对目标程序进行监控,看它发生了什么操作,调用了哪些api,产生了哪些结果,在系统哪些地方安插了HOOK或过滤等,以此来猜测和断定程序可能的实现细节。
    目前越来越多的程序加了VM或进行了代码扭曲,用白盒分析此类程序可能会花很大力气也找不到突破口,而黑盒和灰盒分析往往对这类程序可能有意想不到的效果。
    逆向手段
    动态调试
    通过调试器对目标程序进行追踪分析,能够清楚的了解到程序运行起来后内部的状态,运算结果等信息。
    静态反汇编/反编译分析
    使用反汇编器或反编译器把目标程序变为可读的汇编代码或伪代码,然后分析程序的结构,流程,逻辑等。
    如何学习
    逆向并不是想像中那么难,但也不是想像中的那么简单,真正困难的是如何有效的运行这些方法和手段来更快、更好的达到我们的目的,这需要累积大量的程序设计经验和逆向经验。
    通常我们进行逆向的时候希望达到的目的大致可分为以下几种:
    技术探秘/代码还原
    软件漏洞挖掘
    软件Bug定位
    软件行为/规则分析
    解除软件的使用限制
    进行辅助程序的开发
    我们要达到的目的不同,逆向时采用的方法和手段的“细腻”程度也不会相同,譬如我们对一个win32平台下的内核驱动进行“技术探秘/代码还原”的时候可能会把白盒、黑盒和灰盒所有的方法和手段都用上,每段汇编代码我们都必须看懂,代码实现了什么功能,跟另一段代码有什么关系,理解整个代码的架构和思想等;而我们在进行“软件行为/规则分析”的时候可能只需用上黑盒或灰盒分析法就够了,知道按下这个按钮后读写了哪些文件,哪些注册表项,调用了哪些api等等。分析过程中有时候我们只需静态反汇编看一下就可以了,有时候我们可能还需要动态调试一下,总之没有固定的套路,一切视情况而定。
    扎实的编程基础是学好逆向的关键,基础打好了学什么都快。程序的基础就是算法和数据结构,语言只是一个实现的工具,绝大多数语言都是相通的,我们只要掌握一门,以后如果需要学习其他语言的话上手就会很快了,基础知识我们重点需要掌握以下内容:
    1.至少一门高级程序设计语言,推荐C语言或Pascal
    2.x86汇编语言
    3.常用算法和数据结构
    软件一般都是在特定平台下运行的,如Windows平台,Linux平台,WinCE平台,Java平台,Symbian平台,Plam平台等等。。。针对特定平台下的软件逆向,需要掌握特定平台下程序设计的相关知识,包括其SDK,进程管理,内存管理,文件系统等。这些东西不必全部精通,但要有个大致的了解,常用Api要知道,有特定平台下的程序设计经验最佳,遇到问题知道在哪里能找到自己想要的资料就够了。逆向的过程本身就是一个学习的过程,因此我们可以在逆向的过程中补充自己相关的知识,这样学习的效果是最佳的。(由于本人所接触的面比较窄,接触得最多的就是x86 Windows平台下的原生程序逆向,因此本系列文章中的内容除非特别说明都是指x86的Windows平台下原生程序和代码)
    学习逆向的最好方式就是动手实践,在实践中有针对性的学习。通常来说我们逆向时所面临的东西对我们来说是未知的或者是可能知道但不确定的,如果是已知的就没必要再去逆向了。针对性的学习就是在自己逆向的时候缺什么知识就补什么知识,日积月累过后我们的收获是相当可观的,不光是经验值的增长,还有知识面的增长和知识深度的增长。
    编程的经验对于我们实践逆向时也很重要,例如进行“漏洞挖掘”的时候我们可能会以程序设计者的角色进行思考,程序在哪些地方需要进行防范,哪些地方可能会出现漏洞等等,如果我们有足够的经验的话,可以很快定位到相关的代码部分对其进行分析,看是否存在可能的漏洞。又如在进行“技术探秘/代码还原”的时候,由于现在的程序规模越来越大,我们不可能每条指令,每段代码都去看,都去逆向,假如一个1M的程序需要这样做的话,光时间成本上来说成本都是相当高的,因此我们需要快速定位关键代码段,而丰富的编程经验有助于我们做到这一点。拓宽自己的编程知识面、积累编程经验跟积累逆向经验同样重要。丰富的编程经验能让我们事半功倍。
    另外在进行代码还原时我们最好能用原始程序的实现语言进行还原,这是为了避免麻烦,因为现代的编程语言通常都有自己的Framework,提供各种各样的类库,他们功能各异,互不兼容,如一个VCL的程序我们硬要用MFC对其还原,VCL的某一非常复杂的机制或功能在MFC中可能没有,而自己如果在MFC中实现的话工作量是相当庞大的,这时的结果可能就会是事倍功半了。因此我建议在代码还原时最好使用原语言进行,原来是C的就用C,原来是Delphi的就用Delphi,原来是Python的就用Python。。。
    逆向工程时常具有“四两拔千斤”的功效,我也不太会表述,等你有足够的实践之后大概才能体会到,这个就只能意会不能言传了
    学习资源
    上面说了那么多,是时候介绍一些学习资源的时候了,这些资源都是比较基本的,可说是学习阶段必备的,希望在大家学习和实践的过程中能帮到大家。

    《Windows程序设计(第5版)》 – Windows平台下程序设计的经验教程。URL - http://www.china-pub.com/2382
    《Windows核心编程》 – 又是一本经验的书,可以帮助你把Windows下的编程技术提升一个层次。 URL - http://www.china-pub.com/131
    《深入解析Windows操作系统(第4版)》 – 这本书是关于Windows内部机理核心的权威之作。这本书对提高你的逆向水平也是大大有帮助的,当然,前提是在你看懂之后。 URL - http://www.china-pub.com/32775
    《加密与解密》 – 不错的入门书籍,快出第三版了,http://www.china-pub.com/12210
    网站
    www.rootkit.com – 很多关于系统安全,系统内核方面的资料和代码
    www.codeproject.com – 很多程序设计的代码和文章
    msdn.microsoft.com – 包含最新的微软平台下的开发资料
    论坛
    bbs.pediy.com - 看雪论坛,国内最大的加解密论坛,已经向软件安全转型,上面汇集了国内大批高手。
    www.unpack.cn - 一蓑烟雨,国内最专业的脱壳论坛,关注面也很广,除了脱壳外还有汉化、软件安全、木马病毒、编程、游戏、文学、音乐、艺术等,上面的高手也不少。
    bbs.driverdevelop.com - 驱网论坛,驱动开发的论坛,高手不少,但是发言的比较少,可以去逛逛。
    forum.sysinternals.com – Sysinternals,很多系统方面的资料,不少高手在上面发言。
    www.debugman.com - 第8个男人,在下创建的论坛,旨在为志趣相投的朋友提供一个交流平台,目前关注方向为程序设计、逆向、代码安全和系统底层等。
    工具
    这里列出的工具只是很少一部分,对工具的选用,我的观点是哪个随手就用哪个。
    OllyDbg – 调试器,ring3下的调试器,上手快,功能强大,有很多插件。
    SoftIce – 调试器,ring0级调试器,当然ring3程序也是可以调的,功能强大,但已经不更新了,不支持vista等较新的操作系统。
    WinDbg – 调试器,MS自家的调试器,就不多介绍了,两个字 - 推荐。
    IDA – 反汇编器,最强大的静态反汇编分析工具。
    LordPE – PE工具,可编辑PE文件等。
    PEiD – PE工具,可识别PE文件的格式信息,如用什么编译器编译的,是不是被什么壳处理过了等。
    FileMon – 文件监视工具,可监视系统或程序对哪些文件做了什么操作。
    RegMon – 注册表监视工具,可监视系统或程序对哪些注册表项做了什么操作。
    SSM – HIPS,这个工具有时候可以给逆向带来很多方便,如抓取某个文件,禁止访问某个注册表项,盒灰分析等。

    May 22, 2009

    《Windows Internals》学习心得(1)

    以前做开发的时候用VC, MFC, 对于Win32和Driver是一点也不感兴趣。后来乱七八糟混了好几年,IT业大变,自己碰巧就做上了测试。测试又做了快5年了,大部分时间是自我摸索,到了现在这情况变成了一定要学习Windows internals了。
    这本书从开始看也两年多了,我很难说我看懂了多少,只是最近才开始有点立体的感觉,当然这跟工作上接触到一些相关内容还是有关系的,否则只是硬看应该是看不懂才对。我想目前由于不精通Windows internals对于我的测试工作有以下几个障碍:
    1. 跟开发人员的沟通存在Gap。
    2. 不能更好地去设计测试用例,因此不能抓到更深入,复杂的bug。
    3. 对于一些复杂点的问题很难去debug。
    4. 对于code review, code coverage, security test等等都受到了很大的限制。
    5. 职业发展也有了bottleneck。
    因此,我觉得在今后的几年应该在Windows internals上下下功夫,争取能够达到精通。今天我就想谈谈自己以前比较混乱的一些概念,windows internals, windows kernel, SDK, DDK, Win32, driver。
    • Windows internals应该是讲Windows OS实现的一些细节,它并不局限在kernel mode的模块和知识,还涉及到了user mode的一些系统进程。因此,我说学习windows internals就应该包括了所有Windows OS的知识。
    • Windows kernel,我主要是按照在kernel mode运行的模块来理解的,因为Kernel mode里还有个kernel,容易造成概念的混淆。
    • Win32 API就是windows提供的在user mode的应用程序编程接口,它的工具包叫做SDK。但是涉及到系统服务,也就是内核上的服务的时候,他们是通过ntdll.dll转到kernel mode去实现的。也就是说,实现的细节还是在kernel mode。
    • Kernel里提供了一套接口叫DDK,是给driver的开发人员使用的。如果你想在Kernel mode运行你的程序,你应该只能通过编写driver来实现,正常来说。
    由于windows internals的大部分知识都是在kernel里,因此我也想主要集中在kernel mode里的模块和知识。
    1. 对user mode开放的服务都有哪些,实现细节如何?
    2. DDK里的函数都有哪些,实现细节如何?
    3. Executive层的模块都有哪些,实现细节如何?比如,memory manager, IO manager, cache manager等等。
    4. Windows里的driver都有哪些,实现细节如何?比如我认为最重要核心的ntfs。
    学习资料:
    《Windows Internals》
    《Programming the Microsoft Windows driver model》

    最后,HAL不想学,也不知道有没有用,Hardware不想学,WDF暂时不想学。现在是新手,能想到的也就这么多了。

    May 20, 2009

    Debugging Tools for Windows 学习使用心得

    其实我的主要工作一直是UI test, UI automation, manual test 等等。曾经跟领导提过想做些深入点的测试,领导则反问 “你Kernel debugging 怎样?”。这是一个非常有趣的问题,你因为不具备良好的kernel debugging的能力,所以不给你做深入的测试工作,而因为你没有做深入的测试使你也不可能具备kernel debugging的能力。很多时候事情就是如此矛盾的,而我也曾经说过,一切最终还得靠自己。
    前几天发现一个奇怪的bug,分给这里的一个seniro dev他也没太多的办法。我在一个高手的指导下自己debug and figure out了root cause。在和这个高手的交流中,也基本明确了一下步的学习目标。以前的我主要是靠自己摸索,我想多跟高手接触,交流还是非常非常有帮助的,当然机会也不是很多。那么我的下一步的目标就是“code review, debugging, windows internal and WDM”。Debugging可以说贯穿了其他的三个,因此我今天先谈谈我对debugging tools的感受。
    我们基本都是用微软提供的几个debuggers,ntsd, cdb, kd, windbg。ntsd和cbd是user mode debugger, kd是kernel mode debugger, 他们都是command line的,而windbg是UI的debugger, 可以调试both user and kernel mode。大多数情况,我都是用windbg,但是在一些特殊的情况下,我还是需要其他的tools。今天我主要是谈windbg,我想学习windbg大概分这么几个阶段:
    1. windbg的命令,共三种命令,普通命令,加'.'的命令和加'!'的命令。Debugging tools自带的那个教程学习一下就应该差不多了,以后就靠经验积累了。
    2. 如何开始debug, 这要根据你所debug的目标和要debug的问题来决定了。你应该决定是使用user debugger 还是 kernel debugger, 是 local debugging 还是 remote debugging, 是用windbg还是ntsd, 等等。通常都有几种方式去debug,你要能够准确选择一个最合适的。
    3. 怎样进行debug。对于一个需要debug的问题,你需要有你的策略。比如,在哪里设置断点,如何设置断点,等等技巧。
    4. 利用一些tools。有些情况下只有debugger还是很难debug,你需要使用其他的tools去辅助。比如,有的时候在问题显露的时候已经太晚了,你很难追踪问题发生时的情况。这里,你可以用一些tool使得在事情发生的时候跳到debugger上去。
    5. Code review非常重要。当你发现一个bug的时候,如果你代码熟悉,你可能直接就能想到问题出在哪里,或者你稍微读读代码就能发现问题所在,根本就不需要debugger。而在你debugging的时候,常常你也需要review相关的代码来理解这个问题。
    6. 汇编语言。当你在调试optimized code的时候,你常常不能通过dv, dt等命令正确地看参数,变量等等,或者变量根本就没得显示。这就需要你具备汇编语言的阅读能力,了解calling convention, 不同cpu的汇编,以及在disassembly模式去调试。
    7. Kernel debugging。如果你具备了以上的技能以后,user mode debugging应该不成什么问题了。但是对于调试kenrel mode还是需要一些附加的知识与技能。首先,kernel debugger的命令很多跟user mode的就不一样了,你需要学习。其次,你需要了解Windows internal的知识和数据结构,以及Windows driver model。这也是为什么我把Windows internal 和 WDM作为两个学习要点。
    最后引用高手的两句话,“debug一两年,你就没什么问题debug不了了”,“只要能repro,你总能找到办法去debug”。

    May 16, 2009

    我要反省自己

    一直觉得我的测试能力也算是很不错了,应该多在开发上下功夫,没想到是大错而特错。测试领域还是有很多东西可以做的其实。前天下午听了一个presentation,介绍一个tool。其实这个tool早知道,早就在用,只是有一个选项从来没用过,那人就介绍这个选项。当时就感觉不太对劲,回到office赶紧试了试。没想到的是在10分钟之内就发现了3个严重的security bug。这三个bug都可以造成远程的DOS攻击,使Server crash掉。产品发布在即领导也决定要马上fix。我告诉同事这个选项以后,结果几乎每一个人的模块都发现了或大或小,这样那样的问题。而我由于还没有继续进行我的测试,还不敢说最后到底能发现多少这么严重的bug。

    所以,测试其实真是有很多东西可以去开拓的。简单一个tool的某个option都可能让你的测试效果大不相同。

    May 12, 2009

    高级测试人才应该掌握的六类知识

    经常遇到测试人员不知道学什么,或者学一个东西不知道有没有用。其实我也经常会遇到类似的问题,因此我自己也想把我学到的知识归归类。我想只要是这几类的知识,你学习都没什么错,总是会有用的。

    1. 产品知识:对于你所测试的产品,你一定要非常熟悉。小到你所测试的模块,大到整个产品的架构,内部实现,代码,等等。
    2. 测试知识:黑盒测试,白盒测试,手工测试,自动化测试,性能测试,安全测试等等。
    3. 开发知识:编程,数据结构,算法,调试等等。
    4. 专业知识:以上2,3是基本的知识,你还应该精通一些你从事的更专的技术知识。比如,如果你的产品是基于.net的,你应该精通.net, 或者类似的J2ee等。(例如这方面我应该掌握的Win32系统编程,Windows内核,WDM等等)
    5. 领域知识:你应该精通你所工作的领域的知识,比如手机领域,数据库领域等等。
    6. 行业知识:你要对计算机行业的整体状态,新技术,动态,发展趋势有一个明确认识。(比如我除了自己从事的领域还关注Web2.0,云计算等等)

    要记住,你首先是一个计算机人才,其次是一个软件人才,再次是一个测试人才,最后你才是一个SQAA, SQAE, STE, SDET等等。要想做一个高级测试人才,这一条线的知识都需要掌握。

    May 10, 2009

    微软的混混们

    大公司总是会有这样那样的问题。这其中一个问题就是时间长了积攒了一些混日子的人,由于通常大公司都很稳定,不裁员,所以很多大公司被人们称为了养老院,比如微软。本人见过以下几类混混。

    1. A在微软已经工作了10年,典型的特点是神龙见首不见尾,长期Office的门紧闭,使人不知人是否在内。经常遇到他老板在门口敲门等待10分钟左右,最后确定人确实不在的场面。
    2. B在微软已经工作了9年,典型的特点是任何工作到了他那里就石沉大海。当你问他进展情况的时候,他的回答总是“I’m working on it”。本来几天就能搞定的事情,你总是会发现在他那里几个月以后还是active的状态。
    3. C在微软已经工作了5年,典型的特点是不回email,不参加discussion。一直奇怪分给他的任务他到底做了什么,做得如何。由于对他没有信心,老板只能叮嘱其他人尽量也要去cover他那一块。结果一年之后,他跟大家一讨论,发现他做的东西非常少,别人做的非常多,他还就顺势把这块任务推给了别人。
    4. D在微软是个新兵,工作刚满两年。可是不知为何从刚参加工作开始就混。第一年正赶上和以上某君交接工作,正好应了中国一句老话“一个和尚有水喝,两个和尚没水喝”的道理。任何事情到了他们那里总没人去care,两人互相推给对方。光工作交接就用了一年的时候。第二年终于算是全部负责了,可从来都是maintain 现有的工作,从没想过如何优化,扩展。Test failures从来不会主动去triage,一定要老板push几次才行。Test spec上明明有的test case就是发现不了bug。
    5. E在微软是个contractor,更是一个老油条。contract的工作一般一年。一年之后工作交接,你发现他几乎什么都没有做。Test spec, test code, automation job 等等几乎全部都是copy别人的。自己加上的test case自己都不明白为什么要有这个case和怎么去test。典型的回答是“This was written by XXX, I don’t know”, “I never run this test”, “This has been covered by XXX” (but they haven’t, if you ask XXX"), “Let me check and get back to you”, “All tests on this spec are manual”。从他口中能得到的信息量几乎为零,因此别人只能推到重来。

    以上几人已经有人由于长期坚持不得不离开公司了,剩下的在team里的比例还是达到了1/3, 也就是33%。这也是我为什么说微软裁人太少的原因,可惜的是微软裁人大多并不是按照Performance进行的,混得人还是在混,很多Performance好的却被裁。唉,这个世界总是不公平的。

    May 5, 2009

    微软又一波大裁员

    如果大家看过我以前的文章就会知道我对这次裁员的最终结果并不乐观。http://peking2toronto.spaces.live.com/blog/cns!A975CAF18FBB985B!1141.entry

    Twitter上我也发过相应的消息。

    image

    今天相信大家能够比上次睡个好觉,因为这次保密工作很到位,很少有渠道偷漏这次消息。而所偷漏的点点消息也信息量也非常少。但是,谣言总是会被事实证明。今天我们看到几点:

    1. 微软进行了加速裁员,把18个月的计划提前到了6个月。
    2. Steve松口,可能会进一步增加裁员的名额。
    3. 这次之前就有消息说Windows开发组已经被动,Let’s see。

    上个Quater, 微软的利润下滑32%,其中很重要的原因就是Windows销售不力和Netbook的兴起。Windows7是很不错,但是我个人认为计算机业现在已经过了OS驱动的时代了。

    image

    Good luck Microsoft! Good luck Everyone…

    April 20, 2009

    回忆我的小学(4)- 毕业照

    毕业照没有带出国,同学刚给我发过来。毕业照的时候,四大天王中的勇,志杰,爱平都已经退学了。现在有两个女孩的名字我已经忘记了,我也没有印象我小学六年是否曾经跟他俩说过一句话。

    !cid_38E85292@7D0F263D_1726E849

    April 14, 2009

    回忆我的小学(3)- 志杰

    很高兴得知小学同学在毕业20多年以后进行了第一次聚会,并且了解了一些同学的情况。因此,也有点心情把小学回忆进行下去。这次不得不提的是四大天王的志杰。

    志杰身世显赫,他姥爷是著名的摔跤高手“花蝴蝶”,而他的爷爷则是据说比他姥爷还高手的,人称“闫六”。(两个高手的基本资料附在后边)有了这些遗传因素,志杰自然在身体素质上面也不凡。志杰个子很高,因此我们称他“大杰子”,而他又却是典型的有勇无谋的类型,因此我们又称他“傻大杰子”。我一直对大杰子印象很好,因为我觉得他讲义气,不欺负人,也敢于反抗别人的欺负,而他也是一个大帅哥。记得我一直不知道男孩什么叫张的好看,什么叫不好看,我从来没有care过。直到勇问我一件事的时候,他说他长得很帅,我才开始注意男孩的帅气。而我发现班上最帅的男孩就是勇和志杰了。在勇退学以后,我问班上的女孩谁最帅,是不是志杰?他们回答是。

    现在回想起来才明白问什么勇和志杰总是穿最流行的衣服,留最新流行的头型,因为他们自己长得帅,所以爱打扮,爱美。记得最流行的东西总是勇传进班,而志杰会马上跟随。头型他们留过光头和前寸后背,衣服流行过军装,萝卜裤等等。

    二年级他们一起降到我们班的时候,勇是见谁欺负谁,大杰子也不例外,总是被勇欺负,虽然勇的个子一般,而大杰子是班上第二高。我一直在心中认为勇比大杰子打架厉害很多,直到有一天志杰不知道怎么回事,也许是被欺负的够了,站起来跟勇打了一架。我没有想到大杰子撑了那么久,一直不处于劣势,而且最后两人打成了平手。我已经记不清楚这场架到底持续了多久,总之最后两人都是满脸的鲜血。在水管洗完脸以后,勇对志杰说,真想拿地上的砖头把大杰子开了。不过,从此以后他们就没有再冲突过,勇虽然还会欺负点他,但是绝对没有什么过分的了。

    四年级的时候,我们院子里搬来一对兄弟,老大比我们大两三岁,老二比我小一岁。本来我在院子里是老大,但是这个老二就敢跟我对着干,因为有大哥护着。而这个老大也不是个善主,也是个爱打架的人。有一天,力强和志杰来我这里玩,整好碰上老大从家门口出来。我没有记得我跟大杰子提过他,也许是两个人都互相看不上眼,大杰子走上前去,二话没说,两人就开始打了。由于对方比我们打两三岁,我一直不明白为什么力强不上去帮忙,而实际上力强虽说是班上老大,可是除了欺负同学以外,我基本没见他在外边牛过。(当然小学最惨烈的一仗他也是参加了,这是后话)最后大杰子和那人又是打成了平手,两人又是鲜血淋漓。这两架还是让我对大杰子很佩服的,能这么打的也就他一个人了。

    小学六年级勇先退学了,没多久志杰也退学了,而之后我们见面就很少了。小学的牛人总是一拨一拨的,比我们晚两个年级又出了一拨人,而这拨人提到大杰子的时候说“杰哥,我们都敬他三分”。而从再晚一届的人那里得知大杰子进去了。后来我大概上高一的时候发现他出来了在卖鸡肉,我上前跟他谈话他竟然认不出我了。在我告诉他之后,他旁边的人说“你们是同学呀?大杰子,你看你同学还小孩呢,你都成老头了”。大杰子说让我去找他玩,而我一直心里还是想跟他保持一点联系的,因此去他家找过他一次,不过他没在家。再后来听说他把他妈气病了,再后来听说又进去了。以后就音讯全无直到最近听说他完了,沾了Drugs,有人见到他的时候已不成样子了。

    唉,大杰子,我一直认为你是一个好人,one of my best friends in my childhood.

                      一代跤王 常东升
                      常东升,保定将军庙人,八岁随父亲常洛兰练摔交基本功,十岁拜平敬一的大弟子张凤言为师,成为张凤言的关门弟子之一。由于他体格强健,天资聪颖,又能刻苦练功,练成“得合”、“度花摆”等绝招,能以“治衣即跌”之速让对手茫然倒地,他小时侯脸被烫过一次,从而在鼻梁上眉心部位留下一块疤痕,刚好左右对称,形似蝴蝶,再加上他摔交前习惯先左右来几个刺空儿姿势,手舞身摆好象蝴蝶一样,所以人们称他“花蝴蝶”。在他打败保定及附近所有摔交名手后,成为当时保定第一摔交高手,有曾随刘任山学习“行精拳”,从杨茂堂处学的“霸王拳”,并研习剑棍。在天津摔倒“盖河北”邹井昆,到南京又摔倒中央国术馆摔交大赛中夺魁的一等教官杨发武,被南京中央国术馆馆长张之江授予少将官衔,同时又得到馆内武术家、摔交家马英图、马裕甫名家的指点,技艺精进。七七事变前,摔倒“大日本皇军”第一勇将、九段高手森田喜直,挫败日寇的嚣张气焰。

                      常东升1937年赴广西桂林平东任国民党军官培训团武术教官,1940年起任国民党警官学校教官。1948年在上海举行的第七届全运会摔交比赛中获中量级冠军。不久随警校到台湾任教于中央警馆学校,并在文化大学、政法大学、建中大学等教授摔交。1976年退休后曾到摩洛哥、新加坡、西德、瑞典、墨西哥、美国等国讲学和表演等国表演,被誉为中国跤王,后客居美国,在芝加哥和纽约两地教授中国跤术。著有《摔角术》。

                      闫善意
                      闫善意是于常东升同时代的又一名保定回族摔交国手,同是张凤言的关门弟子。闫善意最露脸的要数他摔败新乡摔交名将“铁胳膊”王大劲,王大劲能独自一人轻而易举的端起磨盘,而且稳稳当当的盖在井上,不仅力大而且摔交技法娴熟,是远近闻名的高手然而在与闫善意比赛时却连败三跤。
                      当闫善意得知常东升在南京很风光后便从保定赶往南京,恰巧赶上全国摔交比赛,便匆匆上阵,不料竟夺得冠军,同时还获得了击剑比赛的亚军。

    (本来不确定闫善意就是闫六,但是看了照片,志杰跟他真的是很像呀)

    March 28, 2009

    Make Silverlight 3, WCF and Azure work together

    Recently, I'm working on a project which is composed of a Silverlight 3 Application and a WCF service, hosted by Windows Azure. I encountered a bunch of issues and it's very hard to find the solution. The process is painful, but eventually I solved all of them. Maybe there will be some new issues coming up, but it's good so far. I want to list the major issues and related solutions in case others may look for them as well.

    1. At the very beginning, I saw this.

    Warning 1 The element cannot contain white space. Content model is empty. D:\Azure\SilverlightApplication1\SilverlightApplication1\ServiceReferences.ClientConfig 7 99 SilverlightApplication1

    Warning 2 The element 'httpTransport' cannot contain child element 'extendedProtectionPolicy' because the parent element's content model is empty. D:\Azure\SilverlightApplication1\SilverlightApplication1\ServiceReferences.ClientConfig 8 26 SilverlightApplication1

    http://localhost:63165/Service1.svc" binding="customBinding"

    bindingConfiguration="CustomBinding_Service1" contract="ServiceReference1.Service1"

    name="CustomBinding_Service1" />

    I got the solution from Jimmy Lewis.

    Gary, I think it's due to the section:

    Can you try removing the element and making the element self-closing? I haven't figured out what causes this to be generated incorrectly yet.


    2. Generating proxies
    Out of the box, using Add Service Reference or svcutil to generate a proxy to a service hosted either in the development fabric or the cloud fabric will fail. The following workaround can be used:
    1. Host the service either in the Visual Studio ASP.NET Development Server or your local IIS instance
    2. Use that instance to genereate a proxy
    3. Modify the endpoint address of the generated proxy to point to the correct location (either in the development fabric or the cloud fabric)

    3. Address filter mismatch
    At runtime, WCF services may return the following error: The message with To 'http://127.0.0.1:81/Service.svc' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree. The error can be corrected by applying the following attribute to the service class.

    [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

    4. Specifying a relative service address
    Normally when adding a service reference, Silverlight will generate a .clientConfig file containing the address of the service. This config file gets pacakged as part of the Azure service and cannot be edited as the service moves from the development fabric, to staging in the cloud fabric, to production in the cloud fabric. This poses a problem since the hardcoded service address will change between these three locations. To use a relative address, you can use the following workaround:
    1. Delete the .clientConfig file
    2. Recreate the appropriate binding in code, for example: Binding customBinding = new CustomBinding(new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement());
    3. Use this method to specify a relative service address: EndpointAddress address = new EndpointAddress(new Uri(App.Current.Host.Source + "/../../Service.svc/binary"));
    4. Pass the binding and address to the proxy constructor: ServiceClient proxy = new ServiceClient(customBinding, address);

    Enjoy.

    March 25, 2009

    Facebook邯郸学步失败

    今天打开Facebook却吃惊地发现页面变了,找不到Live Stream了,这也说明了Facebook模仿Twitter失败了。我早就说过Facebook的新页面只是完成了Twitter的一小部分功能,有其形而没有其神,引起无数用户的抱怨。我还说过,如果Mark真的认为颠覆性公司听取客户意见是愚蠢的话,那么Facebook也快完蛋了。

    从这次事件来看,Facebook的创新能力出现了严重的真空。F8平台开放以后引起世界的瞩目,后来页面改版差强人意,Online聊天工具也没什么人使用,到现在纯粹模仿Twitter,我实在是担心Facebook的前途问题了。我一直关心的两个问题,一个是Online Storage,另外一个是站内搜索,Facebook怎么就不做呢?要是做了这两块,Facebook还得牛一大截。如果一年之内不实现其中之一,我可能也考虑退出了。没有新意的公司实在是不能让我长期关注。

    March 16, 2009

    召集志愿测试员

    听到很多测试人员抱怨没有机会去进行自动化测试,白盒测试这些相对手工,黑盒测试技术要求比较高的工作。我一直提倡应该自己去创造机会,但是我发现很少有人能够做到。因此,我准备启动一个开源的项目TwitterBEIS,给大家创造一些这样的机会,希望有能力和想法的测试人员参加。

    Qualifications:

    • Good English writing skills: we will be developing a software using some kinds of new techniques. We need to communicate with foreign communities. So English is very important. Also all documents, code comments and communication will be in English.
    • Coding skills: you have to be able to write code since you will work on automation, code review, debugging etc.
    • Quick learner: some techniques are new, you must ramp up quickly.
    • Willing to learn advanced testing technologies.

    Advantages:

    • Development will deploy the second model I mentioned in my blog. That means you will do lots of code review and debugging.
    • Other than that, you will be working on unit test, white box, automation so on and so forth. They all help to build your professional resume.
    • Possibly change to a dev role once your coding skills are good enough.
    • Use modern Web2.0 technology to work together as a startup.
    • Directed by me in real project rather than articles.

    Disadvantages:

    • No payment: everything is volunteered and completely depends on fun, interests and learning.
    • It will take you bunch of spare time.

    For all details, visit http://code.google.com/p/twitterbeis/.

    March 14, 2009

    微软与Google的战争已败

    昨天听到不少微软的内部人士说喜欢Live search,不喜欢Google, 我也赞同。这两年Live Search还是有了明显的进步,和Google的差距也越来越小,虽说市场份额没啥变化,可是搜索质量跟Google相差并不大,而界面感觉更胜一筹。一般来说,英文搜索Live Search基本还是够用了。很多次我发现Live Search搜不到,去了Google也照样搜不到。我一直对微软还是抱很大期望的,有的时候也批评一下Google,而有些人就问我是否真正使用过Google。前一段时间认真研究了一下Google的各项服务,结果发现微软基本不可能打败Google了。

    首先,微软对Google的战争应该是全方位的,search并不是全部,只能是重点。由于Google是靠Search起家,而直到现在的盈利也基本是靠Search,给人一种印象就是微软只要打败Search就打败Google了。我一直是这样认为,相信到现在微软的领导层也是这样认为,因此在Search上投入大量的资金与期望。可是我在使用了Google的各项服务之后,发现微软是全方位的落后,只是把Search作为突破口击败Google在现实上是很难行的通的。目前微软的IM虽然占有绝对的优势,但是由于IM是客户端,对于Search的份额几乎起不到任何的影响,并且IM本身也不赚钱,看看Skype都成了Ebay的鸡肋了,所以这个优势对微软和Google的战争没太大影响力。另一方面,Hotmail对比Gmail目前还具有一定的优势,可是Gmail发展迅速,Hotmail客户流失严重,很可能在短期就被超过。我就想不明白,微软Search肯花那么多钱,干嘛非得在Hotmail上放那么大一个烦人的广告呢?这能挣几个钱呢?本来用户跑的就厉害,现在开放了POP3,使得用户可以把Hotmail导入到Gmail中去,跑得会更厉害。反正我用了Gmail以后发觉确实比Hotmail好用多了。Skydrive虽说Google还没有推出Gdrive,因此是微软的一个特有产品,可是发展也太慢了,跟桌面的整合没有,跟其他服务的整合没有,并且还跟很多类似的产品共存,搞得用户晕头转向不知道该用哪个。难道非得Gdrive推出来以后微软才知道进步?其他的产品就完全是Google占有绝对优势了。Blog上blogger比Live Space要强多了,连微软自己的minimsft就在blogger上。Photo上,picasaweb比Live Photos也强多了,很多msn的用户都是通过它来共享照片,视频上Youtube绝对统治地位,微软的soapbox还有人记得吗?Google reader微软没有,iGoogle比live个性化主页也强很多吧?后者已经很久没有更新过了。Google的AdSense, Webmaster tools, Analytics 都非常好用,而微软则刚刚关闭了自己的Analytics。Google的blog search微软没有,Google Docs微软也只是有个浏览的功能,Google groups, Google calendar, 微软也是最近才开发好,已经太晚了。还不只这些,Google还有很多小服务微软没有,而且Google还在不断推出或购买各种创新的服务,比如最近announce的Google Voice,又引起来一片关注。想想看,大家一个个用着Gmail, Google Docs,Picasweb,Youtube,Blogger,Google reader等等,你微软Live search做的再好,我为什么要去用你呢?这也解释了我一直想不明白的问题,为什么Live Search越做越好可是份额却没有提高,即使白给用户钱。这就好比大家用着Windows上一些列的应用程序,Linux没法跟微软竞争一样,同样的道理,大家都在用着Google的服务,Live Search怎么跟Google竞争呢?

    其次,微软的Live战略处在了非常迷惘的状态。 最新的Messenger我就不想提来,总之一片反对之声,我也早习惯了逆来顺受了。Live的Wave3到底做了点什么东西呢?搞了半天无非就是模仿Facebook,可是连Facebook自己都要模仿Twitter。这下可好,Twitter牵着Facebook的鼻子走,而Facebook牵着微软的鼻子走。微软搞得都不是二手货了,而是三手货了。这次之后,我对微软的Live创新能力彻底地失望了,我相信微软的Live根本不可能满足我个人的需求。再说Live Search,经过了这两年的折腾也有点不知道该往哪里走了,搞来搞去就搞出个Kumo出来。我个人对这个改名非常的反感,虽然这也没有最后定。首先,本来就是换汤不换药,除了名字和界面改动之外,我没有觉得有什么太大不同。虽然加了一点新的东西,这些我现在也不想讨论,毕竟没有公开。其次,Kumo是什么?说是日文的蜘蛛和网的意思。我就不明白你搞个日文名干嘛?太让我莫名其妙。总之,我觉得Kumo没什么戏。

    再次,Live Search非常地保守。本来保守也不一定是坏事,但是要想击败Google,不具备大胆创新的精神怎么成呢?下面就是Live Search对最新的实时搜索技术的态度:

    类似于search.twitter.com“实时搜索”(Real Time Search)服务可能会开始流行起来,但是有一个产品不会部署该服务:微软即将发布的搜索引擎Kumo。微软搜索引擎部门主管Stefan Weitz称,Kumo团队正在考虑进行小部分调整,而类似于实时搜索功能不会出现在Kumo中,它还需要一个进化的过程。

    Stefan还称:“微软不想因为作太大的改变而吓跑用户,而搜索引擎的界面在12年里也没有太大改变。”那么Kumo还带来什么新的特性呢?微软计划使搜索结果更加人性化,简化搜索过程,专注于用户的“关键任务”比如旅行,地方化信息等。

    综上所述,我认为微软与Google的战争已败。(我个人很喜欢韩信,韩信在鸿门宴上就料定项羽没戏,我这次也大胆断言一下)

    聊聊#Twitter

    最近Twitter特别火,整天出新闻,先是拒绝Facebook的五亿美金的收购,又是推出所谓的实时搜索,到这个星期Facebook推出新的主页与其竞争。这样的宣传力度让我不得不要去亲自尝试一下了。其实我很早以前就已经注册了,只是我跟很多人一样,实在是发现不了它有什么用。这次用了快一个星期了,我发现它确实是牛。为什么牛呢?没别的就是一个实时性,这是目前任何其他网站/服务所不能提供的。也就是说你在Twitter上得到的是“现在正在发生什么?”。照我来看,目前Google的搜索技术根本实现不了这个功能。Google的crawler一定需要一些时间进行index,不可能实时查询,这也是为什么有人把Twitter称作Google killer的原因。而Facebook虽然加入了Live stream的功能,也只是实现了Twitter的一小部分功能而已,远远达不到Twitter的强大,所有也有人把Twitter称作Facebook killer。Anyway,我今天就想随便谈谈自己的使用感受。

    Twitter的几个特点:
    • 实时性:实时性体现在两点,第一是实时地知道自己的朋友或者自己感兴趣的Twitter帐号的动态。第二是可以实时查询自己感兴趣的话题。Facebook的Live steam顶多是实现了第一点,而我一直想不明白的就是Facebook为什么不开发或者跟Live Search合作进行站内的搜索的开发。目前Facebook的搜索功能做得实在是糟糕,更不要说什么实时搜索了。没有实时搜索的Facebook怎么可能打败Twitter呢?
    • 开放性:Twitter出奇的开放,因此围绕Twitter产生了大量的第三方的应用或服务。我一直对Facebook担心的一点就是Facebook的封闭性。虽然Facebook开放了F8平台,但是之上的应用必须要在Facebook上运行,而Facebook的实名和过多个人隐私的特点也使得Facebook不可能像Twitter那样地开放。
    • 方便性:Twitter跟很多设备或服务都结合地很好。比如你可以通过手机短信来发布tweets,这也是为什么很多事件都是Twitter最先报道的原因。而你在Twitter上的tweets可以自动地发布到Facebook,MySpace,Blogger,微软的Live Profile上。也就是说你在各种网络上的朋友可以同步得到你在Twitter上的更新。
    • 灵活和小巧:很多人喜欢Twitter的原因就是因为它小巧,简单,灵活。而Facebook则变得越来越复杂,死板。这也使得Twitter比Facebook显得更酷。
    • 单向关系:虽然Facebook的Pages也是单向关系,但是个人账户则是双向关系。这样的话你只能follow你的好友或者Pages的更新,而在Twitter上你可以follow任何人,只要你想。而你甚至也可以跟你不follow或者没有follow你的人交谈。比如你在Facebook上想跟比尔盖茨交流,一定要通过他的许可才行,而在Twitter上则没有任何限制。

    如果你现在对Twitter产生了兴趣想尝试一下的话,你一定会有几个问题问自己:

    1. 我为什么要用Twitter?我想对于follow别人的人来说,基本上就是想得到一些自己感兴趣的信息。而使用Twitter search的人也是想了解当前正在发生的事情,而其他途径都还来不及得到或者信息不全面的时候。而对于发布信息的人就比较复杂了,比如有些公司就是发布公司的最新情况,有些名人也发布自己的情况,并且和自己的fans交互。有些可以利用Twitter查询自己产品的用户反馈情况。比如最近的Facebook的主页更新,我发现大概90%都不喜欢,而Google最新发布的Voice服务则是一片叫好之声。对于个人用户来说用处也是很多,比如可以随便发发牢骚,发表一下自己的观点,看法,问问题,或者就是无聊地告诉大家自己正在做什么,等等。
    2. 我应该follow谁?首先,如果你有好友已经在上边的话,你应该follow他们。其次,你可以follow一些你感兴趣的账户。比如,我follow一个本地的电台可以得到本地最新的一些新闻;follow Google可以得到Google最新的更新;我还follow了Facebook创始人的帐号,感觉Facebook不爽的时候就跟他发发牢骚,等等。
    3. 谁会follow我?同样也首先是你的朋友,其次如果你follow某些账户,这些账户会自动follow你。如果想让不认识的人follow你还不是一件很容易的事情,除非你是名人。你应该提供有用的信息给大家,别人才可能follow你。反正我用了这几天基本上没有人主动follow我。因此,我觉得个人用户来说follow别人还是更主要的功能,当然search应该是更重要的功能。
    一些有用的使用技巧
    • # hashtag: 你可以在tweets里的关键词前加上#,这样有利于你的tweets被搜索。我发现我有些没有#的tweets是搜索不到的,而加了#之后全部可以搜索到。
    • @username: 可以发tweets给某个用户
    • d username:可以发私信给某个用户
    • translate: 有些人的tweets不是英文,可以应用translate把他们变成英文。虽然不知道翻译效果如何,总比不认识的语言要强多了。
    一些目前的问题
    • 中文支持太差,关键词不支持中文,#不支持中文,发布的中文tweets很难被搜索到。
    • 只能follow账户而不能follow topic。发现一个非官方命令track可以实现,可是只能用于IM和手机。现在Twitter也不支持IM了,而我也没跟手机绑定,所以对我来说基本没用。
    • 还有一些需要加强的功能,比如可以直接播放视频,像Facebook的Links的功能一样。对Tweets可以进行分类等等,就不多说了。

    总而言之,Twitter是专注于这个领域的,很难被别人打败。就像微软是软件霸主,Internet打不过Yahoo。而Yahoo是门户霸主,Search打不过Google。而Google在社交则打不过Facebook一样,Facebook也不太可能打败Twitter。因此,我觉得Twitter还是很有大发展的,不知道微软是否会考虑买下。

    March 13, 2009

    考虑把你自己变得unique

    经常有人跟我提起“我们公司的测试就是这个样子”,“中国的测试就是这个样子”等等。我昨天收到一个recruiter的来信,深有一些感触。我想问“为什么你不想把你自己变得unique呢?”为什么目前的测试环境如此你就随波逐流呢?

    记得上大学和刚刚工作不久自己心中总是有一句话“不一样的人要过不一样的生活”。是的,我从小不喜欢随大流,别人都喜欢的东西我往往不喜欢,而我自己喜欢的东西其他人也常常不喜欢。简单来说,我算比较独特一些吧。这也在很大程度上使我自己的工作态度和大家有所区别。

    我觉得一个人发展到一定程度是一定要有自己特点的,总是跟在被人后边是很难会有很大发展的。现在我的有些东西,我都觉得是只可意会而不可言传的。所以我希望大家能够开始思考这个问题。

    附录recruiter的部分来信,请大家注意particular, unique, hard to find这几个词。我建议每个人都应该朝这几个方向发展。

    I realize you work at XXX, so a contract opportunity wouldn't be too enticing for you! Rather, I'd like to tap into your network. I'm looking for a particular skill set and background like yours, which is unique and hard to find. :)

    March 11, 2009

    Work smartly or 偷懒

    在我发表了Code Review+Debugging的文章之后,看到了一个很典型的comment,我想简单回应一下。

    很赞同你的看法,但是目前绝大多数的test都是第一种模式(包括Microsoft的大部分team),因为tester要负责automation,test case。

    如果我没有理解错的话,意思是tester要负责automation, test cases, 因此没有时间去搞code review和debugging。不巧的是,我的工作也主要在test cases和automation上,甚至很多manual tests, 但是我还是有时间去搞code review和debugging。那是为什么?

    其实我也面对类似的问题。在我要往下一阶段发展的情况下,领导对我的要求是要proactively地工作,要看到别人看不到的,别人没想到的,要做一些创造性地工作,要做一些对整个team有帮助的工作。而具体做什么?怎么做?则完全要靠自己。我就问了类似的问题,我说工作太忙,没那么多时间去想这些问题。领导的回答是要work smartly。是的,我后来分析自己可能一直也算是work smartly, 只是自己形容自己的行为是“偷懒”。虽然我对于自己下一阶段的发展也还处于摸索阶段,但是我想我还是可以回答这个comment, 因为我已经通过work smartly or 偷懒经过了这个阶段。

    首先我想说一下公司的工作和个人的发展很多情况下是互相矛盾的。很多人总是想依赖公司去发展,我觉得这是个误区,真正地,起决定性作用的还是要靠自己。比如comments里的这个问题:tester要搞test cases, automation, 怎么去搞code review和debugging呢?那么我的答案就是偷懒,有原则地偷懒。

    对于测试来说,我们的目的是用户使用产品的过程中不会遇到问题,而实现这个目的的手段就是找bug,而具体怎么找bug确是非常灵活的,这就是测试工作最大的魅力之一。你从事测试的工作千万不要拘泥于什么测试理论,测试方法等等,一定要有自己的主张和特点。比如有些人的工作是黑盒测试,他就认定了自己不能用白盒测试方法。有些人是手工测试,就认定了不能采用自动化。非得要跳槽找一个白盒,或者自动化的工作才能够开始从事。这是不对的,对于你所负责的模块,只要能找到bug,你应该可以采取任何的测试方法,而即使是专门的白盒测试人员也不能拒绝使用黑盒测试方法,专门从事自动化测试的人员也不能排斥使用手工测试的方法。因为,每种方法自然有它的特点,优势和擅长的地方。只有最适合的测试方法,并不存在最好的测试方法。

    由于测试工作是如此地灵活,因此我就可以进行偷懒了,当然我是有bottom line的,那就是一定要保证自己负责的模块不出大问题,就算出大问题一定要有一个合理的理由。而我偷懒也不是真正的偷懒,我是要用省出的时间去进行自我提升以及从事更高技术含量的工作。比如,我在test cases和automation上省出来的时间可以进行code review和debugging, 以及pentest等等。这样的话就发生了很多有趣的现象。有的人追求100% automation, 而我只实现60-70%; 有的人test tool 要写的perfect, 连help都写进去,而我只写最核心的代码;有的人test code 写的很fancy,好像水平很高,而我则认为他是把简单东西搞复杂了,而我更喜欢把复杂的东西简单化。总而言之,在他们尽心尽力做好本职工作的时候,我却把一些精力放在了其他地方。这样长期下来,大家的差别可能就会显现出来。

    以上只是个人理解,也许这不是领导所指的work smartly,只是给大家点建议,以及回应这个comment。最后说一下,code review+debugging刚开始是需要花些额外的时间,因为毕竟有learning curve在里边,但是以后的话,这种模式以我自己的经验来看并不比传统的模式更花时间,甚至可能更省时间。这个我可以以后再谈。

    March 4, 2009

    越来越rely on Code review and Debugging (一)

    有的时候觉得有些不好意思,因为作为一个刚刚具有中级title的我来说,却给大家讲高级测试的内容。自己也想了想,其实自己目前的工作还是处于中级阶段,并没有什么太多高级的内容,包括Security testing也不算什么高级。

    我现在觉得测试的初级阶段测试specific的内容占了很大的比重,中级阶段则是dev的内容占了很大的比重,而高级阶段是应该超越test和dev的阶段,从而test和dev合一而更强调的是impact, influnce和leadership。在我的初级阶段,我跟很多人争论自动化测试的重要性等等,而在我的中级阶段我自然地就不去争论这个话题了,从而争论dev的重要性。到了目前的阶段,我也不会再跟其他人争论什么automation, coding这些内容了,因为他们太基本了,已经不是我所应该关注的内容了。对于初级测试人员的提问,我觉得最好去我的那本书中寻找答案,我觉得我已经把我的观点完全表达清楚了。而以后我的文章还是会集中在中级测试的内容,因为我离高级测试还是有不小的差距,希望过两年能弥补上。既然我说过中级测试阶段dev的内容占了很大的比重,因此我的文章某种程度来说对开发人员也有一定的意义。

    在我的安全测试文章系列,我本来想在第三篇文章介绍一下fuzzing test,这个在安全测试最常用的测试方法。可是在我还没有时间开始写这篇文章的时候我就对他失去了兴趣,因为我发现了更efficient的方法就是Code review+Debugging。举个例子,有一个安全漏洞我通过code review大概在两个小时的时候发现的,而我通过fuzzing是在60多个小时发现的。Fuzzing的要求是运行48小时,而这个bug是在48小时以外发现的,也就是说如果我只运行48小时是发现不了这个bug的。无独有偶,在一个presentation上,在大家都讨论dumb和smart fuzzing的时候,我们team唯一的senior测试发表的fuzzing with brain的言论,就是利用code review和debugging来进行安全测试的。

    下面我想先谈谈Code review和Debugging在测试中的重要性。

    Code Review: 我们知道无论你手工测试用例设计的多好,无论你的自动化测试多么优秀,你的code coverage都不可能达到100%。我们CC的要求是70%,有些binary是很难达到这个要求的,而有些binary则可能接近90%,根据我的个人经验。也就是说,无论你如何测试,你至少都会有10%以上的code不能被cover,不能被test到。而Code Review则是一个很好的补充,从而可以使得产品得到更全面的测试,尤其是安全测试方面。记得《Writing Secure Code》的作者去一个公司做咨询schedule了一个小时的code review的meeting。在这个meeting之前,他们的dev manager就跟他说,这一个小时是浪费时间,因为他们雇佣了最聪明的程序员,他们自己进行了几轮的code review,没有发现一个bug。而作者说既然已经schedule好了就先开15分钟的会,看看情况再决定是否继续开下去。结果是在这15分钟里,作者通过code review抓出了10几个security的bug,最后这个会议延长了几个小时,而这个公司的员工觉得学到了很多的东西。可见对于一个有经验的测试人员来说,通过code review测试是多么的efficient。我自己最近也发现,我code review总会很容易地发现一些bug,而这些bug是在手工测试和自动化测试很难或者不可能发现的。

    Debugging:我们设想一下目前最典型的test和dev的工作模式。

    1. Tester: find a bug
    2. Tester: try to repro
    3. Tester: find repro steps
    4. Tester: file a bug
    5. Dev: try to repro
    6. Dev: communicate with tester if non-repro
    7. Dev: debug,investigate and find root cause
    8. Dev: fix bug

    我们有一定经验的测试人员可能都深有体会,在step2和3中,有时候非常麻烦。有些bug很难repro,有些bug甚至就发生过一次,你根本没有办法完成3。从而即使file了bug,dev也没法进行step7的工作。而由于test和dev的工作环境,机器设置等等的不同,dev往往不能repro要跟test交涉,也就是step6往往要浪费大家很多的时间和精力,甚至搞得test和dev关系出现紧张和裂痕。那么我们如何建立一个更加efficient的工作模式呢?这就要靠tester的debugging能力了。目前我的工作模式如下:

    1. Tester: find a bug
    2. Tester: debug, investigate and find root cause
    3. Test: file a bug
    4. Dev: fix bug

    由于tester负责debug和investigate的工作,从而repro steps就不是那么重要了,因为dev面对的bug里就会列出root cause。甚至tester可以给出fix suggestions。而由于tester帮助dev进行了大量的琐碎工作,dev也会非常appreciate it的,从而加强了双方的合作与信任。通常dev的fix也会邀请tester来做code review的。

    有的人会说,我们公司的工作模式就是前一种,你提到的后一种根本不用,也不现实。而我的回答是,你们整个公司不用不带表你不可以用,也没有人可以阻止你使用,自己的技术发展,自己的职业规划最终还是要靠自己。

    February 19, 2009

    我的测试发展路程

    大概两年前在51testing上发表了文章《个人测试发展轨迹》,没想到引起了同行很大的反应。原文由于某些原因已经看不到了,而且今天又是自己测试发展的又一个里程碑,因此再把我个人的测试发展路程简单叙述一下,给那些看不到前一篇文章的朋友。

    1. 大学本科是一所重点大学,但不是名校。毕业后进入北京一所公司做开发工作,起薪1100月薪。半年试用期后涨到1700。
    2. 一年后跳槽到国内一家著名的通信公司做开发,年薪都算上大概10万。
    3. 工作半年左右辞职考研。研究生毕业后偶然进入测试行业,年薪跟以前相当。
    4. 试用期后提升为team lead,一直工作了大概20个月的样子,工资都有涨动。自己设计实现了一套自动化测试平台。
    5. 被美国一家著名软件公司邀请面试,并且成功得到offer,开始全职自动化测试的工作。
    6. 工作两年之后开始向高级测试的方向发展。

    February 15, 2009

    安全测试系列二:缓冲区溢出(Buffer Overflow/Overrun)

    说到安全问题就不得不提BO。BO是安全中最大,最重要的问题,也是最最经典的安全漏洞,它可以使黑客执行任意代码,从而引发EOP的攻击。很多黑客并不太在乎其他的安全漏洞,他们就是想发现BO,从而拥有对机器的控制权。

    由于BO这个问题太经典了,耳朵里不知道听过多少遍,因此在面试现在这家公司的时候还专门对BO进行了一些学习与研究,好像明白是怎么回事了。可是到了面试的时候,被别人一问就露馅了。同样,不久前面试了一个即将毕业的硕士生,是个印度小女孩。由于她做过BO相关的项目,因此也对此特意提问,没想到她对BO的理解跟我当年面试的时候也没什么两样,只是知道一点皮毛而已。

    四年之前立志投身于安全或者游戏领域,最终是进入了安全领域。在这几年的时间里,我花了不少的时间去研究Web2.0, Mobile等等,并没有花多少时间在安全领域方面。虽然自己测试的是安全的产品,但是跟测试其他的非安全产品并没有太大的不同,只是多些安全的表面知识而已,没有什么深刻的理解。自己也几次问自己,“为什么自己花那么多时间在自己的领域之外,而不把这些时间用于研究自己的领域呢?”其实我心里还是很清楚答案的,那是因为安全对我的水平来说还是太难了,强行去研究它没有兴趣,只有痛苦。而Web2.0, Mobile这些东西就要容易很多,我研究起来也轻松很多,不用花什么时间学习就可以做一些成果出来。

    是的,安全领域确实比较难,即使这个BO的理解我也是经过了两年多才觉得算真正的理解了,当然这也完全归于我各种技术的熟悉与提高,综合水平达到了能够理解BO的程度了。总的来说,理解BO也是分很多个层次的,各个层次要求的技术水平也不一样。要想真正理解BO,需要C语言,C语言编译,内存管理,汇编,Debugging,甚至机器码的知识。BO的形式也是各式各样,没有深厚的计算机功底是很难进行分析和利用的。今天我主要回答三个问题:什么是BO,为什么BO是一个安全问题?黑客为什么可以利用BO执行任意代码进而夺取机器的控制权?其他问题我在最后也会列出,留待感兴趣的朋友自己去探索。

    1.什么是BO?

    BO的概念很容易理解,只需要你有C语言的基本知识就足够了。就是你申请了一段内存,而你填入的数据大于这块内存,这样的话你填入的数据就覆盖掉了这段内存之外的内存了。比如,

    void foo(char* input)

    {

    char buf[100];

    strcpy(buf, input);

    }

    如果input的长度大于100,就会产生buffer overflow了。

    2.为什么BO是一个安全问题?

    因为黑客可以利用BO执行恶意代码从而控制计算机。我们有这个概念是因为我们常常听到有病毒利用缓冲区溢出的漏洞进行浸入或攻击,这已经成为我们头脑的一个公理似的东西呢。但是如果我问到第三个问题,可能就很少有人能回答上来了?或者是一知半解。

    3. 黑客问什么可以执行任意代码?

    要理解这个问题就不仅仅需要C语言的知识了,还需要懂得C语言的编译,内存管理和汇编等相关知识。我简单的来解释一下:

    在C语言中,当我们调用一个函数的时候,在汇编或者机器码的level是如何实现的呢?假设我们调上边的函数foo的时候,程序的stack将会是下边图表的样子。首先,输入参数会放到栈中去,然后是这个函数执行完的下一个指令的地址,也就是return address, 然后是EBP(这个我现在不解释),再然后就是这个函数的本地变量的内存空间。比如这个函数申请了100个字节的空间。当BO发生的时候,数据就会覆盖掉buf之后的内存,关键的部分是return address可以被覆盖。那么一个黑客就可以把return address的值修改成这个buf的一个地址,比如起始地址buf[0]的地址,而这个buf里边填入黑客自己的代码。这样当这个函数退出的时候,程序会执行return address所指定的代码,也就是黑客的代码了。

     

    buf[0]

    buf[99]
    EBP
    return address
    input
     
    既然已经理解了上边的三个问题,如果有兴趣的话可以去思考以下的后续问题:
    1. 怎样得到放return address的内存地址?
    2. 怎样决定用什么地址来覆盖return address?
    3. 什么样的代码应该放入缓冲区,这段代码做什么用,这段代码怎么编写?
    4. 有什么措施可以防止缓冲区溢出?也就是说即使发生缓冲区溢出,黑客也不能或者难以利用?
    5. 如果对方系统使用这些措施,有什么相应的办法去绕过?

    安全测试系列一:用实例来解释安全威胁分类 (STRIDE)

    安全测试跟通常的测试工作还是有很大不同的。我认为安全测试是在技术上超越开发人员的一个主要途径。一个合格的开发人员去做测试的工作,无论是黑盒,还是白盒,手工,还是自动化,都不需要他花很多的时间就可以进入工作状态。而对于安全测试,即使一个很有经验的开发人员不经过专门的学习也很难进行有效的工作。另外,一个安全测试人员的水平一般来说应该比开发人员高才对,如果低的话,很难想象你能够容易的发现什么安全漏洞(假设这个开发人员没有低级失误),更不要说什么更深层次的漏洞了。一个安全测试人员应该具备普通开发人员想不到的知识与经验,这样才能通过这些知识与经验去发现这些开发人员犯下的安全错误。我个人在通常的测试工作上已经找不到什么进步的感觉了,更多的是感到重复的劳动,因此我接下来会在安全测试的领域进行一些实践与探索,写一些文章。我不知道有多少人对安全测试感兴趣,不过至少我可以作为一个自我知识的总结与归纳。

    黑客大多是凭借自己的兴趣来发现漏洞和实现攻击的,而对于安全测试人员来说是应该有一些系统的概念的,比如到底有什么样的安全威胁,怎么去分类,每类有什么特点,等等。今天我就用几年前我个人的一些经验来解释一些安全的分类。

    大概6,7年前,我在一个论坛混,由于一些矛盾使我受到了不公正的对待,比如删贴,封ID等等。我并不是一个喜欢做坏事的人,因此对于黑客的技术从来没有感兴趣过,但是心中还是很不服气。我想作为一个计算机技术人员怎么能让别人这么欺负呢?因此实现了自己一系列的攻击。没想到的是,6,7年之后,在自己学习安全测试的时候,才意识到自己的那次攻击行为竟然几乎涉及了所有的安全威胁。起初的想法很简单,就是编一个程序自动发帖子。OK,这个很容易就实现了,论坛上滚滚都是我发的帖子,当然我用了不同的ID去发,论坛的排行榜经过了多年的积累,在几分钟之后排名靠前的全是我注册的新ID了。用户当然也就无法去正常的访问和使用这个论坛了。然后和他们开发人员的对抗就开始了,他们先是要求发帖的时候根据图片输入一串数字,可惜他们图片的文件名和数字是对应的,我可以轻易的先发一个请求包得到回应包,search里边的图片文件名,然后再发发帖请求。他们的这个办法失效了,并且由于他们自己有bug,使得正常的用户即使输入了正确的数字也常常发帖失败。他们则取消了这个验证系统,转而控制每个IP每个小时只能发帖5次了。虽然很多用户并不满意这个规则,但是还是有效地限制了我的自动程序。我的对应有三种办法,一是使用多台机器,可是我手中没有这么多资源。二是程序控制每小时只发5个帖子,这样一晚上下来也会让论坛看上去很难看。三是动态的去修改自己的IP。Search了一下,但是并没有找到修改IP的有效资料,因此停止了这个方案。当然还有另外一个原因让我停止就是,我发现了他们的一个bug,我可以用任何人的ID去发言。这个bug用起来就很有趣了,我可以以管理员的名字在论坛上发虚假信息,用一个人的ID去攻击其他人引起公愤等等。这个bug他们的开发人员没办法了,他们不知道怎么回事也没有应对的措施了,他们还以为我攻破他们的数据库了呢。后来网站的老总也出面讲话了,他们也没人敢惹我了,这事就算了。另外,我只能使用其他人的ID发言,我也尝试过找出他们的漏洞去使用管理员的权限去做些事情,比如删贴子,封ID,IP等等,不过没有成功。

    话说回来,安全威胁分类的英文缩写是STRIDE, 代表了六种安全威胁,分别为Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Services, and Elevation of Privileges.

    1. Spoofing 就是伪装,比如我用别人的ID发言就是Identity Spoofing, 我想到用变化IP的办法就是IP Spoofing.

    2. Tampering 就是篡改,比如我用别人ID发言的手段就是篡改了合法包,而他们的server端没有相应的检查措施。

    3. Repudiation 就是拒绝承认,比如我进行了这些攻击,他们并不知道是我做的,也没有证据是我做的,我就可以不承认。

    4. Information Disclosure 就是信息的泄漏,比如他们的那串数字图片就没有任何保护,图片上的信息轻易的就被别人得到了。

    5. Denial of Services 就是拒绝服务,比如我的自动发帖使得正常用户无法使用就是这种攻击。

    6. Elevation of Privileges 就是权限的提升,比如我尝试用管理员的权限去做事情,就是属于这种。

    一般来说,EOP的威胁是最大的,这也是为什么Vista下要加入UAC的功能了,就是为了防御这种攻击。而Buffer Overflow则是可以被利用进行这种攻击的常见安全漏洞,这个问题可以以后再谈。DOS攻击可能是最容易发现的安全漏洞,比如一个AV就可以导致这种攻击。当然DOS攻击也分为两种,一种是导致服务突然崩溃,另一种则是使服务逐渐失去能力,比如在大客户量的时候。第二种就要比第一种更难测试一些了。这些威胁都不是独立存在的,很多时候是互相关联的,比如我是通过Tampering的手段,达到了Spoofing的目的。再比如,你如果成功进行了EOP的攻击,Spoofing, Tampering, Information Disclosure 这些问题也就自然出现了。对于我们安全测试来说,我们一般是对照一个软件模块,通过安全分析,列出各种可能的威胁,并且设计出各种安全的test case去进行测试.

    February 13, 2009

    回忆我的小学(3)- 班花美女

    小学的时候喜欢什么女孩道理很简单,就是喜欢最漂亮的,即使第二漂亮的自己也不会喜欢。而审美眼光也很简单,就是一个脸蛋,根本不会考虑什么气质呀,身材呀这些。我不知道是不是每个男孩都跟我一样,但是我知道我们班的几乎每个男生都喜欢着同一个女孩,那就是“如晨”。如晨是我们的班花,当时好像没有什么太多班花,校花的概念,如果要是评选校花的话,那肯定也是如晨了,因为在我的小学我没有见到过比她更漂亮的。

    如晨个子小小的,座第一排,脸蛋很清秀,人也很老实,话不多,相对来说算是学习好的学生。但是,我们基本上对她都是暗恋,没有人敢说出来,原因是因为勇的存在。勇虽然武力排第三,但是他是最能闹得,因为我学习好被他专用,也因为如晨长得好看,被他长期名义上的霸占。我不知道他们私下里有没有过恋爱,也不知道小学毕业以后他们是否曾经在过一起,但是在学校里就是一个名义上的。因此,没有其他人敢打如晨的主意,甚至跟如晨说句话,都可能遭到勇的报复。我现在已经记不得我跟如晨的任何对话了,我只记得六年级的时候她送给我和我当时最要好的朋友“永浩”每人一张贺年卡(只送给我俩),而永浩因此被勇辱骂过,而我因为跟勇的关系,他并没有对我怎样。当时我还是有点妒忌永浩,因为我没想到如晨对他还那么好。小学之后就再也没有见到过她,也没有听到过任何她的消息,不知道她毕业之后如何,现今又是什么情况呢?

    因为如晨的存在,我忽视了所有其他的女生。Somehow有的时候我也会喜欢其他的女孩,但是时间非常的短暂,应该是95%以上的时间心思都在如晨身上吧。但是如果把我放回到以前,以我小学之后的审美观的变化,我可能会毫不犹豫地选择另外一个女孩“英丽”。英丽是回族,其实脸蛋长得也挺好看,我们班的第二。除此之外她的个子高高的,是我们班最高的两个女孩之一。其实,我们对女孩也有一个武力排行的,英丽是排第二的,排第一的女孩叫“李新红”。这两个女孩个子差不多,但是李新红的力气更大,垒球总是第一名,而英丽爆发力很好,跑步快,短跑总是冠军。初中的时候,我不但喜欢漂亮的女孩,同时我还会对体育好,尤其是跑步快的女孩产生好感,即使他们不漂亮。而英丽是不但美丽,跑步也出众,个子又高高的,再加上她具有一些少数民族的气质,脸上常带笑容,在外观上,以我的审美观来说差不多是perfect了。并且,她其实对我也是有好感的,这个就不多说了。但是,英丽也具有回民的共同特点,学习一般,好斗。当然在我们班的四大天王的笼罩下,作为一个女生是不可能有什么表现的。但是学校毕业以后,我就听说她在外边混起来了,经常打架,跟男生也敢动手。当然,我相信她的实力,至少我是如何也打不过她的。小学毕业以后我只见过她一面,我们骑着自行车相遇,共同的路程非常短,我忘记了我们谈过什么了。我这人不善言谈,跟人有一段时间不见面就不知道说什么了,有时候我甚至会故意躲避以前的熟人,就是因为不知道该怎么打招呼,我人当时还是非常内向的。在我们分手的时候,她对我说“有事找我”。“有事找我”,这句话是那些社会上混得好的朋友常常对我说的,而这次是我唯一一次听到的从一个女生口里说出来。后来我虽然没有再见过她,但我们互相之间应该都会知道一点对方的信息,因为她嫁给了我妹妹的同学。(为什么我要写出李新红的全名呢?因为我高一的时候听说她得白血病去了。这也是我的一个surprise, 没想到身体那么强壮的一个女孩竟然这么早就没了。)

    芳是半路转学过来的,她的特点是耐力好,长跑非常强,过来之后出乎我的意料的是在长跑方面beat了英丽。当时比我们高一年级的一个女生长跑总是冠军,有一次校运会之前她来我住的院子跟我院的一个女孩,她的同学谈话的时候,她表示很怕芳。我当时也很吃惊,没想到这么牛的女孩会怕我班一个新来的。而最后的结果真的是芳拿了冠军。芳来了之后自然会受到勇的欺负,她的家就在学校隔壁,她有一个比我们大两三岁的哥哥,过来帮她也不敢动手,最后都急哭了。后来是芳的家长过来,勇才有所收敛。由于如晨和英丽,我没有觉得班上还有任何其他女孩漂亮。直到有一次学校旁边的一个小混混对我说芳很漂亮,我才有所注意。当时还怕听错反问了一句“她漂亮?”,那个人跟我confirm了。是的,现在回想起来,芳身材修长,个子高高,另外芳长得好像跟大家有点不太一样,有种特殊的气质,说她漂亮并不过分。初中的时候在一个小卖部碰到过她一次,没想到她个子长那么高,我要仰头看她。后来听说她打篮球,我还奇怪怎么可能,小学从来没见过她打。再后来听说她进了省篮球队。几年以后一个哥们的老婆好像也是省篮球队的,认识她,我们还提到过一次。工作以后有一次在公车上碰到一个女孩非常像她,没敢去认。

    华是小学前半段跟我玩得最多的女孩,几乎每天都来我家玩。我们冬天还一起去公园呀,等等。有一次她让我手握手,然后她兴奋地说“你是真聪明呀,我就见过你一个这么握手的”。原来是因为我右手压左手,而一般人都是左手压右手。最后问大人,好像是说脑和手是交叉的,左手代表右脑,而右手代表左脑,我右手压左手说明我左脑发达,而左脑掌管逻辑这些东西,所以就聪明。我这个人也是有虚荣心的,而我一直认为聪明是我最大的本钱,也很在意别人对我这方面的评价。因此,夸过我聪明的女孩我会记的特别牢。小学后半段我跟勇学坏了,我也会欺负其他同学,包括华。其实华一直对我都是非常好的,我记得我跟她打架的时候她很气愤地看着我,估计对我非常失望吧?从那次打架之后我们好像就没再说过话。华当时是个很一般的女生,后来听说初中的时候她出落成美女了,个子长高了,变化很大。但我却再没有见过她。是不是就算见到也认不出来了?

    回忆我的小学(2)- 四大天王

    印象中一年级跟我玩得好的两个人是“立新”和“更新”,他们在二年级的时候降级了。而后来五年跟我玩得好的人全部出自于从高年级降级到我班的学生。我写文章的时候才惊奇的发现,原来我小学的好朋友都是降级生。在我们那么烂的小学,又跟最烂的学生混在一起的我,能是什么好人呢?这点来看,我能考上大学又是一奇迹了。

    这批人过来之后班上发生了很大的变化。首先就是有个同学叫“勇”,他在这批人里好像是老大,谁都欺负,没有人敢吭声。这批人跟我成为好朋友的有“海涛”,“勇”,“二东”,“永浩”,“志杰”。在小学的其余五年,我都是在不同的阶段分别跟这几个人一起玩。勇对我们班影响相当深远,我们班的班风完全是受勇的影响建立起来的。当然他并不是最能打得一个,他的身材不高,他更多体现在了自己的霸气和校外的社会关系之上。如果论打斗能力,我们班的排行应该是“立强”,“爱平”,“勇”和“志杰”。当然这也不是绝对的,只是小学爱排班上的大王,二王,等等。这个排名是公认的,但他们直接交手的机会是很少很少的。当然班上后来出现了一个远高于这四大天王的皇上皇,这是另外一个话题了。

    立强并不是降级生,他的身体素质明显比其它人高出很多。长跑,垒球等等项目总是校运会上的冠军。身材比较高大,强壮,座最后一排,并且是体育班长。一年级的时候并没有意识到他的存在,但是在后五年中,他是班上的大王。好像听到过传言他的实际年龄比户口上要大两岁,也许这是他强大的原因之一。后来也知道他其实是练武术的,这也是他强大的另外一个原因吧。当然,最主要的是他是回民,先天身体素质确实很好。

    爱平是后来从外边转学进来的学生,在他之前勇是排第二的。这个人确实年级比我们大两岁,因此个子高大,很有威慑力。但是这人很nice,我从来没见过他打架或者欺负人,并且跟我关系一般,因此也没有太多可谈的。

    勇其实跟我玩的时间相当的长。这个人很social,外边有一定的社会关系,而且人很复杂,我一直不知道我们之间有没有真正的友谊。在班上他最好的朋友可能就是我了,因此即使立强也很少欺负我,因为他也不想直接跟勇起冲突。勇肯定是打不过他,但是勇外边的社会关系是他所不具备和畏惧的。勇跟我的关系很好,甚至勇在班上是霸占我的,其他人跟我关系好他会把那些人从我身边赶走。原因应该很简单,因为我学习好。他经济能力很好,跟我在一起为我花了不少钱,但是他在学习上对我的利用也很多,而我对他更多的是恐惧的感觉,没有什么朋友的友情那些感觉。

    当然跟他在一起自然会染上一些恶习,我也会欺负那些比我更弱小的,人缘就变得越来越差。以前众望所归的我,到小学的后期,有一次是学生投票三好学生,竟然没有我,可见我当时班上的人缘有多差了。这点来说,我一直对我欺负过的人有一种愧疚的心理。那次评选的结果激怒了勇,勇用极度威慑性的眼神扫了全体同学一遍,而班主任跟我关系也非常好,因此重新投票,当然结果就是高票当选了,因为没有人敢得罪勇。

    志杰是四人中唯一有外号的人,其他人是不允许别人给他们起外号的。他人对同学还是很nice的,我们可以叫他外号“大杰子”,甚至“傻大杰子”,他也不会介意。他从来不欺负同学,但是他讲义气,打起架来不要命,小学期间看到最血腥的几场架差不多都是发生在他身上。因此,内心深处我一直还是敬重他的。

    “立强”,“勇”,“志杰”,我有更多的回忆。这里想简单谈一下另外一个人。如果我们要排第五的话那一定是“永建”。他是我们同学身材最高的,想想看打架也不会差。但是,他也比较随和,不善斗,因此在打架这方面我们是忽视他的。但是我确实跟他打过一架,由于平时对他的忽视,以及狗仗人势在班上的地位,我内心是不能接受被他打败的。但是在打斗的过程中,我基本是挨打,没有任何还手之力,更没想到的是他招招致命,根本没对我客气,出手极其凶残。我被打到一边又扑上去三四次,最后发觉实在是差距太大了,不得不认输。那次可能是我被打得最惨的一次,伤养了好长时间,从此对他刮目相看,而他也确实参与了小学期间最大规模的一场战斗,这也是我为什么一定要提他的原因。

    回忆我的小学 (1)

    随着时光的流逝,年龄的增大,在得到更多东西的同时也失去了以往所拥有的。昨天confirm了我的小学早已经不存在了,小学的同学也没有跟任何一个人保持联系。在我的学生时代,毫无疑问小学生活是最丰富多彩的,因为除了学习我们什么都干。也是最刻骨铭心的,大概是因为六年的时间是最长的一个阶段。小学的生活也是灰暗的,因为总体来说还是被一定的恐怖和阴影笼罩。随着自己意识到自己慢慢地变老,对小学的回忆也越来越强烈,很多时候晚上醒来想着小学那些事情不能继续入眠。因此,我想把他们写下来,为了自己,为了以后不会把他们彻底忘记。如果真的有可能被我的同学看到的话,一定要跟我联系,虽然我知道有些人是永远不可能会看到的。

    我的小学名叫“回民小学”,其实本来在我入学的时候是叫“工农路小学”,一个很有当时中国特色的一个名字。现在想起来我大概从小上课就爱走神,二年级的时候,体育课上老师讲话,突然同学欢呼起来,我还以为有什么好事情呢,原来是学校改名了。本来附近有一个“回民小学”,但是由于我们学校回民的比例比他们更大,因此就把这个名字赋予我们了。

    学校的对面就是回民居住区,我们那里称做“清真寺街”。班上的回民现在回想起来应该是至少一半以上,或者更多 (我们那里称回民,不称回族)。回民有一些特点,比如他们身体强壮,体育很好,好斗,不爱学习。因此,我们班上的气氛是崇拜暴力,蔑视学习。因此我的小学大部分时间是不得意的,因为打架比较差。当然我学习好还是有一定优势的,那些强势的同学还是要依靠我写作业,考试打小抄,等等。因此,总的来说,我被欺负的不算太多。其实,回想起来我很惊叹他们的身体素质,我当时只能算是个中上等的水平,可是等我上了初中,高中,大学,我可都算是体育好的,我甚至高中在校运会可以拿冠军,可是我在小学唯一的一次获奖是六年级的一次第六,这还是因为不少同学没毕业就退学了的缘故。可见,汉民和回民的身体差距之大了。汉民在我们那里当然会受欺负,他们称汉民为“汉猪”。我当时还想呢,“汗珠”,我们出的汗都变成了珍珠,那也不错。小孩的思维现在想起来总是很奇怪。我有一个同学名字叫“白燕”,但是人长得比较黑。我当时冥思苦想也想不明白,“她长得那么黑,干嘛叫白燕呢?,再说了,就算是燕子本身也是黑色的呀,怎么可能是白燕呢?”。

    我的小学是一所很差的小学,以盛产少年犯而出名。但是我上了大学之后才彻底知道它到底有多差。我同学的弟弟毕业于周围的另外一所小学,一所我认为非常好的小学。当我听到他骂自己的小学差的时候,我很吃惊。我说“你的小学很好呀”,他回答“好什么,南市区倒数第二”,我说“不会吧,你们小学比我们小学好多了”,他问我是什么小学,然后他说“你们学校倒数第一”。那个时候我才知道,原来倒数第二的小学都比我们小学好那么多。我清楚地记得我小学毕业考试的成绩全班第一173分,可是到了初中我发现是个人都是180多分,这也解释了我们学校到底有多差了。即使现在我还经常会埋怨父母为什么当时会给我选一个这么差的学校?而我现在选房子最先考虑的就是学区问题,孩子的教育肯定是要放在第一位的。这个方面我父母做的太少了,而我也一直认为我能考上大学已经算是一个奇迹了。

    小学之前是幼儿班,我也是在这所学校。在下午放学的时候,经常会遇到对面清真寺街的一个看起来很凶个子比我们高的人欺负。我们是指的我和“涛”,当时我和涛是最好的朋友,后来一年级我们没能在一个班。欺负我们的人名字叫“景文”,没想到的是一年级入学的时候他竟然跟我在了一个班,当时的感觉就是害怕。结果比我预想的要好得多,他有先天性心脏病,并不擅长打架,甚至打不过我,因此小学六年他从来也没敢再欺负过我。

    我这人从小贪玩,小学第一堂课就从窗户跳出去了,平时喜欢跟同学摔跤。其实那个时候我不是个弱者,应该在摔跤方面我跟大多数同学比是占上风的。可是班主任非常不喜欢我这点。一年级第一学期结束的时候,老师先公布三好学生名单,没有我。接下来公布成绩,我是全班唯一的双百。同学就很不理解为什么三好学生没有我,问老师,老师解释“XXX太爱摔跤了”。由于这次没有被评为三好学生,再加上我的诚实,我失去了小学六年的区和市三好学生的所有机会。二年级评选区三好学生,老师的标准是必须要每次都是三好学生的人,同学们都纷纷地看着我,提着我的名字,当时的班主任换了一个,她也很喜欢我。但是,我诚实地告诉大家,我有一次没有被评上三好学生。因此,这个名额就给了我们的班长,他是唯一次次三好学生的人。以后就约定俗成了,每次都是他。

    除了这个,小学一年级的生活还是fair的。我记得有个同学叫“朱萍”,好像上了一个学期家就搬走了,可能搬到东北了吧?因为我记得有篇课文是关于大兴安岭的,好像说就是她家。还有一个同学叫“方印”的,当时我觉得他学习比我好,可能是他人老实,老师喜欢他吧,总觉得他学习最好。他二年级转学走了,后来听说他被保送到清华了。

    二年级的时候,我们班发生了重大变化。我们班一些学习差的学生降级了,而高年级的学习差的学生也降级到我们班了。这次变化影响深远,直接建立了班上的势力格局。

    February 9, 2009

    克莱沃曼2009关注焦点

    1. Cloud Computing
    2. Windows 7
    3. Mobile
    4. Netbook
    5. Virtuliazation

    Live Mesh 跟我对云计算的理解格格不入 (四):云应用和云共享

    由于云平台的概念模糊,使得云应用也并不清晰。目前来看有两种主流的跟云有关的应用。一种是以Google为代表的“软件即服务”,云应用完全通过浏览器来和Web来实现。另一种就是微软所倡导的“Software+Service", 相关云应用还需要桌面软件来补充。举个典型的例子就是Gmail完全通过Web来访问,没有客户端。而Live mail则即可以通过Web也可以通过Live mail的client来访问。当然谁对谁错很难分辨,两种模式都存在大量的用户群。但我个人认为,单纯的通过浏览器来解决问题目前来看还是太超前和走极端了。一个简单的例子就是IM,相信几乎所有的用户都prefer客户端软件,而不是在浏览器里跟朋友聊天。这也是为什么Gtalk火不起来的主要原因,Facebook的chat功能也没有太多的人使用。因此,目前的阶段,微软提出的Software+Service是现实的。

    可是由于桌面软件的开发和Web Service的开发大相径庭,使得想维护既有Service,又有Software的模式成本相对要高很多。因此,这就是Mesh平台诞生的一个很重要的原因。如果不从云计算的角度讲,Mesh还是一个不错的平台,尤其对于开发人员来讲。和Java的同样的代码可以在不同计算机平台运行的概念相类似,Mesh App实现的是同样的代码可以在不同的设备上运行,比如在Web上,在桌面上,在手机上等等。我先不谈这个概念具体实现上的困难,假设这个概念很好的实现了,那么我们就不需要编两种代码了,而Software和Service两种应用在Mesh上实现了统一。所以说在Mesh上也没有什么Software+Service了,基本上是Software=Service=Mesh App了。换句话说,有了Mesh App就什么都够了。Idea非常好,但是我觉得有两个问题。第一,Mesh把Web也当作一种设备,忽略了当今计算机世界已经是以Web为中心的现实,更忽视了Web在未来越来越重要的趋势。把Web当作设备,无非是想弱化Web的地位和提高Devices,微软拿手部分的地位。这个设计我不赞同。第二,由于Mesh App是在Mesh平台上开发和运行的,就使得桌面部分不如通常的桌面软件强大,Web部分不如通常的Web service强大。好处基本都是针对开发人员的,而用户的体验呢?除了Web和桌面统一的用户界面,功能性恐怕会大大折扣。用户会买这个帐吗?当然,IT的发展是迅速的,也常常是出人意料的。也许在Mesh的平台上会涌现出很多杀手级的应用出来,这样的话Mesh当然会流行起来。如果没有好的应用出来,我看Mesh的命运就悬。

    现在比较有意思的问题是,Mesh App是否要代替目前微软的Software+Service的模式(针对个人用户来说)。还是和Google”软件即服务“,以及Software+Service共存,而Mesh App又能抢占多少的市场?

    云共享本身就是一种云应用,单独拿出来作为一点是因为它在云计算中具有特殊重要的地位。概念很简单,目前实现的也算不错,就不多说了。而云应用另外一个非常重要的特点就是社交性,交互性等等,这是与传统软件区别很大的地方。Facebook就是靠个社交发家了,而Mesh自然没有忽视这点,集成了社交的功能,这点我还是比较赞同的,虽然技术实现也不难。

    而由于没有我所理解的云平台的出现,我也就没有必要讨论我理解的云应用了。

    Live Mesh 跟我对云计算的理解格格不入 (三):云平台

    在我写文章的初期忘记了非常重要的一个话题:云平台,现在补上。我们一台计算机,当你有了所有硬件以后就需要一个操作系统了。同理,当我们具备有云存储和云计算以后,我们也需要一个云的操作系统。操作系统在个人计算机中有多重要,云操作系统就会在云计算中有多重要。微软的Azure,据我的初步了解是完全具有云存储,云计算以及一个强大的Cloud OS。但是,这个平台是是针对企业而不是个人的,而更像是一个操作系统的底层部分。显然,Mesh是微软设计的针对个人用户的云计算的平台。由于我是从个人用户的观点去看问题,我想绝大多数的用户也是同样去看问题的,我这里只谈个人用户的云平台,就像Windows是个人用户的操作系统一样。

    说起云平台,我认为从个人用户的角度去看就是我以前所理解的WebOS。由于这段时间云术语的盛行,使得WebOS反而有点渐渐被人淡忘。我理解的WebOS是这样的:首先是以云存储和云计算为中心,其次提供一套强大的API使得可以开发第三方的云应用,当然还需要进行一系列用户看不到的繁琐的工作,比如cache management, sync management, storage management, computation management, etc. 我一直相信在云计算中,sync是一个非常重要的方面,我只是反对Mesh把sync放到了核心的位置。

    由于Mesh过分地强调本地存储和计算,显然不能满足我WebOS的定义。其实这个趋势和发展我看出来了,Google它们也看出来了,难道微软就看不出来吗?我猜测,Mesh之所以如此强调本地计算,主要的原因是不愿意放弃自己在本地计算的优势和垄断地位。如果微软完全按照我理解的云计算去进行,Windows势必被逐渐边缘化,从而变得越来越不重要。Mesh这种设计很大程度上是想保持Windows的地位而以。我这样猜测并不是没有根据的,最近Mesh team已经归了Windows了,从这个角度也可以验证我的猜想。而Google则没有这个包袱,所以它们要搞彻底的云计算。我希望这不要拖了微软的后腿。

    由于对Azure了解还不多,所以对它还是充满了希望,不知道什么时候能够给大家开放能够体验一下。但是总的来说它还是太底层,太企业化,微软当然应该提供一个个人的云平台出来。Mesh作为一款网络应用还是非常出色的,总体的设计水平也很高,但是用Mesh来承担这个角色,显然并不恰当与合适。近两年上网本的发展趋势已经证明了网络越来越重要,而本地计算越来越次要了。这两天又传出Intel准备推Android的上网本,虽然还是谣传,但并非不可能。微软在这一个趋势下明显吃了大亏,XP不得不延期停售,Windows利润下滑,可微软的策略又在哪里呢?就凭借Windows7和Mesh够吗?至少在上网本这个领域是明显不够的。而Google的Android如果投入到上网本上,再加上GDrive的推出,很难说不给微软一个致命的打击。当然我指的是个人用户市场,在企业用户我相信微软的优势还是绝对的。

    说来说去WebOS的市场各式各样的产品是真不少,而我以前接触过一些主要的问题是没有开放的平台,而我个人对这个领域观察也主要集中在了几个大公司上。Amazon的S3没有接触过,不知道如何。从我接触过的产品上看,目前没有一款完全符合我的要求。有人说Google提供的API就是WebOS,我看还是差很多,充其量也就是个service platform。也就是说,这个平台的核心在Google的各种service上,并不是在云存储和云计算上。Live services跟这个类似。Mesh的问题就是太强调本地存储和计算。我唯一看着有点这个意思的是Facebook平台。可是Facebook的问题在于缺少generic的云存储,并且F8上开发的应用局限性比较大,不能完全发挥出Web应用的潜力。Skydrive具有云存储,也具有一定的云计算和云应用,但是它没有平台。谁会推出第一个我理想的,甚至超越我理想的平台,让我们拭目以待吧。

    这里想再解释一下我那个下载电影的例子。如果用Mesh来实现同样的功能的话,是应该这个样子的。首先你要通过下载软件把电影下载到本地,其次这个电影要sync到Web上去,再次电影又要sync到你的手机上去,你才可以通过手机观看这部电影。明显繁琐很多。

    Live Mesh 跟我对云计算的理解格格不入 (二)

    1. 云存储
    2. 云计算。首先关于云存储想在多说两句。Mesh assume用户的各种设备都具有足够的存储空间,而贴心地考虑到了offline和low connection情况,我感觉有点本末倒置。如果一个用户没有足够好的网络,他很自然地就不会选择云存储,而既然选择了,我们应该认为他的网络状况还是OK的,就算是不OK的,当他sync的时候一样会有很大问题,从而不能应用Mesh。而用户选择云存储大概有这么几个原因:
      • 寻找额外的存储空间:比如netbook
      • 备份数据
      • 可以方便地访问数据及共享数据
      • 云计算

    这几方面的应用通常都是assume网络状况应该不是问题,而Mesh做了大部分的工作在于网络连接出现问题的情况,而把一个很重要的应用“寻找额外的存储空间”给抹杀了。我想这两年兴起的上网本本应是个机会,如果Mesh很好地满足了“额外空间”这个需求,那我相信大部分的netbook用户会很高兴地使用这免费的5G空间。(上网本本身的概念就assume internet always be connected) 所以我想问微软到底有没有考虑这个需求。

    当然,云存储是个基础,更重要的概念是云计算。什么是云计算?我的理解是,打个比喻。我们的计算机的输入设备是鼠标,键盘,而输出设备是显示器。计算机的存储在硬盘,计算在CPU都是存在于主机里。而一般用户通常对主机的感念很浅薄,也不需要去了解主机的构造与工作原理。云计算与此类似,你的计算机变成了输入输出设备,而你的主机则变成了云。你的数据存储在了云里,你的计算也发生在了云里。一个用户并不需要去真正了解云,不需要明白云的结构和工作原理。当然这是针对云计算来比喻的,你还是需要你的本地主机来进行本地计算,以及处理对云的输入输出。现在的趋势是应用越来越多地往云里转,如果有一天所有的应用都转到了云里,则本地只需要一个弱弱的主机即可满足要求,这也是Google它们所倡导的,当然是debatable的。因为这里只谈云计算,就不涉及本地计算与云计算前途的讨论了,不然又是一个大话题。

    那么云计算有什么好处?举个例子。现在你想下载一个电影,你用下载软件BT呀等等,这个下载的计算发生在本地,你开着电脑,根据你的网络情况,可能会下载几时分钟到几个小时,然后下载完毕你就可以欣赏了。在云计算中,你只需要告诉云你想下载什么电影,这个过程是由云来完成的。由于云中server的能力以及网络的良好情况,通常都会比你自己下载要快很多。你甚至可以关上电脑去睡觉,或者去逛街,因为计算是在云中产生的不需要你本地的计算与存储能力。下载完毕后,你可以随时通过internet来欣赏你的电影。比如,你在外边逛街,你的手机接到下载完毕的信息,你就可以立即通过手机来欣赏这部电影了。是不是轻松和方便很多?

    这是我理解的云计算。而Mesh是什么情况呢?Mesh team非常骄傲地介绍debug的feature,在浏览器里运行的应用可以在本地调试。有人提问这个是怎么实现的,他们的回答是,数据存储在云里,而代码实际是在本地运行的。我的天呀,代码在本地运行,这还能称作云计算吗?真是貌似而神离呀。从这一点看,我又对Mesh产生了很大的失望。另外,由于计算产生在云里,本地计算机只是相当于输入和输出,更加使得sync没有任何必要了。

    Live Mesh 跟我对云计算的理解格格不入 (一)

    Live就是有钱,昨天参加了他们的一个training, 具体说来除了讲课就是吃。早上九点吃一顿,中午十二点吃一顿,下午四点又吃一顿,吃不了的还可以打包走。很少有training安排的这么丰盛,吃是爽了,可是这training我怎么觉得这么不对劲呢?

    Live Mesh 从内部测试版推出到现在也已经有段时间了,最近还获得了有技术奥斯卡美誉的Crunchie Award 2008的最佳技术创新大奖。我一直认为这就是微软云计算的平台,没想到最底层的平台是Azure。微软把Azure称作Cloud OS, 而Live Mesh则建立在Azure之上,称作Live Framework, 要我看更像是一个Web OS。从微软的解释来说Azure是面向企业,而Live Mesh则是针对个人用户。Azure我没有什么太多研究,今天我就谈谈Mesh, 也算对得起Live的热情款待。

    云计算作为这两年的技术热点一直是我所关注的,而微软的Mesh我从最早的内部测试就已经体验过了,当时还没有开放开发平台,只是软件的体验,感觉没什么太大意思。而昨天的training则是面对面被传授了一下开发平台,感觉更没意思了,换句话说就是从失望到绝望。按说这种新技术焦点应该会引起很大的关注吧?可昨天400人的classroom里竟然不到1/3的人。要知道这training是免费的,而且还有丰厚的食品,吸引力都如此之低,是不是本身就说明了些什么?training的内容并不止Mesh,可我最关心的就是Mesh,因此其他内容也没好好听。我本以为通过对开发平台的学习能够让我对Mesh有一个比较新的认识,结果是Mesh的设计跟我对云计算的理解大相径庭。

    要说云计算,现在也并没有一个统一的理解和定义。Google表示“软件即服务”,而微软表示“Software+Service"。Google在搞”云计算“,而张亚勤表示微软搞得是”云端计算“。这些概念我都不反对,我本人理解的云计算包括以下几个方面:云存储,云计算,云应用,云共享和云安全。下面从这几个方面谈谈我对云计算的理解,以及为什么对Mesh失望?

    1. 云存储。我认为云存储是云计算的中心,要谈云计算首先要有数据在云内的存储。我一直批评Facebook没有generic的云存储,因此不能称作Web OS,至少是不完整的Web OS。而我理解的云存储很简单,就是你拥有云内的一块存储空间,就像你自己拥有一块硬盘,你在操作系统内访问它可以像访问本地硬盘一样的方便。具体来说就是你打开My Computer, 你就会看到你的云硬盘列在其中,而你可以双击打开它,可以做任何你在本地硬盘上的操作,用户对本地和云硬盘的体验应该是统一的。这个应用对配置有限的netbook是非常重要的,而就这么一个小小的要求,现在竟然没有公司能够满足。这两天有新闻说一直没有露面的GDrive年内要推出了,难道这会是第一个?而微软在这方面明显没有看到有什么想法。本来Skydirve已经做得还不错了(我用Skyedrive instead of Mesh 去存储数据),25G的存储空间也挺大,可跟OS的结合就是不做。当然这是题外话了,我今天要谈的是Mesh。Mesh的设计明显跟这个不同,Mesh的中心其实并不是云存储,而是data sync。Mesh的理念是数据可以在Web, Desktop 及各种各样的其他设备,包括手机,Mac等等设备间Sync,使得你在任何时间,任何设备,无论是online还是offline都可以访问你的数据。说实话我就很讨厌这个Sync, 因为我不想搞得那么麻烦,把数据存N各copy。现在用起来困难一大堆,比如Web的空间是5G,而Desktop的空间是上百G,什么要Sync,什么不Sync,自己还要配置。而我的手机则几乎没有什么存储空间,根本没法跟它们sync。为什么不能在我的Desktop和手机上都搞一个云硬盘直接跟自己的云内存储空间相连呢?这样也可以实现任何设备都可以随时访问数据呀。当然Mesh这样设计也不是没有自己的考虑,他们考虑如果网速慢的话,直接访问云速度会比较慢,有本地copy的话速度就会快很多。而我的理解是,即使没有本地copy,你照样可以做cache呀,常用的文件cache起来,提高performnce。而如果因为网速慢,或者因为文件大使得直接访问云的速度降低,无法忍受,通常你sync数据的时候也会有大问题,很难操作。想想看你要访问一个大文件和你要sync一个大文件体验能有多大的区别呢?Mesh也考虑到了Offline的情况,因为有本地copy所以即使offline也可以访问,操作和修改这些数据。可是我认为,如果真的offline了,则意味着用户不能email, IM,Surf,Search,Facebook等等,我想用户基本上会离开电脑搞别的去了,谁还会在这个时候还用Mesh?总而言之,Mesh的设计太多的考虑了没有internet, 或者网速低的情况,而忽略了用户体验和设备存储量的局限性,更忽略了网络的发展趋势。想想看,未来的世界是”Internet anywhere“,用户应该是随时都可以用任何一种设备拥有对internet的可靠访问。比如,在公司用公司的电脑,家里用家用电脑,出门用手机,或者netbook/laptop。一个简单的云存储就够了,谁也不会喜欢那个需要sync的Mesh,而用户如果真的需要本地copy的话,就直接把Web drive里的文件drag到本地硬盘不就行了,哪里需要Mesh那么麻烦?综上所述,Mesh的设计是有些落后的,不是进步的。我希望Gdrive能够达到我想要的,简简单单的云存储功能。

    February 8, 2009

    我的测试观点与经验

    本书收录了我一年多所写的关于软件测试的文章,内容包含初中级测试工程师工作所涉及到的内容。测试总的来说还是比较简单,我认为作为初中级tester来说,这些文章基本涵盖了应该掌握的知识点,和一定的职业指导与规划。今后我写文章可能不会再涉及这些方面,而会从更高的角度去讨论测试技术与发展,因此把这些文章编辑成册,以方便大家的阅读。

    下载doc:《我的测试观点与经验》

    下载pdf:《我的测试观点与经验》

    Online(Office Live): 《我的测试观点与经验》

    Online(Google Docs): 《我的测试观点与经验1》

    Online(Google Docs): 《我的测试观点与经验2》