<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Doctor's WebLog]]></title> 
<link>http://www.gaobo.info/index.php</link> 
<description><![CDATA[博乐的自留地]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Doctor's WebLog]]></copyright>
<item>
<link>http://www.gaobo.info/read.php/736.htm</link>
<title><![CDATA[解决WIN2008 R2 x64未注册Microsoft.Jet.OLEDB.4.0程序错误]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Fri, 03 Sep 2010 07:19:36 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/736.htm</guid> 
<description>
<![CDATA[ 
	这两天学校搬迁，我们办公室也从老校区转战到新校区了，呵呵<br /><br />搬过来后部分服务器进行了调整，一些站点无法访问，出现了老的站点在新的系统下工作不正常的情况。下边列举一例。<br />提示如下错误:<br />未在本地计算机上注册&ldquo;Microsoft.Jet.OLEDB.4.0&rdquo;提供程序。<br />说明: 执行当前 Web 请求期间，出现未处理的异常。请检查堆栈跟踪信息，以了解有关该错误以及代码中导致错误的出处的详细信息。 <br />异常详细信息: System.InvalidOperationException: 未在本地计算机上注册&ldquo;Microsoft.Jet.OLEDB.4.0&rdquo;提供程序。<br /><br />解决方法如下：<br />用于Access和Excel数据库的Microsoft OLE DB Provider for Jet在64位版本中不可用。 <p>必须在IIS中启用32位应该程序才可以正常使用</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/2008/" rel="tag">2008</a> , <a href="http://www.gaobo.info/go.php/tags/r2/" rel="tag">r2</a> , <a href="http://www.gaobo.info/go.php/tags/x86/" rel="tag">x86</a> , <a href="http://www.gaobo.info/go.php/tags/x64/" rel="tag">x64</a> , <a href="http://www.gaobo.info/go.php/tags/microsoft/" rel="tag">microsoft</a> , <a href="http://www.gaobo.info/go.php/tags/jet/" rel="tag">jet</a> , <a href="http://www.gaobo.info/go.php/tags/oledb/" rel="tag">oledb</a> , <a href="http://www.gaobo.info/go.php/tags/access/" rel="tag">access</a> , <a href="http://www.gaobo.info/go.php/tags/excel/" rel="tag">excel</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/735.htm</link>
<title><![CDATA[应用Visual Studio 2010辅助敏捷测试]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Wed, 01 Sep 2010 12:31:13 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/735.htm</guid> 
<description>
<![CDATA[ 
	<p>敏捷软件开发是近些年来比较热门的话题，《敏捷宣言》四条主要精神和十二条基本准则概括了敏捷开发的基本思想。围绕着这些基本概念和思想，产生了一系列的轻量级方法，如：极限编程、测试驱动开发、Scrum、特性驱动开发等。虽然具体名称、过程和侧重点不尽相同，但是相对于非敏捷的开发方法而言，它们都更强调面对面的沟通、团队不同角色之间的紧密协作、频繁交付新的可用的软件版本、紧凑而自我组织型的团队等。敏捷开发只是提供了一个思想和方法论,而要在实际的工程中正确运用它，并真正显现出它的优点和产生实际的效果，这对于每个团队而言一开始都是一个挑战，尤其是对那些那些习惯了传统瀑布模式的团队。<br />敏捷是整个团队的敏捷，不只是团队中某个角色或者某个阶段的敏捷，开发、测试和项目经理等所有角色都要敏捷起来。敏捷方法的采用对团队每个成员都提出了新的挑战，尤其是测试人员。之所以这样说，是因为相对于传统的瀑布模型，敏捷开发所要求的频繁交付，给测试所留出的时间更为紧迫，要求测试人员更早的介入和更及时地完成测试任务。如何在这么短的时间内完成测试的计划和实施呢？如何有效地避免回归问题的出现？手工测试人员如何能更好的融入到敏捷团队？等等问题接踵而至，这都需要需要测试人员不断的思考和尝试。</p><p>无论是哪种开发模式，软件的开发过程都可以归结为：人、工具和过程这三个因素，三者的有机结合才能更高效的完成任务。有人会说：《敏捷宣言》四条主旨精神的第一条就是&ldquo;个体和交互重于过程和工具&rdquo;，工具还有那么重要吗？回答是肯定的，工具很重要，这条主旨所提到的是&ldquo;重于&rdquo;而不是不要。为了支持敏捷开发，Visual Studio 2010（以下简称为VS 2010）应用程序生命周期管理中引入了MSF for Agile Software Development v5.0过程模板，用于辅助敏捷团队在实际工程中进行敏捷实践，它支持Scrum敏捷开发过程框架。本文将从工具角度出发， 介绍Visual Studio 2010如何帮助测试人员更胜任敏捷项目中的测试工作。对于工具与人的关系而言，好的工具应该是将人从重复和机械的劳动中解脱出来，让人有更多的精力和时间花在有创造性地劳动上，而由工具去完成将繁琐和冗余的事务性操作；而对于工具和过程的关系，工具是过程能够得到确实落实和准确执行的基石，很多时候我们总是依赖于人去执行某个过程或者流程要求，但人的执行往往带有一定不稳定性和主观性，而工具则可以帮助我们准确客观的执行。</p><h2>团队有效协作的基石&mdash;&mdash;Team Foundation Server</h2><p>敏捷开发强调人与人之间的有效沟通和紧密的团队协作。对于测试团队和测试人员而言，首先应该需要考虑的是：如何让测试工作更有效的集成整个敏捷开发的活动中去？而不是将测试工作仅作为一个&ldquo;附件&rdquo;或者可有可无的副产品。当然，这会受到团队组织形式和开发过程的限制，例如：采用功能小组模型的团队，所有角色成员（PM、开发人员、测试人员）隶属于同一个功能团队，客观上其沟通就更为方便；而对于采用纵向按职能划分团队的公司而言，测试和开发在隶属关系上是分开的，相对在沟通上障碍就会更多些。无论是哪种组织形式，好的工具能帮助促进和统一各个角色间的信息互通和共享，而不是要让他们彼此之间更为孤立、工作在各自的一亩三分地（Silo）中。Team Foundation Server 2010（以下简称为TFS 2010）就是这样的工具，作为整个团队协作的核心，它统一了团队不同角色信息、实现了信息之间的有效互联互通、彼此之间的共享和关联，例如：TFS 2010定义6种默认的工作项类型，如下图所示。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest1.JPG" border="0" width="586" height="482" /></p><p><strong>图1：</strong>TFS 2010定义6种默认的工作项类型</p><p>其中，Test Case和 Shared Steps是2010专门为测试新加入的。不要小看这些工作项，它们之间有着丰富的关联关系，这种关系背后所代表是角色之间的关系。对于测试而言，它将测试和团队紧密的结合在一起。例如：Test Case工作项用来详细定义和管理测试用例，它还可以和User Story相关联，也就是将测试和用户需求进行了关联，用户可以从需求追溯到覆盖的它的测试用例，这背后体现的是测试人员和需求人员/PM的协作；Test Case还可以与Bug关联，通过这种关联可以挖掘出哪些 Bug被测试用例覆盖，哪些还没有，这种关联体现了测试人员与开发人员的写作，如果是自动化测试用例，则体现了手工测试人员和自动化工程师的协作；Bug还可以可以和签入集（Change-set）关联，可以找到为了修复Bug，开发人员修改过哪些产品代码，这体现了测试人员和开发的关联。</p><p>敏捷开发频繁的迭代和较短的迭代周期，对项目管理的精确性、透明性和可见性都提出了更高的要求， 尤其对于那些项目复杂和人员较多的团队。Task是另一个重要的工作项类型，它用于管理开发过过程中的所有任务项，包括：开发、测试以及需求等任务，统一管理开发中的所有任务，统一计算项目的开销和剩余工作量等。例如，项目的燃尽图就是由它产生出来的。现在，人们虽然在理论和概念上已经非常认同软件测试的在工程中的重要地位，但在具体实际操作中，测试却仍然被看作是低于开发和需求分析等的&ldquo;二等公民&rdquo;。当然这是由于多方面的综合因素造成的，从管理技术角度讲，这是由于测试工作本身缺乏可度量性和可见性，从导致了测试工作的透明性的缺失，团队往往看不到测试工作的进度和所带来的成果，从而意识不到测试的真正作用。对于测试人员自身而言，缺乏可度量性也让自己无法对工作进度准确把握，进而失去了对自己工作的目标感和认同感。将测试工作同其他工作一样的用Task工作项管理起来，增加了它的可度量性和可见性。将测试工作和其它任务一起统筹，时刻确保测试被作为整体中的一部分进行考虑，所有的测试任务都被作为Task工作项记录下来，例如：编写测试计划、设计测试用例、自动化测试用例等等，每项任务都有三个默认时间估计数据需要填写，它们是：Original Estimate、Remaining和Completed，分别代表了任务的预估时间、剩余工作量和完成工作量。</p><p>为了增强敏捷过程的透明性和可见性，TFS 2010定义了很多的报表和仪表板（Dashboard），它们会自动生成各种报表，以可见的方式描述敏捷项目的健康状况，这其中就有很多反映测试工作的报表，如下面所示。Stories Overview展示了用户故事的进展情况，包括了每个用户故事的测试用例覆盖数量和执行结果，以及相应的Bug数量；Test Dashboard显示了测试用例的状态，包括正在设计的用例以及设计完毕可以执行的用例数量，现实当前Bug的状况，包括未被修复和以修复Bug的数量。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest2.JPG" border="0" width="678" height="465" /></p><p><strong>图2：</strong>Stories Overview展示了用户故事的进展情况</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest3.JPG" border="0" width="686" height="509" /></p><p><strong>图3：</strong>Test Dashboard显示了测试用例的状态</p><h2>集成测试环境&mdash;&mdash;Microsoft Test Manager</h2><p>在过去的十几年中，为了适应了软件项目的复杂度和规模的不断膨胀，软件开发工具和框架得到了长足的发展，而测试工具则始终是块短板 ，特别是对于那些需要手工完成的测试任务而言，进展就更为缓慢，例如：现在很多团队仍然使用Word或者Excel这样&ldquo;原始&rdquo;工具来管理测试用例。通过对业界的调查和分析，我们发现70%的软件测试工作仍然是通过手工或者简单的脚本来完成的，在测试团队中不具备编程能力和仅有基本脚本编写能力的测试人员仍然是测试的主力。</p><p>要让你的项目敏捷起来，对于那些仍以手工测试为主的团队而言是一个非常大的挑战，如何提高手工测试工作的效率将是实现敏捷的成败关键。在VS 2010中，微软首次为测试人员设计了一款专用的集成测试环境，称为微软测试管理器2010（Microsoft Test Manager 2010，以下简称为MTM）。之所以称之为集成测试环境，是因为MTM的功能涵盖了测试计划、测试用例、手动测试用例的执行和录制回放、自动测试用例执行、创建信息丰富的Bug、验证Bug、以及与测试实验室管理相关的对策是自动化相关的功能等。下图展示的是MTM测试计划的操作界面，它以树形的层次结构来组织测试用例。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest4.JPG" border="0" width="672" height="409" /></p><p><strong>图4：</strong>MTM测试计划的操作界面</p><p>《敏捷序言》强调：&ldquo;可工作的软件重于完备的文档&rdquo;，那么是不是意味着敏捷测试也不需要测试计划呢？当然不是。敏捷的本质是要去除软件过程所有造成时间浪费地方，不需要的是那些动辄就几十或上百页的文档。敏捷对文档要求是要简明扼要，一两页列出测试要点计划还是必须的，较短迭代周期（1-4周）也不可能要求文档面面俱到。敏捷需要更快的对功能进行验证，是不是不需要编写测试用例直接根据用户故事或者功能需求进行探索性测试就可以了？当然也不是。功能需求和用户故事勾画出的是一棵大树躯干和主要枝杈，而那测试用例则不但要准确描述出躯干和主枝，还要描述出细小的枝杈和绿叶的正确位置。从某种意义上讲，测试用例在敏捷中的作用和地位应该更为加强，它扮演着详细功能文档的角色。功能需求和设计文档可以简单，但测试用例可不是这样，相反我认为敏捷对测试用例的设计和管理要求更高。</p><p>每个迭代周期，团队都会专注于实现不同的产品功能，用户故事虽然描述了功能的内容，但并不足以覆盖所有相关的内容。很多由用户故事展开和关联的功能一般在文档中会体现出来，需要测试人员在早期围绕着用户故事测试展开需求文档测试（需求评审），已明确那些未严格定义出来的内容，以测试用例的形式明确和记录下来。由1个简单用户故事就有可能扩展为1+N用户可能执行的执行片段，也就我们测试用例。当你有M个用故事，需要Ｍ个迭代周期来完成产品，那么就会有 ( M + N<sub>1 </sub>+ N<sub>2 </sub><sub>&hellip; </sub>+ N<sub>M</sub>) 个测试用例，不把它们落实到笔头上，很容易就会丢失一些重要的测试细节。此外，在敏捷方法中需求变化比较快，随着多个迭代的深入，文档的变化往往赶不上产品功能的变化，这时唯一能够赶上这个变化的只有测试用例，应为只有它准确地反映了产品的变化，否则测试用例就是无法通过的。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest5.JPG" border="0" width="683" height="535" /></p><p><strong>图5：</strong>测试用例</p><p>在MTM 中，测试用例被分类至各个测试用例集，结构十分清晰。测试用例只是逻辑上从属于某个测试用例集，并没有物理从属关系，即一个测试用例可以同时被分在多个测试用例集内，比如某个测试用例性质上是一个性能测试，但是由于该用户故事的诉求就是性能改进，我们也就很自然得可以将其作为该用户故事的验收测试，此时我们就可以将此测试用例添加到验收测试和性能测试两个测试用例集中；另一个例子是给每个用户故事都定义了不少测试，这些测试用例都应该能在用户故事测试用例集下找到，但是这些测试既可能是手动测试也可能是自动化测试用例，所以它们又会被本别归类至这两个测试用例集。在这种逻辑分类的支持下，我们可以很容易的根据需要指定运行测试集中一部分测试用例。比如，我们可以定义一个签入测试的测试用例集，挑选最基本的若干个测试置入其中，这样在每次签入前通过运行这个测试用例集就能帮助我们确保签入的代码不至于破坏最基本的功能，即保证了版本随时可运行可测试，这无疑为测试带来了更多的方便。具体如何创建测试用例集的结构，团队可以根据自己项目的特点，灵活运用此功能，制定分类规则以提高工作的效率。</p><p>很多测试团队仍然在使用Word或者是Excel管理测试用例，有些是使用专门的测试用例管理工具，使用独立的数据库来存储测试用例信息。MTM相对于这些工具的优点在于，它的所有数据都是存储在TFS上，测试用例使用的是Test Case工作项。由于同存储在TFS 上，所以可以轻松的实现与其它数据项的关联，例如：在上一部分我们介绍的不同类型工作项之间关联，此外还可以把Test Case与代码关联，即将测试用例与自动化测试代码关联。这样在MTM中，也可以直接管理和运行自动化测试用例，使MTM兼具了管理手工测试用例和自动化测试用例的能力。</p><p>探索性测试（Exploratory Testing）是测试人员在对被测试系统的功能进行不断了解和学习的过程中进行测试，包括：设计测试用例、执行测试、以及汇报测试结果。与传统的测试相比，它不需要事先定义好的齐备的测试文档，更强调测试人员在对系统不断地学习中，边了解边测试，它在很大程度上给测试人员更多地自由和想象空间，充分发挥他们的创造力，在不断地学习中找到测试的灵感和快乐。这种测试的灵感和快乐对于组建和培养一支热爱测试的团队是非常非常重要，它会让测试人员觉得自己不是执行重复测试劳动机器，而是一个有着创造力和灵光的团队成员。MTM也支持探索测试功能，用户可以使用MTM创建一个仅有一个测试步骤的测试用例，然后执行它，Test Runner工具会辅助执行手动测试。它会记录下所有用户的操作，一旦发现有Bug时候，可以直接选择&lsquo;Create exploratory bug&rsquo;直接创建一个Bug。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest6.JPG" border="0" width="507" height="411" /></p><p><strong>图6：</strong>创建一个Bug</p><p>Bug是测试工作最重要的产出之一，也是测试和开发人员之间重要接触点。每个提交的Bug都应该详细记录下如何重现（reproduce）的步骤，这是衡量Bug质量的重要因素之一。因为不可重现的Bug是没有意义的，只会耽误开发人员和项目经理的时间。偶尔出现不可重现的Bug还是可以理解的，但如果经常出现，那就会引来开发人员的抱怨和不满，久而久之会造成开发和测试之间的不信任。 好的Bug应该是有清晰和详细的重现步骤，期望的结果和实际得到结果，并提供尽可能多的信息，例如：出现问题的产品版本编号、语言、操作系统的版本以及日志信息等。大多数情况下，用文字进行描述的内容就可以了，但如果能配上一张问题现场截图，或者对于更为复杂的Bug，配上一段小的录像，这样的Bug会给开发人员快速诊断和修复产品问题带来很大帮助，大大提升测试和开发人员之间的协作效率，避免了不可重现Bug在开发和测试之间推来推去的&ldquo;Bug乒乓&rdquo;现象。然而要收工创建这样一个信息丰富的Bug，是需要很多时间的。MTM提供了这样的功能为帮助测试人员创建这样高质量Bug，它实现了多种诊断数据适配器（Diagnostic Data Adapters），在测试确认Bug的过程中，这些适配器会在后台运行收集大量的数据，包括：执行操作、系统配置、IntelliTrace已经操作过程的录像等，当测试人员要创建一个Bug时，这些信息会被自动添加的Bug中，如下图所示，测试仅需填写很少的内容就可以创建好一个信息丰富的Bug。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-1/zh/resources/agiletest7.JPG" border="0" width="590" height="505" /></p><p><strong>图7：</strong>信息丰富的Bug<br /></p><h2>实现自动化测试用例&mdash;&mdash;自动化测试用例框架</h2><p>随着需求的不断变化和迭代的深入，代码库不可避免的会有频繁的签入和签出，此时测试人员一项很重要的任务就是要预防回归问题发生。执行手工测试用例可以帮助我们预防及和发现回归问题，但是它的执行效率太低，无法胜任频繁执行的要求。这时就我们需要考虑采用自动化测试用例完成这项工作。决定是否采用自动化测试是有很多因素决定，其中很重要的一条就是自动测试的收益，下面的公式从概念上解释了如何来计算这个收益，当收益值大于1的时候，实施自动化测试就是合算的；否则，就是不合算的。</p><p><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest00.JPG" border="0" width="350" height="74" /></p><p><strong>图1：</strong>计算收益公式</p><p>这其中，开发和维护自动测试的成本是影响这个收益的重要因素，为此VS 2010提供了一整套的解决方案，帮助测试团队减少这部分成本，这包括前面我们所提到的测试计划和用力管理工具，以及后面将会要介绍的生成和实验室管理。此外，Visual Studio 提供了多种测试工程模板，帮助测试人员开发自动化的测试用例，如下图所示。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest8.JPG" border="0" width="569" height="492" /></p><p><strong>图2：</strong>Visual Studio提供的多种测试模板</p><p>这些测试工程模板可以帮助测试自动化工程师，在Visual Studio 集成开发环境中创建和管理单元测试、功能测试、Web性能测试、负载测试等等一系列的自动化测试用例。这其中，编码的UI测试（Coded UI Test，以下简称为CUIT）是首次出现，是VS 2010测试部分一大亮点。测试人员可以通过它使用C#或者 VB.NET语言编写自动化测试用例，从用户界面层驱动Web、Winform或者是WPF的应用。CUIT为测试用例的自动化提供了一个框架、API和可扩展的接口，测试人员可以很轻松地开发出所要的自动化测试用例。其实CUIT背后的测试自动化实现技术对大家并不陌生，下面列出针对Web、WinForm和WPF应用的测试技术基础。对每种技术的支持采用的是插件的形式实现的，VS 2010包括了如下的三种插件：</p><ul><li>Document Object Model（DOM）插件 : IE 7/8 HTML/AJAX </li><li>User Interface Automation（UIA）插件 : WPF </li><li>Microsoft Active Accessibility（MSAA）插件 : Winform，Win32和MFC 。MSAA插件是默认选项，用来支持出其它两者之外的任何应用。 </li></ul><p>CUIT 现在支持主要的微软平台，详细的内容可以参见<a href="http://msdn.microsoft.com/en-us/library/dd380742.aspx"><span style="color: #0b59b2">MSDN : Supported Configuration and Platforms for Coded UI Tests and Action Recordings</span></a>。对于那些尚不支持的平台或者UI控件，CUIT提供了很好的扩展机制，允许大家针对自己的特殊应用进行扩充，下图就是CUIT框架的体系结构图 。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest9.JPG" border="0" width="567" height="384" /></p><p><strong>图3：</strong>CUIT框架的体系结构</p><p>开发自动化测试用例对于有效预防回归问题的出现时非常必要，在实际应用中应该特别注意它的合理比例关系和灵活的策略，包括：自动化用例和手工用例的比例、UI和非UI测试用例的比例关系。自动化测试用例、执行、分析和维护它们都是需要一定投入的，对于敏捷项目而言时间资源的紧缺尤为突出，所以在任何时候团队都要根据自身的资源，有选择性进行测试用例的自动化，通常情况下应该优先自动化那些高优先级的测试用例。</p><p>对于UI和非UI的自动化测试用例而言，应该是以非UI 的单元测试和功能测试为主，UI测试未必要的补充。基于UI自动化测试用例有它独特优点，例如：它从真实用户角度出发进行测试，即涵盖了界面层、逻辑层和数据层，自动化人员不需要了解被测试应用的代码实现细节等；但是相对于非UI测试它也有着先天的不足，包括：执行速度相对比较慢、易受干扰不稳定等。所以在自动化过程中，能用非UI测试覆盖的功能尽可能采用非UI的测试覆盖，如：API单元测试等，UI测试用例只用来实现最基本用户故事的验收测试（Acceptance Test）。</p><h2>早测试和经常测试&mdash;&mdash;封闭签入和滚动生成</h2><p>敏捷开发中最可怕的事情莫过于在迭代最后一两天进行测试，结果发现了严重功能缺陷或者回归缺陷，导致不能按计划发布给用户试用。要想彻底解决这样的问题，一方面要在迭代开发阶段测试人员就要参与进来，从客户的角度出发对功能需求和设计文档进行文档测试，即文档评审。测试人员和开发还有项目经理一起从源头上保障将要实现的功能是用户想要的。另一方面就是要在迭代的早期就开始就开始测试，特别前几个迭代已经实现好的自动化测试用例，尽早的执行它们可以有效地避免回归问题的出现。在TFS 2010上专门提供封闭签入（Gated Check-in）、滚动生成（Rolling Builds）和持续集成（Continuous Integration）等功能，帮助敏捷团队实现早测试和经常测试。这其中封闭签入和滚动生成是对敏捷团队比较实用的功能。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest10.JPG" border="0" width="840" height="410" /></p><p><strong>图4：</strong>选择签入方式</p><p>封闭签入是TFS 2010提供的一种新的代码签入方式，在配置这项功能后，当用户要签入任何代码时，系统会先将用户本地要签入的代码打包成一个搁置集（shelve-set），然后提交到服务器端，TFS生成（Build）服务先从TFS源代码控制器中同步项目的最新代码，再将提交的代码与之进行自动合并，然后进行编译，如果编译成功，则执行配置的自动化测试用例，如果测试用例全部通过则代码会被自动签入到代码库中，否则返回错误信息给用户，代码是不会进入到代码库。表面上看是与产品测试没有直接关系，但实际上它和测试以及最终产品质量的密不可分。因为代码签入是整个开发过程中发生最为频繁的操作，每次签入代码的质量直接影响着日常的开发活动。对于绝大多数的开发团队来说，check in代码前不仅要保证编译通过，同时还要最大限度的保证新代码不会破坏已有的功能，也就是要执行测试用例去验证。Gated Check-in中提到的&ldquo;Build成功&rdquo;，实际上包含两部分内容：编译成功和测试用例执行成功，有了它作为保护代码库的第一道屏障，就可以保证它在任何适合都是可编译，并且达到一定质量标准的。</p><p>滚动生成是在VS 2008种就有的功能，当TFS检测到在它所监控的范围内有任何新的代码变化被签入后，它就启动对最新的代码库进行生成验证，该验证包括编译和运行指定的自动化测试用例。之所以称之为&ldquo;滚动&rdquo;，因为它是在一个生成验证操作完成后再去探测有没有新的签入发生，对这期间发生的所有新签入进行新的生成验证。这里需要再强调一下滚动生成的重要意义：它看似只是一个自动生成代码的功能，但实际上起着协调整个开发团队、时刻监控代码库质量、以及尽早暴露产品问题的作用。因为滚动生成时刻都在不停的运转着，对于任何代码签入它都保持着警觉，会去自动验证编译是否成功，自动化测试用例是否都能通过。它就像一个不知疲倦的&ldquo;代码守护者&rdquo;一样监控着代码库，第一时间发现其中的任何问题，将问题通知给整个团队，从而避免了问题的积累和拖延。这非常符合敏捷开发中&ldquo;今日问题今日解决，不要拖到以后&rdquo;的原则，它帮你最早的发现问题、报告问题，开发团队则应该建立制度要及时响应滚动生成所报告的问题，把它作为Priority 为0或1的高优先级问题去对待和解决。</p><p>封闭签入和滚动生成都是来保护代码库的正确性和产品质量，它们是否在功能上重复反而让我们不敏捷了呢？其实两者并不重复，只是各有侧重，将它们搭配使用才会发挥其最大效能。封闭签入是在代码进入代码库之前进行验证，签入提交者一般希望竟快知道结果，以便决定下一步的工作，所以封闭签入的时间（编译和运行测试用例）不要太长（10-20分钟）。这也就决定了我们加入的测试用例不能太多，只添加那些高优先级的测试用例，保证主要的用户故事不被破坏。滚动生成是在代码签入后在后台执行的，由于不存在着与用户的交互等待，所以它执行时间可以更长（几个小时），可以为它加入更多的测试用例，从而全面验证代码库的质量，一旦有任何问题它可以及时通知团队进行修复，这种验证是在几个小时或者每天都在发生的，保证了敏捷对频繁测试的。</p><h2>完整的自动化测试解决方案&mdash;&mdash;实验室管理</h2><p>在谈到软件自动化测试的时候，很多人会误以为实现了自动化测试用例就是自动化测试，其实不然，自动化测试仅是测试自动化的一个重要步骤，绝对不等同于自动化测试。一个完整的自动化测试应该包括：构建、部署、执行测试用例、分析测试结果并作出结论。在前面的自动测试的收益公式中，我们可以看到减少自动测试的维护成本，是提高自动测试收益的重要因素之一。VS 2010的实验室管理（Lab Management）与测试用例管理、生成管理、源代码控制、工作项管理等功能相结合，为自动化测试提供了这样一个完整的解决方案，目标就是要降低了自动测试的运营和非维护成本，下面这张图展示了实验室环境的系统构架图。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest11.JPG" border="0" width="747" height="453" /></p><p><strong>图5：</strong>实验室环境的系统构架图</p><p>实验室管理功能充分利用了微软的虚拟化技术，包括：Hyper-V和 System Center Virtual Machine Manager （SCVMM），快速创建干净的虚拟测试环境并进行产品生成和部署，然后执行指定的测试用例集，将结果以报表的形式呈现出来，方便对此产品质量进行分析，如下图所示：</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest12.JPG" border="0" width="479" height="366" /></p><p><strong>图6：</strong>虚拟测试环境</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/visual-studio-2010-help-agile-test-2/zh/resources/agiletest13.JPG" border="0" width="476" height="364" /></p><p><strong>图7：</strong>测试结果</p><p>同时，利用虚拟技术的环境快照功能，对于那些难于复现或者环境相关的Bug，利用虚拟环境的快照技术，可以为开发人员准确的复现Bug出现的环境，从而能够快速的进行诊断和及时修复。</p><h2>总结</h2><p>Visual Studio 2010作为Visual Studio系列中一个非常重要的版本，为测试人员和团队提供了一整套解决方案，包括：测试计划和用例管理、创建自动化测试用例、测试用例的自动执行、以及实验室管理等。这些功能强调了测试作为整个软件过程的重要角色的作用，促进了测试人员与其它角色的有效沟通与协作，非常适合于敏捷团队使用来完成测试工作。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/visual/" rel="tag">visual</a> , <a href="http://www.gaobo.info/go.php/tags/studio/" rel="tag">studio</a> , <a href="http://www.gaobo.info/go.php/tags/team/" rel="tag">team</a> , <a href="http://www.gaobo.info/go.php/tags/foundation/" rel="tag">foundation</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%258F%25E6%258D%25B7/" rel="tag">敏捷</a> , <a href="http://www.gaobo.info/go.php/tags/agile/" rel="tag">agile</a> , <a href="http://www.gaobo.info/go.php/tags/test/" rel="tag">test</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BE%25AE%25E8%25BD%25AF/" rel="tag">微软</a> , <a href="http://www.gaobo.info/go.php/tags/microsoft/" rel="tag">microsoft</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/734.htm</link>
<title><![CDATA[今天终于成功整合了ZS、Android、FlashBuilder4，彻底解决“内存不足”“无法加载设计模式”问题]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Sun, 29 Aug 2010 13:18:06 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/734.htm</guid> 
<description>
<![CDATA[ 
	先庆幸一下自己的运气，哇咔咔<br />所用的软件版本：<br />ZendStudio：7.2<br />Android SDK：1.5、1.6、2.1、2.2<br />FlashBuilder：4<br />整合这几个东西按理说不麻烦，先安装ZS，然后按照Android的办法添加SDK什么的，最后下载FlashBuilder for Eclipse的版本，安装后提取出需要的目录并在ZS的设置里添加路径和dropin/Flex.link即可。<br />可是问题就出在这最后一步上，全弄完后新建Flex项目，提示&ldquo;内存不足，无法加载设计模式&rdquo;。搜了很久，大家都是说修改ini配置文件，增大XMS等设置，我这里也试过了，改到1G都还是不行，反而每一次修改都会让FlashBuilder的序列号失效（&hellip;&hellip;），每次都要重新输入新序列号。<br /><br />还好，最最后终于让我找到了<a href="http://hi.baidu.com/zjt34/blog/item/574fd0485b6319fc82025ce8.html" target="_blank">一个办法</a>：<br />首先下载APE.zip，下载地址：<a href="http://www.respua.nl/APE.zip"><a href="http://www.respua.nl/APE.zip" target="_blank">http://www.respua.nl/APE.zip</a></a>； <p>然后解压缩至X:&#92;Program Files&#92;Common Files&#92;Adobe&#92;即可，最后的文件目录是这样子的：</p><p>X:&#92;Program Files&#92;Common Files&#92;Adobe&#92;APE&#92;3.1，该文件夹下有四个dll文件。<br />重启ZS，搞定。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/zend/" rel="tag">zend</a> , <a href="http://www.gaobo.info/go.php/tags/studio/" rel="tag">studio</a> , <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/android/" rel="tag">android</a> , <a href="http://www.gaobo.info/go.php/tags/sdk/" rel="tag">sdk</a> , <a href="http://www.gaobo.info/go.php/tags/flash/" rel="tag">flash</a> , <a href="http://www.gaobo.info/go.php/tags/flex/" rel="tag">flex</a> , <a href="http://www.gaobo.info/go.php/tags/builder/" rel="tag">builder</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%25B4%25E5%2590%2588/" rel="tag">整合</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BC%2580%25E5%258F%2591/" rel="tag">开发</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/733.htm</link>
<title><![CDATA[Zend Studio代码提示工作不正常的解决办法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Sat, 28 Aug 2010 12:32:02 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/733.htm</guid> 
<description>
<![CDATA[ 
	很简单，删除电脑当前用户下这个文件：<br />DefaultWorkspace7/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.dltk.ui.prefs<br />（例如：C:&#92;Users&#92;Administrator&#92;Zend&#92;workspaces&#92;DefaultWorkspace7&#92;.metadata&#92;.plugins&#92;org.eclipse.core.runtime&#92;.settings&#92;org.eclipse.dltk.ui.prefs<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/zend/" rel="tag">zend</a> , <a href="http://www.gaobo.info/go.php/tags/studio/" rel="tag">studio</a> , <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%258F%2590%25E7%25A4%25BA/" rel="tag">提示</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/732.htm</link>
<title><![CDATA[50个非常有用的PHP工具]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Wed, 18 Aug 2010 08:54:56 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/732.htm</guid> 
<description>
<![CDATA[ 
	<h3>调试工具</h3><ul><li><a href="http://code.google.com/p/webgrind/"><span style="color: #006699">Webgrind</span></a> </li><li><a href="http://xdebug.org/index.php"><span style="color: #006699">Xdebug</span></a> </li><li><a href="http://gubed.mccabe.nu/"><span style="color: #006699">Gubed PHP Debugger</span></a> </li><li><a href="http://www.php-debugger.com/dbg/"><span style="color: #006699">DBG</span></a> </li><li><a href="http://www.php-debug.com/www/"><span style="color: #006699">PHP_Debug</span></a> </li><li><a href="http://sourceforge.net/projects/php-dyn/"><span style="color: #006699">PHP_Dyn</span></a> </li><li><a href="http://www.bluestatic.org/software/macgdbp/"><span style="color: #006699">MacGDBp</span></a><br /></li></ul><h3>测试和优化工具</h3><ul><li><a href="http://www.phpunit.de/"><span style="color: #006699">PHPUnit</span></a> </li><li><a href="http://www.simpletest.org/"><span style="color: #006699">SimpleTest</span></a></li><li><a href="http://selenium-rc.openqa.org/"><span style="color: #006699">Selenium</span></a> </li><li><a href="http://matrix.squiz.net/developer/tools/php_cs"><span style="color: #006699">PHP_CodeSniffer</span></a> </li><li><a href="http://dbug.ospinto.com/"><span style="color: #006699">dBug</span></a> </li><li><a href="http://www.coderholic.com/php-profile-class/"><span style="color: #006699">PHP Profile Class</span></a><br /></li></ul><h3>文档工具</h3><ul><li><a href="http://phpdoc.org/"><span style="color: #006699">phpDocumentor</span></a> </li><li><a href="http://phpdox.net/"><span style="color: #006699">PHP DOX</span></a><br /></li></ul><h3>安全工具<br /></h3><ul><li><a href="http://www.phpcaptcha.org/"><span style="color: #006699">Securimage</span></a> ：验证码工具。 </li><li><a href="https://trac.anl.gov/scavenger/wiki/WikiStart"><span style="color: #006699">Scavenger</span></a> </li><li><a href="http://php-ids.org/"><span style="color: #006699">PHP-IDS</span></a> </li><li><a href="http://blog.evaria.com/2007/pixy-the-php-security-scanner/"><span style="color: #006699">Pixy</span></a> ：代码检查工具。<a href="http://www.phpchina.com/html/21/n-16721.html" target="_blank" class="l"></a> </li></ul><h3>图形处理</h3><ul><li><a href="http://www.maani.us/charts4/"><span style="color: #006699">PHP/SWF Charts</span></a> </li><li><a href="http://pchart.sourceforge.net/index.php"><span style="color: #006699">pChart - a chart-drawing PHP library</span></a> </li><li><a href="http://wideimage.sourceforge.net/wiki/MainPage"><span style="color: #006699">WideImage</span></a> </li><li><a href="http://www.magickwand.org/"><span style="color: #006699">MagickWand For PHP</span></a><br /></li></ul><h3>代码优化</h3><ul><li><a href="http://pear.php.net/package/PHP_Beautifier"><span style="color: #006699">PHP_Beautifier</span></a> </li><li><a href="http://www.waterproof.fr/products/phpCodeBeautifier/"><span style="color: #006699">PHPCodeBeautifier</span></a> </li><li><a href="http://qbnz.com/highlighter/"><span style="color: #006699">GeSHi - Generic Syntax Highlighter</span></a><br /></li></ul><h3>版本控制系统</h3><ul><li><a href="http://phing.info/trac/"><span style="color: #006699">Phing</span></a> </li><li><a href="http://code.google.com/p/xinc/"><span style="color: #006699">xinc</span></a><br /></li></ul><h3>有用的拓展，使用工具和类</h3><ul><li><a href="http://simplepie.org/"><span style="color: #006699">SimplePie</span></a> ：PHP RSS 解析程序 </li><li><a href="http://htmlpurifier.org/"><span style="color: #006699">HTML Purifier</span></a> ：可以用来移除所有恶意代码(XSS)，而且还能确保你的页面遵循W3C的标准规范。 </li><li><a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf"><span style="color: #006699">TCPDF</span></a> ：一个用于快速生成PDF文件的PHP5函数包。 </li><li><a href="http://www.jonasjohn.de/lab/htmlsql.htm"><span style="color: #006699">htmlSQL</span></a> ：一个是你可以方便的对HTML和XML内容方便的使用类似SQL语句进行检索的PHP类。 </li><li><a href="http://searchlightdigital.com/the-greatest-php-snippet-file-ever-using-quicktext-for-notepad"><span style="color: #006699">The Greatest PHP Snippet File Ever (Using Quicktext for Notepad++)</span></a> </li><li><a href="http://creole.phpdb.org/trac/"><span style="color: #006699">Creole</span></a> ：用PHP5编写， 是一个基于真正意义的OO的层，API接口以JDBC为基础。 </li><li><a href="http://www.codeplex.com/PHPLinq"><span style="color: #006699">PHPLinq</span></a> ：<span class="l">用SQL语法操作PHP数组。</span> </li><li><a href="http://www.xm1math.net/phpmathpublisher/"><span style="color: #006699">PHPMathPublisher</span></a>：作者是一位法国中学数学老师。 </li><li><a href="http://www.phpmyadmin.net/home_page/index.php"><span style="color: #006699">phpMyAdmin</span></a> ：可以通过互联网在线控制和操作MySQL。 </li><li><a href="http://www.codeplex.com/PHPExcel"><span style="color: #006699">PHPExcel</span></a> ：相当强大的MS Office Excel 文档生成类库。 </li><li><a href="http://p.horm.org/er/"><span style="color: #006699">Phormer</span></a> :一个轻量级，强大的PHP在线相册。 </li><li><a href="http://www.xajaxproject.org/"><span style="color: #006699">xajax PHP Class Library</span></a> :一个开源的<em>PHP</em> 类库，用来构建WEB上的<em>Ajax</em> 程序。 </li><li><a href="http://phpuserclass.com/"><span style="color: #006699">PHP User Class</span></a> ：用户管理。 </li><li><a href="http://gtk.php.net/"><span style="color: #006699">PHP-GTK</span></a> ：为了证明PHP是一种远远超越网络应用程序的有效的工具而开发的。使用<em>PHP-GTK</em>你可以建立独立的GUI（用户图形界面）应用程序。<br /></li></ul><h3>在线工具和资源 </h3><ul><li><a href="http://code.google.com/p/minify/"><span style="color: #006699">Minify!</span></a> ：使用 PHP5 开发的用于合并压缩 js/css 文件的应用程序。合并压缩之后的结果可通过 HTTP gzip/deflate 及一些相关头，优化客户端缓存。 </li><li><a href="http://en.dklab.ru/lib/HTTP_StaticMerger/"><span style="color: #006699">HTTP_StaticMerger</span></a>：自动&ldquo;合并&rdquo;CSS和JavaScript文件。 </li><li><a href="http://www.phpobjectgenerator.com/"><span style="color: #006699">PHP Object Generator</span></a> ：一个开源的<em>PHP</em>代码生成器。它能够为你的PHP4/<em>PHP5</em>应用程序生成简洁和可测试的面向对象代码。 </li><li><a href="http://www.gotapi.com/php"><span style="color: #006699">gotAPI/PHP</span></a> </li><li><a href="http://www.koders.com/"><span style="color: #006699">koders</span></a> :开放源代码搜索。 </li><li><a href="http://pecl.php.net/"><span style="color: #006699">PECL</span></a> ：含有PHP 开发组提供的不同扩展库的信息。<br /></li></ul><h3>浏览器中的工具（Firefox插件）</h3><ul><li><a href="http://www.firephp.org/"><span style="color: #006699">FirePHP</span></a> ：是基于<a href="http://www.ooso.net/index.php/archives/294"><span style="color: #006699">Firebug</span></a>的一个扩展，可以用来在Firebug的console中方便的输出php的调试信息又不影响php程序的正常运行。 </li><li><a href="http://phplangeditor.mozdev.org/"><span style="color: #006699">phpLangEditor</span></a> ：是一个用来翻译各种PHP变数的工具. </li><li><a href="https://addons.mozilla.org/en-US/firefox/addon/3505"><span style="color: #006699">PHP Lookup</span></a> :是一个内置的搜索栏，以帮助您快速查找引用的PHP语法。 </li><li><a href="https://addons.mozilla.org/en-US/firefox/addon/8984"><span style="color: #006699">PHP Manual Search</span></a> ：一个方便的搜索栏，从您的Web浏览器中<a href="http://www.php.net/docs.php"><span style="color: #006699">搜索官方PHP文档</span></a>。<br /></li></ul><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/tool/" rel="tag">tool</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B7%25A5%25E5%2585%25B7/" rel="tag">工具</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/731.htm</link>
<title><![CDATA[FreeWheel创始人/CTO于晶纯访谈:具备大局观方能洞若观火]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Wed, 18 Aug 2010 06:16:36 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/731.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-size: small">于晶纯（Diane&nbsp;Yu）女士早年曾在在线广告巨头DoubleClick工作，勤奋努力使她突破了&ldquo;亚裔+女性&rdquo;的&ldquo;职业玻璃天花板&rdquo;，成为高级技术管理者。然而却在Google收购DoubleClick之际选择了毅然离开，与几位朋友共同创立了FreeWheel公司，致力于在线视频内容的盈利价值链平台。于女士之前曾为《程序员》杂志撰文，讲述了她从程序员到CTO十年间的人生历程。对于开发者所需要具备的五项软实力之一&mdash;&mdash;大局观，她又有着怎样的感悟呢，我们一同来聆听。</span> <p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: small"></span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">大局观就是向前看一步 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：就开发者的三个层面（程序员、项目经理、CTO）来说，您怎么理解大局观？</span><span style="font-size: 10.5pt"> </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：对于大局观的含义，我是这样理解的：很多时候，对于处在不同岗位的程序员、项目经理或者&nbsp;CTO，如果总以固定的视角看待问题，就容易为日常事务所羁绊，难以在基础之上更进一步。倘若能立足于更高点，以别人的角度审视问题，就能获得全方位的视角，总揽全局。因此，我认为大局观实际上就是向前看一步。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">以程序员来说，他们的任务是负责编写程序。再向前看一步，就是要从管理者的角度看待问题，从这一点出发，不仅要求把程序写正确，还要尽量清晰，能让管理者明白自己的意图。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">对于项目经理，他们的首要任务是把正在进行的项目完成好。向前看一步就要求他们能够时时了解自己负责的项目处在公司的哪个位置，为何要在这个阶段进行，完成项目以后又希望取得怎样的结果。对项目经理的需求不仅仅是把产品做好，还要能在正确的时间把产品做对。产品再好，投入的精力再多，假使没有在正确的时间投入市场，都是无济于事。</span><span style="font-size: 10.5pt"> </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">从&nbsp;CTO&nbsp;的角度来讲，意味着他的工作是围绕着与技术相关的产品所进行的运营和研发。向前看一步就需要站在CEO&nbsp;的位置，从整个市场的角度看待问题。因为&nbsp;CTO&nbsp;的职责需要他能够帮助&nbsp;CEO&nbsp;规划产品的方向，从而为公司带来利润。这一点对&nbsp;CTO&nbsp;来说尤为重要，因为仅仅以他所在角度看来微不足道的小麻烦，也有可能会成为影响公司整体运营的大问题。常常站在&nbsp;CEO&nbsp;的角度，能够帮助他在日常事务中做出正确的决策或者发现看似细微实则致命的问题。无论公司大小，我建议每位CTO&nbsp;都学习一些基础会计知识，只有如此，才能够讲&nbsp;CEO&nbsp;的语言。</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">面对复杂形势，具备大局观方能洞若观火 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：在您的职场生涯中，先后换过无数老板，哪个老板的&ldquo;大局观&rdquo;给你留下深刻的印象？</span><span style="font-size: 10.5pt"> </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：我在&nbsp;DoubleClick&nbsp;工作9年，先后与11位老板共事，其中最后一个老板&nbsp;Greg&mdash;&mdash;DoubleClick的&nbsp;CIO，给我留下的印象最为深刻。那是在2005年，公司正陷入了产品进度落后的泥潭。为了解决这个难题，公司高层希望采用敏捷开发的办法。然而当时的情况是，偌大一个公司，600多人的技术团队，完全没有敏捷开发的经验。一旦失败，公司必将面临更大的风险。因此，多数人建议先用一个小团队实验，如果方案可行，再逐步推广到全公司；如果失败，对公司的整体影响也不是很大。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">然而&nbsp;Greg&nbsp;则坚持让所有人从一开始就采用敏捷开发。他的观点是：首先，若要在最短时间内见到成效，就需要全体成员相互信任，一同努力。因为我们的时间紧迫，即使这个小团队成效显著，对公司整体来说也收效甚微。其次，由于团队间存在依赖性，一支团队也还需要来自其他方面的支持，如果其他团队不采用敏捷开发，这仅有的一支团队也必然受到严重制约，进度必然缓慢。再次，他觉得如果认定一件事，就应该全力以赴去做，稍一犹豫，整体计划或许就会延后半年以上，而市场是不等人的。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">当时我们听到这些话也是将信将疑，然而接下来事实证明了&nbsp;Greg&nbsp;的观点完全正确。我们在敏捷开发的推进上速度飞快，而且由于声势浩大，成为全公司的焦点，进而得到&nbsp;CEO&nbsp;的支持。有了最高层的支持，全公司的其他事务也围绕着我们敏捷开发的步调随之转变，从侧面上也推动了我们敏捷开发的进程。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：您觉得从&nbsp;Greg&nbsp;身上学到了什么？</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：这件事让我从&nbsp;Greg&nbsp;身上看到：如果认定要做，就要把它做得轰轰烈烈，不能患得患失；还有，要讲究配合。这也就要求策略的制定者要站在更高的角度看待问题，只有向前一步，站在&nbsp;CEO&nbsp;的位置上，才能明白这些措施并非心血来潮、铤而走险。</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">以大局观看待职业的选择 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：您在&nbsp;DoubleClick&nbsp;工作时，曾只用两个星期便完成了&nbsp;DART&nbsp;平台的关键字预测功能，并赢得了&nbsp;Lycos&nbsp;价值百万美金的订单，请问您是如何做到这一点的？</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：其实我并不认为自己是一名有多么了不起的程序员，我觉得每个人只要有信心、敢于面对挑战都能做得到。唯一的不同可能在于挑战来临之前，我自己的工作完成得非常认真，每一个角落都没放过。所以，当机会到来的时候，我只不过是伸手去抓住而已。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">每个清早，睁开眼睛，想到上班，我就会笑，我的先生也觉得奇怪。为什么会这样兴奋呢？因为我爱这份工作，这份热爱使我在每时每刻都努力做到最好。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">之所以有信心能在两周内完成这项复杂的工作，是因为我对整个系统特别了解。我心里明白，这件事我做得到，只是会很辛苦。如果没有对工作的热爱，就无法做到了解系统的每个细微之处，自然也不会有信心完成艰巨的任务。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：您放弃高额的分红离开&nbsp;DoubleClick&nbsp;，创立&nbsp;FreeWheel，请问主导您整个职业发展生涯&ldquo;大局&rdquo;的核心价值是什么？</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：对我来说，职业正确的标准在于是否学到了新的知识，是否接受了新的挑战。如果仍在重复自己以前做过的事情，原地踏步，实际上对我来说并没有任何意义。回顾自己的职业生涯，我觉得没有白白浪费这许多年的时光，衡量浪费的一个标准便是我是否学到了新内容，是否完成了之前不敢想象的事业。我从程序员一路走到&nbsp;CTO，虽然大多数时间都在&nbsp;DoubleClick，然而对我来说几乎等同于每两年就换了一次工作。我意识到，假如我随着DoubleClick&nbsp;进入&nbsp;Google，两年以后我仍会是一名团队管理者，也许这个团队的成员会增加许多，但作为管理者，我每天的事务并不会有太大不同。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">然而，创办一家新公司，却让我站在了全新的高度。虽然管理的职员减少，但挑战大大增加。此外，作为公司CTO，作为公司的合伙创始人，不单单需要考虑如何将产品开发出来，还要思索如何让产品在市场中得到认可，乃至创立一个全新的品牌，对于&nbsp;CTO来说，实际上也是向前看一步。这些挑战都是&nbsp;Google&nbsp;无法给予的，因为站在&nbsp;Google&nbsp;舞台上的表演无非是锦上添花。两年之后，我们所有的成功都证明了当时那个&ldquo;不可思议&rdquo;的决定，对于我个人来说是一个多么正确的选择。</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">从程序员到管理者的成长历程 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：当您首次从普通程序员晋升为团队管理者，您觉得所面临的最大变化是什么？</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：从普通程序员成长为团队的管理者是技术人员常常会面临的重大转型。对于技术人员和管理者来说，衡量他们是否成功的标准相差很多。作为技术人员，如果大家看到任何事情都由一人完成，这便是他最大的成功；然而作为团队领袖，要和他的团队一起进步&mdash;&mdash;使稚嫩的成员逐渐成熟，让所有人各尽所能、扬长避短，通过分工合作，最终使每件任务都能高效率地完成。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：记得当您刚接手DoubleClick&nbsp;的芝加哥研发中心的团队时，开始团队成员普遍对您抱着不信任、质疑的态度。在那样的情况下，对于团队管理，首先需要解决哪些问题？</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：起初那里的员工们对我并不友好，然而最终我实现了彼此的团结一致。之所以能做到这点，首先在于我为团队成员描绘一个大家认同的前景，使得所有成员有了共同努力的方向。其次，就是我尽可能地去了解每一个人，只有如此，才能和成员之间建立情感的纽带。尽管我并不编写代码，但我会阅读每位成员所写的代码，并和每位成员聊天。</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">培养管理者的大局观，实践和生活是老师</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">记者：您曾经培养了无数IT管理者，您是如何向他们灌输&ldquo;大局观&rdquo;的理念的？</span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">于晶纯：任何理念都不只是口头一说，我带团队的一个主要特色就是寻找做实事的人才，并且通过言传身教来感染他。因为任何观念的传达都不能仅凭几次会议就能实现，而是要靠实践一点一滴积累起来。通过一次次手把手地教，一回回参与集体讨论。尽管很辛苦，但只有如此实践才能真正将大局观传达给每一位同事，并使他们理解和接受。为什么许多人读过管理著作却成不了好的管理者呢？原因就在其中。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">另外，对于一个管理者，不能因为仅仅具备高学历就高枕无忧，因为无数的管理经验都来源于身边的点滴。&ldquo;三人行，必有我师&rdquo;也是这个道理。通过观察身边的人和事，不仅要留意好的一面，努力学习。还要看到不好的一面，因为旁人失败的经历往往会告诉我们如何避免同样的错误。其实生活就是我们的老师。 </span></p><p style="text-align: justify; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 9pt">（本文来自《程序员》杂志10年0</span><span style="font-size: 9pt">1</span><span style="font-size: 9pt">期）</span></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/freewheel/" rel="tag">freewheel</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25A8%258B%25E5%25BA%258F%25E5%2591%2598/" rel="tag">程序员</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25A4%25A7%25E5%25B1%2580%25E8%25A7%2582/" rel="tag">大局观</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/730.htm</link>
<title><![CDATA[社交网数据库技术分析]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Wed, 18 Aug 2010 06:12:17 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/730.htm</guid> 
<description>
<![CDATA[ 
	<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">传统互联网正在迈向一个全新的时代<span style="font-family: Times New Roman">&mdash;&mdash;</span><span>社交服务网（</span><span style="font-family: Times New Roman">Social&nbsp;Networking&nbsp;Service</span><span>）时代，从</span><span style="font-family: Times New Roman">&ldquo;</span><span>人与机器</span><span style="font-family: Times New Roman">&rdquo;</span><span>的时代迈向</span><span style="font-family: Times New Roman">&ldquo;</span><span>人与人</span><span style="font-family: Times New Roman">&rdquo;</span><span>的时代。互联网社交服务网站的发展验证了</span><span style="font-family: Times New Roman">&ldquo;</span><span>六度分隔理论</span><span style="font-family: Times New Roman">&rdquo;</span><span>（</span><span style="font-family: Times New Roman">Six&nbsp;Degrees&nbsp;of&nbsp;Separation</span><span>），即</span><span style="font-family: Times New Roman">&ldquo;</span><span>人际关系脉络方面你必然可以通过不超出六位中间人间接与世上任意先生女士相识</span><span style="font-family: Times New Roman">&rdquo;</span><span>。个体的社交圈会不断地扩大和重叠并最终形成大的社交网络。无论是国外的</span><span style="font-family: Times New Roman">Facebook</span><span>、</span><span style="font-family: Times New Roman">MySpace</span><span>、</span><span style="font-family: Times New Roman">Twitter</span><span>，还是国内的开心网、人人网等都一头扎进社交网，因为他们认定社交网必然掀起新一轮的互联网革命。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">社交网的一个显著特点是支持巨大用户数，例如<span style="font-family: Times New Roman">Facebook</span><span>支持超过</span><span style="font-family: Times New Roman">3</span><span>亿的用户，其数据中心运行着超过万台的服务器，为遍布全球的用户提供信息通讯服务。另外，任何两个社交网用户都可能交互，也就是必须支持任何两个数据库用户的数据关联操作。这对于服务端的数据库管理提出了极大的挑战。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">关系数据库与<span style="font-family: Times New Roman">NoSQL </span><span>数据库 </span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">关系数据库使用者遵循一些数据库范式，这些范式是数据库设计中的一系列原理和技术，目的是为了减少数据库中数据冗余和增进数据的一致性。结构化查询语言<span style="font-family: Times New Roman">SQL</span><span>大量使用多表连接操作，</span><span style="font-family: Times New Roman">SQL</span><span>的通用性可以为使用者带来很多方便。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">随着越来越多大规模工作负荷应用的发行，对可伸缩性的需求，可能会变得非常迅速和无比庞大。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">关系数据库的确能伸缩自如，但通常只能在单台服务器节点上进行。例如采用表分区技术，一个表格可以由多个物理文件组成，虽然表格的容量增大了，但该表格仍然只能由一数据库引擎管理；另外增加一物理文件时，表格<span style="font-family: Times New Roman">Schema</span><span>得做改动，也就是还不能支持动态扩容。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">一旦单节点的能力抵达上限，就得通过多服务器节点来扩展来分发负载。这时关系数据库的复杂性就开始影响其潜在的扩展规模了。<span style="font-family: Times New Roman">RDBMS</span><span>支持分区视图（</span><span style="font-family: Times New Roman">Partition&nbsp;View</span><span>）&nbsp;技术，也就是支持联邦数据库（</span><span style="font-family: Times New Roman">Federated&nbsp;Database</span><span>）（如图</span><span style="font-family: Times New Roman">1</span><span>）。一个分区视图可以由多个分布在不同数据库节点服务器上的表格组合而成，数据库用户看到的只是该视图，不必关心物理表格。通过数据水平分割技术，分区视图把负载分担到多个数据库节点服务器上。扩容时，该方法除了需改动视图定义外，分区视图成为分布式数据库系统的中心，存在单点故障问题。另外，跨数据库节点之间多表格间连接操作的支持出现极大困难。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br /></span></p><div style="width: 310px"><a href="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-1.gif" target="_blank"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-1-300x149.gif" border="0" alt="图1&nbsp;&nbsp;IBM联邦数据库的体系结构" title="技术-1" width="300" height="149" /></a> <p>图1 IBM联邦数据库的体系结构</p></div><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">当试图扩展数据库系统到成百上千个节点时，将导致不堪复杂性之重负，这一特点使得<span style="font-family: Times New Roman">RDBMS</span><span>在大型分布式系统平台市场里的生存能力被大幅削减。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">为了能向客户提供一个伸缩自如的空间存放应用数据，供应商实际上只有一种真正的选择<span style="font-family: Times New Roman">&mdash;&mdash;</span><span>实现一种新型的专注于可扩展性的数据库系统，而牺牲掉关系数据库所带来的其他好处。</span><span style="font-family: Times New Roman">NoSQL</span><span>是非关系型数据存储的广义定义，它打破了长久以来关系型数据库与</span><span style="font-family: Times New Roman">ACID</span><span>理论大一统的局面。</span><span style="font-family: Times New Roman">NoSQL</span><span>数据存储不需要固定的表结构，通常也不存在连接操作，在超大型数据存取上具备关系型数据库无法比拟的性能优势。该术语在</span><span style="font-family: Times New Roman">2009 </span><span>年初得到了广泛认同，其中</span><span style="font-family: Times New Roman">Key-Value</span><span>数据模型是解决大型数据库系统扩充问题的一种可行的解决方案。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">Berkeley&nbsp;DB&nbsp;Key-Value<span>数据模型</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Berkeley&nbsp;DB<span>是一种支持</span><span style="font-family: Times New Roman">Key-Value</span><span>数据模型的嵌入式数据库存储引擎。它不支持</span><span style="font-family: Times New Roman">Client/Server</span><span>网络访问方式，程序通过进程内的</span><span style="font-family: Times New Roman">API</span><span>访问数据库，不支持</span><span style="font-family: Times New Roman">SQL</span><span>或者其他数据库查询语言，不支持表结构和数据列。访问数据库的程序自主决定数据如何储存在记录里，一条记录由一个称为键（</span><span style="font-family: Times New Roman">Key</span><span>）的数据块和一个称为值（</span><span style="font-family: Times New Roman">Value</span><span>）的数据块组成。</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>不对记录里的数据进行任何包装。应用程序可通过回调函数来定义不同键之间的大小关系，记录和它的键都可以达到</span><span style="font-family: Times New Roman">4GB</span><span>的长度。尽管架构简单，</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>却支持很多高级的数据库特性，比如</span><span style="font-family: Times New Roman">ACID </span><span>数据库事务处理、细粒度锁、 </span><span style="font-family: Times New Roman">XA</span><span>接口、热备份以及同步复制。</span><span style="font-family: Times New Roman">Berkley&nbsp;DB</span><span>为不同用户提供多种功能集（</span><span style="font-family: Times New Roman">Feature&nbsp;Set</span><span>）：支持单个写线程的数据存储（</span><span style="font-family: Times New Roman">Data&nbsp;Store</span><span>）；支持多并发写线程的并发数据存储（</span><span style="font-family: Times New Roman">Concurrent&nbsp;Data&nbsp;Store</span><span>）；支持</span><span style="font-family: Times New Roman">ACID</span><span>和灾难恢复的事务数据存储（</span><span style="font-family: Times New Roman">Transactional&nbsp;Data&nbsp;Store</span><span>）；通过复制支持容错的高可靠数据存储（</span><span style="font-family: Times New Roman">High&nbsp;Availability</span><span>）。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">关系数据库系统由存储引擎和关系引擎两个独立部分组成。存储引擎负责记录存储、索引和事务处理，关系引擎负责基于存储引擎提供的服务，分析<span style="font-family: Times New Roman">SQL</span><span>、制定查询执行计划等。</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>是一种存储引擎。例如</span><span style="font-family: Times New Roman">MySQL</span><span>数据库可采用</span><span style="font-family: Times New Roman">MyISAM</span><span>、</span><span style="font-family: Times New Roman">InnoDB</span><span>、</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>等存储引擎，如图</span><span style="font-family: Times New Roman">2</span><span>所示。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br /></span></p><div style="width: 310px"><a href="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-2.gif" target="_blank"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-2-300x165.gif" border="0" alt="图2&nbsp;&nbsp;MySQL使用的不同的存储引擎" title="技术-2" width="300" height="165" /></a> <p>图2 MySQL使用的不同的存储引擎</p></div><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Berkeley&nbsp;DB<span>支持平衡树（</span><span style="font-family: Times New Roman">BTree</span><span>）、哈希（</span><span style="font-family: Times New Roman">Hash</span><span>）、队列（</span><span style="font-family: Times New Roman">Queue</span><span>）和记录（</span><span style="font-family: Times New Roman">Record</span><span>）等数据集存储和索引方式，还支持根据</span><span style="font-family: Times New Roman">Key-Value</span><span>中的</span><span style="font-family: Times New Roman">Key</span><span>创建集群索引（</span><span style="font-family: Times New Roman">Clustered&nbsp;Index</span><span>）。这样记录集的物理次序就根据</span><span style="font-family: Times New Roman">Key</span><span>值大小来排列。如果要查询结果记录集的键值为给定的一个范围，该特性对于支持这种类型的快速查询起了很大作用。</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>的一个</span><span style="font-family: Times New Roman">Key-Value</span><span>记录集称为一个数据库，会存储在一个单独文件中。</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>通过创建辅助数据库（</span><span style="font-family: Times New Roman">Secondary&nbsp;Database</span><span>），允许对记录集建立非集群索引（</span><span style="font-family: Times New Roman">Non-Clustered&nbsp;Index</span><span>）。非集群索引适用于快速查询结果为一条记录，该记录的键值为给定的一个值。例如社交网用户数据集：</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="letter-spacing: -0.15pt; color: #000000; font-size: 9pt">User&nbsp;&lt;UID,&nbsp;First_Name,&nbsp;Last_Name,&nbsp;Icon,&nbsp;E-mail&gt;</span><span style="color: #000000; font-size: 9pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果以<span style="font-family: Times New Roman">UID</span><span>作为主数据库的键，其他字段作为主数据库的值，可再创建一个辅助数据库，以</span><span style="font-family: Times New Roman">E-mail</span><span>作为辅助数据库的键，辅助数据库的值为</span><span style="font-family: Times New Roman">E-mail</span><span>所对应的</span><span style="font-family: Times New Roman">UID</span><span>，也就是指向主数据库记录的指针。若在一个</span><span style="font-family: Times New Roman">Key-Value</span><span>数据库查询，一般可根据查询条件创建成一个键值，引擎返回一个游标（</span><span style="font-family: Times New Roman">Cursor</span><span>），该游标指向等于或大于该键值的结果数据集。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">不难看出<span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>使用的索引技术与</span><span style="font-family: Times New Roman">SQL&nbsp;Server</span><span>、</span><span style="font-family: Times New Roman">Oracle</span><span>等高端数据库系统是一样的。</span><span style="font-family: Times New Roman">RDBMS</span><span>中经常使用的表格连接操作，在</span><span style="font-family: Times New Roman">Berkeley&nbsp;DB </span><span>中不再支持，需要应用程序去实现两个数据集的连接操作。这是</span><span style="font-family: Times New Roman">Key-Value</span><span>数据模型与关系数据模型典型的区别。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Berkeley&nbsp;DB&nbsp;<span>除了作为</span><span style="font-family: Times New Roman">MySQL</span><span>的存储引擎之外，还应用在</span><span style="font-family: Times New Roman">OpenLDAP</span><span>、</span><span style="font-family: Times New Roman">MemCache</span><span>等知名软件。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">与<span style="font-family: Times New Roman">Berkeley&nbsp;DB</span><span>类似的数据库引擎还有</span><span style="font-family: Times New Roman">Tokyo&nbsp;Cabinet/&nbsp;Tyrant</span><span>等。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">社交网数据库系统<span style="font-family: Times New Roman">Cassandra </span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">以<span style="font-family: Times New Roman">Facebook</span><span>用户数据集为例，不可能把</span><span style="font-family: Times New Roman">3</span><span>亿条数据集存放在同一个表格、文件或由同一台计算机处理，这要求系统能支持数据分区，把数据集分割在多台节点计算机中，每台计算机分担一部分负载，当用户增加到一定程度时，系统能允许加入新的节点计算机，并且尽可能地减少数据迁移。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">2007<span>年</span><span style="font-family: Times New Roman">10</span><span>月</span><span style="font-family: Times New Roman">30</span><span>日，</span><span style="font-family: Times New Roman">Amazon</span><span>的</span><span style="font-family: Times New Roman">CTO&nbsp;Werner&nbsp;Vogels</span><span>发表了一篇文章，讨论了一种基于</span><span style="font-family: Times New Roman">Key-Value</span><span>数据模型的存储系统</span><span style="font-family: Times New Roman">Dynamo</span><span>。该系统支撑了不少</span><span style="font-family: Times New Roman">Amazon</span><span>的面向电子商务等关键性应用，它采用的存储引擎是 </span><span style="font-family: Times New Roman">Berkeley&nbsp;DB </span><span>事务数据存储（</span><span style="font-family: Times New Roman">Transactional&nbsp;Data&nbsp;Store</span><span>）。</span><span style="font-family: Times New Roman">Dynamo</span><span>系统主要为存储</span><span style="font-family: Times New Roman">1M</span><span>左右甚至更小的内容，如购物车、推荐列表等。</span><span style="font-family: Times New Roman">Dynamo</span><span>设计上有下面一些特点。</span></span></p><ul><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>通过数据分区复制来支持高可靠性与高可伸缩性。</span></span></li><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>始终可写。</span></span></li><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>一致性与写入速度的折中，不要求同步写入所有副本。</span></span></li><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>对称，完全去中心化，人工管理工作很小。</span></span></li></ul><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Cassandra&nbsp;DB<span>最初由</span><span style="font-family: Times New Roman">Facebook</span><span>开发，后来转变成为开源项目。它是一个为网络社交云计算设计的数据库，主要特点是它不再是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对</span><span style="font-family: Times New Roman">Cassandra </span><span>的一个写操作会被复制到其他节点上去，对</span><span style="font-family: Times New Roman">Cassandra</span><span>的读操作也会被路由到某个节点上面去读取。对于</span><span style="font-family: Times New Roman">Cassandra</span><span>群集来说，扩展性能是比较简单的事情，只管在群集里面添加节点就可以了。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Cassandra<span>的用户包括</span><span style="font-family: Times New Roman">Facebook</span><span>、</span><span style="font-family: Times New Roman">Twitter</span><span>和</span><span style="font-family: Times New Roman">Digg</span><span>等。</span><span style="font-family: Times New Roman">Digg</span><span>工程副总裁</span><span style="font-family: Times New Roman">John&nbsp;Quinn</span><span>说：</span><span style="font-family: Times New Roman">&ldquo;Cassandra</span><span>采用完全分散的模式，每个节点都一样，不会出现单点故障。它的容错率也非常高，数据可以被复制到数据中心的多个节点中。它还非常具有弹性，随着新设备的加入，其读写吞吐量将呈线性增加。</span><span style="font-family: Times New Roman">&rdquo;</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Cassandra<span>以</span><span style="font-family: Times New Roman">Amazon</span><span>专有的完全分布式的 </span><span style="font-family: Times New Roman">Dynamo</span><span>为基础，结合了</span><span style="font-family: Times New Roman">Google&nbsp;BigTable</span><span>基于列族（</span><span style="font-family: Times New Roman">Column&nbsp;Family</span><span>）的数据模型。</span><span style="font-family: Times New Roman">P2P</span><span>去中心化的存储。很多方面都可以称之为</span><span style="font-family: Times New Roman">Dynamo&nbsp;2.0</span><span>。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">图<span style="font-family: Times New Roman">3</span><span>为</span><span style="font-family: Times New Roman">Cassandra</span><span>、</span><span style="font-family: Times New Roman">Dynamo</span><span>、</span><span style="font-family: Times New Roman">Key-Value</span><span>之间的关系及在社交网上的应用。箭头表示依赖关系。</span></span></p><div style="width: 310px"><a href="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-3.gif" target="_blank"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-3-300x263.gif" border="0" alt="图3&nbsp;&nbsp;Cassandra、Dynamo、Key-Value关系图" title="技术-3" width="300" height="263" /></a> <p>图3 Cassandra、Dynamo、Key-Value关系图</p></div><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">分布式存储系统<span style="font-family: Times New Roman">Dynamo</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Dynamo<span>采用</span><span style="font-family: Times New Roman">Consistent&nbsp;Hashing</span><span>算法来实现数据分区。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Consistent&nbsp;Hashing<span>基本原理是：首先求出服务器节点的哈希值，并将其配置到</span><span style="font-family: Times New Roman">0</span><span>～</span><span style="font-family: Times New Roman">2^32</span><span>的圆上。然后用同样的方法求出存储数据的键的哈希值，并映射到圆上。再从数据映射到的位置开始顺时针查找，将数据保存到找到的第一个服务器上。如果超过</span><span style="font-family: Times New Roman">2^32</span><span>仍然找不到服务器，就会保存到第一台服务器上。如图</span><span style="font-family: Times New Roman">4</span><span>所示。</span></span></p><div style="width: 310px"><a href="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-4.gif" target="_blank"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-4-300x235.gif" border="0" alt="图4 数据分割到4个节点数据库" title="技术-4" width="300" height="235" /></a> <p>图4 数据分割到4个节点数据库</p></div><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果添加一台服务器。只有在圆上，增加服务器的地点逆时针方向的第一台服务器上的部分数据需要迁移到新的节点数据库。如图<span style="font-family: Times New Roman">5</span><span>所示。</span></span></p><div style="width: 310px"><a href="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-5.gif" target="_blank"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/07/%E6%8A%80%E6%9C%AF-5-300x254.gif" border="0" alt="图5 添加Node5后需要迁移的数据" title="技术-5" width="300" height="254" /></a> <p>图5 添加Node5后需要迁移的数据</p></div><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">数据分区后，数据块被复制到<span style="font-family: Times New Roman">N</span><span>个节点上。复制时因为更新产生的一致性问题的维护采取类似拜占庭容错</span><span style="font-family: Times New Roman">Quorum</span><span>协议（</span><span style="font-family: Times New Roman">Byzantine&nbsp;Fault-tolerance&nbsp;Quorum</span><span>）的机制以及去中心化的复制同步协议。当一个存储节点被认为是拜占庭节点时，它的行为可能任意偏移，表现在：拒绝响应请求、发送错误消息、存储错误信息。</span><span style="font-family: Times New Roman">Quorum</span><span>协议中除了</span><span style="font-family: Times New Roman">N</span><span>之外还有两个关键参数：</span><span style="font-family: Times New Roman">R</span><span>与</span><span style="font-family: Times New Roman">W</span><span>。</span><span style="font-family: Times New Roman">R</span><span>代表一次成功的读取操作中最小参与节点数量，</span><span style="font-family: Times New Roman">W</span><span>代表一次成功的写操作中最小参与节点数量。</span><span style="font-family: Times New Roman">R</span><span>和</span><span style="font-family: Times New Roman">W</span><span>直接影响性能、一致性。</span><span style="font-family: Times New Roman">R </span><span>和 </span><span style="font-family: Times New Roman">W </span><span>值过小则影响一致性，过大则影响效率，这两个值要平衡。如果</span><span style="font-family: Times New Roman">W</span><span>设置为</span><span style="font-family: Times New Roman">1</span><span>，则一个实例中只要有一个节点可写就写成功，不会影响写效率；如果</span><span style="font-family: Times New Roman">R</span><span>设置为</span><span style="font-family: Times New Roman">1</span><span>，只要有一个节点可读，就读成功，不会影响读效率。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">Facebook<span>数据库查询语言：</span><span style="font-family: Times New Roman">FQL</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Facebook<span>为开发者提供一套和</span><span style="font-family: Times New Roman">SQL</span><span>风格一致的数据库查询语言，称为</span><span style="font-family: Times New Roman">Facebook&nbsp;Query&nbsp;Language </span><span>（</span><span style="font-family: Times New Roman">FQL</span><span>）。</span><span style="font-family: Times New Roman">FQL</span><span>是一种基于列的数据查询语言。提供丰富的条件查询，甚至包括子查询。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">例如，以下<span style="font-family: Times New Roman">FQL</span><span>查询已安装</span><span style="font-family: Times New Roman">Facebook</span><span>应用程序的用户</span><span style="font-family: Times New Roman">$app_user</span><span>的好友</span><span style="font-family: Times New Roman">ID</span><span>集合：</span></span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">SELECT&nbsp;uid&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;is_app_user&nbsp;=&nbsp;1&nbsp;AND&nbsp;uid&nbsp;IN&nbsp;（SELECT&nbsp;uid2&nbsp;FROM&nbsp;friend&nbsp;WHERE&nbsp;uid1&nbsp;=&nbsp;$app_user）</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">与<span style="font-family: Times New Roman">SQL</span><span>重要区别是</span><span style="font-family: Times New Roman">FQL</span><span>不支持：</span></span></p><ul><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>多表连接：</span><span style="font-family: Times New Roman">JOIN</span><span>操作</span></span></li><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>分组： </span><span style="font-family: Times New Roman">GROUP&nbsp;BY</span><span>操作</span></span></li><li><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span>排序：</span><span style="font-family: Times New Roman">ORDER&nbsp;BY</span><span>操作</span></span></li></ul><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">随着技术发展，一部分基于列结构的<span style="font-family: Times New Roman">NoSQL</span><span>数据库开始支持分租、排序等复杂数据统计分析功能。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">举例：查询好友信息</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Facebook<span>应用程序从以下两个数据集中查找一用户的好友数据集信息：</span></span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">User&nbsp;&lt;UID,First_Name,&nbsp;Last_Name,&nbsp;Icon&gt;</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">Friend_List&nbsp;&lt;UID,&nbsp;Friend_UID&gt;</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">注<span style="font-family: Times New Roman">Friend_UID</span><span>是一指向</span><span style="font-family: Times New Roman">User</span><span>（</span><span style="font-family: Times New Roman">UID</span><span>）的外键。</span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">RDBMS<span>应用程序可使用数据集连接操作实现：</span></span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">SELECT&nbsp;f.UID,&nbsp;u.Friend_UID,&nbsp;u.First_Name,&nbsp;u.Last_Name,&nbsp;u.Icon</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">FROM&nbsp;Friend_List&nbsp;f,&nbsp;User&nbsp;u</span></p><p style="margin-top: 0pt; text-indent: 18pt; margin-bottom: 0pt"><span style="font-size: 9pt">WHERE&nbsp;f.Friend_UID&nbsp;=&nbsp;u.UID&nbsp;AND </span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">f.UID=@Input_UID</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">在社交网数据库系统中，由于<span style="font-family: Times New Roman">User</span><span>数据分布在多台服务器中，其连接操作和外键约束实际上不能支持。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">在<span style="font-family: Times New Roman">Facebook</span><span>中查找一用户的好友信息，得分</span><span style="font-family: Times New Roman">A</span><span>、</span><span style="font-family: Times New Roman">B</span><span>两步操作实现：</span></span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">A步</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">SELECT&nbsp;Friend_UID</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">INTO&nbsp;@Out_Record_Set</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">FROM&nbsp;Friend_List&nbsp;f</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">WHERE&nbsp;f.UID=@Input_UID</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">B步 </span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">FOR&nbsp;EACH&nbsp;（Friend_UID&nbsp;in&nbsp;@Out_Record_Set）</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">SELECT&nbsp;u.Friend_UID,&nbsp;u.First_Name,&nbsp;u.Last_Name,&nbsp;u.Icon</span></p><p style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000; font-size: 9pt">FROM&nbsp;User&nbsp;u</span></p><p style="margin-top: 0pt; text-indent: 18pt; margin-bottom: 0pt"><span style="font-size: 9pt">WHERE&nbsp;u.UID&nbsp;=&nbsp;Friend_UID</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">No-SQL:&nbsp;Not&nbsp;Only&nbsp;SQL </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">对于那些关系复杂的数据处理和分析统计，<span style="font-family: Times New Roman">SQL</span><span>值得花钱。但当数据库结构非常简单时，</span><span style="font-family: Times New Roman">SQL</span><span>可能没有太大用处。如果能用普通文件存储代替数据库系统的话，优选普通文件存储。</span></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">对于社交网，能够不受限制的扩展比更丰富的功能更加重要。建立大规模社交网成本的压力让很多社交网开发人员努力去寻找更高性价比的解决方案。研究表明基于普通廉价硬件的分布式存储解决方案比现在的高端数据库更加可靠。支持<span style="font-family: Times New Roman">SQL</span><span>的</span><span style="font-family: Times New Roman">RDBMS</span><span>不能解决所有问题的时候，</span><span style="font-family: Times New Roman">NoSQL</span><span>不是简单的</span><span style="font-family: Times New Roman">No&nbsp;SQL</span><span>，其本质是</span><span style="font-family: Times New Roman">Non-Relational</span><span>，这时候</span><span style="font-family: Times New Roman">NoSQL</span><span>也就成为</span><span style="font-family: Times New Roman">Not&nbsp;Only&nbsp;SQL</span><span>。<br /><br /><span style="font-size: 9pt">（本文来自《程序员》杂志10年0</span><span style="font-size: 9pt">7</span><span style="font-size: 9pt">期）</span></span></span></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/social/" rel="tag">social</a> , <a href="http://www.gaobo.info/go.php/tags/database/" rel="tag">database</a> , <a href="http://www.gaobo.info/go.php/tags/db/" rel="tag">db</a> , <a href="http://www.gaobo.info/go.php/tags/tech/" rel="tag">tech</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25A4%25BE%25E4%25BA%25A4/" rel="tag">社交</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593/" rel="tag">数据库</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/729.htm</link>
<title><![CDATA[写作英文论文的一些心得]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Fri, 13 Aug 2010 03:23:05 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/729.htm</guid> 
<description>
<![CDATA[ 
	<p>作者：兰小欢</p><p>对经济学新人来说，不管论文写几十页，除了倒霉的匿名审稿人之外，没人会花超过五分钟去读。那么合理的写作策略就是最大程度的节省读者的阅读时间，最有效的传递信息。具体而言，我力图达到以下目标：</p><p>1. 如果读者只有十秒钟，他也应该清楚地知道我干了什么，主要结果是什么，用了什么数据，贡献在哪里。<br />2. 如果读者有三十秒，他应该在得知以上信息的基础上，知道我是这么论证的，并且能够快速在三四十页的论文中准确地找到他想读的内容。<br />3. 如果读者有一分钟，他应该能知道80%的论文内容，并且觉得似乎应该多花两分钟再看看。<br />4. 如果读者有三分钟，他应该能准确地知道我在讨论的这件事的来龙去脉，准确地知道我的方法我的假设。如果我是一个推销员的话，我必须做到在三分钟内把最重要的卖点都说清楚了，说好了，至于读者买不买，那是另一回事了。<br />5. 如果读者是匿名审稿人，必须花几十分钟读论文的话，那我要做到最小化他的阅读负担，别把他老人家惹毛了。<br /></p><p>如何达到以上目标呢？我总结的心得散见于各位大牛给年轻人的写作建议中，我只是把它们换成我的方式再表达出来。这些建议都宝贵，我读过不少于十遍，写作的时候更是隔三岔五拿出来对照一番，每次都有收获。Mankiew收集的建议在这里， Blattman收集了另一些在这里。<br /><br />一、如果读者只有十秒，他只会读ABSTRACT. 这个东西极端重要，首先它是论文的第一段，读者这时候注意力还集中着，脑子还转着。一般而言，读者在读完三段以后注意力就散的差不多了，所以头三板斧（段）很重要。其次它一般也是论文的最后一段，读者读完这段才决定是不是往下看，大部分时候就不继续看了。<br />所以ABSTRACT要把所有重要的内容表述出来，不能超过150字。对empirical的论文来说，这段要包括研究的问题，使用的数据，identification，和所有重要的估计结果，带数字的。<br />有一回我把ABSTRACT写到150字了，觉得巨满意，简洁得不行，简直不能再多删一个字。后来去投稿，学报要求必须在100字以内，而且是网络提交，网页的对话框是设定好的，一超过100字就变红字，那是相当吝啬. 没办法，再重写。删啊删的，硬是砍掉了50多字，居然也没觉得损失什么内容。可见曾经自鸣得意的简介，如果再使劲儿逼一下，还是有三分之一多的水分。<br />要投出去的论文，不管是学报也好，JMP也好，应该尽量没有因为写作而造成的水分。<br /></p><p>二、如果读者有30秒，他会在看完ABSTRACT之后迅速浏览论文的章节结构，这时候章节的标题怎么写就很重要了。<br />原则是：章节的标题要传递信息，除了Introduction和Conclusions之外，所有的标题都应该有内容。<br />比如，如果一个章节叫&ldquo;Data&rdquo;， 那就没有内容。如果叫&ldquo;Data: CPS 1990-2000&rdquo;，这就是有内容。或者删掉&ldquo;data&rdquo;这个词，直接用数据名称做标题，别担心，傻子也会知道那是数据名称，干嘛还非得写&rdquo;DATA&rdquo;这个词儿呢？<br />再比如写作估计结果时，如果那部分标题就叫&rdquo;Results&rdquo;， 那就没内容，或者叫&ldquo;Effects of X on Y&rdquo;,也没有内容。有内容的写法大概类似于&ldquo;Higher X, Higher Y&rdquo;。就像做slides的标题一样，每个标题都直陈了结果。<br />标题要用几个字来传递具体的信息，所以浏览一遍标题之后，读者就应该具体的知道更多的信息，并且能够准确的找到他感兴趣的内容在哪里，然后读下去。<br />如果标题仅仅是&ldquo;data&rdquo;，&ldquo;Specifications&rdquo;， &ldquo;Identification&rdquo;之类的单词，那就没有内容，那就是逼着读者往细了看。没人愿意被逼着往细了看，所以人家干脆不看。<br /></p><p>三、如果读者有一分钟，他应该能读完这篇论文每一段的第一句话。每一段的第一句话都要&ldquo;管用&rdquo;，如果读者只读第一句话的话，我必须保证他不会错过最重要的内容。</p><p>具体操作上有三点：1）第一句坚决不是铺垫，然后第二句用什么HOWEVER转回来。又不是玩儿躲猫猫，没什么好转来转去的。第一句就是直接表达本段的意思，本段的其他内容都是细节，没有多于第一句所陈述的内容；2）第一句一定要短，不得不用从句的话，不用多于一个的从句，否则就没意思了；3）单句不成段。论文不是小说，更不是现代诗一路回车。<br />基本上读者能在一分钟内浏览完了每一个第一句，我论文80%的内容他就应该知道了，想再读的话，去读INTRODUCTION吧。<br /></p><p>四、如果读者有三分钟的话，INTRODUCTION就是他要读的全部了。<br />这个相对简单多了，因为三分钟差不多能读一千字，周旋的余地能大很多。怎么写INTRODUCTION的经验之谈有很多，我不重复。我个人认为重要的方法有：1）不超过三页；2）文献尽量放在脚注中，第一不占地方，第二不阻隔遣词造句，一会儿一个括号一会儿一个人名的，看着和狗皮膏药似的，难看；3）先写要解释的现象本身，再写怎么解释的，最后谈贡献；4）不要出现类似&ldquo;it is important&rdquo;的字眼，一件事儿重要与否不取决于你自己说&ldquo;这是重要的&rdquo;，直接说事儿，让读者自己判断重要不重要。只有底气不足或者没话可说的人，才隔三岔五就来一句&rdquo;it is important&rdquo;，吆喝卖大力丸似的。<br /></p><p>五、如果读者是审稿人，真的需要花几十分钟细读的话，写得好点儿，短点儿，短点儿，短点儿，短点儿，再短点儿。<br />我不相信这世上有&ldquo;客观存在的真理&rdquo;，不管你做的是物理化学还是社会科学，都不过是看问题的角度和论述的技巧。哈佛经济系给研究生的&ldquo;第二写作定理&rdquo;就是：你的论文质量只取决于你是怎么写的。再牛逼的想法，写砸了就是砸了，没救。（&ldquo;第一写作定理&rdquo;是：你的论文多半得不了诺贝尔奖。）</p><p><br />最让我受益的写作建议来自Deirdre McCloskey教授：写完每一句之后都紧接着问一个&ldquo;SO WHAT?!&rdquo;（那有如何呢？），然后往下接，如果接不下去，刚写完那句根本就没有存在的必要，删掉。<br /></p><p>最后一条我觉得非常有用的写论文建议来自David Romer教授，可以用五个短语概括：Just Write! Just Write! Just Write! Just Write! Just Write!</p><p>啥也别干，就是写，论文是写出来的，不是想出来的。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/english/" rel="tag">english</a> , <a href="http://www.gaobo.info/go.php/tags/thesis/" rel="tag">thesis</a> , <a href="http://www.gaobo.info/go.php/tags/paper/" rel="tag">paper</a> , <a href="http://www.gaobo.info/go.php/tags/article/" rel="tag">article</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%258B%25B1%25E6%2596%2587/" rel="tag">英文</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AE%25BA%25E6%2596%2587/" rel="tag">论文</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BF%2583%25E5%25BE%2597/" rel="tag">心得</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/728.htm</link>
<title><![CDATA[10年内，中国将自己走向衰落？]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Fri, 13 Aug 2010 03:19:06 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/728.htm</guid> 
<description>
<![CDATA[ 
	<p>下面是一份由美国兰德公司（一家著名的非盈利研究机构）公布的中国现状分析报告。希望各位看过后，能对我们的国家现状有更全面的思考，对自己的人生规划起到一定的帮助。<br />本文非常犀利，且在某些观点上存在严重的偏见，我已经对部分偏激的字眼做了修改，请大家抱着反思学习的态度阅读，看不顺眼的地方请无视。<br />需要声明的是，我转载这篇文章并不表示我赞成其中的观点，但我认为对我有很多启发。 如果你看完很生气，我很高兴，希望你能通过努力，让10年后外国人不再这样看中国！！<br />&nbsp;<br />《10年内，中国将自己走向衰落》<br />如果20世纪的中国是一个富裕和统一的国家，我们会有一个完全不同的第一次世界大战，我们就不会有第二次世界大战而是第二次欧洲大战。中国能够阻止日本侵略或者打败日本。美国在这些冲突上的花费从根本意义上会减少很多，因为珍珠港事件不会发生。我们和整个世界，更不用说10亿中国人，一个多世纪以来，已经为中国的弱小付出了惨重的代价。世界需要一个健康的中国。</p><p>中国的需求对日本走出衰退起到了促进作用。日本状况给世界经济带来了风险。关于这一点，怎么说都不夸张。日本巨额的债务会产生多米诺骨牌效应，逐渐波及到全世界。在中国有力的帮助下，危险似乎已经过去。中国全球化给美国带来了很多影响。最明显的是，中国成为美国商品最大的市场。可口可乐早就完成了那个看上去像是神话的目标：卖10亿瓶可口可乐;曾经嘲笑中国梦的通用在中国卖了很多的别克汽车，在困难时期，中国带来的利润占通用利润的很大一部分;中国联想购买IBM个人电脑业务，挽救了这个垂死部门的工作岗位。中国提供更低价的生活必需品给美国人的生活水平做出了很大的贡献，尤其是对我们不是那么富裕的居民而言。有迹象表明由于能够购买中国低价的出口货物，低收入美国人的生活水平可能提高了5%到10%。</p><p>中国金融体系的不合理意味着中国建造了垂死企业，导致巨大的生产力过剩。近些年来，中国财政政策上的反复无常导致过度建造，对铁、铝、水泥和其他原材料产生了巨大的需求。日本人和现在的中国人看上去似乎会买下世界上所有的东西，但是当你看到他们的财政状况的潜在问题时，你会发现一个黑洞。日本人在90年代陷入了这样一个黑洞，至今还在努力地爬出来。中国人很多年后仍将会为目前这种无节制的狂热的购买行为感到心痛。</p><p>目前，中国的经济正面临着巨大的挑战。中国的银行是我们所知道的世界上最糟糕的银行。中国每一代，都有相当于美国规模的人口从农村涌入城市。每年，都有1200-1300万新工人加入就业大军。在制造业，生产力对就业的影响比我们国家要严重得多。到2020年，中国人口老龄化会使工作人口与不工作人口的比率成为世界上最糟糕的，比日本更甚。如果没有特效的新政策的话，中国的经济在那个时期就会狠狠地撞墙。到2020年，以我们的标准来看，它会是一个非常穷的国家。</p><p>大多数中国人缺乏诚信和社会责任感。中国人不了解他们作为社会个体应该对国家和社会所承担的责任和义务。普通中国人通常只关心他们的家庭和亲属，中国的文化是建立在家族血缘关系上而不是建立在一个理性的社会基础之上。中国人只在乎他们直系亲属的福址，对与自己毫不相关的人所遭受的苦难则视而不见。毫无疑问，这种以血缘关系为基础的道德观势必导致自私，冷酷，这种自私和冷酷已经成为阻碍中国社会向前发展的最关键因素。</p><p>中国从来就没有成为一个法制社会，因为大多数中国人的思维方式与守法行为格格不入。中国人老想走捷径。他们不明白这样一个事实：即成就来自于与努力工作和牺牲。中国人倾向于索取而不给予。他们需要明白一个道理：生活的真谛不在于你你索取多少而在于你能给予社会和你的人类同胞多少。</p><p>大多数中国人没有学过什么是体面和尊敬的生活意义。中国人普遍不懂得如何为了个人和社会的福址去进行富有成效的生活。潜意识里，中国人视他们的生活目的就是抬高自己从而获得别人的认知。这样一来，一个人就会对&quot;保有面子&quot;这样微不足道欲望感到满足。&quot;面子&quot;是中国人心理最基本的组成部分，它已经成为了中国人难以克服的障碍，阻碍中国人接受真理并尝试富有意义的生活。这个应受谴责的习性使得中国人生来就具有无情和自私的特点，它已成为中国落后的主要原因。</p><p>大多数中国人没有勇气追求他们认为正确的事情。大多数人缺乏从错误中筛选正确事物的能力，因为他们的思想被贪婪所占据。就算少数人有能力筛选出正确的事情，他们也往往缺乏勇气把真理化为实践。</p><p>大多数中国人习惯接受廉价和免费的事物，他们总是梦想奇迹或者好运，因为他们不愿意付出努力，他们总想不劳而获。很少有中国人明白一个事实，就是威望和成就是通过一步步努力的工作和牺牲实现的，不付出就没有所得。简单来说，如果是为了谋生，那一个人只有去索取;但如果是为了生活，一个人必须要去奉献。</p><p>由于在贫穷的环境下生长并且缺少应有的教育，大多数中国人不懂得优雅的举止和基本的礼貌。他们中的大多数人着装笨拙粗鄙却不感到害羞。他们在青少年时所受的教育就是如何说谎并从别人那里索取，而不是去与别人去分享自己的所有。</p><p>中国是一个物产丰富的国家，但无限制生育政策所带来恶果使得中国成为了无限廉价劳动力的输出国。这些输出也包括那些受过教育的劳力输出，除了他们的教育水平，实则和其他一般苦力没有本质上的区别。</p><p>中国大规模生产的便宜产品降低了输入这些产品的地区的商业信用度。由于技术落后，管理失败，中国制造的单位能耗要比发达国家如日本，美国高出很多。因此，随着出口额的增加，中国在扩大生产的同时丧失着宝贵的能源。同时，这种行为也严重的污染了环境，使中国逐渐变为全世界最不适宜人类居住的国家。</p><p>目前中国正在遭受着资本主义社会两大邪恶的折磨，即环境的破坏与人性的丧失。由于人天生贪婪的本性，可以毫无保留的接受资本主义的阴暗面即无止境的追求利润，忽视人的尊严。中国人对西方的技术与产品狂热追求却对西方管理文化所强调的坦率，直接，诚实这些品质漠不关心。</p><p>由于中国文化不鼓励敢于冒险这种优良品质，所以中国人极力避免冒险，他们也不想寻求机会来改善自己的生活。中国人对于生活的平衡性和意义性并不感兴趣，相反他们更执迷于对物质的索取，这点上要远远胜于西方人。大多数中国人发现他们不懂得&quot;精神灵性&quot;，&quot;自由信仰&quot;以及&quot;心智健康&quot;这样的概念，因为他们的思想尚不能达到一个生命（补：即肉体和灵性的并存）存在的更高层次。他们的思想还停留在专注于动物本能对性和食物那点贪婪可怜的欲望上。</p><p>在中国人的眼中，受教育不是为了寻求真理或者改善生活质量，而只是身份和显赫地位的象征和标志。中国的知识分子从别人那里得到尊敬并不是因为他们为了别人的幸福做过什么，而只是因为他们获得占有了相当的知识。事实上，他们中的大多数只不过是一群仅仅通晓考试却从不关心真理和道德的食客。</p><p>中国的教育体系很大程度上已经成为一种失败和耻辱。它已经不能够服务于教育本应所服务的对象：社会。这个教育体系不能提供给社会许多有用的个体。它只是制造出一群投机分子，他们渴望能够受益于社会所提供的好处却毫不关心回报。</p><p>中国可以培养出大批的高级技能人才，但却很少可以培养出合格的可以独立主持的管理级专家。服务于一个公司或者社会，光有技术是不够的;还需要有勇气，胆量，正直和诚实的领导才能，这恰恰是大多数中国人所缺少的品性。正如亚瑟。史密斯，一位着名的西方传教士一个世纪前所指出的，中国人最缺乏的不是智慧，而是勇气和正直的纯正品性。这个评价，虽然历经百年，如今依旧准确诊断出中国综合症的病因。</p><p>大多数中国毕业生对选择出国并为外国工作不会感到内疚。事实上，他们首先欠下了中国人民在教育上为他们所做出的牺牲。随着传统文化价值观的破坏和逐步衰弱，大多数的中国人，包括受过教育的人都徘徊在精神和内心世界的路口，像迷失的孩子一样不知何去何从。<br /></p><p>再次声明：我转载这篇文章并不表示我赞成其中的观点，欢迎讨论，但谢绝人身攻击！</p>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/727.htm</link>
<title><![CDATA[手把手教程：使用代码优先的方式创建NerdDinner（by Scottgu）]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Thu, 12 Aug 2010 02:41:34 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/727.htm</guid> 
<description>
<![CDATA[ 
	以下是Scottgu先生使用.Net Framework 4里最新的Entity Framework 4更新的一篇创建一个叫做&ldquo;NerdDinner&rdquo;的简单程序的过程，这个程序方便人们在线组织、主办和参加餐会。其中使用&ldquo;代码优先&rdquo;方式的过程真的很&hellip;&hellip;Amazing！<br /><br />（以下第一人称为Scottgu先生）<br /><br /><p>去年我写了一篇ASP.NET MVC 1.0的教程，发表在<a href="http://blog.joycode.com/scottgu/archive/2009/04/29/115557.joy" target="_blank">博客</a>和一本书里。这篇教程捋了一遍创建一个叫做&ldquo;NerdDinner&rdquo;的简单程序的过程，这个程序方便人们在线组织、主办和参加餐会。可以在<a href="http://blog.joycode.com/scottgu/archive/2009/04/29/115557.joy" target="_blank">这里</a>参阅我原先的ASP.NET V1 NerdDinner教程。新书<a href="http://www.amazon.com/gp/product/0470643188?ie=UTF8&amp;tag=scoblo04-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0470643188" target="_blank">ASP.NET MVC 2高级编程</a>也包含了更新过的教程。</p><p>这篇NerdDinner教程原先使用的是&ldquo;数据库优先&rdquo;的方式，也就是预先定义好数据库结构，然后使用Visual Stduio设计器创建LINQ to SQL或LINQ to Entities等模型对象来做映射。</p><p>下面我将演示如何用EF 4的&ldquo;代码优先&rdquo;的方式来创建NerdDinner的模型层和数据库结构，然后使用ASP.NET MVC创建一个增删改查程序。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_2.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb.png" border="0" alt="image" title="image" width="781" height="464" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_49970184.png" target="_blank"></a></p><p>我们将一步一步地创建这个程序，本文的最后有完整示例代码的下载链接。</p><h3>第一步：新建一个空的ASP.NET MVC 2程序</h3><p>我们从在Visual Studio 2010新建一个ASP.NET MVC 2项目开始，选择文件 -&gt; 新项目并使用&ldquo;ASP .NET MVC 2空 Web 应用程序&rdquo;项目模板就行了。</p><p>这样就会新建一个空的ASP.NET MVC 2工程，里面没有什么控制器、模型和视图。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_4.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_1.png" border="0" alt="image" title="image" width="215" height="288" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_5A4F480C.png" target="_blank"></a></p><p>下一步我们将定义NerdDinner&ldquo;模型&rdquo;&mdash;&mdash;表示程序中数据的对象，以及包含验证机制和业务规则等的逻辑。模型是基于MVC程序的&ldquo;心脏&rdquo;，实际上掌控了程序的行为。我们将使用EF 4新的&ldquo;代码优先&rdquo;方式来创建这个模型层。</p><h3>第二步：创建模型</h3><p>现在假设我们尚未创建数据库，从头开始创建NerdDinner程序。</p><p><u>我们不需要从数据库开始</u></p><p>当使用代码优先的开发流程时，我们不需要从先创建数据库或者定义数据库结构来开始程序开发。而可以从定义最适合我们程序的模型对象的标准.NET类开始&mdash;&mdash;免除在里面混杂数据持久化逻辑的烦恼。</p><p><u>创建模型类型</u></p><p>NerdDinner是一个小程序，所需要的数据存储非常简单。我们希望能定义和存储代表人们可参加的事件&mdash;&mdash;&ldquo;Dinners（餐会）&rdquo;。我们还希望能够定义和存储参加餐会的人员&mdash;&mdash;&ldquo;RSVP&rdquo;，用来跟踪有兴趣参加特定餐会的人。</p><p>让我们来创建两个类（Dinner和RSVP）来表现这个概念。在我们的ASP.NET MVC项目中添加两个类&mdash;&mdash;&ldquo;Dinner&rdquo;和&ldquo;RSVP&rdquo;就可以了：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_6.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_2.png" border="0" alt="image" title="image" width="523" height="396" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_25CE75C4.png" target="_blank"></a></p><p>上面的&ldquo;Dinner&rdquo;和&ldquo;RSVP&rdquo;模型类就是&ldquo;简单CLR对象&rdquo;（即POCO）。它们不需要继承什么基类或者实现什么接口，而且里面定义的属性都是标准的.NET数据类型。里面没有添加数据持久化属性和操作数据的代码。</p><p>不需要在定义模型类时将他们绑定到特定的数据库、数据库API和数据库结构的功能的确很好，很强大&mdash;&mdash;而且也让我们有了更弹性的数据访问方式。这样我们就能专注于程序和业务需求上，而不用过多考虑持久化的实现方式。另外，它还为我们提供了更换数据库结构或者存储实现方式的弹性空间&mdash;不需要重写模型对象或者与它们交互的代码。</p><p><u>创建Context</u><u>类来处理数据持久化</u></p><p>我们已经定义了两个POCO模型类，现在让我们创建一个类来处理在数据库获取或保存Dinner和RSVP实例的工作。</p><p>我们将这个类命名为&ldquo;NerdDinners&rdquo;。它继承于DbContext基类，并且定义了两个公开属性&mdash;&mdash;一个用来公开Dinner对象集合，另外一个公开RSVP对象集合：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_8.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_3.png" border="0" alt="image" title="image" width="433" height="128" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_241DA9F0.png" target="_blank"></a></p><p>上面用到的DbContext和DbSet类是EF 4代码优先函数库自带的。你需要添加对System.Data.Entity.CTP程序集的引用，它位于目录&#92;Program Files&#92;Microsoft ADO.NET Entity Framework Feature CTP4&#92;Binaries中。另外在&ldquo;NerdDinners&rdquo;类型定义文件中，你需要添加&ldquo;using System.Data.Entity&rdquo;命名空间的引用。</p><p><u>这就是所有我们需要编写的代码了</u></p><p>上面三个类就是为我们NerdDinner程序实现一个基本的模型和数据持久层所需要的所有代码了。我们不需要配置额外的数据库结构影射信息，不需要运行任何工具，不需要编写什么XML文件，不需要用什么设计器来使用我们的类在数据库中获取、更新和存储数据。</p><h3>基于惯例的持久化影射</h3><p>不需要写什么额外代码，不需要创建什么XML文件，不需要运行什么工具来在数据库中映射我们的模型类。你可能会问，这可能吗？</p><p>默认情况下，EF代码优先库支持一个&ldquo;惯例高于配置&rdquo;的方式，它使用常见的映射习惯，从而避免显式地做任何配置。如果你想使用自定义的数据库映射规则的话，可以复写这些惯例。但如果你使用惯例的话，你会发现你自己需要写的代码真的很少，在不需要添加额外的代码和配置的前提下，90%的常见情况都可以正常工作。</p><p>在上面我们的例子当中，NerdDinner Context类默认会将&ldquo;Dinners&rdquo;和&ldquo;RSVPs&rdquo;属性映射为数据库的&ldquo;Dinners&rdquo;和&ldquo;RSVPs&rdquo;数据表。&ldquo;Dinners&rdquo;表里每一行都被映射成&ldquo;Dinner&rdquo;类型的一个实例。当然啦，&ldquo;RSVPs&rdquo;表里每一行都被映射成&ldquo;RSVP&rdquo;类型的一个实例。&ldquo;Dinner&rdquo;和&ldquo;RSVP&rdquo;类型里的属性也就随之被映射成&ldquo;Dinners&rdquo;和&ldquo;RSVPs&rdquo;表里的列。</p><p>EF支持的其它的惯例包括通过常见命名模式自动识别主键和外键（例如：根据Dinner类里的ID或者DinnerID属性推断出主键）。EF还灵巧地支持在两个模型间绑定相联关系的惯例。<a href="http://blogs.msdn.com/b/efdesign/archive/2010/06/01/conventions-for-code-first.aspx" target="_blank">这里</a>有一篇EF团队的博客讲解了所支持的默认惯例的工作方式。</p><h3>使用我们模型的代码示例</h3><p>前面我们创建的三个类包含了所有实现NerdDinner模型和数据持久化的<u>所有代码</u>。现在我们来看一些代码示例，看看如何使用这些类来执行常见的数据库操作：</p><p><u>使用LINQ</u><u>表达式执行查询</u></p><p>用下面的LINQ查询表达式从数据库中获取数据。下图使用了LINQ表达式来获取所有将要举行的餐会：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_10.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_4.png" border="0" alt="image" title="image" width="428" height="169" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_1506CB16.png" target="_blank"></a></p><p>我们在写LINQ表达式的时候也可以利用Dinners和RSVPs存在的关系。留意下图&ldquo;where&rdquo;子句过滤出参加人数大于0的餐会的方式：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_12.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_5.png" border="0" alt="image" title="image" width="451" height="175" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_41AF84EF.png" target="_blank"></a></p><p>要注意的是上面的查询的&ldquo;where&rdquo;子句（即只获取至少有一人参加的餐会）是在服务器端执行的&mdash;&mdash;使执行查询和加载的数据量更为高效。</p><p><u>获取一个实例</u></p><p>我们可以使用LINQ的Single()函数，加上Lamda查询来获取Dinner的一个实例，如下面的代码所示：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_14.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_6.png" border="0" alt="image" title="image" width="556" height="136" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_6085F8CD.png" target="_blank"></a></p><p>或者，我们也可以利用EF&ldquo;代码优先&rdquo;函数库提供的Find()函数，根据ID来加载一个实例：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_16.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_7.png" border="0" alt="image" title="image" width="430" height="132" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_144DEF1F.png" target="_blank"></a></p><p><u>举办新餐会</u></p><p>下面的代码演示了如何创建一个新的Dinner实例并把它添加到数据库中。所有我们需要做的工作就是&ldquo;new&rdquo;一个Dinner对象，设置它的属性，最后把它加到NerdDinner Context对象的Dinners属性中。NerdDinner Context类支持 &ldquo;工作单元&rdquo;的模式，即你可以在Context中添加多个模型，然后调用&ldquo;SaveChanges()&rdquo;以事务的方式保存所有的数据库变动。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_18.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_8.png" border="0" alt="image" title="image" width="442" height="303" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_05371045.png" target="_blank"></a></p><p><u>更新餐会信息</u></p><p>下面的代码演示了获取一个Dinner实例，更新其中一个属性，然后将改动保存到数据库的过程：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_20.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_9.png" border="0" alt="image" title="image" width="412" height="191" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_2AC08DA6.png" target="_blank"></a></p><h3>第三步：创建使用我们的模型的ASP.NET MVC控制器</h3><p>现在来看看使用模型的更完整的场景，使用一个控制器类型来公布即将到来的餐会列表，并允许用户添加新的餐会：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_22.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_10.png" border="0" alt="image" title="image" width="781" height="464" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_49970184.png" target="_blank"></a></p><p>右键单击&ldquo;Controllers&rdquo;文件夹，然后选择&ldquo;添加-&gt;控制器&rdquo;菜单项，我们把新的控制器命名为&ldquo;HomeController&rdquo;。</p><p>接着添加三个&ldquo;动作函数&rdquo;用来处理前面使用EF&ldquo;代码优先&rdquo;函数库创建的NerdDinners模型：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_24.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_11.png" border="0" alt="image" title="image" width="504" height="815" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_52375A10.png" target="_blank"></a>.</p><p>&ldquo;Index&rdquo;动作函数加载并显示即将到来的餐会列表。</p><p>而&ldquo;Create&rdquo;动作函数允许用户发布新的餐会。第一个&ldquo;Create&rdquo;函数用来处理用户访问/HOME/Create页面时，处理&ldquo;HTTP GET&rdquo; 的场景，以及发一个&ldquo;New Dinner&rdquo;表单让用户填写。而第二个&ldquo;Create&rdquo;函数用来处理跟那个表单关联起来的&ldquo;HTTP POST&rdquo;场景&mdash;将新餐会信息保存到数据库中。如果有任何验证错误，它会重新显示表单并加上相应的错误消息。</p><p><u>给我们的控制器加上视图</u></p><p>下一步将是给项目里加两个&ldquo;视图模板&rdquo;&mdash;&mdash;一个给&ldquo;Index&rdquo;，另外一个给&ldquo;Create&rdquo;。</p><p>把鼠标放在控制器里的Index函数里，就可以在项目中为它添加一个视图了，然后单击右键在菜单中选择&ldquo;添加视图&rdquo;，弹出&ldquo;添加视图&rdquo;对话框。我们将创建一个强类型视图，然后给它传入一个包含&ldquo;Dinner&rdquo;模型对象的IEnumerable列表：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_26.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_12.png" border="0" alt="image" title="image" width="384" height="387" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_306B817F.png" target="_blank"></a></p><p>单击&ldquo;添加&rdquo;后，Visual Studio会创建一个<em>/Views/Home/Index.aspx</em>文件。再添加以下这些代码&mdash;&mdash;为餐会信息生成一个&lt;ul&gt;列表，然后显示创建餐会的链接：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_28.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_13.png" border="0" alt="image" title="image" width="527" height="325" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_0A955B1C.png" target="_blank"></a></p><p>把光标放在控制器的Create函数来在项目中添加&ldquo;Create&rdquo;视图，单击右键菜单里的&ldquo;添加视图&rdquo;命令。在&ldquo;添加视图&rdquo;对话框中，我们还是指定创建一个强类型视图，然后传给它一个Dinner对象。另外还说明了我们希望使用&ldquo;Create&rdquo;模板搭个框架：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_30.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_14.png" border="0" alt="image" title="image" width="390" height="391" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_023185C5.png" target="_blank"></a></p><p>单击&ldquo;添加&rdquo;后，Visual Studio会创建一个<em>/Views/Home/Create.aspx</em>文件，里面有一个包含了为&ldquo;Dinner&rdquo;对象生成的HTML &lt;form&gt;表单的草案。我们做一点点的调整，并删掉了为DinnerID属性生成的input元素。最终的视图模板如下所示：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_32.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_15.png" border="0" alt="image" title="image" width="644" height="887" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_6B8F377D.png" target="_blank"></a></p><p>迄今为止，我们已经写好了网站里实现列出餐会清单和创建餐会信息的控制器和视图的所有代码。</p><h3>第四步: 数据库</h3><p>代码已经写好了。现在让我们来运行程序。</p><p><u>但数据库呢？</u></p><p>我们现在还没有数据库呢&mdash;&mdash;其实到目前为止也没有必要，因为我们&ldquo;代码优先&rdquo;的开发流程并不要求数据库来定义和使用我们的模型类。</p><p>但当我们实际运行我们的应用程序时，我们要存储Dinner和 RSVP对象的。我们可以用下面的两种方式之一去创建数据库：</p><p>1. 使用数据库工具（如SQL Management Studio或 Visual Studio）去手动创建和定义数据库结构；</p><p>2. 使用EF代码优先类库根据我们定义好的模型自动创建和生成数据库结构。</p><p>第二种方式非常酷，而且我们要把它用在我们的NerdDinner程序中。</p><p><u>配置数据库连接字符串</u></p><p>在开始前，我们要设置好指向将要创建的数据库的连接字符串。我们把数据库连接字符串&ldquo;NerdDinners&rdquo;添加到应用程序的web.config文件中，如下所示：</p><pre><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_34.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_16.png" border="0" alt="image" title="image" width="603" height="162" /></a> </pre><p>在默认情况下，当你用EF的代码优先类库创建一个DbContext类的时候，它会自动查找和Context类名匹配的连接字符串。因为我们将Context类命名为&ldquo;NerdDinners&rdquo;，所以，当ASP.NET应用程序初始化它的时候，默认会找到前面添加好的&ldquo;NerdDinners&rdquo;数据库连接字符串。</p><p><u>使用</u><u> SQL CE 4</u></p><p>EF 代码优先类库可以支持多个不同的数据库&mdash;&mdash;包括 SQL Server、 SQL Express和 MySQL。</p><p>两个星期前，我写了一篇在ASP.NET中使用<a href="http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx" target="_blank">嵌入式SQL CE 4 数据库引擎</a>的<a href="http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx" target="_blank">博客</a>。SQL CE 4 是一个轻量级的基于文件的数据库，安装简便，且可以嵌入在ASP.NET应用程序中。它支持低成本的宿主环境，又能够轻松地迁移到SQL Server 数据库当中。</p><p>在定义（和重新定义） 你的数据模型层的前期阶段，SQL CE可以是一个很不错的选择&mdash;&mdash;另外，只要你想，还可以快速地创建和重新创建数据库。在开发NerdDinner应用程序时，我们将以SQL CE 4 作为数据库。后面，我们可以选择更改连接字符串去将产品部署到SQL Express或者SQL Server上&mdash;&mdash;无需修改任何一行代码。</p><p>我前面设置的数据库连接字符串，指定了NerdDinners.sdf 数据库文件，并使用SQL CE 4 数据库驱动程序。要使它正常工作，你还需要安装SQL CE 4&mdash;&mdash;安装它可以通过<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0d2357ea-324f-46fd-88fc-7364c80e4fdb&amp;displaylang=en" target="_blank">标准的SQL CE安装程序</a>或<a href="http://blog.joycode.com/scottgu/archive/2010/07/21/116031.joy" target="_blank">WebMatrix</a>（已内置SQL CE）。SQL CE 4 很小，只要几秒钟就可以安装好。</p><p><strong><em>重要事项</em></strong>：<em>上面的连接字符串中，我们指定将</em><em>NerdDinners.sdf </em><em>文件创建在</em><em>&#92;DataDirectory&#92; </em><em>文件夹下</em><em>&mdash;&mdash;</em><em>在</em><em> ASP.NET</em><em>应用程序中对应的就是其根目录下的</em><em>&#92;App_Data&#92;</em><em>文件夹。默认情况下，新建</em><em>&quot;</em><em>空</em><em> ASP.NET MVC Web </em><em>应用程序</em><em>&quot;</em><em>项目模板不会创建此目录。所以你需要显式在项目中创建此文件夹（右键单击该项目并选择</em><em>&quot;</em><em>添加</em><em> ASP.NET </em><em>文件夹</em><em>-&gt; Add_Data-&gt;&quot;</em><em>菜单项）。</em></p><p><u>自动创建数据库结构（</u><u>Schema</u><u>）</u></p><p>EF 代码优先类库支持自动地从数据模型类生成数据库结构和数据库的能力&mdash;&mdash;免除用户必须手动去执行这些步骤。</p><p>如果您的连接字符串指定的SQL CE 或 SQL Express 数据库文件在<u>磁盘中不存在</u>，<u>默认</u>就会发生。你根本不需要执行任何手动步骤。</p><p>要看到效果，我们可以按 F5 键运行我们的NerdDinner应用程序。它会启动浏览器，并访问我们应用程序的根目录&quot;/&quot;。你应该可以看到下面所示的画面：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_36.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_17.png" border="0" alt="image" title="image" width="579" height="377" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_6EE0A958.png" target="_blank"></a></p><p>访问应用程序的根目录会调用到HomeController.Index()这个函数&mdash;&mdash;它会实例化并查询我们的NerdDinners context类，来从数据库获取即将举办的餐会列表。因为我们在连接字符串中指定的NerdDinners.sdf数据库文件并不存在，所以EF 代码优先类库将自动地为我们创建该数据库。它会根据NerdDinners context类，推断出数据库结构，最后生成数据库。</p><p>你可以通过在Visual Studio解决方案管理器上点击&ldquo;显示所有文件&rdquo;图标，然后点击&ldquo;刷新&rdquo;按钮，展开App_Data文件夹查看那个自动生成的SQL CE数据库文件。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_38.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_18.png" border="0" alt="image" title="image" width="203" height="348" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_33ACCD8D.png" target="_blank"></a></p><p>将来我们会发布一个VS 2010的升级包，你将能在&ldquo;服务器资源管理器&rdquo;上打开、编辑SQL CE 4数据库（就跟你现在编辑SQL 数据库一样）。这样，你就可以很容易地看到（或许做点调整）数据库结构和数据内容了。到了那时，你也可以在WebMatrix中使用数据库工具去查看SQL CE 4数据库文件的内容。</p><p>我们还没有给NerdDinners数据类指定任何自定义的数据持久化映射规则&mdash;&mdash;所以EF 代码优先类库将会根据默认的命名规范作为映射规则自动生成数据库。但是如果我们指定了任何自定义的映射规的话，EF 代码优先类库将会遵守这些规则，生成与它们匹配的数据库。</p><p>让我们回顾一下，这里是我们先前定义的两个POCO数据模型类和NerdDinners Context类：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_40.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_19.png" border="0" alt="image" title="image" width="513" height="517" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_38AF0B3C.png" target="_blank"></a></p><p>下面是我们运行应用程序后，根据上述模型类自动创建的数据库中的两个表。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_42.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_20.png" border="0" alt="image" title="image" width="174" height="116" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_2FDF02F0.png" target="_blank"></a></p><p>&ldquo;Dinners&rdquo;表的定义如下图所示。其中，列名和它的数据类型和Dinner类中定义的属性是完全对应的。DinnerID列被自动的设置成了该表的主键和唯一标识列。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_44.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_21.png" border="0" alt="image" title="image" width="340" height="318" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_3CD8E301.png" target="_blank"></a></p><p>&ldquo;RSVPs&rdquo;表的定义如下图所示。该表的列名和它的数据类型和我们在RSVP类中定义的属性也是一致的。其中，RsvpID列被设置成了该表的主键和唯一标识列。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_46.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_22.png" border="0" alt="image" title="image" width="338" height="307" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_5B4323EA.png" target="_blank"></a></p><p>在Dinners表和RSVPs表之间，一个一对多的主键/外键关系也同时被创建起来了。EF 代码优先类库自动建立了这种关联，因为Dinner类中有一个类型为ICollection&lt;RSVP&gt;的RSVPs属性，同时，RSVP类中也有一个Dinner的属性。</p><p><u>为数据库填充</u><u>餐会信息</u></p><p>现在，让我们来新建一些餐会信息并将它们写入数据库。我们可以通过点击我们首页中的&ldquo;Create New Dinner&rdquo;链接来跳转到&ldquo;新建&rdquo;页面。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_48.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_23.png" border="0" alt="image" title="image" width="573" height="492" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_6BDB1ED8.png" target="_blank"></a></p><p>当我们点击&ldquo;Create&rdquo;按钮时，新餐会将被保存到数据库。我们可以重复数次来新建多个不同的餐会。每条我们新建的餐会都将会保存在数据库中，并会被显示在首页的&ldquo;Upcoming Dinners&rdquo;（即将举办的餐会）列表中。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_50.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_24.png" border="0" alt="image" title="image" width="582" height="360" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_02B9F055.png" target="_blank"></a></p><h3>第五步：更改数据模型</h3><p>随着我们应用程序开发的推进，我们将继续改进和重构我们的模型。EF 代码优先类库包括一些很好的开发功能，这使我们在开发数据库时更容易协调某些改进。</p><p><u>给</u><u>Dinner</u><u>（餐会）模型添加一个新的属性</u></p><p>让我们对我们的Dinner类做一个简单的修改，更具体的说，我们将给Dinner类添加一个新的&ldquo;Country&rdquo;属性。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_52.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_25.png" border="0" alt="image" title="image" width="509" height="241" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_55C48D79.png" target="_blank"></a></p><p>做完改动，让我们在Virtual Studio中按下F5按钮，重新编译并运行应用程序。将会看到下面的这些错误信息：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_54.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_26.png" border="0" alt="image" title="image" width="667" height="410" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_665C8867.png" target="_blank"></a></p><p>这些错误信息之所以出现，是因为我们修改了Dinner类的结构定义，我们的模型对象现在已经不再和数据库中自动创建的Dinners表一致了。</p><p>当EF自动地为你创建数据库时，默认地会增加一个&ldquo;EdmMetadata&rdquo;表，这个表用来记录自动创建数据库时使用的模型对象的形状。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_56.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_27.png" border="0" alt="image" title="image" width="184" height="112" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_6AF29321.png" target="_blank"></a></p><p>当EF发现你修改过模型对象，并且和之前自动创建的数据库不再同步时，就会出现上面的错误消息。</p><p><u>重新同步数据模型类到数据库</u></p><p>我们有很多同步模型对像和数据库的方式：</p><ul><li>我们可以手动地更新数据库中的结构（Schema）让它们保持一致。</li><li>我们也可以先删除数据库文件，然后重新运行应用程序，让EF自动重新创建数据库。</li><li>我们也可以开启EF 代码优先功能，当数据模型发生任何改变时能够自动更新数据库 。</li></ul><p>下面，让我们在NerdDinner应用程序中看看如何使用最后一种的自动更新的方式。</p><p><u>当模型对象发生变化时重新创建数据库（</u><u>RecreateDatabaseIfModelChanges</u><u>）功能</u></p><p>在EF 代码优先类库的CTP 4版本中包括了一个非常有用的<u>开发时</u>（<em>development-time</em>）功能，它允许你在任意时刻修改数据模型类，自动重建数据库。当你开启这项功能的时候，EF能够识别用来创建数据库的类模型在何时被改动，何时可以重建你的数据库以匹配新的模型类&mdash;&mdash;你不需要做任何手工操作。</p><p>这项功能在你刚开发一个应用程序时特别实用，因为它为你快速地重构你的模型代码带来了很大的自由度和灵活性&mdash;&mdash;你根本不用去手动地保持数据库结构的同步。它特别适合SQL CE，因为SQL CE是一个基于文件的数据库而且可以随时在运行时删除和创建。这使得开发流程变得不可思议的流畅。</p><p>启用这项功能最简单的方法就是在Global.asax类中的Application_Start()事件处理函数中加上Database.SetInitializer()方法的调用。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_58.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_28.png" border="0" alt="image" title="image" width="798" height="148" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_0315FD7D.png" target="_blank"></a></p><p>这个调用告诉EF当数据模型发生任何变化时，重建NerdDinners.sdf数据库以匹配NerdDinners类。现在当我们重新运行应用程序的时候，再也不会出现提示说类模型和数据库不匹配的错误信息了。反而，EF会自动重建数据库以匹配新的数据模型类，我们的应用程序会正常运行：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_60.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_29.png" border="0" alt="image" title="image" width="551" height="299" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_6F889DDB.png" target="_blank"></a></p><p><u>为自动创建的数据库产生初始化的数据</u></p><p>在上面的截图上，你可能已经注意到我们之前添加的餐会数据在重建数据库之后就丢失了。这是因为根据模型变化自动重建数据库的功能并不适用于实际场合，此时你想将已经存在的数据从一个数据库移植到另外一个数据库中。相反，它是被设计用来适用于开发场合，我们需要数据库结构能快速地自动更新&mdash;&mdash;而不是通过手动地或指定移植规则来实现。</p><p><em>注意：我们另外正在做的工作，用来提供更好的数据移植服务，支持这种适用于产品数据和数据库结构的版本管理。但我们想这和前面讲的前期开发时（</em><em>development-time</em><em>）功能是不同的场景。这种数据移植的功能现在还不会在这个星期的</em><em>CTP</em><em>上发布。</em></p><p>其实，EF已经为我们提供了可选的 &ldquo;种子&rdquo; 功能，用以在创建或者重建数据库时产生默认或测试数据。我觉得这个功能真的很实用，因为这样一来，在我重构一个数据模型后，马上就可运行应用程序去测试&mdash;不用重新手动地输入一堆的测试数据。</p><p>我们可以通过实现一个如下所示的&ldquo;NerdDinnersIntializer&rdquo;类，将这些&ldquo;种子&rdquo;数据到加入到数据库当中。我这里用它创建两个&ldquo;示例餐会&rdquo;并把它们加入到数据库中。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_62.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_30.png" border="0" alt="image" title="image" width="696" height="485" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_18B0361A.png" target="_blank"></a></p><p>然后，我们可以在Global.asax加入Database.Initializer()方法以在启动时使用这个&ldquo;NerdDinnersInitializer&rdquo;类。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_64.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_31.png" border="0" alt="image" title="image" width="627" height="148" /></a> </p><p>现在任何时候我们更新NerdDinner模型类，数据库文件都会被删除和重建以匹配我们的模型类，同时，两条默认餐会数据也会被添加到数据库中用以测试。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_66.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_32.png" border="0" alt="image" title="image" width="590" height="332" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_3C88E7A7.png" target="_blank"></a></p><p><u>方便重构</u></p><p>上述的功能使我们非常容易地在开发时改进和重构代码&mdash;&mdash;不需要用到任何工具和脚本去手动地保持数据库结构和代码的同步。</p><p>由于我们的模型类、LINQ表达式和&ldquo;种子&rdquo;测试数据都是强类型，所以我们也可以很快速地用Visual Studio的重构工具自动在代码文件中应用所有更改。</p><h3>第六步: 加入验证规则</h3><p>我们已经创建了一个简单但很好的数据服务应用程序。</p><p>但是，这里还是有一个问题，那就是我们还没有任何地方做数据验证以确保我们填入的数据库中的数据都是正确的。让我们来搞定它。</p><p><u>用</u><u>DataAnnotations</u><u>实现数据验证</u></p><p>在基于ASP.NET MVC的应用程序中，通常加入验证规则的地方最好是数据模型。这样，可以只在一个地方进行维护，同时也使强制任何与它交互的Controller和View的遵循它。在ASP.NET MVC中，你可以通过很多种机制去实现数据验证，它可以很灵活地支持你想要使用的任何验证机制。</p><p>ASP.NET MVC 2内置支持使用.NET类库中<strong><em>S</em></strong><em>ystem.ComponentModel.DataAnnotations</em><em>的验证规则库&mdash;你可以显式地在模型类中通过验证特性（</em><em>Attribute</em><em>）来使用验证规则。你可以在</em>我之前发表的<a href="http://blog.joycode.com/scottgu/archive/2010/02/08/115873.joy" target="_blank">博客</a><em>中了解这项功能的更多信息。我们将把这种方式的优势应用到我们的</em><em>NerdDinner</em><em>应用程序中的输入数据验证上面来。</em></p><p>让我们回过头，将一些数据验证的特性加入到我们之前定义好的Dinner类的属性当中去。（注意：我们同时要加入&ldquo;using System.ComponentModel.DataAnnotations&rdquo;命名空间。）</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_68.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_33.png" border="0" alt="image" title="image" width="789" height="436" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_1ABD0F16.png" target="_blank"></a></p><p>[Required] 验证指明这个属性的数据是必须指定的（非空的）。[StringLength] 指定了该属性允许输入的最大字符串长度。[RegularExpression] 验证指定了用以验证输入匹配的正则表达式（这里我们用以验证邮件地址）。</p><p>每一个验证特性都支持&ldquo;ErrorMessage&rdquo;属性，这使得我们可以指定验证失败时显示的错误消息。你既可以通过硬编码的方式（像上面一样）指定，也可以通过让它从一个资源文件里取得&mdash;可以很容易地实现本地化。</p><p><u>引入一些</u><u>CSS</u><u>和</u><u>JavaScript</u><u>文件</u></p><p>最后一步，我们将回到Create.aspx视图模板中，加入&lt;link&gt;引用Site.css文件到项目中，同时也加入两个&lt;script&gt;元素引用两个JavaScript文件。我们还在&lt;form&gt;元素呈现之前加入一行代码来调用Html.EnableClientValidation()方法。</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_70.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_34.png" border="0" alt="image" title="image" width="713" height="211" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_71D1FA0C.png" target="_blank"></a></p><p>这些改动将会确保那些验证错误信息以正确的样式显示出来（让它们更惹眼），而且这些数据模型的验证规则会同时应用在客户端和服务器端。</p><p><u>运行应用程序</u></p><p>让我们重新运行应用程序并尝试注册一个新的餐会。让我们先按一下还没有填写数据时的&quot;创建&quot;按钮。现在我们会发现模型中的验证错误消息在浏览器中已经显示出来：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_72.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_35.png" border="0" alt="image" title="image" width="589" height="499" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_76D437BB.png" target="_blank"></a></p><p>由于我们在ASP.NET MVC中启用了客户端验证（即我们上面所写的代码中的一行)，我们的错误消息将会实时更新：</p><p><a href="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_74.png" target="_blank"><img style="display: inline; border: 0px" src="http://blog.joycode.com/images/metaapis/158/WindowsLiveWriter/EntityFramework4_E2B3/image_thumb_36.png" border="0" alt="image" title="image" width="589" height="499" /></a> </p><p><a href="http://weblogs.asp.net/blogs/scottgu/image_549C2C35.png" target="_blank"></a></p><p>注意上面，当我们给&rdquo;Title&rdquo;输入的字符串长度大于20的时候，验证错误信息改变的方式。这是因为我们为Dinner.Title设置的验证[StringLength]特性指明了最大允许的长度是20。而当我们开始在&ldquo;HostedBy&rdquo;文本框中输入字符串时，错误信息从&ldquo;[Requred]&rdquo;（要求你输入电子邮件地址）变成了&ldquo;[RegularExpression]&rdquo;（它告诉我们没有输入一个有效的电子邮件地址）。</p><p>这些验证规则在浏览器中（通过 JavaScript）和服务器上（即使有人试图绕过JavaScript 验证，也能保护数据的输入有效性）都有效&mdash;&mdash;不用我们对Controller类作任何更改。这种将规则在我们的模型类内指定一次就可以被应用到处任何地方的能力是极其强大的&mdash;&mdash;将使我们能够以一种非常清楚的方式继续改进我们的程序。</p><p>你可以通过<a href="http://blog.joycode.com/scottgu/archive/2010/02/08/115873.joy" target="_blank">这里</a>了解更详细的有关这些 ASP.NET MVC 2 模型验证功能和它们的工作方式。</p><h3><strong><u>下载</u></strong><strong></strong></h3><p><a href="http://www.scottgu.com/blogposts/nerddinnerreloaded.zip" target="_blank">点击这里</a>下载和运行我们在这篇博客里实现的NerdDinnerReloaded示例。你需要安装了VS 2010 (或者免费的Visual Web Developer 2010 Express) 。</p><p><strong>重要提示</strong>：你必须在你的机子上<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0d2357ea-324f-46fd-88fc-7364c80e4fdb&amp;displaylang=en" target="_blank">下载和安装SQL CE 4</a>后才能运行上面的示例程序。你可以从<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=4e094902-aeff-4ee2-a12d-5881d4b0dd3e&amp;displaylang=en" target="_blank">这里</a>下载EF 代码优先类库。这两个下载都不会对你的机器有太大的影响。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/scottgu/" rel="tag">scottgu</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/nerd/" rel="tag">nerd</a> , <a href="http://www.gaobo.info/go.php/tags/dinner/" rel="tag">dinner</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/726.htm</link>
<title><![CDATA[科学家破解十大妇孺皆信的科学谣言(组图)]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Wed, 11 Aug 2010 09:32:59 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/726.htm</guid> 
<description>
<![CDATA[ 
	日前，美国媒体诚邀真正的科学界人士从现实生活和科学实验两个方面破除了以下十大妇孺皆信的科学谣言： <p><strong>外太空没有地心引力</strong> <br />恰恰相反，人在外太空仍会受到地心引力的影响，而且还不小呢。那你可能又要问了：既然有引力，为什么宇航员还能漂浮在太空中呢？其实，宇航员之所以看上去好像是悬浮太空中是因为他们受到地心引力的作用，从而慢慢向地球方向&ldquo;坠落&rdquo;，为了避免这股下坠的力量，宇航员必须横向运动，这样产生的离心力就能抵消引力。实际上，宇航员是在&ldquo;绕着&rdquo;地球轨道飞行呢。<br /><strong>闪电不会两次击中同一个地方</strong> <br />当你惊慌失措躲避闪电袭击时，可千万要忘了这个害人不浅的谣言啊！事实上，闪电击中同一个地点的概率实在是不低，只是你不知道或者没见过罢了。如果你真的碰上了这样的所谓小概率事件，那只能说一声&ldquo;祝你好运了&rdquo;！<br /><strong>流星发光发热是因为和地球大气层摩擦</strong> <br />流星进入地球大气层时，位于其前方的压缩空气才是它发热发光的原因&mdash;&mdash;当流星以超快的速度向地球方向坠落时，压缩空气与流星的表面产生了巨大摩擦，从而让我们欣赏到明亮流星划过天际的美景。<br /><strong>人会被从高楼掉下的硬币砸死</strong> <br />在电影里经常能看见这样陈腐的情节，其实无论是在现实生活中还是从科学的角度考量都没有发生过这样的事。如果一个人真的被从高楼落下的硬币砸到的话，撑死只会感到一阵刺痛，流点血，好像被叮了一下似的，除此之外啥大事也没有。<br /><strong>死亡的脑细胞不可以再生</strong> <br />这可是我们以前生物课上所教授的定理，相信每个人都会有在用脑过度时为那些死去而不能复生的脑细胞默哀的时候。不过你知道吗，已经有瑞典的科学家成功证明了脑细胞的再生能力，颠覆了这一所谓真理。<br /><strong>月球有自身的暗面</strong> <br />真实情况是，月球的全部表面都会被太阳照亮，产生此误解主要是因为我们在地球上是不能看见月球的全景的，造成这一点的原因则是因为潮汐锁定现象。当一个天体绕着另一个天体公转时会产生潮汐磨擦，让自转减慢，最终会造成以同一面持续面对另一天体的状态，这就是潮汐锁定。<br /><strong>食物掉地5秒内捡起还能安全食用</strong> <br />简直一派胡言！如果地上有细菌，那么吃的东西一落地它们就会立即攀附在食物上。除非你真的是勤俭持家的好孩子或狂热的美食爱好者，不然就听从医生的建议忍痛扔掉吧，谨防病从口入啊！<br /><strong>北极星是北半球最亮的星</strong> <br />这可算得上是一个全民误解。事实上，位于北半球的天狼星就比北极星亮，它的视星等是﹣1.47，而北极星的则是1.97，视星等越小的星星就越明亮。（视星等是天文学上用以划分天体明亮程度的单位之一&mdash;&mdash;编者按）。<br /><strong>人暴露于真空的外太空会爆炸</strong> <br />估计大家都在科幻电影中看到过这令人恐怖的一幕。然而真实情况是，人会在外太空存活15到30秒，直到肺里的空气耗尽。所以当你暴露在外太空没有外星人追杀时，常规的死法应当是窒息而死。<br /><strong>进化总是向更高级别的物种发展的</strong> <br />我们都知道自然选择会淘汰那些劣等和不健康的基因，但实际上还是会有一些不完美的有机形态在此过程中保留了下来。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E7%25A7%2591%25E5%25AD%25A6/" rel="tag">科学</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B0%25A3%25E8%25A8%2580/" rel="tag">谣言</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/725.htm</link>
<title><![CDATA[支持下小刚的《唐山大地震》]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 10 Aug 2010 08:02:26 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/725.htm</guid> 
<description>
<![CDATA[ 
	这是一部好片。<br />起源是一个QQ群的一封群邮件。虽然媒体、广告&hellip;&hellip;到处都在做宣传，但是一开始我们都没当回事，就以为只是一个新片的炒作。<br />以下是群邮件的截图：<br /><img class="insertimage" src="attachment.php?fid=94" border="0" width="760" height="3450" /><br />今天中午吃完饭，和老婆一起看了。片子很不错，情节很感人。我能说的就这么多了，希望朋友们都看看。我打算过两天有空了到电影院再去支持一下正版。 <div>76年我们也许没经历过，但08我们是经历过的。我支持本片。<br /><br /><img class="insertimage" src="attachment.php?fid=95" border="0" width="716" height="1000" /></div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%2594%2590%25E5%25B1%25B1/" rel="tag">唐山</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259C%25B0%25E9%259C%2587/" rel="tag">地震</a> , <a href="http://www.gaobo.info/go.php/tags/earthquake/" rel="tag">earthquake</a> , <a href="http://www.gaobo.info/go.php/tags/after/" rel="tag">after</a> , <a href="http://www.gaobo.info/go.php/tags/shock/" rel="tag">shock</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/724.htm</link>
<title><![CDATA[几个小技巧]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Mon, 09 Aug 2010 13:04:01 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/724.htm</guid> 
<description>
<![CDATA[ 
	<strong>1.简易判断ip地址合法性</strong><br/><div class="code">if(!strcmp(long2ip(sprintf(&quot;%u&quot;,ip2long($ip))),$ip)) &#123;<br/>echo &quot;is ip&#92;n&quot;;<br/>&#125;</div><br/><br/><strong>2.E-Mail的正则判断</strong><br/><div class="code">eregi(&quot;^&#91;_&#92;.0-9a-zA-Z-&#93;+@(&#91;0-9a-zA-Z&#93;&#91;0-9a-zA-Z_-&#93;+&#92;.)+&#91;a-zA-Z&#93;&#123;2,6&#125;$&quot;, $email);</div><br/><br/><strong>3.检测ip地址和mask是否合法的例子</strong><br/><div class="code">$ip = &#039;192.168.0.84&#039;;<br/>$mask = &#039;255.255.255.0&#039;;<br/>$network = &#039;192.168.0&#039;;<br/><br/>$ip = ip2long($ip);<br/>$mask = ip2long($mask);<br/>$network = ip2long($network);<br/><br/>if( ($ip &amp; $mask) == $network) echo &quot;valid ip and mask&#92;n&quot;;</div><br/><strong>4.关于表单刷新</strong><br/>问：为什么我在点击浏览器的后退按钮后，所有字段的信息都被清空了？<br/>答：这是由于你在你的表单提交页面中使用了 session_start 函数。该函数会强制当前页面不被缓存。<br/>解决办法为，在你的 Session_start 函数后加入 header(“Cache-control: private”);<br/>注意在本行之前你的PHP程序不能有任何输出。<br/>补充：还有基于session的解决方法，在session_start前加上<br/><div class="code">session_cache_limiter(&#039;nocache&#039;);// 清空表单<br/>session_cache_limiter(&#039;private&#039;); //不清空表单，只在session生效期间<br/>session_cache_limiter(&#039;public&#039;); //不清空表单，如同没使用session一般</div><br/>可以在session_start();前加上 session_cache_limiter("private,max-age=10800");<br/><br/><strong>5.快速搞定文件下载头部输出</strong><br/><div class="code">header(&quot;Content-type: application/x-download&quot;);<br/>header(&quot;Content-Disposition: attachment; filename=$file_download_name;&quot;);<br/>header(&quot;Accept-Ranges: bytes&quot;);<br/>header(&quot;Content-Length: $download_size&quot;);<br/>echo &#039;xxx&#039;;</div><br/><br/><strong>6.用header输出FTP下载方式，并且支持断点续传</strong><br/><div class="code">header(&#039;Pragma: public&#039;);<br/>header(&#039;Cache-Control: private&#039;);<br/>header(&#039;Cache-Control: no-cache, must-revalidate&#039;);<br/>header(&#039;Accept-Ranges: bytes&#039;);<br/>header(&#039;Connection: close&#039;);<br/>header(&quot;Content-Type: audio/mpeg&quot;);<br/>header(&quot;Location:ftp://download:1@1.1.1.1/1/1/1.rmvb&quot;);</div><br/><br/><strong>7.一个不错的打印DEBUG信息的函数</strong><br/><div class="code">function debug()<br/>&#123;<br/>if (!defined(&#039;DEBUG&#039;))&#123;<br/>return;<br/>&#125;<br/>$args = func_get_args();<br/>$msg = $args&#91;0&#93;;<br/>array_shift($args);<br/>$else = implode(&#039; &#039;, $args);<br/>printf(&quot;&#91;Debug&#93; $msg &#91;addition info&#93;: $else&#92;n&quot;);<br/>&#125;</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/tip/" rel="tag">tip</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%258A%2580%25E5%25B7%25A7/" rel="tag">技巧</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/723.htm</link>
<title><![CDATA[Header 跳转详细规则 函数]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Mon, 09 Aug 2010 12:57:15 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/723.htm</guid> 
<description>
<![CDATA[ 
	函数定义：<br/><div class="code">&lt;?php<br/>/**<br/>* HTTP Protocol defined status codes<br/>* @param int $num<br/>*/<br/>function statHTTPStatus($num) &#123;<br/>&nbsp;&nbsp;static $http = array (<br/>&nbsp;&nbsp;&nbsp;&nbsp;100 =&gt; &quot;HTTP/1.1 100 Continue&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;101 =&gt; &quot;HTTP/1.1 101 Switching Protocols&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;200 =&gt; &quot;HTTP/1.1 200 OK&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;201 =&gt; &quot;HTTP/1.1 201 Created&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;202 =&gt; &quot;HTTP/1.1 202 Accepted&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;203 =&gt; &quot;HTTP/1.1 203 Non-Authoritative Information&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;204 =&gt; &quot;HTTP/1.1 204 No Content&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;205 =&gt; &quot;HTTP/1.1 205 Reset Content&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;206 =&gt; &quot;HTTP/1.1 206 Partial Content&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;300 =&gt; &quot;HTTP/1.1 300 Multiple Choices&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;301 =&gt; &quot;HTTP/1.1 301 Moved Permanently&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;302 =&gt; &quot;HTTP/1.1 302 Found&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;303 =&gt; &quot;HTTP/1.1 303 See Other&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;304 =&gt; &quot;HTTP/1.1 304 Not Modified&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;305 =&gt; &quot;HTTP/1.1 305 Use Proxy&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;307 =&gt; &quot;HTTP/1.1 307 Temporary Redirect&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;400 =&gt; &quot;HTTP/1.1 400 Bad Request&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;401 =&gt; &quot;HTTP/1.1 401 Unauthorized&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;402 =&gt; &quot;HTTP/1.1 402 Payment Required&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;403 =&gt; &quot;HTTP/1.1 403 Forbidden&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;404 =&gt; &quot;HTTP/1.1 404 Not Found&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;405 =&gt; &quot;HTTP/1.1 405 Method Not Allowed&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;406 =&gt; &quot;HTTP/1.1 406 Not Acceptable&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;407 =&gt; &quot;HTTP/1.1 407 Proxy Authentication Required&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;408 =&gt; &quot;HTTP/1.1 408 Request Time-out&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;409 =&gt; &quot;HTTP/1.1 409 Conflict&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;410 =&gt; &quot;HTTP/1.1 410 Gone&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;411 =&gt; &quot;HTTP/1.1 411 Length Required&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;412 =&gt; &quot;HTTP/1.1 412 Precondition Failed&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;413 =&gt; &quot;HTTP/1.1 413 Request Entity Too Large&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;414 =&gt; &quot;HTTP/1.1 414 Request-URI Too Large&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;415 =&gt; &quot;HTTP/1.1 415 Unsupported Media Type&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;416 =&gt; &quot;HTTP/1.1 416 Requested range not satisfiable&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;417 =&gt; &quot;HTTP/1.1 417 Expectation Failed&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;500 =&gt; &quot;HTTP/1.1 500 Internal Server Error&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;501 =&gt; &quot;HTTP/1.1 501 Not Implemented&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;502 =&gt; &quot;HTTP/1.1 502 Bad Gateway&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;503 =&gt; &quot;HTTP/1.1 503 Service Unavailable&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;504 =&gt; &quot;HTTP/1.1 504 Gateway Time-out&quot;<br/>&nbsp;&nbsp;);<br/>&nbsp;&nbsp;header($http&#91;$num&#93;);<br/>&#125;<br/>?&gt;</div><br/>用法：<br/><div class="code">&lt;?php<br/>statHTTPStatus(301);<br/>Header(&quot;Location: http://www.gaobo.info/&quot;);<br/>exit;<br/>?&gt;</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/header/" rel="tag">header</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2587%25BD%25E6%2595%25B0/" rel="tag">函数</a> , <a href="http://www.gaobo.info/go.php/tags/function/" rel="tag">function</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/722.htm</link>
<title><![CDATA[一个短小精悍的MySQL类]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Mon, 09 Aug 2010 12:54:38 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/722.htm</guid> 
<description>
<![CDATA[ 
	<p><a href="attachment.php?fid=93">点击这里下载文件</a></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.gaobo.info/go.php/tags/class/" rel="tag">class</a> , <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593/" rel="tag">数据库</a> , <a href="http://www.gaobo.info/go.php/tags/db/" rel="tag">db</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/720.htm</link>
<title><![CDATA[绑定Bluehost主域名到任意目录]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[站点进化史]]></category>
<pubDate>Wed, 04 Aug 2010 09:23:00 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/720.htm</guid> 
<description>
<![CDATA[ 
	BlueHost的主机还是不错的，速度也还能接受，只是注册的时候填写的主域名默认是绑定到/public_html下的，不太方便，官方已经有了解决办法：<a href="http://helpdesk.bluehost.com/index.php/kb/article/000347" target="_blank">http://helpdesk.bluehost.com/index.php/kb/article/000347</a><br/>做法如下：<br/>打开/public_html下的.htaccess，在后边新增<br/><div class="code"># Bluehost.com<br/># .htaccess main domain to subdirectory redirect<br/># Copy and paste the following code into the .htaccess file<br/># in the public_html folder of your hosting account<br/># make the changes to the file according to the instructions.<br/># Do not change this line.<br/>RewriteEngine on<br/># Change yourdomain.com to be your main domain.<br/>RewriteCond %&#123;HTTP_HOST&#125; ^(www.)?yourmaindomain.com$<br/># Change &#039;subdirectory&#039; to be the directory you will use for your main domain.<br/>RewriteCond %&#123;REQUEST_URI&#125; !^/subdirectory/<br/># Don&#039;t change this line.<br/>RewriteCond %&#123;REQUEST_FILENAME&#125; !-f<br/>RewriteCond %&#123;REQUEST_FILENAME&#125; !-d<br/># Change &#039;subdirectory&#039; to be the directory you will use for your main domain.<br/>RewriteRule ^(.*)$ /subdirectory/$1<br/># Change yourdomain.com to be your main domain again.<br/># Change &#039;subdirectory&#039; to be the directory you will use for your main domain<br/># followed by / then the main file for your site, index.php, index.html, etc.<br/>RewriteCond %&#123;HTTP_HOST&#125; ^(www.)?yourmaindomain.com$<br/>RewriteRule ^(/)?$ subdirectory/index.php &#91;L&#93;</div><br/>把其中的yourmaindomain.com换成主域名，subdirectory改成子目录名字即可。<br/>注意，这么做后/public_html目录下不能有index.php，否则访问的时候会打开这个文件。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/bluehost/" rel="tag">bluehost</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E4%25B8%25BB%25E6%259C%25BA/" rel="tag">虚拟主机</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BB%2591%25E5%25AE%259A/" rel="tag">绑定</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%259B%25AE%25E5%25BD%2595/" rel="tag">目录</a> , <a href="http://www.gaobo.info/go.php/tags/htaccess/" rel="tag">htaccess</a> , <a href="http://www.gaobo.info/go.php/tags/rewrite/" rel="tag">rewrite</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/721.htm</link>
<title><![CDATA[重庆电信ADSL的VPI和VCI]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Mon, 02 Aug 2010 14:42:24 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/721.htm</guid> 
<description>
<![CDATA[ 
	VPI：0<br />VCI：35<br />PS，Tecom的路由器稳定性还是不错的，呵呵。双天线好强大，华硕那个可以安心下岗了。<br /><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/tecom/" rel="tag">tecom</a> , <a href="http://www.gaobo.info/go.php/tags/adsl/" rel="tag">adsl</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2587%258D%25E5%25BA%2586/" rel="tag">重庆</a> , <a href="http://www.gaobo.info/go.php/tags/vpi/" rel="tag">vpi</a> , <a href="http://www.gaobo.info/go.php/tags/vci/" rel="tag">vci</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2597%25A0%25E7%25BA%25BF/" rel="tag">无线</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B7%25AF%25E7%2594%25B1%25E5%2599%25A8/" rel="tag">路由器</a> , <a href="http://www.gaobo.info/go.php/tags/wireless/" rel="tag">wireless</a> , <a href="http://www.gaobo.info/go.php/tags/router/" rel="tag">router</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258D%258E%25E7%25A1%2595/" rel="tag">华硕</a> , <a href="http://www.gaobo.info/go.php/tags/asus/" rel="tag">asus</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/719.htm</link>
<title><![CDATA[ESX4.0升级至U2的方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Fri, 09 Jul 2010 08:22:23 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/719.htm</guid> 
<description>
<![CDATA[ 
	<p>话说这个过程用U2的升级ISO文件刻盘也可以完成。Parallel，以下是手动升级过程：<br /><br />将ESX Server进入维护模式<br />upload the *.zip to ESX<br />#unzip *.zip<br />#esxupdate update -m metadata.zip<br /><br />而且没必要先升级到U1，直接升级到U2即可。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/esx/" rel="tag">esx</a> , <a href="http://www.gaobo.info/go.php/tags/vsphere/" rel="tag">vsphere</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/virtualization/" rel="tag">virtualization</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E5%258C%2596/" rel="tag">虚拟化</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E6%259C%25BA/" rel="tag">虚拟机</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8/" rel="tag">服务器</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/718.htm</link>
<title><![CDATA[在WinXP下配置PHP 5.2.13出现的囧事]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Mon, 05 Jul 2010 08:16:38 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/718.htm</guid> 
<description>
<![CDATA[ 
	今天需要在一个WinXP下配置一个PHP 5.2.13的开发环境，开始图省事，安装IIS以后，下载一个PHPOpt4IIS安装，结果装完打开localhost查看phpinfo()，报错：&ldquo;您未被授权查看该页&rdquo;和&ldquo;HTTP 错误 401.3 - 未经授权：访问由于 ACL 对所请求资源的设置被拒绝。&rdquo;<br />很诡异的错误信息。<br />一开始以为是Web目录的权限问题，反复修改IUSR用户的权限，甚至连这个用户的密码都修改和同步了还是没变化&hellip;&hellip;&hellip;&hellip;<br />重新GG、BAIDU了下，<a href="http://hi.baidu.com/daxxing/blog/item/d7a2e0c8053566137e3e6f44.html" target="_blank">有人提到这个可能性</a>：<br />&ldquo;翻了好多网站，看到有说为了安全，把windows目录去掉了user组，asp.net就无法正常使用了，想想不会是是php.exe php.ini php5isapi.dll这几个文件没有users的问题导致吧&rdquo;<br />抱着试一试的心理打开Windows&#92;System32目录下的所有PHP Dlls的属性，切换到&ldquo;安全&rdquo;选项卡，提示这些文件之间权限不一致，是否清除到默认，选择是，再次查看，发现OK了。<br />iisreset<br />打开localhost查看phpinfo()，Oh YEAH!!<br /><br />=============不怎么华丽的分割线=============<br /><br />配置好PHP后发现无论怎么设置extension_dir都无效，各种扩展都无法被加载，继续囧&hellip;&hellip;<br />突然发现用的是NTS（Non-Thread Safe）的版本，马上换一个TS的试一下。<br />好了。<br />继续囧&hellip;&hellip;<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/xp/" rel="tag">xp</a> , <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/localhost/" rel="tag">localhost</a> , <a href="http://www.gaobo.info/go.php/tags/phpinfo/" rel="tag">phpinfo</a> , <a href="http://www.gaobo.info/go.php/tags/iusr/" rel="tag">iusr</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259D%2583%25E9%2599%2590/" rel="tag">权限</a> , <a href="http://www.gaobo.info/go.php/tags/nts/" rel="tag">nts</a> , <a href="http://www.gaobo.info/go.php/tags/thread/" rel="tag">thread</a> , <a href="http://www.gaobo.info/go.php/tags/safe/" rel="tag">safe</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/717.htm</link>
<title><![CDATA[WSF/PHP调用带有WS-Security支持的Web Service时的注意事项]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Mon, 05 Jul 2010 04:30:42 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/717.htm</guid> 
<description>
<![CDATA[ 
	<p>目前在PHP中调用带有WS-Security支持的Web Service解决方案还是比较少的，WSF/PHP是一个不错的选择，官方首页为<a href="http://wso2.org/projects/wsf/php"><a href="http://wso2.org/projects/wsf/php" target="_blank">http://wso2.org/projects/wsf/php</a></a>，下面就介绍下在运用WSF/PHP的时候需要注意的一些地方</p><p>1、WSF/PHP【WSO2 Web Services Framework for PHP】 是WSO2.ORG提供的专门针对PHP调用Web Service的一个优秀框架，使用非常简单；但是WSO2不仅仅提供针对PHP的ws框架，而且还对其他很多中语言提供开发框架，比如基于Spring、Perl、Ruby&hellip;&hellip;，除此之外还提供很多其他框架和培训服务，具体可查询wso2.org和wso2.com；<br />2、WSF/PHP模块的安装需要很多其他的支持包，在windows下面体现为一些dll文件，主要包括Libxml2、iconv、Openssl、zlib，而不仅仅是Libxml2【GNOME XML Library】；安装过程中需要将这些依赖dll全部都集中到wsf_c/lib/目录中；这些依赖包可以到<a href="http://www.zlatkovic.com/pub/libxml/"><a href="http://www.zlatkovic.com/pub/libxml/" target="_blank">http://www.zlatkovic.com/pub/libxml/</a></a>下载，下载完成之后对各压缩包解压，dll文件一般位于/bin/目录中；<br />3、WSF所依赖的这些dll文件一定需要copy到/windows/system32/中才行，否则加载模块不成功；这点和官方文档中说的直接将wsf_c/lib/加入到path中即可是不一致的；当然这点可能有其他方式可以解决，因为我不精通PHP，但是和一些同事沟通过，但没结果；<br />4、验证是否正常加载了WSF模块，只用php -m命令查看列表是不够的，即时WSF模块没有加载成功，但是php.ini中设置了WSF模块，那php -m的列表中也会包括WSF；最保险的做法是查看服务器日志比如Apache；<br />5、在申明WSSecurityToken实例的时候，参数receiverCertificate是用来加密Soap消息的，而不是用来验证服务端返回的签名信息的，所以若只是需要签名，那该参数无需设置；WSF/PHP目前还没有提供验证服务端返回的签名信息功能的；<br />6、WSF/PHP调用WS时默认使用SOAP 1.2协议，这可能会对某些服务端ws调用时出错，若需要设置使用SOAP版本，则可以在申请WSClient实例时设置参数&quot;useSOAP&quot; =&gt; &quot;1.1&quot;实现</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/web/" rel="tag">web</a> , <a href="http://www.gaobo.info/go.php/tags/service/" rel="tag">service</a> , <a href="http://www.gaobo.info/go.php/tags/ws/" rel="tag">ws</a> , <a href="http://www.gaobo.info/go.php/tags/security/" rel="tag">security</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/716.htm</link>
<title><![CDATA[关于“渐冻人”]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 29 Jun 2010 09:16:18 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/716.htm</guid> 
<description>
<![CDATA[ 
	今天中午在中央10套的&ldquo;人与社会&rdquo;栏目看到了王甲的事情，才知道他和霍金得了同样的病&mdash;&mdash;<strong>渐冻人症<br /></strong>下午又在CB上看到了同内容的新闻：<a href="http://www.cnbeta.com/articles/114534.htm"><a href="http://www.cnbeta.com/articles/114534.htm" target="_blank">http://www.cnbeta.com/articles/114534.htm</a></a><br />摘录霍金的回信与大家共勉：<br /><div class="quote"><div class="quote-title">引用</div><div class="quote-content"> <p style="text-indent: 2em">王甲先生：</p><p style="text-indent: 2em">我对你的寄语是， 将注意力放到残疾不能阻挡的事业之上，并且坚定地将它做下去！不要抱怨已经发生的问题，身体虽然残障了，不要在精神上残障。</p><p style="text-indent: 2em">无论如何，不幸的生活有其相似性，但总有事情你能够去做，并且你也可以做得很好！只要有生命，就不 该放弃希望。</p><p style="text-indent: 2em">对于我来说，我自身的残疾并没有阻挡我成为一个阅历丰富、精神充实的 人。并且，身患重病的我还拥有了三个可爱的孩子。对我而言，我的家庭是我人生不可或缺的一部分。</div></div></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E4%25BA%25BA%25E4%25B8%258E%25E7%25A4%25BE%25E4%25BC%259A/" rel="tag">人与社会</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%259C%258D%25E9%2587%2591/" rel="tag">霍金</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%258E%258B%25E7%2594%25B2/" rel="tag">王甲</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B8%2590%25E5%2586%25BB%25E4%25BA%25BA/" rel="tag">渐冻人</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/715.htm</link>
<title><![CDATA[“国学精粹”读书活动推荐书目]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 24 Jun 2010 00:54:41 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/715.htm</guid> 
<description>
<![CDATA[ 
	<p>（来源：国学网，<a href="http://www.guoxue.com/"><a href="http://www.guoxue.com/" target="_blank">http://www.guoxue.com/</a></a>）</p><p></p><p>五术六艺诸子百家之说，都能称为&ldquo;国学&rdquo;，所以，国学又称为&ldquo;中国学&rdquo;、汉学。</p><p>《四库全书》分经、史、子、集四部分，又称&ldquo;四库&rdquo;。部下有类，类下有属。全书共4部44类66属。经部收录儒家&ldquo;十三经&rdquo;及相关著作；史部收录史书；子部收录诸子百家著作和类书；集部收录诗文词总集和专集等。《四库全书》的分类法是中国古代最具代表性的图书分类法之一。</p><p>　　1．经 部：《易经》、《尚书》、《诗经》、《周礼》、《仪礼》、《礼记》、《大学》、《中庸》、《孟子》、《论语》、《孝经》、《尔雅》、《春秋左传》、《春秋公羊传》、《春秋谷梁传》。</p><p>　　2．史 部：《史记》、《汉书》、《晋书》、《宋书》、 《梁书》、《陈书》、 《魏书》、《周书》、《隋书》、《南史》、《北史》、《宋史》、《辽史》、 《金史》、《元史》、《明史》、《史通》、《战国策》、《后汉书》、《三国志》 、《南齐书》、《北齐书》、《旧唐书》、《新唐书》、《列女传》、《越绝书》、 《水经注》、《岛夷志略》、《旧代史》、《新五代史》、《吴越春秋》、《风俗通义》、《华阳国志》、《建康实录》、《贞观政要》、《资治通鉴》、《天工开物》、《东周列国志》。</p><p>　　3．子 部 </p><p>　　儒家：《道德经》、《荀子》、《说苑》、《帝范》、《政训》、《潜书》、 《新序》、《盐铁论》、《潜夫论》、《近思录、》、《郁离子》、《传习录》 《呻吟语》、《孔子家语》、《温公家范》、《袁氏世范》。</p><p>　　兵家：《孙子兵法》、《吴子》、《司马法》、《尉缭子》、《孙膑兵法》、《六韬》、《三略》、《握奇经》、《素书》 、《将苑》、《李卫公问对》、《虎钤经》、《守城录》、《练兵实纪》、《纪效新书》、《何博士备论》。</p><p>　　法家：《管子》、《商君书》、《韩非子》、《齐民要术》、《农桑辑要》。</p><p>　　医家：《黄帝内经》、《神农本草经》、《黄帝八十一难经》、《洗冤集录》。</p><p>数理天文类 ：《周髀算经》 。</p><p>杂家：《山海经》。</p><p>小说：《西游记》、《水浒传》、《三国演义》、《醒世恒言》、《喻世明言》、《警世通言》、《拍案惊奇》、《二刻拍案惊奇》、《封神演义》、《红楼梦》、《儒林外史》。</p><p>　&nbsp; 4．集 部：《楚辞》、《诗品》、《曲品》、《南戏》、《花间集》、《柳永词》、《晏殊词》、《东坡词》、《秦观词》、《放翁词》、《姜夔词》、《楚辞》、《乐府诗集》、《历代辞赋选》、《汉代诗选》、《魏晋诗选》、《南朝诗选》、《全唐诗》、《唐诗三百首》、 《唐五代词选》、《唐宋名家词选》、《千家诗》、《全宋词》、《全宋诗》、《金元明清诗选》、《全元曲》、《明清词选、《文选》、《古文观止》、《李太白集》、《杜工部集》、《韩昌黎集》、《柳河东集》、《白香山集》、《东坡全集》、《文心雕龙》、《沧浪诗话》、《诗品》、《六一诗话》。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%259B%25BD%25E5%25AD%25A6/" rel="tag">国学</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25B2%25BE%25E7%25B2%25B9/" rel="tag">精粹</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AF%25B8%25E5%25AD%2590%25E7%2599%25BE%25E5%25AE%25B6/" rel="tag">诸子百家</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2598%2593%25E7%25BB%258F/" rel="tag">易经</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B0%259A%25E4%25B9%25A6/" rel="tag">尚书</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AF%2597%25E7%25BB%258F/" rel="tag">诗经</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2591%25A8%25E7%25A4%25BC/" rel="tag">周礼</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25BB%25AA%25E7%25A4%25BC/" rel="tag">仪礼</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25A4%25BC%25E8%25AE%25B0/" rel="tag">礼记</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25A4%25A7%25E5%25AD%25A6/" rel="tag">大学</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25B8%25AD%25E5%25BA%25B8/" rel="tag">中庸</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AD%259F%25E5%25AD%2590/" rel="tag">孟子</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AE%25BA%25E8%25AF%25AD/" rel="tag">论语</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/714.htm</link>
<title><![CDATA[数据库方面的经典网站]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Wed, 09 Jun 2010 00:56:56 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/714.htm</guid> 
<description>
<![CDATA[ 
	<a href="http://www.dbms2.com/"><a href="http://www.dbms2.com/" target="_blank">http://www.dbms2.com/</a></a><br /><a href="http://www.odbms.org/blog/"><a href="http://www.odbms.org/blog/" target="_blank">http://www.odbms.org/blog/</a></a><br /><a href="http://perspectives.mvdirona.com/"><a href="http://perspectives.mvdirona.com/" target="_blank">http://perspectives.mvdirona.com/</a></a><br /><a href="http://databasecolumn.vertica.com/"><a href="http://databasecolumn.vertica.com/" target="_blank">http://databasecolumn.vertica.com/</a></a><br /><a href="http://asktom.oracle.com/"><a href="http://asktom.oracle.com/" target="_blank">http://asktom.oracle.com/</a></a><br /><a href="http://www.itpub.net/"><a href="http://www.itpub.net/" target="_blank">http://www.itpub.net/</a></a><br /><a href="http://peter-zaitsev.livejournal.com/"><a href="http://peter-zaitsev.livejournal.com/" target="_blank">http://peter-zaitsev.livejournal.com/</a></a><br />《MySQL High Availability》<br /><a href="http://www.dbta.com/"><a href="http://www.dbta.com/" target="_blank">http://www.dbta.com/</a></a><br /><a href="http://blogs.sybase.com/database/"><a href="http://blogs.sybase.com/database/" target="_blank">http://blogs.sybase.com/database/</a></a><br /><a href="http://blogs.sybase.com/sybaseiq/"><a href="http://blogs.sybase.com/sybaseiq/" target="_blank">http://blogs.sybase.com/sybaseiq/</a></a>(这是列式数据库的专业文章) <br /><a href="http://blogs.msdn.com/sqlcrd/"><a href="http://blogs.msdn.com/sqlcrd/" target="_blank">http://blogs.msdn.com/sqlcrd/</a></a><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/db/" rel="tag">db</a> , <a href="http://www.gaobo.info/go.php/tags/database/" rel="tag">database</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593/" rel="tag">数据库</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BB%258F%25E5%2585%25B8/" rel="tag">经典</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AB%2599%25E7%2582%25B9/" rel="tag">站点</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BD%2591%25E7%25AB%2599/" rel="tag">网站</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/713.htm</link>
<title><![CDATA[工信部备案网站打不开的解决办法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Mon, 07 Jun 2010 11:29:10 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/713.htm</guid> 
<description>
<![CDATA[ 
	工信部备案网站<a href="http://www.miibeian.gov.cn" target="_blank">www.miibeian.gov.cn</a>打不开怎么办？不能进行备案申请以及备案信息查询怎么办？<br /><p><a href="http://219.143.225.7/" target="_blank"><a href="http://219.143.225.7/" target="_blank">http://219.143.225.7/</a></a><br /><a href="http://211.94.161.70/" target="_blank"><a href="http://211.94.161.70/" target="_blank">http://211.94.161.70/</a></a><br /><a href="http://202.108.212.210/" target="_blank"><a href="http://202.108.212.210/" target="_blank">http://202.108.212.210/</a></a><br /><a href="http://202.108.212.211/" target="_blank"><a href="http://202.108.212.211/" target="_blank">http://202.108.212.211/</a></a></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%25B7%25A5%25E4%25BF%25A1%25E9%2583%25A8/" rel="tag">工信部</a> , <a href="http://www.gaobo.info/go.php/tags/mii/" rel="tag">mii</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25A4%2587%25E6%25A1%2588/" rel="tag">备案</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AB%2599%25E7%2582%25B9/" rel="tag">站点</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25B3%25BB%25E7%25BB%259F/" rel="tag">系统</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/712.htm</link>
<title><![CDATA[《非诚勿扰》节目里的音乐]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Fri, 04 Jun 2010 03:01:41 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/712.htm</guid> 
<description>
<![CDATA[ 
	<p>对节目不评论，只是列举一下其中的音乐：<br />女生出场：《girl friend》&mdash;&mdash;艾薇儿<br />男士出场：《can you feel it》&mdash;&mdash;Gambler街舞的舞曲<br />男生失败失败退场：《可惜不是你》&mdash;&mdash;梁静茹<br />被选上的女生上台时候的音乐：《GEE》&mdash;&mdash;少女时代<br />男生成功时候的音乐：《梁山伯与茱丽叶》&mdash;&mdash;卓文萱/曹格<br />第五期男生放弃选择权利时候的音乐：《you raise me up》&mdash;&mdash;Josh Groban<br />单车男和狗狗男告白的时候的音乐：《You&rsquo;ve got a friend》&mdash;JamesTaylor<br />《when you say nothing at all》&mdash;&mdash;Alison Krauss<br />放弃权利：《Just one love》&mdash;&mdash;男生合唱版<br />结束音乐：《the way back into love》&mdash;&mdash;梁静茹<br />方静跟姜山跳舞时候的音乐：《DO something》&mdash;&mdash;小甜甜布兰妮</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E9%259D%259E%25E8%25AF%259A%25E5%258B%25BF%25E6%2589%25B0/" rel="tag">非诚勿扰</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%259F%25B3%25E4%25B9%2590/" rel="tag">音乐</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B1%259F%25E8%258B%258F/" rel="tag">江苏</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258D%25AB%25E8%25A7%2586/" rel="tag">卫视</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/711.htm</link>
<title><![CDATA[删除Windows用户时提示“用户不属于此组”解决方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Thu, 03 Jun 2010 02:53:16 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/711.htm</guid> 
<description>
<![CDATA[ 
	<p>如果您是一名网络管理员，请保持经常检查服务器帐户的良好习惯，如果您看到一名陌生的帐户，而且发现这名帐户不属于任何用户组的时候，那么恭喜你，你的管理员帐户可能被克隆了，该用户很可能拥有服务器的超管权限，因为那是通过克隆你的超管帐号的sam信息建立的帐户，该用户不属于任何用户组，使用用户管理器或命令行下删除该用户时将提示&ldquo;用户不属于此组&rdquo;，正确删除方法如下：<br />运行注册表编辑器，依次展开HKEY_LOCAL_MACHINE&#92;SAM&#92;SAM，右键点击，选择权限，更改Administrators的权限为完全控制.刷新后依次展开该项下的的Domains&#92;Account&#92;Users&#92;Names&#92; 删除该子项下的陌生帐号及与之相对应的Domains&#92;Account&#92;Users里的项;返回，删除administrator在HKEY_LOCAL_MACHINE&#92;SAM&#92;SAM下的权限。重启系统搞定。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2588%25A0%25E9%2599%25A4/" rel="tag">删除</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2594%25A8%25E6%2588%25B7/" rel="tag">用户</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25B8%258D%25E5%25B1%259E%25E4%25BA%258E%25E6%25AD%25A4%25E7%25BB%2584/" rel="tag">不属于此组</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B3%25A8%25E5%2586%258C%25E8%25A1%25A8/" rel="tag">注册表</a> , <a href="http://www.gaobo.info/go.php/tags/sam/" rel="tag">sam</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/710.htm</link>
<title><![CDATA[Norton提供的更快更安全的DNS]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 01 Jun 2010 11:21:52 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/710.htm</guid> 
<description>
<![CDATA[ 
	Norton DNS是类似OpenDNS和Google DNS的域名解析服务，目前处于测试(beta)阶段。Norton DNS 宣称将提供更快，更安全，更可靠的DNS服务。<br />只需将DNS改为198.153.192.1和198.153.194.1 ，即可体验Norton DNS。 <p>这里简单的对比一下OpenDNS,GoogleDNS,NortonDNS的速度吧。<br /></p><blockquote>OpenDNS:208.67.222.222,208.67.220.220<br />GoogleDNS:8.8.8.8,8.8.4.4<br />NortonDNS:198.153.192.1,198.153.194.1</blockquote>使用命令&quot;ping -n 20 IP&quot; 测试20次Ping的时间。<br /><blockquote>OpenDNS:最短 = 218ms，最长 = 302ms，平均 = 251ms<br />GoogleDNS:最短 = 112ms，最长 = 216ms，平均 = 143ms<br />NortonDNS:最短 = 109ms，最长 = 200ms，平均 = 139ms</blockquote>结果显示NortonDNS比GoogleDNS快那么一点点，当然这个结果也许不准确，大家可以试一试。<br /><br />NortonDNS也提供了一个和Google Status类似的页面，用于报告DNS状况，地址是:<a href="http://status.nortondns.com/"><a href="http://status.nortondns.com/" target="_blank">http://status.nortondns.com/</a></a><br /><br />NortonDNS的官方网站为：<a href="http://nortondns.com/"><a href="http://nortondns.com/" target="_blank">http://nortondns.com/</a></a><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/norton/" rel="tag">norton</a> , <a href="http://www.gaobo.info/go.php/tags/dns/" rel="tag">dns</a> , <a href="http://www.gaobo.info/go.php/tags/security/" rel="tag">security</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AE%2589%25E5%2585%25A8/" rel="tag">安全</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25A7%25A3%25E6%259E%2590/" rel="tag">解析</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/709.htm</link>
<title><![CDATA[最简单实现iframe自适应高度]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Fri, 28 May 2010 16:04:32 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/709.htm</guid> 
<description>
<![CDATA[ 
	<div class="code">&lt;iframe id=&quot;iFrame1&quot; name=&quot;iFrame1&quot; width=&quot;100%&quot; onload=&quot;this.height=iFrame1.document.body.scrollHeight&quot; frameborder=&quot;0&quot; src=&quot;index.htm&quot;&gt;&lt;/iframe&gt;</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/iframe/" rel="tag">iframe</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%25AB%2598%25E5%25BA%25A6/" rel="tag">高度</a> , <a href="http://www.gaobo.info/go.php/tags/height/" rel="tag">height</a> , <a href="http://www.gaobo.info/go.php/tags/html/" rel="tag">html</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/708.htm</link>
<title><![CDATA[解决ESX 4 WebAccess不能访问]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Wed, 26 May 2010 08:27:03 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/708.htm</guid> 
<description>
<![CDATA[ 
	安装VMware ESX 4后，发现Web Access不能访问。<br />通过<strong>service vmware-webAccess status</strong>检查发现，原来ESX 4默认<strong>vmware-webAccess</strong>是没有启动的。 <p><span><span>启动Web Access：<strong>service vmware-webAccess start</strong></span></span></p><span><span>通过浏览器访问ESX Web Access检查，Web Access已经可以使用。<br /></span></span><span><span><p><span><span>设置<strong>vmware-webAccess</strong>开机时自动启动<strong>：chkconfig &ndash;level 345 vmware-webAccess on</strong></span></span></p></span></span><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/esx/" rel="tag">esx</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E6%259C%25BA/" rel="tag">虚拟机</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E5%258C%2596/" rel="tag">虚拟化</a> , <a href="http://www.gaobo.info/go.php/tags/virtualization/" rel="tag">virtualization</a> , <a href="http://www.gaobo.info/go.php/tags/webaccess/" rel="tag">webaccess</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/707.htm</link>
<title><![CDATA[如何消除网站安全的七大风险]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[站点进化史]]></category>
<pubDate>Thu, 20 May 2010 01:14:32 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/707.htm</guid> 
<description>
<![CDATA[ 
	<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">(本文来自《程序员》杂志10年02期)<br /><br /></span><br /></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">以工作中某项目的安全改善过程为例，分享了常用网站安全性的典型问题和解决对策，希望对网站开发者有借鉴意义。</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">有过网站开发经验的朋友都知道网站安全是构建网站时必须要考虑的一个因素，网站安全的重点在于服务器的安全配置管理以及程序脚本的完善性。值得注意的是，如果服务器的账号和权限由于管理不善而泄露了，即使技术上网站系统再安全，也不可避免会受到攻击。</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">在笔者曾经参与过的一个项目中，客户方邀请了专业的第三方安全测试公司进行了安全性的全面检测，同时也针对性地进行了安全性的改善，特别是在应用程序方面。此文将分享改善过程中的几个典型问题的分析和解决对策，包括SQL注入攻击、跨站点脚本攻击、验证码绕过等，希望能够为大家在改善网站安全方面的工作提供参考，并采取相应的防范措施。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">项目背景</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">该项目使用的技术和平台：</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">OS：Windows&nbsp;2008&nbsp;Server,&nbsp;Enterprise&nbsp;Edition&nbsp;64-bit</span><span style="font-size: 7.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">Database：Microsoft&nbsp;SQL&nbsp;2005&nbsp;Server,&nbsp;Standard&nbsp;Edition</span><span style="font-size: 7.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">WebServer：IIS7.0</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">开发平台：.NET&nbsp;Framework&nbsp;2.0</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">考虑到网站安全的跨平台和通用性，文中讨论时仅提供对应策略不使用实际代码，这里所有的项目网站用到的域名统一用example.com代替。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善之前</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">第三方专业安全测试公司进行测试，其中的重点问题列表如下：</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/05/%E6%9C%AA%E6%A0%87%E9%A2%98-2-300x274.gif" border="0" alt="未标题-2" title="未标题-2" width="300" height="274" /><br /></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题1：易受到SQL注入攻击</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">攻击者可以通过应用程序发送数据库命令，这些命令将被服务器执行。这可以用来对数据库进行完全控制。这些SQL注入漏洞可以通过在其中一个区域插入&ldquo;and&nbsp;7&nbsp;=&nbsp;7&nbsp;-&rdquo;或&ldquo;and&nbsp;8&nbsp;=&nbsp;9&nbsp;-&rdquo;，并比较结果进行判断。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">SQL注入攻击是由于服务器对参数检查不够，而导致攻击者借此获得敏感信息。因此，需要使用参数化查询以确保攻击者无法操作数据库的SQL查询语句。例如，如果应用程序要求输入名称，那它应该只接受字母字符、空格和撇号，而不接受任何其他字符。也就是说，在应用程序中的所有输入域实施服务器端白名单技术。特别是所有用于SQL语句的输入域，需要空格的都应该用引号括起来。 </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">在程序中所有可接受外部参数的地方进行逐一识别，以过滤危险字符。如在全局函数中定义&ldquo;禁止字符串列表&rdquo;，该表中列出所要过滤出的SQL攻击代码可能包含的字符串。</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">and&nbsp;&#124;exec&nbsp;&#124;insert&nbsp;&#124;select&nbsp;&#124;delete&nbsp;&#124;update&nbsp;&#124;count&nbsp;&#124;&nbsp;*&nbsp;&#124;chr&nbsp;&#124;mid&nbsp;&#124;master&nbsp;&#124;truncate&nbsp;&#124;char&nbsp;&#124;declare&nbsp;&#124;&lt;&#124;&gt;&#124;&rsquo;&#124;(&#124;)&#124;&#123;&#124;&#125; </span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">//当然可以根据网站的特点完善和修改本列表</span><span style="font-size: 10.5pt"> </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">接下来做如下处理：</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><img src="http://www.programmer.com.cn/wp-content/uploads/2010/05/%E6%9C%AA%E6%A0%87%E9%A2%98-1-300x74.gif" border="0" alt="未标题-1" title="未标题-1" width="300" height="74" /><br /></span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题2：易受到跨站点脚本攻击</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">此漏洞可以被用来获取身份验证Cookie，攻击管理员账户，或使应用程序的用户攻击其他服务器和系统。该漏洞可以通过在某区域中插入&ldquo;&lt;script&gt;alert(&lsquo;23389950&rsquo;);&lt;/script&gt;&rdquo;来判断。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">这也需要在本网站的所有输入域实施服务器端白名单技术。如果需要特殊字符，应该转换为更安全的形式。如适用于各种语言的HTML转码：</span></p><ul><li><span style="font-size: 10.5pt">&amp;应转换为&nbsp;&amp;；</span></li><li><span style="font-size: 10.5pt">&ldquo;应转换为&rdquo;；</span></li><li><span style="font-size: 10.5pt">&lsquo;应转换为&amp;39；</span></li><li><span style="font-size: 10.5pt">&gt;应转换为&gt;；</span></li><li><span style="font-size: 10.5pt">&lt;应转换为&lt;。</span></li></ul><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">除了这些标准的HTML转码之外，对于可疑字符串也要进行强化检查和转化，并进一步执行以下操作：（1）对各页面的输入参数进行强化检查；（2）对原来只在客户端判断的参数，在服务器端进一步强化检查;（3）最终提供了全局的转码和过滤的函数。当然这需要在性能和扩展性以及安全性方面的平衡综合考虑。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题3：非安全的CrossDomain.XML文件</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">为解决Flash/Flex系统中的跨域问题，提出了crossdomain.xml跨域策略文件。虽然可以解决跨域问题，但是也带来了恶意攻击的风险，如果该策略文件里允许访问任何域，就可能允许发起对网络服务器的跨站点请求伪造和跨站点脚本攻击。比如，不安全Flash应用程序可能会访问本地数据和用户保存的网页记录，甚至传播病毒和恶意代码。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">考虑如何确保只对提供安全资源的可信域开放允许。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">经过调查，发现在程序目录下的crossdomain.xml文件里的配置如下：</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;?xml&nbsp;version=&rdquo;1.0&Prime;?&gt;</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;!DOCTYPE&nbsp;cross-domain-policy&nbsp;SYSTEM&nbsp;&rdquo;<a href="http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd&rdquo;&gt;" target="_blank">http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd&rdquo;&gt;</a></span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;cross-domain-policy&gt;</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;allow-access-from&nbsp;domain=&rdquo;*&rdquo;&nbsp;/&gt;</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;/cross-domain-policy&gt; </span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">文件中的allow-access-from&nbsp;实体设置为星号设置为允许任何域访问，将其修改为&nbsp;&lt;allow-access-from&nbsp;domain=&rdquo;*.example.com&rdquo;&nbsp;/&gt;，表示只允许本域访问，该问题就解决了。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题4：Flash参数AllowScript-Access&nbsp;已设置为always</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">当AllowScriptAccess为always时，表明嵌入的第三方Flash文件可以执行代码。攻击者此时就可以利用该缺陷嵌入任意第三方Flash文件而执行恶意</span><span style="font-size: 10.5pt"><br /></span><span style="font-size: 10.5pt">代码。</span> </p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">AllowScriptAccess参数可以是&ldquo;always&rdquo;、&rdquo;sameDomain&rdquo;或&ldquo;never&rdquo;。三个可选值中，&ldquo;always&rdquo;&nbsp;表示Flash文件可以与其嵌入到的&nbsp;HTML&nbsp;页进行通信，即使该Flash文件来自不同于HTML页的域也可以。当参数为&ldquo;sameDomain&rdquo;时，仅当Flash文件与其嵌入到的HTML页来自相同的域时，该Flash文件才能与该HTML页进行通信，此值是AllowScriptAccess&nbsp;的默认值。而当AllowScriptAccess为&nbsp;&ldquo;never&rdquo;时，Flash文件将无法与任何HTML页进行通信。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">因此需要将AllowScriptAccess参数设置为&ldquo;sameDomain&rdquo;，可以防止一个域中的Flash文件访问另一个域的&nbsp;HTML&nbsp;页内的脚本。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;param</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">name=&rdquo;allowScriptAccess&rdquo;&nbsp;value=&rdquo;always&rdquo;&nbsp;/&gt;</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">改为</span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">&lt;param </span></p><p style="margin-top: 0pt; text-indent: 15pt; margin-bottom: 0pt"><span style="font-size: 7.5pt">name=&rdquo;allowScriptAccess&rdquo;&nbsp;value=&ldquo;sameDomain&rdquo;&nbsp;/&gt;</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题5：网站后台管理通过不安全链接实施</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">管理访问没有强制实施SSL，这可能允许攻击者监视并修改用户和服务器之间的发送的包括账户凭据在内的所有数据。如果攻击者通过代理或者路由软件拦截服务器和管理员间的通信，敏感数据可能被截获，进而管理员账户可能会受到危害。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">管理访问没有强制实施SSL，为防止数据拦截，管理访问应该强制执行HTTPS&nbsp;(SSL3.0)。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">运维对服务器进行了配置调整，单独配置支持了SSL3.0访问管理后台。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题6：验证环节可以被绕过</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">用户发布信息时，虽然有页面的验证码防止自动恶意发布，但仍可能被绕过进行自动提交。绕过的方式之一是使用过滤和识别软件，之二是可以利用Cookie或Session信息绕过验证码。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">图像失真机制本身不是特别强，可以很容易地使用公开的过滤和识别软件来识别。生成的图片也是可以预测的，因为使用的字符集很简单（只是数字），建议实现一个更强大的验证码系统。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">Cookie或session信息处理有漏洞导致验证码被绕过,&nbsp;确保每一个链接只能取得唯一的验证码，并确保每个请求产生并需要一个新的验证码。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">根据需要增加验证码的复杂度，而不只是单数字。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">经过分析发现是因为验证码被存入了Session里，而开发人员忘记在提交之后清空Session中的验证码的值，导致验证码在过期时间内一直可用，从而可能被利用多次提交。因此在提交后追加了及时清空验证码的操作。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">问题7：泄露敏感信息</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">风险</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">此信息只能用于协助利用其他漏洞，并不能直接用来破坏应用程序。网站的robots.txt文件里可以获得敏感目录的信息，这可能允许攻击者获得有关应用程序内部的其他信息，这些信息可能被用来攻击其他漏洞。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">分析</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">robots.txt不应在提供管理界面的信息。如果robots.txt文件暴露了Web站点结构，则需要将敏感内容移至隔离位置，以避免搜索引擎机器人搜索到此内容。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">改善</span><span style="font-size: 10.5pt">：</span><span style="font-size: 10.5pt">当然robots.txt要根据SEO的要求来处理，但也要同样注意安全性。如：disallow:/testadmin/，其中testadmin为管理后台，就被暴露了。可以根据实际情况是否必要决定删除robots.txt文件或者把敏感目录单独配置禁止搜索引擎搜索。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">其他问题汇总</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">除此以外，还有很多其他危害性相对较低的问题，分析如下。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: normal">问题：可能通过登录页面枚举出用户名，因为根据账户是否存在的错误信息是不同的。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: normal">对策：修改错误信息使之不带有提示性，如&ldquo;您输入的邮箱或密码不对!&rdquo;&nbsp;并且超过一定次数则对该IP进行锁定。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: normal">问题：检测到可能泄露敏感信息或被恶意利用的冗余文件，如测试文件、bak文件、临时文件。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">对策：除去服务器中的相应文件。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">问题：发现潜在机密信息，如名为order的文件很容易被联想到用户订单。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">对策：避免在文件名中含有完整的敏感词汇或不要在容易猜测到的文件中保存敏感信息，或者限制对它们的访问。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">问题：发现内部信息泄露。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">对策：除去代码中漏删的内部IP地址，内部组织，人员相关信息等。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt"><br /></span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">共性原因分析</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">在发现的问题中，71%是与应用程序相关的安全性问题。可以修改应用程序相关的安全性问题，因为它们是由应用程序代码中的缺陷造成的。29%是基础结构和平台安全性问题，可以由系统或网络管理员来修订&ldquo;基础结构和平台安全性问题&rdquo;，因为这些安全性问题是由第三方产品中的错误配置或缺陷造成的。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">综合主要的原因包括但不限于以下三个方面。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">程序方面</span></p><ul><li><span style="font-size: 10.5pt">未对用户输入正确执行危险字符清理；</span></li><li><span style="font-size: 10.5pt">Cookie和Session使用时安全性考虑不足；</span></li><li><span style="font-size: 10.5pt">HTML注释中或Hidden&nbsp;form包含敏感信息；</span></li><li><span style="font-size: 10.5pt">提供给用户的错误信息包含敏感信息；</span></li><li><span style="font-size: 10.5pt">程序员在&nbsp;Web&nbsp;页面上的调试信息等没有及时删除。</span></li><li><span style="font-size: 10.5pt">Web&nbsp;应用程序编程或配置不安全；</span></li></ul><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">配置方面</span><span style="font-size: 10.5pt"> </span><span style="font-size: 10.5pt"><br /></span></p><ul><li><span style="font-size: 10.5pt">在Web目录中留下的冗余文件没有及时清理；</span></li><li><span style="font-size: 10.5pt">Web服务器或应用程序服务器是以不安全的方式配置的。</span></li><li><span style="font-size: 10.5pt">安全规范文档不够完善，开发人员的培训不足；</span></li><li><span style="font-size: 10.5pt">开发人员的安全相关经验和安全意识不足。</span></li></ul><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-weight: bold">对于这些问题的解决方法-&mdash;&mdash;技术之外</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">对于安全问题本身的解决可能只能case&nbsp;by&nbsp;case&nbsp;，但为了预防更多潜在问题的引入，技术之外方面的改善也不容忽视：</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">1.&nbsp;对于开发人员在项目初期即进行安全开发的培训，强化安全意识。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">2.&nbsp;建立用于共享安全经验的平台，将经验形成Checklist作为安全指南文档。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">3.&nbsp;将成熟的代码成果提炼出公共安全模块以备后用。</span></p><p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-size: 10.5pt">本次改善之后总结出一些常用基本安全原则供大家参考，见&ldquo;非官方不完整网站开发安全原则&rdquo;。<br /><br />作者简介：晁晓娟，目前在互联网公司负责项目管理。InfoQ中文站SOA社区编辑，有多年的Web开发管理经验，关注项目管理、架构和产品。</span></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/site/" rel="tag">site</a> , <a href="http://www.gaobo.info/go.php/tags/safety/" rel="tag">safety</a> , <a href="http://www.gaobo.info/go.php/tags/sql/" rel="tag">sql</a> , <a href="http://www.gaobo.info/go.php/tags/injection/" rel="tag">injection</a> , <a href="http://www.gaobo.info/go.php/tags/cookie/" rel="tag">cookie</a> , <a href="http://www.gaobo.info/go.php/tags/crosssite/" rel="tag">crosssite</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AB%2599%25E7%2582%25B9/" rel="tag">站点</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BD%2591%25E7%25AB%2599/" rel="tag">网站</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AE%2589%25E5%2585%25A8%25E6%2580%25A7/" rel="tag">安全性</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B3%25A8%25E5%2585%25A5/" rel="tag">注入</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B7%25A8%25E7%25AB%2599/" rel="tag">跨站</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/706.htm</link>
<title><![CDATA[百度十年千倍成长的29条白金法则]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Fri, 30 Apr 2010 08:22:31 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/706.htm</guid> 
<description>
<![CDATA[ 
	<p>1、人一定要做自己喜欢并擅长的事情<br />2、认准了，就去做；不跟风，不动摇<br />3、专注如一<br />4、把事情做到极致<br />5、少许诺、多兑现<br />6、让数据说话<br />7、问题驱动<br />8、不唯上<br />9、对事不对人<br />10、创新求变<br />11、允许试错<br />12、迅速迭代，越变越美<br />13、保持学习心态<br />14、遇到新事物，先看看别人是怎么干的<br />15、高效率执行<br />16、用流程解决共性问题<br />17、你不是孤军<br />18、打破部门樊篱<br />19、主动分享<br />20、一定要找最优秀的人才<br />21、给最自由的空间<br />22、证明自己，用结果说话<br />23、一个人最重要的能力是判断力<br />24、每个人都要捡起地上的垃圾<br />25、百度不仅是李彦宏的，更是每一 个百度人的<br />26、用户需求决定一切<br />27、听多数人的意见，和少数人商量，自己做决定<br />28、帮助别人，成就自己<br />29、公司离破产永远只有30天</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/baidu/" rel="tag">baidu</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2599%25BE%25E5%25BA%25A6/" rel="tag">百度</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2599%25BD%25E9%2587%2591/" rel="tag">白金</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B3%2595%25E5%2588%2599/" rel="tag">法则</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/705.htm</link>
<title><![CDATA[.NET Framework 4.0 Client Profile]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Wed, 21 Apr 2010 04:26:37 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/705.htm</guid> 
<description>
<![CDATA[ 
	<p>Visual Studio 2010如期发布了，我怀着迫不及待的心情马上下载了最新的ISO来安装和感受一下。</p><p>.NET Framework 自从 2002 年发展至今，已经历了好几个版本，1.0, 1.1, 2.0, 3.0, 3.5 等不同的版本更替，.NET Framework 的Redistributable Package也愈来愈大，到了 .NET Framework 3.5 SP1 时已经膨胀到 231MB，除非软件本身就很大，不然对于 .NET 软件的Redistribute是相当不利的，除非客户端本身就有安装 .NET Framework，否则几乎都要夹带一个 .NET Framework 的Redistributable Package，如果只是一个小小的应用程序文件 (几十或几百KB) 还要夹一个那 大的 .NET Framework Redistributable Package，大概很多开发人员都会觉得麻烦，就算开发人员接受，但在企业网络的 IT 管理人员就不一定会接受了 &hellip; 所以 .NET Framework 的减肥一直都是 .NET 开发人员的愿望与期待，而 .NET Framework Client Profile 就是微软针对这个需要的主要响应。既然 .NET 应用程序不一定会用到所有的 .NET Class Library，那微软就将 .NET Framework 部份不常用的功能由主函数库中抽离出来，让Redistributable Package可以缩小，有利于重新发布应用程序。</p><p>.NET Framework Client Profile 在 .NET 3.5 时首次和开发人员见面，但是碍于它只能利用 ClickOnce 部署方式安装，因此使用它的开发人员不多，且也有许多人反应希望将 .NET Framework Client Profile 能够利用光盘或其他储存媒体转散布，微软从善如流，将 .NET Framework 4.0 的 Client Profile 改成Redistributable Package。</p><p>The .NET Framework 4 Client Profile 包含下列功能：</p><ul><li>Common Language Runtime (CLR) </li><li>ClickOnce </li><li>Windows Forms </li><li>Windows Presentation Foundation (WPF) </li><li>Windows Communication Foundation (WCF) </li><li>Entity Framework </li><li>Windows Workflow Foundation </li><li>语音 </li><li>XSLT 支援 </li><li>LINQ to SQL </li><li>Entity Framework 与 WCF Data Services 执行期设计函式库 </li><li>Managed Extensibility Framework (MEF) </li><li>动态型别 </li><li>并列程序设计功能，例如 Task Parallel Library (TPL), Parallel LINQ (PLINQ), and Coordination Data Structures (CDS) </li><li>除错客户端应用程序 </li></ul><p>下列功能不包含，要另外安装 .NET Framework 4.0 的完整版本：</p><ul><li>ASP.NET </li><li>进阶 Windows Communication Foundation (WCF) 功能 </li><li>.NET Framework Data Provider for Oracle </li><li>编译用 MSBuild </li><li>Visual Studio 2010 的项目中，下列应用程序会默认使用 .NET Framework 4.0 Client Profile，若要使用完整的 .NET Framework 功能，则要自行到项目属性中设定 target framework 至 .NET Framework 4.0： </li><li>Windows Projects (C# and Visual Basic) </li><li>Windows Presentation Foundation </li><li>WPF Application </li><li>WPF Browser Application </li><li>WPF Custom Control Library </li><li>WPF User Control Library </li><li>Windows Forms </li><li>Windows Forms Application </li><li>Windows Forms Control Library </li><li>Console Application </li><li>Empty Project </li><li>Window Service </li><li>Visual F# </li><li>F# Application </li><li>F# Tutorial </li><li>Workflow (C# and Visual Basic) </li><li>Activity Designer Library </li><li>Activity Library </li><li>Workflow Console Application </li><li>Windows Communication Foundation </li><li>WCF Service Library </li><li>Office 2007 and Office 2010 </li><li>All projects target the .NET Framework 4 Client Profile </li></ul><p><a rel="lightbox" href="file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles5CAF64E/image[2].png"></a><img class="insertimage" src="attachment.php?fid=92" border="0" /> </p><p>而 .NET Framework 4.0 Client Profile 与原有的 .NET Framework 3.5 Client Profile 不同的地方有：</p><ul><li>3.5 版本的 Client Profile 只能使用在 Web (ClickOnce)，4.0 版本则因为具有Redistributable Package，所以可同时适用于本机或 Web 安装。 </li><li>3.5 版本只支持 x86 的 Windows XP SP2/SP3，4.0 版本则支持除了 IA64 以外，.NET Framework 4 支持的所有平台。 </li><li>3.5 版本的 Client Profile 与 .NET Framework 3.5 是分开的版本，4.0 版则为 .NET Framework 4.0 完整功能的子集。 </li><li>3.5 版本会受 Windows Update 的影响自动升级到 .NET Framework 3.5，4.0 版则可以在不需要完整 .NET Framework 4.0 下自行运作，也可以分开提供服务。 </li></ul><p>不过也因为如此，当在 Visual Studio 2010 建立新项目时，如果发现 [添加引用] 中没有列出原本应该列出的组件时，可以先检查是否是项目的 target framework 设成了 .NET 4.0 Client Profile (例如 System.Web.dll 就不在 .NET 4.0 Client Profile 套件中)。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/client/" rel="tag">client</a> , <a href="http://www.gaobo.info/go.php/tags/profile/" rel="tag">profile</a> , <a href="http://www.gaobo.info/go.php/tags/visual/" rel="tag">visual</a> , <a href="http://www.gaobo.info/go.php/tags/studio/" rel="tag">studio</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/704.htm</link>
<title><![CDATA[【转】张亚勤：高科技人才管理的五个方程式]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sat, 27 Mar 2010 11:55:08 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/704.htm</guid> 
<description>
<![CDATA[ 
	<p><strong>1. IT=IQ（Talents）+IP（Intellectual Properties）</strong></p><p>吸引和培养第一流的人才，给他们架设一个足以充分发挥其才能的空间，并保护其智慧成果。</p><p>这条定律在之前的文章中我已谈过。大体上，IT=IQ+IP，这条定律展示了微软中国研发集团在两个层面的努力。一是为员工构建一个充满引力的创新磁场，让他们同才华横溢的同事们一道，在一个充满机遇与激励的环境下分享彼此的灵感和激情。奋发、进取、和谐、舒适的空间，将淋漓尽致地释放出每个人的潜能，使他们感觉到&ldquo;英雄自有用武之地&rdquo;。二是创造机会，让他们有机会参与到核心技术和产品的研发中，激扬其智慧。未来，微软中国研发集团将不断输入资金、领袖及人才，输出一项项对微软公司、对中国用户、对全球IT产业影响巨大的创新成果。</p><p><br /><strong>2. E=MC2</strong></p><p>吸纳一大批有卓越潜质的人才（M），同时缔造一个过程（C2）&mdash;&mdash;一个完全释放人才潜质的过程。在此过程中，先进的管理方式、富于感染力的企业文化将在个人、群体之间产生一系列正面的连锁反应，从而最大程度地激发出微软中国研发集团的动能（E）。</p><p>磁场理论可以解释为何天才的周围很少有庸人&mdash;&mdash;优秀的人物总是像强磁场一样时刻吸引着与他们志同道合的英才。经过多年的积累，当前研发集团形成了金字塔型的人才结构。位于金字塔顶端的员工约占20%，他们大多在微软总部或其他跨国公司的研发机构从事过多年的技术和产品创新，能力超凡，经验丰厚，甚至因成就卓越而享誉国际，形成了人才的品牌效应。这不仅是简单的&ldquo;志向&rdquo;上的吸引，更是职业生涯的加速器。在其引导下，新员工将很快成长为谙熟大型软件研发流程的&ldquo;高手&rdquo;。</p><p>对一个快速成长的研发组织，人才间的&ldquo;惺惺相惜&rdquo;固然是吸引和培养人才的渠道，但系统的&ldquo;360度培养战略&rdquo;更加重要。在这方面，微软中国研发集团投入了巨大的资源与精力，希望让每个员工在这里都能最大限度地发挥自己的潜能。目前集团内部正在进行的培训项目有100多项，涵盖研究与开发的各个领域，其中我们特地从总部引进了&ldquo;卓越软件工程&rdquo;部门（Engineering Excellence Group），通过丰富的培训项目提高我们工程师的实践技能，提升我们工程进展的效率和产品开发的质量。我们正在为每一个职位建立职业发展模型（Career Stage Profile），帮助我们的每一个员工在不同的阶段制定和实施职业发展规划。而名为&ldquo;Maco&nbsp; Polo&rdquo;的轮岗计划，则是邀请雷德蒙德总部的资深技术专家来中国工作一段时间，&ldquo;传道、授业、解惑&rdquo;。此外，我们还有面向每个员工的&ldquo;Mentorship&rdquo;制度，通过经验丰富的员工来担任&ldquo;导师&rdquo;，为我们培养了一批又一批的后起之秀，这对我们未来的成功至关重要。</p><p>此外，还要为人才提供潜能爆发的环境、过程及必要的&ldquo;刺激&rdquo;。微软中国研发集团内开放、自由、平等的氛围，是一个能让研发人员安心去做&ldquo;可以记一辈子的大事&rdquo;的地方。同时，在集团各机构工作也需时刻面对压力和挑战，因为团队之间已形成了你追我赶、不甘人后的进取氛围。</p><p><br /><strong>3. &Delta;V &bull; &Delta;P&ge;&alpha;</strong></p><p>鼓励创新，允许失败。创新而不因循。</p><p>&ldquo;粒子的动量与位置这两个变量的乘积大于某个常数&rdquo;&mdash;&mdash;海森堡测不准原理是量子力学中最重要的理论之一。微软中国研发集团将&ldquo;测不准理论&rdquo;引入到管理和文化中。&Delta;V和&Delta;P两个变量分别代表研发集团项目目标的准确度和风险度，所得出的乘积便是机构或团队发展的速度。</p><p>在确定发展目标和评估研究课题时，微软中国研发集团旗下不同职能的机构就会根据其自身的业务特点而在发展速度与风险度之间权衡一个最佳点。比如在研究院，我们强调&ldquo;鼓励创新、允许失败&rdquo;。选择课题时，我们鼓励员工去开掘那种难度极大、风险莫测，但可能给公司、给用户带来巨大利益的项目，因为投入大、风险大，成功后的影响也大。而对于产品开发部门，则更倾向于风险相对较小的项目。当然，无论是企业确定发展方向，还是研究机构评估技术课题，都应该把握一些基本原则，即确保项目是有用的、一流的、主流的、相关的。</p><p>微软中国研发集团希望旗下各机构能够在一种&ldquo;创新而不因循&rdquo;的机制之下不断健康发展，创造全新的技术和产品成果，最终孵化出深刻影响公司未来及全球用户体验的产品，向全世界展现中国的创新智慧。</p><p><br /><strong>4. 1+1&ge;3</strong> </p><p>有关企业的内部交流及合作，我认为，只有在1+1&ge;3（或者说&ldquo;多赢&rdquo;）的前提下，才是有价值和有必要的。</p><p>微软中国研发集团是由本土高校培养的中国精英、海外归国华人学者及外籍技术专家构成的&ldquo;多国军团&rdquo;，而在创新实践时，研发集团员工又与微软雷德蒙德总部产品部的同事以及分布于其他国家的微软员工沟通协作，造就了研发集团独有的内部合作环境。我们强调&ldquo;融中外、弃劣扬优&rdquo;，让不同文化背景下成长起来的微软中国研发集团员工都能够互信无疑、合作无间。</p><p>另一方面，微软中国研发集团的诞生，标志着微软在华研发资源的完全整合。随着一个由基础研究、技术和产品孵化、产品开发和战略合作所组成的、前所未有的完整研发创新产业链的形成，今后，集团旗下各职能机构之间的合作必然会越来越多样、越来越广泛、越来越深入。在这种趋势下，&ldquo;1+1&ge;3&rdquo;理所当然地成为了合作的一大必要前提。我们希望微软中国研发集团旗下各机构在将创新灵感转化为技术成果、将技术成果转化为实际产品的整个流程中能够坚持&ldquo;多赢&rdquo;（对合作各方、对用户、对产业）的理念，从而使每一次合作都可释放出最大化的能量、创造出多元化的价值。</p><p><br /><strong>5. △S&gt;0（封闭系统，自发过程）</strong></p><p>我们希望构建一个开放的、共赢的IT产业生态圈（Ecosystem），和全球范围内（特别是中国）的学术界、企业界合作伙伴协力创新，共同分享资源、经验与成果。</p><p>1850年，德国物理学家鲁道夫&bull;克劳修斯（Rudolf Clausius）提出&ldquo;热力学第二定律&rdquo;的定性表述；15年后，他又首次引入了&ldquo;熵&rdquo;的概念。作为19世纪最伟大的科学发现之一，热力学第二定律说明：随着时间无限推移，封闭系统中的状态逐渐倾向于无秩序，熵趋于无限大，有规律而可用的能量趋于无限小，最终归于熵寂死的混沌。</p><p>IT企业也是这样。在全球技术共享化的今天，任何可能导致闭塞和封锁的举动都会让企业或机构无法辨识未来的机遇或危机，延缓前进的步伐。&ldquo;零和&rdquo;的自私心态只能让一个企业走向没落。因此，微软中国研发集团致力于构建一个开放的IT产业生态圈，令我们的研发人员总能在第一时间了解到其所在领域内的最新创新成果，开拓眼界、增强学术素养，以加速他们的成长。另一方面，微软中国研发集团旗下各机构还将积极与中国、亚太乃至国际范围内的IT产业同仁协力创新，共同分享资源、经验与成果。例如，向有需要的国内外企业提供技术授权；帮助合作伙伴寻找商业机遇，向他们移植微软的创新流程，培训富于研发经验、谙熟流程管理的员工等。</p><p>合作共赢是微软中国研发集团的重要发展战略。我们成立了战略合作部，通过技术授权、软件外包、人才培养等方式，把与中国信息产业的合作进一步向纵深推广。此外，在业务重点上，除移动与嵌入式技术、数字娱乐、互联网服务及服务器与工具四大领域之外，我们更把面向中国这一新兴市场的产品开发作为发展方向，希望能够通过与中国信息产业的紧密合作，真正的&ldquo;在中国创造，为中国创造&rdquo;。</p><p>IT产业的技术更新速度极其迅速，对于微软中国研发集团，秉持共赢思路、追求与所在区域产业的共同繁荣也就意味着更多的生机、更多的可能，无论对管理、经营还是文化来说都是一样的。</p><p>在微软中国研发集团独有的管理与文化氛围之中，我们正与每位员工一道，共同为早日实现成为&ldquo;微软全球技术研究和产品开发的核心研发基地&rdquo;的目标而携手努力。</p><p></p><p>作者简介： </p><p>张亚勤， 现任微软公司全球资深副总裁、微软（中国） 研发集团主席、微软（ 中国） 有限公司董事长， 负责微软公司在亚太地区的研发、技术战略和业务。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%25BC%25A0%25E4%25BA%259A%25E5%258B%25A4/" rel="tag">张亚勤</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BE%25AE%25E8%25BD%25AF/" rel="tag">微软</a> , <a href="http://www.gaobo.info/go.php/tags/microsoft/" rel="tag">microsoft</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%25AB%2598%25E7%25A7%2591%25E6%258A%2580/" rel="tag">高科技</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25BA%25BA%25E6%2589%258D/" rel="tag">人才</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">管理</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2596%25B9%25E7%25A8%258B%25E5%25BC%258F/" rel="tag">方程式</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/703.htm</link>
<title><![CDATA[用于主题检测的临时日志]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Wed, 24 Mar 2010 01:25:23 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/703.htm</guid> 
<description>
<![CDATA[ 
	<p>这是一个未删除的临时日志。请手动删除它。<br />好吧，我承认不能自动删除，我也不手动删除啦<img src="images/emot/uplook.gif" border="0" /><br />从此以后改用Windows Live Writer发Blog啦</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/live/" rel="tag">live</a> , <a href="http://www.gaobo.info/go.php/tags/writer/" rel="tag">writer</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/702.htm</link>
<title><![CDATA[WPF+C#实现获取和改变屏幕分辨率]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Tue, 23 Mar 2010 05:36:01 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/702.htm</guid> 
<description>
<![CDATA[ 
	最近做的一个WPF的东西要求程序启动的时候改变屏幕分辨率到1024*768，在程序退出的时候还原回之前的分辨率，看似简单的功能，我研究了下，发现也不是很简单的。<br/>开始用了网上搜到的最常见的代码，是一个名为SettingDisplay的类，调用SettingDisplay.SettingDisplay.ChangeRes()即可设置分辨率，结果设置到1024*768没问题，改回来就死活不行，不知道为什么，很奇怪。后来找到下边这个代码，用其中的Resolution类解决了：先new一个Resolution类的对象，然后调用setResolution()方法即可。<br/><a href="attachment.php?fid=91">点击这里下载文件</a><br/>在WPF下，设置App.xaml的Application的属性：<br/><div class="code">Startup=&quot;Application_Startup&quot; Exit=&quot;Application_Exit&quot; ShutdownMode=&quot;OnLastWindowClose&quot;</div><br/>设置分辨率的代码写在“Application_Startup”和“Application_Exit”方法里。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/wpf/" rel="tag">wpf</a> , <a href="http://www.gaobo.info/go.php/tags/resolution/" rel="tag">resolution</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2588%2586%25E8%25BE%25A8%25E7%258E%2587/" rel="tag">分辨率</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B1%258F%25E5%25B9%2595/" rel="tag">屏幕</a> , <a href="http://www.gaobo.info/go.php/tags/display/" rel="tag">display</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/701.htm</link>
<title><![CDATA[痰是棕色或枣红色是怎么回事？]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sat, 20 Mar 2010 15:09:29 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/701.htm</guid> 
<description>
<![CDATA[ 
	<p>鼻炎引起的。痰呈棕色只是表示鼻炎相对比较严重，分泌物比较粘稠，长时间粘附在咽喉处造成的。<br /><br />如果平时觉得鼻子里有黏黏的东西，有鼻屎，鼻咽处有异物感，想咽却咽不下去。或者是在吃热食的时候有鼻涕。只要符合上述表现之一，就是鼻炎引起的。鼻子里炎性的分泌物被运送到鼻咽处就粘附在了那里，出现异物感。通过口腔排出就成了痰。这些分泌物含有大量病菌和有害物质，长时间粘附在那里就会造成咽喉发炎，也就是我们所说的慢性咽炎,严重时表现出咳嗽症状。看了下面的资料你自己就知道该怎么治疗了。<br /><br />鼻炎是因为长期鼻子里发炎如感冒恶化或生理因素如怀孕或鼻腔内结构的机械性改变如鼻中隔偏曲而行成。鼻子发炎部位就会分泌出大量脓性物质，即我们所说的鼻涕。鼻涕里含有大量病菌和能让组织发炎的物质，所以鼻涕在鼻腔内的堆积将使鼻子里的炎症不断恶化和发展，并且更容易引发感冒，形成感冒&rarr;鼻炎&rarr;更容易感冒&rarr;鼻炎更严重的恶性循环。<br /><br />同时，这些鼻涕会被鼻纤毛运送到鼻咽处，但由于过于粘稠而无法滑入胃中被处理掉，就粘附在鼻咽处。这些鼻涕便不断刺激鼻咽组织，引发咽喉炎，严重时表现出咳嗽症状，分泌物从口中吐出即成了我们所说的痰。所以咽炎通常伴随鼻炎发病。<br /><br />最简单有效解决的方法就是自己去买个瑜伽洗鼻壶，将温盐水灌入其中，让水流在重力的引导下，缓缓浸洗鼻腔各个柔嫩组织，清除组织表面鼻涕及鼻涕中的病毒以及其它有害物质。早晚洗就可以了。洗的时候一定要彻底清洗掉鼻腔内的鼻涕。把鼻涕洗出去了，鼻咽处没有了刺激物，咽炎即可自然消失。同时，鼻腔内没有了鼻涕的刺激，各组织炎症将会慢慢消失。鼻腔内由先前的恶性循环转为良性循环，病变的组织细胞将逐渐被新生的健康细胞所替代，鼻炎也就自然慢慢好了，人也就不容易感冒了。刚开始洗的时候如果想早点见效，可以增加洗的次数，只要每次洗干净了，洗的次数越多，见效越快。这是理疗法，对身体非常安全，可以放心洗的。<br /><br />用药的话，药物只有短暂的消炎作用，而长期使用会不断增加细菌的耐药性，对今后的治疗和整个身体都不是好事。<br /><br />洗鼻由于是综合提高了鼻子的抵抗能力，所以对预防感冒、流感等各种非传染性和传染性疾病的效果都非常明显。也就是说，从人多的地方回来后彻底清洁鼻腔一次可对各种流感均有非常好的预防作用。<br /><br /><br /><strong>瑜伽洗鼻壶</strong><br /><strong>使用方法：</strong><br />一、一杯温水加入一撮盐（半升水加一茶匙盐&mdash;&mdash;&mdash;可按个人的敏感程度决定或多或少）。一定要让 盐 完全溶解。<br />二、将两手彻底洗干净。<br />三、清洁右鼻孔通道：将右手卷成杯状，到入一些盐水。<br />四、略向前倾，把右手举到右鼻孔前。<br />五、用小指、无名指按住左鼻孔，把它闭住，同时把右鼻孔浸到盐水中，准备吸入盐水。<br />六、轻柔地把水吸入右鼻孔。<br />七、把水保持在鼻孔中，慢慢把头向后方仰起，让水流过鼻孔进入口部。<br />八、吐出口里的盐水。<br />九、做另一侧的动作。每个鼻孔做2 5次，按具体情况而定。<br /><br /><strong>清除鼻孔的水分：</strong><br />1.做双角式，保持约30秒钟，轻轻用鼻孔喷气几次。<br />2.挺直身子站立。<br />3.然后盖住左鼻孔，用右鼻孔轻轻而又快速地呼吸，着重呼气（目的在于使鼻孔干起来）。做二十次。<br />4.用左鼻孔做同样的练习。<br />5.用两个鼻孔同时做这个练习。<br /><strong><br />益处：</strong><br />1.清除鼻孔通道的污染物和充满细菌的黏液。<br />2.每天练习能防止和医治各种各样的鼻窦和鼻腔问题。<br />3.能帮助我们更快治好感冒和感冒的后遗影响。<br />4.可以治疗鼻窦性头痛。<br />5.有助于防止和治愈耳、眼、喉疾病。<br />6.有助于唤醒眉心轮。<br />注意事项：<br />a.视环境污染程度以及你鼻窦状况如何，每天做1 3次，或隔天一次。久而久之，你会觉得这个功法像洗脸、刷牙一样方便。<br />b.小心不要把水吸进肺里。<br />c.鼻子常爱出血的人不要做这个练习。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E7%2597%25B0/" rel="tag">痰</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25A3%2595%25E8%2589%25B2/" rel="tag">棕色</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259E%25A3%25E7%25BA%25A2%25E8%2589%25B2/" rel="tag">枣红色</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%25BC%25BB%25E7%2582%258E/" rel="tag">鼻炎</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2591%259C%25E4%25BC%25BD%25E6%25B4%2597%25E9%25BC%25BB%25E5%25A3%25B6/" rel="tag">瑜伽洗鼻壶</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/700.htm</link>
<title><![CDATA[给华硕wl500gc刷新dd-wrt固件]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 18 Mar 2010 15:00:16 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/700.htm</guid> 
<description>
<![CDATA[ 
	呵呵，心血来潮刷新路由的Firmware，获得成功！过程如下：<br />看了官方文档，一开始只准备了clear_nvram和recover以及华硕刷新工具、dd-wrt的固件等，没有准备华硕官方的Firmware，而且dd-wrt的Firmware下的也是Mega版本，结果刷新到70%多的时候报错，无论怎么试都不行，囧&hellip;&hellip;<br />后来只有把路由去掉，用本子直接ADSL上网下了华硕官方的Firmware、Micro版本的dd-wrt的Firmware，先恢复了一次官方Firmware，然后仔细看了多个帖子，刷了Micro版本的Firmware，成功！上个图：<br /><img class="insertimage" src="attachment.php?fid=90" border="0" /><br />事实证明，可怜的WL500GC只有2M的Flash<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/asus/" rel="tag">asus</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258D%258E%25E7%25A1%2595/" rel="tag">华硕</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B7%25AF%25E7%2594%25B1%25E5%2599%25A8/" rel="tag">路由器</a> , <a href="http://www.gaobo.info/go.php/tags/router/" rel="tag">router</a> , <a href="http://www.gaobo.info/go.php/tags/wl500g/" rel="tag">wl500g</a> , <a href="http://www.gaobo.info/go.php/tags/dd-wrt/" rel="tag">dd-wrt</a> , <a href="http://www.gaobo.info/go.php/tags/firmware/" rel="tag">firmware</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259B%25BA%25E4%25BB%25B6/" rel="tag">固件</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/699.htm</link>
<title><![CDATA[DNSTOP——统计DNS查询的工具]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Wed, 10 Mar 2010 00:59:10 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/699.htm</guid> 
<description>
<![CDATA[ 
	在维护DNS服务器时，偶们希望知道到底是哪些用户在使用偶们的DNS服务器，同时也希望能对DNS查询做一个统计。一般情况下，偶们可以使用tcpdump –i eth0 port 53来查看DNS查询包，不过tcpdump的输出可不是那么友好，尤其是当访问量大的时候，偶就头晕了 :( ~~当然了可以把输出重定向到文件，如果熟悉shell编程的话还可以做个脚本来分析；至于查询统计嘛，可以使用rndc stats（bind9）来获取，但是这可不是实时的，当然了你也可以使用at，cron来自动运行，但这些终归都还是麻烦。。。<br/><br/>1、下载源代码 <br/>打开浏览器，进入<a href="http://dnstop.measurement-factory.com/" target="_blank">http://dnstop.measurement-factory.com/</a>，可以看到DNSTOP的相关介绍。如果你的系统没有libpcap库的话（用find / -name “libpcap*”搜一下就知道有没有了），在安装DNSTOP前还需要安装libpcap库。不管三七二十一，先把这两个源码包下载下来再说（以下链接是我写本文是最新的版本的地址，建议朋友们在用的时候去站点上找下最新的版本）： <br/>libpcap-0.7.2.tar.gz <br/><a href="http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz" target="_blank">http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz</a><br/>dnstop-20030929.tar.gz <br/><a href="http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20090128.tar.gz" target="_blank">http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20090128.tar.gz</a> <br/><br/>2、编译安装libpcap库 <br/>步骤如下： <br/><div class="code"># tar -xzvf libpcap-1.0.0.tar.gz<br/># cd libpcap-1.0.0</div><br/>注意了（大声的说~~），在这儿编译时是编译成静态函数库，但是等会儿编译DNSTOP时却是需要共享函数库（动态函数库）。所以偶们要修改一下Makefile.in文件（附件是我已经改好的，用同样版本的童鞋可以直接覆盖，版本不同的话可以比较以后在对应的地方修改）<br/><a href="attachment.php?fid=89">点击这里下载文件</a><br/>搞定！开始编译： <br/><div class="code">./configure --prefix=/usr <br/>make &amp;&amp; make install</div><br/><br/>3、编译DNSTOP <br/>步骤如下： <br/><div class="code">tar -xzvf dnstop-20090128.tar.gz<br/>make</div><br/>编译完成！<br/><br/>4、使用：<br/><div class="code">./dnstop -Q eth0</div><br/>（Q后面的参数是需要监听的网卡接口）<br/>在运行DNSTOP的过程中，可以敲入如下命令： <br/>S，D，T，1，2，^R（Ctrl+R，刷新），^X(Ctrl+X，退出)，? <br/>来显示不同的统计信息。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/dnstop/" rel="tag">dnstop</a> , <a href="http://www.gaobo.info/go.php/tags/dns/" rel="tag">dns</a> , <a href="http://www.gaobo.info/go.php/tags/bind/" rel="tag">bind</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25A7%25A3%25E6%259E%2590/" rel="tag">解析</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BB%259F%25E8%25AE%25A1/" rel="tag">统计</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259F%25A5%25E8%25AF%25A2/" rel="tag">查询</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/698.htm</link>
<title><![CDATA[C# ASP.Net连接MySQL遇到的奇怪问题]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[xNix]]></category>
<pubDate>Tue, 09 Mar 2010 02:49:44 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/698.htm</guid> 
<description>
<![CDATA[ 
	根据之前的测试，现在学校的DNS架构为CentOS 5.4+Bind 9.7+MySQL 5.1.44，Bind与MySQL在一台机器上，管理程序是用.Net写的一个Web管理界面。之前在用IBM服务器的时候运行正常，但在昨晚更替到新的Dell服务器上后发现新写入MySQL的汉字全部变成了&ldquo;??&rdquo;&hellip;&hellip;无论怎么修改数据库或表的字符集都无效。<br/>经查看，发现原IBM服务器和Dell服务器上MySQL的配置完全相同，而.Net程序也没有做关于字符集的更改，上网搜了下，使用以下方法解决了这个问题：<br/>修改my.cnf，添加以下内容：<br/><div class="code">&#91;mysqld&#93;<br/>default-character-set=utf8<br/><br/>&#91;client&#93;<br/>default-character-set=utf8<br/>init_connect=&#039;SET NAMES utf8&#039;</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/asp.net/" rel="tag">asp.net</a> , <a href="http://www.gaobo.info/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.gaobo.info/go.php/tags/charset/" rel="tag">charset</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AD%2597%25E7%25AC%25A6%25E9%259B%2586/" rel="tag">字符集</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/697.htm</link>
<title><![CDATA[Linux下常用配置文件及常用命令介绍]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[xNix]]></category>
<pubDate>Fri, 05 Mar 2010 03:02:04 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/697.htm</guid> 
<description>
<![CDATA[ 
	<p>/etc/sysconfig/network 包括主机基本网络信息，用于系统启动<br />/etc/sysconfig/network-script/ 此目录下是系统启动最初始化网络的信息<br />/etc/sysconfig/network-script/ifcfg-eth0 网络配置信息<br />/etc/xinetd.conf 定义了由超级进程XINETD启动的网络服务<br />/etc/protocols 设定了主机使用的协议以及各个协议的协议号<br />/etc/services 设定了主机的不同端口的网络服务<br />// 网络配置工具<br /># redhat-config-network <br />/* 使用ifconfig命令配置并查看网络接口情况 */<br />//配置eth0的IP，同时激活设备<br /># ifconfig eth0 192.168.168.119 netmask 255.255.255.0 up<br />//配置eth0别名设备 eth0:1 的IP，并添加路由<br /># ifconfig eth0:1 192.168.168.110<br /># route add &ndash;host 192.168.168.110 dev eth0:1<br />//激活（禁用）设备<br /># ifconfig eth0:1 up(down)<br />//查看所有（指定）网络接口配置<br /># ifconfig (eth0)<br />/* 使用route 命令配置路由表 */<br />//添加到主机路由<br /># route add &ndash;host 192.168.168.110 dev eth0:1<br /># route add &ndash;host 192.168.168.119 gw 192.168.168.1<br />//添加到网络的路由<br /># route add &ndash;net IP netmask MASK eth0<br /># route add &ndash;net IP netmask MASK gw IP<br /># route add &ndash;net IP/24 eth1<br />//添加默认网关<br /># route add default gw IP<br />//删除路由<br /># route del &ndash;host 192.168.168.110 dev eth0:1<br />/* 常用命令 */<br /># traceroute <a href="http://www.pconline.com.cn/"><a href="http://www.pconline.com.cn" target="_blank">www.pconline.com.cn</a></a><br /># ping <a href="http://www.pconline.com.cn/"><a href="http://www.pconline.com.cn" target="_blank">www.pconline.com.cn</a></a><br />//显示网络接口状态信息<br /># netstat &ndash;I<br />//显示所有监控的服务器的Socket和正在使用Socket的程序信息<br /># netstat &ndash;lpe<br />//显示内核路由表信息<br /># netstat &ndash;r<br /># netstat &ndash;nr<br />//显示TCP/UDP传输协议的连接状态<br /># netstat &ndash;t<br /># netstat &ndash;u<br />//更改主机名<br /># hostname myhost<br />//查看ARP缓存<br /># arp<br />//添加<br /># arp &ndash;s IP MAC<br />//删除<br /># arp &ndash;d IP<br />/* 运行级别与网络服务 */<br />//查看当前运行级别<br /># runlevel<br />//运行级别的切换<br /># init<br /># telinit<br /></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/linux/" rel="tag">linux</a> , <a href="http://www.gaobo.info/go.php/tags/config/" rel="tag">config</a> , <a href="http://www.gaobo.info/go.php/tags/network/" rel="tag">network</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2585%258D%25E7%25BD%25AE/" rel="tag">配置</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2591%25BD%25E4%25BB%25A4/" rel="tag">命令</a> , <a href="http://www.gaobo.info/go.php/tags/route/" rel="tag">route</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B7%25AF%25E7%2594%25B1/" rel="tag">路由</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BD%2591%25E7%25BB%259C/" rel="tag">网络</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/696.htm</link>
<title><![CDATA[都是灰尘惹的祸：研究人员发现高速路旁的居民动脉粥样硬化程度普遍较高[转]]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 02 Mar 2010 01:49:30 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/696.htm</guid> 
<description>
<![CDATA[ 
	<p><strong>据《PLoS ONE》杂志本周的一篇报告显示</strong>，<strong>居住在高速公路附近100m范围内的人群的血管壁厚度要比人类血管壁厚度的平均值高出两倍以</strong>上。在这篇报告中，来自西班牙，瑞士和美国的科学家们使用超声波测量了1483名居住在洛杉矶地区高速公路附近的居民的颈动脉血管壁厚度，在过去的三年中，科学家们每六个月便会为这 些居民测量一次颈动脉血管壁厚度，然后他们会把这些测量数据与参测居民住宅附近的悬浮颗粒污染等级联系在一起，看看两者之间有没有必然的联系。<br />根据试验的结果，三年来，那些居住在高速公路附近100米范围内的居民其血管壁厚每年都会增加5.5微米（相当于头发厚度的1/20）；而居住在这个距离高速公路100米以外的居民血管壁的厚度增长速度则低得多。<br />我们都知道，动脉粥样硬化是心血管疾病的主要诱因，而心血管类疾病则在西方国家是死亡人数最多的最致命疾病。近几年来，科学家们曾经对兔子，老鼠等动物做过试验，结果发现这些动物吸入大气中的颗粒污染物质之后，动脉粥样硬化的症状便开始加速显现。不过目前为止，还没有研究能证明动脉粥样硬化的形成是否与大气环境污染水平直接有关。 <br />报告的作者 Michael Jerrett表示：&ldquo;我们的试验首次显示空气污染状况与心血管病的早期形式--动脉粥样硬化症是有直接影响的，大约有接近半数的西方病患均是因这种病而死，而且随着亚洲和拉丁美洲这些地区工业化进程的提速，心血管病致死的比例在这些地区也在迅速提升。我们从中得到的提示是，如果我们能够控制由交通造成的空气污染水平，那么也许公众健康水平就会再上一个台阶。&rdquo;</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E7%2581%25B0%25E5%25B0%2598/" rel="tag">灰尘</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%25AB%2598%25E9%2580%259F/" rel="tag">高速</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B1%2585%25E6%25B0%2591/" rel="tag">居民</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258A%25A8%25E8%2584%2589/" rel="tag">动脉</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25B2%25A5%25E6%25A0%25B7/" rel="tag">粥样</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25A1%25AC%25E5%258C%2596/" rel="tag">硬化</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/695.htm</link>
<title><![CDATA[设置每天重启Linux服务器]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Mon, 01 Mar 2010 06:14:29 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/695.htm</guid> 
<description>
<![CDATA[ 
	刚放假那几天，正好我第一个值班，就把学校的DNS服务器改造成了现在的Linux+MySQL+Web管理的架构，不过因为时间紧，没有来得及跟办公室的同事们打招呼就回家了，还引起了一个误会，弄得大家以为我霸占了学校的服务器<img src="images/emot/cry.gif" border="0" width="24" height="24" /><br />当时Linux下的环境已经配置好了，还差一个自动重启，这是由于机器硬件比较旧（IBM X250），经过测试与观察，发现资源有点紧张，最好是能每天自动重启一下释放占用的资源。走之前我配置了crond服务，也修改了crontab列表，但时间紧没有详细测试（即使重定向到日志文件也可能会导致机器重启，这样的结果是重启机器那几分钟里无法解析域名）。假期里服务器运行也还算稳定，虽然这个crontab没有起作用，但也没有太大的问题。<br />假期结束，开学后因为师生返校开始新的学期，DNS服务器压力增大，需要解决这个自动重启的问题，我参照网上的一些办法，设置了crontab可仍旧不起作用。最后和朋友讨论了下，经过测试，发现修改这个文件后搞定了：/etc/crontab。语法嘛，和crontab -e那里写的一样，我是用的reboot命令，估计init 6也应该是差不多的。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/dns/" rel="tag">dns</a> , <a href="http://www.gaobo.info/go.php/tags/bind/" rel="tag">bind</a> , <a href="http://www.gaobo.info/go.php/tags/linux/" rel="tag">linux</a> , <a href="http://www.gaobo.info/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.gaobo.info/go.php/tags/web/" rel="tag">web</a> , <a href="http://www.gaobo.info/go.php/tags/crond/" rel="tag">crond</a> , <a href="http://www.gaobo.info/go.php/tags/cron/" rel="tag">cron</a> , <a href="http://www.gaobo.info/go.php/tags/crontab/" rel="tag">crontab</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8/" rel="tag">服务器</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2587%25AA%25E5%258A%25A8%25E9%2587%258D%25E5%2590%25AF/" rel="tag">自动重启</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25A7%25A3%25E6%259E%2590/" rel="tag">解析</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/694.htm</link>
<title><![CDATA[22个所见即所得在线Web编辑器]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Fri, 26 Feb 2010 07:28:05 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/694.htm</guid> 
<description>
<![CDATA[ 
	本文搜集了 22 个 Web 在线编辑器，它们基本代表了当前 Web 编辑器的现状。 <p><a href="http://sixrevisions.com/user-interface/rich-text-editors-for-2010-and-beyond/"><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-01_rte_lead_img.jpg" border="0" alt="Rich-Text Editors for 2010 and Beyond" width="550" height="200" /></a><br />1. <a href="http://tinymce.moxiecode.com/">TinyMCE</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-02_tinymce.jpg" border="0" alt="TinyMCE" width="550" height="182" /><br /><br />免费，开源，轻量，基于 JavaScript，高度可定制，跨平台。<br />2. <a href="http://www.fckeditor.net/">FCKEditor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-03_ckeditor.jpg" border="0" alt="FCKEditor" width="550" height="176" /><br /><br />免费，开源，用户量庞大，有良好的社区支持。<br />3. <a href="http://developer.yahoo.com/yui/editor/">YUI Editor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-04_yui.png" border="0" alt="YUI Editor" width="550" height="180" /><br /><br />属于 Yahoo! YUI 的一部分，能输出纯净 XHTML 代码。<br />4. <a href="http://nicedit.com/">NicEdit</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-05_nicedit.jpg" border="0" alt="NicEdit" width="550" height="120" /><br /><br />简单，易用，轻量，外观漂亮。<br />5. <a href="http://kupu.oscom.org/">Kupu</a> <br /><a href="http://en.wikipedia.org/wiki/Kupu"><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-06_kupu.jpg" border="0" alt="Kupu" width="550" height="168" /></a><br /><br />开源，支持 Ajax 保存，跨平台，易于集成，由 OSCOM 推出。<br /><br />6. <a href="http://www.freerichtexteditor.com/">Free Rich Text Editor</a> <br /><a href="http://www.freerichtexteditor.com/"><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-07_freerte.png" border="0" alt="Free&nbsp;&nbsp;Rich Text Editor" width="550" height="151" /></a><br /><br />非常容易部署，输出 XHTML 代码，功能丰富。<br />7. <a href="http://www.webwizguide.com/webwizrichtexteditor/">WebWiz RichTextEditor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-08_webwiz.jpg" border="0" alt="WebWiz RichTextEditor" width="550" height="145" /><br /><br />这是一个商业产品，并不免费，但功能非常丰富，基于 ASP，JavaScript 和 DHTML。<br />8. <a href="http://xstandard.com/">XStandard</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-09_xstandard.png" border="0" alt="XStandard" width="550" height="109" /><br /><br />故名思意，这个编辑器会生成符合标准的纯净 XHTML 代码。<br />9. <a href="http://avidansoft.com/dsrte/">Damn Small Rich Text Editor</a> <br /><img src="http://images.sixrevisions.com/2010/02/01-10_damnsmall.jpg" border="0" alt="Damn Small Rich Text Editor" width="550" height="150" /><br /><br />基于 jQuery 和 PHP 后台，非常小巧（~18K），但功能丰富。<br />10. <a href="http://www.themaninblue.com/experiment/widgEditor/">WidgEditor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-11_widgeditor.jpg" border="0" alt="WidgEditor" width="550" height="161" /><br /><br />简单，易用，开源，即使浏览器不支持 JavaScript，仍能很好地工作。<br />11. <a href="http://www.kevinroth.com/rte/">Kevin Roth&rsquo;s Cross Browser Rich Text Editor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-12_rothrte.jpg" border="0" alt="Kevin Roth&rsquo;s Cross Browser Rich Text Editor" width="550" height="234" /><br /><br />一个不错的编辑器，支持皮肤，符合 XHTML 标准，跨浏览器兼容，分免费版和收费版两个版本。<br />12. <a href="http://www.openwebware.com/">OpenWYSIWYG</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-13_openwysiwyg.jpg" border="0" alt="OpenWYSIWYG" width="550" height="136" /><br /><br />拥有许多出色的功能，容易部署，速度极快。<br />13. <a href="http://www.codeplex.com/rte">CodePlex Rich Text Editor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-14_codeplex.png" border="0" alt="CodePlex Rich Text Editor" width="550" height="97" /><br /><br />基于 ASP.NET，目前只支持 IE 和 Firefox。<br />14. <a href="http://freetextbox.com/">FreeTextBox</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-15_freetextbox.png" border="0" alt="FreeTextBox" width="550" height="161" /><br /><br />集成了相册，拼写检查等功能，尤其适合 ASP.NET 项目。<br />15. <a href="http://www.codeplex.com/richtextedit">Silverlight Rich Text Editor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-16_silverlight.jpg" border="0" alt="Silverlight Rich Text Editor" width="550" height="94" /><br /><br />适合与微软的 Silverlight 一起使用，功能丰富，不过，似乎原作者已经不再更新这个项目了。<br />16. <a href="http://www.bitfluxeditor.org/">BXE (Bitflux Editor)</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-17_bitflux.png" border="0" alt="BXE (Bitflux Editor)" width="550" height="94" /><br /><br />从 2002 年以来一直开源，拥有一批非常忠实的用户和社区，据称是目前最好的 WYSIWYG 编辑器之一。<br />17. <a href="http://markitup.jaysalvat.com/home/">MarkItUp!</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-18_markitup.jpg" border="0" alt="MarkItUp!" width="550" height="236" /><br /><br />基于 jQuery，轻量，支持键盘快捷键，支持多种代码，包括 HTML, Textile, Wiki Syntax, Markdown, BBcode。<br />18. <a href="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/advanced-editing-and-display/editor-rich-text">Dijit Editor for Dojo</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-19_dojo.jpg" border="0" alt="Dijit Editor for Dojo" width="550" height="100" /><br /><br />基于 Dojo JavaScript 框架，输出干净 HTML 代码，支持插件，拥有清新的按钮。<br />19. <a href="http://www.cdolivet.com/editarea/editarea/docs/">EditArea</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-20_editarea.png" border="0" alt="EditArea" width="550" height="98" /><br /><br />易于集成，干净代码，实时语法加亮，自动缩进，多语种支持，多实例支持，全屏模式等功能。<br />20. <a href="http://www.wymeditor.org/">WYMeditor</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-21_wymeditor.jpg" border="0" alt="WYMeditor" width="550" height="124" /><br /><br />输出干净的 XHTML + SCTRICT 代码，注重结构与语义，在输出结构化 XHTML 代码方面是最佳方案。<br />21. <a href="http://www.unverse.net/whizzywig-cross-browser-html-editor.html">Whizzywig</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-22_whizzywig.png" border="0" alt="Whizzywig" width="550" height="161" /><br /><br />多浏览器支持，Web 安全色选择器，支持表格，图片，Word 代码清洁，拼写检查等功能。<br />22. <a href="http://xinha.webfactional.com/">Xinha</a> <br /><img style="border: black 1px solid" src="http://images.sixrevisions.com/2010/02/01-23_xinha.png" border="0" alt="Xinha" width="550" height="152" /><br /><br />基于<a href="http://www.opensource.org/licenses/bsd-license.html">BSD协议</a>，易于部署与扩展，拥有很好的社区支持。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/web/" rel="tag">web</a> , <a href="http://www.gaobo.info/go.php/tags/editor/" rel="tag">editor</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BC%2596%25E8%25BE%2591%25E5%2599%25A8/" rel="tag">编辑器</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2589%2580%25E8%25A7%2581%25E5%258D%25B3%25E6%2589%2580%25E5%25BE%2597/" rel="tag">所见即所得</a> , <a href="http://www.gaobo.info/go.php/tags/wysiwyg/" rel="tag">wysiwyg</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/693.htm</link>
<title><![CDATA[1st wave confirmed]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[B.A.B.Y.]]></category>
<pubDate>Sun, 14 Feb 2010 05:35:54 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/693.htm</guid> 
<description>
<![CDATA[ 
	2.14真是个好日子啊好日子，哇哈哈<br />至于什么事情，一般人我不告诉他<img src="images/emot/grin.gif" border="0" width="24" height="24" /><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/baby/" rel="tag">baby</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/692.htm</link>
<title><![CDATA[Windows 7中的“上帝模式”]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 05 Jan 2010 09:39:37 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/692.htm</guid> 
<description>
<![CDATA[ 
	方法很简单：建立一个文件夹然后命名为<br /><div class="code">GodMode.&#123;ED7BA470-8E54-465E-825C-99712043E01C&#125;</div><br /><br />以下是其他一些特殊文件夹的名称：<br />回收站.&#123;645ff040-5081-101b-9f08-00aa002f954e&#125; <br />拨号网络.&#123;992CFFA0-F557-101A-88EC-00DD010CCC48&#125; <br />打印机.&#123;2227a280-3aea-1069-a2de-08002b30309d&#125; <br />控制面板.&#123;21ec2020-3aea-1069-a2dd-08002b30309d&#125; <br />网上邻居.&#123;208D2C60-3AEA-1069-A2D7-08002B30309D&#125;<br />图标clsid=windowsmedia 文件名.&#123;00020c01-0000-0000-c000-000000000046&#125; <br />无关联文件 文件名.&#123;00021401-0000-0000-c000-000000000046&#125; <br />BMP文件 文件名.&#123;d3e34b21-9d75-101a-8c3d-00aa001a1652&#125; <br />HTML文件 文件名.&#123;25336920-03f9-11cf-8fd0-00aa00686f13&#125; <br />媒体剪辑文件 文件名.&#123;00022601-0000-0000-c000-000000000046&#125; <br />打印机 文件名.&#123;2227a280-3aea-1069-A2de-08002b30309d&#125; <br />控制面板 文件名.&#123;21ec2020-3aea-1069-A2dd-08002b30309d&#125; <br />网上邻居 文件名.&#123;208d2c60-3aea-1069-A2d7-08002b30309d&#125; <br />拨号网络 文件名.&#123;992cffa0-F557-101a-88ec-00dd010ccc48&#125; <br />计划任务 文件名.&#123;D6277990-4c6a-11cf-8d87-00aa0060f5bf&#125; <br />回收站 文件名.&#123;645ff040-5081-101b-9f08-00aa002f954e&#125; <br />Web文件夹 文件名.&#123;Bdeadf00-C265-11d0-Bced-00a0c90ab50f&#125; <br />历史记录 文件名.&#123;Ff393560-C2a7-11cf-Bff4-444553540000&#125; <br />收藏夹 文件名.&#123;1a9ba3a0-143a-11cf-8350-444553540000&#125; <br />预订文件夹 文件名.&#123;F5175861-2688-11d0-9c5e-00aa00a45957&#125; <br />ActiveX高速缓存文件夹文件名.&#123;88c6c381-2e85-11d0-94de-444553540000&#125; <br />excel.&#123;00020810-0000-0000-C000-000000000046&#125; <br />word.&#123;00020900-0000-0000-C000-000000000046&#125; <br />media.&#123;00022603-0000-0000-C000-000000000046&#125; <br />CAB.&#123;0CD7A5C0-9F37-11CE-AE65-08002B2E1262&#125; <br />搜索-计算机&#123;1f4de370-d627-11d1-ba4f-00a0c91eedba&#125; <br />mht.&#123;3050F3D9-98B5-11CF-BB82-00AA00BDCE0B&#125; <br />mshta.&#123;3050f4d8-98B5-11CF-BB82-00AA00BDCE0B&#125; <br />我的文档.&#123;450D8FBA-AD25-11D0-98A8-0800361B1103&#125; <br />XML.&#123;48123bc4-99d9-11d1-a6b3-00c04fd91555&#125; <br />回收站(满).&#123;5ef4af3a-f726-11d0-b8a2-00c04fc309a4&#125; <br />回收站.&#123;645FF040-5081-101B-9F08-00AA002F954E&#125; <br />ftp_folder.&#123;63da6ec0-2e98-11cf-8d82-444553540000&#125; <br />网络和拨号连接.&#123;7007ACC7-3202-11D1-AAD2-00805FC1270E&#125; <br />写字板文档.&#123;73FDDC80-AEA9-101A-98A7-00AA00374959&#125; <br />Temporary Offline Files Cleaner.&#123;750fdf0f-2a26-11d1-a3ea-080036587f03&#125; <br />用户和密码.&#123;7A9D77BD-5403-11d2-8785-2E0420524153&#125; <br />Internet 临时文件.&#123;7BD29E00-76C1-11CF-9DD0-00A0C9034933&#125; <br />已下载的程序文件的清除程序.&#123;8369AB20-56C9-11D0-94E8-00AA0059CE02&#125; <br />公文包.&#123;85BBD920-42A0-1069-A2E4-08002B30309D&#125; <br />ActiveX 高速缓存文件夹.&#123;88C6C381-2E85-11D0-94DE-444553540000&#125; <br />mail.&#123;9E56BE60-C50F-11CF-9A2C-00A0C90A90CE&#125; <br />历史记录.&#123;FF393560-C2A7-11CF-BFF4-444553540000&#125; <br />目录.&#123;fe1290f0-cfbd-11cf-a330-00aa00c16e65&#125; <br />Internet Explorer.&#123;FBF23B42-E3F0-101B-8488-00AA003E56F8&#125; <br />Snapshot File.&#123;FACB5ED2-7F99-11D0-ADE2-00A0C90DC8D9&#125; <br />预订文件夹.&#123;F5175861-2688-11d0-9C5E-00AA00A45957&#125; <br />MyDocs Drop Target.&#123;ECF03A32-103D-11d2-854D-006008059367&#125; <br />Policy Package.&#123;ecabaebd-7f19-11d2-978E-0000f8757e2a&#125; <br />搜索结果.&#123;e17d4fc0-5564-11d1-83f2-00a0c90dc849&#125; <br />添加网上邻居.&#123;D4480A50-BA28-11d1-8E75-00C04FA31A86&#125; <br />Paint.&#123;D3E34B21-9D75-101A-8C3D-00AA001A1652&#125; <br />管理工具.&#123;D20EA4E1-3957-11d2-A40B-0C5020524153&#125; <br />字体.&#123;D20EA4E1-3957-11d2-A40B-0C5020524152&#125; <br />Web Folders.&#123;BDEADF00-C265-11d0-BCED-00A0C90AB50F&#125; <br />DocFind Command.&#123;B005E690-678D-11d1-B758-00A0C90564FE&#125; <br />脱机文件夹.&#123;AFDB1F70-2A4C-11d2-9039-00C04F8EEB3E&#125;<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/god/" rel="tag">god</a> , <a href="http://www.gaobo.info/go.php/tags/mode/" rel="tag">mode</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25B8%258A%25E5%25B8%259D%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">上帝模式</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2596%2587%25E4%25BB%25B6%25E5%25A4%25B9/" rel="tag">文件夹</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%259B%25AE%25E5%25BD%2595/" rel="tag">目录</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/691.htm</link>
<title><![CDATA[转换VMWare Center 1.0.8版本的虚拟机到vSphere 4]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Mon, 04 Jan 2010 05:12:39 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/691.htm</guid> 
<description>
<![CDATA[ 
	从VMWare Center 1.0.8版本中复制一台虚拟机的文件到vSphere 4中不能直接启动，说IDE硬盘不被支持&hellip;&hellip;<br />从网上搜索了下转换方面的内容，发现这个：<br /><a href="http://www.xuniji.com/forum/view.asp?id=8261&amp;p=2"><a href="http://www.xuniji.com/forum/view.asp?id=8261&amp;p=2" target="_blank">http://www.xuniji.com/forum/view.asp?id=8261&amp;p=2</a></a><br />试了下，可耻地失败鸟&hellip;&hellip;<br />继续搜索虚拟机转换方面的话题，有了新的收获！<br />工具很简单：Converter<br />安装vCenter和vCenter Converter后，会多出一个插件，就是企业版的Converter，不再需要新的序列号啦<br />麻烦的是VMWare这个公司的产品数量多，名字命名混乱，开始我还以为VMWare vCenter Converter是单独的一个东西，但是想了下安装vCenter的时候我装了这个东东的嘛，还有vCenter Server和vCenter CLI可以选择（实际上还有vCenter Agent），那在哪里呢？<br />搜索了下，发现VMWare vCenter Converter居然还有Standalone的版本，我汗&hellip;&hellip;<br />打开vSphere Client，在ESX主机上点右键，发现有&ldquo;导入计算机&hellip;&hellip;&rdquo;，难道是这个？<br />好吧，我承认我猜对了，O(&cap;_&cap;)O~~<br />具体过程参考：<a href="http://dolphin-ygj.javaeye.com/blog/464157"><a href="http://dolphin-ygj.javaeye.com/blog/464157" target="_blank">http://dolphin-ygj.javaeye.com/blog/464157</a></a><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/sphere/" rel="tag">sphere</a> , <a href="http://www.gaobo.info/go.php/tags/converter/" rel="tag">converter</a> , <a href="http://www.gaobo.info/go.php/tags/vcenter/" rel="tag">vcenter</a> , <a href="http://www.gaobo.info/go.php/tags/esx/" rel="tag">esx</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E5%258C%2596/" rel="tag">虚拟化</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25BD%25AC%25E6%258D%25A2/" rel="tag">转换</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E6%259C%25BA/" rel="tag">虚拟机</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/690.htm</link>
<title><![CDATA[发放LockerZ的邀请]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Mon, 04 Jan 2010 02:59:33 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/690.htm</guid> 
<description>
<![CDATA[ 
	<a href="http://www.lockerz.com/"><a href="http://www.lockerz.com" target="_blank">http://www.lockerz.com</a></a><br />明白的就回复留下你的信息和EMail，不明白的请GG或BAIDU吧。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/locker/" rel="tag">locker</a> , <a href="http://www.gaobo.info/go.php/tags/lockerz/" rel="tag">lockerz</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2582%2580%25E8%25AF%25B7/" rel="tag">邀请</a> , <a href="http://www.gaobo.info/go.php/tags/invite/" rel="tag">invite</a> , <a href="http://www.gaobo.info/go.php/tags/invitation/" rel="tag">invitation</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/689.htm</link>
<title><![CDATA[在Macbook上安装Windows XP]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sun, 03 Jan 2010 10:44:16 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/689.htm</guid> 
<description>
<![CDATA[ 
	拿到领导的Macbook有几天了，今天终于有空来装系统，以前没有深入玩过Mac不敢轻易格式化什么的，于是先在网上搜索相关的文章和教程。<br />但是&mdash;&mdash;并不好&mdash;&mdash;有的文章写的并不详细，有的是很久以前的内容了。。。。总之，that do not help.<br />不过收获还是有的，就是在Mac启动的时候按C键，可以从光盘引导。直接从光盘启动安装Windows XP会怎么样呢？Come on！<br />首先用Windows XP的系统盘启动，重新分区、格式化、安装Windows XP，平淡无奇，没啥说的。<br />安装完毕后插入Mac自带的两张DVD中标有&ldquo;Mac OS Install&rdquo;的一张，光盘自动启动，安装Boot Camp，在安装过程中会自动安装所有驱动！安逸！<br />再往下就是安装各种应用软件。<br /><br />Macbook配置：<br />Intel Core2Duo P7550 2.26GHz<br />nVidia GeForce 9400M<br />MacOS 10.6.1<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/mac/" rel="tag">mac</a> , <a href="http://www.gaobo.info/go.php/tags/macbook/" rel="tag">macbook</a> , <a href="http://www.gaobo.info/go.php/tags/macintosh/" rel="tag">macintosh</a> , <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/xp/" rel="tag">xp</a> , <a href="http://www.gaobo.info/go.php/tags/intel/" rel="tag">intel</a> , <a href="http://www.gaobo.info/go.php/tags/nvidia/" rel="tag">nvidia</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/688.htm</link>
<title><![CDATA[解决Windows 7上运行VMWare vSphere 4 Client出现的问题]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Tue, 29 Dec 2009 09:06:48 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/688.htm</guid> 
<description>
<![CDATA[ 
	<p>在裸机DELL上安装好ESX4后，Windows 7下运行vSphere出问题。Windows7下vSphere&#92;vCentre的client会报错&rdquo;clients.xml解析错误&rdquo;</p><p>转载个网上的解决方法：</p><p>1、复制一个非WIN7系统下的.NET 2.0的文件，这个文件位置在&ldquo;C:&#92;Windows&#92;Microsoft.NET&#92;Framework&#92;v2.0.50727&#92;Microsoft.NET&#92;Framework&#92;v2.0.50727&#92;System.dll &rdquo;，嫌麻烦的可以直接附件，将这个文件放到桌面备用。<br /><a href="attachment.php?fid=87">点击这里下载文件</a></p><p>2、建立&ldquo;C:&#92;Program Files&#92;VMware&#92;Infrastructure&#92;Virtual Infrastructure Client&#92;Launcher&#92;Lib&rdquo;这个目录，然后把刚才的system.dll复制进来。</p><p>3、 修改VpxClient.exe.config文件，在最后的&lt;/configuration&gt;之前，加上以下内容</p><blockquote><div class="quote-content">&lt;runtime&gt;<br />&lt;developmentMode developerInstallation=&rdquo;true&rdquo;/&gt;<br />&lt;/runtime&gt;</div></blockquote><div class="quote-content">4、建立一个批处理文件，内容如下：</div><div class="quote-content"><blockquote><div class="quote-content">SET DEVPATH=%ProgramFiles%&#92;VMware&#92;Infrastructure&#92;Virtual Infrastructure Client&#92;Launcher&#92;Lib<br />&ldquo;%ProgramFiles%&#92;VMware&#92;Infrastructure&#92;Virtual Infrastructure Client&#92;Launcher&#92;VpxClient.exe&rdquo;</div></blockquote></div><div class="quote-content"><p>5、将这个批处理文件在桌面上放置快捷方式并更改图标，每次要打开vSphere客户端的时候，运行这个快捷方式就OK了。该批处理文件也可以直接下载附件：<br /><a href="attachment.php?fid=88">点击这里下载文件</a></p><p>还有就是输入许可证的问题</p><p>点击对应主机，在窗口右边的标签栏点配置，点下面软件框中&lsquo;已获许可的功能&rsquo;</p><p>在旁边有个编辑，点进去在弹出窗口中选择向此主机分配新的许可证密钥，并输入密钥。点确定即可。</p></div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/vsphere/" rel="tag">vsphere</a> , <a href="http://www.gaobo.info/go.php/tags/sphere/" rel="tag">sphere</a> , <a href="http://www.gaobo.info/go.php/tags/client/" rel="tag">client</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/687.htm</link>
<title><![CDATA[敏捷项目延迟的原因（转帖）]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Tue, 29 Dec 2009 02:13:26 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/687.htm</guid> 
<description>
<![CDATA[ 
	<p>通常意义上的<a id="fcvh" href="http://en.wikipedia.org/wiki/Delay" target="_blank" title="延迟">延迟</a>，是指某件事完成得比预期晚，因此造成压力和不便。 在敏捷的术语中，延迟同样也被看做是浪费。延迟会造成工作不能延续，因此带来其他浪费，比如重新学习、任务切换等等。</p><p><a id="vc36" href="http://blog.agilebuddy.com/about.html" target="_blank" title="Jack Milunsky">Jack Milunsky</a>将<a id="vxdj" href="http://blog.agilebuddy.com/2009/09/the-7-software-development-wastes-lean-series-part-6-delays.html" target="_blank" title="常见的延迟归为以下几类">常见的延迟归为以下几类</a>：</p><ul><li><strong>项目批准过程</strong>&mdash;&mdash;开发人员坐等项目得到批准，由此造成时间和金钱的浪费。 </li><li><strong>等待需求的正确优先级</strong>&mdash;&mdash;这样工作才能开始推进。 </li><li><strong>等待可用的资源</strong>&mdash;&mdash;这常常标志着组织需要反省自己是不是承接了太多工作。 </li><li><strong>变更批准流程</strong>&mdash;&mdash;该流程本身就是浪费。如果发生次数太多，就该考虑缩短sprint长度了。 </li><li><strong>在制品增加</strong>&mdash;&mdash;在制品越多，开发人员要想将代码发布到生产环境，要等待的时间也就越长。 </li><li><strong>客户签收验收测试时的延迟</strong>&mdash;&mdash;不仅在这方面，还包括让客户解决需求问题、提供演示反馈等方面。 </li></ul><p>Jack提到：在sprint之间也有很多延迟。团队应该认真投入精力，识别并根除这些延迟。他建议：</p><blockquote>必须保证backlog得到正确的&ldquo;看护&rdquo;。要有一个高效的产品负责人，他能理解市场和客户。你还需要写得很好的用户故事。要尽早从开发人员那里得到估算，这样产品负责人才能在规划会议之前做出决策。这都是为了&ldquo;防&lsquo;延迟&rsquo;于未然&rdquo;，保证在所有的转换点上，工作都能得到顺利交接。把这个端到端的过程勾画出来，识别出各个转换点上的延迟，这样做很有价值。 </blockquote><p><a id="p5bx" href="http://www.pmhut.com/?s=%22Wouter+Baars%22" target="_blank" title="Wouter Baars">Wouter Baars</a>也提出了<a id="oowo" href="http://www.pmhut.com/top-11-causes-of-delays-in-it-projects" target="_blank" title="IT项目延迟最主要的几个原因">IT项目延迟最主要的几个原因</a>，其中包括：</p><ul><li><strong>画蛇添足</strong>&mdash;&mdash;团队花费太多时间去增强客户没有要求的功能。 </li><li><strong>忽略质量控制</strong>&mdash;&mdash;时间压力有时会让程序员或项目团队有意跳过测试过程。相对其减少的延迟，这常常会导致更多延迟。 </li><li><strong>同时开发多个项目</strong>&mdash;&mdash;任务切换会<a id="z6lo" href="http://www.infoq.com/news/2009/09/study-multitasking-performance" target="_blank" title="招致更多问题，而不是解决问题">招致更多问题，而不是解决问题</a>。 </li><li><strong>&ldquo;一劳永逸&rdquo;症状</strong>&mdash;&mdash;试图将一种现有的解决方案用在任何新问题上。 </li><li><strong>平庸的人员素质</strong>&mdash;&mdash;人员在技术或流程方面的能力不足会导致多个层面的延迟。 </li><li><strong>客户无法实现承诺</strong>&mdash;&mdash;当客户无法在他们必须参与的工作中及时响应时，项目会陷于停滞。 </li><li><strong>客户和开发人员之间的关系紧张</strong>&mdash;&mdash;如果项目进展不顺利，&ldquo;不和谐&rdquo;会导致更多延迟。这会破坏彼此之间的信任感，影响工作气氛。 </li></ul><p>Robert Neri提出另一个造成延迟的有趣原因，他指出：<a id="urcv" href="http://blog.outsystems.com/mt/mt-search.cgi?blog_id=2&amp;tag=agile%20project%20management&amp;limit=20" title="企业中敏捷实施的差异">企业中敏捷实施的差异</a>可能导致延迟。他提到：</p><blockquote>我们常常遇到这种情况：支持部门无法做到项目sprint那么快的速度，因此会造成敏捷项目延迟。类似地，非敏捷项目难以和敏捷项目整合。 </blockquote><p>因此，如果你的敏捷项目延迟了，看看是不是由于上面这些常见的原因。一旦你识别出了根源，赶紧想办法解决才是明智之道。这会去除项目中最大的一个浪费。<br /><br />（From InfoQ）</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/xp/" rel="tag">xp</a> , <a href="http://www.gaobo.info/go.php/tags/agile/" rel="tag">agile</a> , <a href="http://www.gaobo.info/go.php/tags/delay/" rel="tag">delay</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%258F%25E6%258D%25B7/" rel="tag">敏捷</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BB%25B6%25E8%25BF%259F/" rel="tag">延迟</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/686.htm</link>
<title><![CDATA[怎样健康地吃火锅]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Mon, 28 Dec 2009 01:52:47 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/686.htm</guid> 
<description>
<![CDATA[ 
	天气越来越冷，喜爱火锅的饕餮们又开始摩拳擦掌、搜罗新店了。其实，把火锅吃好也是一门学问，既满足口舌之欲，又能够起到养生功效，可不简单。专业调查表明，在中国，99%的人，不会健康地吃火锅。<br />将火锅作为生活中必不可少美食的重庆人们，你会吃火锅吗？<br /><p>许多食客在吃火锅时，往往追求鲜美嫩滑而将食材稍稍一涮就吃，这种饮食习惯很不卫生。较好的方式是，先将肉类、鱼类、海鲜下锅，煮到五、六分熟时再放蔬菜，锅开后再煮半分钟左右，才开始享受美味。</p><p>目前国内的畜禽、蔬菜等在生产和运输环节存在诸多不安全因素，摆上餐桌的生鲜食品往往含有病原微生物、寄生虫卵或农药残留，如果一涮即吃，有害微生物侵入人体、导致呕吐、腹泻、头痛、高烧等疾病的风险很大。为了健康，还是牺牲口感，把食物涮熟透再吃吧。</p><p>还要注意的是，蔬菜如果长时间在火锅里煮，其营养成分维生素和氨基酸等容易遭到破坏，还会失去应有的鲜味。因此，如何使火锅菜肴既保持原有风味、又不失营养，还达到卫生要求，掌握火锅&ldquo;火候&rdquo;可不是容易的事情。<br /></p><p>火锅桌上，畜禽内脏类食品比较常见，这种饮食习惯也不利于健康。伴随着农药、化肥、添加剂等化学物质在食品生产、加工中的应用，动物内脏作为代谢器官所含的病原微生物和药物残留量最高，往往成为这类有害物质的&ldquo;过滤器&rdquo;和&ldquo;贮存器&rdquo;，尤其是肝肺。此外，畜禽内脏、海鲜、牛羊肉、蘑菇等食材由于含有大量嘌呤类物质，容易造成尿酸在血液中沉积，引起冬季&ldquo;痛风&rdquo;。</p><p>最好的办法是，吃火锅时，注意荤素搭配，多吃些蔬菜、豆腐、白莲等维生素含量高的食物，不仅能够消油化腻，还能清凉、去火、解毒，是人体调补的&ldquo;良药&rdquo;。<br />由于动物内脏、肉类、海鲜等食材所含的嘌呤类物质在汤中能够充分溶解，过量饮用老汤容易造成嘌呤沉积，经肝脏代谢成尿酸，使肾功能减退、排泄受阻，诱发或加重痛风。所以吃火锅时应多喝水，以利尿酸的排出。</p><p>喜欢喝汤的朋友也要趁早，时间涮得越久，汤中所含的有害残留物，如亚硝酸盐的含量就越高，由此患病的可能性就越大。不过如果是使用了现在国际上比较流行的酵母抽提物YE作为火锅的调味料就不一样了，不但味道更鲜美，而且煮多久也不会产生亚硝酸盐。<br /></p><p>每年入冬后，&ldquo;一热当三鲜&rdquo;的火锅文化正当道，口腔疾病患者的数量也会比其他季节多出15%以上。 通常，火锅浓汤的温度可达到120℃，如果取出即吃，很容易烫伤口腔、舌部、食道或胃黏膜。患有口腔黏膜白斑、扁平苔藓等口疾的人，复发机更会高出数倍，严重时还会诱发食道癌。</p><p>此外，常吃烫食，还会破坏舌面味觉系统，降低赏味机能，长此以往还会影响食欲，诱发牙齿和上消化道疾病。因此，牢记&ldquo;心急吃不了热豆腐&rdquo;的老话吧，食物凉一凉再吃更健康!</p><p>羊肉和醋不要共食。羊肉火热，益气补虚，宜与凉性或甘平性菜品搭配;醋则含有蛋白质、糖、维生素、醋酸及多种有机酸，其性酸温，消肿活血，应与寒性食物配合。</p><p>喝白酒时不宜吃牛肉，因为牛肉甘温，补气助火;白酒大温，与牛肉搭配则如火上浇油，容易引起牙龈发炎。</p><p>涮萝卜不要吃木耳，二者一起食用会导致皮炎;土豆是火锅中很受欢迎的蔬菜，但如果搭配香蕉作为餐后水果，可能会导致面部生斑。 </p><p>菠菜中含有草酸，会妨碍食物中钙、铁的吸收，最好不要长时间和其他食物一起涮，略焯一下就可以了。 </p><p>不要贪图凉快喝啤酒。因为火锅汤中的嘌呤物质在体内会转化为尿酸，而啤酒则会把尿酸推到人体关节或软组织，导致痛风，严重时还会引起肾结石和尿毒症等并发症的发生。此外，冷热交互的食用方式，也容易使肠胃道受损。 </p><p>患有糖尿病、高血压、高血脂的病人要少吃虾饺、肉丸等油脂含量大的食物;肾病、高血压患者则要少饮火锅热汤;有胃肠疾病的人，应注意厚味调味料(如沙茶酱、辣椒酱等)的刺激性。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E9%2587%258D%25E5%25BA%2586/" rel="tag">重庆</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2581%25AB%25E9%2594%2585/" rel="tag">火锅</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%258D%25A4%25E7%25B4%25A0/" rel="tag">荤素</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/685.htm</link>
<title><![CDATA[程序员的职业生涯（转）]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 24 Dec 2009 04:44:24 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/685.htm</guid> 
<description>
<![CDATA[ 
	<p>有一些年轻的程序员向我咨询，将来的路应该怎么走？俗话说，条条大路通罗马。不同的路都能走向成功。到底选哪条路，取决于自己的兴趣。可能有程序员会问：如果还没找到自己的兴趣怎么办？我的建议是多尝试，努力做，这是职业生涯的必经之路。当你积累了一定的技术和经验之后，就会面临多种选择。选择哪条路，因人而异。</p><p>如果对某一种或几种技术非常感兴趣，并且能够持续钻研，经过一定时期的积累，你可以逐渐成长为专家级程序员。专家级程序员对于所掌握的专业技术的熟练程度非一般程序员能及，各类常见编程问题在他们手中都能迎刃而解，可以说这类专家&ldquo;越老越值钱&rdquo;但是这类专家也有一定的风险性：随着经验的增加和年龄的增长，这些人的工资会越来越高，当公司改变技术路线而不再需要专家级程序员所掌握的专业技术时，或者想降低做事的成本，他们就可能面临失业或者另找工作的局面。</p><p>资深培训专家也是个不错的发展方向。成为培训专家，不仅需要深厚的技术功底，同时还要具备优秀的沟通和表达能力，因为他们的主要工作不再是研发某种技术，而是传播技术知识。这条路很宽，有一些优秀的技术培训师除了担任本职工作，还会兼职到大学里讲课。虽然培训专家的技术可能达不到专家程序员的水平，但是工作内容相对更为丰富，接触的人也更多。</p><p>成为公司的技术总监是很多程序员的梦想。这条路线是从初级程序员成长为高级程序员之后，以做项目为工作重点，进而发展成项目经理、开发经理，最终成为技术总监甚至公司副总裁。这些程序员走的是技术管理路线，从做项目开始，逐渐积累管理经验，然后成长为优秀的技术管理者。技术总监在公司甚至技术界的影响力非同一般，对于那些有志于成为公司领导层的程序员，是个很大的诱惑。但是权力大、管的人多，就意味着更大的压力，技术总监不仅要保持对新技术的敏感，还要抽出精力做管理。比起成为纯技术专家，这条路也许更为艰难。</p><p>还有一些程序员职业发展的终点是总架构师、总设计师。这类程序员的兴趣，不是某种特定的技术，而是偏重对软件产品或者软件应用项目的设计。如果将软件项目开发团队比作一个乐队，那么程序员就相当于一名乐手（比如小提琴手、长笛手等），他们负责将自己的乐器演奏好；项目经理是乐队指挥，负责指挥和协调这个乐队的配合；架构师则相当于作曲家。从入门的架构师开始，逐渐成为资深架构师乃至总架构师。如同历史上伟大的作曲家，杰出的架构师能够在各种软件中谱写出旋律优美的&ldquo;曲子&rdquo;。</p><p>另外一些程序员心怀创业的理想，等到自己有了一定的技术积累，再掌握一些市场需求以及管理方法，他们会开始创业之路。一旦成功，这类人的影响力会非常大，像Google和雅虎的创始人，都是技术创业的成功典范。但是这条路也是最艰辛的，有句话叫做&ldquo;不当家不知柴米贵&rdquo;不亲自创业的人也很难体会它的艰辛。创业涉及方方面面，稍有差池就会功亏一篑，投身创业的程序员并不少，但是真正能成功的少之又少。踏上这条路不仅需要过人的勇气和魄力，更需要坚韧不拔的毅力，以及深度的商业智慧，再加上市场机会，才能够赢到最后。</p><p>很多程序员会走上技术支持路线，进而发展成为精通业务的技术和行业咨询专家。这类程序员会在成为高级程序员之后加入销售团队，直接面对客户，负责技术层面的问题。如果对某一行业（比如银行、电信）非常熟悉，久而久之，就成为精通这个行业技术的专家；如果对于某一类解决方案（比如ERP、CRM、SCM）非常擅长，就可以发展成为跨行业的技术专家。</p><p>还有一部分程序员会成为IT专栏作家和自由职业者。这些人通常对写作比较感兴趣，文字表达能力也不错，他们会将自己从事技术工作的内容或心得写出来，然后发表文章赚取稿费。只要对技术足够精通，这类人是很受杂志欢迎的。在北美还有一种自由职业者叫做合同工，就是不定期的承接项目，在项目开始前签订协议，项目完成后结束合作。虽然这种职业目前在中国还不太多，但是其自由性对于很多程序员来讲，也非常有吸引力。</p><p>上文提及的若干条路，程序员可以根据自己的兴趣进行选择，但是一般来说，无论走哪条路，都有一个前提条件：从初级程序员进阶为高级程序员。因为在这之前，你甚至没有选择的机会。从初级进阶到高级，通常需要2~5年的时间，因个人素质而异。大家都说，程序员要耐得住寂寞和枯燥，年轻的程序员更要克服浮躁的心态。在职业生涯的起步阶段，很多人总会摸不着头脑，这时一定要静下心来，多向资深程序员求教，慢慢熟悉技术、熟悉开发流程和行业。有时你会感觉掉进了一个知识海洋，身边全是陌生的事物，很难抓住。所以就更要四处探路，逐渐寻找到方向，在寻找中进步。</p><p>成功进阶为高级程序员，也并不意味着前途一片光明。如果说从初级到高级需要的是学习，那么从高级到专家，需要的是不断地尝试和坚持。比起前一个阶段，这个过程更为漫长，通常需要5~8年。在这期间，因为有了之前的积累，并且已经取得一定的成就，人会更加自信，同时也会更加彷徨，有一个问题会时常盘旋在脑中：将来的路到底要怎么走？这时就可以利用自己所积累的资源，多做一些尝试，尝试不同角色、不同的项目，与不同的客户打交道，时间长了，自然会找到最适合自己的发展方向。</p><p>总结起来，初级程序员和高级程序员时期，都属于职业生涯发展的第一阶段，我们可以称之为黄金时期。这阶段程序员的年龄在20~35岁之间，因为年轻，所以更善于学习，而且体力充沛，很多走过这个阶段的程序员有过通宵工作的经历。在这个时期，你有大把的时间学习提高，为将来的事业打下坚实的基础。而一旦超过了30岁，无论从体力还是精神上，都会有所改变，从30~40岁是转型时期。这时的程序员（很多人已经不再编程）已经明确了自己的发展方向，并且向着目标努力，让自己有所建树。40~60岁是专家时期，至此，一名优秀的程序员会彻底实现&ldquo;破茧成蝶&rdquo;的愿望，成长为专家。</p><p>程序员的职业很精彩，同时也很艰苦。享受高工资，掌握最新的技术，有可能成为创业成功的富豪，甚至有机会改变人类的生活方式（例如互联网浏览器的开发、电子商务的应用、手机短信等）这就是别人眼中程序员的生活，也许正因此，每年都会有很多新人加入这个庞大的队伍，体验向往已久的精彩生活。但是大多数人却忽略了光鲜背后的艰辛，高工资的代价是工作强度高，学习新技术的代价是工作压力大，成为富豪的代价是心力交瘁，而若想改变人类的生活方式，那就要耐得住日复一日的枯燥和寂寞。酸甜苦辣都要自己品尝，程序员的发展道路有很多条，就看你怎么选。<br /><br />IBM 软件集团大中华区总架构师&nbsp; 寇卫东<br />《程序员》杂志0811期</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E7%25A8%258B%25E5%25BA%258F%25E5%2591%2598/" rel="tag">程序员</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2581%258C%25E4%25B8%259A/" rel="tag">职业</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2594%259F%25E6%25B6%25AF/" rel="tag">生涯</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B5%2584%25E6%25B7%25B1/" rel="tag">资深</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%25B9%25E8%25AE%25AD/" rel="tag">培训</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25B8%2593%25E5%25AE%25B6/" rel="tag">专家</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%258A%2580%25E6%259C%25AF%25E6%2580%25BB%25E7%259B%2591/" rel="tag">技术总监</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259E%25B6%25E6%259E%2584%25E5%25B8%2588/" rel="tag">架构师</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AE%25BE%25E8%25AE%25A1%25E5%25B8%2588/" rel="tag">设计师</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/684.htm</link>
<title><![CDATA[在Windows Vista以后版本系统中自动保存TFS的账号密码]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Wed, 09 Dec 2009 07:31:51 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/684.htm</guid> 
<description>
<![CDATA[ 
	其实很简单：<br />打开&ldquo;控制面板&rdquo;&mdash;&ldquo;用户账户&rdquo;&mdash;&ldquo;凭据管理器&rdquo;，添加一个Windows凭据：<br />地址：（这里一定要写TFS的机器名称，就是在hosts文件中做静态对应的那个机器名称，写IP地址是无法成功滴<img src="images/emot/grin.gif" border="0" width="24" height="24" />）<br />用户名：甲乙丙丁<br />密码：ABCD<br />打完收工&hellip;&hellip;<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/vista/" rel="tag">vista</a> , <a href="http://www.gaobo.info/go.php/tags/seven/" rel="tag">seven</a> , <a href="http://www.gaobo.info/go.php/tags/tfs/" rel="tag">tfs</a> , <a href="http://www.gaobo.info/go.php/tags/team/" rel="tag">team</a> , <a href="http://www.gaobo.info/go.php/tags/foundation/" rel="tag">foundation</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2587%25AD%25E6%258D%25AE/" rel="tag">凭据</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2587%25AD%25E6%258D%25AE%25E7%25AE%25A1%25E7%2590%2586%25E5%2599%25A8/" rel="tag">凭据管理器</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/683.htm</link>
<title><![CDATA[自动化测试工具汇总]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Sun, 06 Dec 2009 08:41:50 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/683.htm</guid> 
<description>
<![CDATA[ 
	<span>自动化测试工具可以减少测试工作量，提高测试工作效率，但首先是能够选择一个合适的且满足企业信息系统工程环境的自动化测试工具，因为不同的测试工具，其面向的测试对象是不一样的。按照测试工具的主要用途和应用领域，可以将自动化测试工具分为以下几类</span><span>:<br /></span><span><br /></span><strong><span>负载压力测试</span></strong><strong><span><br /></span></strong><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>LoadRunner </span><span>特点</span><span>a</span><span>，支持的协议多且个别协议支持的版本比较高；特点</span><span>b</span><span>，负载压力测试方案设置灵活；特点</span><span>c</span><span>，丰富的资源监控；特点</span><span>d</span><span>，报告可以导出到</span><span>Word</span><span>、</span><span>Excel</span><span>以及</span><span>HTML</span><span>格式。</span><span> <span><br /></span></span><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>QALoad (1).</span><span>测试接口多；</span><span>(2)</span><span>可预测系统性能；</span><span>(3)</span><span>通过重复测试寻找瓶颈问题；</span><span>(4)</span><span>从控制中心管理全局负载测试；</span><span>(5)</span><span>可验证应用的扩展性；</span><span>(6)</span><span>快速创建仿真的负载测试；</span><span>(7)</span><span>性能价格比较高。此外，</span><span>QALoad</span><span>不单单测试</span><span>Web</span><span>应用，还可以测试一些后台的东西，比如</span><span>SQL Server</span><span>等。只要它支持的协议，都可以测试。</span><span> <span><br /></span></span><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Benchmark Factory </span><span>首先它可以测试服务器群集的性能；其次，可以实施基准测试；最后，可以生成高级脚本。</span><span> <span><br /></span></span><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>SilkPerformance</span><span>：</span><span> <span><br /></span></span><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>E-Test Suite </span><span>由</span><span>Empirix</span><span>公司开发的测试软件，能够和被测试应用软件无缝结合的</span><span>Web</span><span>应用测试工具。工具包含</span><span>e-Tester</span><span>、</span><span>e-Load</span><span>和</span><span>e-Monitor</span><span>，这三种工具分别对应功能测试、压力测试以及应用监控，每一部分功能相互独立，测试过程又可彼此协同。</span><span> <span><br /></span></span><span><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>JMeter </span><span>是一个专门为运行和服务器负载测试而设计、</span><span>100%</span><span>的纯</span><span>Java</span><span>桌面运行程序。原先它是为</span><span>Web/HTTP</span><span>测试而设计的，但是它已经扩展以支持各种各样的测试模块。它和</span><span>HTTP</span><span>和</span><span>SQL(</span><span>使用</span><span>JDBC)</span><span>的模块一起运行。它可以用来测试静止或活动资料库中的服务器运行情况，可以用来模拟服务器或网络系统在重负载下的运行情况。它也提供了一个可替换的界面用来定制数据显示，测试同步及测试的创建和执行。</span><span> <span><br /></span></span><span><span>7.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>WAS </span><span>是</span><span>Micro$oft</span><span>提供的免费的</span><span>Web</span><span>负载压力测试工具，应用广泛。</span><span>WAS</span><span>可以通过一台或者多台客户机模拟大量用户的活动。</span><span>WAS</span><span>支持身份验证、加密和</span><span>Cookies</span><span>，也能够模拟各种浏览器和</span><span>Modem</span><span>速度，它的功能和性能可以与数万美元的产品媲美。</span><span> <span><br /></span></span><span><span>8.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ACT </span><span>或称</span><span>MSACT</span><span>，它是微软的</span><span>Visual Studio</span><span>和</span><span>Visual Studio.net</span><span>带的一套进行程序压力测试的工具。</span><span>ACT</span><span>不但可以记录程序运行的详细数据参数，用图表显示程序运行情况，而且安装和使用都比较简单，结果阅读叶很方便，是一套较理想的测试工具。</span><span> <span><br /></span></span><span><span>9.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>OpenSTA </span><span>它的全称是</span><span>Open System Testing Architecture</span><span>。</span><span>OpenST</span><span>的特点是可以模拟很多用户来访问需要测试的网站，它是一个功能强大、自定义设置功能完备的软件。但是，这些设置大部分需要通过</span><span>Script</span><span>来完成，因此在真正使用这个软件之前，必须学习好它的</span><span>Script</span><span>编写。如果需要完成很复杂的功能，</span><span>Script</span><span>的要求还比较高。当然这也是它的优点，一些程序员不会在意编写</span><span>Script</span><span>的。</span><span> <span><br /></span></span><span><span>10.<span>&nbsp;&nbsp; </span></span></span><span>PureLoad </span><span>一个完全基于</span><span>Java</span><span>的测试工具，它的</span><span>Script</span><span>代码完全使用</span><span>XML</span><span>。所以，编写</span><span>Script</span><span>很简单。它的测试包含文字和图形并可以输出为</span><span>HTML</span><span>文件。由于是基于</span><span>Java</span><span>的软件，因此</span><span>PureLoad</span><span>可以通过</span><span>Java Beans API</span><span>来增强软件功能。</span><span> <span><br /></span></span><strong><span>功能测试</span></strong><strong><span><br /></span></strong><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>WinRunner </span><span>企业级的功能测试工具，用于检测应用程序是否能够达到预期的功能及正常运行，自动执行重复任务并优化测试工作，从而缩短测试时间。通过自动录制、检测和回防用户的应用操作，从而提高测试效率。</span><span> <span><br /></span></span><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>QARun </span><span>一款自动回归测试工具，与</span><span>Winrunner</span><span>比较学习成本要低很多。不过要安装</span><span>QARun</span><span>必须安装</span><span>.net</span><span>环境，另外它还提供与</span><span>TestTrack Pro</span><span>的集成。</span><span> <span><br /></span></span><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Rational Robot </span><span>我经常使用的测试工具，属于</span><span>Rational TestSuite</span><span>中的一员，对于</span><span>Visual studio 6</span><span>编写的程序支持的非常好，同时还支持</span><span>Java Applet</span><span>、</span><span>HTML</span><span>、</span><span>Oracle Forms</span><span>、</span><span>People Tools</span><span>应用程序的支持。要支持</span><span>Delphi</span><span>程序的测试还必须下载插件。</span><span>Rational Robot</span><span>的语法使用</span><span>Basic</span><span>语法，它的语言使用</span><span>SQABasic</span><span>。</span><span> <span><br /></span></span><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Functional Tester </span><span>它是</span><span>Robot</span><span>的</span><span>Java</span><span>实现版本，在</span><span>Rational</span><span>被</span><span>IBM</span><span>收购后发布的。在</span><span>Java</span><span>的浪潮下，</span><span>Robot</span><span>被移植到了</span><span>Eclipse</span><span>平台，并完全支持</span><span> Java</span><span>和</span><span>.net</span><span>。可以使用</span><span>VB.net</span><span>和</span><span>Java</span><span>进行脚本的编写，当然了录下脚本让后做做修改是最爽的事情了。由于支持</span><span>Java</span><span>，那么对测试脚本进行测试也变成了可能。更多的信息请到</span><span>IBM developerworks</span><span>上查看，另外还提供试用版本下载。</span><span> <span><br /></span></span><strong><span>白盒测试</span></strong><strong><span><br /></span></strong><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Logiscope <br /></span><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>PRQA <br /></span><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Junit <br /></span><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>DevPartner <br /></span><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Rational Purify <br /></span><strong><span>测试管理</span></strong><strong><span><br /></span></strong><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>TestDirector MI</span><span>的测试管理工具，可以与</span><span>winrunner</span><span>、</span><span>Loadrunner</span><span>、</span><span>QuickTestPro</span><span>进行集成。除了可以跟踪</span><span>Bug</span><span>外，还可以编写测试用例、管理测试进度等等，是测试管理的首选软件。</span><span> <span><br /></span></span><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>TestManager Rational Testsuite</span><span>中的一员，可以用来编写测试用例、生成</span><span>Datapool</span><span>、生成报表、管理缺陷以及日志等等。是一个企业级的强大测试管理工具。缺点是必须和其它组件一起使用，测试成本比较高。</span><span> <span><br /></span></span><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>TrackRecord </span><span>一款擅长于</span><span>Bug</span><span>管理的工具，与</span><span>TestDirecotr</span><span>和</span><span>Testmanager</span><span>比较起来是很</span><span>light</span><span>的。不过至今还没有配成功过。</span><span>:( <br /></span><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Bugzilla </span><span>一个产品缺陷的记录及跟踪工具，它能够为你建立一个完善的</span><span>Bug</span><span>跟踪体系，包括报告、查询并产生报表、处理解决等几个部分。它的主要特点为：基于</span><span>Web</span><span>方式，安装简单；有利于缺陷的清楚传达；系统灵活，可配置性很强；自动发送</span><span>Email</span><span>。</span><span> <span><br /></span></span><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Jira </span><span>是一个</span><span>Bug</span><span>管理工具，自带一个</span><span>Tomcat 4</span><span>；同时有简单的工作流编辑，可用来定制流程；数据存储在</span><span>HSQL</span><span>数据引擎中，因此只要安装了</span><span>JDK</span><span>这个工具就可以使用。相比较</span><span>Bugzilla</span><span>来说有不少自身的特点，不过可惜它并不是开源工具，有</span><span>Lisence</span><span>限制。</span><span> <span><br /></span></span><strong><span>测试辅助</span></strong><strong><span><br /></span></strong><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>SmartDraw </span><span>用于绘制</span><span>UCML</span><span>，进行负载压力测试需求分析。对压力测试测试前的工作很有帮助。</span><span> <span><br /></span></span><p class="MsoListParagraph"><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>SDemo </span><span>我个人比较喜欢用这个工具，可以将操作录成</span><span>EXE</span><span>文件，并回放出来。这样就避免了那些偶尔才出现的</span><span>Bug</span></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596/" rel="tag">自动化</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B5%258B%25E8%25AF%2595/" rel="tag">测试</a> , <a href="http://www.gaobo.info/go.php/tags/automation/" rel="tag">automation</a> , <a href="http://www.gaobo.info/go.php/tags/test/" rel="tag">test</a> , <a href="http://www.gaobo.info/go.php/tags/tools/" rel="tag">tools</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B7%25A5%25E5%2585%25B7/" rel="tag">工具</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/682.htm</link>
<title><![CDATA[用一个小例子来说明手工测试，自动化测试，系统命令，编程语言，API的关系]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Sun, 06 Dec 2009 08:21:06 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/682.htm</guid> 
<description>
<![CDATA[ 
	有两个计算机帐号，A和B。我们需要用B帐号进行系统的设置，也就是测试的准备工作，然后用A帐号来进行测试。下边来说一下不同水平的人是如何进行自动化的。 <p>1. 手工测试人员</p><ul><li>Log on B </li><li>Configure </li><li>Log out </li><li>Log on A </li><li>Test </li></ul><p>2. 初级自动化人员（直接把手工case转成自动化）</p><ul><li>Set autologon B </li><li>Set autorun </li><li>Record test status: 0 </li><li>Logout </li><li>Check status </li></ul><blockquote><p>if(status==0) <br />&#123; <br />Configure <br />Set autologon A <br />Record test status:1 <br />Logout <br />&#125;</p></blockquote><blockquote><p>if(status==1) <br />&#123; <br />Test <br />&#125;</p><p>这个级别的人，需要懂得脚本编程，需要懂得系统设置，autologon and autorun。</p></blockquote><p>3. 有一定经验的自动化人员（改变手工测试case以利于自动化的更简单，可靠的实现）</p><ul><li><p>不需要log out and log on</p></li><li><p>利用Windows命令Runas</p></li><li><p>用高级语言调用Runas</p></li><li><p>利用重定向来输入Password</p></li></ul><blockquote><p>这个级别的人，需要懂得高级语言，重定向，Windows系统命令Runas</p></blockquote><p>4. 中级自动化人员（具有更丰富的开发经验，可以用程序代替UI和系统命令）</p><ul><li>不需要Runas命令 </li><li>利用.NET的Process对象 </li><li>用B的身份生成一个Process来进行配置工作 </li></ul><blockquote><p>这个级别的人，要比较熟悉高级语言，比较熟悉高级语言的类库，懂得操作系统的内核基本概念</p></blockquote><p>5. 高级自动化人员（精通高级语言，精通操作系统内核）</p><ul><li>不需要多生成一个进程 </li><li>用本线程impersonate用户B </li><li>利用.NET WindowsIdentity 对象 </li><li>必须要调用Windows API，LogonUser </li></ul><blockquote><p>这个级别的人，要精通C/C++和Java，C#等高级语言，精通Windows内核的知识和Windows API</p></blockquote><p>从以上的例子可以看到，针对同一个test case，不同的测试人员，从手工到高级自动化，由于自己知识面的原因，会设计出非常不同的case出来。越高级的自动化越灵活，稳定，可靠，也更需要掌握更多的开发和内核的知识。因此，我们看到很多人在强烈的否定自动化，你先看看他到底在哪个层次中。越下边层次的自动化人员，由于技术的原因，碰到的问题会越多，能解决的问题却越少，因此对自动化的抱怨也就越大了。这些都是可以理解的，不过以此来否定自动化，我觉得还是不太应该，毕竟自己技术还不过关。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596/" rel="tag">自动化</a> , <a href="http://www.gaobo.info/go.php/tags/automation/" rel="tag">automation</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B5%258B%25E8%25AF%2595/" rel="tag">测试</a> , <a href="http://www.gaobo.info/go.php/tags/test/" rel="tag">test</a> , <a href="http://www.gaobo.info/go.php/tags/case/" rel="tag">case</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/681.htm</link>
<title><![CDATA[各类搜索网站]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sun, 06 Dec 2009 07:53:53 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/681.htm</guid> 
<description>
<![CDATA[ 
	<p>平常经常会搜索很多各式各样的东西，<a href="http://www.google.com/" target="_blank">Google</a>有时候未必能找到或者需要费很大力气去找，这个时候有一些专门的搜索网站能够事半功倍，当然这个列表也不可能覆盖所有的搜索网站，我只罗列我经常会用到的一些</p><ul><li>通用搜索 <ul><li><a href="http://www.google.com/" target="_blank">Google</a> 不用我多说了把 </li><li><a href="http://www.baidu.com/" target="_blank">百度</a> 我一般比较少用，更多是用<a href="http://zhidao.baidu.com/" target="_blank">百度知道</a> </li></ul></li><li>知识搜索 <ul><li><a href="http://zh.wikipedia.org/" target="_blank">中文维基百科</a> </li><li><a href="http://zhidao.baidu.com/" target="_blank">百度知道</a> 百度推出的知识问答，因为时间相对较早（当然是指国内），所以内容和活跃程度相对较高 </li><li><a href="http://wenda.tianya.cn/wenda/" target="_blank">天涯问答</a> <a href="http://www.tianya.cn/" target="_blank">天涯</a>和<a href="http://www.google.cn/" target="_blank">谷歌</a>（注意不是<a href="http://www.google.com/" target="_blank">Google</a>）合作推出的问答社区，貌似在愚人节还推销了一把，弄了个&ldquo;<a href="http://www.google.cn/intl/zh-CN/renrou/index.html" target="_blank">谷歌人肉搜索</a>&rdquo;出来，有点<a href="yufun/admin/www.mop.com" target="_blank">猫扑</a>的味道&hellip;&hellip; </li></ul></li><li>电视节目预告搜索 <ul><li><a href="http://www.tvmao.com/" target="_blank">电视猫</a> </li><li><a href="http://www.tvsou.com/" target="_blank">搜视网</a> </li></ul></li><li>单词搜索 <ul><li><a href="http://www.dict.org/bin/Dict" target="_blank">Dict</a> 这个是英译英的词典，数据库很多，也比较专业 </li><li><a href="http://www.iciba.com/index.php" target="_blank">iCiba</a> 爱词霸，不用说了吧，金山词霸的在线版，iCiba的社区还是不错的，里边有很多有用的文章 </li></ul></li><li>交通搜索 <ul><li><a href="http://www.gsuo.com/" target="_blank">丁丁地图</a> </li><li><a href="http://ditu.google.cn/transit" target="_blank">谷歌交通搜索</a> 用的是MapABC的地图数据，只有行车路线搜索，大家没有车的就别去浪费时间了 </li><li><a href="http://ditu.live.com/" target="_blank">Microsoft Live Search交通</a> </li><li><a href="http://www.mapabc.com/" target="_blank">MapABC地图搜索</a> </li><li><a href="http://map.sogou.com/" target="_blank">搜狗地图</a> 这个我用的就更少了，他们家的东西我只用搜狗拼音，还得装的时候很小心:( </li><li><a href="http://www.city8.com/" target="_blank">城市吧</a> 特色是有想Google Map的实景地图，没事的时候玩一下还可以，但是拍摄的地点比较少，而且对网速有一定要求 </li></ul></li><li>旅游搜索 <ul><li><a href="http://www.yododo.com/" target="_blank">游多多</a> 这个我还是比较常去的，想出去玩的时候，或者没事的时候上去看看别人的游记还是挺好的 </li><li><a href="http://www.chinaevery.com/" target="_blank">搜驴网</a> 上边能搜的东西挺多，图像、酒店、线路、机票和交通都可以搜 </li><li><a href="http://www.tuniu.com/" target="_blank">途牛</a> 这个里边资料也挺多，没事的时候翻翻，或者自助游的也可以到上边取点经 </li></ul></li><li>美食搜索 <ul><li><a href="http://www.dianping.com/" target="_blank">大众点评网</a> </li><li><a href="http://www.gudumami.cn/" target="_blank">咕嘟妈咪</a> 貌似也有很多人用这个，不过我还是习惯去哪儿吃饭以前看一下点评网 </li><li><a href="http://www.keko.com.cn/" target="_blank">keko食谱搜索</a> 做饭的同志可以来这个上边看看食谱，非常的全，而且有各个食谱的营养，也是很细，我估计看时间长了，可以去考营养师&hellip;&hellip; </li></ul></li><li>商户搜索 <ul><li><a href="http://www.sodexhopass.com.cn/search/index_sh.asp" target="_blank">索迪斯卡</a> </li><li><a href="http://www.smartpass.com.cn/" target="_blank">斯马特卡</a> </li></ul></li><li>影评搜索 <ul><li><a href="http://www.mov.cn/" target="_blank">电影网</a> 两个电影点评网站，我就不说什么了，我不经常看这些 </li><li><a href="http://www.fifid.com/" target="_blank">非非</a> </li></ul></li><li>折扣搜索 <ul><li><a href="http://www.dogoo.cn/" target="_blank">导购网</a> </li><li><a href="http://shanghai.zhekou.com/" target="_blank">折扣网</a> 除了上边这个网站外，这个只是用来参考 </li></ul></li><li>图标搜索 <ul><li><a href="http://www.freeiconsweb.com/" target="_blank">Free Icons</a> 这三个网站没什么好说，下载图标的 </li><li><a href="http://www.iconshock.com/" target="_blank">Iconshock</a> </li><li><a href="http://www.pcjing.cn/Downloadlist.asp?DownloadSortid2=45" target="_blank">桌面美化</a> </li></ul></li><li>公司搜索 <ul><li><a href="http://www.bewww.net/" target="_blank">IT速查</a> 公司评论速查，很热闹的上边，找工作的可以看看，没事的人也可以看看自己公司在别人心目中是什么样子吧 </li><li><a href="http://www.findgs.com/" target="_blank">Findgs</a> 这个是比较新的一个，具体我到没怎么用，反正上边有些信息，没事可以看看 </li></ul></li><li>编程方面 <ul><li><a href="http://www.pinvoke.net/index.aspx" target="_blank">P/Invoke定义搜索</a> 如果你想在VB或者C#还有其它的语言里边调用Window API，你会怎么做？肯定首先需要声明它们的定义，这个网站就可以搜索相应的API在各个语言中的定义形式，不用自己去转数据类型和定义各种宏了 </li><li><a href="http://regexlib.com/" target="_blank">Regular搜索</a> 知道正则表达式是什么东西的，都知道这个网站是做什么的 </li></ul></li><li>心理测试 <br />可以看到下边的其实是一个系列的网站，各种各样的心理测试题，不要当真哦 <ul><li><a href="http://www.xinggeq.com/" target="_blank">性格签</a> 破解你的性格密码 </li><li><a href="http://www.zhishiq.com/" target="_blank">知识签</a> 这个世界你知道多少 </li><li><a href="http://www.zhijiq.com/" target="_blank">知己签</a> 你的好友知道你多少 </li><li><a href="http://www.xiangmaoq.com/" target="_blank">相貌签</a> 别人眼中的你 </li></ul></li><li>其它搜索 <ul><li><a href="http://duilian.msra.cn/app/couplet.aspx" target="_blank">微软对联搜索</a> 微软亚洲工程院的对联程序，挺好玩的 </li><li><a href="http://www.juben.cn/" target="_blank">剧本搜索</a> 顾名思义，找剧本的，公司年会的时候还是用得到的 </li><li><a href="http://www.keyxl.com/" target="_blank">KeyXL快捷键搜索</a> 这个嘛，它所收纳的快捷键比你想象的还要多一百倍 </li><li><a href="http://time.tieliu.com.cn/" target="_blank">铁流网火车时刻表</a> 查火车时刻表的，当然了你也可以用<a href="http://www.jpskb.com/" target="_blank">极品列车时刻表</a> </li><li><a href="http://www.douban.com/" target="_blank">豆瓣书评</a> 大名鼎鼎的豆瓣，去找你喜欢的书吧 </li><li><a href="http://weather.tq121.com.cn/" target="_blank">问天网天气预报</a> 中央气象局权威预报，可以看5天的预报 </li><li><a href="http://www.yx007.com/" target="_blank">小游戏搜索</a> 非常多的Flash小游戏，无聊的时候打发一下时间吧 </li><li><a href="http://www.shooter.cn/" target="_blank">射手网字幕搜索</a> 在网上下载到比较新的大片，又没有字幕怎么办？总不至于删了再重新找一个下吧。来这里找找吧，9成的新片都可以在这里找到字幕（注意字幕和你下载的电影的压缩版本要对应） </li><li><a href="http://www.8wen.com/" target="_blank">八文网文档搜索</a> 写论文的朋友可以上去看看，有很多文本格式的资料，真的很多</li></ul></li></ul><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%2588%2586%25E7%25B1%25BB/" rel="tag">分类</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2590%259C%25E7%25B4%25A2/" rel="tag">搜索</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BC%2595%25E6%2593%258E/" rel="tag">引擎</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AB%2599%25E7%2582%25B9/" rel="tag">站点</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/680.htm</link>
<title><![CDATA[条形码阅读方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sun, 06 Dec 2009 07:14:52 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/680.htm</guid> 
<description>
<![CDATA[ 
	条码种类繁多，其中39码比较泛滥，包括Code39码（标准39码）、Codabar码（库德巴码）、Code25码（标准25码）、ITF25码（交叉25码）、Matrix25码（矩阵25码）、UPC-A码、UPC-E码、EAN-13码（EAN-13国际商品条码）、EAN-8码（EAN-8国际商品条码）、中国邮政码（矩阵25码的一种变体）、Code-B码、MSI码、、Code11码、Code93码、ISBN码、ISSN码、Code128码（Code128码，包括EAN128码）、Code39EMS（EMS专用的39码）等等。<br /><br />在39码这个&ldquo;语言&rdquo;中，我们就需要要认识四个字母，他们分别是：白细，白粗，黑细，黑粗。这里有一个有人肉条码机的前辈支的招，把黑细黑粗看成0和1，白细白粗是空格和破折号。 <p>在39码中，六个&ldquo;字母&rdquo;是一个数字。他们看起来是：</p><p>0 = 00-110<br />1 = 10-001<br />2 = 01-001<br />3 = 11-000<br />4 = 00-101<br />5 = 10-100<br />6 = 01-100<br />7 = 00-011<br />8 = 10-010<br />9 = 01-010</p><p>另外，每一个正规的39码的开头有一个星号（*）。</p><p>* = 0-0110</p><p>结尾会根据不同的编码系列有不同，39码系列通常会使用星号结尾。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E6%259D%25A1%25E5%25BD%25A2%25E7%25A0%2581/" rel="tag">条形码</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259D%25A1%25E7%25A0%2581/" rel="tag">条码</a> , <a href="http://www.gaobo.info/go.php/tags/barcode/" rel="tag">barcode</a> , <a href="http://www.gaobo.info/go.php/tags/code/" rel="tag">code</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/679.htm</link>
<title><![CDATA[中国Chinanet骨干网络结构概述]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 03 Dec 2009 03:19:30 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/679.htm</guid> 
<description>
<![CDATA[ 
	Chinanet 骨干网的拓扑结构逻辑上分为两层，即核心层和大区层。 <br /><div>1.1 核心层 <br />&nbsp;&nbsp;&nbsp;&nbsp; 核心层由北京、上海、广州、沈阳、南京、武汉、成都、西安等8个城市的核心节点组成。 <br />&nbsp;&nbsp;&nbsp;&nbsp; 核心层的功能主要是提供与国际internet的互联，以及提供大区之间信息交换的通路。其中北京、上海、广州核心层节点各设有两台国际出口路由器，负责与国际i nternet互联，以及两台核心路由器与其他核心节点互联；其他核心节点各设一台核心路由器。 <br />核心节点之间为不完全网状结构。以北京、上海、广州为中心的三中心结构，其他核心节点分别以至少两条高速ATM链路与这三个中心相连。 <br /></div><div>1.2 大区层 <br />&nbsp;&nbsp;&nbsp; &nbsp;全国31个省会城市按照行政区划，以上述8个核心节点为中心划分为8个大区网络，这8个大区网共同构成了大区层。每个大区设两个大区出口，大区内其它非出口节点分别与两个出口相连。 <br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 大区层主要提供大区内的信息交换以及接入网接入chinanet的信息通路。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大区之间通信必须经过核心层。 <br /></div><div>2． 路由协议 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前路由政策国际部分采用BGP4与国外其它网络进行路由交换，国内部分采用BGP4进行与省网内进行地址交换，而采用IS-IS进行骨干网内部的路由选择。 <br /></div><div>2 . 1 BGP <br />&nbsp;&nbsp;&nbsp; BGP是域间路由协议。Chinanet骨干网申请的自治域号为4134，Chinanet作为一个独立的自治域，采用BGP路由协议与国际internet及各省接入网交换路由信息。骨干网内路由器之间是I BGP，骨干网和国外及接入网之间是EBGP。但是IBGP路由在自治域内只会向前传递一次，所以IBGP路由器之间需要具有全网状连接，才能保证每台路由器都收到完整的路由，但是骨干网内路由器数量很多，做全网状连接是不现实的，因此骨干网采用B GP Confedration 的方法；对内将骨干网用私有AS号划分为9个私有AS域，每一个小的自治域中，IBGP采用全网状的联接方式，自治域之间为EBGP联接方式。对外通过B GP Confedration将这些AS集合成一个独立的AS 4134。这样，ChinaNET骨干网就采用AS 4134分别与国际Internet以及各省网交换路由信息，在内部用私有AS号交换路由。 <br /></div><div>2 . 2 ISIS&nbsp;<br />&nbsp; ISIS是一种IGP(内部网关协议)，通过ISIS路由协议可以对从BGP学来的nexthop进行寻径。 <br />在ChinaNET骨干网中使用single IGP。即核心层及八个大区层网络中使用同一个Tag(core)的IS-IS。采用Single IGP的好处是所有的IS-IS路由器可以正常地交换IS-IS路由信息。如果采用不同的Tag，则不同tag下的isis彼此交换路由，需要redistrib ute，这将导致许多不必要的麻烦。 <br /></div><div>2.1.1 AREA的划分 <br />&nbsp;&nbsp;&nbsp; ISIS路由协议是一种link state路由协议，它的一个特点就是在一个域内可以分为很多个区，如果一台路由器的路由表发生变化，它就会向本区内的其他路由器广播这一变化，直到同一区内的所有路由器都将形成一张完全相同的本区的拓扑图为止。由于C hinaNET骨干网路由器及链路数量很多，如果所有路由器都在一个区的话，每一条路由的变化，都会导致全网的路由器进行路由更新，这将大大降低网络的效率。因此根据骨干网的网络结构状况，将c hinanet划分为九个IS-IS域，核心层网络与八个大区层网络分别处于一个独立的区域内。这样就将链路状态的频繁变化对网络的影响限制于一个区域内部，而不致于对全网产生影响。 <br /></div><div>2.1.2 Level-1和Level-2路由 <br />&nbsp;&nbsp;&nbsp; 在ISIS中，路由可分为两类：level-1和level-2。level-1的链路信息可以从level-2的链路上广播，而level-2的链路信息不可以从level -1的链路上广播。level-1的路由和level-2的路由在路由器内分别在两个数据库中。如果某台路由器只有level-1路由的数据库，则称为l evel-1 router ，反之为level-2路由器。level-1 router只和与它具有相同area id的路由器交换路由信息，而level-2路由器可以和与它具有相同area id的路由器交换路由信息。如果level-1 router发现IP包的目的地址与它的area id 不同，它就会将此包自动转发到离它最近的(并不一定最好)的level-2路由器上。区分level-1和level-2路由可以减少路由交换的数量，提高网络的效率。</div><div>2.1.3 ISIS metric <br />&nbsp;&nbsp;&nbsp; ISIS 的路由选择通过metric实现，metric值越小越优先。Metric的范围为0～63，缺省为10。目前Chinanet骨干网根据主要根据链路带宽的大小设置m etric的优先级，带宽越大，metric值越小，这样网络可以动态地优先选择大带宽的路径。 <br /></div><div>2.1.4 静态路由和直连路由的广播 <br />&nbsp;&nbsp;&nbsp; 路由器上设置的静态路由，为了使它加入到ISIS的路由表中去，需要将静态路由redistribute进ISIS中。同样，在isis core 的边缘上路由器，如国际出口链路和大区与接入之间链路，也需要redistribute进ISIS。 <br />Redistribute的原则是：国际和核心路由器redistribute进level-2，大区出口路由器redistribute进level-1和level-2，大区内路由器r edistribute进level-1。 <br /></div><div>3 国内路由政策 <br />&nbsp;&nbsp;&nbsp; 国内路由在全网范围内进行广播，路径选择首先选择被访问地址所属省网的出口，然后选择到此省网出口的最短路径。大区第一出口节点、非大区出口节点首选大区第一出口作为访问其它国内地址的出口，大区第二出口首选大区第二出口作为访问国内其它大区地址的出口。 <br /></div><div>3.1 核心路由器与国际出口路由器之间的路由政策 <br />3.1.1 BGP <br />&nbsp;&nbsp;&nbsp;&nbsp; &uuml; 在北京、上海和广州这三个国际出口分别设了两台国际出口路由器，同属AS64999，为了减少IBGP的数量，采用了route reflector 技术，将核心路由器作为RR server，国际路由器作为RR client，这样其他核心路由器不和国际路由器做IBGP，也能接收到国际路由。 <br /></div><div>3.1.2 ISIS <br />&nbsp;&nbsp; &uuml; 国际路由器与核心路由器之间的连接均为level-2。 <br />&nbsp;&nbsp; &uuml; 两者采用155M的POS相连，因此metric=5。 <br />3.2 核心与核心路由器之间的路由政策 <br />3.2.1 BGP <br />&nbsp;&nbsp; &uuml; 核心与核心路由器之间以Loopback地址为neighbor做IBGP的full-mesh。 <br />&nbsp;&nbsp; &uuml; 核心路由器之间的IBGP不做任何控制，所有的核心路由器都接收全路由表。 <br />3.2.2 ISIS <br />&nbsp;&nbsp; &uuml; 所有核心与核心路由器之间的连接都是level-2 only。 <br />&nbsp;&nbsp; &uuml; isis的metic按附录二设置。 <br />3.3 核心与大区出口路由器之间的路由政策 <br />&nbsp;&nbsp; 每个大区现在除与本大区核心路由器相连的第一出口之外，还设有第二出口与另一台核心路由器相连，作为第二大区出口。 <br />3.3.1 BGP <br />&nbsp;&nbsp; &uuml; 核心与大区出口路由器之间为confederation内的EBGP，以interface作为neighbor。 <br />&nbsp;&nbsp; &uuml; 为了减少大区路由器的负载，提高网络效率，在核心路由器向大区路由器广播路由时，过滤掉国际路由，即大区路由器不接收国际路由。( 北京除外) <br />&uuml; 北京大区路由器接收全路由表，与核心路由器之间的IBGP不做任何控制。 <br />3.3.2 ISIS <br />&nbsp;&nbsp; &nbsp; 所有核心与大区路由器之间的连接都是level-2 only。 <br />&nbsp;&nbsp; 在大区出口路由器上设置缺省路由，分别指向与本其直连的核心路由器和另一出口路由器，这样大区出国的路由均根据静态路由的指向出国。 <br />&uuml; 国内的路由及入大区的流量根据metric值的大小动态调节。<br />&uuml; isis的metic按附录二设置。 <br />3.4 大区与大区路由器之间的路由政策 <br />3.4.1 BGP <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &uuml; 大区内所有路由器做IBGP full-mesh.。 <br />&nbsp;&nbsp;&nbsp;&nbsp; &uuml; 大区路由器之间IBGP不做任何控制。 <br />3.4.2 ISIS <br />&nbsp;&nbsp;&nbsp; &uuml; 大区内的连接定义为level－1。 <br />&nbsp;&nbsp;&nbsp; &uuml; 大区非出口路由器定义为level-1 router。 <br />&nbsp;&nbsp; &uuml; 大区非出口路由器出大区，选择离它最近的level-2路由器。 <br />3.5 大区路由器与接入网之间的路由政策 <br />&nbsp;&nbsp;&nbsp; 大区与接入网之间为EBGP，且原则上不做控制。对于到骨干网有两个出口的接入网，由接入网自行设置流量分担。 <br />对于省网广播上来的路由，骨干网在国际路由器上重新进行aggregate，以4134广播出去，从而隐藏掉各省网的私有AS。根据BGP协议的规定，对地址进行a ggregate时，BGP路由表中必须有关于该地址块更小的路由。例如骨干网要aggegate一个64个C的地址块，接入网必须以两个32个C的地址块广播给骨干网。 <br />4 国际路由策略 <br />&nbsp;&nbsp;&nbsp;&nbsp; 在北京、上海和广州这三个国际出口分别设了两台国际出口路由器，接收国际路由，分别广播给所在节点的核心路由器，再广播给其它的核心路由器。大区路由器不接收国际路由表，靠缺省路由选择路径。 <br />4 . 1 目前CHINANET在北京、上海、广州设有国际出口，负责国内不同地区地区的国际访问时的流量出口。 <br />下表说明的是不同出口所负责的地区： <br />北京负责地区 北京大区、成都大区、长春、兰州、济南 <br />上海负责地区 上海大区、南京大区、武汉大区、西安大区、沈阳大区、南宁、天津 <br />广州负责地区 广州大区、重庆、长沙、福州 <br />某地区国际访问流量的流入和流出优先选择主要负责出口，并且以其它出口作为备份。对国外对等网访问时的路由可不受此原则的限制。 <br />4 . 2 路由政策的实现方法 <br /></div><div>&nbsp;&nbsp; 4 . 2 . 1 由于IP网络选路的原则是只根据目的地址选路。因此，流出时，一方面要通过调整接收国际路由的属性，另一方面还要调整国内路由，使主要负责出口距离最短的来实现，但只能原则上实现，不排除从非主要负责出口流出的可能。流入时，通过调整国内不同地址块向国际广播时的属性来实现。 <br />4 . 2 . 2 根据国际上一些ISP的规定，Chinanet新广播出去的路由必须先在国际公共的路由注册机构进行注册之后，才给予接收。目前Chinanet的地址是在M CI的数据库中注册，MCI同意之后，再通知AT&amp;T等ISP接收。 <br />4 . 3 划分的依据： <br />4 . 3 . 1 地理位置及网络拓扑： <br />北京主要负责华北、东北及西南地区，上海负责华东、华中和西北地区、广东负责华南地区。负责出口的节点要有和此节点直联的电路，或与此节点所在大区的核心节点有直联电路，作为大区的第二出口节点由直联的节点出口负责。 <br />4 . 3 . 2 流量均衡 <br />由于目前的统计手段还无法确知某省的国际流量情况，因此由此省的接入流量代替，由于国际与国内可以近似看作成一定比例，故通过比较省内网流入和流出骨干网的总流量，可知按上述范围划分基本可以保证三部分的流量基本平均分配在三个出口上。 <br />5 政策调整 <br />今年年初根据安排CHINANET的国际出口带宽会有大幅度的提高，因此路由政策也需要有相应的调整。 <br />根据目前所掌握的流量情况，原有的负责范围调整如下： <br />北京负责地区 北京、河北、内蒙、山西、沈阳、河南、吉林、黑龙江、山东 <br />上海负责地区 上海、浙江、江苏、安徽、湖北、天津、江西、陕西、甘肃、青海、宁夏、新疆、广西 <br />广州负责地区 广东、福建、湖南、海南、四川、云南、贵州、西藏、重庆 <br />5 .1 分配原则的调整 <br />基本继续沿用以前的流入、流出原则并增加以下原则：<br />为减轻国内流量压力，北京、上海、广州本地地址流量在本地的一条出口中断时，原则上从还从本地其它流入，其它在主要负责出口中迂回到非主要出口流入。 <br />5 . 2 其它需要注意调整的原则 <br />5 . 2 . 1 鉴于国际带宽的大幅度增长，国内带宽要相应的具有对国际带宽不稳定时的备份功能。北京、上海、广州之间的带宽应不少于4条155M。 <br />5 . 2 . 2 为了使路由政策能够准确实现，应该变目前IS-IS metric严格按照带宽取值的情况。大区出口到主要国际出口的数值应为10，备分出口应为15；非大区出口到大区第一出口的数值应为10，到第二入口应为1 5。 <br />5 . 2 . 3 建议采取预设相应的community string与LOCAL PREFERENCE的对应关系来使对方能够调整不同出口之间流出CHINANET的流量平衡；如：4134：480 代表80 ，4134：500代表100，4134：520代表120。<br />附录 <br />附录一 ISIS area id 表 <br />AREA名 AREA号 <br />核心 0 <br />北京大区 1 <br />沈阳大区 2 <br />南京大区 3 <br />上海大区 4 <br />广州大区 5 <br />武汉大区 6 <br />成都大区 7 <br />西安大区 8 <br /><br />附录二 ISIS metric 与Bandwith 对应表 <br />带宽大小（Mbps） METIRC值 <br />2M以下 60 <br />2M 55 <br />5 50 <br />10 45 <br />20 40 <br />30 35 <br />50 30 <br />70 25 <br />100 15 <br />120 10 <br />150 5 <br />附录三 三出口负责地区接入流量表 <br />附录四 调整后的国际带宽分配和路由政策： <br />1 . 北京 <br />1.1至美国 155M 一条 <br />1.1.1 播出：北京负责地区路由不作控制；其它路由加4个AS <br />1.1.2 接收：不作控制 <br />1.2至P-NAP 45M 一条 <br />1.2.1播出：北京地址不作控制；河北、内蒙、山西、沈阳、河南、吉林、黑龙江、山东路由metric=50；其它路由加4个AS，metric=100 <br />1.2.2 接收：P-NAP本身的路由不作控制；其它LOCAL PREFERENCE降低至90 <br />1.3 至 verio 45M 一条 <br />1.3.1播出：北京地址 2914：490；河北、内蒙、山西、沈阳、河南、吉林、黑龙江、山东路由加4个AS 2914：490；其它路由加4个AS，2914：460 <br />1.3.2 接收：verio本身，UUNET，MCI-CW的路由不作控制；其它LOCAL PREFERENCE降低至90 <br />1.4至 verio 8M 一条 <br />1.4.1 播出：河北、内蒙、山西路由不作控制 2914：490；其它路由加4个AS，2914：460 <br />1.4.2接收：verio本身，UUNET，MCI-CW的路由不作控制；其它LOCAL PREFERENCE降低至90 <br />2 .上海 <br />2.1 至美国 155M 一条 <br />2.1.1 播出：上海负责地区路由不作控制；其它路由加4个AS <br />2.1.2 接收：不作控制 <br />2.2 至P-NAP 45M 一条 <br />2.2.1播出：上海地址不作控制；安徽、湖北、天津、江西、陕西、甘肃、青海、宁夏、新疆、广西metric=50；其它加 4个AS，metric=100 <br />2.2.2 接收：P-NAP本身路由不作控制；其它路由LOCAL PREFERENCE降低至90 <br />2.3 至 AT&amp;T 45M 一条 <br />2.3.1播出：上海地址不作控制；江苏、浙江、安徽、湖北、天津、江西、陕西、甘肃、青海、宁夏、新疆、广西加4个AS；其它加 6个AS <br />2.3.2 接收:不作控制 <br />3 . 广州 <br />3.1至美国 155M 一条 <br />3.1.1播出：广州负责地区不作控制；其它路有加4个AS <br />3.1.2接收：不作控制 <br />3.2至Global One 45M 一条 <br />3.2.1播出：广东地址不作控制；福建、湖南、海南、四川、云南、贵州、西藏、重庆不作控制加4个AS；其它加6个AS 3.2.2接收：Global One本身路由、UUNET、MCI-CW路由不作控制；其它LOCAL PREFERENCE降低至90 <br />3.3 至 verio 16M 一条 <br />3.3.1 播出：福建、湖南、海南、四川、云南、贵州、西藏、重庆不作控制；其它加4个AS <br />3.3.2 接收：verio本身的路由不作控制；其它LOCAL PREFERENCE降低至90 <br />4 . 国外对等网 <br />国外对等网及其子网地址LOCAL PREFERENCE升高至500；对外广播地址一般不作控制,确实需要在多条链接上进行分担时采取对广播路由加metric的方式； <br />5 . 国内对等网 <br />国内对等网的地址优先从北京出口广播；广州、上海广播时加4个AS</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/chinanet/" rel="tag">chinanet</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%25AA%25A8%25E5%25B9%25B2%25E7%25BD%2591/" rel="tag">骨干网</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BB%2593%25E6%259E%2584/" rel="tag">结构</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25A6%2582%25E8%25BF%25B0/" rel="tag">概述</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B7%25AF%25E7%2594%25B1/" rel="tag">路由</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/678.htm</link>
<title><![CDATA[P3P（Platform for Privacy Preferences）简介]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Wed, 02 Dec 2009 01:10:28 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/678.htm</guid> 
<description>
<![CDATA[ 
	<p>P3P（Platform for Privacy Preferences）（隐私权偏好选项平台）是W3C(World Wide Web Consortium)公布的一项隐私保护推荐标准。Microsoft Internet Explorer 6 (IE6) 是第一个支持这项新隐私权标准的浏览器。 Firefox目前还不支持 P3P 安全特性。 采用 P3P 之后，您可以设置浏览器自动侦测网站是否：收集个人标识信息、使用这些信息创建用户档案、或允许到访者拒绝数据收集。</p><p>具备 P3P 能力的浏览器具有一些可供您选择的默认选项。 或者您也可以通过回答问题的方式（例如您愿意分享哪些数据、愿意接受哪些类型的 Cookie 文件）自定义您的设置。 当您在 Web 浏览时，这个软件会判断您的隐私权偏好选项是否与网站的数据收集做法匹配。 </p><p>具备 P3P 能力的浏览器会特别注意 Cookie。 Cookie 是留存在您计算机硬盘上的一段文本，它可以让 Web 应用程序以个体方式对您响应。 通过收集和记忆您的偏好选项信息，Web 应用程序可以根据您的需求、喜欢什么、不喜欢什么等来修改它的运作模式。 使用具备 P3P 能力的浏览器，您可以选择是否接受各种类型的 Cookie，例如阶段性（暂时性）、永久性、在指定的网域之内或之外（第三方），以及有没有特殊的 &rdquo;P3P 精简政策&rdquo; (P3P compact policy) 文件。 精简 P3P 政策描述了给定 Cookie 的属性。 </p><p>对于上面的只是， Internet Explorer 就体现在本文第一张图上对浏览器隐私的设置上。以及进一步的设置中，图四中，我们选中站点，摘要按钮就可以用了，点击摘要按钮可以看到隐私策略调整窗口。<br />从技术上看，P3P包括了两个组件：一个放在服务器端；另外一个放在客户端，形成一个用户代理。当用户登陆网站的时候，服务器端的组件根据网站的要求，会自动生成XML语言形式的用户个人处理策略，这就像是贴在商店橱窗外的公众告示，而客户端的组件就将这个&ldquo;公众告示&rdquo;提供给用户。</p><p>上面例子中隐私策略中 CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR 的意思是啥。<br />Fiddler可以方便的知道，在Fiddler 中我们可以看到如下信息：</p><p>Response sets a cookie: <br />&nbsp;&nbsp;&nbsp; Set-Cookie: ghj=aaaa_2009/11/27 15:55:56_<a href="http://a.net/WebApp_P3P/a_setcookie.aspx;" target="_blank">http://a.net/WebApp_P3P/a_setcookie.aspx;</a> domain=.a.net; expires=Fri, 11-Dec-2009 07:55:56 GMT; path=/ </p><p>P3P Header is present: <br />&nbsp;&nbsp;&nbsp; CP=&quot;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR&quot; </p><p>Compact Policy token is present. A trailing &quot;o&quot; means opt-out, a trailing &quot;i&quot; means opt-in. </p><p>CURa <br />Information is used to complete the activity for which it was provided. </p><p>ADMa <br />Information may be used for the technical support of the Web site and its computer system. </p><p>DEVa <br />Information may be used to enhance, evaluate, or otherwise review the site, service, product, or market. </p><p>PSAo <br />Information may be used to create or build a record of a particular individual or computer that is tied to a pseudonymous identifier, without tying identified data (such as name, address, phone number, or email address) to the record. This profile will be used to determine the habits, interests, or other characteristics of individuals for purpose of research, analysis and reporting, but it will not be used to attempt to identify specific individuals. </p><p>PSDo <br />Information may be used to create or build a record of a particular individual or computer that is tied to a pseudonymous identifier, without tying identified data (such as name, address, phone number, or email address) to the record. This profile will be used to determine the habits, interests, or other characteristics of individuals to make a decision that directly affects that individual, but it will not be used to attempt to identify specific individuals. </p><p>OUR <br />We share information with ourselves and/or entities acting as our agents or entities for whom we are acting as an agent. </p><p>BUS <br />Info is retained under a service provider&quot;s stated business practices. Sites MUST have a retention policy that establishes a destruction time table. The retention policy MUST be included in or linked from the site&quot;s human-readable privacy policy. </p><p>UNI <br />Non-financial identifiers, excluding government-issued identifiers, issued for purposes of consistently identifying or recognizing the individual. These include identifiers issued by a Web site or service. </p><p>PUR <br />Information actively generated by the purchase of a product or service, including information about the method of payment. </p><p>INT <br />Data actively generated from or reflecting explicit interactions with a service provider through its site -- such as queries to a search engine, or logs of account activity. </p><p>DEM <br />Data about an individual&quot;s characteristics -- such as gender, age, and income. </p><p>STA <br />Mechanisms for maintaining a stateful session with a user or automatically recognizing users who have visited a particular site or accessed particular content previously -- such as HTTP cookies. </p><p>PRE <br />Data about an individual&quot;s likes and dislikes -- such as favorite color or musical tastes. </p><p>COM <br />Information about the computer system that the individual is using to access the network -- such as the IP number, domain name, browser type or operating system. </p><p>NAV <br />Data passively generated by browsing the Web site -- such as which pages are visited, and how long users stay on each page. </p><p>OTC <br />Other types of data not captured by the above definitions. </p><p>NOI <br />Web Site does not collected identified data. </p><p>DSP <br />The privacy policy contains DISPUTES elements. </p><p>COR <br />Errors or wrongful actions arising in connection with the privacy policy will be remedied by the service. </p><p>Validate at: <a href="http://www.w3.org/P3P/validator.html"><a href="http://www.w3.org/P3P/validator.html" target="_blank">http://www.w3.org/P3P/validator.html</a></a> <br />Learn more at: <a href="http://www.fiddler2.com/redir/?id=p3pinfo"><a href="http://www.fiddler2.com/redir/?id=p3pinfo" target="_blank">http://www.fiddler2.com/redir/?id=p3pinfo</a></a> </p><p>P3P这个Http头的写法有很多组合，自己写很痛苦，通过下面这个连接 <a href="http://www.w3.org/P3P/details.html"><a href="http://www.w3.org/P3P/details.html" target="_blank">http://www.w3.org/P3P/details.html</a></a> 您可以找到一些P3P策略生成器软件包。（虽然如果在Google上搜索，您会发现更多搜索结果，但提供免费使用的好象只有IBM的P3P策略编辑器IBM&quot;s P3P Policy Editor。） </p><p></p><p>注意：</p><p>Visual Studio 自带的开发站点（ASP.NET Development Server）是不支持这个功能的，它会报错误：This operation requires IIS integrated pipeline mode.&nbsp; </p><p></p><p>参考资料：</p><p>用P3P解决第三方cookie存取的问题 <br /><a href="http://www.javaeye.com/topic/94336"><a href="http://www.javaeye.com/topic/94336" target="_blank">http://www.javaeye.com/topic/94336</a></a></p><p>IBM P3P Policy Editor <br /><a href="http://www.alphaworks.ibm.com/tech/p3peditor"><a href="http://www.alphaworks.ibm.com/tech/p3peditor" target="_blank">http://www.alphaworks.ibm.com/tech/p3peditor</a></a></p><p>How to configure IIS to use Platform for Privacy Preferences (P3P) <br /><a href="http://support.microsoft.com/kb/324013/en-us"><a href="http://support.microsoft.com/kb/324013/en-us" target="_blank">http://support.microsoft.com/kb/324013/en-us</a></a></p><p>How to Deploy P3P Privacy Policies on Your Web Site <br /><a href="http://msdn.microsoft.com/en-us/library/ms537341(VS.85).aspx"><a href="http://msdn.microsoft.com/en-us/library/ms537341(VS.85).aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms537341(VS.85).aspx</a></a></p><p>Add a Custom HTTP Response Header (IIS 7) <br /><a href="http://technet.microsoft.com/en-us/library/cc753133(WS.10).aspx"><a href="http://technet.microsoft.com/en-us/library/cc753133(WS.10).aspx" target="_blank">http://technet.microsoft.com/en-us/library/cc753133(WS.10).aspx</a></a></p><p>私有参数选择平台&mdash;&mdash;P3P（关于Cookies） <br /><a href="http://www.yxl.cn/Info/20060302,212041,5095.html"><a href="http://www.yxl.cn/Info/20060302" target="_blank">http://www.yxl.cn/Info/20060302</a>,212041,5095.html</a></p><p>使用P3P <br /><a href="http://welcome.hp.com/country/cn/zh/privacy/p3p_popup.html"><a href="http://welcome.hp.com/country/cn/zh/privacy/p3p_popup.html" target="_blank">http://welcome.hp.com/country/cn/zh/privacy/p3p_popup.html</a></a> </p><p><br />用P3P header解决iframe跨域访问cookie/session <br /><a href="http://blog.csdn.net/Hashxu/archive/2009/01/02/3684402.aspx"><a href="http://blog.csdn.net/Hashxu/archive/2009/01/02/3684402.aspx" target="_blank">http://blog.csdn.net/Hashxu/archive/2009/01/02/3684402.aspx</a></a></p><p>利用P3P跨域传COOKIE <br /><a href="http://hi.baidu.com/thinkinginlamp/blog/item/5e2a02084f1dafd163d9865f.html"><a href="http://hi.baidu.com/thinkinginlamp/blog/item/5e2a02084f1dafd163d9865f.html" target="_blank">http://hi.baidu.com/thinkinginlamp/blog/item/5e2a02084f1dafd163d9865f.html</a></a></p><p>使用p3p解决Iframe中cookie跨域问题 <br /><a href="http://blog.ntsky.com/p3p-iframe-cookie.html"><a href="http://blog.ntsky.com/p3p-iframe-cookie.html" target="_blank">http://blog.ntsky.com/p3p-iframe-cookie.html</a></a></p><p>通过设置P3P头来实现跨域访问COOKIE <br /><a href="http://blog.c114.net/html/38/193738-35549.html"><a href="http://blog.c114.net/html/38/193738-35549.html" target="_blank">http://blog.c114.net/html/38/193738-35549.html</a></a></p><p><br />P3P <br /><a href="http://www.hudong.com/wiki/p3p"><a href="http://www.hudong.com/wiki/p3p" target="_blank">http://www.hudong.com/wiki/p3p</a></a></p><p>Cookie, iframe 与 P3P 的那点事儿 <br /><a href="http://www.dbanotes.net/web/cookie_p3p.html"><a href="http://www.dbanotes.net/web/cookie_p3p.html" target="_blank">http://www.dbanotes.net/web/cookie_p3p.html</a></a></p><p>Firefox Help:&nbsp; Firefox&quot;s Cookie Options <br /><a href="http://mozilla.gunnars.net/firefox_help_firefox_cookie_tutorial.html"><a href="http://mozilla.gunnars.net/firefox_help_firefox_cookie_tutorial.html" target="_blank">http://mozilla.gunnars.net/firefox_help_firefox_cookie_tutorial.html</a></a></p><p>ie session丢失 ie中iframe丢失问题 <br /><a href="http://wangzi6hao.javaeye.com/blog/531524"><a href="http://wangzi6hao.javaeye.com/blog/531524" target="_blank">http://wangzi6hao.javaeye.com/blog/531524</a></a></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/p3p/" rel="tag">p3p</a> , <a href="http://www.gaobo.info/go.php/tags/privacy/" rel="tag">privacy</a> , <a href="http://www.gaobo.info/go.php/tags/w3c/" rel="tag">w3c</a> , <a href="http://www.gaobo.info/go.php/tags/cookie/" rel="tag">cookie</a> , <a href="http://www.gaobo.info/go.php/tags/internet/" rel="tag">internet</a> , <a href="http://www.gaobo.info/go.php/tags/browser/" rel="tag">browser</a> , <a href="http://www.gaobo.info/go.php/tags/explorer/" rel="tag">explorer</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/677.htm</link>
<title><![CDATA[关于喝酒。。。]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 01 Dec 2009 01:01:59 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/677.htm</guid> 
<description>
<![CDATA[ 
	<p>一、酒前 <br />　　1、喝酒之前，吃饭只能吃7份饱，且不可大量饮水。（这是为了留下肚子好喝酒）<br />　　2、喝酒之前半小时，喝瓶牛奶，最好是纯奶或者含糖的，可预防酒醉性胃炎和脱水症。饮加砂糖或蜂蜜的牛奶，既可促进乙醇分解，又能保护胃黏膜。由于脱水会使盐分丢失，可适量饮些淡盐水或补液盐。（最要省事哈） <br />　　3、不要空腹饮酒，因为空腹时酒精吸收快，人容易喝醉；最好的预防方法就是在喝酒之前，先行食用油质食物，如肥肉、蹄膀等，或饮用牛奶，利用食物中脂肪不易消化的特性来保护胃部，以防止酒精渗透胃壁。这是饮酒不醉的主要诀窍。因为这样可使乙醇在体内吸收时间延长。<br />二、酒中 <br />　　1、喝酒时且忌不能饮用冰水、柠檬水等等刺激性的饮料，不然前面的牛奶就白喝了；不要和碳酸饮料如可乐、汽水等一起喝，这类饮料中的成分能加快身体吸收酒精。 <br />　　2、喝白酒，不可一饮而尽，须的分成几口喝。喝啤酒，须待得啤酒漠落下以后再喝，否则，轻则腹涨难受，重则现场直播。 <br />　　3、喝酒的间隙喝酸奶--不用说了吧，酸 醇=水 <br />　　4、由于酒精对肝脏的伤害较大，喝酒的时候应该多吃绿叶蔬菜，其中的抗氧化剂和维生素可保护肝脏。还可以吃一些豆制品，其中的卵磷脂有保护肝脏的作用。 <br />5、宜慢不宜快。饮酒后五分钟乙醇就可进入血液，30~120分钟时血中乙醇浓度可达到顶峰。饮酒快则血中乙醇浓度升高得也快，很快就会出现醉酒状态。若慢慢饮入，体内可有充分的时间把乙醇分解掉，乙醇的产生量就少，不易喝醉。 <br />　　6、食饮结合。饮酒时，吃什么东西最不易醉？以吃猪肝最好。这不仅是因为其营养丰富，而且因为猪肝可提高机体对乙醇的解毒能力，常饮酒的人会造成体内维生素B的丢失，而猪肝又是维生素B最丰富的食物，故吃煮猪肝或炒猪肝是很理想的伴酒菜。<br />三、酒后 <br />　　1、酒后不可以喝醋、喝茶解酒，这些都是误区，醋和茶都不能解酒。 <br />　　2、酒醉后最好不能喝浓茶，但可以喝点淡茶。茶叶中的茶多酚有一定的保肝作用，但浓茶中的茶碱可使血管收缩，血压上升，反而会加剧头疼。如果有人身不由己喝得太多，可以事后吃一些水果，或者喝一些果汁，因为水果和果汁中的酸性成分可以中和酒精。很多人酒后往往不吃饭，这样危害更大，应吃一些容易消化的食物，比如来一碗面条就非常好。 <br />　　3、甜点加水果。饮酒后立即吃些甜点心和水果可以保持不醉状态。俗话说&ldquo;酒后吃甜柿子，酒味会消失&rdquo;，这话不错。甜柿子之类的水果含有大量的果糖，可以使乙醇氧化，使乙醇加快分解代谢掉，甜点心也有大体相仿的效果。 <br />　　4、至于在饮酒之后，能够尽量的饮用热汤，尤其是用姜丝炖的鱼汤，特别具有解酒效果。 <br />　　5、酒后如发生呕吐不止，应立即找来矿泉水一瓶灌下，以免胃里没有东西而呕出血来。 <br />　　6、呕吐完后，不可立即进食，尤其是烧烤一类食物。 <br />　　7、睡觉之前请记住在床头放置盛器一个，以免，睡后惊醒欲呕吐在还未到达洗手间之前已然喷将出来。 <br />　　8、翌日，若感胃酸，请服用胃舒平，等胃酸缓解后再喝水。 <br />　　9、惹感胃痛，可适情况服用其他胃药，且不可服用止疼药，因为止疼药对于胃疼疗效胜微。 <br />　　10、早点可选用豆浆、牛奶一类热饮。若还需上班者，可选用脉动、红牛等提神饮料，以保证不耽误工作</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%2596%259D%25E9%2585%2592/" rel="tag">喝酒</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2585%2592%25E5%2589%258D/" rel="tag">酒前</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2585%2592%25E4%25B8%25AD/" rel="tag">酒中</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2585%2592%25E5%2590%258E/" rel="tag">酒后</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/676.htm</link>
<title><![CDATA[《80后小传》]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 19 Nov 2009 10:15:05 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/676.htm</guid> 
<description>
<![CDATA[ 
	在不同的地方看过很多遍了，觉得还是有意思，遂摘录之。<br /><br />夫80后者，初从文，未及义务教育之免费，不见高等学校之分配，适值扩招，过五关，斩六将，本硕相继，寒窗数载，二十六乃成，负债十万。觅生计，背井离乡，东渡苏浙，南下湖广，西上志愿，北漂京都，披星戴月，秉烛达旦，十年无休，蓄十万。楼市暴涨， 无栖处，购房金不足首付，遂投股市，翌年缩至万余，遂抑郁成疾， 入院一周，倾其所有，病无果，因欠费被逐院门。寻医保, 不合大病之规，拒付，带病还。服鼠药自尽，遇赝品未果. 友怜之，送三鹿奶粉，饮之，卒。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/80/" rel="tag">80</a> , <a href="http://www.gaobo.info/go.php/tags/80%25E5%2590%258E/" rel="tag">80后</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B0%258F%25E4%25BC%25A0/" rel="tag">小传</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/675.htm</link>
<title><![CDATA[C#/.NET Winform获取本机的公网IP地址的简单方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Thu, 05 Nov 2009 12:31:33 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/675.htm</guid> 
<description>
<![CDATA[ 
	获取本机（网关）的外网IP，在C#里面实现的方法，通常是遍历获取到的本机的IP地址，然后判断，不过这种方式只能取得独立拨号或具有独立公网IP的地址，对于局域网的方式，是取不到的，这种方式的代码大致如下：<br/><div class="code">System.Net.IPHostEntry ips = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());<br/>foreach (System.Net.IPAddress ip in ips.AddressList)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ip.ToString());<br/>&#125;</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/winform/" rel="tag">winform</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259C%25AC%25E6%259C%25BA/" rel="tag">本机</a> , <a href="http://www.gaobo.info/go.php/tags/localhost/" rel="tag">localhost</a> , <a href="http://www.gaobo.info/go.php/tags/ip/" rel="tag">ip</a> , <a href="http://www.gaobo.info/go.php/tags/address/" rel="tag">address</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/674.htm</link>
<title><![CDATA[6款免费的图标编辑器]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 03 Nov 2009 08:21:19 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/674.htm</guid> 
<description>
<![CDATA[ 
	<a href="http://greenfish.extra.hu/downloads.php">Greenfish Icon Editor Pro</a><br /><a href="http://icofx.ro/">IcoFX</a><br /><a href="http://www.sibcode.com/icon-editor/index.htm">Sib Icon Editor</a><br /><a href="http://www.stardock.com/products/icondeveloper/index.asp">Stardock IconDeveloper</a><br /><a href="http://www.xceedz.com/aaICO_Freeware_Icon_Editor.htm">aaICO Icon Editor</a><br /><a href="http://www.x2studios.com/index.php?page=products&amp;amp;amp;id=11">LiquidIcon XP</a><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%2585%258D%25E8%25B4%25B9/" rel="tag">免费</a> , <a href="http://www.gaobo.info/go.php/tags/free/" rel="tag">free</a> , <a href="http://www.gaobo.info/go.php/tags/icon/" rel="tag">icon</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259B%25BE%25E6%25A0%2587/" rel="tag">图标</a> , <a href="http://www.gaobo.info/go.php/tags/editor/" rel="tag">editor</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BC%2596%25E8%25BE%2591%25E5%2599%25A8/" rel="tag">编辑器</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/673.htm</link>
<title><![CDATA[Windows Server中禁止Administrator用户登录远程桌面]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Mon, 02 Nov 2009 09:08:35 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/673.htm</guid> 
<description>
<![CDATA[ 
	<p>打开服务器系统的组策略编辑控制台窗口，将鼠标定位于组策略编辑控制台窗口左侧区域中的&ldquo;计算机配置&rdquo;分支选项上，再从该分支下面依次展开&ldquo;Windows设置&rdquo;/&ldquo;安全设置&rdquo;/&ldquo;本地策略&rdquo;/&ldquo;用户权限分配&rdquo;子项，在对应&ldquo;用户权限分配&rdquo;子项的右侧显示区域中，双击目标组策略选项&ldquo;通过终端服务允许登录&rdquo;，在其后弹出的窗口中将Administrators账号删除掉，如此一来，当非法用户尝试使用Administrator账号远程连接Windows Server服务器系统时，就会出现拒绝登录的报警提示。<br />如果域用户想登录这台服务器的远程桌面，则要在刚才的操作上添加域用户的信息或者域用户组即可。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8/" rel="tag">服务器</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25B3%25BB%25E7%25BB%259F/" rel="tag">系统</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25BF%259C%25E7%25A8%258B/" rel="tag">远程</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25A1%258C%25E9%259D%25A2/" rel="tag">桌面</a> , <a href="http://www.gaobo.info/go.php/tags/administrator/" rel="tag">administrator</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F/" rel="tag">域</a> , <a href="http://www.gaobo.info/go.php/tags/domain/" rel="tag">domain</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/672.htm</link>
<title><![CDATA[让Bind9支持SRV记录]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Mon, 02 Nov 2009 06:51:53 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/672.htm</guid> 
<description>
<![CDATA[ 
	在管理服务器的时候使用了MS的AD，但是主DNS服务器是使用的Bind9，其他服务器在加入域的时候都会向主DNS发起查询，询问域控的相关信息，此时就需要调整Bind的设置，使其支持SRV记录。<br/><br/>可能出现的错误信息：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">错误是: "DNS 名称不存在。"<br/>(错误代码 0x0000232B RCODE_NAME_ERROR)<br/>查询是为 _ldap._tcp.dc._msdcs.****.com 查询 SRV 记录</div></div><br/>在域的记录配置中，添加以下记录：<br/><div class="code">**** IN A 111.222.333.444<br/>_ldap._tcp.aaa.com IN SRV 0 0 389 ****<br/>_kerberos._tcp.aaa.com IN SRV 0 0 88 ****<br/>_ldap._tcp.dc._msdcs.aaa.com IN SRV 0 0 389 ****<br/>_kerberos._tcp.dc._msdcs.aaa.com IN SRV 0 0 88 ****</div><br/>添加之后记得重启Bind服务。<br/><br/>如果是使用了DLZ，则按以下格式保存数据：<br/>zone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data<br/>aaa.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11.22.33.44<br/>aaa.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ****&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 111.222.333.444<br/>aaa.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ldap._tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0 389 ****<br/>aaa.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _kerberos._tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0 88 ****<br/>aaa.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ldap._tcp.dc._msdcs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SRV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0 389 ****<br/>aaa.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _kerberos._tcp.dc._msdcs&nbsp;&nbsp;&nbsp;&nbsp; SRV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0 88 ****<br/>44.33.22.11.in-addr.arpa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ****.aaa.com<br/><br/>PS：如果Bind的版本高于9.4，需要在named.conf的[options]段显式指明<br/><div class="code">allow-query &#123; any; &#125;;</div><br/>PSS：如果Bind的版本高于9.6，则要在View中显式指明<br/><div class="code">allow-query &#123; any; &#125;;</div><br/><br/>参考：<br/><a href="http://blog.chinaunix.net/u/9951/showart_1002715.html" target="_blank">http://blog.chinaunix.net/u/9951/showart_1002715.html</a><br/><a href="http://bbs.51cto.com/thread-533787-1.html" target="_blank">http://bbs.51cto.com/thread-533787-1.html</a><br/><a href="http://hextwolf.blog.51cto.com/59501/31875" target="_blank">http://hextwolf.blog.51cto.com/59501/31875</a><br/><strong>http://www.linuxquestions.org/linux/answers/Networking/Configure_BIND_DNS_to_Answer_Active_Directory_Queries</strong><br/><a href="http://bbs.net130.com/showthread.php?t=158592" target="_blank">http://bbs.net130.com/showthread.php?t=158592</a><br/><a href="http://bbs.chinaunix.net/archiver/?tid-201484.html" target="_blank">http://bbs.chinaunix.net/archiver/?tid-201484.html</a><br/><strong>http://osdir.com/ml/network.dns.bind9.dlz/2004-08/msg00025.html</strong><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/dns/" rel="tag">dns</a> , <a href="http://www.gaobo.info/go.php/tags/bind/" rel="tag">bind</a> , <a href="http://www.gaobo.info/go.php/tags/ad/" rel="tag">ad</a> , <a href="http://www.gaobo.info/go.php/tags/active/" rel="tag">active</a> , <a href="http://www.gaobo.info/go.php/tags/directory/" rel="tag">directory</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B4%25BB%25E5%258A%25A8%25E7%259B%25AE%25E5%25BD%2595/" rel="tag">活动目录</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E6%258E%25A7/" rel="tag">域控</a> , <a href="http://www.gaobo.info/go.php/tags/srv/" rel="tag">srv</a> , <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/671.htm</link>
<title><![CDATA[VMware vSphere4安装视频]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Mon, 02 Nov 2009 02:43:42 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/671.htm</guid> 
<description>
<![CDATA[ 
	<a href="http://www.hypervizor.com/2009/04/video-vsphere4-unleashed-01-installing-esx4/" target="_blank">Part1: Installing ESX4.0</a><br /><a href="http://www.hypervizor.com/2009/04/video-vsphere4-unleashed-02-installing-vcenter4/" target="_blank">Part2: Installing vCenter4.0 will all its components</a><br /><a href="http://www.hypervizor.com/2009/04/video-vsphere4-unleashed-03-%e2%80%93-licensing-configuring-vcenter/" target="_blank">Part3: Licensing &amp; Configuring vCenter</a><br /><a href="http://www.hypervizor.com/2009/05/video-vsphere4-unleashed-04-fault-tolerance/" target="_blank">Part4: Fault Tolerance</a><br /><a href="http://www.hypervizor.com/2009/05/video-vsphere4-unleashed-05-hot-add-and-thin-provisioning/" target="_blank">Part5: Hot-Add and Thin-Provisioning</a><br /><a href="http://www.hypervizor.com/2009/05/video-vsphere4-unleashed-06-storage-vmotion/" target="_blank">Part6: Storage vMotion</a><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/vsphere/" rel="tag">vsphere</a> , <a href="http://www.gaobo.info/go.php/tags/video/" rel="tag">video</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25A7%2586%25E9%25A2%2591/" rel="tag">视频</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E5%258C%2596/" rel="tag">虚拟化</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E6%259C%25BA/" rel="tag">虚拟机</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/670.htm</link>
<title><![CDATA[DELL2950开启硬件辅助虚拟化（VT）]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Sun, 01 Nov 2009 12:30:27 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/670.htm</guid> 
<description>
<![CDATA[ 
	操作步骤：<br/>1、在POST屏幕中按F2键以转至“BIOS setup”。<br/>2、导航至“CPU Information”。<br/>3、按Enter键，并导航至“Virtualization Technology”。<br/>4、通过切换左右箭头，选择“Enabled”。<br/>5、保存选择内容，并退出“BIOS setup”。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/dell/" rel="tag">dell</a> , <a href="http://www.gaobo.info/go.php/tags/power/" rel="tag">power</a> , <a href="http://www.gaobo.info/go.php/tags/edge/" rel="tag">edge</a> , <a href="http://www.gaobo.info/go.php/tags/virtualization/" rel="tag">virtualization</a> , <a href="http://www.gaobo.info/go.php/tags/technology/" rel="tag">technology</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E5%258C%2596/" rel="tag">虚拟化</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/669.htm</link>
<title><![CDATA[如何进行平台型网站架构设计？]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Tue, 27 Oct 2009 13:33:37 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/669.htm</guid> 
<description>
<![CDATA[ 
	<p>在欧拉的&ldquo;<a href="http://www.iisol.cn/?p=865" target="_blank"><span style="color: #0b59b2">平台网站架构设计之我所见</span></a>&rdquo;的博客中，他从选择技术方案和物理架构、平台研发和架构优化等方面阐述了他在多年的平台型网站架构设计过程中的经验心得。</p><p>欧拉先是分析了在选择技术方案和物理架构中的几个常见问题，以来解决如何提高开发效率，使平台具有高性能、高负载性的问题：</p><blockquote><strong>开发语言和数据库：</strong>我个人觉的最关键是你和你的团队最擅长的开发语言和数据库是哪个，古语有云：&ldquo;工欲善其事,必先利其器！&rdquo;，趁手的开发语言和数据库有助于事半功倍。试想如果你选择了一个并不很熟悉的语言，也许这个语言和数据库在基础性能上的确比你掌握的语言好，但是在研发过程中学习曲线肯定长。<br /><br /><strong>成熟框架还是自己实现：</strong>我个人的一些经验是，尽量使用开源的成熟框架，因为平台研发初期使用成熟的开源框架，能提高开发效率，并且在质量上有保证。我曾经接手过一个平台的改版，框架是前面开发人员自己写的，里面的一些设计思想不是很成熟，导致平台在负载增高后性能很差，整改起来很麻烦。 </blockquote><p>除此之外，Web Server/DB Server/Cache Server的选择也是很重要的一点，欧拉认为这一部分一定要使用具有前瞻性、易配置、能监控和维护的产品，并提出几个选型的标准：丰富和深入的配置选项、基于高并发模型、支持负载均衡和请求分发、高效的缓存机制、实时的状态监控机制等。而对于操作系统的选择，则要稳定安全、易管理和维护、易监控等。对于物理架构，即服务器的搭建方式，欧拉同样认为前瞻性是非常重要的：</p><blockquote>平台初期的话，我想大部分访问量都不高，Web Server/DB server/Cache Server放在一台服务器上都没问题。但是自己心里最好能预估一下这个平台会发展到什么样的规模，在做架构设计的时候，按照事先预估的来决定怎么做物理架构，并为以后的架构升级做准备。说到这里，想到前百度架构师雷鸣说过的一句话，当你的会员数达到目前的5倍或10倍的时候，架构就要升级。 </blockquote><p>在实质性的研发过程中，需要注意的是平台网站研发的模式和传统IT项目研发的不同，以前是开发过程中要和客户、需求人员等打交道，而现在关注的是产品设计。对于平台网站研发项目的管理，欧拉推荐使用敏捷开发方法，通过设立短的发布周期进行迭代开发，并使用JIRA等成熟的项目管理系统进行管理等。对于团队研发需要注意的地方，欧拉总结如下：</p><ul><li>合适的开发工具； </li><li>如何控制代码质量； </li><li>（根据）需要引入新框架； </li><li>知识总结和培训。 </li></ul><p>对网站研发过程中的架构优化、存储和搜索等关键点，欧拉也分享了自己的经验，比如对于网站速度慢，而却又不知如何下手的问题，欧拉提出的解决方案是：</p><blockquote>我的经验是从数据开始，从最外围开始画圈，找到源头。先从外围开始收集日志，比如access_log访问日志或sql_log数据库操作日志，找出访问最多的10条日志和执行时间最长的10条日志，然后根据日志去反查到底是什么引起的操作，然后一条条的解决。如果解决不了，那么就考虑重构。 </blockquote><p>在文章的最后，欧拉来分享了一些他认为有价值的资料，比如<a href="http://www.tech-q.cn/thread-1216-1-1.html" target="_blank"><span style="color: #0b59b2">新型的大型BBS架构（Squid+Nginx）</span></a>、<a href="http://www.tech-q.cn/thread-1301-1-1.html" target="_blank"><span style="color: #0b59b2">Nginx图片服务器的架构方案</span></a>、<a href="http://www.tech-q.cn/thread-1330-1-1.html" target="_blank"><span style="color: #0b59b2">校内相册发展过程及核心技术分析爆料</span></a>、<a href="http://www.tech-q.cn/thread-721-1-3.html" target="_blank"><span style="color: #0b59b2">架构设计贵在务实</span></a>、<a href="http://www.tech-q.cn/thread-857-1-2.html" target="_blank"><span style="color: #0b59b2">大型网站架构不得不考虑的10个问题</span></a>等。<br /><br />摘自：<a href="http://www.infoq.com/cn/news/2009/10/how-to-design-platform-websites"><a href="http://www.infoq.com/cn/news/2009/10/how-to-design-platform-websites" target="_blank">http://www.infoq.com/cn/news/2009/10/how-to-design-platform-websites</a></a></p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/web/" rel="tag">web</a> , <a href="http://www.gaobo.info/go.php/tags/platform/" rel="tag">platform</a> , <a href="http://www.gaobo.info/go.php/tags/website/" rel="tag">website</a> , <a href="http://www.gaobo.info/go.php/tags/architecture/" rel="tag">architecture</a> , <a href="http://www.gaobo.info/go.php/tags/design/" rel="tag">design</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25B9%25B3%25E5%258F%25B0/" rel="tag">平台</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BD%2591%25E7%25AB%2599/" rel="tag">网站</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259E%25B6%25E6%259E%2584/" rel="tag">架构</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AE%25BE%25E8%25AE%25A1/" rel="tag">设计</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/668.htm</link>
<title><![CDATA[“F”家族口语禁忌语之完美诠释]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sun, 25 Oct 2009 15:42:48 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/668.htm</guid> 
<description>
<![CDATA[ 
	<p>&ldquo;FUCK&rdquo;，这个英语中最万能最神奇的单词，光是凭这四个字母所蕴涵的力度，就足够表达各种情绪，它可以涉及到生活的方方面面，将你的想法表达得淋漓尽致：没有任何单词能有如此神通广大。<br />当今英语中最趣味横生色彩纷呈的词当属&ldquo;Fuck&rdquo;了。这个词魔力十足，仅仅是听上去，就足够描述爱恨情仇喜怒哀乐了。</p><p>从语法范畴上来讲，&ldquo;FUCK&rdquo;使用灵活，可以用作多种形态。它既可以被用作及物动词（Mary fucked John.玛丽上了约翰）又可以被用作不及物动词（John was fucked by Mary.约翰被玛丽上了）。它可以用作行为动词(John really gives a fuck.约翰对这事儿真他妈的上心), 被动式动词(Mary really doesn't give a fuck.玛丽根本就不在乎。)。用作副词（Mary is fucking interested in John.玛丽简直被约翰迷疯了），或者做名词（Mary is a terrific fuck.玛丽真他妈的撩人）。它还可以做形容词（Mary is fucking beautiful.玛丽太她娘的美了）或者感叹词（Fuck! I'm late for my date with Mary靠！跟玛丽约会我又迟到了。）它甚至可以用作连词（John is ugly, fuck, he's also stupid.约翰长的丑还他妈的那么蠢）。如你所见，很少有单词像&ldquo;Fuck&rdquo;这么神通广大。<br />除了语法的灵活性多样性，这个带有浓厚性色彩的单词还可以用来描述许多其他情形。</p><p>1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 惊讶&mdash;你丫在这儿干吗呢？（&ldquo;What the fuck are you doing here?&rdquo;）<br />2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 欺诈&mdash;我他妈的被卖车的给骗了！（ &ldquo;I got fucked by the car dealer.&rdquo; ）<br />3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 辞职&mdash;去他的吧。（&ldquo;Oh, fuck it!&rdquo; ）<br />4）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 麻烦&mdash;这回我完蛋了。（ &ldquo;I guess I'm fucked now.&rdquo; ）<br />5）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 挑衅&mdash;CAO！（&ldquo;FUCK YOU!&rdquo; ）<br />6）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 厌恶&mdash;我靠！（&ldquo;Fuck me.&rdquo; ）<br />7）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 困惑&mdash;这他妈的到底&hellip;?（ &ldquo;What the fuck...?&rdquo; ）<br />8）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 困难&mdash;我真不明白这倒霉生意！（ &ldquo;I don't understand this fucking business!&rdquo; ）<br />9）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绝望&mdash;又他妈的&hellip;..（ &ldquo;Fucked again....&rdquo; ）<br />10）&nbsp;&nbsp;&nbsp;&nbsp; 开心&mdash;我他妈的太高兴了。（ &ldquo;I fucking couldn't be happier.&rdquo; ）<br />11）&nbsp;&nbsp;&nbsp;&nbsp; 沮丧&mdash;这他娘的到底怎么回事？（&ldquo;What the fuck is going on here?&rdquo; ）<br />12）&nbsp;&nbsp;&nbsp;&nbsp; 迷路&mdash;我们他妈的到底在哪儿呢？（ &ldquo;Where the fuck are we?&rdquo; ）<br />13）&nbsp;&nbsp;&nbsp;&nbsp; 怀疑&mdash;真他妈的难以置信。（&ldquo;UN-FUCKING-BELIEVABLE!&rdquo; ）<br />14）&nbsp;&nbsp;&nbsp;&nbsp; 报复&mdash;小心我揍死你！（ &ldquo;Up your fucking ass!&rdquo; ）<br />15）&nbsp;&nbsp;&nbsp;&nbsp; 拒绝&mdash;我他妈的才不干呢。（ &ldquo;I didn't fucking do it.&rdquo; ）<br />16）&nbsp;&nbsp;&nbsp;&nbsp; 茫然&mdash;我他妈的什么都知道！（&ldquo;I know fuck-all about it.&rdquo; ）<br />17）&nbsp;&nbsp;&nbsp;&nbsp; 冷漠&mdash;到底是他妈的谁搞成这样的？（ &ldquo;Who really gives a fuck, anyhow?&rdquo; ）<br />18）&nbsp;&nbsp;&nbsp;&nbsp; 问候&mdash;你他妈的最近怎么样啊？（&ldquo;How the fuck are ya?&rdquo; ）<br />19）&nbsp;&nbsp;&nbsp;&nbsp; 疑惑&mdash;你他妈的到底谁啊？（ &ldquo;Who the fuck are you?&rdquo; ）<br />20）&nbsp;&nbsp;&nbsp;&nbsp; 惊恐&mdash;我们快点儿离开这倒霉地方吧。（&ldquo;Let's get the fuck out of here.&rdquo; ）<br />21）&nbsp;&nbsp;&nbsp;&nbsp; 方位&mdash;滚一边去！（ &ldquo;Fuck off.&rdquo; ）<br />22）&nbsp;&nbsp;&nbsp;&nbsp; 敬畏&mdash;你他妈的到底是怎么做到的？（ &ldquo;How the fuck did you do that?&rdquo; ）</p><p>它可以做来描述器官&mdash;&ldquo;他就是一混蛋。&rdquo;（&ldquo;He's a fucking asshole.&rdquo; ）可以用在<br />时间中&mdash;&ldquo;都他妈的5点半了。&rdquo;（&ldquo;It's five fucking thirty.&rdquo;）<br />也可以用于职场&mdash;&ldquo;这倒霉活儿我到底要怎么干啊？&rdquo;（ &ldquo;How did I wind up with this fucking job?&rdquo; ）可以家事&mdash;&ldquo;个王八羔子&rdquo;（ &ldquo;Motherfucker.&rdquo; ），也可以国<br />事&mdash;&ldquo;克林顿去死吧！&rdquo;（ &ldquo;Fuck Clinton!&rdquo; ）<br />历史上，众多名人也对它爱不释口：<br />那到底是他们的什么玩意儿？（&ldquo;What the fuck was that?&rdquo; ）-广岛市长<br />这些死印度人是什么哪里来的？（&ldquo;Where did all these fucking Indians come from?&rdquo; ）&mdash;卡斯特将军<br />这他妈的不是真枪吧，哈？（&ldquo;That's not a real fucking gun, is it?&rdquo;）&mdash;约翰列侬<br />他妈的谁能查出真相？（&ldquo;Who's gonna fucking find out?&rdquo; )&mdash;理查德尼克松<br />为什么那个倒霉苹果打到我了？(&ldquo;Why the fuck did that apple hit me?&rdquo; )&mdash;艾萨克&middot;牛顿<br />靠，脑袋掉了碗大个疤！(&ldquo;Heads are going to fucking roll.&rdquo;)&mdash;玛丽安托瓦内特<br />我真该用那张倒霉地图。(&ldquo;I could have used a fucking map.&rdquo;)&mdash;尤利西斯<br />这些水都他娘的从哪里来的？(&ldquo;Where the fuck is all this water coming from?&rdquo; )<br />&mdash;泰坦尼克号船长<br />有没有哪个白痴能明白的？(&ldquo;Any fucking idiot could understand that.&rdquo; )&mdash;艾伯特爱因斯坦<br />这简直太他妈的像她了！(&ldquo;It DOES SO fucking look like her!&rdquo; )&mdash;毕加索<br />行了，我明白了&hellip;他奶奶的我们得筑道高墙来防御他们。(&ldquo;Okay, I know... we'll build this BIG fucking wall to keep them out.&rdquo;)&mdash;秦始皇<br />我简直不相信那是我说的。(&ldquo;I can't believe I just fucking said that.&rdquo; )&mdash;帕特里克亨利<br />小人都他妈的不得好死！(&ldquo;Fucking backstabbers!&rdquo; )&mdash;凯撒大帝<br />你想要天花板上的东西？(&ldquo;You want what on the fucking ceiling?&rdquo;) &mdash;米开朗基罗<br />吹箫而已，没他妈的干别的。（&ldquo;Fellatio is not fucking!&rdquo;） -- 比尔克林顿<br />送皮萨的死哪儿去了？（&ldquo;Where is that fucking pizza guy?&rdquo;）&mdash;猫王<br />为什么？因为就他妈的在那儿（&ldquo;Why? Because its fucking there!&rdquo; ）&mdash;艾德蒙&middot;希拉里<br />我觉得不可能下雨。（&ldquo;I don't suppose its gonna fucking rain?&rdquo; ）&mdash;圣女贞德<br />我的屁股都他妈的被扎烂了。（&ldquo;Scattered fucking showers my ass.&rdquo; ）&mdash;诺亚<br />这次游行就像我脑袋上那个倒霉的枪眼儿一样重要。（&ldquo;I need this parade like I need a fucking hole in my head.&rdquo; ）&mdash;约翰肯尼迪<br />我他妈的到底怎么才能上天堂？（&ldquo;What are the fucking chances I'm going to heaven?&rdquo; ）&mdash;阿道夫希特勒<br />喂，你们的头巾都他妈的哪儿去了？（&ldquo;Hey, where the fuck are your turbans?&rdquo; ）&mdash;哥伦布对&ldquo;印第安人&rdquo;说</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/fuck/" rel="tag">fuck</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258F%25A3%25E8%25AF%25AD/" rel="tag">口语</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25A6%2581%25E5%25BF%258C/" rel="tag">禁忌</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2590%25AB%25E4%25B9%2589/" rel="tag">含义</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/667.htm</link>
<title><![CDATA[为CentOS客户系统安装VMWare Tools]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Tue, 20 Oct 2009 02:53:03 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/667.htm</guid> 
<description>
<![CDATA[ 
	<p>1、Mount ISO，这一步可以直接在VMWare的菜单中操作<br />2、执行以下命令：<br />#cp *.tar.gz /tmp<br />#rpm &ndash;ivh *.rpm<br />#cd /tmp <br />#tar &ndash;zxvf *.tar.gz<br />#cd vmware-tools-distrib<br />#ls<br />#./vmware-install.pl<br />3、安装过程中可能会即时编译一些库文件，需要用到系统自带的一些库文件，所以在安装系统的时候要选上编译器和库文件<br />4、安装完成后最好shutdown -r now重启一次，以便使设置生效<br /><br />顺利的话，只要到「/mnt/hgfs」文件夹，就可以看到刚刚共享的文件夹了<br />安装完vmware以后有以下几点好处：<br />1)、鼠标可以自由在虚拟机与主机之间切换了，没有安装vmware tools的时候需要用ctrl+Alt、Ctrl+G来切换。<br />2)、虚拟机与主机的剪贴板可以通讯了，可以在虚拟机和主机之间自由复制、粘贴文本。<br />上面两点的详细设置可以在vmware的菜单edit-preferences里进行设置。<br />3)、可以设置虚拟机与主机之间的时间同步：在linux中运行vmware-toolbox，在弹出窗口把Options中的time synchronization....钩选上即可。<br /><br />如果安装RPM包报错，直接解压tar.gz包，运行pl文件。<br />如果重启后报X-WINDOWS出错，参考网上设置<br />进入/etc/X11/，用文本打开xorg.conf，加上以下几段：<br /><br />Section &quot;Monitor&quot;<br />Identifier &quot;vmware&quot;<br />EndSection<br />Section &quot;InputDevice&quot;<br />Identifier &quot;Mouse0&quot;<br />Driver &quot;vmmouse&quot;<br />Option &quot;Protocol&quot; &quot;Auto&quot;<br />Option &quot;Device&quot; &quot;/dev/input/mouse0&quot;<br />EndSection<br />然后找到 含有&quot;ServerLayout&quot; 的section, 在Section跟EndSection之间加上以下一行。<br />InputDevice &quot;Mouse0&quot; &quot;CorePointer&quot;</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/tools/" rel="tag">tools</a> , <a href="http://www.gaobo.info/go.php/tags/centos/" rel="tag">centos</a> , <a href="http://www.gaobo.info/go.php/tags/linux/" rel="tag">linux</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25B3%25BB%25E7%25BB%259F/" rel="tag">系统</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AE%2589%25E8%25A3%2585/" rel="tag">安装</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AE%25BE%25E7%25BD%25AE/" rel="tag">设置</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2599%259A%25E6%258B%259F%25E6%259C%25BA/" rel="tag">虚拟机</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/666.htm</link>
<title><![CDATA[腾讯的产品管理之道]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sat, 17 Oct 2009 13:43:06 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/666.htm</guid> 
<description>
<![CDATA[ 
	1、设置一个质量监控小组，由经验非常丰富的高Level的产品人员构成，赋予他们很大的权力，去监控和规范所有的产品项目。并且用KPI来制约产品项目服从这些规范。为了不搞教条主义，很多规范都是在立项之初，由项目经理和这个小组共同确认的，未必是硬性指派，一经确认就受到严格监控。确保好的规范不流于空喊口号。<br /><br />2、每个产品都设置公开的反馈论坛，突出外部入口，积极征询用户意见，并以内部轮班方式回复&ldquo;每一条&rdquo;有价值的反馈，要求以&ldquo;人对人，面对面&rdquo;的沟通态度来进行解答，禁止机械问答。公司高层（包括小马哥）不定期巡查每一个产品论坛，一旦发现有不认真回复用户的情况，立即予以训诫。确保产品人员与用户长期保持近距离接触。<br /><br />3、每个产品都设置内部的交流平台，分为两部分，一块类似留言板，由产品主管发布项目的进度、动态；另一块是论坛，向公司内部所有人开放，接纳反馈。在腾讯内部已经形成了非常活跃的氛围，甚至以该平台人气高涨为荣（至少你主管会喜欢这个），利用这个平台跨项目提意见，或是项目组内部交流思维碎片都很常见，达到了群策群力，内部监督的效果。<br /><br />4、设置产品架构师这样一个职位，由少数几个技术精英，负责所有项目的系统架构搭建，只搭架构，确保每个项目的底层合理性。<br /><br />5、执行项目总结制度，在每个版本上线后，由相应的策划-开发-测试人员开一个会，每个人都总结在这个版本过程里，有什么心得，有什么失误，可以怎么改善，尤其注意改进三方人员的配合过程。用制度的方式来强制反省，强制跨职能沟通。几个版本下来，项目效率就会有明显的提高。<br /><br />6、执行灰度发布政策非常之彻底，一个版本会经过若干级的内部测试，再向外部用户逐步放量升级，不断修正问题之后，最后进行大规模发布。确保提前发现问题，受影响的用户面尽可能小。与此同时，腾讯异常活跃的内部交流氛围，也能让产品在内部测试时得到较多专业反馈。<br /><br />7、拥有背靠客户端，强大的数据挖掘功能，具体描述起来比较复杂，总之非常强大，数据细致到令人吃惊的地步。数据挖掘部门的地位也是相当高的。我以前说过&ldquo;统计数据太单薄无法推导出可靠结果&rdquo;这样的话，但在腾讯的数据挖掘机能面前，这句话恐怕要改口。<br /><br />8、设置对新人和新项目的风险管理机制，比如3个老程序员带1个新程序员，将技术管理和具体开发的工作彻底分离，每周进行代码走读，对新产品采取格外严格的测试安排等等，使得缺乏经验带来的技术损害被降至最低。<br /><br />腾讯从公司层面，从最高领导人的层面，身体力行地把产品管理的专业准则给贯彻下去，用多种监控手段来避免其放空炮，令产品管理制度化，体系化，好的经验在内部流通开来，成为一种积极向上的约束力，带来整个大产品团队的合力，而不是任由项目经理各自摸爬滚打。马化腾带着一大批产品高管自上而下，持之以恒地推动产品本位的管理体制规范化，并不断地创新和优化这套体制，使得整个公司上上下下融入了&ldquo;产品的基因&rdquo;，最终成就了&ldquo;产品的腾讯&rdquo;。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/tencent/" rel="tag">tencent</a> , <a href="http://www.gaobo.info/go.php/tags/qq/" rel="tag">qq</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2585%25BE%25E8%25AE%25AF/" rel="tag">腾讯</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25BA%25A7%25E5%2593%2581/" rel="tag">产品</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">管理</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2581%2593/" rel="tag">道</a> , <a href="http://www.gaobo.info/go.php/tags/product/" rel="tag">product</a> , <a href="http://www.gaobo.info/go.php/tags/manage/" rel="tag">manage</a> , <a href="http://www.gaobo.info/go.php/tags/tao/" rel="tag">tao</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/665.htm</link>
<title><![CDATA[整合TFS2008和TFS2008SP1安装包]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Sat, 17 Oct 2009 09:17:08 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/665.htm</guid> 
<description>
<![CDATA[ 
	因为SQL SERVER 2008的全文搜索相比以前的版本做了改动，目前版本的TFS 2008与SQL SERVER 2008并不兼容。在网上找了许久，终于有了答案<br /><ol><li>拷贝TFS光盘文件到本地文件夹下 </li><li>下载TFS SP1并解压 </li><li>在cmd中执行如下命令行，将TFS和SP1合并为一个安装文件<br />msiexec /a &quot;AT&quot;vs_setup.msi /p &quot; TFS90sp1-KB949786.msp TARGETDIR=&lt;自定义文件夹&gt; </li><li>打开文件夹，运行setup.exe </li></ol><p>因为SP1中有针对SQL SERVER 2008的补丁，TFS可以正常安装了。</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/tfs/" rel="tag">tfs</a> , <a href="http://www.gaobo.info/go.php/tags/team/" rel="tag">team</a> , <a href="http://www.gaobo.info/go.php/tags/foundation/" rel="tag">foundation</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/sql/" rel="tag">sql</a> , <a href="http://www.gaobo.info/go.php/tags/sp1/" rel="tag">sp1</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2595%25B4%25E5%2590%2588/" rel="tag">整合</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AE%2589%25E8%25A3%2585/" rel="tag">安装</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/664.htm</link>
<title><![CDATA[Entity Framework中出现已有打开的与此命令相关联的 DataReader，必须首先将它关闭。的解决方案]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Tue, 13 Oct 2009 07:02:49 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/664.htm</guid> 
<description>
<![CDATA[ 
	解决方案有两种：<br />1、数据库为SQL Server 2005版本时，可以在web.config数据库链接串中加入<span>MultipleActiveResultSets=true。<br /></span><span>2、进行重复操作之前，将数据查询结果放入内存中，再进行使用。<br /><br />参考：<br /><a href="http://www.cnblogs.com/china0zzl/archive/2009/08/06/1540025.html"><a href="http://www.cnblogs.com/china0zzl/archive/2009/08/06/1540025.html" target="_blank">http://www.cnblogs.com/china0zzl/archive/2009/08/06/1540025.html</a></a><br /><a href="http://www.netknowledgenow.com/blogs/onmaterialize/archive/2006/09/20/Fixing-the-_2200_There-is-already-an-open-DataReader-associated-with-this-Command-which-must-be-closed-first_2E002200_-exception-in-Entity-Framework.aspx"><a href="http://www.netknowledgenow.com/blogs/onmaterialize/archive/2006/09/20/Fixing-the-_2200_There-is-already-an-open-DataReader-associated-with-this-Command-which-must-be-closed-first_2E002200_-exception-in-Entity-Framework.aspx" target="_blank">http://www.netknowledgenow.com/blogs/onmaterialize/archive/2006/09/20/Fixing-the-_2200_There-is-already-an-open-DataReader-associated-with-this-Command-which-must-be-closed-first_2E002200_-exception-in-Entity-Framework.aspx</a></a></span><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/asp/" rel="tag">asp</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/mvc/" rel="tag">mvc</a> , <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/datareader/" rel="tag">datareader</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/663.htm</link>
<title><![CDATA[在IIS6中运行ASP.Net MVC1的程序]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Tue, 13 Oct 2009 06:46:30 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/663.htm</guid> 
<description>
<![CDATA[ 
	发布以后要修改该站点的一个设置：<br />1、&ldquo;网站属性&rdquo;&rarr;&ldquo;主目录&rdquo;&rarr;&ldquo;配置&rdquo;<br />2、单击&ldquo;插入&rdquo;，把.net的isapi插入通配符应用程序映射里。<br />3、选择isapi地址：C:&#92;Windows&#92;Microsoft.NET&#92;Framework&#92;v2.0.50727&#92;aspnet_isapi.dll<br /><strong>注意: 这里的&ldquo;确认文件是否存在&rdquo;一定不要勾选，否则设置无法生效</strong><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/asp/" rel="tag">asp</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/mvc/" rel="tag">mvc</a> , <a href="http://www.gaobo.info/go.php/tags/iis/" rel="tag">iis</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258F%2591%25E5%25B8%2583/" rel="tag">发布</a> , <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2585%258D%25E7%25BD%25AE/" rel="tag">配置</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/662.htm</link>
<title><![CDATA[Windows2003里查看应用程序池对应的pid]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Mon, 12 Oct 2009 07:23:40 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/662.htm</guid> 
<description>
<![CDATA[ 
	iisapp -a pid<br />可以查出对应的域名<br /><br />反之 iisapp -p domain 查pid的<br />Iisapp.vbs：IIS 应用程序查询脚本报告为特定的应用程序池提供服务且当前正在运行 w3pwp.exe 进程的进程标识符 (PID)。<br /><br />语法<br />iisapp [a/ AppPoolName &#124; /p AppPoolID]<br /><br />参数<br />/a AppPoolName<br />指定特定应用程序池的名称。（可选项）<br /><br />/p AppPoolID<br />按 ID 号指定应用程序池。（可选项）<br /><br />注释<br />&bull; 如果未指定应用程序池名或 ID，则 iisapp 列出所有运行应用程序。<br />&bull; 仅当使用 /s 时，才可使用 /u 和 /p 命令行选项。必须同时使用 /p 和 /u 才能提供用户密码。<br />&bull; Iisext.vbs 执行 IIS 管理器中可用的相同操作。可使用任何一种工具管理 IIS 网站。<br />&bull; 发出命令的计算机必须正在运行 Windows XP 或 Windows Server 2003 操作系统。用户必须是命令所影响的计算机上的 Administrators 组成员。<br />&bull; 命令所影响的计算机必须是运行带有 Internet 信息服务 (IIS) 6.0 的 Windows Server 2003<br /><br />1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid<br />2、在命令提示符下运行iisapp -a。注意，第一次运行，会提示没有js支持，点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池<br />3、到iis中察看该应用程序池对应的网站<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/2003/" rel="tag">2003</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/iis/" rel="tag">iis</a> , <a href="http://www.gaobo.info/go.php/tags/pid/" rel="tag">pid</a> , <a href="http://www.gaobo.info/go.php/tags/w3wp/" rel="tag">w3wp</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25BF%259B%25E7%25A8%258B/" rel="tag">进程</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AB%2599%25E7%2582%25B9/" rel="tag">站点</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BD%2591%25E7%25AB%2599/" rel="tag">网站</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25BA%2594%25E7%2594%25A8%25E7%25A8%258B%25E5%25BA%258F%25E6%25B1%25A0/" rel="tag">应用程序池</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/661.htm</link>
<title><![CDATA[FreeRapid无法启动的解决]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Wed, 07 Oct 2009 04:12:35 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/661.htm</guid> 
<description>
<![CDATA[ 
	FreeRapid是个好东西，能队列下载Rapidshare、Hotfile&hellip;&hellip;等一堆文件共享站点上的文件，自动下载，无需干预。<br />目前最新的版本是0.83Beta，不过我觉得用0.82稳定版很好很合适。<br />但是在第二次启动的时候发现无法启动，打开Windows进程管理，发现有两个frd.exe进程，一个是Downloader，一个是Java SE Environment。等了很久也没有反应，觉得不对劲，上网搜了下，没找到什么有价值的东西，于是决定自己解决。<br />发现<a href="http://pinkone.orgfree.com/?p=5" target="_blank">有网友说到这个可能</a>，但是我想了下，这么做对于本机还是可以试一下的，但是我现在是远程桌面，断开网络连接，不就连不上了？于是我没有尝试他的做法。<br />联想到我装的是Kaspersky Internet Security 2010（KIS 9，卡巴2010），我想是不是这家伙把FreeRapid给拦下来了，然后按以下步骤操作：<br />1、打开设置&mdash;&mdash;保护&mdash;&mdash;防火墙&mdash;&mdash;设置，&ldquo;过滤规则&rdquo;选项卡，找到FreeRapid，点开左侧的加号，把所有的网络活动都设置为&ldquo;允许&rdquo;<br />2、打开卡巴主界面，安全中心，&ldquo;应用程序活动&rdquo;，类别选&ldquo;所有程序&rdquo;，找到FreeRapid，设置为&ldquo;受信任组&rdquo;<br />3、如果FreeRapid正在运行，关闭它。启动FreeRapid。搞定！<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/free/" rel="tag">free</a> , <a href="http://www.gaobo.info/go.php/tags/rapid/" rel="tag">rapid</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2590%25AF%25E5%258A%25A8/" rel="tag">启动</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25A7%25A3%25E5%2586%25B3/" rel="tag">解决</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258D%25A1%25E5%25B7%25B4/" rel="tag">卡巴</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258D%25A1%25E5%25B7%25B4%25E6%2596%25AF%25E5%259F%25BA/" rel="tag">卡巴斯基</a> , <a href="http://www.gaobo.info/go.php/tags/2010/" rel="tag">2010</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/660.htm</link>
<title><![CDATA[C#(ASP.Net)获取当前路径的方法集合]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Tue, 06 Oct 2009 10:59:35 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/660.htm</guid> 
<description>
<![CDATA[ 
	//获取当前进程的完整路径，包含文件名(进程名)。<br/>string str = this.GetType().Assembly.Location;<br/>result: X:&#92;xxx&#92;xxx&#92;xxx.exe (.exe文件所在的目录+.exe文件名)<br/><br/>//获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径，包含文件名(进程名)。<br/>string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;<br/>result: X:&#92;xxx&#92;xxx&#92;xxx.exe (.exe文件所在的目录+.exe文件名)<br/><br/>//获取和设置当前目录（即该进程从中启动的目录）的完全限定路径。<br/>string str = System.Environment.CurrentDirectory;<br/>result: X:&#92;xxx&#92;xxx (.exe文件所在的目录)<br/><br/>//获取当前 Thread 的当前应用程序域的基目录，它由程序集冲突解决程序用来探测程序集。<br/>string str = System.AppDomain.CurrentDomain.BaseDirectory;<br/>result: X:&#92;xxx&#92;xxx&#92; (.exe文件所在的目录+"&#92;")<br/><br/>//获取和设置包含该应用程序的目录的名称。<br/>string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;<br/>result: X:&#92;xxx&#92;xxx&#92; (.exe文件所在的目录+"&#92;")<br/><br/>//获取启动了应用程序的可执行文件的路径，不包括可执行文件的名称。<br/>string str = System.Windows.Forms.Application.StartupPath;<br/>result: X:&#92;xxx&#92;xxx (.exe文件所在的目录)<br/><br/>//获取启动了应用程序的可执行文件的路径，包括可执行文件的名称。<br/>string str = System.Windows.Forms.Application.ExecutablePath;<br/>result: X:&#92;xxx&#92;xxx&#92;xxx.exe (.exe文件所在的目录+.exe文件名)<br/><br/>//获取应用程序的当前工作目录(不可靠)。<br/>string str = System.IO.Directory.GetCurrentDirectory();<br/>result: X:&#92;xxx&#92;xxx (.exe文件所在的目录)<br/>========================================================<br/>.NET中三种获取当前路径的代码<br/><br/>//Web编程 <br/>HttpContext.Current.Server.MapPath("FileName") <br/>System.Web.HttpContext.Current.Request.Path <br/><br/>//Windows编程 <br/>System.Environment.CurrentDirectory <br/><br/>//Mobile编程 <br/>Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);<br/><br/>A.指定 客户端元素 资源的路径 <br/>B.指定 服务器控件 资源的路径 <br/>C.确定当前网站的物理文件路径 <br/><br/>============================ <br/><br/>使用网站中的资源时，通常必须指定资源的路径。 <br/>例如，您可以使用 URL 路径引用页面中的图像文件或网站中其他位置处的页面的 URL。 <br/>同样，Web 应用程序中的代码可以使用基于服务器的文件的物理文件路径对文件进行读写操作。 <br/>ASP.NET 提供用于引用资源并确定应用程序中的页面或其他资源的路径的方法。 <br/><br/><br/>A.指定 客户端元素 资源的路径 <br/>------------------------------ <br/><br/>许多情况下，页面中的元素或控件必须引用外部资源，如文件。 <br/>ASP.NET 允许您通过各种方法引用外部资源。 <br/>所选方法取决于使用客户端元素还是服务器控件。 <br/><br/>元素（不是页面中的服务器控件，而是客户端元素）以原样传递给浏览器。 <br/>因此，从客户端元素中引用资源时，应根据 HTML 中 URL 的标准规则构造路径。 <br/>可以使用完全限定（绝对）URL 路径，也可以使用各种类型的相对路径。 <br/>例如，如果页面包含一个 img 标记，则可以使用以下路径之一设置其 src 属性： <br/><br/>绝对 URL 路径： <br/>阅读代码编辑代码运行效果复制HTML代码保存代码<img src="http://www.xxx.com/MyApplication/Images/SampleImage.jpg" /><img src="http://www.xxx.com/MyApplication/Images/SampleImage.jpg" /><br/>如果引用其他位置（如外部网站）中的资源，则绝对 URL 路径非常有用。 <br/><br/><br/>站点根目录相对路径， <br/>根据站点（不是应用程序）根目录进行解析。 <br/>此示例路径假定 Images 文件夹存在于网站根目录下： <br/>阅读代码编辑代码运行效果复制HTML代码保存代码<img src="/Images/SampleImage.jpg" /><img src="/Images/SampleImage.jpg" /><br/>如果您的网站为 <a href="http://www.xxx.com" target="_blank">http://www.xxx.com</a>，则路径将解析为以下形式： <br/><a href="http://www.xxx.com/Images/SampleImage.jpg" target="_blank">http://www.xxx.com/Images/SampleImage.jpg</a> <br/>如果将跨应用程序的资源（如图像或客户端脚本文件） <br/>保留在网站根目录下的文件夹中，则站点根目录相对路径非常有用。 <br/><br/><br/>根据当前页面路径解析的相对路径： <br/>阅读代码编辑代码运行效果复制HTML代码保存代码<img src="Images/SampleImage.jpg" /><img src="Images/SampleImage.jpg" /><br/><br/>解析为当前页面路径对等的相对路径。 <br/>阅读代码编辑代码运行效果复制HTML代码保存代码<img src="../Images/SampleImage.jpg" /><img src="../Images/SampleImage.jpg" /><br/><br/>注意 <br/>默认情况下，浏览器使用当前页面的 URL 作为基准解析相对路径。 <br/>但是，您可以在页面中包含 HTML base 元素，以指定替代基路径。 <br/><br/><br/>B.指定 服务器控件 资源的路径 <br/>----------------------------- <br/><br/>在引用资源的 ASP.NET 服务器控件中， <br/>可以使用绝对路径或相对路径，这一点与客户端元素一样。 <br/>如果使用相对路径，则相对于页面、用户控件或包含该控件的主题的路径进行解析。 <br/>例如，假设 Controls 文件夹中包含一个用户控件。 <br/>该用户控件包含一个 Image Web 服务器控件， <br/>该服务器控件的 ImageUrl 属性设置为以下路径： <br/>Images/SampleImage.jpg <br/>该用户控件运行时，路径将解析为以下形式： <br/>/Controls/Images/SampleImage.jpg <br/>无论承载用户控件的页面位置如何，都是如此。 <br/><br/><br/>服务器控件中的绝对和相对路径引用具有以下缺点： <br/><br/>绝对路径在应用程序之间是不可移植的。 <br/>如果移动绝对路径指向的应用程序，则链接将会中断。 <br/>如果将资源或页面移动到不同的文件夹， <br/>可能很难维护采用客户端元素样式的相对路径。 <br/><br/><br/>为克服这些缺点， <br/>ASP.NET 启用了 Web 应用程序根目录运算符 (~)， <br/>在服务器控件中指定路径时，可以使用该运算符。 <br/>ASP.NET 会将 ~ 运算符解析为当前应用程序的根目录。 <br/>可以结合使用 ~ 运算符和文件夹来指定基于当前根目录的路径。 <br/><br/>下面的示例 <br/>演示使用 Image 服务器控件时用于指定图像的根目录相对路径的 ~ 运算符： <br/>复制ASPX代码保存代码<asp:image runat="server" id="Image1"<br/>ImageUrl="~/Images/SampleImage.jpg" /><asp:image runat="server" id="Image1"<br/>ImageUrl="~/Images/SampleImage.jpg" /><br/>在该示例中， <br/>图像文件将从 Web 应用程序根目录下的 Images 文件夹中直接读取， <br/>无论该页面位于网站的什么位置。 <br/><br/>注意 <br/>~ 运算符只能为服务器控件识别，并且位于服务器代码中。 <br/>不能将 ~ 运算符用于客户端元素。 <br/><br/>可以在服务器控件中的任何与路径有关的属性中使用 ~ 运算符。 <br/><br/>注意 <br/>在主控页中，资源的路径基于内容页的路径进行解析。 <br/><br/><br/>C.确定当前网站的物理文件路径 <br/>---------------------------- <br/>在应用程序中，您可能需要确定服务器上的文件或其他资源的路径。 <br/>例如，如果应用程序以编程方式对文本文件进行读写操作， <br/>则必须为用于读取和写入的方法提供该文件的完整物理路径。 <br/><br/>将物理文件路径（如 C:&#92;Website&#92;MyApplication） <br/>硬编码到应用程序中并不是很好的做法， <br/>因为如果移动或部署应用程序，则路径会发生更改。 <br/>但是， <br/>ASP.NET 为您提供了以编程方式获取应用程序中的任何物理文件路径的方法。 <br/>然后，您可以使用基文件路径创建所需资源的完整路径。 <br/>用于确定文件路径的两种最常用的 ASP.NET 功能是 <br/>返回路径信息的 HttpRequest 对象的属性，以及 MapPath 方法。 <br/><br/>注意 <br/>不应将物理文件路径发送到客户端， <br/>因为它们可能会被恶意用户用来获取有关您的应用程序的信息。 <br/><br/>根据请求属性确定路径 <br/>下表列出了 HttpRequest 对象的属性， <br/>这些属性帮助您确定应用程序中的资源的路径。 <br/>下面的示例假定使用以下 URL 来发出浏览器请求： <br/><a href="http://www.xxx.com/MyApplication/MyPages/Default.aspx" target="_blank">http://www.xxx.com/MyApplication/MyPages/Default.aspx</a> <br/>对于这些示例， <br/>术语“虚拟路径”是指跟在服务器标识符后面的请求 URL 的一部分， <br/>此时虚拟路径如下所示： <br/>/MyApplication/MyPages/Default.aspx <br/>此外，这些示例假定网站根目录的物理路径为以下形式： <br/>C:&#92;inetpub&#92;wwwroot&#92;MyApplication&#92; <br/>最后，这些示例假定物理路径包含一个名为 MyPages 的文件夹。 <br/><br/>则相关属性及其返回值如下： <br/>ApplicationPath <br/>获取当前应用程序的根目录路径， <br/>无论在该应用程序中的什么位置请求该路径。 <br/>对于此示例，该属性将返回以下内容： <br/>/ <br/><br/>CurrentExecutionFilePath <br/>获取当前请求的虚拟路径。 <br/>不同于 FilePath， <br/>差别在于如果请求已在服务器代码中被重定向， <br/>则 CurrentExecutionFilePath 就是正确的。 <br/>对于此示例，该属性将返回以下内容： <br/>/MyApplication/MyPages/Default.aspx <br/>如果作为对 Transfer 或 Execute 进行调用的结果， <br/>您获取正在运行的代码中的属性，则路径将反映该代码的位置。 <br/><br/>FilePath <br/>获取当前请求的虚拟路径。 <br/>对于此示例，该属性将返回以下内容： <br/>/MyApplication/MyPages/Default.aspx <br/>不同于 CurrentExecutionFilePath，FilePath 不反映服务器端转换。 <br/><br/>Path <br/>获取当前请求的虚拟路径。对于此示例，该属性将返回以下内容： <br/>/MyApplication/MyPages/default.aspx <br/><br/>PhysicalApplicationPath <br/>获取当前正在执行的应用程序的根目录的物理文件系统路径。 <br/>对于此示例，该属性将返回以下内容： <br/>C:&#92;inetpub&#92;wwwroot&#92; <br/><br/>PhysicalPath <br/>获取与请求的 URL 对应的物理文件系统路径。 <br/>对于此示例，该属性将返回以下内容： <br/>C:&#92;inetpub&#92;wwwroot&#92;MyApplication&#92;MyPages&#92;default.aspx <br/><br/>使用 MapPath 方法 <br/>MapPath 方法返回传递给该方法的虚拟路径的完整物理路径。 <br/>例如，以下代码返回网站根目录的文件路径： <br/>Visual Basic : <br/>复制VB.NET代码保存代码Dim rootPath As String = Server.MapPath("~")<br/>C# : <br/>复制C#代码保存代码String rootPath = Server.MapPath("~");<br/><br/>注意 <br/>传递给 MapPath 方法的路径必须为应用程序相对路径，而不是绝对路径。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/asp.net/" rel="tag">asp.net</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25B7%25AF%25E5%25BE%2584/" rel="tag">路径</a> , <a href="http://www.gaobo.info/go.php/tags/path/" rel="tag">path</a> , <a href="http://www.gaobo.info/go.php/tags/map/" rel="tag">map</a> , <a href="http://www.gaobo.info/go.php/tags/http/" rel="tag">http</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/659.htm</link>
<title><![CDATA[如何不用翻墙访问wordpress.com]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 06 Oct 2009 04:58:01 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/659.htm</guid> 
<description>
<![CDATA[ 
	方法：打开hosts文件，添加以下内容：<br />72.233.2.57 ***.wordpress.com<br />（***是要访问的二级域名名称）<br /><br />原理：很简单，<a href="http://www.wordpress.com/"><a href="http://www.wordpress.com" target="_blank">www.wordpress.com</a></a>可以访问，但是***.wordpress.com不能访问，明显是前端负载均衡设备的IP被Wall了<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/gfw/" rel="tag">gfw</a> , <a href="http://www.gaobo.info/go.php/tags/wordpress/" rel="tag">wordpress</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/658.htm</link>
<title><![CDATA[[转]ASP.NET比拼PHP，谁是速度之王？]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Wed, 30 Sep 2009 01:09:27 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/658.htm</guid> 
<description>
<![CDATA[ 
	新闻来源:IT168<br />刚刚在9月编程语言排行榜上取得历史性突破的PHP在Web开发领域最到的对手可能就是基于微软.NET技术的ASP.NET。近日，微软的Joe Stagner在博客上发表了一系列文章比较了PHP和ASP.NET性能方面的文章，引起了来自双方程序员的大量回应。Joe表示，他会将这样的测试持续下去，并寻求更为合适的方式，以获得对实际项目来说尽可能有参考价值的结论。 <p></p><div>&nbsp;</div>Joe在博客中称，一般来说，作性能测试的目的是要尝试证明一方比令一方要快。我受雇于微软，同时编写PHP和ASP.NET代码。我在.NET出现之前就在使用PHP，两个东西我都很喜欢。<br /><br />所以，我很难说出哪个更好。当我说PHP好话时，我的微软同事们会写信来批评我，而当我发表倾向于ASP.NET的言论时，我的PHP朋友们会说我是微软的托。<br /><br />我进行这个测试是因为每个人都对PHP的性能有自己的看法(Windows vs. Linux &amp; 5.2 vs. 5.3)，却没人能给出明确的数据。<br /><br />ASP.NET比拼PHP的测试环境如下：<br /><br />&nbsp;&nbsp;&nbsp; * 　　所有的测试都在同一台机器上运行(拥有4G内存和60G 7200转硬盘的Toshiba Tecra M5)。<br />&nbsp;&nbsp;&nbsp; * 　　Ubuntu 9和Windows Server 2008标准版分别安装于独立(但相同)的硬盘中。<br />&nbsp;&nbsp;&nbsp; * 　　Linux使用Apache2，Windows使用IIS 7作为各自的Web服务器。<br />&nbsp;&nbsp;&nbsp; * 　　双方的操作系统都进行了完整的patch或升级。<br />&nbsp;&nbsp;&nbsp; * 　　双方的系统和运行时都没有进行额外的性能增强。<br /><br />从实验结果上看，PHP在Linux和Windows的执行性能各有千秋：<br /><br />&nbsp;&nbsp;&nbsp; * 　　纯粹的语句执行在Windows上表现更好。<br />&nbsp;&nbsp;&nbsp; * 　　函数调用在Windows上更快。<br />&nbsp;&nbsp;&nbsp; * 　　对象的创建和访问，对于PHP 5.2来说在Linux上更快，但是对于PHP 5.3来说则是Windows更快。<br />&nbsp;&nbsp;&nbsp; * 　　类库调用在Linux上快得多(如在Ubuntu上进行加密要比Windows要快3到5倍)。<br /><br />Linux与Windows平台对比<br /><br />在Linux上访问文件性能略高于Windows，不过Windows上文件复制的性能要比Linux慢60%，可能是ACL高级安全的缘故。<br /><br />在Linux上访问MySQL要比Windows快不少，而且在Windows上运行PHP 5.3的情况则更为恶劣(不过从下面PostgreSQL的情况上来看，这应该是糟糕实现的缘故)。<br /><br />PostgreSQL在两个平台上的性能非常接近(1000个操作的差距在0.06秒之内)&mdash;&mdash;无论是PHP 5.3还是PHP 5.2，Windows上表现都略胜一筹。<br /><br />Windows上PHP 5.2访问MS SQL Server的性能稍逊于在Linux上访问MySQL(此时还没有面向PHP 5.3的SQL Server支持)。<br /><br />对于纯粹的PHP执行性能来说，Linux和Windows相差无几，这不会成为选择Linux或Windows作为部署平台的决定性因素。如果你在构建一个应用程序，那么PostgreSQL可能是更好的选择。因为它在两个平台上的表现都很优秀。<br /><br />如果你的应用程序必须使用MySQL，那么选择Windows就需要早些计划扩展性问题了(个人认为Sun不太可能为Windows优化MySQL的性能)。<br /><br />PHP的第一个版本的SQL Server驱动程序要比MySQL或PostpreSQL要慢一些，但这应该不会成为问题。第二个版本的驱动器正在开发之中，它会带来性能提升。<br /><br />在Joe看来，全面来看，PHP和IIS团队在执行性能上已经做的非常成功，接下来就需要各开源程序的团队(Drupal、WordPress、Joomla等等)为各平台进行性能优化了。<br /><br />不过，除了文件复制操作之外，ASP.NET在性能方面全面领先于PHP(无论部署在Linux还是Windows上面)：<br /><br />Linux上访问MySQL的性能稍稍优于Windows上访问SQL Server的性能(使用普通的数据类型和SELECT语句)。但是这里的差距几乎可以忽略不计。<br /><br />ASP.NET(C#)操作，如对象使用，类库调用等等，其性能都远高于PHP。对于这个测试结果，Joe补充道：<br /><br />我知道我的一些PHP朋友和Linux伙计们要跳出来驳斥我的测试和结果了。<br /><br />我一直在思考，这样的性能比较是否需要加入一些高级的优化选项。不过.NET方面也有例如多线程，异步请求，和各种缓存方式可以使用<br /><br />请注意&mdash;&mdash;我并没有说&ldquo;ASP.NET更快，所以你不应该使用PHP!&rdquo;，我使用认为，PHP过于简单导致对某些高级应用来说有些举步维艰，就像ASP.NET在项目早期会有学习方面的复杂性。<br /><br />对我来说，PHP最令人兴奋的地方不是它的语言/平台，而是成千上万聪明的PHP开发人员，以及各种优秀的项目(如Drupal、Joomla、WordPress、PHPBB、Nuke等等)。<br /><br />可以这么认为，PHP在Windows和Linux上的性能处于同一个水平上，我现在终于可以为Windows编写那些我盼望着许多年的PHP类库了。<br /><br />Joe还公开了测试代码。他表示，如果你对这个测试的结果有疑义，可以亲自进行这个实验，或是编写你自己的测试代码进行试验。<br /><br />文章发布之后，许多网友对这一测试结果发表了看法。Joe基本上逐一回复了其中的主要观点：<br /><br />&ldquo;我使用ASP.NET只是因为我喜欢Visual Studio IDE&rdquo;&mdash;&mdash;我个人认为Visual Studio是最有生产力的开发工具。但是，PHP的有不错的选择。我使用Zend Studio，PHPEd，Komodo，Delphi for PHP，这些都很不错。我讨厌Eclipse，不过Zend也在这方面为PHP开发做了不少扩展。<br /><br />应该比较ASP的性能&mdash;&mdash;不用了，谢谢。旧式的ASP与目前的PHP与ASP.NET差距太大了。做这种比较，似乎是在建议使用ASP开发新项目，我强烈不建议你这么做。<br /><br />32位与64位系统对比<br /><br />32位与64位系统之间的比较&mdash;&mdash;这些测试的目的并不是为了体现64位系统上的性能差距。今后的测试我会增加64位的场景。<br /><br />&ldquo;PHP丑陋至极&rdquo;&mdash;&mdash;哦，我不同意。旧式ASP要丑陋多了。你可以写出非常可怕而丑陋的PHP代码，也可以写出丑陋而可怕的C#或VB代码。同样，你也可以写出优雅的C++样式的PHP。这完全只和开发人员的技能有关。<br /><br />应该使用Windows上的Apache进行测试&mdash;&mdash;Apache是Linux上的服务器，不过我认为如果你在Windows上不使用IIS 7则会损失太多太多东西了。<br /><br />&ldquo;有办法在Win2K8中，在不损失安全性的前提下加快文件复制性能吗?&rdquo;&mdash;&mdash;似乎不行。我认为这涉及到Windows服务器上的ACL系统。我以后可能会测试通过数据流读取文件的性能，有些东西的性能可能会有所改善。不过，Web应用程序一般不会编程来复制大量文件。<br /><br />&ldquo;PHP一直是，也永远只是一个半专业性质的环境&rdquo;&mdash;&mdash;这种说法狗屁不通。PHP平台上有许多专业的，高质量的应用程序，也有很多我非常尊敬的开发人员。是否专业是开发人员的问题，不是PHP或ASP.NET的问题。<br /><br />&ldquo;我认为比较没有opcode缓存的PHP很不公平，.NET是编译执行的，而PHP需要每次都解释并&lsquo;编译&rsquo;页面&rdquo;&mdash;&mdash;我同意这个测试可能不够完整，但是我不认同这个逻辑。我测试PHP的方式，就和下载安装的方式一样。我的虚拟主机也没有安装op-code缓存。而事实上，ASP.NET自带这个特性也并不意味着测试是不公平的，这是因为PHP缺少这个特性&mdash;&mdash;不过这个要求很合理，我正在准备新的测试。<br /><br />&ldquo;说PHP不是一个&lsquo;专业的&rsquo;语言很没道理，因为几乎所有最大的站点都是用PHP构建的&rdquo;&mdash;&mdash;这种说法是没道理，不过说那些站点&ldquo;几乎都是&rdquo;用PHP构建的也是错误的。有些是，有些不是。<br /><br />如果你们看到这一数据之后对ASP.NET信心倍增我自然很高兴。如果我不认为.NET是开发Web应用程序来说是一种更好的选择&mdash;&mdash;至少不属于其它平台，那么我也不会在微软工作了。<br /><br />但是&hellip;&hellip;如果你因为这些数据而忽视PHP，也是错误且幼稚的行为。<br /><br />从纯技术角度来说，我认为.NET远比PHP强大，但这并不意味着PHP不够强大。在我看来，PHP的力量体现在众多的应用程序以及可用的框架。<br /><br />大约一周以后，Joe公开了第二次测试的结果。与前一个测试相比，第二个测试主要有以下两个改变：<br /><br />为Linux和Windows上安装了op-code缓存，并重新运行了大部分测试。<br /><br />由于一些依赖项的问题，PHP 5.3 + APC的测试平台变成了Debain 5操作系统。<br /><br />对于第二次测试及其结果，Joe解释到：<br /><br />从结果上看，Ubuntu和Debian上运行PHP的性能差距可以忽略不计。部分条目的性能有些细小的改进，有些则有25%的提高，但是总体来说其效果比我想象中要来得低。<br /><br />使用APC之后，一些条目的运行反而变慢了，不过我认为这只是机器所造成的误差。请注意，表格中显示的不是第一次的结果，都是经过两次刷新，确认是在缓存命中时得到的结果。<br /><br />我认为现在的测试非常公平。<br /><br />空的循环测试和空的函数执行非常重要，因为这反映了语言或平台的基础消耗。这是处页面传输等性能开销外的性能消耗，是一个重要的考虑方面。<br /><br />我的一些PHP朋友也认可这个测试的准确性，不过给出了非常有见解的补充：<br /><br />ASP.NET在性能上的领先不会对我有什么影响。PHP是我的最爱，我的应用程序已经足够快了。没错，ASP.NET在基础性能上是比较快，但是我的应用程序可以通过优秀的页面实现和JavaScript实践把这部分性能补回来。<br /><br />此外，根据上一次实验的结果，在Windows平台上运行PHP时，在MySQL和文件的访问上有一些性能问题，微软许多团队都向我获取了相关信息。希望这些数据都够转变为切实的改进。<br /><br />Joe表示，他将收集大家认为更公平，更有意义的测试场景。以下是他所计划的测试项目：<br /><br />&nbsp;&nbsp;&nbsp; * 　　实际页面测试：循环，寒暑调用和对象操作是一类测试，不过页面的整体呈现则是另一种有意义的测试。<br />&nbsp;&nbsp;&nbsp; * 　　负载测试：哪一个环境可以同时处理更大量的请求。<br />&nbsp;&nbsp;&nbsp; * 　　在负载测试中，哪一方的性能会下降地更快。<br />&nbsp;&nbsp;&nbsp; * 　　在各种情况下，64位平台的表现如何。<br /><br />国内也曾经进行过PHP在Linux和Windows平台上的性能测试。微软在WordCamp China 2009大会上公开了之前与康盛创想合作进行的性能评估结果：在Windows Server 2008 + IIS上运行PHP，从平均相应时间，每秒处理的请求数，以及数据吞吐量等多方便均优于Linux + Apache的托管方式<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/asp/" rel="tag">asp</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/fast/" rel="tag">fast</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2580%259F%25E5%25BA%25A6/" rel="tag">速度</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25AF%2594%25E8%25BE%2583/" rel="tag">比较</a> , <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/iis/" rel="tag">iis</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/657.htm</link>
<title><![CDATA[在Linq to Entities中实现模糊查询]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Fri, 25 Sep 2009 14:31:17 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/657.htm</guid> 
<description>
<![CDATA[ 
	在实际项目中遇到了RT的需求，查了下资料，可用的不多（除去使用StartsWith和EndsWith两个方法以外），主要方法有以下两个：<br/>1、使用SqlMethods.Like方法<br/><div class="code">using System.Data.Linq.SqlClient;<br/><br/>var query = from c in ctx.Customers<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where SqlMethods.Like(c.City, &quot;L_n%&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select c;</div><br/>这个方法据说可以，但是我没有用成功。<br/>2、使用String.IndexOf("C")>-1方式<br/><div class="code">where c.CustomerID.IndexOf(&quot;C&quot;)&gt;-1</div><br/>这个我试过了，可以。<br/><br/>PS：模糊查询的结果一般都是转化为LIKE语法，这一点和Contains语法不同（Linq to Entities不支持Contains方法），Contains是转化为IN语法。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/linq/" rel="tag">linq</a> , <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/entities/" rel="tag">entities</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25A8%25A1%25E7%25B3%258A/" rel="tag">模糊</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259F%25A5%25E8%25AF%25A2/" rel="tag">查询</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/656.htm</link>
<title><![CDATA[Oracle 10g for Windows XP/Vista/Server 2008的下载页面]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Sun, 20 Sep 2009 01:46:18 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/656.htm</guid> 
<description>
<![CDATA[ 
	找了很久才找到，Oracle官方站点的下载做的真不咋地，故意让人找不到下载？？<br /><br /><span class="topstoryhead">Oracle Database 10<em>g</em> Release 2 (10.2.0.1.0) </span><br /><span class="parahead2">Enterprise/Standard Edition for Microsoft Windows (32-bit)<br /><a href="http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201winsoft.html"><a href="http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201winsoft.html" target="_blank">http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201winsoft.html</a></a><br /><br /><span class="topstoryhead">Oracle Database 10<em>g</em> Release 2 (10.2.0.3/10.2.0.4) </span><br /><span class="parahead2">Enterprise/Standard Edition for Microsoft Windows Vista and Windows 2008<br /><a href="http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10203vista.html"><a href="http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10203vista.html" target="_blank">http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10203vista.html</a></a></span></span><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/oracle/" rel="tag">oracle</a> , <a href="http://www.gaobo.info/go.php/tags/client/" rel="tag">client</a> , <a href="http://www.gaobo.info/go.php/tags/db/" rel="tag">db</a> , <a href="http://www.gaobo.info/go.php/tags/database/" rel="tag">database</a> , <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/xp/" rel="tag">xp</a> , <a href="http://www.gaobo.info/go.php/tags/vista/" rel="tag">vista</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25B8%258B%25E8%25BD%25BD/" rel="tag">下载</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/655.htm</link>
<title><![CDATA[VMWare Server Console连接VMWare Server的端口]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Thu, 17 Sep 2009 07:43:00 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/655.htm</guid> 
<description>
<![CDATA[ 
	安装好VMWare Server后，可以在自己使用的PC上通过VMWare Server Console连接服务器上的虚拟机，从而进行远程管理。<br />需要注意的是VMWare Server所在服务器需要打开防火墙的902端口，否则客户端的VMWare Server Console会提示连接失败。VMWare黓认工作在902端口（TCP），如果在安装时给它分配的不是902端口（比如我的就是904 或者905），也有可能造成以上错误，这种情况下只需要将它的黓认端口改成902即可。<br />登录VMWare Server Console的时候需要使用VMWare Server所在服务器的管理员帐号和密码。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/vmware/" rel="tag">vmware</a> , <a href="http://www.gaobo.info/go.php/tags/server/" rel="tag">server</a> , <a href="http://www.gaobo.info/go.php/tags/console/" rel="tag">console</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%2598%25B2%25E7%2581%25AB%25E5%25A2%2599/" rel="tag">防火墙</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25AB%25AF%25E5%258F%25A3/" rel="tag">端口</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/654.htm</link>
<title><![CDATA[Windows 7(IIS 7.5)下安装PHP 5.3]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Thu, 10 Sep 2009 12:50:30 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/654.htm</guid> 
<description>
<![CDATA[ 
	经过多次尝试，从<a href="http://windows.php.net/download" target="_blank">http://windows.php.net/download</a>下载php-5.3.0-nts-Win32-VC9-x86.msi安装最为保险。安装的过程中可以选择需要开启的扩展。<br/>安装程序会自动在IIS中添加FastCGI扩展，因此安装完毕后即可运行phpinfo()<br/><br/>需要注意的地方：<br/>1、date.timezone一定要配置：<br/><div class="code">date.timezone = Asia/Shanghai</div><br/>2、访问MySQL可能会报错：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">mysqlnd cannot connect to MySQL 4.1+ using old authentication</div></div><br/>新的mysqlnd库需要使用MySQL 4.1新的41-byte的密码格式，使用旧的16字节的密码将导致mysql_connect()和类似的函数产生一个错误：mysqlnd cannot connect to MySQL 4.1+ using old authentication. (mysqlnd不能用旧的验证方式来连接到MySQL 4.1以上的版本)<br/>解决办法：<br/>用命令行登录mysql，输入语句<br/><div class="code">set password for &#039;root&#039;@&#039;localhost&#039; = PASSWORD(&#039;xxx&#039;);</div><br/>注意这里密码函数不是OLD_PASSWORD而是PASSWORD<br/>另外MySQL的配置文件中不能出现old-password=1<br/>3、XDebug<br/>zend_extension_ts变成了zend_extension，其他没有变化<br/>目前XDebug 2.0.5在FastCGI模式下有兼容BUG，导致PHP崩溃，故暂时无法使用<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/7/" rel="tag">7</a> , <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/fastcgi/" rel="tag">fastcgi</a> , <a href="http://www.gaobo.info/go.php/tags/xdebug/" rel="tag">xdebug</a> , <a href="http://www.gaobo.info/go.php/tags/iis/" rel="tag">iis</a> , <a href="http://www.gaobo.info/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/653.htm</link>
<title><![CDATA[为二级域名设置MX记录]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[服务器相关]]></category>
<pubDate>Thu, 10 Sep 2009 02:24:03 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/653.htm</guid> 
<description>
<![CDATA[ 
	因工作需要为一个二级域名（&alpha;）设置MX记录，研究了下，方法如下：<br />1、根据需要设置&alpha;的A记录&beta;（可根据情况省略）<br />2、设置&alpha;的MX记录，Bind的数据格式如下：<br />&alpha;. IN MX 10 &beta;<br />如果是设置到其他地方（如MS、TX等的邮局），将&beta;改为对方提供的地址即可，需要注意的是&alpha;和&beta;的最后都要有一个点（只有当&beta;是本域A记录时不需要写）<br />如果没有设置A记录&beta;，则&ldquo;&alpha;.&rdquo;处需要写全，形如&ldquo;&alpha;.***.com.&rdquo;<br />3、重启DNS服务<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/dns/" rel="tag">dns</a> , <a href="http://www.gaobo.info/go.php/tags/bind/" rel="tag">bind</a> , <a href="http://www.gaobo.info/go.php/tags/a/" rel="tag">a</a> , <a href="http://www.gaobo.info/go.php/tags/mx/" rel="tag">mx</a> , <a href="http://www.gaobo.info/go.php/tags/record/" rel="tag">record</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AE%25B0%25E5%25BD%2595/" rel="tag">记录</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/652.htm</link>
<title><![CDATA[Entity Framework的默认值BUG解决方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Fri, 04 Sep 2009 07:04:44 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/652.htm</guid> 
<description>
<![CDATA[ 
	在使用.Net 3.5里的Entity Framework开发网站的时候，遇到了一个问题：添加记录时，对于DateTime型的数据，无法使用数据库的默认值。<br/>查找了资料之后，知道这是Entities FrameWork的一个Bug，需要将edmx文件里，使用DateTime类型的字段加上<br/><div class="code">StoreGeneratedPattern=&quot;Identity&quot;</div><br/>属性才行。<br/>找到edmx文件，然后用文本工具打开，找到对应的字段属性，添加<br/><div class="code">StoreGeneratedPattern=&quot;Identity&quot;</div><br/>属性，然后保存退出，重新执行上述的语句，就会用默认值插入到数据库了。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/entities/" rel="tag">entities</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/datetime/" rel="tag">datetime</a> , <a href="http://www.gaobo.info/go.php/tags/edmx/" rel="tag">edmx</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/651.htm</link>
<title><![CDATA[Linq to Entities中连续保存多条数据的做法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Thu, 03 Sep 2009 14:25:02 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/651.htm</guid> 
<description>
<![CDATA[ 
	程序需要用到连续保存多条数据，代码示意如下：<br/><div class="code">string&#91;&#93; auditors = ……;<br/>foreach (string each in auditors)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;……<br/>&nbsp;&nbsp;&nbsp;&nbsp;……<br/>&nbsp;&nbsp;&nbsp;&nbsp;_db.AddToAuditResult(ar);<br/>&#125;<br/>_db.SaveChanges();</div><br/><br/>按照以上的方法，在循环第二次执行到SaveChanges()方法的时候，会出现异常：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">无法创建类型为“结束类型”的常量值。此上下文仅支持基元类型(“例如 Int32、String 和 Guid”)。</div></div><br/>解决方法：<br/><div class="code">foreach (string each in auditors)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;……<br/>&nbsp;&nbsp;&nbsp;&nbsp;……<br/>&nbsp;&nbsp;&nbsp;&nbsp;_db.AddToAuditResult(ar);<br/>&nbsp;&nbsp;&nbsp;&nbsp;_db.SaveChanges(false);<br/>&#125;<br/>_db.AcceptAllChanges();</div><br/>每次执行完AddTo……方法后调用SaveChanges()方法，但传入“false”参数，最后在循环体外部调用AcceptAllChanges()方法即可。<br/>这个方式其实常常被用来完成代码中的Transaction（事务）提交，在每次操作后SaveChanges()方法，但传入“false”参数，Entity Framework会保存当前对象的状态信息，但不会提交到数据库，直到显式的调用AcceptAllChanges()方法。只调用SaveChanges()方法，不传入任何参数，则默认会隐式的调用AcceptAllChanges()方法。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/asp.net/" rel="tag">asp.net</a> , <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/entities/" rel="tag">entities</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/linq/" rel="tag">linq</a> , <a href="http://www.gaobo.info/go.php/tags/savechanges/" rel="tag">savechanges</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/650.htm</link>
<title><![CDATA[“无法更新EntitySet“*****”，因为它有一个DefiningQuery，而ModificationFunctionMapping元素中没有支持当前操作的InsertFunction元素”问题的解决方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Mon, 31 Aug 2009 01:36:45 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/650.htm</guid> 
<description>
<![CDATA[ 
	遇到RT的问题的原因很尴尬，其实很可能就是没有定义这个表的主键，至于为什么没有定义主键，这个&hellip;&hellip;<img src="images/emot/cry.gif" border="0" /><br /><br />打开表定义设置好主键，然后更新Entity Model；如果不行，删除已有的Entity Model，删除Web.Config中的Entity定义，重建一个，应该可以了<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/primary/" rel="tag">primary</a> , <a href="http://www.gaobo.info/go.php/tags/key/" rel="tag">key</a> , <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a> , <a href="http://www.gaobo.info/go.php/tags/model/" rel="tag">model</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AE%259E%25E4%25BD%2593/" rel="tag">实体</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AF%25B9%25E8%25B1%25A1/" rel="tag">对象</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2598%25A0%25E5%25B0%2584/" rel="tag">映射</a> , <a href="http://www.gaobo.info/go.php/tags/%25E4%25B8%25BB%25E9%2594%25AE/" rel="tag">主键</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/649.htm</link>
<title><![CDATA[LINQ to Entities不支持语法及替代方案]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Fri, 28 Aug 2009 08:15:52 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/649.htm</guid> 
<description>
<![CDATA[ 
	　　LINQ to Entities是Ado.net Entity Framework的查询语言之一,它为了更好的兼容更多种的数据库所以在使用方法上有所精简，比之linq2SQL却少了一些好用的方法,下面就说一下这些日子来使用它时遇到的问题及解决方法<br/><br/>　　以下只列出了完全Not supported的内容，部分supported的方法都可以通过简单的增简参数解决<br/><br/>　　<strong>1.Contains</strong><br/>　　这一函数在linq2sql中将生成in方法<br/><div class="code">var s=db.Account.Select(c =&gt; c.ID);<br/>var ret =(from t in db.Profile<br/>　　where s.Contains(t.ID)<br/>　　select t).ToList();</div><br/>　　将生成类似 <br/><div class="code">select * from profile p where p.id in (1, 2, 3, 4)</div><br/>　　的SQL语句,但是这在LINQ to Entities中是行不通的, 可以使用 <br/><div class="code">var ids=db.Account.Select(c =&gt; c.ID);<br/>　　var ret = (from t in db.Profile<br/>　　　　　　　　　　　　　　　　　where ids.Any(c=&gt;c==t.UserID)<br/>　　　　　　　　　　　　　　　　　select t).ToList();</div><br/>　　来完成。<br/><br/>　　<strong>2.DefaultIFEmpty</strong><br/>　　这个在VS里进行了自动提示，可以使用First或FirstOrDefault来解决。<br/><br/>　　<strong>3.Reverse</strong><br/>　　原来的<br/><div class="code">var x = (from c in context.Customers　　　　<br/>　　　　　　　　select c).Reverse();</div><br/>　　要用orderby descending来重写<br/><div class="code">var x = from c in context.Customers<br/>　　　　　　　　orderby c.Address.Region descending<br/>　　　　　　　　select c;</div><br/>　　来代替<br/><br/>　　<strong>4.ElementAt</strong><br/>　　原来的用法<br/><div class="code">ElementAt(index)</div><br/>　　可以用Take，Skip或索引的方式选取，它的使用方法是灵活多样的<br/>　　至于ElementAtOrDefault，可以通过以上方法选取后，使用FirstOrDefault来获得，当然，这样取还有不少问题，希望大家在实践中可以解决<br/><br/>　　<strong>5.Last/LastOrDefault</strong><br/>　　可以通过orderby descending之后取First/FirstOrDefault来完成<br/><br/>　　<strong>6.Single/SingleOrDefault</strong><br/>　　可以用First/FirstOrDefault来替换<br/><br/>　　<strong>7.SkipWhile/TakeWhileAccounts.SkipWhile((x, index) => x.UserID >=1000)</strong><br/>　　这个就较为复杂要用繁杂一些的语句来实现<br/><div class="code">from a1 in Accounts<br/>where a1.UserID&gt;=(from a in Accounts where a.UserID&gt;1000 select a).FirstOrDefault().UserID<br/>select a1</div><br/>　　当然，这只是其中一种实现方法,TakeWhile与SkipWhile 几本相同。<br/><br/>　　Linq to Entities语法支持表：<a href="http://msdn.microsoft.com/en-us/library/bb738550.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/bb738550.aspx</a><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/linq/" rel="tag">linq</a> , <a href="http://www.gaobo.info/go.php/tags/entities/" rel="tag">entities</a> , <a href="http://www.gaobo.info/go.php/tags/contains/" rel="tag">contains</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AF%25AD%25E6%25B3%2595/" rel="tag">语法</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%259B%25BF%25E4%25BB%25A3/" rel="tag">替代</a> , <a href="http://www.gaobo.info/go.php/tags/ado.net/" rel="tag">ado.net</a> , <a href="http://www.gaobo.info/go.php/tags/entity/" rel="tag">entity</a> , <a href="http://www.gaobo.info/go.php/tags/framework/" rel="tag">framework</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/648.htm</link>
<title><![CDATA[国际域名状态的含义]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 27 Aug 2009 14:18:57 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/648.htm</guid> 
<description>
<![CDATA[ 
	Verisign已经改变域名到期删除的相关规则,具体举例如下： <br />1：比如域名yourname.com到期时间为2003年03月01日； <br />2：从2003年03月02日开始，域名的ns将会被系统自动删除，域名无法解析，但我公司会继续保留该域名30天，用户可以在这30天的期限内续费； <br />3：如果在2所述的30天期限内没有续费，即从2003年03月31日开始，域名将变成RedemptionPeriod状态，该状态将会保持30天，在此期间该域名不会掉下来，但是除了restore命令以外的所有命令对此域名无效； <br />4：域名在RedemptionPeriod状态下可以restore回来，但每restore一次需要支付（折合）人民币1000元（含一年续费）； <br />5：如果域名在RedemptionPeriod状态下的30天没有restore，从2003.04.29开始域名变成PendingDelete状态（5天），2003年05月04日该域名将会删除。 <br /><br />域名状态分为RRP域名状态和EPP域名状态。<br /><br /><strong>一：RRP域名状态是指&ldquo;注册局&mdash;注册商协议域名状态代码&rdquo;（Registry Registrar Protocol Domain Status Codes）</strong><br />VeriSign于2003年1月在其Registry Whois (.COM和.NET)中加了3个字段：<br />Status、Creation Date、Expiration Date <br />其中 Status 目前发现有8种状态，分别是： <br />1、ACTIVE：活动状态。由Registry设置；该域名可以由Registrar更改；可以续费；至少被指派一个DNS。 <br />2、REGISTRY-LOCK：注册局锁定。由注册局设置；该域名不可以由注册商更改、删除；必须由注册局解除此状态才可以由注册商更改域名信息；域名可以续费；如果域名被指派至少一个DNS则可以包含在(域名根服务器)的区域中(可以正常使用)。<br />注册局锁定（域名转移、更新、续费、删除至少有一项不能操作，域名可以进行解析使用）<br />3、REGISTRY-HOLD：注册局保留。由注册局设置；该域名不可以由注册商更改、删除；必须由注册局解除此状态才可以由注册商更改域名信息；域名可以续费；该域名不包括在(域名根服务器)的区域中(不能正常使用)。<br />注册局留置（有争议域名或者有问题域名，不能进行任何操作）<br />4、REGISTRAR-LOCK：注册商锁定。由该域名的原始注册商设置；该域名不可以被更改或删除；必须由注册商解除此状态才可以更改域名信息；该域名可以续费。该域名包含在(域名根服务器)的区域中(可以正常使用)。<br />注册商锁定（域名转移、更新、续费、删除至少有一项不能操作，域名可以进行解析使用）<br />5、REGISTRAR-HOLD：注册商保留。由该域名的原始注册商设置；该域名不可以被更改或删除；必须由注册商解除此状态才可以更改域名信息；该域名可以续费。该域名不包括在(域名根服务器)的区域中(不能正常使用)。<br />注册商留置（过期域名，可以进行续费操作）<br />6、REDEMPTIONPERIOD：宽限期。当注册商向注册局提出删除域名请求后，由注册局将域名设置称此状态，不过，条件是该域名已经注册了5天以上（如果该域名注册时间不足5天，则立即删除）；该域名不包括在(域名根服务器)的区域中(不能正常使用)；该域名不可以被更改或清除，只可以被恢复；任何其他注册商提出对此域名的更改或其他请求都将被拒绝；该状态最多保持30天。<br />赎回期（域名过期30后由注册局设置，此状态保持30天之后进入&ldquo;即将删除&rdquo;）<br />7、PENDINGRESTORE：恢复未决。当注册商提出将处于REDEMPTIONPERIOD的域名恢复请求后，由注册局设置；该域名包含在(域名根服务器)的区域中(可以正常使用)；注册商提出的更改或任何其他请求都将被拒绝；在7天之内，有注册商向注册局提供必需的恢复文件，如果注册商在7天之内提供了这些文件，该域名将被置为ACTIVE状态，否则，该域名将重新返回到REDEMPTIONPERIOD状态。<br />即将恢复 （注册局接到注册商的restorer命令，此此状态保持7天）<br />8、PENDINGDelete：删除未决。如果一个域名在被设置成REDEMPTIONPERIOD状态期间内，注册商没有提出恢复请求，那么，域名将被置于PENDINGDelete状态，注册商对此域名的任何请求都将被拒绝；5天之后清除。<br />即将删除（注册商对此域名的任何请求都将被拒绝，5天之后清除）<br /><br /><strong>二：EPP域名状态是指&ldquo;可扩展规定协议域名状态代码&rdquo;（Extensible Provisioning Protocol Domain Status Codes）<br /></strong>　　<strong>（1）Status: OK<br /></strong>　　默认的正常状态：<br />　　该状态由注册商设置，域名可以更新（域名信息修改）、续费、删除、转移，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（2）Status: INACTIVE<br /></strong>　　非激活状态：<br />　　属于正常状态，有些小问题没有设置好，比如没有指派至少一台域名服务器等。域名可以更新（域名信息修改）、续费、删除、转移。<br /><br />　　<strong>（3）Status: CLIENT TRANSFER PROHIBITED<br /></strong>　　客户端禁止转移：<br />　　该状态由注册商设置，域名可以更新（域名信息修改）、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（4）Status: CLIENTDeletePROHIBITED<br /></strong>　　客户端禁止删除：<br />　　该状态由注册商设置，域名可以更新（域名信息修改）、续费、转移，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（5）Status: CLIENTUpdatePROHIBITED<br /></strong>　　客户端禁止更新：<br />　　该状态由注册商设置，域名可以转移、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（6）Status: CLIENT RENEW PROHIBITED<br /></strong>　　客户端禁止续费：<br />　　该状态由注册商设置，域名可以更新（域名信息修改）、转移、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（7）Status: PENDING TRANSFER<br /></strong>　　即将转移：<br />　　该状态由注册局设置，转移请求已经被接纳，域名不能更新（域名信息修改）、不能续费、不能删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（8）Status: PENDING Update<br /></strong>　　即将更新：<br />　　该状态由注册局设置，更新（域名信息修改）请求已经被接纳，现在的更新很快，本状态基本不会出现，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（9）Status: PENDING RENEW<br /></strong>　　即将续费：<br />　　该状态由注册局设置，续费请求已经被接纳, 现在的续费很快，本状态基本不会出现，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（10）Status: PENDING Delete<br /></strong>　　即将删除：<br />　　该状态由注册局设置，注册商提出的删除请求已被接纳，此状态.cn的一般保持15天，如果没有接到注册商的续费请求，第16天将会被删除；.com和.net的一般保持5天，来自注册商的一切请求将会被拒绝，第6天删除。<br /><br />　　<strong>（11）Status: SERVER HOLD<br /></strong>　　注册局留置<br />　　该状态由注册局设置，域名的一切操作将被拒绝，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（12）Status: CLIENT HOLD<br /></strong>　　注册商留置<br />　　该状态由注册商设置，域名可以续费，但不能正常使用。<br /><br />　　<strong>（13）Status: SERVER Delete PROHIBITED<br /></strong>　　注册局禁止删除<br />　　该状态由注册局设置，域名可以更新（域名信息修改）、转移、续费，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（14）Status: SERVER Update PROHIBITED<br /></strong>　　注册局禁止更新<br />　　该状态由注册商设置，域名可以转移、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（15）Status: SERVER TRANSFER PROHIBITED<br /></strong>　　注册局禁止转移<br />　　该状态由注册局设置，域名可以更新（域名信息修改）、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（16）Status: SERVER RENEW PROHIBITED<br /></strong>　　注册局禁止续费<br />　　该状态由注册局设置，域名可以更新（域名信息修改）、转移、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（17）Status: SERVER LOCK<br /></strong>　　注册局锁定<br />　　该状态由注册局设置，域名可以更新（域名信息修改）、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（18）Status: CLIENT Delete PROHIBITED<br /></strong>　　注册商禁止删除<br />　　该状态由注册商设置，域名可以更新（域名信息修改）、续费、转移，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（19）Status: CLIENT Update PROHIBITED<br /></strong>　　注册商禁止更新<br />　　该状态由注册商设置，域名可以转移、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（20）Status: CLIENT TRANSFER PROHIBITED<br /></strong>　　注册商禁止转移<br />　　该状态由注册商设置，域名可以更新（域名信息修改）、续费、删除，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（21）Status: CLIENT LOCK<br /></strong>　　注册商锁定<br />　　该状态由注册商设置，域名的操作至少有一项不能使用：更新（域名信息修改）、续费、删除、转移，指派至少一台域名服务器则可以正常使用。<br /><br />　　<strong>（22）Status: REDEMPTION PERIOD<br /></strong>　　赎回期：<br />　　该状态由注册局设置，域名不可以被更改或删除，只可以被恢复；任何其他注册商提出对此域名的更改或其他请求都将被拒绝；该状态最多保持30天，域名不能正常使用。<br /><br />　　<strong>（23）Status: PENDING RESTORE<br /></strong>　　即将恢复：<br />　　原注册商对处于赎回期的域名向注册局提出RESTORE请求后，设置该状态，域名不可以更新（域名信息修改）、不能续费、不能删除，该状态可以保持7天。若原注册商没有在特定时间内提交恢复请求文件，域名即退回赎回期状态。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%258A%25B6%25E6%2580%2581/" rel="tag">状态</a> , <a href="http://www.gaobo.info/go.php/tags/domain/" rel="tag">domain</a> , <a href="http://www.gaobo.info/go.php/tags/name/" rel="tag">name</a> , <a href="http://www.gaobo.info/go.php/tags/registry/" rel="tag">registry</a> , <a href="http://www.gaobo.info/go.php/tags/registrar/" rel="tag">registrar</a> , <a href="http://www.gaobo.info/go.php/tags/pending/" rel="tag">pending</a> , <a href="http://www.gaobo.info/go.php/tags/status/" rel="tag">status</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/647.htm</link>
<title><![CDATA[在.Net中使用语音合成技术]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Thu, 27 Aug 2009 02:46:07 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/647.htm</guid> 
<description>
<![CDATA[ 
	<strong>（1）Web 页面中使用语音合成技术</strong><br/>环境要求：<br/>首先我们需要一个微软的Speech SDK 5.1的安装包（当然你的机器的操作系统版本要在windows2000以上的这个范畴）,来使得我们的机器具有语音识别的功能。安装包，您可以在这里找到：<br/><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en" target="_blank">http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en</a><br/>下载并安装SpeechSDK51.exe 和 SpeechSDK51LangPack.exe 就可以了。<br/><br/>让我们开始：<br/>环境已经准备好了，那就让我们正式开始吧。<br/> <br/>首先我们需要一个能够"发声"的对象，暂时我们就称他为" 朗读人"。在不同的语音合成的程序中，他所出现的形式也是不同的，当然这是后话，以后我再告诉你（嘿嘿，不是卖关子，这是第一讲，咱们先让它能说话了先）。<br/> <br/>在web 应用程序的 html 代码中创建" 朗读人"对象：<br/><div class="code">// Create the Sapi SpVoice object<br/>var VoiceObj = new ActiveXObject(&quot;Sapi.SpVoice&quot;);</div><br/>上面的代码是创建一个" 朗读人"对象，我们要将这个写在js中（有点废话，呵呵）。<br/> <br/>下面的代码将告诉我们" 朗读人"是如何工作的：<br/><div class="code">VoiceObj.Speak(“hello world”);</div><br/>下面的代码告诉了我们如何销毁我们的" 朗读人"<br/><div class="code">// Clean up voice object<br/>delete VoiceObj;</div><br/>当您如果读到了这里，我首先要感谢您的耐心。与此同时我也要恭喜你了，如果您是一个敏感的程序员。这个时候您可能已经开始编写您自己的语音合成代码了。因为我们知道了，如何创建对象，如何使用对象的方法，和如何delete它。<br/> <br/>当然这些还远远不够，让我们再做的更好些：<br/> <br/>控制声音的属性<br/> <br/>控制音量(1~100)： <br/><div class="code">VoiceObj.Volume = 80 ;</div><br/>控制语速(-10~10)<br/><div class="code">VoiceObj.Rate = 0;</div><br/>控制朗读人的声音<br/><div class="code">VoiceObj.Voice = &quot;Microsoft Anna&quot;;</div><br/>控制朗读人的硬件设备输出<br/><div class="code">VoiceObj.AudioOutput =&nbsp;&nbsp;&quot;SoundMax Integrated&quot;;</div><br/>完整的例子：<br/><div class="code"><br/>&lt;!-- Copyright @ 2001 Microsoft Corporation All Rights Reserved. --&gt;<br/>&lt;HTML&gt;<br/>&lt;HEAD&gt;<br/>&lt;META HTTP-EQUIV=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;<br/>&lt;TITLE&gt;TTS Demo&lt;/TITLE&gt;<br/><br/>&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt;...<br/><br/>// Create the Sapi SpVoice object<br/>var VoiceObj = new ActiveXObject(&quot;Sapi.SpVoice&quot;);<br/><br/>// ChangeVoice() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This function sets the newly selected voice choice from the Voice <br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select box on the Voice object.<br/>function ChangeVoice() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var i = parseInt( idsVoices.value );<br/>&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Voice = VoiceObj.GetVoices().Item(i);<br/>&#125;<br/><br/>// ChangeAudioOutput() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This function sets the newly selected audio output choice from the<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Audio Output Select box on the Voice object.<br/>function ChangeAudioOutput() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var i = parseInt( idsAudioOutputs.value );<br/>&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.AudioOutput = VoiceObj.GetAudioOutputs().Item(i);<br/>&#125;<br/><br/>// IncRate() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This function increases the speaking rate by 1 up to a maximum<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of 10.<br/>function IncRate() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( VoiceObj.Rate &lt; 10 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Rate = VoiceObj.Rate + 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>// DecRate() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This function decreases the speaking rate by -1 down to a minimum<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of -10.<br/>function DecRate() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( VoiceObj.Rate &gt; -10 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Rate = VoiceObj.Rate - 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>// IncVol() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This function increases the speaking volume by 10 up to a maximum<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of 100.<br/>function IncVol() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( VoiceObj.Volume &lt; 100 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Volume = VoiceObj.Volume + 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>// DecVol() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This function decreases the speaking volume by -10 down to a minimum<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of 0.<br/>function DecVol() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( VoiceObj.Volume &gt; 9 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Volume = VoiceObj.Volume - 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>// SpeakText() function:<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This function gets the text from the textbox and sends it to the<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Voice object&#039;s Speak() function. The value &quot;1&quot; for the second<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter corresponds to the SVSFlagsAsync value in the SpeechVoiceSpeakFlags<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enumerated type.<br/>function SpeakText() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( idbSpeakText.value == &quot;SpeakText&quot; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Speak the string in the edit box<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Speak( idTextBox.value );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(exception)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;Speak error&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if( idbSpeakText.value == &quot;Stop&quot; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Speak empty string to Stop current speaking. The value &quot;2&quot; for <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the second parameter corresponds to the SVSFPurgeBeforeSpeak<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// value in the SpeechVoiceSpeakFlags enumerated type.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VoiceObj.Speak( &quot;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>&lt;/SCRIPT&gt;<br/><br/>&lt;SCRIPT FOR=&quot;window&quot; EVENT=&quot;OnQuit()&quot; LANGUAGE=&quot;JavaScript&quot;&gt;...<br/>&nbsp;&nbsp;&nbsp;&nbsp;// Clean up voice object<br/>&nbsp;&nbsp;&nbsp;&nbsp;delete VoiceObj;<br/>&lt;/SCRIPT&gt;<br/><br/>&lt;/HEAD&gt;<br/><br/><br/><br/><br/><br/>&lt;BODY&gt;<br/>&lt;H1 align=center&gt;Simple TTS (DHTML)&lt;/H1&gt;<br/>&lt;H1 align=center&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;<br/>&lt;IMG alt=&quot;&quot; border=2 hspace=0 id=idImage src=&quot;mouthclo.bmp&quot;&gt;&amp;nbsp; &lt;/H1&gt;<br/>&lt;H1 align=center&gt;&nbsp;&nbsp;<br/>&lt;TEXTAREA ID=idTextBox COLS=50 ROWS=10 WRAP=VIRTUAL&gt;Enter text you wish spoken here&lt;/TEXTAREA&gt;<br/>&lt;/H1&gt;<br/><br/>&lt;P align=center&gt;&lt;STRONG&gt;&lt;STRONG&gt; <br/>Rate&amp;nbsp;&lt;STRONG&gt; <br/>&lt;INPUT id=idbIncRate name=button1 type=button onclick=IncRate() value=&quot;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&quot;&gt;&lt;/STRONG&gt;&amp;nbsp;<br/>&lt;INPUT id=idbDecRate name=button2 type=button onclick=DecRate() value=&quot;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;&quot; style=&quot;LEFT: 237px; TOP: 292px&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/STRONG&gt;&amp;nbsp; <br/><br/>Volume&amp;nbsp;&lt;STRONG&gt;&lt;STRONG&gt; <br/>&lt;INPUT id=idbIncVol name=button3 onclick=IncVol() style=&quot;LEFT: 67px; TOP: 318px&quot; type=button value=&quot;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&quot;&gt;&amp;nbsp;<br/>&lt;INPUT id=idbDecVol name=button4 onclick=DecVol() type=button value=&quot;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;&quot; style=&quot;LEFT: 134px; TOP: 377px&quot;&gt;<br/>&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;<br/> <br/>&lt;P align=center&gt;&lt;STRONG&gt;&lt;BUTTON id=idbSpeakText onclick=SpeakText(); <br/>&nbsp;&nbsp; style=&quot;HEIGHT: 24px; LEFT: 363px; TOP: 332px; WIDTH: 178px&quot;&gt;SpeakText&lt;/BUTTON&gt;&lt;/STRONG&gt;&lt;/P&gt;<br/> <br/>&lt;P align=center&gt;&lt;STRONG&gt;Voice&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br/>&nbsp;&nbsp; &lt;STRONG&gt;Audio Output&amp;nbsp;&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;<br/>&lt;P align=center&gt; <br/><br/>&lt;SELECT id=idsVoices name=Voices onchange=ChangeVoice() style=&quot;FONT-FAMILY: serif; HEIGHT: 21px; WIDTH: 179px&quot;&gt; &lt;/SELECT&gt;<br/>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br/><br/>&lt;SELECT id=idsAudioOutputs name=AudioOutputs onchange=ChangeAudioOutput() style=&quot;HEIGHT: 22px; WIDTH: 179px&quot;&gt;&nbsp;&nbsp;&lt;/SELECT&gt;<br/> <br/><br/>&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt;...<br/>// Code in the BODY of the webpage is used to initialize controls and<br/>// to handle SAPI events<br/><br/>/**//***** Initializer code *****/<br/>InitializeControls();<br/><br/>function InitializeControls()<br/>...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// Initialize the Voices and AudioOutput Select boxes<br/>&nbsp;&nbsp;&nbsp;&nbsp;var VoicesToken = VoiceObj.GetVoices();<br/>&nbsp;&nbsp;&nbsp;&nbsp;var AudioOutputsToken = VoiceObj.GetAudioOutputs();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;// Add correct strings to Voice Select box<br/>&nbsp;&nbsp;&nbsp;&nbsp;for( var i=0; i&lt;VoicesToken.Count; i++ )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var oOption = document.createElement(&quot;OPTION&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idsVoices.options.add(oOption);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oOption.innerText = VoicesToken.Item(i).GetDescription();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oOption.value = i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;// Add correct strings to Audio Output Select box<br/>&nbsp;&nbsp;&nbsp;&nbsp;for( var i=0; i&lt;AudioOutputsToken.Count; i++ )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var oOption = document.createElement(&quot;OPTION&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idsAudioOutputs.options.add(oOption);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oOption.innerText = AudioOutputsToken.Item(i).GetDescription();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oOption.value = i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;<br/><br/>/**//***** Event handling code *****/<br/>// These functions are used to handle the SAPI events<br/><br/>// Handle StartStream event&nbsp;&nbsp;&nbsp;&nbsp;<br/>function VoiceObj::StartStream() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;idbSpeakText.value = &quot;Stop&quot;;<br/>&#125;<br/><br/>// Handle EndStream event&nbsp;&nbsp;&nbsp;&nbsp;<br/>function VoiceObj::EndStream() ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;idbSpeakText.value = &quot;SpeakText&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthclo.bmp&quot;;<br/>&#125;<br/><br/>// Handle Viseme event&nbsp;&nbsp;&nbsp;&nbsp;<br/>function VoiceObj::Viseme(StreamNum, StreamPos, Duration, VisemeType, Feature, VisemeId) ...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// Map the VisemeId to the appropriate .bmp<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( VisemeId == 15 &#124;&#124; VisemeId == 17 &#124;&#124; VisemeId == 18 &#124;&#124; VisemeId ==21 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthop1.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if( VisemeId == 14 &#124;&#124; VisemeId == 16 &#124;&#124; VisemeId == 19 &#124;&#124; VisemeId == 20 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthop2.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if( VisemeId == 4 &#124;&#124; VisemeId == 6 &#124;&#124; VisemeId == 9 &#124;&#124; VisemeId == 12 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthop3.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if( VisemeId == 1 &#124;&#124; VisemeId == 2 &#124;&#124; VisemeId == 3 &#124;&#124; VisemeId == 11 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthop4.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if( VisemeId == 7 &#124;&#124; VisemeId == 8 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthnar.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if( VisemeId == 5 &#124;&#124; VisemeId == 10 &#124;&#124; VisemeId == 13 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthmed.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idImage.src = &quot;mouthclo.bmp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>&lt;/SCRIPT&gt;<br/><br/><br/><br/>&lt;STRONG&gt;<br/>&lt;HR&gt;&lt;/STRONG&gt;<br/>&lt;P&gt;&lt;/P&gt;<br/><br/>&lt;/BODY&gt;<br/>&lt;/HTML&gt;<br/></div><br/><br/><br/><strong>（2）C# 中使用语音合成技术</strong><br/>首先我们需要引用speech 的DLL 。 具体步骤如下<br/>在工程中添加引用：<br/>完成了引用的添加，接下来一起编写语音合成的 C# <br/><br/>必不可少的 <br/><div class="code">using System.Speech.Synthesis;</div><br/>下面的内容将告诉我们如何创建朗读的对象,和如何使用该朗读对象朗读文本.<br/><div class="code">SpeechSynthesizer synth = new SpeechSynthesizer();<br/>synth.Speak(&quot;hello world&quot;);</div><br/>就是这样的简单.<br/><br/>当然这是最简单的C# 中朗读文本的代码,只有短短的三行就可以了.在这里我说一点我的小经验. SpeechSynthesizer类的对象默认是不支持开启线程朗读的方法.例如remoting 或者 socket 中begin …end 这样的。而在使用SpeechSynthesizer对象朗读的时候，会使程序等待它的朗读完毕。所以在处理朗读的时候，我在绝大多数的情况下，使将它放到一个线程当中。避免它的朗读，对主线程造成的阻塞。<br/><br/>必不可少的<br/><div class="code">using System.Speech.Synthesis;</div><br/>下面的内容将告诉我们如何创建朗读的对象,和如何使用该朗读对象朗读文本.<br/><div class="code">SpeechSynthesizer synth = new SpeechSynthesizer();<br/>synth.Speak(&quot;hello world&quot;);</div><br/>就是这样的简单.如何SpeechSynthesizer的朗读对象中的其它属性和方法:<br/>使用synth 合成 wav 音频文件:<br/><div class="code">synth.SetOutputToWaveFile(string path);</div><br/>使用synth 选择朗读人的选项:<br/><div class="code">synth.SelectVoice(&quot;Microsoft Anna&quot;);</div><br/>查看当前 synth 选择的朗读人<br/><div class="code">String speechPeople = synth.Voice;</div><br/>使用 synth 设置朗读音量 [范围 0 ~ 100] <br/><div class="code">synth.Volume = 80;</div><br/>使用 synth 设置朗读频率 [范围 -10 ~ 10]<br/><div class="code">synth.Rate = 0;</div><br/> <br/>如果你觉得这些还不能满足你对语音合成的效果,或者说是想到达到的功能,请继续往下看.<br/>在使用语音合成技术的时候. SpeechSynthesizer对象在为我们朗读一些文本的时候会触发一些事件,在这里我将比较有用的为大家介绍一下.<br/>首先是SpeakProgress 这个事件是在朗读的过程中触发的,它可以帮助我们找到当前正在朗读的文本是什么,当然不是全部的文本,而是精确到了一个字或者一个词.<br/><div class="code">void synth_SpeakProgress(object sender, SpeakProgressEventArgs e)<br/>&#123;<br/>&nbsp;&nbsp; e.Text ;<br/>&#125;</div><br/>如果你想得到语音朗读过程中合成的拼音是什么.那么你就要使用到这个事件了.<br/><div class="code">void synth_PhonemeReached(object sender, PhonemeReachedEventArgs e)<br/>&#123;<br/>e.Phoneme<br/>e.NextPhoneme<br/>&#125;</div><br/><br/><br/><br/><strong>（3）使用C++实现语音识别</strong><br/>还记得星球大战里的那个总陪在主人身边听话的智能机器人么?拥有了听和说的技能,在那个时候这还是人们的想象,但是今天我们就可以来实现它!<br/>微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听：第一种模式：任意监听，即随意输入语音，监听对象将最为接近的字或者词，句反馈出来；第二种模式：划定范围监听，制定一组被选项做为监听的，用户的语音输入被反馈成最为接近的一个选项。说得通俗一些：第一种是填空题，第二种是选择题目。<br/> <br/>今天我们就一起来学习如何用C++ 来完成一道语音识别的填空题：<br/> <br/>代码如下<br/><div class="code"><br/>#include &lt;windows.h&gt;<br/>#include &lt;sapi.h&gt;<br/>#include &lt;stdio.h&gt;<br/>#include &lt;string.h&gt;<br/>#include &lt;atlbase.h&gt;<br/>#include &quot;sphelper.h&quot;<br/>//Copyright (c) Microsoft Corporation. All rights reserved.<br/><br/>inline HRESULT BlockForResult(ISpRecoContext * pRecoCtxt, ISpRecoResult ** ppResult)<br/>...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT hr = S_OK;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSpEvent event;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;while (SUCCEEDED(hr) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUCCEEDED(hr = event.GetFrom(pRecoCtxt)) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr == S_FALSE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr = pRecoCtxt-&gt;WaitForNotifyEvent(INFINITE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;*ppResult = event.RecoResult();<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (*ppResult)<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*ppResult)-&gt;AddRef();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return hr;<br/>&#125;<br/><br/>const WCHAR * StopWord()<br/>...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;const WCHAR * pchStop;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;LANGID LangId = ::SpGetUserDefaultUILanguage();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;switch (LangId)<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pchStop = L&quot;&#125;42N86&#92;0b70e50fc0ea0e70fc/05708504608a087046&quot;;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pchStop = L&quot;Stop&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return pchStop;<br/>&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>int main(int argc, char* argv&#91;&#93;)<br/>...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT hr = E_FAIL;<br/>&nbsp;&nbsp;&nbsp;&nbsp;bool fUseTTS = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// turn TTS play back on or off<br/>&nbsp;&nbsp;&nbsp;&nbsp;bool fReplay = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// turn Audio replay on or off<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;// Process optional arguments<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (argc &gt; 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 1; i &lt; argc; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (_stricmp(argv&#91;i&#93;, &quot;-noTTS&quot;) == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fUseTTS = false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (_stricmp(argv&#91;i&#93;, &quot;-noReplay&quot;) == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fReplay = false;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf (&quot;Usage: %s &#91;-noTTS&#93; &#91;-noReplay&#93;&nbsp;&nbsp;&quot;, argv&#91;0&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if (SUCCEEDED(hr = ::CoInitialize(NULL)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CComPtr&lt;ISpRecoContext&gt; cpRecoCtxt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CComPtr&lt;ISpRecoGrammar&gt; cpGrammar;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CComPtr&lt;ISpVoice&gt; cpVoice;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr = cpRecoCtxt-&gt;GetVoice(&amp;cpVoice);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cpRecoCtxt &amp;&amp; cpVoice &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr = cpRecoCtxt-&gt;SetNotifyWin32Event()) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr = cpRecoCtxt-&gt;SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION))) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr = cpRecoCtxt-&gt;SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL)) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr = cpRecoCtxt-&gt;CreateGrammar(0, &amp;cpGrammar)) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr = cpGrammar-&gt;LoadDictation(NULL, SPLO_STATIC)) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUCCEEDED(hr = cpGrammar-&gt;SetDictationState(SPRS_ACTIVE)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USES_CONVERSION;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const WCHAR * const pchStop = StopWord();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CComPtr&lt;ISpRecoResult&gt; cpResult;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( &quot;I will repeat everything you say. Say &quot;%s&quot; to exit. &quot;, W2A(pchStop) );<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (SUCCEEDED(hr = BlockForResult(cpRecoCtxt, &amp;cpResult)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpGrammar-&gt;SetDictationState( SPRS_INACTIVE );<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CSpDynamicString dstrText;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (SUCCEEDED(cpResult-&gt;GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRUE, &amp;dstrText, NULL)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;I heard:&nbsp;&nbsp;%s &quot;, W2A(dstrText));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fUseTTS)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpVoice-&gt;Speak( L&quot;I heard&quot;, SPF_ASYNC, NULL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpVoice-&gt;Speak( dstrText, SPF_ASYNC, NULL );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fReplay)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fUseTTS)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpVoice-&gt;Speak( L&quot;when you said&quot;, SPF_ASYNC, NULL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf (&quot; when you said... &quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpResult-&gt;SpeakAudio(NULL, 0, NULL, NULL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpResult.Release();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (_wcsicmp(dstrText, pchStop) == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpGrammar-&gt;SetDictationState( SPRS_ACTIVE );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CoUninitialize();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return hr;<br/>&#125;<br/></div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/.net/" rel="tag">.net</a> , <a href="http://www.gaobo.info/go.php/tags/c%2523/" rel="tag">c#</a> , <a href="http://www.gaobo.info/go.php/tags/web/" rel="tag">web</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25AF%25AD%25E9%259F%25B3%25E8%25AF%2586%25E5%2588%25AB/" rel="tag">语音识别</a> , <a href="http://www.gaobo.info/go.php/tags/voice/" rel="tag">voice</a> , <a href="http://www.gaobo.info/go.php/tags/speak/" rel="tag">speak</a> , <a href="http://www.gaobo.info/go.php/tags/speech/" rel="tag">speech</a> , <a href="http://www.gaobo.info/go.php/tags/synthesizer/" rel="tag">synthesizer</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/646.htm</link>
<title><![CDATA[在Windows 7下成功安装ORACLE客户端]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[DotNet.etc]]></category>
<pubDate>Thu, 27 Aug 2009 02:13:28 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/646.htm</guid> 
<description>
<![CDATA[ 
	把先前安装的Windows 7 RC格式化掉安装Retail版以后，工作需要安装Oracle Client，但是到先决性检查的地方过不去，貌似是客户端不支持Windows 7这么先进的操作系统&hellip;&hellip;orz<br /><br />网上搜索了很多资料也不行，自己琢磨了半天终于搞懂了，方法如下：<br /><br />当前任何版本的ORACLE客户端在任何版本的WINDOWS7上都无法正常完成安装.<br />主要是因为ORACLE安装的先决条件里操作系统版本不符合,但是这个问题可以修改refhost.xml解决, 具体是在refhost.xml中添加<br />&nbsp; &lt;!--Microsoft Windows 7--&gt;<br />&nbsp; &lt;OPERATING_SYSTEM&gt;<br />&nbsp;&nbsp;&nbsp; &lt;VERSION VALUE=&quot;6.1&quot;/&gt;<br />&nbsp; &lt;/OPERATING_SYSTEM&gt;<br />即可,不需要添加X32或者X64,注意ORACLE10G或者11有可能有多个refhost.xml文件,都需要修改(好像部分版本需要修改oraparam.ini文件 自己搜索一下吧)。这样可以在检查操作系统的时候绕过检查。无论是oracle client for Windows , vista ,2k8 server 的X32或者X64版本都可以通过这个方法正常安装。<br /><br />PLSQL DEVELOPER和CMD&nbsp;SQLPLUS都依此安装，但是打开PLSQL DEVELOPER 7.1.5.1399 会出问题,提示OCI的错误<br />然后不登录ORACLE进PLSQLDEV 依次选择tools--preferences,配置下面的东西 路径自己改<br />oraclehome : E:&#92;oracle&#92;product&#92;10.2.0&#92;client_1&#92;BIN<br />oci library : E:&#92;oracle&#92;product&#92;10.2.0&#92;client_1&#92;BIN&#92;oci.dll<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/oracle/" rel="tag">oracle</a> , <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/client/" rel="tag">client</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%25AE%25A2%25E6%2588%25B7%25E7%25AB%25AF/" rel="tag">客户端</a> , <a href="http://www.gaobo.info/go.php/tags/plsql/" rel="tag">plsql</a> , <a href="http://www.gaobo.info/go.php/tags/sqlplus/" rel="tag">sqlplus</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/645.htm</link>
<title><![CDATA[2009理性到变态的99句话]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Tue, 25 Aug 2009 10:33:20 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/645.htm</guid> 
<description>
<![CDATA[ 
	1. 我抽的不是烟，是寂寞！<br />2. 别在我的坟前哭，脏了我轮回的路。<br />3. 我这人从不记仇,一般有仇当场我就报了。<br />4. 已经将整个青春都用来检讨青春，还要把整个生命都用来怀疑生命。<br />5. 是这样的张总，你在家里的电脑上按了CTRL+C，然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不，多贵的电脑都不行。<br />6. 你要是鲜花，以后牛都不敢拉粪了！<br />7. 我以为你只是1和3中间的数，没想到你还是1和3俩数的组合。<br />8. 自己选择45&deg;仰视别人，就休怪他人135&deg;俯视着看你。<br />9. 你攒够四块五，我也攒够四块五，我们就可以去民政局结婚了。<br />10. 我爸面对我发胖一事发表了看法：没有韩红的命，还得了韩红的病。<br />11. 曾以为我是那崖畔的一枝花，后来才知道，不过是人海一粒渣。<br />12. 现在你骂我，是因为你还不了解我，等你以后了解了我，你一定会动手打我的。<br />13. 石头记告诉我们：凡是真心爱的最后都散了，凡是混搭的最后都团圆了。<br />14. 如果你不是经常遇到挫折，这表明你做的事情没有很大的创新性-伍迪.艾伦<br />15. 人永远不知道谁哪次不经意的跟你说了再见之后就真的再也不见了。<br />16. 只有颈部如胎儿般被扭曲的亡骸， 在我看来竟如同被折断的百合花。<br />17. 过往的人啊 不要为我的死悲伤 如果我活着 你们谁也活不了――――-罗伯斯庇尔墓志铭<br />18. 自从深发展银行推出那条知性的广告语&ldquo;只想与你深发展&rdquo;后，银行业内人士又自编出了更知性的姊妹篇：&ldquo;光大是不行的&rdquo;。<br />19. 马不停蹄的错过，轻而易举的辜负，不知不觉的陌路。<br />20. &ldquo;你喜欢我天使的脸孔，还是魔鬼的身材？&rdquo;&ldquo;我就喜欢你这种幽默感。&rdquo;<br />21. 梦 遗落在草原上 月 经常挂在天上<br />22. 广播体操现在开始：╔囧╗╔囧╝╚囧╝╚囧╗╔囧╗╔囧╝╚囧╝╚囧╗╔囧╗╔囧╝╚囧╝╚囧╗╔囧╗╔囧╝╚囧╝╚囧╗╔囧╗╔囧╝╚囧╝╚囧╗╔囧╗╔囧╝╚囧╝╚囧╗╔囧╗╔囧╝╚囧╝╚囧╗<br />23. &ldquo;恋&rdquo;是个很强悍的字。它的上半部取自&ldquo;变态&rdquo;的&ldquo;变&rdquo;，下半部取自&ldquo;变态&rdquo;的&ldquo;态&rdquo;。<br />24. 这姑娘，穿的是真清凉，长的是真败火。<br />25. 这位姑娘，首先，我们之间有代沟，其次，你又没有乳沟，你说，我们还怎么交流？<br />26. 求最悲伤的歌？最佳答案：《社会主义好》<br />27. &ldquo;刘惜君，你唱得太好了，我一定要把你留在10强。但是我投给曾轶可，因为你这么强，一定可以有机晋级的。&rdquo;<br />28. 以前我不相信颠倒黑白、指鹿为马，看到余秋雨、曾轶可、莲花河畔，我相信了。<br />29. 电话费透支90万的判无期，撞死人的判3年；自动取款机恶意取款17万判无期，贪污几千万判10年。&mdash;&mdash;精彩中国。<br />30. 到一寺庙，一得道高僧讲：施主捐些款吧，三百五百的都行。回答说：实在没带这么多钱，下次吧。高僧回答：可以刷卡。<br />31. &ldquo;你爸妈要是把那十分钟用来散步该多好啊。。。&rdquo;<br />32. 等余震的心情，就像初恋的少女等情人，既怕他不来，又怕他乱来 。<br />33. 当时我正在和女朋友一起查资料，突然蹦出一个窗口，很黄很暴力，我们赶快灯给关了。<br />34. 我能抵抗一切，除了诱惑<br />35. 别人都说我长得天生励志！<br />36. 从前，有个小孩说，打死我也不睡觉。然后他被打死了。<br />37. 说假话总会被人揭穿,戴假发总会被风揭穿。<br />38. 人干点好事总想让神鬼知道，干点坏事总以为神鬼不知道，我们太难为神鬼了<br />39. 真不好意思，让您贱笑了。<br />40. 雷锋做了好事不留名，但是每一件事情都记到日记里面。<br />41. 骗子太多，傻子明显不够用了<br />42. 世界上最可怕的两句话，一句是，&ldquo;我这么爱你，你为什么不爱我？&rdquo;还有一句是，&ldquo;我这都是为你好。&rdquo;<br />43. 我悲哀，我用我最美丽的一面展现给他看，他看的却是远方的风景。<br />44. 初中的体育老师说：谁敢再穿裙子上我的课，就罚她倒立。<br />45. 以前，世界这么乱，小女子怎么混呢；现在嘛，小女子这么乱，世界怎么混呢？&mdash;&mdash;尹丽川如是说<br />46. 男的装女的叫人妖，那女的装男的呢？&mdash;&mdash;春哥呗<br />47. 我有一颗水晶般的心，可他们以为它是玻璃。<br />48. 每个成功的奥特曼背后都有一个默默挨打的小怪兽。<br />49. 好女人就像汽油，一旦拥有就有动力：坏女人就像气囊，一旦用上就有危机。<br />50. 好的爱情是你透过一个男人看到世界，坏的爱情是你为了一个人舍弃世界。<br />51. 人不能把钱带进坟墓，但钱却可以把人带进去<br />52. 真爱就像幽灵，人人都谈论它，可却从未有人真正见过它。<br />53. 这世界上最遥远的距离，不是天涯海角，也不是生死别离，而是我身在祖国，却不知道祖国在发生什么。<br />54. 寂寞就是有人说话时，没人在听；有人在听时，你却没话说了!<br />55. 时间是最好的老师，但遗憾的是&mdash;&mdash;最后他把所有的学生都弄死了。<br />56. 男人的话就像老太太的牙齿，有多少是真的？！<br />57. 《绝望的主妇》第一集就有这样的台词：&ldquo;男人勃起的时候是没有道德可言的。&rdquo;<br />58. 2008太不正常了,一切都不正常!在这个关键时刻,中国男足挺身而出，向全世界证明：中国男足还是正常的!<br />59. 你给了我两个选择，却是一个结局。<br />60. 选恋人要选和自己相配的，如果不相配那也要选个自己敬佩的，如果不能敬佩那起码得选个可以交配的。<br />61. 你这个给过我承诺的人，最终却也只留给我一个灿烂的表情，而非灿烂的一生。<br />62. 城市里除了性无能的男人，就是爱无能的男人，除了这两者，只剩下，女人。<br />63. 他说：&ldquo;你会找到一个比我更好的人。&rdquo; 我微笑说：&ldquo;但我不会再对人这么好了。&rdquo;<br />64. 周迅在《如果，爱》里面有一句话说得很对，过去的意义只有一个，就是让我不想再回到过去。<br />65. 生存是什么?生存就是不择手段的活着。<br />66. 现在不玩命,将来命玩你<br />67. 一个人的死是一个悲剧 千百万人的死却仅仅是个统计数字<br />68. 有的人，从他看电影的方式就能看出他人品，看文艺片时不断快进，看A片时不断暂停。<br />69. 一分钟有多长？这要看你是蹲在厕所里面，还是等在厕所外面<br />70. 我爸说过的最让我感动的一句话：&ldquo;孩子，好好学习吧，爸以前玩麻将都玩儿10块的，现在为了供你念书，改玩儿1块的了。。。&rdquo;<br />71. 过去谈朋友是先问别人有朋友没有，现在得问别人是不是同性恋。<br />72. 不是你不笑，一笑粉就掉!<br />73. 俺姥姥看到电视里三分钟无痛人流的广告后气愤滴说：&ldquo;这就是在告诉小年轻儿们都赶紧去胡搞吧，反正三分钟，还无痛。&rdquo;<br />74. 教授在讲台上讲有机化学高分子：这是一个太监，我们给再他按个甲基吧。...<br />75. 师太，你是我心中的魔，贫僧离你越近，就离佛越远&hellip;&hellip;<br />76. 真正的流浪与漂泊是，你没有可以回去的地方。<br />77. 生活就像一部庸俗的法国文艺片，没有高潮，没有情色，连字幕都没有。<br />78. 生的伟大，死在花下！<br />79. 我的墓志铭：陪聊，提供夜间上门服务。<br />80. 带着一根烟，浪迹天涯。。。。。。<br />81. 我们最大的情敌，不是第三者，而是岁月<br />82. 我最想做你的一颗牙齿. 因为这样.至少 你没有我的时候.你会疼.<br />83. 看到成都把公交遇难人员定为凶手，上海方面非常羡慕，他们多么想说，那幢楼是被那个遇难工人推倒的。<br />84. 对你微笑，纯属礼貌<br />85. 地铁上的广告：挤吗？买辆车吧！出租车上的广告：堵吗？坐地铁吧！<br />86. 我允许你走进我的世界，但绝不允许你在我的世界里走来走去。<br />87. 生命是一朵千瓣莲花，既然我拒绝绽放，那么我也就同时拒绝了枯萎和零落<br />88. A: 我大姨妈刚走。 B：哦，最近车票不大好买吧？<br />89. 4年没见到老婆了，她去年给我生了个大胖小子&hellip;&hellip;真想回家看看啊。<br />90. 一北京人叹道：北京的地铁真挤，上周一孕妇被挤流产了。上海人不削的说：上海的地铁才叫挤，去年一少女被挤怀孕了。<br />91. 满以为我会死于肝癌，肺癌，胃癌或是口腔癌，不想医师告诉我已到了手癌晚期。<br />92. 一女的问我 ， 她长得怎么样。我说她很纯洁，就算活到一百岁也会是个处女。<br />93. &ldquo;回床率&rdquo;，这不得不说是个好词儿。<br />94. 像阴道般咧嘴笑起来。 &mdash;某翻译小说中的一句。<br />95. 答辩难度要视答辩老师头天晚上的性生活质量而定。<br />96. 今年的一切都不正常，惟独中国足球还算正常。<br />97. 就算是一坨屎，也有遇见屎壳郎的那天。所以你大可不必为今天的自己有太多担忧。<br />98. 要搞清楚自己人生的剧本――不是你父母的续集，不是你子女的前传，更不是你朋友的外篇。<br />99. 人又不聪明，还学别人秃顶。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/2009/" rel="tag">2009</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BB%258F%25E5%2585%25B8/" rel="tag">经典</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2590%2586%25E6%2580%25A7/" rel="tag">理性</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%258F%2598%25E6%2580%2581/" rel="tag">变态</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%25BD%2591%25E7%25BB%259C/" rel="tag">网络</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/644.htm</link>
<title><![CDATA[IETester终于支持Windows 7了]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Mon, 24 Aug 2009 07:56:18 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/644.htm</guid> 
<description>
<![CDATA[ 
	<div class="quote"><div class="quote-title">引用</div><div class="quote-content">Requirement : Windows 7, Windows Vista or Windows XP with IE7 (Windows XP/IE6 config has some problems and IE8 instance do not work under XP without IE7)</div></div><br/><a href="http://www.my-debugbar.com/ietester/install-ietester-v0.3.5.exe" target="_blank">http://www.my-debugbar.com/ietester/install-ietester-v0.3.5.exe</a><br/>在用户模式下，Flash在IE6中不能运行；解决方法：以管理员模式运行IETester。 <br/>在用户模式下，CSS Filters不能正常运行；解决方法：以管理员模式运行IETester。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/ie/" rel="tag">ie</a> , <a href="http://www.gaobo.info/go.php/tags/ietester/" rel="tag">ietester</a> , <a href="http://www.gaobo.info/go.php/tags/test/" rel="tag">test</a> , <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/643.htm</link>
<title><![CDATA[在64位Windows 7中使用IE]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sun, 23 Aug 2009 06:59:15 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/643.htm</guid> 
<description>
<![CDATA[ 
	经验教训就是：不要用64位的IE，用不带&ldquo;（64位）&rdquo;字样的快捷方式。<br />原因：64位的IE不稳定，不论是在Windows XP、Windows Vista还是Windows 7上，多开几个页面，再按Ctrl+W，马上失去响应，随之整个系统都卡死。而且，例如Adobe Flash Player这些浏览器插件在64位的IE上死活装不上。<br />切记！切记！<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/internet/" rel="tag">internet</a> , <a href="http://www.gaobo.info/go.php/tags/explorer/" rel="tag">explorer</a> , <a href="http://www.gaobo.info/go.php/tags/ie/" rel="tag">ie</a> , <a href="http://www.gaobo.info/go.php/tags/64/" rel="tag">64</a> , <a href="http://www.gaobo.info/go.php/tags/bit/" rel="tag">bit</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/642.htm</link>
<title><![CDATA[验证Windows 7的激活]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Sun, 23 Aug 2009 02:47:48 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/642.htm</guid> 
<description>
<![CDATA[ 
	方法一在&quot;运行&quot;里输入 slmgr.vbs -dli 并回车；<br />方法二.在&quot;运行&quot;里输入 slmgr.vbs -xpr 并回车；<br />方法三.在&quot;运行&quot;里输入 winver 并回车；<br />方法四.在&quot;运行&quot;里输入 slmgr.vbs -dlv 并回车；<br />方法五.右键我的电脑属性 查看是否处于激活状态.<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/windows/" rel="tag">windows</a> , <a href="http://www.gaobo.info/go.php/tags/7/" rel="tag">7</a> , <a href="http://www.gaobo.info/go.php/tags/activate/" rel="tag">activate</a> , <a href="http://www.gaobo.info/go.php/tags/activation/" rel="tag">activation</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25BF%2580%25E6%25B4%25BB/" rel="tag">激活</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/641.htm</link>
<title><![CDATA[用PHP程序实现支持页面后退的两种方法]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Mon, 17 Aug 2009 04:49:06 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/641.htm</guid> 
<description>
<![CDATA[ 
	<p>在开发过程中，往往因为表单出错而返回页面的时候填写的信息都不见了，为了支持页面回跳，可以通过两种方法实现。</p><p>第一，使用Header方法设置消息头Cache-control <br />header('Cache-control: private, must-revalidate');&nbsp; //支持页面回跳<br />第二，使用session_cache_limiter方法&nbsp;<br />//注意要写在session_start方法之前<br />session_cache_limiter('private, must-revalidate');</p><p><br />补充：<br />Cache-Control消息头域说明<br />Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached，响应消息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下：</p><p>&nbsp;&nbsp;&nbsp; Public指示响应可被任何缓存区缓存。</p><p>&nbsp;&nbsp;&nbsp; Private指示对于单个用户的整个或部分响应消息，不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息，此响应消息对于其他用户的请求无效。</p><p>&nbsp;&nbsp;&nbsp; no-cache指示请求或响应消息不能缓存</p><p>&nbsp;&nbsp;&nbsp; no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。</p><p>&nbsp;&nbsp;&nbsp; max-age指示客户机可以接收生存期不大于指定时间（以秒为单位）的响应。</p><p>&nbsp;&nbsp;&nbsp; min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。</p><p>&nbsp;&nbsp;&nbsp; max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值，那么客户机可以接收超出超时期指定值之内的响应消息。</p><p></p><p>关于表单刷新</p><p>问：为什么我在点击浏览器的后退按钮后，所有字段的信息都被清空了？</p><p>答：这是由于你在你的表单提交页面中使用了 session_start 函数。该函数会强制当前页面不被缓存。解决办法为，在你的 Session_start 函数后加入 header(&quot;Cache-control: private&quot;); 注意在本行之前你的PHP程序不能有任何输出。</p><p>补充：还有基于session的解决方法，在session_start前加上 <br />引用:<br />session_cache_limiter('nocache');// 清空表单<br />session_cache_limiter('private'); //不清空表单，只在session生效期间<br />session_cache_limiter('public'); //不清空表单，如同没使用session一般</p><p>可以在session_start();前加上 session_cache_limiter(&quot;private,max-age=10800&quot;);</p><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/http/" rel="tag">http</a> , <a href="http://www.gaobo.info/go.php/tags/cache/" rel="tag">cache</a> , <a href="http://www.gaobo.info/go.php/tags/session/" rel="tag">session</a> , <a href="http://www.gaobo.info/go.php/tags/header/" rel="tag">header</a> , <a href="http://www.gaobo.info/go.php/tags/%25E9%25A1%25B5%25E9%259D%25A2/" rel="tag">页面</a> , <a href="http://www.gaobo.info/go.php/tags/%25E5%2590%258E%25E9%2580%2580/" rel="tag">后退</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/640.htm</link>
<title><![CDATA[关于秩减少原理]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[异想火花]]></category>
<pubDate>Sun, 16 Aug 2009 12:47:11 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/640.htm</guid> 
<description>
<![CDATA[ 
	（文中人物为虚拟，请勿对号入座，谢谢。）<br /><br />&ldquo;快把你那屋子收拾下，乱的不成样了。&rdquo;他的母亲嗔道。<br /><br />他今年17岁，正在上高中。家里给他定的目标是国内数一数二的大学。他的功课也并不差，在同年级成百上千的同学中处于前列。他上的中学也是这座城市中名列前茅的，每年的升学率排名都在正数（shu，三声）1～3这个范围内出现。同时，他的家庭条件也算是中等，能够轻松供他读完学士硕士博士博士后烈士&hellip;&hellip;<br /><br />但是他这几天的注意力不在学习上。<br /><br />他在研究一样东西。<br /><br />秩。<br /><br />他给秩下的定义是：一件事物有序的程度。带标点符号一共10个汉字。他对秩有如下理解：<br />1、任何事物都有自己的秩。相同的事物（比如两本一样的书）的秩可能不同。<br />2、秩有大小，或称为高低。有序程度越高，秩越高；反之，越低。所有事物的秩的最小值无限趋近于0，但不等于0，取0的前提是这件事物不存在（已经不存在了或从未存在过）；无上限。<br />3、一件事物从无序到有序的过程，称为秩增（可表示为秩+（这个&ldquo;+&rdquo;是在右上角的，后边的&ldquo;-&rdquo;与此同）），反之称为秩减（可表示为秩-）。<br />4、秩是标量。<br />5、一件事物的秩是由对其产生作用的各种力（内、外）、场、能量，或其他任何能起作用的影响的共同叠加的结果。自然界对一件事物的秩的改变趋势总体来说是秩-（这一结论与热力学第二定律（熵增加原理）有异曲同工之妙）。<br />6、人类出于利己或某些其他目的或需要，以及一些动物或植物的本能，能够在一定程度上对事物的秩产生作用，这种作用不单包括自然科学范畴的内容，也包括社会科学的范畴。这种作用可能产生秩+或秩-。<br />7、根据5，对秩的研究秩是包括各种学科又独立于各种学科的一种科学，最接近的应该是数理化这些自然科学。<br />8、&hellip;&hellip;<br /><br />回到本文开头，他母亲这么平平常常的一句话就反映了他的屋子的秩的现状，也蕴含了秩-的过程和如果不进行干预可能会出现的更严重的后果。<br /><br />现在他唯一还没有结论的是，秩的计算。作为一种量，即便是无量纲的量，应当也是可以计算的，他这么想道。<br /><br />那么，秩如何计算？<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E7%25A7%25A9/" rel="tag">秩</a> , <a href="http://www.gaobo.info/go.php/tags/order/" rel="tag">order</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/639.htm</link>
<title><![CDATA[Why开设本栏目]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[异想火花]]></category>
<pubDate>Sun, 16 Aug 2009 12:27:37 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/639.htm</guid> 
<description>
<![CDATA[ 
	有时有一些思维跳跃产生的片段或流星，不记录下来过一会就忘记了。也许很晦涩，也许很穿越。
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/638.htm</link>
<title><![CDATA[存档：《狼》蒲松龄（原/白话文）]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[点点滴滴]]></category>
<pubDate>Fri, 14 Aug 2009 05:58:21 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/638.htm</guid> 
<description>
<![CDATA[ 
	原文： <br />一屠晚归，担中肉尽，止有剩骨。途中两狼，缀行甚远。 <br />屠惧，投以骨。一狼得骨止，一狼仍从。复投之，后狼止而前狼又至。骨已尽矣，而两狼之并驱如故。 <br />屠大窘，恐前后受其敌。顾野有麦场，场主积薪其中，苫蔽成丘。屠乃奔倚其下，弛担持刀。狼不敢前，眈眈相向。 <br />少时，一狼径去，其一犬坐于前。久之，目似瞑，意暇甚。屠暴起，以刀劈狼首，又数刀毙之。方欲行，转视积薪后，一狼洞其中，意将隧入以攻其后也。身已半入，止露尻尾。屠自后断其股，亦毙之。乃悟前狼假寐，盖以诱敌。 <br />狼亦黠矣，而顷刻两毙，禽兽之变诈几何哉？止增笑耳。<br /><br />白话文：<br />一个屠夫傍晚回家，担子里面的肉已经卖完，只有剩下的骨头。路上遇见两只狼，紧跟着走了很远。 <br />屠夫害怕了，把骨头扔给狼。一只狼得到骨头停下了。另一只狼仍然跟着他。屠夫又把骨头扔给狼，后面得到骨头的狼停下了，可是前面得到骨头的狼又赶到了。骨头已经扔完了。但是两只狼像原来一样一起追赶屠夫。 <br />屠夫非常困窘急迫，恐怕前后一起受到狼的攻击。屠夫看见田野里有一个打麦场，打麦场的主人把柴草堆积在打麦场里，覆盖成小山（似的）。屠夫于是跑过去靠在柴草堆的下面，放下担子拿起屠刀。两只狼不敢上前，瞪着眼睛朝着屠夫。 <br />一会儿，一只狼径直走开了，另一只狼像狗似的蹲坐在屠夫的前面。时间长了，那只狼的眼睛好像闭上了，神情悠闲得很。屠夫突然跳起，用刀砍狼的脑袋，又连砍几刀把狼杀死。屠夫刚想要走，转身看见柴草堆的后面，另一只狼正在柴草堆里打洞，打算要钻洞进去，来攻击屠夫的后面。身子已经钻进去了一半，只露出屁股和尾巴。屠夫从狼的后面砍断了狼的大腿，也把狼杀死了。屠夫这才明白前面的那只狼假装睡觉，原来是用这种方式来诱惑敌方。 <br />狼也太狡猾了，可是一会儿两只狼都被杀死了，禽兽的欺骗手段能有多少呢？只给人们增加笑料罢了。<br/>Tags - <a href="http://www.gaobo.info/go.php/tags/%25E7%258B%25BC/" rel="tag">狼</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%2592%25B2%25E6%259D%25BE%25E9%25BE%2584/" rel="tag">蒲松龄</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%2596%2587%25E8%25A8%2580%25E6%2596%2587/" rel="tag">文言文</a> , <a href="http://www.gaobo.info/go.php/tags/%25E7%2599%25BD%25E8%25AF%259D%25E6%2596%2587/" rel="tag">白话文</a>
]]>
</description>
</item><item>
<link>http://www.gaobo.info/read.php/637.htm</link>
<title><![CDATA[汉字的正则表达式]]></title> 
<author>Doctor &lt;gregry@cqut.edu.cn&gt;</author>
<category><![CDATA[PHP&amp;DB&amp;...]]></category>
<pubDate>Thu, 13 Aug 2009 13:24:26 +0000</pubDate> 
<guid>http://www.gaobo.info/read.php/637.htm</guid> 
<description>
<![CDATA[ 
	一个程序需要用到验证用户的输入全为汉字，找了下，发现了汉字的正则表达式：<br/><div class="code">/^(&#91;&#92;x00-&#92;x7F&#93;&#124;&#91;&#92;x80-&#92;xFE&#93;&#91;&#92;x40-&#92;x7E&#92;x80-&#92;xFE&#93;)&#123;30&#125;/</div><br/>PHP Code：<br/><div class="code">$str = &quot;测试汉字&quot;;<br/>if(preg_match(&quot;/^&#91;&quot;.chr(0xa1).&quot;-&quot;.chr(0xff).&quot;&#93;+$/&quot;, $str)) &#123;<br/>echo &quot;这是一个纯中文字符串&quot;;<br/>&#125; else &#123;<br/>echo &quot;这不是一个纯中文字串&quot;;<br/>&#125;</div><br/>Tags - <a href="http://www.gaobo.info/go.php/tags/php/" rel="tag">php</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25B1%2589%25E5%25AD%2597/" rel="tag">汉字</a> , <a href="http://www.gaobo.info/go.php/tags/%25E6%25AD%25A3%25E5%2588%2599/" rel="tag">正则</a> , <a href="http://www.gaobo.info/go.php/tags/%25E8%25A1%25A8%25E8%25BE%25BE%25E5%25BC%258F/" rel="tag">表达式</a>
]]>
</description>
</item>
</channel>
</rss>