﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-关河的测试生活</title><link>http://www.cnblogs.com/guanhe/</link><description>生活不是测试，但测试确实是一种生活</description><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2010 20:01:17 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2010 20:01:17 GMT</pubDate><ttl>60</ttl><item><title>在第四届软件质量年会上的演讲（视频与PPT）</title><link>http://www.cnblogs.com/guanhe/archive/2010/01/08/1642301.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Fri, 08 Jan 2010 07:59:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2010/01/08/1642301.html</guid><description><![CDATA[<p>阅读: 146 评论: 0 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2010-01-08 15:59 <a href="http://www.cnblogs.com/guanhe/archive/2010/01/08/1642301.html" target="_blank">原文链接</a></p><p>在第四届软件质量年会上的演讲，标题是&#8221;让测试敏捷起来&#8220;。
</p>
<p>&nbsp;</p>
<p>下面的链接是InfoQ上的视频和PPT：
</p>
<p><a href="http://www.infoq.com/cn/presentations/duannian-agile-test" target="_blank"><font class="Apple-style-span" color="#000000">让测试敏捷起来</font></a></p><img src="http://www.cnblogs.com/guanhe/aggbug/1642301.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/guanhe/archive/2010/01/08/1642301.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2010/01/08/1642301.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>敏捷测试感悟（之二）</title><link>http://www.cnblogs.com/guanhe/archive/2009/11/14/1603133.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Sat, 14 Nov 2009 13:19:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2009/11/14/1603133.html</guid><description><![CDATA[<p>阅读: 1001 评论: 0 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2009-11-14 21:19 <a href="http://www.cnblogs.com/guanhe/archive/2009/11/14/1603133.html" target="_blank">原文链接</a></p><p>在本系列的第一部分中，我们简要回顾了敏捷开发，以及敏捷测试与传统测试的不同。在第一部分中，我们特别提到，敏捷测试的要点之一就是，不依据于角色而是依据于任务来考虑整个开发过程中的测试。</p><p>但是，对一个开发组织来说，组织中一定存在开发工程师和测试工程师的角色划分，作为一个敏捷团队中的测试工程师，他的主要工作职责是什么呢？或者说，他可以在哪些工作上发挥自己的作用呢？</p><p>敏捷过程中与测试相关的任务很多，概括说来有如下一些：</p><p><ol><li>建立不同级别的测试验收标准（也就是test suite），包括单元测试、集成测试、系统测试等各个层面的验收标准；</li><li>推动整个组织的质量文化，保证整个组织的成员在质量责任与目标方面达成一致；</li><li>通过技术或是管理的手段，保证产品、代码具有良好的可测试性；</li><li>通过自动化测试手段缩短每个产品发布周期中测试所需的时间；</li><li>与客户沟通确认客户可接受的软件质量标准，并建立针对此标准的验收测试；</li><li>深入了解应用系统和业务需求，通过探索性测试方法设计有效的测试用例，发现产品中的缺陷；</li><li>建立对整个团队可见的质量度量体系，保证整个团队能够随时看到产品的质量度量值。</li></ol><div>这些工作都可以是敏捷团队中测试工程师角色的工作任务，但显然，在现实中，不太可能要求所有这些工作都由测试工程师来承担&#9472;同时，让测试工程师承担全部这些工作任务也并不合理，某些工作由开发工程师角色，或是由开发工程师和测试工程师共同承担更为合理。</div><p>接下来，我更详细的把列出的这7项工作中非常成&#8220;测试工程师必须完成的工作&#8221;，&#8220;测试工程师需要去推进的工作&#8221;，以及&#8220;能为项目带来巨大价值的工作&#8221;。</p><p><ol><li>测试工程师必须完成的工作：&nbsp;</li><ul><li>与客户沟通确认客户可接受的软件质量标准，并建立针对此标准的验收测试；</li></ul><ul><li>深入了解应用系统和业务需求，通过探索性测试方法设计有效的测试用例，发现产品中的缺陷；</li></ul><ul><li>建立系统和用户验收级别的测试验收标准；</li><li><meta charset="utf-8" /><strong style="color: #0000ff; ">通过自动化测试手段缩短每个产品发布周期中测试所需的时间</strong>；</li></ul><li>测试工程师需要去推进的工作：</li><ul><li>推动低层次测试（单元测试和接口级别的测试）的进行。低层次是测试对于需要快速发布的敏捷开发来说至关重要，但在大部分国内的软件组织中，开发测试都需要经过不断的推动才能被最终执行下去，测试工程师具有相关的测试技巧，并且能够用翔实的统计数据表明低层次测试的必要性，是最好的推动低层次测试的人选；</li><li><meta charset="utf-8" />推动整个组织的质量文化，保证整个组织的成员在质量责任与目标方面达成一致。这一点对于敏捷组织来说也是至关重要的；在许多传统的软件开发组织中，经常能看到开发和测试之间的扯皮，针对一个遗漏的缺陷，大家考虑第一件事不是如何去修复，如何去防止，而是首先&#8220;追究责任&#8221;&#9472;在敏捷过程中，需要一个非常不同的环境：也即，质量责任是由所有工程师共同承担的，对于出现的问题，重要的是解决和预防。</li></ul><li><meta charset="utf-8" />能为项目带来巨大价值的工作</li><ul><li><meta charset="utf-8" />建立对整个团队可见的质量度量体系，保证整个团队能够随时看到产品的质量度量值。保证产品质量度量的可见可以让整个团队清楚的看到我们现在正在工作的产品与我们期望交付的产品在质量上还有多大的差距，这样整个团队可以以质量度量作为指示，集中精力工作在这些差距上，从而可以尽快的发布&#8220;可工作&#8221;的产品。&#8220;验收测试的通过度&#8221;，&#8220;单元测试的通过率&#8221;，&#8220;功能完成情况&#8221;等等项目都可以是质量度量中的度量项。</li><li><meta charset="utf-8" />通过技术或是管理的手段，保证产品、代码具有良好的可测试性。良好的可测试性对于产品的维护，自动化测试的进行都是非常有利的&#9472;我觉得，甚至可以武断的说，如果一个应用系统没有良好的可测试性，就很难期望可以在该项目上设置良好的测试框架。测试工程师一般不参与具体的设计工作和代码实施工作，但测试工程师可以推动开发工程师在设计和实现时尽可能的考虑可测试性设计，另一方面，测试工程师也可以通过测试覆盖率这个质量及时发现应用中可测试性不强的地方，推动开发工程师的改进。</li></ul></ol><div>综上，就是我个人认为的敏捷过程中的测试角色必须，应该和可以进行的工作。当然，要完成这些工作，和传统的QA工程师相比，敏捷过程对测试工程师提出了更好的技能上的要求。在我看来，一个敏捷项目中的测试工程师应该具有这样一些技能：</div><p><ol><li>良好的沟通和协作能力；</li><li>良好的设计和代码能力，至少可以和开发工程师在同一水平上讨论具体的设计和代码实现；</li><li>快速学习和总结的能力（运用探索性测试发现缺陷）；</li><li>对自动化测试有深刻的理解（至少要能清楚的认识到自动化测试不等于UI自动化测试，也不等于用自动化测试工具进行录制和回放）；</li><li>快速的风险分析和判断能力（在许多情况下都不会有足够的时间开展full regression，如何判断风险和决定相应的对策至关重要）。</li></ol>==========================分隔线============================</p><p>第二部分完结。</p><p>第三部分我打算探讨下敏捷测试中的测试过程管理。与传统的软件测试过程不同，敏捷测试过程是一个非常简单的过程模型，我的重点会放在敏捷测试过程管理中的一些实用工具上。</p><p>&nbsp;</p><p>另外，可测试性貌似也是一个很好的话题，不知道有没有对这个话题感兴趣的朋友？</p><p>&nbsp;</p></p></p><img src="http://www.cnblogs.com/guanhe/aggbug/1603133.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/guanhe/archive/2009/11/14/1603133.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2009/11/14/1603133.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>敏捷测试感悟（之一）</title><link>http://www.cnblogs.com/guanhe/archive/2009/11/06/1597628.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Fri, 06 Nov 2009 11:03:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2009/11/06/1597628.html</guid><description><![CDATA[<p>阅读: 1150 评论: 6 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2009-11-06 19:03 <a href="http://www.cnblogs.com/guanhe/archive/2009/11/06/1597628.html" target="_blank">原文链接</a></p><p>Agile testing（敏捷测试）基本上是伴随着敏捷开发的概念成长起来的，但在受关注程度上，远远不及敏捷开发本身。自然，开发队伍从数量和活跃度上来讲大于测试队伍，是其中的一个原因；除了这个原因之外，&#8220;敏捷测试究竟如何在项目中发挥作用&#8221;这个问题可能也是导致敏捷测试概念的流行度远远不如敏捷开发的原因之一。</p><p>关于敏捷测试，我能找到的较早的比较系统化的描述文档应该是2002年的这份PPT：http://www.io.com/~wazmo/papers/agile_testing_20021015.pdf，这份PPT定义了敏捷测试的两个主要特点：&#8220;遵循敏捷宣言的测试实践，将开发当成是测试的客户&#8221;（Testing practice that follows the agile manifesto, treating development as the customer of testing），以及&#8220;在使用敏捷技术的项目中的测试实践&#8221;（Testing practice for projects using agile methodologies）。敏捷开发宣言中提到了敏捷开发的四个核心价值观：简明（Simplicity）、沟通（Communication）、反馈（Feedback）、勇气/决断（Courage）&#9472; 如果我的翻译有错，请指正 &#9472;毫无疑问，从开发的角度来说，很容易理解这四个核心价值观对应的行为（敏捷开发的best practice），但从测试的角度来说，&#8220;简明&#8221;和&#8220;勇气&#8221;就很难对应到具体的测试行为中。<br /></p><p>既然难以清楚的寻找敏捷测试的实践行为，我们先尝试来寻找另一个问题的答案：&#8220;敏捷开发究竟会给测试带来哪些改变（相对于传统的测试）？&#8221;如果可以找到这个问题的答案，我们应该可以顺藤摸瓜的找到敏捷测试中对应的best practice。这里有一段有趣的视频，是在某个敏捷开发大会上对许多嘉宾的采访，采访的主题就是&#8220;How does Agile affect testing&#8221;，从回答中你会发现，似乎没有任何人能够准确的回答这个问题。从采访片段中我听到的观点有：<br /></p><ol><li>敏捷开发有不同模型，不同的模型会以不同的方式影响测试（废话&#9472;我的comment）</li><li>敏捷测试需要工具的支持&#8230;（貌似卖工具的厂商喜欢隐晦的这么表达）</li><li>TDD方法要求测试优先，其实除了测试优先外，我认为测试也可以和开发同时进行；</li><li>敏捷过程中的测试是一个integration的任务，在不同层面（单元测试，集成测试，系统测试，用户验收测试）均需要按照敏捷的方式组织测试，目的是符合敏捷方法的价值观。</li></ol><p>在这些观点中，我最喜欢的是第4个观点，这也是一直以来我的认识，其实敏捷本质上并非是一个过程，而是一种理念。至于敏捷测试这个敏捷开发的同源产物，自然也会继承其中的&#8220;目标驱动&#8221;而不是&#8220;过程驱动&#8221;的特性。</p><p>个人认为，敏捷测试和传统测试观点最大的不同在这几个地方：</p><ul><li>敏捷测试并不倾向于严格区分开发和测试角色，全体工程师对于质量具有同等的责任，测试任务由开发和测试工程师共同完成；</li><li>敏捷测试的迭代周期很短，为了在很短的迭代周期中完成测试任务，要求建立&#8220;足够好&#8221;的验收测试，建立足够的自动化测试；</li><li>敏捷测试不严格依赖于文档（需求，设计等），测试角色必须和其他成员以及客户有良好的沟通，以保证建立的质量标准符合用户的需求，以及能够使用项目中的相关知识建立合理的测试框架；</li><li>关于底层测试和关于代码质量是敏捷测试中的一个非常好的实践。</li></ul><p>其中，对传统测试观点最大的冲击是第1和第3点，打破测试角色和开发角色之间的严格限定，用沟通而不是文档作为建立测试的基础，这些的确会让一个熟悉传统测试环境的测试工程师骤然间不知所措。拿我来说，N年前我自认为对敏捷测试有一定的了解，结果真正进入到一个敏捷测试项目的时候才发现仍然需要一段时间来改变自己的工作方式和习惯。不过一旦习惯了这种方式，我转变成了一个彻底的敏捷测试的鼓吹者 &#9472; 毕竟，敏捷测试为产品质量产生的价值，让团队成员得到的成就感和喜悦是实实在在能够看得到的。 <br /></p><p>-------------------------------------------不怎么华丽的分隔线--------------------------------------<br /></p><p>借用一休哥的台词：&#8220;就到这里吧&#8221;，下一次我的主题是&#8220;敏捷过程中的测试角色&#8221;，希望这个系列完成的请留个言，我好知道有多少人对这个主题系列感兴趣，谢谢。 <br /></p><img src="http://www.cnblogs.com/guanhe/aggbug/1597628.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/guanhe/archive/2009/11/06/1597628.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2009/11/06/1597628.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Google API大全：编程·开发·实例》一书将在本周末的GDD（Google开发者大会）上首发</title><link>http://www.cnblogs.com/guanhe/archive/2009/06/01/1493789.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Mon, 01 Jun 2009 07:46:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2009/06/01/1493789.html</guid><description><![CDATA[<p>阅读: 373 评论: 4 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2009-06-01 15:46 <a href="http://www.cnblogs.com/guanhe/archive/2009/06/01/1493789.html" target="_blank">原文链接</a></p><p>我也是本书的作者之一，虽然只在其中占了两章的内容：）</p>
<p>《Google API大全：编程&#183;开发&#183;实例》这本书是国内的第一本较为完整的介绍Google API的书，内容囊括了所有主要的Google API，并用大量的实例展示了Google API的应用方法。在这本书的首页上，我选择了&#8220;Google是一种生活方式&#8221;作为我对这本书的推荐语。</p>
<p>&#8220;Google是一种生活方式&#8221;，此言不虚，现在的网名，或多或少的被搜索引擎影响着使用Internet的方式，Google在其中的贡献不言而喻。当然，对我而言，&#8220;Google是一种生活方式&#8221;更有所指，Google的产品一向以良好的编程接口著称，对于以技术工作为主的工程师们，基于Google的产品构建自己的产品，更是一件值得一试的事情。</p>
<p>《Google API大全：编程&#183;开发&#183;实例》作者序：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">10年前，使用Email邮箱收发邮件，只是很少一部分技术人员才能享受到的便利；5年前，出行时如果没有随身携带地图，只好在路人的指点下摸索找寻。而今天，无处不在的互联网和丰富多彩的互联网应用，已然嵌入了我们的生活。GMail带给我们免费、好用且容量不断增加的邮件服务，Google&nbsp;Maps成了我们出行前必不可少的参阅工具，甚至通过移动终端将地图随时带在身边。所有这些，都悄无声息成为我们生活的一部分。<br />
<br />
互联网技术每天都在更新和发展，促成这一切发生的，正是背后极具创造性的程序员，和那些通过产品为用户带来价值的新技术公司。在这些公司中，Google毫无疑问是在帮助用户改变互联网使用方式上做得最为出色的。<br />
<br />
Google以其独具特色的互联网应用，一直引领着互联网产品开发的方向。同时，Google为其绝大部分产品提供了面向开发者的API调用接口。这些设计良好的API，帮助开发者通过Mashup调用将Google产品所提供的内容集成在第三方应用中。<br />
<br />
Google&nbsp;多达几十种的开放API无法一一列举，但我们在日常使用互联网时一定在不经意间享受过它所带来的便利。提供地图服务的Maps&nbsp;API，实现互联网社区化联系的OpenSocial&nbsp;API，开发定制个性化首页的iGoogle&nbsp;Themes&nbsp;API，简化广告营销管理活动的AdWords&nbsp;API，提供网络应用程序平台的App&nbsp;Engine，等等。这些API的出现，不仅仅为开发者带来更具灵性的开发创意，为用户带来更为丰富多彩的互联网产品，更重要的是，它们说明了&nbsp;Google的产品不是封闭的，而是属于整个互联网开放平台的，任何人都可以在Google的产品之上进行拓展，并享用Google产品为互联网带来的便利。<br />
</span></div>
<p><font  size="3"><span  style="font-size: 13px; "><br />
</span></font></p>
<p>完整的作者序请<a href="http://docs.google.com/View?id=dfdbjgz_7fzhpmq8k">移步至Google Doc上阅读</a>。 或者，你可以查看<a href="http://www.douban.com/subject/3764948/">豆瓣</a>和<a href="http://www.china-pub.com/195616">China-pub</a>上的本书信息。</p>
<p>&nbsp;</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/guanhe/googleapi.jpg" width="321" height="414" alt="" /><br />
</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/guanhe/aggbug/1493789.html?type=1" width="1" height="1" alt=""/><p>评论: 4　<a href="http://www.cnblogs.com/guanhe/archive/2009/06/01/1493789.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2009/06/01/1493789.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>4月份到上海出差</title><link>http://www.cnblogs.com/guanhe/archive/2009/03/11/1408595.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Wed, 11 Mar 2009 03:39:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2009/03/11/1408595.html</guid><description><![CDATA[<p>阅读: 296 评论: 2 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2009-03-11 11:39 <a href="http://www.cnblogs.com/guanhe/archive/2009/03/11/1408595.html" target="_blank">原文链接</a></p><p>4月份到上海出差，有机会的话希望能够和上海的测试同行们见见面：）</p>
<p><br />
</p>
<p>不知道有没有感兴趣的朋友？我到上海会住在南京路附近。&#160;</p><img src="http://www.cnblogs.com/guanhe/aggbug/1408595.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/guanhe/archive/2009/03/11/1408595.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2009/03/11/1408595.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>拿到了TD的3G测试手机</title><link>http://www.cnblogs.com/guanhe/archive/2008/09/11/1289078.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Thu, 11 Sep 2008 05:59:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2008/09/11/1289078.html</guid><description><![CDATA[<p>阅读: 753 评论: 6 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2008-09-11 13:59 <a href="http://www.cnblogs.com/guanhe/archive/2008/09/11/1289078.html" target="_blank">原文链接</a></p><p>从小到大，除非是人人都有奖的那种，否则我就和抽奖无缘。一直以为这就是我的命，没想到，居然有例外——几个月前申请TD的3G社会化测试，居然中彩被抽中了，太难得了。</p>
<p>我拿到的是新邮通的 N269 这一款手机，样子倒是中规中矩的长方形，不过不知道怎么回事，看到这个手机的第一眼就觉得有典型的山寨机风格。到今天为止大约使用了一周左右的该手机，接听和打了几个电话，和另一个测试用例视频了一次，用手机浏览器上网浏览了一些网站，用笔记本连接手机上网，总体感觉是，除了连接笔记本上网感觉上比GPRS和CDMA 1X明显快之外，别的3G的优势就没有明显的体会了。</p>
<p>不过话说回来，从3G的技术上来说，3G提供的特色也就是一个&#8220;更宽的网络带宽&#8221;，至于具体的业务么，那是运营商操心的事情，对我这样的用户来说，与其用手机浏览网页、打游戏、弄一些花里胡哨的业务，不如用我更熟练使用的notebook去干这些事情好了。</p>
<p>对这个3G手机还有一个比较大的抱怨就是说明书，看上去挺精美的说明书，一到关键地方就...了。在拿3G手机尝试通过笔记本连接Internet的时候，在光盘上一共发现了两个安装包，怎么找都找不着手机的驱动，折腾了两天才弄清楚，原来要先安装那两个包，然后在系统提示安装新硬件的驱动时，找到Sync安装后生成的那个目录，驱动在该目录下的driver目录中——晕，就这点东西也不说清楚，折腾人。具体过程我就不写了，这里有一篇更详细的说明：<a href="http://www.steveluo.name/postcom-n269-3g-net" title="新邮通N269连接笔记本电脑上网操作指南">新邮通N269连接笔记本电脑上网操作指南</a>。</p>
<p><br />
</p><img src="http://www.cnblogs.com/guanhe/aggbug/1289078.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/guanhe/archive/2008/09/11/1289078.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2008/09/11/1289078.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>天佑中华</title><link>http://www.cnblogs.com/guanhe/archive/2008/05/16/1200041.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Fri, 16 May 2008 02:29:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2008/05/16/1200041.html</guid><description><![CDATA[<p>阅读: 380 评论: 2 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2008-05-16 10:29 <a href="http://www.cnblogs.com/guanhe/archive/2008/05/16/1200041.html" target="_blank">原文链接</a></p><font face="Verdana">这些天来，没有什么比得上对四川地震的关注，心里一直被塞得满满的，同情，难过，悲伤。<br />
<br />
恨不能和那些可爱的救援者一样，在现场亲手挽救同胞的生命，可是理智却告诉我，对他们最大的帮助是做我能够做的。<br />
<br />
看着新闻中的英雄们，在网站上读着感人至深的故事，看着那些放弃了自己的休息时间忙碌着筹集捐款，组织献血，人肉搜索，尽自己能力帮助他人的同事们，感动到无语。<br />
<br />
逝者已矣，祝他们在天堂安好。我们能做的，是为那些需要帮助的人提供尽可能的帮助。看到网上很多和自己亲人失散的朋友焦急地打听自己亲人的消息，或许可以尝试这个：<br />
<br />
<a href="http://www.google.cn/intl/zh-CN/qinren/cse.html">http://www.google.cn/intl/zh-CN/qinren/cse.html<br />
</a><br />
我在blog的右侧也加上了这个搜索框，即使这样只能帮到一个朋友，我也会发自内心的感到高兴。<br />
<br />
太沉重，不能再说些什么了，我们经历了灾难，受难的人们正在经历苦难，但只要希望在，就能期待光明。<br />
<br />
<span style="font-size: 24pt"><span style="color: red"><span style="font-size: 24pt">天佑中华！</span><br />
</span></span><br />
</font>
<img src="http://www.cnblogs.com/guanhe/aggbug/1200041.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/guanhe/archive/2008/05/16/1200041.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2008/05/16/1200041.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>一个好玩的网站</title><link>http://www.cnblogs.com/guanhe/archive/2008/05/05/1183759.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Mon, 05 May 2008 09:17:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2008/05/05/1183759.html</guid><description><![CDATA[<p>阅读: 393 评论: 1 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2008-05-05 17:17 <a href="http://www.cnblogs.com/guanhe/archive/2008/05/05/1183759.html" target="_blank">原文链接</a></p><font face="Verdana">网站名称是PythonChallenge，提供了一系列的Python puzzle需要你去解决。需要你根据给出的页面提供的信息，猜测（计算）出下一关的URL是什么。<br />
<br />
刚开始看到的时候觉得满头雾水，尝试着解决了几关之后发现，还是蛮好玩的。所有的puzzle都建议使用Python编程语言来解决，当然也可以用其他的语言来解决。如果你正在学习Python，或是对用编程解决问题有兴趣，可以去试试，看看你能到哪一关。<br />
<br />
<a href="http://www.pythonchallenge.com">http://www.pythonchallenge.com</a><br />
<br />
一点小提示：<br />
1，解决一个问题后，得到下一关的html文件名，只需要把本关的URL的xxxx.html改成[newstring].html即可；<br />
2，注意页面上的提示信息，请仔细阅读；<br />
3，很多时候需要查看页面的源代码，源代码中通常会隐藏一些信息。<br />
<br />
我第一次看到最初那一关的时候，想了半天也没弄明白怎么回事，为了方便大家可以尽快开始玩，把第0关的解决过程描述一下：<br />
1，你首先看到的应该是一个类似电视机的图片；<br />
2，查看页面源代码的话，没有任何提示信息；<br />
3，注意页面上的数字，一个大的2和一个小的38<br />
4，这提示你是2的38次方<br />
<br />
因此，解决方法是计算出2的38次方（当然不是让你手算啦&#8230;&#8230;），例如，用python写：<br />
print pow(2, 38)<br />
<br />
得出的结果是<font face="Verdana">274877906944，原来的URL是：<font face="Verdana"><a href="http://www.pythonchallenge.com/pc/def/0.html">http://www.pythonchallenge.com/pc/def/0.html</a>，将其更改成<font face="Verdana"><a href="http://www.pythonchallenge.com/pc/def/274877906944.html">http://www.pythonchallenge.com/pc/def/<font face="Verdana">274877906944</font>.html</a>，即可看到下一关的问题页面。</font></font></font></font> 
 <img src="http://www.cnblogs.com/guanhe/aggbug/1183759.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/guanhe/archive/2008/05/05/1183759.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2008/05/05/1183759.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>JMeter与LoadRunner的比较</title><link>http://www.cnblogs.com/guanhe/archive/2008/04/28/1174583.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Mon, 28 Apr 2008 06:13:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2008/04/28/1174583.html</guid><description><![CDATA[<p>阅读: 1766 评论: 12 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2008-04-28 14:13 <a href="http://www.cnblogs.com/guanhe/archive/2008/04/28/1174583.html" target="_blank">原文链接</a></p>本来打算写一篇JMeter和LoadRunner的简单比较的文章，Google了一下，发现类似的文章已经有不少了，中文的英文的都有。大致阅读了几篇，发现其中一篇文章的总结和比较还是比较中肯的，因此直接把这篇文章的Link贴在这里，供大家参考（请注意，这篇文章是2006年的文章，有些内容有点过时了）。<br />
<br />
文章标题：Shootout: Load Runner vs The Grinder vs Apache JMeter <br />
<font face="Verdana"><a href="http://blackanvil.blogspot.com/2006/06/shootout-load-runner-vs-grinder-vs.html"><font face="Verdana">http://blackanvil.blogspot.com/2006/06/shootout-load-runner-vs-grinder-vs.html</font><br />
</a></font><br />
随着对JMeter使用的深入，我越来越倾向于在自己的工作中使用JMeter工具，并且也不遗余力的向我认识的测试工程师推荐这个工具，但很多工程师在初步使用过这个工具后，会向我抱怨JMeter有太多不能做的事情，但在我看来，JMeter确实有不能做的事情，不过，对于Web应用的测试，JMeter是足够强大了。很多人会把JMeter和自己正在使用的LoadRunner进行比较，然后说&#8220;还是LoadRunner好用&#8221;——关于这一点，我觉得首先要明确&#8220;好用&#8221;的定义。接下来，我以自己的工作为例，说明一下JMeter是如何适应我的工作内容的。<br />
<br />
我测试的主要项目都是基于Web的应用，从性能测试的角度来说，我希望性能测试工具具有这样的一些特点：<br />
Critical Features：<br />
1，支持HTTP/HTTPS协议，能够发送HTTP/HTTPS request；<br />
2，支持用户场景（借用了LR中的词汇），能够以某种比例在不同的业务上分布用户数量；<br />
3，支持事务；<br />
4，支持参数化和关联（还是借用LR中的词汇）；<br />
5，能够获得和汇总请求响应时间等数据，能够提供响应时间汇总、事务/请求处理成功率等数据报表；<br />
<br />
Non-Critical Features:<br />
1，能够以漂亮的图表展示出结果数据；<br />
2，能够提供漂亮的用户界面（GUI）；<br />
3，能够提供良好的录制功能和调试环境；<br />
<br />
另外，从我所测试的产品，和我个人的角度来说，我还希望工具具有以下功能：<br />
1，能够灵活的扩展，例如，我的应用的后端（bakcend）和前端的通讯使用的是RPC方式，则我希望工具能够通过我已有的API直接对后端产生负载，进行负载测试；<br />
2，可以使用命令行方式，采用批处理模式运行（不需要GUI），运行后的结果能够通过Email等发送给我，或是直接integration到一个可发布的web页面上；<br />
3，收集得到的数据能够很容易的进行再处理（例如，以XML格式存储raw data）；<br />
4，工具本身具有很好的可信度，可以通过查看代码等方式，了解当意外发生时是工具本身的问题或是应用的问题。<br />
<br />
大体上，JMeter和LoadRunner都可以很好的完成Critical Feature中列出的任务，而LR在Non-Critical Feature方面表现更出色。不过，JMeter在我希望的更灵活的功能方面大获全胜。<br />
<br />
JMeter的另一个最大的优势，自然是在cost方面，LR的价格是有目共睹的，而JMeter，接近0的获得成本对于资金不那么宽裕的公司来说，实在是难得。<br />
<br />
我得承认，在对JMeter和LoadRunner进行比较的时候，我很明显的偏向了JMeter：）在本文中，我不打算以一个独立第三方的面目出现，你可以把本文的观点看作是对JMeter的推介或是认可，目的只是为了消除一些人认为&#8220;JMeter是玩具&#8221;的观点，实际上，JMeter现在确实是我的性能测试中的主要工具，而LoadRunner已经不再出现在我的性能测试工具列表中了。<br />
<br />
希望这篇文章不会开罪LoadRunner的坚定拥护者们，有任何意见，我非常欢迎理性的讨论。<br />
 <img src="http://www.cnblogs.com/guanhe/aggbug/1174583.html?type=1" width="1" height="1" alt=""/><p>评论: 12　<a href="http://www.cnblogs.com/guanhe/archive/2008/04/28/1174583.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2008/04/28/1174583.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>浏览器对Script下载的非并行处理再说明</title><link>http://www.cnblogs.com/guanhe/archive/2008/04/27/1173609.html</link><dc:creator>关河</dc:creator><author>关河</author><pubDate>Sun, 27 Apr 2008 14:08:00 GMT</pubDate><guid>http://www.cnblogs.com/guanhe/archive/2008/04/27/1173609.html</guid><description><![CDATA[<p>阅读: 696 评论: 5 作者: <a href="http://www.cnblogs.com/guanhe/" target="_blank">关河</a> 发表于 2008-04-27 22:08 <a href="http://www.cnblogs.com/guanhe/archive/2008/04/27/1173609.html" target="_blank">原文链接</a></p><p><font face="Verdana">在4月26号下午的讲座中，我提到了&#8220;将Script放到HTML文件中尽量靠近尾部&#8221;的方法来提高用户感觉上的响应时间，有朋友对这个问题提出了疑问，因此在这里更详细的对该方法进行说明。</font></p>
<p>首先，浏览器对于script的下载是避免并行进行的。HTTP/1.1协议中规定浏览器和同一host之间只建立最多两个连接，也就是说允许的最大并行度为2（当然，对IE和Firefox来说，你都可以通过修改浏览器的设置来扩大这个并行度）。但对于Script的下载来说，浏览器在开始下载Script之后，是不会并行的下载其他element的。不会并行下载script这一点是一个事实，但浏览器为什么要采用这种策略，以及浏览器我们提到的&#8220;将Script放到HTML文件中尽量靠近尾部&#8221;到底能起到多大的作用，需要注意哪些事项，我希望在这篇文章中进一步的进行讨论。<br />
<br />
为了讨论方便，我准备了一个简单的HTML文件：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Test&nbsp;javascript&nbsp;download&nbsp;page</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="Javascript"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="jsdownload_j1.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">Script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="Javascript"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="jsdownload_j2.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">Script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />This&nbsp;is&nbsp;a&nbsp;simple&nbsp;page&nbsp;to&nbsp;test&nbsp;javascript&nbsp;download.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="Click&nbsp;Me"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="testButton"</span><span style="color: #ff0000">&nbsp;onclick</span><span style="color: #0000ff">=OnB1Click()</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">input</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">img&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="Sunset_small.JPG"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">img&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="Blue_hills_small.JPG"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>这个HTML文件include了两个javascript文件，含有两张图片。两个javascript文件内容分别如下：<br />
jsdownload_j1.js:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;OnJ1B1Click()<br />
<img id="Codehighlighter1_23_52_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_23_52_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_23_52_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_23_52_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_23_52_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_23_52_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_23_52_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_23_52_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_23_52_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;alert(</span><span style="color: #000000">"</span><span style="color: #000000">A&nbsp;simple&nbsp;test</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>jsdownload_j2.js:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;OnB1Click()<br />
<img id="Codehighlighter1_21_41_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_21_41_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_21_41_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_21_41_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_21_41_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_21_41_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_21_41_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_21_41_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_21_41_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;OnJ1B1Click();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>从代码中看出，这个HTML文件很简单，带有两张图片和一个button，当button被click的时候，调用jsdownload_j2.js的OnB1Click()函数，而OnB1Click()函数是简单的调用jsdownload_j1.js文件中的OnJ1B1Click()函数。<br />
<br />
我们来看看用IBM Page Detailer工具获得的IE浏览器访问该页面时的页面元素下载图：<br />
<img height="173" alt="" src="http://www.cnblogs.com/images/cnblogs_com/guanhe/jsdownload1.JPG" width="874" border="0" /><br />
从图中可以看到，javascript的下载block了其他元素的下载，因此第一个可视元素（图片）的下载完成是在1.33秒的时刻，也就是说，用户等待1.33秒才能看到页面上的第一幅图片。而如果我们把HTML中的javascript的位置放到稍后的位置，例如，改成这样：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Test&nbsp;javascript&nbsp;download&nbsp;page</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">img&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="Sunset_small.JPG"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">img&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="Blue_hills_small.JPG"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="Javascript"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="jsdownload_j1.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">Script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="Javascript"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="jsdownload_j2.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">Script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />This&nbsp;is&nbsp;a&nbsp;simple&nbsp;page&nbsp;to&nbsp;test&nbsp;javascript&nbsp;download.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="Click&nbsp;Me"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="testButton"</span><span style="color: #ff0000">&nbsp;onclick</span><span style="color: #0000ff">=OnB1Click()</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">input</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span></div>
<p>则得到的element下载图如下：<br />
<img height="161" alt="" src="http://www.cnblogs.com/images/cnblogs_com/guanhe/jsdownload2.JPG" width="871" border="0" /><br />
虽然总的下载时间比上一次稍长，但在0.72秒的时候，第一幅图片就已经下载完成，此时用户会看到页面的主要部分，因此对用户来说，页面变&#8220;快&#8221;了。<br />
<br />
这是一个典型的利用浏览器下载Script时候的非并行特性优化页面性能的方法。接下来，我们讨论下为什么浏览器在下载Script的时候会采用非并行的方式。其实原因也不复杂：<br />
</p>
<br />
<strong>在我们的HTML文件中，有两个Script，一个是jsdownload_j1.js，另一个是jsdownload_j2.js文件，如果允许浏览器并行下载这两个script，则可能发生jsdownload_j2.js文件先于jsdownload_j1.js文件下载完成的情况。这时如果页面上后续的一个javascript调用使用了jsdownload_j2.js文件中的函数，则此调用会立即发生（因为浏览器判断到jsdownload_j2.js文件已经下载完成了），而如果此时jsdownload_j2.js文件中的该函数需要依赖于jsdownload_j1.js中的另一个函数，由于此时jsdownload_j1.js文件还未下载完成，则此调用会产生一个javascript error。为了避免这样的情况，浏览器采用了严格按照HTML文件中定义的顺序下载Script，并严格按照非并行方式下载的策略。<br />
</strong><br />
最后一个需要讨论的问题，就是这种提升页面性能的方式有哪些需要注意的内容了。实际上，如同上面黑体字的讨论，如果不分青红皂白把Script文件全部放在HTML的最后部分，也是会出问题的。例如，在我们的例子中，Button的Click事件需要调用js文件中的某个函数，如果Script都被放到HTML文件的最后的话，button这个element会在script下载完成之前被render出来，如果此时用户点击了这个button，就一定会出现一个Script error。关于这个问题，有两个解决方法：<br />
1，将Script放在合适的，尽量靠近尾部的地方，由开发人员保证不会出现这样的问题；<br />
2，为所有的js文件中需要被调用的函数，在HTML中实现一个空函数（放在靠前的位置），这样当页面需要的js文件没有download完成时，用户点击按钮等操作之后出发一个空函数，避免了Script Error（当然，可能会confuse用户）；而等js文件download完成后，这些function会被override，用户的操作能够得到正确的解决。
  <img src="http://www.cnblogs.com/guanhe/aggbug/1173609.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/guanhe/archive/2008/04/27/1173609.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/guanhe/archive/2008/04/27/1173609.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>