<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>Topiemie's Blog</title>
<link>http://blogger.org.cn/blog/blog.asp?name=topiemie</link>
<description>二休的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[SmartPhone 2003 手机编程实战之一：简单上手     选择自 hxhbluestar 的 Blog]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1719</link>
<author>topiemie</author>
<pubDate>2005/1/10 8:48:36</pubDate>
<description><![CDATA[<a>　<span id="ArticleContent1_ArticleContent1_lblContent">
<p>SmartPhone 2003 手机编程实战之一：简单上手</p>
<p>今天买了一款 
多普达565的智能手机，加上了128M的MiniSD卡，基本可以满足编程的需求了，便随手写了一个最简单的HelloWord，并到手机上调试(部署到菜单中暂时没有实现)。</p>
<p><strong>一、基本配置<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC环境：Windows XP SP1，VS.NET 2003 企业版，.NET 
Framework 1.1 SP1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmartPhone环境：Microsoft SmartPhone 2003 SE 
第二版（含.NET1.1，部署的时候会被强行装上 .NET Framework 1.1 SP1）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASYNC：Microsoft 
ActiveSync 3.7.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><strong>二、SDK的安装</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须安装的软件(如下软件都是微软提供免费下载和使用的)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
1、Microsoft ActiveSync 3.7.1 (最新版本Microsoft ActiveSync 
3.8出来了，可以到摘要的页面中去找链接下载，这个我还没有试过)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载网址：<a href="http://www.microsoft.com/windowsmobile/downloads/activesync37.mspx">http://www.microsoft.com/windowsmobile/downloads/activesync37.mspx</a>，里面有中文版本，或者，在手机附带的微软光盘里面有安装程序；<br>作用：同步手机和PC机数据的程序</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、Microsoft SMARTPHONE 2003 SDK.msi<br>下载网址：<br><a href="http://download.microsoft.com/download/e/3/1/e310bb99-2f33-4d79-bb8a-41d9cb3c79b4/Microsoft">http://download.microsoft.com/download/e/3/1/e310bb99-2f33-4d79-bb8a-41d9cb3c79b4/Microsoft</a> 
SMARTPHONE 2003 SDK.msi<br>&nbsp;这个是开发Microsoft SMARTPHONE 2003第二版 应用程序 
所需要使用的SDK包<br>&nbsp;Overview<br>The Smartphone 2003 SDK enables application 
development for the newest Smartphone development platform. The Smartphone 2003 
SDK enables developers to:<br>&#8226;&nbsp;Develop .NET applications for devices: The 
Microsoft&#174; .NET Compact Framework is in ROM in Windows Mobile 2003-based 
Smartphones and enables a whole new host of benefits for developers, such as 
rapid application development, native XML Web services support, enterprise class 
connectivity and performance, and IDE support from Microsoft Visual Studio&#174; .NET 
2003. <br>&#8226;&nbsp;Leverage new core Operating System: Windows Mobile 2003-based 
Smartphones, like 2003-based Pocket PCs, run on Windows CE .NET 4.2, enhancing 
APIs and overall programmability. <br>&#8226;&nbsp;Develop, test and deploy applications 
faster: The emulation environment is more robust and now supports Windows Mobile 
2003-based Smartphones with support for radio. The emulator also offers new 
features, including drive mapping, GAPI support and performance improvements. In 
addition, the new application security model includes a “prompt” mode.</p>
<p><br>3、MobileAppDevToolkit2004.exe<br>下载地址：忘记在哪里了，还要找找<br>作用：这个是用来安装模拟器的，如果没有手机调试，可以在模拟器上调试<br>&nbsp;<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/hxhbluestar/85507/r_smartphone.jpg" align="bottom" border="0" hspace="0"><br><strong>三、写一个Hello World</strong></p>
<p>所有以上程序安装好以后，就可以开始编写在智能上运行的程序了。<br>1、打开VS.NET2003，然后新建项目，选择“智能设备应用程序”：<br>&nbsp;<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/hxhbluestar/85507/r_smartphone-2.jpg" align="bottom" border="0" hspace="0"><br>2、选择“SmartPhone”－“Windows应用程序”<br>&nbsp;<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/hxhbluestar/85507/r_smartphone-3.jpg" align="bottom" border="0" hspace="0"><br><br>3、在面板上托放一个PictureBox和一个Label<br><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/hxhbluestar/85507/r_smartphone-4.jpg" align="bottom" border="0" hspace="0">&nbsp;<br>呵呵，这可以说是一个最最简单的HelloWorld程序吧：）</p>
<p>4、F5运行，会出现如下对话框<br>&nbsp;<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/hxhbluestar/85507/r_smartphone-5.jpg" align="bottom" border="0" hspace="0"><br>如果没有手机的话，就选择第二个默认，我今天刚买的新机，所以就选了<br>“Smartphone 
Device”了：D</p>
<p>5、点击“部署”，我的手机上便会提示“此程序不被信任，是否继续执行？”，选择“继续”，如果是第一次运行，会更新 .NET Framework 
Compact ，保持和PC机器版本一致(.NET Framework SP1，我的机器上出现如下提示：“警告：在安装Microsoft .NET CF 1.0 
ENU-String Resource 的新版本之前，其以前的版本将被删除。”)，部署需要几分钟时间，要有耐心等候。</p>
<p>部署成功后，过10秒钟左右，手机屏幕上就会显示最终的程序运行状况了，呵呵，很简单吧：）<br>当然，还只是初步的尝试一下，而且中间省略了一些手机上显示的信息（少了一个数码相机：） 
），如果有了很多编写Windows 应用程序的经验，相信你会马上开始编写复杂实用的程序来的。</p>
<p>&nbsp;</p>
<p>&nbsp;</p></span><br>

</a>
<div style="font-size: 14px; line-height: 25px;"><strong>作者Blog：</strong><a id="ArticleContent1_ArticleContent1_AuthorBlogLink" href="http://blog.csdn.net/hxhbluestar/" target="_blank">http://blog.csdn.net/hxhbluestar/</a></div>
]]></description>
</item><item>
<title><![CDATA[软件开发过程规范]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1660</link>
<author>topiemie</author>
<pubDate>2005/1/7 22:10:09</pubDate>
<description><![CDATA[
<P>软件开发过程规范<BR>第一部分 概述<BR>1&nbsp;目的<BR>本规范的目的是使整个软件产品开发阶段清晰，要求明确，任务具体，便于规范化、系统化及工程化，有利于提高软件生命周期的控制及管理，提高所开发软件的质量，缩短开发时间，减少开发和维护费用，使软件开发活动更科学、更有成效。<BR>2&nbsp;适用范围<BR>本规范适用于公司范围内所有以正式的项目形式进行的软件产品的开发；不包括需求获取、现场调试等内容。<BR>本规范分为两个部分：技术过程规范和管理过程规范，分别适用于软件开发过程中的技术性活动和管理性活动。<BR>3&nbsp;过程模型<BR>本规范所采用的软件开发过程模型为裁剪的RUP开发过程模型。<BR>4&nbsp;环境<BR>建模语言<BR>&nbsp;&nbsp;&nbsp; 采用UML作为建模语言<BR>建模工具<BR>&nbsp;&nbsp;&nbsp; 采用Rational Rose作为建模工具<BR>配置管理工具<BR>&nbsp;&nbsp;&nbsp; 采用SourceSafe/Cvs作为配置管理工具，由项目经理根据具体情况自行决定。<BR>变更和缺陷管理工具<BR>&nbsp;&nbsp;&nbsp; 采用ClearQuest作为变更和缺陷管理工具<BR>需求管理工具<BR>&nbsp;&nbsp;&nbsp; 采用RequisitePro作为需求管理工具<BR>单元测试工具<BR>&nbsp;&nbsp;&nbsp; 推荐使用Purify、Quantitify、PurifyCovervage、BoundChecker等工具，具体选择何种工具由项目经理自行决定。<BR>引用规范<BR>&nbsp;&nbsp;&nbsp; 《C++编码规范》<BR>指南<BR>&nbsp;&nbsp;&nbsp; 《需求建模指南》、《分析指南》、《设计指南》、《实现建模指南》、《数据库建模指南》<BR>5&nbsp;角色划分与组织机构<BR>&nbsp;&nbsp;&nbsp; 软件过程的每一个活动都由具体的角色执行；本过程所涉及的角色和组织机构及其职责如下：<BR>系统分析员<BR>&nbsp;&nbsp;&nbsp; 管理需求<BR>&nbsp;&nbsp;&nbsp; 查找参与者和用例<BR>&nbsp;&nbsp;&nbsp; 确定性能要求<BR>&nbsp;&nbsp;&nbsp; 建立用例模型结构<BR>用例工程师<BR>&nbsp;&nbsp;&nbsp; 详细说明用例<BR>&nbsp;&nbsp;&nbsp; 详细说明软件需求<BR>&nbsp;&nbsp;&nbsp; 用例分析<BR>&nbsp;&nbsp;&nbsp; 用例设计<BR>需求复审员<BR>&nbsp;&nbsp;&nbsp; 复审需求<BR>用户界面设计员<BR>&nbsp;&nbsp;&nbsp; 设计用户界面原型<BR>&nbsp;&nbsp;&nbsp; 确定边界类<BR>&nbsp;&nbsp;&nbsp; * 一般界面设计员不参与界面部分的实现<BR>构架设计师<BR>&nbsp;&nbsp;&nbsp; 确定需求优先级<BR>&nbsp;&nbsp;&nbsp; 构架分析<BR>&nbsp;&nbsp;&nbsp; 构架设计<BR>&nbsp;&nbsp;&nbsp; 构架实现<BR>&nbsp;&nbsp;&nbsp; 制定和组织学习编码规范<BR>设计员<BR>&nbsp;&nbsp;&nbsp; 类的设计<BR>&nbsp;&nbsp;&nbsp; 子系统设计<BR>&nbsp;&nbsp;&nbsp;&nbsp; 数据库设计员<BR>&nbsp;&nbsp;&nbsp; 生成数据模型<BR>设计复审员<BR>&nbsp;&nbsp;&nbsp; 复审设计<BR>&nbsp;&nbsp;&nbsp; 构架复审员<BR>&nbsp;&nbsp;&nbsp; 复审构架<BR>程序员<BR>&nbsp;&nbsp;&nbsp; 实现构件<BR>&nbsp;&nbsp;&nbsp; 调试<BR>&nbsp;&nbsp;&nbsp; 单元测试<BR>&nbsp;&nbsp;&nbsp; 实现测试<BR>&nbsp;&nbsp;&nbsp; 开发安装软件<BR>代码复审员<BR>&nbsp;&nbsp;&nbsp; 复审代码（该角色可以由技术监督小组成员兼任）<BR>测试员<BR>&nbsp;&nbsp;&nbsp; 制定测试计划<BR>&nbsp;&nbsp;&nbsp; 设计测试<BR>&nbsp;&nbsp;&nbsp; 执行测试<BR>&nbsp;&nbsp;&nbsp; 评估测试<BR>配置管理员<BR>&nbsp;&nbsp;&nbsp; 建立变更控制流程<BR>&nbsp;&nbsp;&nbsp; 复审变更请求<BR>&nbsp;&nbsp;&nbsp; 确认重复或拒绝的变更请求<BR>&nbsp;&nbsp;&nbsp; 管理基线<BR>流程工程师<BR>&nbsp;&nbsp;&nbsp; 编制开发案例<BR>&nbsp;&nbsp;&nbsp; 启用开发案例<BR>项目经理<BR>&nbsp;&nbsp;&nbsp; 制定软件开发计划<BR>&nbsp;&nbsp;&nbsp; 制定迭代计划<BR>&nbsp;&nbsp;&nbsp; 制定风险管理计划<BR>&nbsp;&nbsp;&nbsp; 协调项目运行<BR>项目复审与变更控制委员会<BR>&nbsp;&nbsp;&nbsp; 该委员会是负责监督项目和控制变更的行政管理团队；在执行复审任务时，可由该委员会主席指派专人（项目复审员）负责。<BR>建议该委员会由项目经理、构架设计师、需求提供方及有项目审批权限的3~5人组成，其中主席一职应当在需求和技术方面都有一定权威性。主席根据实际需要召开会议评估变更请求，对项目进行审批和项目计划复审。<BR>该委员会有三个基本任务：<BR>变更控制<BR>明确产品的基线、复审对基线的变更、最后批准、否决变更或延期执行。由他们批准对已建立基线的配置项的所有变更。该团队的目的在于确保所有提出的变更都得到了妥善的技术分析与复审，并已记录备查。<BR>项目审批与计划复审<BR>项目审批；项目计划复审；迭代计划复审。<BR>验收复审<BR>迭代验收复审；生命周期里程碑复审；项目验收复审；</P>
<P>技术监督小组<BR>&nbsp;&nbsp;&nbsp; 与项目经理一起监控小组技术状态，建议每周由研发人员轮流执行技术小组组长职责，定期负责召开技术讨论会，审查上周进展情况及技术状态（软件模型完整性、代码规范性等内容），讨论本周工作计划、技术问题等内容并监督各规范的执行情况。<BR><BR>6&nbsp;制品<BR>该部分列出了工作流程所涉及的制品及这些制品的格式。（该部分的表格不太容易画，若有需要该部分的同志，可以向我索取<A href="mailto:ZXHSCOTT@SINA.COM">ZXHSCOTT@SINA.COM</A>）<BR>(第一部分结束)<BR></P>
<P>第二部分 管理过程规范<BR>&nbsp;管理规程规范分为两个部分：项目管理过程规范、配置与变更管理过程规范。<BR>7&nbsp;项目管理过程规范<BR>7.1&nbsp;过程概述<BR>项目管理过程如下图所示<BR>&nbsp;&nbsp; <IMG alt="" hspace=0 src="file:///E:/软工/1.JPG" align=baseline border=0><BR>管理过程贯穿于软件开发过程的始终，它也随着开发过程的迭代进行自身的迭代。<BR>7.2&nbsp;项目准备7.3&nbsp;<BR>7.3.1&nbsp;概述<BR>项目准备活动在软件开发过程中只进行一次，即在项目初始阶段的第一个迭代中，而且它是最早进行的活动。<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/2.JPG" align=baseline border=0><BR>7.3.2&nbsp;确定并评估风险<BR>执行角色<BR>项目经理<BR>活动描述<BR>项目经理&nbsp;确定潜在的风险，分析风险、确定风险的优先级并制定风险规避和降低策略，填写《风险列表》；<BR>制品<BR>《风险列表》（草拟）<BR>7.3.3&nbsp;启动项目<BR>执行角色<BR>项目经理<BR>活动描述<BR>指派项目复审与变更控制委员会成员； <BR>由项目复审与变更控制委员会正式任命项目经理；<BR>指派项目计划团队（项目计划团队是将要执行先启阶段工作的项目团队初始成员。计划团队由项目经理和项目复审与变更控制委员会共同确定、批准和指派。通常，项目计划团队可能会包括项目经理、构架设计师、系统分析员、开发负责人、测试负责人、配置管理员、领域专家）；<BR>已正式或非正式的形式规定技术监督小组及组长的任命规则；<BR>批准项目验收标准，对于有明确合同要求的软件项目，合同的要求可以作为验收标准；<BR>由以上内容形成《软件开发计划》的“组织结构”部分；<BR>制定用于初始阶段的第一次迭代的迭代计划，形成《迭代计划》；<BR>制品<BR>《软件开发计划》初稿；<BR>初始阶段第一次迭代的《迭代计划》。<BR>7.3.4&nbsp;定义项目组织与人员配备7.3.5&nbsp;<BR>执行角色<BR>项目经理<BR>活动描述<BR>项目经理决定项目组的梯次，即管理、需求、分析设计、质量保证等，并决定每个梯次所需的角色和职责。对于规模较小的项目，项目经理可以直接定义所需人员的数量、人员的技能，将该部分内容写入《软件开发计划》的“人员配备计划”部分。<BR>制品<BR>更新的《软件开发计划》；<BR>7.3.6&nbsp;制定质量保证计划<BR>执行角色<BR>项目经理<BR>活动描述<BR>确保制定了项目的质量目标（项目经理部需要制订质量目标，但应确保已经由该目标存在）；<BR>确定质量保证角色与职责；<BR>确定质量保证任务与时间表，质量保证活动主要指各种复审，即计划复审和验收复审；<BR>形成《质量保证计划》；<BR>制品<BR>《质量保证计划》；<BR>7.3.7&nbsp;计划阶段和迭代<BR>执行角色<BR>项目经理<BR>活动描述<BR>定义项目阶段里程碑；<BR>定义里程碑目标；<BR>定义阶段内迭代的数量、长度和目标（确定将为每个项目阶段安排多少次迭代、确定分配给各次迭代的相对工作量、确定每次迭代的目标）；<BR>改进里程碑日期和规模（根据在先启阶段结束时获得的信息来对估计加以改进）；<BR>确定项目资源需求（确定角色及数量），定义该项目所需的资源数量和类型（按阶段/迭代分配）；<BR>根据以上内容更新《软件开发计划》。</P>
<P>制品<BR>更新的《软件开发计划》；<BR>7.3.8&nbsp;制定软件开发计划<BR>执行角色<BR>项目经理<BR>活动描述<BR>根据以上内容形成《软件开发计划》。</P>
<P>制品<BR>更新的《软件开发计划》；<BR>7.3.9&nbsp;编制开发案例<BR>执行角色<BR>流程工程师<BR>活动描述<BR>根据项目的性质、进度要求等形成《开发案例》；<BR>制品<BR>《开发案例》<BR>7.3.10&nbsp;项目计划复7.3.11&nbsp;审<BR>执行角色<BR>项目复审员<BR>活动描述<BR>安排召开项目计划复审会议的时间；<BR>分发会议材料（风险列表、软件开发计划）；<BR>召开项目计划复审会议；<BR>根据复审会议的决定形成《复审记录》。<BR>制品<BR>《复审记录》<BR>7.4&nbsp;计划下一次迭代<BR>7.4.1&nbsp;概述<BR>对下一次迭代进行规划。<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/3.JPG" align=baseline border=0><BR>7.4.2&nbsp;计划下一次迭代<BR>执行角色<BR>项目经理<BR>活动描述<BR>确定迭代的范围，即确定哪些用例需要优先实现、哪些非功能要求需要优先考虑；<BR>定义迭代活动，即根据以上确定的范围确定要执行的活动集（核心工作流中的那些部分）；<BR>确定该次迭代要产生的制品；<BR>将这些职责与人员对应；<BR>形成《迭代计划》；</P>
<P>制品<BR>《迭代计划》<BR>7.4.3&nbsp;制定软件开发计划<BR>执行角色<BR>项目经理<BR>活动描述<BR>改进里程碑日期和规模，制定更准确的阶段计划（要考虑已确定的用例数量、已确定的用例复杂性、已确定的风险等）；<BR>制品<BR>更新的《软件开发计划》；<BR>*注：该活动并非必需的<BR>7.5&nbsp;管理迭代<BR>7.5.1&nbsp;概述<BR>进行迭代日常的管理。<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/4.JPG" align=baseline border=0><BR><BR>7.5.2&nbsp;人员配备7.5.3&nbsp;<BR>执行角色<BR>项目经理<BR>活动描述<BR>将人员与角色对应；<BR>任命技术监督小组组长和其他组员；<BR>将对应关系写入《软件开发计划》的“人员配备”部分；<BR>制品<BR>更新的《软件开发计划》；<BR>7.5.4&nbsp;启动迭代<BR>执行角色<BR>项目经理<BR>活动描述<BR>将人员分配给工作包；<BR>获取并分配非人员资源（例如工位、计算机等）；<BR>发出工作单；<BR>制品<BR>《工作单》；<BR>7.5.5&nbsp;评估迭代<BR>执行角色<BR>项目经理<BR>活动描述<BR>评估迭代结果，检验是否已实现迭代目标，书写《迭代评估》；<BR>考虑外部变更，拟定《变更请求》；<BR>制品<BR>《变更请求》；<BR>7.5.6&nbsp;迭代验收复7.5.7&nbsp;审<BR>执行角色<BR>项目复审员<BR>活动描述<BR>安排召开项目计划复审会议的时间；<BR>分发会议材料（风险列表、软件开发计划）；<BR>召开项目计划复审会议；<BR>根据复审会议的决定形成《复审记录》。<BR>制品<BR>《复审记录》；<BR>7.6&nbsp;监测与控制项目<BR>7.6.1&nbsp;概述<BR>该活动主要是监控项目变更，处理变更请求；并非所有的变更都需要正式向项目复审与变更控制委员会提交并复审；一般影响较小的变更，比如轻微缺陷的修复可以由项目经理直接决定。<BR><IMG alt="" hspace=0 src="file:///E:/软工/5.JPG" align=baseline border=0><BR>7.6.2&nbsp;检测项目状态<BR>执行角色<BR>项目经理<BR>活动描述<BR>根据《迭代计划》和《软件开发计划》对项目的状态（包括进展、风险化解情况等）进行检测，并通过各种方式向项目复审员汇报。<BR>制品<BR>无；<BR>7.6.3&nbsp;安排和分配工作<BR>执行角色<BR>项目复审员<BR>活动描述<BR>将变更请求分配到迭代（一般重要的扩展请求会被延期到下一个迭代甚至更迟的迭代中，而缺陷修复一般在本次迭代中完成）；<BR>分配职责；<BR>说明工作和预期结果；<BR>制定时间表；<BR>如果必要，修改当前迭代计划，并在软件开发计划中反映出对将来迭代的影响；<BR>发出工作单；<BR>制品<BR>《工作单》；<BR>7.7&nbsp;确定并评估风险<BR>执行角色<BR>项目经理<BR>活动描述<BR>项目经理&nbsp;确定潜在的风险，分析风险、确定风险的优先级并制定风险规避和降低策略，填写《风险列表》。<BR>制品<BR>《风险列表》（更新）<BR>7.8&nbsp;阶段收尾<BR>7.8.1&nbsp;概述<BR>该活动仅在阶段收尾时执行。<BR>&nbsp;<BR>7.8.2&nbsp;为阶段收尾做准备7.8.3&nbsp;<BR>执行角色<BR>项目经理<BR>活动描述<BR>检查所需工件的状态；<BR>向涉众交付制品（具体制品见“附录一 项目里程碑”）；<BR>制品<BR>《软件开发计划》（交付）；<BR>《状态评估》（最近的迭代形成的，交付）；<BR>《迭代评估》（最近的迭代形成的，交付）；<BR>7.8.4&nbsp;生命周期里程碑复7.8.5&nbsp;审<BR>执行角色<BR>项目复审员<BR>活动描述<BR>安排生命周期里程碑复审会议日程；<BR>分发会议材料；<BR>召开生命周期里程碑会议；<BR>记录决定；<BR>制品<BR>《复审记录》；<BR>7.9&nbsp;项目收尾<BR>7.9.1&nbsp;概述<BR>该活动仅在项目收尾时执行。<BR>&nbsp;<BR>7.9.2&nbsp;为项目收尾作准备7.9.3&nbsp;<BR>执行角色<BR>项目经理<BR>活动描述<BR>为活动安排时间表，此时间安排表应包含在软件开发计划中；<BR>进行项目事后检查复审；<BR>完成验收操作项；<BR>项目收尾；<BR>制品<BR>《软件开发计划》（交付）；<BR>《状态评估》（最近的迭代形成的，交付）；<BR>《迭代评估》（最近的迭代形成的，交付）；<BR>7.9.4&nbsp;项目验收复7.9.5&nbsp;审<BR>执行角色<BR>项目复审员<BR>活动描述<BR>安排项目验收复审会议的日程；<BR>分发会议材料；<BR>召开项目验收复审会议；<BR>记录决定；<BR>制品<BR>《复审记录》；<BR>8&nbsp;配置与变更管理过程规范<BR>8.1&nbsp;过程概述<BR>配置与变更管理过程如下图所示，其中前两个活动，即“计划项目配置与变更控制”和“创建项目CM环境” 主要在项目开发开始时调用，其他工作流程根据软件开发生命周期的进展情况进行调用。<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/6.JPG" align=baseline border=0><BR><BR>8.2&nbsp;计划项目配置与变更控制<BR>8.2.1&nbsp;概述<BR><IMG alt="" hspace=0 src="file:///E:/软工/7.JPG" align=baseline border=0><BR><BR><BR>8.2.2&nbsp;制定CM策略<BR>执行角色<BR>配置管理员<BR>活动描述<BR>确定配置标识方法；<BR>确定建立基线方法：建立基线的里程碑、建立基线标记；<BR>确定产品目录结构；<BR>确定备份保存方法；<BR>确定配置状态报告需求：选择基于变更请求的报告、确定报告频率；<BR>制品<BR>无。<BR>8.2.3&nbsp;建立变更控制流程<BR>执行角色<BR>配置管理员<BR>活动描述<BR>建立变更请求流程：<BR>（1）完成变更请求单，提交变更请求<BR>（2）分析、评估变更请求<BR>（3）分配角色解决变更请求<BR>（4）保存变更历史记录<BR>制定变更复审通知协议；<BR>制品<BR>《配置管理计划》。<BR>8.2.4&nbsp;编写CM计划<BR>执行角色<BR>配置管理员<BR>活动描述<BR>编写CM计划；<BR>复审并批准CM计划；<BR>维护CM计划；<BR>制品<BR>《配置管理计划》。<BR>8.3&nbsp;创建项目CM环境<BR>8.3.1&nbsp;概述<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/8.JPG" align=baseline border=0><BR><BR>8.3.2&nbsp;设置CM环境<BR>执行角色<BR>配置管理员<BR>活动描述<BR>编设置硬件环境；<BR>根据配置管理计划在项目储存库上建立产品目录结构；<BR>制品<BR>项目储存库。<BR>8.3.3&nbsp;创建集成工作区<BR>执行角色<BR>配置管理员<BR>活动描述<BR>在配置管理员设置好项目储存库后，创建集成工作区；<BR>制品<BR>集成工作区。<BR>8.4&nbsp;交付与变更配置项<BR>8.4.1&nbsp;概述<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/9.JPG" align=baseline border=0><BR><BR>8.4.2&nbsp;创建开发工作区<BR>执行角色<BR>任意角色<BR>活动描述<BR>任意角色在开始进行自己的日常工作前，应该在设置好的项目储存库上创建自己的开发工作区；<BR>制品<BR>开发工作区。<BR>8.4.3&nbsp;进行日常开发<BR>执行角色<BR>任意角色<BR>活动描述<BR>根据项目经理分配的工作单在自己的开发工作区上进行日常开发与变更工作，这些工作包括：检出、检入、添加、交付、更新工作区；<BR>制品<BR>更新的开发工作区。<BR>8.4.4&nbsp;交付开发<BR>执行角色<BR>任意角色<BR>活动描述<BR>完成分配工作单上工作内容后，向集成工作区交付开发（变更）内容，这些工作包括：从开发工作区检出，并检入到集成工作区、通知其他人员；<BR>制品<BR>更新的集成工作区。<BR>8.4.5&nbsp;更新开发工作区<BR>执行角色<BR>任意角色<BR>活动描述<BR>根据配置管理员的通知，从集成工作区check out其他人员的工作内容更新自己的开发工作区；<BR>制品<BR>更新的开发工作区。<BR>8.4.6&nbsp;建立基线<BR>执行角色<BR>配置管理员<BR>活动描述<BR>根据任意角色交付的已完成工作单，从开发工作区check in他的工作内容到集成开发工作区，<BR>并建立基线，同时通知其他人员更新自己的开发工作区；<BR>制品<BR>基线。<BR>8.4.7&nbsp;晋升基线<BR>执行角色<BR>配置管理员<BR>活动描述<BR>当产品达到一定的成熟度、稳定性或质量级别，或某个里程碑，集成员与项目经理协商后可以晋升产品基线，这些工作包括：确定基线标记、在集成工作区晋升基线；<BR>制品<BR>基线。</P>
<P>8.5&nbsp;管理基线与发布<BR>8.5.1&nbsp;概述<BR><IMG alt="" hspace=0 src="file:///E:/软工/10.JPG" align=baseline border=0><BR><BR>建立基线和晋升基线同上。<BR>8.5.2&nbsp;创建部署单元<BR>执行角色<BR>配置管理员<BR>活动描述<BR>配置管理员根据材料清单所列出的可交付工件从项目储存库中创建工件的拷贝；<BR>配置管理员在项目储存库中对可交付工件建立或晋升基线；<BR>制品<BR>部署单元。<BR>8.6&nbsp;审核报告配置状态<BR>8.6.1&nbsp;概述<BR><BR><IMG alt="" hspace=0 src="file:///E:/软工/11.JPG" align=baseline border=0><BR><BR>8.6.2&nbsp;报告配置状态<BR>执行角色<BR>配置管理员<BR>活动描述<BR>根据配置管理计划中规定阶段和时间报告统计项目储存库中配置项状态的变化，并给出量化的配置报告（可以由ClearQuest直接生成）；<BR>制品<BR>《配置状态报告》。<BR>8.6.3&nbsp;执行配置审核<BR>执行角色<BR>配置管理员<BR>活动描述<BR>物理配置审核：<BR>准备一份开发案例中给出的所有工件的列表<BR>审核产品目录结构包含每一个工件<BR>报告结果<BR>功能配置审核：<BR>列出产品功能<BR>审核每项功能是否都有一个测试结果<BR>报告结果<BR>制品<BR>《配置审核结果》。<BR>8.7&nbsp;管理变更请求<BR>8.7.1&nbsp;概述<BR><IMG alt="" hspace=0 src="file:///E:/软工/12.JPG" align=baseline border=0><BR><BR>&nbsp;&nbsp;变更会对项目项目产生影响，尤其是扩展性的变更以及需求的其他变更往往会对项目产生较大的影响。当这种变更出现时应当严格遵循该过程。较小的变更，尤其一些修复性的变更，项目经理可以自行组织处理。<BR>8.7.2&nbsp;提交变更请求<BR>执行角色<BR>任意角色<BR>活动描述<BR>完成变更请求单<BR>提交变更请求，变更请求单状态为已提交<BR>制品<BR>《变更请求单》（已提交）。<BR>8.7.3&nbsp;更新变更请求<BR>执行角色<BR>任意角色<BR>活动描述<BR>接收变更请求表单（已重复或已拒绝）<BR>更新并重新提交变更请求<BR>制品<BR>《变更请求单》（已更新）。<BR>8.7.4&nbsp;复8.7.5&nbsp;审变更请求<BR>执行角色<BR>项目复审与变更控制委员会<BR>活动描述<BR>准备要复审的变更需求；<BR>安排召开复审会议的时间；<BR>复审已提交的变更请求；<BR>制品<BR>《变更请求单》（已复审）。<BR>8.7.6&nbsp;确认重复8.7.7&nbsp;活拒绝的变更请求<BR>执行角色<BR>项目复审与变更控制委员会<BR>活动描述<BR>准备经复审怀疑认为重复或已拒绝的变更请求；<BR>指定CCB代表确认重复或拒绝的变更请求；<BR>更新变更请求状态：<BR>（1）已确认重复或拒绝的变更请求应该关闭，同时通知变更请求提交者；<BR>（2）要求提交者提供更多信息，或更新变更请求信息，说明不是重复或拒绝的理由，重新提交以备CCB复审；<BR>制品<BR>《变更请求单》（已拒绝）。</P>
<DIV class=postText>
<P>第三部分技术过程规范</P>
<P>本规范中将软件开发的整个技术过程分为五个顺序实施的工作流程，分别为需求、分析、设计、实现和测试。在一次迭代过程中，这五个工作流程从总体上是顺序的，但彼此之间又存在交叉和重叠。<BR>9&nbsp;需求</P>
<P>&nbsp;<BR>9.1&nbsp;管理需求<BR>执行角色<BR>系统分析员<BR>活动描述<BR>通过访谈、问卷、审阅合同等形式收集用户需求；<BR>通过走查等非正式形式评估需求收集结果，确保无需求重复、不一致、不清晰等问题；<BR>*对于需求的变更请求，此时的变更请求应当已经过变更控制与项目复审委员会复审，可直接作为正式的需求；<BR>在模型元素与需求之间建立可追踪性链接；<BR>建立需求属性；<BR>制品<BR>需求集；<BR>9.2&nbsp;查找参与者和用例<BR>执行角色<BR>系统分析员<BR>活动描述<BR>命名并简述已发现的主角；<BR>命名并简述已发现的用例，概述事件流并收集非功能性需求（记录在《增补需求》中）；<BR>形成用例模型（描述用例间的关系并将参与者和用例打包）；<BR>制品<BR>用例模型（概要的）；<BR>《增补需求》；<BR>9.3&nbsp;排列用例优先顺序<BR>执行角色<BR>构架设计师<BR>活动描述<BR>一般根据用例的重要性、风险来确定用例优先级；优先级可用数字表示，该数字表示该用例在那一次迭代中实现；优先级也可以用关键、重要、辅助等级来表示；<BR>制品<BR>用例模型（更新的）；<BR>9.4&nbsp;详细说明用例<BR>执行角色<BR>用例工程师<BR>活动描述<BR>建模某用例与其他用例、用例与参与者的关系；<BR>详细说明用例事件流；<BR>制品<BR>用例（详细说明的）；<BR>《SRS》；<BR>9.5&nbsp;原型化用户界面<BR>执行角色<BR>用户界面设计员<BR>活动描述<BR>用各种界面元素形成用户界面原型；<BR>制品<BR>用户界面原型；<BR>9.6&nbsp;组织用例模型<BR>执行角色<BR>系统分析员<BR>活动描述<BR>描述用例间的关系（包含、扩展、泛化），优化用例模型；<BR>制品<BR>用例模型（结构化的）；<BR>9.7&nbsp;复9.8&nbsp;审需求<BR>执行角色<BR>需求复审员<BR>活动描述<BR>正式核实需求结果符合客户对系统的看法，建议召开复审会议，复审如下内容：<BR>影响现有需求集的变更请求；<BR>整个用例模型；<BR>对用例及其图表的复审（适合每个用例）；<BR>制品<BR>《复审记录》；<BR>10&nbsp;分析</P>
<P>&nbsp;</P>
<P>10.1&nbsp;构架分析<BR>执行角色<BR>构架设计师<BR>活动描述<BR>编写构架概述，采取了使用大量图片、示意板或图标化图形的非正规形式来对构架进行概述，这部分工作通常只在项目早期进行；<BR>定义子系统的高层组织，在构架分析中通常侧重于两个高层层次，即应用程序层和业务专用层；<BR>根据该层次组织形成分析包，将一些紧密联系的用例分配给一个具体包，然后在该包中实现相应的功能，确定服务包，同一服务包中的分析类都用于相同的服务；<BR>确定明显的实体类；<BR>确定特殊需求，如分布与并发、永久性机制、安全性机制等；<BR>制品<BR>分析包（概要的）；<BR>实体类（概要的）；<BR>分析模型；<BR>10.2&nbsp;用例分析<BR>执行角色<BR>用例工程师<BR>活动描述<BR>确定边界类、实体类和控制类；为每个由人或其他系统充当的参与者确定一个主要的边界类；将参与某个用例实现的分析类收集到一个类图中；<BR>描述分析类间的交互（主要用协作图实现）；<BR>确定每个用例实现的所有需求（非功能性需求）；<BR>制品<BR>分析类（概要的）；<BR>用例实现-分析；<BR>10.3&nbsp;形成分析类<BR>执行角色<BR>设计员<BR>活动描述<BR>确定分析类的职责，可以用类的成员函数来表示，但仅仅是概念上的；<BR>确定分析类的属性，可以用类的成员变量来表示，但仅仅是概念上的；<BR>确定分析类间的关系；<BR>确定分析类特殊需求；<BR>制品<BR>分析类（完整的）<BR>10.4&nbsp;形成分析包<BR>执行角色<BR>设计员<BR>活动描述<BR>将相关性较强的分析类打包成一个分析包；<BR>包间应遵循高内聚、低耦合的原则；<BR>制品<BR>分析包（完整的）<BR>10.5&nbsp;分析复10.6&nbsp;审<BR>不要求正式复审，但应当对分析过程的制品进行检查<BR>执行角色<BR>建议由构架设计师执行<BR>活动描述<BR>检查或复审分析类、分析包、用例实现-分析、分析模型；<BR>制品<BR>无<BR>11&nbsp;设计<BR>&nbsp;</P>
<P>11.1&nbsp;构架设计<BR>执行角色<BR>构架设计师<BR>活动描述<BR>识别节点和网络配置，将这些元素映射到实施模型；<BR>识别子系统及其接口（一般来讲一个子系统映射到一个分析包，子系统对应到一个可执行构件）；<BR>识别对构架有重要意义的类（不要设计细节，数目不要太多），识别主动类（进程和线程），考虑并发要求，将这些主动类分布到具体的节点上；<BR>制品<BR>子系统（概要的）；<BR>接口（概要的）；<BR>设计类（概要的）；<BR>实施模型（概要的）；<BR>构架描述（设计模型和实施模型视图）；<BR>11.2&nbsp;用例设计<BR>执行角色<BR>用例工程师<BR>活动描述<BR>识别设计类，使用类图来表示参与某一用例的类；<BR>描述设计对象间的交互（可以用序列图来表示对相间的交互）；<BR>识别参与的子系统和接口；<BR>描述子系统间的交互作用（用序列图）；<BR>捕获实现性需求（非功能性需求）；<BR>制品<BR>子系统（概要的）；<BR>接口（概要的）；<BR>设计类（概要的）；<BR>&nbsp;用例实现-设计；<BR>11.3&nbsp;形成设计类<BR>执行角色<BR>设计员<BR>活动描述<BR>根据分析类或接口来勾画一个设计类：边界类à用户界面类；实体类à数据库管理类；控制类à一个或一组类；<BR>识别操作（跟踪分析类的职责、分析类的非功能性需求及接口）；<BR>识别属性；<BR>识别类之间的关系；<BR>要对方法进行描述，尤其要对复杂的方法进行详细描述，可以由自然语言或伪码进行描述，也可以用状态图进行描述；<BR>对于状态控制的设计对象，可以用状态图进行描述；<BR>制品<BR>设计类（完整的）；<BR>11.4&nbsp;形成设计子系统<BR>执行角色<BR>设计员<BR>活动描述<BR>形成设计子系统；<BR>形成设计子系统的接口；<BR>制品<BR>子系统（完整的）；<BR>接口（完整的）；<BR>11.5&nbsp;数据库设计<BR>执行角色<BR>数据库设计师<BR>活动描述<BR>在组件视图中创建数据库模型；<BR>在逻辑视图中创建方案，将该方案分配给数据库；<BR>在该方案中创建对象模型视图；<BR>在方案中创建表、视图等；在表中创建列；<BR>在数据模型视图中创建表之间的关系；<BR>为数据库分配存储过程、触发器等行为；<BR>制品<BR>数据模型；<BR>11.6&nbsp;复11.7&nbsp;审设计<BR>执行角色<BR>设计复审员<BR>活动描述<BR>复审设计模型总体，在先启阶段和精化阶段的早期，总体复审着重检测模型的整体结构，尤其重点检查分层和接口；<BR>复审每个用例实现；<BR>复审每个子系统（及其内容）或类（如果系统很小）；<BR>制品<BR>无；<BR>11.8&nbsp;复11.9&nbsp;审构架<BR>执行角色<BR>构架复审员<BR>活动描述<BR>进行软件构架评估的最佳时机就是在精化阶段结束的时候。该阶段主要集中在对需求进行详尽研究，并建立构架的基线。构架复审由在该阶段的里程碑的流程确定。在此情形下，可以进行大范围的构架质量检查。<BR>制品<BR>无；</P>
<P><BR>12&nbsp;实现<BR>&nbsp;<BR>12.1&nbsp;构架实现<BR>执行角色<BR>构架设计师<BR>活动描述<BR>确定在生命周期早期对构架有重要意义的构件，以启动实现工作；<BR>建立实现模型；<BR>把可执行构件映射到节点上；<BR>制品<BR>实现模型；<BR>构件（概要的，可能被映射到节点上）；<BR>构架描述（实现模型和实施模型的视图）；&nbsp;&nbsp;&nbsp; <BR>12.2&nbsp;制定集成构造计划<BR>执行角色<BR>任意角色<BR>活动描述<BR>计划应实施哪些子系统，以及在当前迭代中按照什么顺序集成子系统；<BR>根据一个完整的用例实现寻找要实现的构件并分配给不同的构造；<BR>制品<BR>实现模型；<BR>《集成构造计划》；&nbsp;&nbsp;&nbsp; <BR>12.3&nbsp;实现一个子系统<BR>执行角色<BR>程序员<BR>活动描述<BR>当前构造所需的子系统内的每个类应当由实现子系统中的构件来实现；<BR>当前构造所需的子系统的每个接口也应当由实现子系统实现；<BR>制品<BR>实现子系统（已完成设计的）；&nbsp; <BR>接口；&nbsp; <BR>12.4&nbsp;实现一个类<BR>执行角色<BR>程序员<BR>活动描述<BR>实现成员函数；<BR>制品<BR>构件（完整的）；&nbsp;&nbsp;&nbsp; <BR>12.5&nbsp;单元测试<BR>略。<BR>12.6&nbsp;集成系统<BR>执行角色<BR>任意角色<BR>活动描述<BR>验证工作版本并晋升基线；<BR>制品<BR>工作版本（更新的）；&nbsp;&nbsp;&nbsp; <BR>12.7&nbsp;复12.8&nbsp;审代码<BR>执行角色<BR>代码复审员（可以由技术监督小组成员兼任）<BR>活动描述<BR>走查/审查代码是否符合《编码规范》，提出更改/返工意见；<BR>制品<BR>无；<BR>13&nbsp;测试<BR>&nbsp;</P>
<P>13.1&nbsp;制定测试计划<BR>执行角色<BR>测试员<BR>活动描述<BR>确定测试需求，包括功能性需求（参与测试的用例）和性能需求；<BR>确定测试优先顺序，一般分为：<BR>H - 必须测试 <BR>M - 应该测试，只有在测试完所有 H 项后才进行测试 <BR>L - 可能会测试，但只有在测试完所有 H 和 M 项后才进行测试；<BR>制定测试策略；<BR>确定测试资源，包括人员、测试环境等；<BR>制定测试进度；<BR>形成《测试计划》；<BR>制品<BR>《测试计划》；<BR>13.2&nbsp;设计测试<BR>执行角色<BR>测试员<BR>活动描述<BR>确定并说明测试用例，测试用例应考虑分支情况；<BR>构造用户说明如何执行测试用例的测试规程（若测试用例足够详细，测试规程可以省略）；<BR>制品<BR>测试用例；<BR>《测试规程》；<BR>13.3&nbsp;实现测试<BR>执行角色<BR>程序员<BR>活动描述<BR>该部分主要用来产生测试构件以使测试自动化；该部分常用来产生测试数据、显示测试结果等；该步骤不是必需的；<BR>制品<BR>测试构件；<BR>13.4&nbsp;执行集成测试<BR>执行角色<BR>测试员<BR>活动描述<BR>对当前构造的每一个用例执行测试规程，或运行测试构件自动执行测试规程；<BR>将测试结果与预期结果比较；<BR>记录并提交缺陷；<BR>制品<BR>缺陷；<BR>13.5&nbsp;执行系统测试<BR>执行角色<BR>测试员<BR>活动描述<BR>与集成测试类似；<BR>制品<BR>缺陷；<BR>13.6&nbsp;评估测试<BR>执行角色<BR>测试员<BR>活动描述<BR>分析测试结果并提交变更请求；<BR>评估基于需求的测试覆盖；<BR>评估基于代码的测试覆盖；<BR>确定是否达到了测试的完成标准和成功标准；<BR>生成测试评估摘要；<BR>制品<BR>《测试评估摘要》；</P>
<P><BR>&nbsp;</P><B><BR><BR>版权声明：CSDN是本Blog托管服务提供商。如本文牵涉版权问题，CSDN不承担相关责任，请版权拥有者直接与文章作者联系解决。</B><BR></DIV>
<DIV class=postfoot>发表于 2004年10月21日 9:01 PM </DIV>
<P><LINK href="http://blog.csdn.net/davidzhang1972/Services/Pingback.aspx" rel=pingback><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://blog.csdn.net/davidzhang1972/archive/2004/10/21/146236.aspx"
dc:identifier="http://blog.csdn.net/davidzhang1972/archive/2004/10/21/146236.aspx"
dc:title="软件工程过程规范（裁剪的RUP）第三部分（技术过程） "
trackback:ping="http://blog.csdn.net/davidzhang1972/services/trackbacks/146236.aspx" />
</rdf:RDF>
--><FONT face=宋体></FONT><BR></P>
<DIV id=comments>
<H3>评论</H3>
<DIV class=post>
<DIV class=postTitle><A title="permalink: 回复：软件工程过程规范（裁剪的RUP）第三部分（技术过程） " href="http://blog.csdn.net/davidzhang1972/archive/2004/10/21/146236.aspx#152831">#</A>&nbsp;<A name=152831></A>回复：软件工程过程规范（裁剪的RUP）第三部分（技术过程） <SPAN>2004-10-26 3:17 PM </SPAN><A id=Comments.ascx_CommentList__ctl0_NameLink target=_blank>twirk</A> </DIV>
<DIV class=postText>要是有详细的Pdf文档下载就好了！当然了，如果有具体的例子就更好了。 <BR><A id=Comments.ascx_CommentList__ctl0_EditLink href="javascript:__doPostBack('Comments.ascx$CommentList$_ctl0$EditLink','')"></A></DIV></DIV><BR>
<DIV class=post>
<DIV class=postTitle><A title="permalink: 回复：软件工程过程规范（裁剪的RUP）第三部分（技术过程） " href="http://blog.csdn.net/davidzhang1972/archive/2004/10/21/146236.aspx#163770">#</A>&nbsp;<A name=163770></A>回复：软件工程过程规范（裁剪的RUP）第三部分（技术过程） <SPAN>2004-11-02 3:03 PM </SPAN><A id=Comments.ascx_CommentList__ctl1_NameLink href="http://www.f%20c%20s%20o%20f%20t.com.cn/" target=_blank>dear_book</A> </DIV>
<DIV class=postText>电话：010-82645151 详情参见：www.f c s o f t.com.cn <BR>什么是eform开发平台? <BR>eform是基于浏览器的表单自定义工具,eform是页面设计工具,eform内含大量构件.不用写一行代码便能用eform开发出来常见的功能点. <BR><BR>使用eForm平台有如下好处: <BR>1、用eform平台开发能降低开发人员的技术门槛,使很低水平的人就能开发一个软件项目中常见的功能.例如数据库的数据增删改查打印等等,而这部分功能往往也占居了一个软件项目的大部分.这样一个软件项目开发成员中可以有一大部分人是中专生甚至是高中生就能胜任.从而大大降低了整个软件项目的开发成本.另一方面因为低水平的开发人员很容易招聘到,这样也使软件项目更加容易完成. <BR><BR>2、用eform平台开发的代码一致性比较好,以后维护升级方便.因为只有个性化的功能才需要编写事件代码.所以代码量很少,大量的调用底层的代码,这样代码的集成度高.以后维护升级时修改的代码量非常少. <BR><BR><BR>3、用eform平台开发能大大提高开发效率.eform平台采用对常见的功能和控件内置的方法,使得开发一些常见的功能(如数据库的增删改查,树控件,表格控件)非常容易方便.几乎不用写一行代码.直接通过控件的拖拉然后再设置属性和事件即可完成.开发程序的工作就象是打字员的工作一样.(如图所示开发效率对比示意图) <BR><BR>4、用eform平台开发能很好地应对软件开发项目成员的流动的问题.因为程序员的离职而造成整个项目瘫痪的事例很多.而用eform平台,因为大家都是采用同一模式开发的表单,因而一个人开发的表单很容易被另一个人看懂和使用.这样就使开发人员的流动造成的影响大大降低.企业不再受制于人. <BR>5、用eform平台开发可以使项目不再没完没了,无法关闭.因为可以培训最终用户中的精英,让他们掌握eform平台的使用方法,这样大多需求他们便可以自己做好,而不用麻烦软件开发商了. <BR><BR>eform的设计思路是将数据库程序开发中常用的控制或功能点在eform平台中设计好,通过简单的设置参数或属性即可调用.而遇到很个性化的功能点则可以用传统的代码方式进行开发.因为一个数据库程序开发中大量是增,删,改,查,打印,报表,图表,数据校验等常见的功能点,而这些功能点在eform平台中都做好了,只要简单地设置一下即可完成这些功能点,而且这个设置过程也是可视化的,有相应的设置界面.这样做这些常见的功能点就非常简单快速.而少量的特别的功能点又可通过写代码的方式来完成.也就是说在一张表单中可以一部分功能是直接通过简单的设置一下来完成,另一部分功能是用代码来硬写出来的.这样就达到了常见的功能可以直接调用eform底层的api来实现以提高开发效率,但一个表单又不限定只能实现这些常见功能,你也可随意地用代码来进行无限扩充.这样就达到了既提高了开发效率又能实现很复杂的功能. <BR>eform开发平台分为eform.j2ee和eform.net两个版本.eform.j2ee是用java编写的,面向j2ee应用.eform.net是用.net编写的,面向.net应用.实际上整个eform开发平台共有三部分的代码,① 一部分是htc js dhtml等前台的代码,② 一部分是java的代码,③ 一部分是.net的代码(c#语言的),其中java的代码完成的功能和.net的代码完成的功能完全相同.用①和②就组成了eform.j2ee版本,用① 和③ 就组成了eform.net.这样就得到了两个版本.由此可知,eform.j2ee和eform.net的接口和操作是完全相同的.只是运行环境和使用的编程语句不同罢了.这样做的好处是当需要从j2ee平台转到.net平台或是从.net平台转到j2ee的平台时,使用eform编写的表单和程序可以完全保留下来直接使用.可以轻松地跨越当今两大主流的开发平台. <BR>使用eform开发平台开发出来的表单可以直接在浏览器中运行,不但如此,而且其设计工具也是在浏览器中运行的.也就是说,开发人员也是在IE中(拖拉控件)开发的.开发人员再也不用为了搭建开发环境而装一大堆软件了,这一点对于远程协作开发非常有利. <BR>eform内置了常见的大量的开发构件,如树控件,表格,图表控件,打印控件,上传控件,查询等,也内置了象单表输入,一对多表输入等常见的数据库程序的功能点.通过使用这些可以大大提高开发的速度,降低开发这些常见功能的门槛,只需知道很少的知识便可以开发.使用eform生成的表单结构和格式一致,非常便于以后的维护升级. <BR>eform开发平台开发出来的表单可以脱离eform平台单独运行,也很容易和其它程序进行集成.一个项目的程序往往是大量常用功能用eform平台开发,而少量功能用其它方式开发.然后把它们集成在一起而成的. <BR>eform开发平台是专门为软件开发商或需要开发数据库程序的人而设计的.它采用开放版权的销售方式.对于用户开放100%的源代码,也就是说将eform开发平台的源代码全部提供给用户,同时还包括相应的开发文档和典型示例都提供给用户,而且用户用eform开发平台开发出来的程序可以自由分发.用户购买了eform后,就相当于eform是自己开发出来的一样.而且北京 方 成公司还提供一年的免费服务和技术支持. <BR>eform的销售没有任何加密和license之说.是一种特别的销售方式.销售的过程实际上是完成知识和价值的转移的过程.相当于方成公司帮用户开发了一个平台然后再帮助用户把它使用起来,用户使用eform开发的软件可以自由销售,和方成公司没有任何关系,更不需要再收费用.由此可见,购买eform和自已招聘员工开发一个平台相比,无论是时间还是费用以及风险都是购买eform比较合算. <BR></DIV></DIV></DIV>]]></description>
</item><item>
<title><![CDATA[浅谈Asp.net多层架构中的变量引用与传递     选择自 redstorm 的 Blog]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1659</link>
<author>topiemie</author>
<pubDate>2005/1/7 21:47:34</pubDate>
<description><![CDATA[<FONT size=4>到公司已经快两个星期了,但是由于客户的需求分析没有下来，所有项目迟迟没有开始。正好利用这个时间仔细研究了一下Asp.net的多层架构，主要参考的是 Wrox 的一本&lt;.Net WebSite Programming Problem-Design-Solution&gt;,个人觉得这本书写的不错。面向有一定.net基础的开发人员，刚开始看起来可能觉得很难懂，但是仔细研究一下会发现，这本书是一本面向工程应用的优秀参考手册。</FONT>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Asp.net的多层架构主要是为了解决数据层，逻辑层，表示层等之间的关系。我的做法是这样的：首先建立一个DataCore的基类。基类里面封装了一些低层的数据库的基本操作，比如说数据库联接，调用存储过程等等。在这里面有一个地方值得注意，通过对一个函数的重载可以实现调用不同功能的存储过程。以下代码示例:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>protected int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;int result;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;Connection.Open();<BR>&nbsp;&nbsp;&nbsp;SqlCommand command = BuildIntCommand( storedProcName, parameters );<BR>&nbsp;&nbsp;&nbsp;rowsAffected = command.ExecuteNonQuery();<BR>&nbsp;&nbsp;&nbsp;result = (int)command.Parameters["ReturnValue"].Value;<BR>&nbsp;&nbsp;&nbsp;Connection.Close();<BR>&nbsp;&nbsp;&nbsp;return result;<BR>&nbsp;&nbsp;}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;protected SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SqlDataReader returnReader;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;&nbsp;Connection.Open();<BR>&nbsp;&nbsp;&nbsp;SqlCommand command = BuildQueryCommand( storedProcName, parameters );<BR>&nbsp;&nbsp;&nbsp;command.CommandType = CommandType.StoredProcedure;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;&nbsp;returnReader = command.ExecuteReader();<BR>&nbsp;&nbsp;&nbsp;//Connection.Close();<BR>&nbsp;&nbsp;&nbsp;return returnReader;<BR>&nbsp;&nbsp;}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;protected DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;DataSet dataSet = new DataSet();<BR>&nbsp;&nbsp;&nbsp;Connection.Open();<BR>&nbsp;&nbsp;&nbsp;SqlDataAdapter sqlDA = new SqlDataAdapter();<BR>&nbsp;&nbsp;&nbsp;sqlDA.SelectCommand = BuildQueryCommand( storedProcName, parameters );<BR>&nbsp;&nbsp;&nbsp;sqlDA.Fill( dataSet, tableName );<BR>&nbsp;&nbsp;&nbsp;Connection.Close();</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;&nbsp;return dataSet;<BR>&nbsp;&nbsp;}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;protected void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Connection.Open();<BR>&nbsp;&nbsp;&nbsp;SqlDataAdapter sqlDA = new SqlDataAdapter();<BR>&nbsp;&nbsp;&nbsp;sqlDA.SelectCommand = BuildIntCommand( storedProcName, parameters );<BR>&nbsp;&nbsp;&nbsp;sqlDA.Fill( dataSet, tableName );<BR>&nbsp;&nbsp;&nbsp;Connection.Close();&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}</FONT></P>
<P><FONT size=4>&nbsp;&nbsp; 道理很简单，一看就懂。对于以后的操作有好处的。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp; 其次是要建立逻辑层，这个逻辑层基本上就是实例化数据层DataCore之后为表示层返回一些DataSet，DataReader之类或是执行一些insert,update,delete之类语句。这个逻辑层也是为了区分整个Project下面不同功能模块。比如说用户模块起名叫做UserModel.cs，新闻模块叫做NewsModel.cs之类。逻辑层的另一个好处就是可以为表示层建立可以多次实例化的同一个对象或是方法。比如说User类，通过ID或是Username 查询并建立的对象可以被表示层多次调用。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp; 最后是表示层，表示层的功能就是完成页面逻辑。主要是接受客户端数据然后经过简单整合和判断，传递给逻辑层处理。同样，接收逻辑层传递来的Dataset或DataReader，表示在前台页面。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp; 数据在各个层次之间的关系相对独立，但是又相对连续。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp; 独立性:</FONT></P>
<P><FONT size=4>&nbsp;&nbsp; 对于表示层之外的几个层，都可以把单个的对象或是方法直接拿出来放到其他工程中。因为每个曾都是为了实现模型中独立的功能而完成的。因为在类似工程中的应用基本上不用太大改动，特别是一些相对更加原始的层，在这个示例中的DataCore就是一个典型的例子。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;连续性:</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp; 数据在传递过程中有较强的连续性。举一个例子，在表示层中有这样一个根据Session中Userid返回一个Dataset，原本我是这样写的:</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示层:</FONT></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT size=2>&nbsp;<FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New">DataSet UserInforRow = ObjectUser.GetUserInfor(Int32.Parse(Session["UserId"].ToString()));</FONT></FONT></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT size=4> 逻辑层:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;public DataSet GetUserInfor(int UserID)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,4)};</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;&nbsp;parameters[0].Value = UserID;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>&nbsp;&nbsp;&nbsp;using(DataSet UserInfor = RunProcedure("GetUserInfor",parameters,"UserInfor"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return UserInfor;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}</FONT></P>
<P>&nbsp;</P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;这样可以编译通过,但是在执行的时候提示错误,类型不匹配,语法上面没有错误。但是错误出在，表示层传进来的是一个Int32,在Sqlparameter中确是一个Int,4，本来以为这样的变量类型都是在每一个层次中相对独立的，但是当他们之间传递数据的时候，出现了问题。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp; 对于这个问题的解决方案有两种，无非是更改表示层还是更改逻辑层。更改逻辑层，就要改成</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>SqlParameter[] parameters ={new SqlParameter("@UserID",SqlDbType.Int,32)};</FONT></P>
<P><FONT size=4>更改表示层要改为:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3" face="Courier New" size=2>DataSet UserInforRow = ObjectUser.GetUserInfor(int.Parse(Session["UserId"].ToString()));</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp; 两个方案中显然是更改表示层比较合理，因为不能够因为一个变量的传递更改变逻辑层中的可以被其他表示层页面所调用的方法。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp; 其他类似的变量传递和引用也遇到类似问题，虽然几个层次相对独立，但是在数据的传递上也相对连续。</FONT></P>
<P><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp; .net在web上面的应用可以做的很复杂，逻辑也很强，简单的单页面调用不是.net的特点也不能作为工程应用。我也是接触了一点，冰山一角，希望能起到一个抛砖引玉的作用，让大家见笑了。</FONT></P>]]></description>
</item><item>
<title><![CDATA[如何编写高质量的VB代码    选择自 jlmugua 的 Blog]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1658</link>
<author>topiemie</author>
<pubDate>2005/1/7 21:32:36</pubDate>
<description><![CDATA[
<P><SPAN id=ArticleContent1_ArticleContent1_lblContent>如何编写高质量的VB代码<IMG height=19 src="http://blog.csdn.net/Emoticons/QQ/22.gif" width=19 border=0><BR>　　简介：<BR>　　本文描述了如何通过一些技术手段来提高VB代码的执行效率。这些手段可以分为两个大的部分：编码技术和编译优化技术。在编码技术中介绍了如何通过使用高效的数据类型、减少外部引用等编程手段来提高代码执行速度，减少代码消耗的系统资源。在编译优化技术中介绍了如何正确地利用VB提供的编译选项对在编译时最后生成的可执行文件进行优化。<BR>　　前言<BR>　　什么是一个高效的软件？一个高效的软件不仅应该比实现同样功能的软件运行得更快，还应该消耗更少的系统资源。这篇文章汇集了作者在使用VB进行软件开发时积累下来的一些经验，通过一些简单的例子来向你展示如何写出高效的VB代码。其中包含了一些可能对VB程序员非常有帮助的技术。在开始之前，先让我陈清几个概念。<BR>　　让代码一次成型：在我接触到的程序员中，有很多人喜欢先根据功能需求把代码写出来，然后在此基础上优化代码。最后发现为了达到优化的目的，他们不得不把代码再重新写一遍。所以我建议你在编写代码之前就需要考虑优化问题。<BR>　　把握好优化的结果和需要花费的工作之间的关系：通常当完成了一段代码，你需要检查和修改它。在检查代码的过程中，也许你会发现某些循环中的代码效率还可以得到进一步的改进。在这种情况下，很多追求完美的程序员也许会立马修改代码。我的建议是，如果修改这段代码会使程序的运行时间缩短一秒，你可以修改它。如果只能带来10毫秒的性能改进，则不做任何改动。这是因为重写一段代码必定会引入新的错误，而调试新的代码必定会花掉你一定的时间。程序员应该在软件性能和开发软件需要的工作量之间找一个平衡点，而且10毫秒对于用户来说也是一个不能体会到的差异。<BR>　　在需要使用面向对象方法的时候尽量使用它；VB提供的机制不完全支持面向对象的设计和编码，但是VB提供了简单的类。大多数人认为使用对象将导致代码的效率降低。对于这一点我个人有些不同的意见；考察代码的效率不能纯粹从运行速度的角度出发，软件占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能，这一点我会在后面的例子中详细说明。<BR>　　当你编写VB代码的时候，希望你能把上面几点作为指导你编码的原则。我把文章分为两个部分：如何提高代码的运行速度和编译优化。<BR>　　如何提高代码的运行速度<BR>　　下面的这些方法可以帮助你提高代码的运行速度：<BR>　　1. 使用整数（Integer）和长整数（Long）<BR>　　提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信，但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下，程序员可以将Single，Double和Currency类型的变量替换为Integer或Long类型的变量，因为VB处理Integer和Long的能力远远高于处理其它几种数据类型。<BR>　　在大多数情况下，程序员选择使用Single或Double的原因是因为它们能够保存小数。但是小数也可以保存在Integer类型的变量中。例如程序中约定有三位小数，那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。根据我的经验，使用Integer和Long替代Single，Double和Currency后，代码的运行速度可以提高将近10倍。<BR>　　2. 避免使用变体<BR>　　对于一个VB程序员来说，这是再明显不过的事情了。变体类型的变量需要16个字节的空间来保存数据，而一个整数（Integer）只需要2个字节。通常使用变体类型的目的是为了减少设计的工作量和代码量，也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话，完全可以避免使用变体类型。<BR>　　在这里顺带提一句，对于Object对象也存在同样的问题。请看下面的代码：<BR>Dim FSO <BR>Set FSO = New Scripting.FileSystemObject <BR>　　或<BR>Dim FSO as object<BR>Set FSO = New Scripting.FileSystemObject <BR>　　上面的代码由于在申明的时候没有指定数据类型，在赋值时将浪费内存和CPU时间。正确的代码应该象下面这样：<BR>Dim FSO as New FileSystemObject <BR>3. 尽量避免使用属性<BR>　　在平时的代码中，最常见的比较低效的代码就是在可以使用变量的情况下，反复使用属性（Property），尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的：<BR>Dim intCon as Integer<BR>For intCon = 0 to Ubound(SomVar())<BR>Text1.Text = Text1.Text &amp; vbcrlf &amp; SomeVar(intCon)<BR>Next intCon <BR>　　下面这段代码的执行速度是上面代码的20倍。 <BR>Dim intCon as Integer<BR>Dim sOutput as String<BR>For intCon = 0 to Ubound(SomeVar())<BR>sOutput = sOutput &amp; vbCrlf &amp;<BR>SomeVar(intCon)<BR>Next<BR>Text1.Text = sOutput <BR>　　4. 尽量使用数组，避免使用集合<BR>　　除非你必须使用集合（Collection），否则你应该尽量使用数组。据测试，数组的存取速度可以达到集合的100倍。这个数字听起来有点骇人听闻，但是如果你考虑到集合是一个对象，你就会明白为什么差异会这么大。<BR>　　5. 展开小的循环体<BR>　　在编码的时候，有可能遇到这种情况：一个循环体只会循环2到3次，而且循环体由几行代码组成。在这种情况下，你可以把循环展开。原因是循环会占用额外的CPU时间。但是如果循环比较复杂，你就没有必要这样做了。<BR>　　6. 避免使用很短的函数<BR>　　和使用小的循环体相同，调用只有几行代码的函数也是不经济的--调用函数所花费的时间或许比执行函数中的代码需要更长的时间。在这种情况下，你可以把函数中的代码拷贝到原来调用函数的地方。<BR>　　7. 减少对子对象的引用<BR>　　在VB中，通过使用.来实现对象的引用。例如：<BR>Form1.Text1.Text <BR>　　在上面的例子中，程序引用了两个对象：Form1和Text1。利用这种方法引用效率很低。但遗憾的是，没有办法可以避免它。程序员唯一可以做就是使用With或者将用另一个对象保存子对象（Text1）。<BR>注释： 使用With<BR>With frmMain.Text1<BR>.Text = "Learn VB"<BR>.Alignment = 0<BR>.Tag = "Its my life"<BR>.BackColor = vbBlack<BR>.ForeColor = vbWhite<BR>End With <BR>　　或者 <BR>注释： 使用另一个对象保存子对象<BR>Dim txtTextBox as TextBox<BR>Set txtTextBox = frmMain.Text1<BR>TxtTextBox.Text = "Learn VB"<BR>TxtTextBox.Alignment = 0<BR>TxtTextBox.Tag = "Its my life"<BR>TxtTextBox.BackColor = vbBlack<BR>TxtTextBox.ForeColor = vbWhite <BR>　　注意，上面提到的方法只适用于需要对一个对象的子对象进行操作的时候，下面这段代码是不正确的：<BR>With Text1<BR>.Text = "Learn VB"<BR>.Alignment = 0<BR>.Tag = "Its my life"<BR>.BackColor = vbBlack<BR>.ForeColor = vbWhite<BR>End With <BR>　　很不幸的是，我们常常可以在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是With块编译后会形成一个分枝，会增加了额外的处理工作。<BR>　　8. 检查字符串是否为空<BR>　　大多数程序员在检查字符串是否为空时会使用下面的方法：<BR>If Text1.Text = "" then<BR>注释： 执行操作<BR>End if&nbsp; <BR>　　很不幸，进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法：<BR>If Len(Text1.Text) = 0 then<BR>注释： 执行操作<BR>End if <BR>　　9. 去除Next关键字后的变量名<BR>　　在Next关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样，只是一个经验而已。不过我想很少有程序员会这样画蛇添足，毕竟大多数程序员都是惜字如金的人。<BR>注释： 错误的代码<BR>For iCount = 1 to 10<BR>注释： 执行操作<BR>Next iCount<BR>注释： 正确的代码<BR>For iCount = 1 to 10<BR>注释： 执行操作<BR>Next&nbsp; <BR>　　10. 使用数组，而不是多个变量<BR>　　当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在VB中，数组是最高效的数据结构之一。<BR>　　11. 使用动态数组，而不是静态数组<BR>　　使用动态数组对代码的执行速度不会产生太大的影响，但是在某些情况下可以节约大量的资源。</SPAN> </P>
<P>12. 销毁对象<BR>　　无论编写的是什么软件，程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多程序员对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如：<BR>Dim FSO as New FileSystemObject<BR>注释： 执行操作<BR>注释： 销毁对象<BR>Set FSO = Nothing<BR>对于窗体，可以进行卸载：<BR>Unload frmMain&nbsp; <BR>　　或<BR>Set frmMain = Nothing <BR>　　13. 变长和定长字符串<BR>　　从技术上来说，与变长字符串相比，定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于在很多情况下，你都需要调用Trim函数以去除字符串末的空字符，这样反而会降低代码效率。所以除非是字符串的长度不会变化，否则还是使用变长字符串。<BR>　　14. 使用类模块，而不是ActiveX控件<BR>　　除非ActiveX控件涉及到用户界面，否则尽量使用轻量的对象，例如类。这两者之间的效率有很大差异。<BR>　　15. 使用内部对象<BR>　　在涉及到使用ActiveX控件和DLL的时候，很多程序员喜欢将它们编译好，然后再加入工程中。我建议你最好不要这样做，因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用方法或存取属性的时候，都会浪费大量的系统资源。如果你有ActiveX控件或DLL的源代码，将它们作为工程的私有对象。<BR>　　16. 减少模块的数量<BR>　　有些人喜欢将通用的函数保存在模块中，对于这一点我表示赞同。但是在一个模块中只写上二三十行代码就有些可笑了。如果你不是非常需要模块，尽量不要使用它。这样做的原因是因为只有在模块中的函数或变量被调用时，VB才将模块加载到内存中；当VB应用程序退出时，才会从内存中卸载这些模块。如果代码中只有一个模块，VB就只会进行一次加载操作，这样代码的效率就得到了提高；反之如果代码中有多个模块，VB会进行多次加载操作，代码的效率会降低。<BR>　　17. 使用对象数组<BR>　　当设计用户界面时，对于同样类型的控件，程序员应该尽量使用对象数组。你可以做一个实验：在窗口上添加100个PictureBox，每个PictureBox都有不同的名称，运行程序。然后创建一个新的工程，同样在窗口上添加100个PictureBox，不过这一次使用对象数组，运行程序，你可以注意到两个程序加载时间上的差别。<BR>　　18. 使用Move方法<BR>　　在改变对象的位置时，有些程序员喜欢使用Width，Height，Top和Left属性。例如：<BR>Image1.Width = 100<BR>Image1.Height = 100<BR>Image1.Top = 0<BR>Image1.Left = 0 <BR>　　实际上这样做效率很低，因为程序修改了四个属性，而且每次修改之后，窗口都会被重绘。正确的做法是使用Move方法：<BR>Image1.Move 0,0,100,100 <BR>　　19. 减少图片的使用<BR>　　图片将占用大量内存，而且处理图片也需要占用很多CPU资源。在软件中，如果可能的话，可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。<BR>　　20. 使用ActiveX DLL，而不是ActiveX控件<BR>　　如果你设计的ActiveX对象不涉及到用户界面，使用ActiveX DLL。<BR>　　编译优化<BR>　　我所见过的很多VB程序员从来没有使用过编译选项，也没有试图搞清楚各个选项之间的差别。下面让我们来看一下各个选项的具体含义。<BR>　　1. P-代码（伪代码）和本机代码<BR>　　你可以选择将软件编译为P-代码或是本机代码。缺省选项是本机代码。那什么是P-代码和本机代码呢？<BR>P-代码：当在VB中执行代码时，VB首先是将代码编译为P-代码，然后再解释执行编译好的P-代码。在编译环境下，使用这种代码要比本机代码快。选择P-代码后，编译时VB将伪代码放入一个EXE文件中。<BR>　　本机代码：本机代码是VB6以后才推出的选项。当编译为EXE文件后，本机代码的执行速度比P-代码快。选择本机代码后，编译时VB使用机器指令生成EXE文件。<BR>　　在使用本机代码进行编译时，我发现有时候会引入一些莫名其妙的错误。在编译环境中我的代码完全正确地被执行了，但是用本机代码选项生成的EXE文件却不能正确执行。通常这种情况是在卸载窗口或弹出打印窗口时发生的。我通过在代码中加入DoEvent语句解决了这个问题。当然出现这种情况的几率非常少，也许有些VB程序员从来没有遇到过，但是它的确存在。</P>
<P>　　在本机代码中还有几个选项：<BR>　　a) 代码速度优化：该选项可以编译出速度较快的执行文件，但执行文件比较大。推荐使用<BR>　　b) 代码大小优化：该选项可以编译出比较小的执行文件，但是以牺牲速度为代价的，不推荐使用。<BR>　　c) 无优化：该选项只是将P-代码转化为本机代码，没有做任何优化。在调试代码时可以使用。<BR>　　d) 针对Pentium Pro优化：虽然该项不是本机代码中的缺省选项，但是我通常会使用该选项。该选项编译出的可执行程序在Pentium Pro和Pentium 2以上的机器上可以运行得更快，而在比较老的机器上要稍稍慢一些。考虑到现在用Pentium 2都是落伍，所以推荐大家使用该选项。<BR>　　e) 产生符号化调试信息：该项在编译过程中生成一些调试信息，使用户可以利用Visual C++一类的工具来调试编译好的代码。使用该选项会生成一个.pdf文件，该文件记录了可执行文件中的标志信息。当程序拥有API函数或DLL调用时，该选项还是比较有帮助的。<BR>　　2. 高级优化<BR>　　高级优化中的设置可以帮助你提高软件的速度，但是有时候也会引入一些错误，因此我建议大家尽量小心地使用它们。如果在代码中有比较大的循环体或者复杂的数学运算时，选中高级优化中的某些项会大幅度提升代码的性能。如果你使用了高级优化功能，我建议你严格测试编译好的文件。<BR>　　a) 假定无别名：可以提高循环体中代码的执行效率，但是在如果通过变量的引用改变变量值的情况下，例如调用一个方法，变量的引用作为方法的参数，在方法中改变了变量的值的话，就会引发错误。有可能只是返回的结果错误，也有可能是导致程序中断运行的严重错误。<BR>　　b) 取消数组绑定检查、取消整数溢出检查和取消浮点错误检查：在程序运行时，如果通过这些检查发现了错误，错误处理代码会处理这些错误。但是如果取消了这些检查，发生了错误程序就无法处理。只有当你确定你的代码中不会出现上面的这些错误时，你才可以使用这些选项。它们将使软件的性能得到很大的提升。<BR>　　c) 允许不舍入的浮点操作：选择该选项可以是编译出来的程序更快地处理浮点操作。它唯一的缺点就是在比较两个浮点数时可能会导致不正确的结果。<BR>　　d) 取消Pentium FDIV安全检查：该选项是针对一些老的Pentium芯片设置的，现在看来已经过时了。<BR></P>
<P><BR>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[DotNET心得（一）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1647</link>
<author>topiemie</author>
<pubDate>2005/1/7 15:06:40</pubDate>
<description><![CDATA[<A><FONT size=4><SPAN style="FONT-FAMILY: 黑体"><BR>写在前面</SPAN></FONT><BR>　　以后我会不定期的把自己对DOTNET的心得发表在这个BOLG上，供大家交流。认识DOTNET是在两年前，2002年的时候，当时只是拿到她的 Beta2版本，并没有深入了解。直至2004年11月份，才真正使用它开发项目。通过一段时间的使用，感觉只有两个字“好用”！她几乎综合了目前所有经典的开发工具的先进思想，同时引入了IL（中间语言），从而减少了语言的差异，即可以用任何语言，开发使用系统。总之，我认为DotNET是值得学习研究的一种开发工具。<BR><BR><FONT size=4><SPAN style="FONT-FAMILY: 黑体">一、ASP与ASP.NET的区别</SPAN></FONT><BR>1、变量传递方面<BR>　　ASP：<BR>　　先来看看ASP中变量传递的几种常用方式<BR>　　a、使用form<BR>　　下面是一个使用form提交数据（传递变量）的例子：<BR>　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form name="DeomForm" method="POST" action="demo.asp"&gt;<BR>　　　　变量temp的值： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="temp"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="submit" type="submit" value="提交" &gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<BR>　　在文本框中输入temp的值，点击“提交”按钮，在demo.asp页中可以用<BR>request.form("temp")的方法取到变量temp的值。<BR>　　我们可以用response.write(request.form("temp"))这条语句测试一下结果。<BR>　　这种方法常用于用户注册、登录，表单提交等变量传递的操作。<BR>　　b、使用URL传递变量<BR>　　这种方法比较简单，使用方法：<BR>　　http://www.abc.com/demo.asp?temp=xyz<BR>　　在demo.asp中使用request.QueryString("temp")的方法取到temp的值。同样我们可以用response.write("</A><A>request.QueryString("temp")</A><A>")来测试一下结果。<BR>　　c、使用Session或Cookies<BR>　　Session是将变量或对象数据保存在服务器上，而Cookies是将变量的值保存在客户端上。但无论是Session还是</A><A>Cookies，都</A><A>是基于Cookie的，因此这两种方法都需要客户端的Cookie支持，如果客户端的Cookie安全设置过高，可能会无法使用这种方式。<BR>　　使用方法：<BR>　　Session("temp")="xyz"<BR>　　response.write(Session("temp"))<BR>　　response.Cookies("temp")="xyz"<BR>　　response.write(request.Cookies("temp"))<BR><BR>　　ASP.NET：<BR>　　URL与Session、Cookies的使用方法与ASP2.0中基本，此处不再介绍。下面主要介绍一下在Form应用上两者的区别：<BR>　　回忆一下，在</A><A>ASP2.0中如果要取到form中的变量的值，必须要在ACTION中指定一个页面，在该页面中再取值(request.form("变量名"))，简直就是脱裤子放屁。而事实上，我们通常需要的是在同一个页面中就能够完成对表单中数据的处理。<BR>　　以用户登录页面(Login)为例，我们来看一下ASP2.0是如何工作的：<BR><BR></A><A></A>]]></description>
</item><item>
<title><![CDATA[美19岁男孩挑战微软 火狐狸浏览器大受推崇]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1626</link>
<author>topiemie</author>
<pubDate>2005/1/7 9:08:40</pubDate>
<description><![CDATA[<a>　最近，微软公司正遭受“前所未有”的挑战，挑战者不是其他软件巨头，而是来自一位年仅19岁的美国少年。布雷克.罗斯在两年前开发的“火狐狸”(Firefox)网络浏览器软件比微软的IE速度更快、操作更方便、<!--<TABLE align=left border=0 cellPadding=0 cellSpacing=0 height=310 width=370>
  <TBODY>
    <TR>
      <TD vAlign=center>
        <SCRIPT LANGUAGE="JavaScript1.1" SRC="http://ad.ccw.com.cn/adshow.asp?positionID=39&js=1&innerJs=1"></SCRIPT>
      </TD>
    </TR>
  </TBODY>
</TABLE>--> 更安全。更重要的是，“火狐狸”的源代码是完全开放的。&nbsp; 
<br>
<br>
　　在IE为它层出不穷的补丁忙得不亦乐乎的时候，广大网络用户多么盼望有款新生的浏览器软件取代IE的老大位置。而“火狐狸”作为一个开放源代码的浏览
器，可以广泛应用于各种系统平台。自从2004年11月正式发布以来，已经有大约1500万网络用户下载了“火狐狸”，使其成为微软IE之后，世界上第二
大流行的网络浏览器软件。业界专家将“火狐狸”评价为微软“最恐怖的噩梦”，而罗斯则被称为“神童”。&nbsp; <br>
<br>
　　罗斯妈妈说，除了计算机软件，她的儿子还是位出色的钢琴家和富有创造力的作家，“只要他想做，他就可以做好任何事情”。据说，7岁的时候，罗斯迷上了
电脑游戏《虚拟城市》。10岁，他创建了自己的个人网站。不久后，他将自己开发的电脑应用软件和电脑游戏上传到网上。14岁，他成为硅谷先锋网景公司的实
习生。&nbsp; <br>
<br>
　　“火狐狸”一经推出，立即赢得了网络使用者的推崇。大约1万名“火狐狸”爱好者集资25万美元，在《纽约时报》上买下了整整两个半的广告版宣传这种新
软件。这种热情不仅仅存在于个人用户，美国宾州大学的信息科技学院员工致信校长，推荐全校10万师生一同摈弃IE浏览器，改用“火狐狸”。&nbsp;
<br>
<br>
　　现在，罗斯正就读于斯坦福大学，学习计算机专业。作为一位源代码开放运动的先锋，他并没有从“火狐狸”中得到一份报酬。但谁又能说他不会是下一个互联网传奇呢？(席雪莲&nbsp;信报) <br>
</a>]]></description>
</item><item>
<title><![CDATA[博客中国并购博客动力 BLOG渐入互联网主流]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1625</link>
<author>topiemie</author>
<pubDate>2005/1/7 8:51:54</pubDate>
<description><![CDATA[<A>　
<DIV>计世网消息 1月5日，第一博客门户网站博客中国宣布全面购并博客动力网站。这是国内首次博客网站并购案，业内人士认为，2005年博客应用进入主流，这将引发国内巨头网站对博客网站购并的浪潮。</DIV>
<DIV>&amp;nb<!--<TABLE align=left border=0 cellPadding=0 cellSpacing=0 height=310 width=370>
  <TBODY>
    <TR>
      <TD vAlign=center>
        <SCRIPT LANGUAGE="JavaScript1.1" SRC="http://ad.ccw.com.cn/adshow.asp?positionID=39&js=1&innerJs=1"></SCRIPT>
      </TD>
    </TR>
  </TBODY>
</TABLE>--> sp;</DIV>
<DIV>在日前召开的“2005年博客发展趋势研讨会”上，博客中国创始人方兴东博士宣布的“博客中国正式购并博客动力”这条重要消息，引起全场轰动。</DIV>
<DIV>&nbsp;</DIV>
<DIV>据悉，2004年方兴东到美国开会，邂逅博客动力网站CEO卢亮，两大博客一见如故，剪烛共话BLOG发展前景，彼此惺惺相惜，引为知音，遂为今后的购并埋下重要伏笔。并购后，卢亮先生出任博客中国副总裁。卢亮是美国Texas A&amp;M University博士，中国科学院高能物理研究所(硕士)，曾任职欧洲粒子中心。一手创立了博客动力和美国微分科技有限公司，并担任首席构架师。 </DIV>
<DIV>&nbsp;</DIV>
<DIV>方兴东介绍，此次并购是博客商业化运作的一个重要环节。双方都是大型博客网站，具有明显的资源互补优势，此次联手打造全球第一大博客门户网站，将有力的推动博客的发展。方说博客中国和博客动力双方现有产品和业务具有很高的互补性。双方拥有可以互补的一流技术团队和技术平台，这将为日后全面开展海外业务，提供英文等多语种博客服务奠定雄厚基础。</DIV></A>]]></description>
</item><item>
<title><![CDATA[天下无贼IT版本]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1619</link>
<author>topiemie</author>
<pubDate>2005/1/6 18:06:54</pubDate>
<description><![CDATA[<A>　IT -- 天下无贼 <BR>IBM："人心散了，队伍不好带了<BR>戴尔："我最讨厌你们这样胡乱降价的了，一点技术含量都没有<BR>惠普："实话告诉你们，惠普很生气，后果很严重<BR>Intel：你过得了我吗？ AMD:我想试试<BR>IT业：二十一世纪什么最贵？人才！ <BR>联想（收购IBM后）：知我者谓我心忧虑，不知我者谓我何求？ <BR>Microsoft(对D版）：辛苦了，小鬼 <BR>甲骨文（对仁科）：我本将心照明月，奈何明月照沟渠 <BR>windows用户（对M$）：我们要的是安全，责任感。 <BR>黑客？？：IP、IC、IQ卡，通通告诉我密码 <BR>电信公司：严肃点，严肃点，不许笑，我们这儿打劫呢！</A>]]></description>
</item><item>
<title><![CDATA[办公室秘书MM的26种死法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1618</link>
<author>topiemie</author>
<pubDate>2005/1/6 18:03:31</pubDate>
<description><![CDATA[<P>1．总有写不完的材料，累死。<BR>2．写材料写到凌晨3点，饿死。<BR>3．材料第N次被老板枪毙，气死。<BR>4．第N＋1次改材料，烦死。<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．年终总结上错了一个数据，打开最上层的文件柜查记录，被如山的文件砸死。</P>]]></description>
</item><item>
<title><![CDATA[《西游记》中有这样一个管理矛盾]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1617</link>
<author>topiemie</author>
<pubDate>2005/1/6 17:58:42</pubDate>
<description><![CDATA[<A>　　　《西游记》中有这样一个矛盾，我以前一直百思不得其解：齐天大圣孙悟空在大闹天宫时战无不胜，要不是如来佛祖出手相援，整个天庭简直面临“亡国”的危险，但是在取经途中，大圣却好像很难一帆风顺，当年的那帮手下败将以及败将的跟班坐骑都成了高手，不是让大圣无计可施，就是要由大圣请出山帮忙，让人感觉这是吴承恩写书的漏洞。最近我在做项目的时候，突然茅塞顿开——吴承恩这么写恰恰反映了他对封建王朝管理体系和人文背景的深刻了解。各位如若不信，且听我细细道来。 <BR>　　　　 <BR>　　　　大闹天宫前后，孙大圣、天兵天将以及妖怪们的能力都没有变化，但是交战双方和双方的心态都发生了很大的改变。 <BR>　　 <BR>　　　　大闹天宫是孙大圣和天庭众神的战斗，是妖与神的战斗。 <BR>　　 <BR>　　　　那时的孙大圣还只是得道的妖精，无所畏惧，身无牵绊，连阎王殿也不敢索拿他，打赢了是无上的荣光，甚至有自己重新界定天庭秩序的可能性，打败了的后果他又没有考虑过，所以，在孙大圣心中，他进行的是高收益、无风险的事业，自然全力以赴，出手毫不留情。 <BR>　　 <BR>　　　　而天庭众神的心态却不同。孙大圣反的只是玉皇大帝，目的只是想打败天庭以求出口恶气，对待众神并没有深仇大恨，所以干的都只是些偷食酒菜、仙丹的事情，充其量也不过是影响重要会议召开这样的小错误，即便后来打上天宫，也没有强烈的破坏欲，去干诸如烧杀抢掠的勾当。因此，孙大圣与众神并无利益上的冲突。 <BR>　　 <BR>　　　　同时，孙大圣的杀伤力很强，他手中的武器可以使所有被触碰的对手受伤。所以，众神对孙大圣的围剿行动实际上是风险很高的项目，是迫于其领导玉皇大帝的压力而进行的工作，可以想象，在此情况下天庭一方的战斗力是处于什么状态，所谓十万天兵天将也必然各怀鬼胎，瞻前顾后。 <BR>　　 <BR>　　　　有人会说，众神为什么不靠打败孙大圣来加官进爵呢，这就牵涉到天庭的所有制结构和激励机制问题。 <BR>　　 <BR>　　　　从原文来看，天庭里尽管都是高素质的精英分子，实行的仍是封建君主制度，玉皇大帝作为统治者，对作为臣子的众神是具有生杀予夺大权的，所以，众神的生活质量就只能寄希望于这位领导的个人素质了。但文中提到凤仙郡太守只因为祈天时不敬，就连累全郡大旱了三年，卷帘大将军只因打破一个琉璃盏，就被贬为小河妖，可见这位领导十分暴戾，而这位皇帝和众神又长生不老，可见众神真是“此罪绵绵无绝期”了。按中国的传说规定，成为神是非常艰难的事情，很难想象众神历尽苦难的修炼只是为了换取一个更大的制度枷锁，所以，除了真正的既得利益者，众神在心底是必然反感这样一个制度的，是非常希望自由自在的生活的。君不见众神中只有杨戬的团队最拼命卖力，原因就是他与玉皇大帝有裙带关系，当初杨戬力劈桃山救母虽然英勇异常，说到底还是个凡人，后来突然成了可以不服封建礼数的神仙，其中必有隐情，想必是玉皇大帝把天庭弄成了家族企业，给了外甥杨戬一个不用工作又可以享受人间供奉的美差，你让其余的神仙怎么能够信服？ <BR>　　 <BR>　　　　这样再回到前面的问题，某些神仙即便打败了孙大圣，获得了升迁又怎样呢，他最多也只能成为权力最大的臣子，仍然摆脱不了被统治的命运，而且“伴君如伴虎”，由于以后能面对的永远是这个领导，就算他再圆滑事故，说不定几千几万年后的哪天就因为一个错误而前功尽弃。所以太上老君的金钢琢，明明可能收掉金箍棒的，却只用来打打人；太白金星的玉瓶，明明可以吸人的，老头儿却躲得远远的不见踪影。 <BR>　　 <BR>　　　　而做一个普通的天神又如何呢？神首先是长生不老的，而且又不存在光宗耀祖、封妻荫子的问题，所以无功远比有功的生存压力小，根本犯不着为了一个没有实质内容的头衔而冒伤残的危险。 <BR>　　 <BR>　　众神与孙大圣的对抗收益于是成为了负数，风险却成为了无穷大。众神都是绝顶聪明，这个算盘哪里会打不清楚，在战斗中为避免领导怪罪，肯定披挂整齐、杀声震天，但是贴身大战是没有记载的，也没有使出什么绝活，即所谓出工不出力。 <BR>　　 <BR>　　　　其实，书中还有一处反映了相同的问题，狮陀岭中的狮子精也吓退过天庭十万天兵，其间有没有发生激烈的战斗呢？没有，他只是张开大嘴吓唬了一下，天兵就退让了，反正狮子精只想要一个名分，众神并无实际利益损失，能不打仗就不打了吧。 <BR>　　 <BR>　　　　但在孙大圣取经的过程中，情况发生了变化，孙大圣这时候已经是“散仙”了，也即身份不再是妖怪，距离成仙只有小小的差距了。而他的对手却转为了彻头彻尾的妖精。 <BR>　　 <BR>　　 <BR>　　　　妖精对抗孙大圣的目的是为了吃唐僧肉或吸唐僧的元阳，其相关收益是长生不老——神仙的基本特征。这项工作的风险也是巨大的　——被孙大圣消灭掉。对于妖怪来说，这是一项高收益、高风险的事业，按照马克思《资本论》的论述，人们为了300%的利润，就敢于冒绞首的危险。而一步登天成为神仙的收益恐怕远远超过300%，可以想象妖怪们为了达成目的会有多么的狂热和勇敢。 <BR>　　 <BR>　　　　最厉害的还是那些有一定背景的妖怪，他们知道自己的主子不同凡响，自己就算有过错也不用担心被惩处。书中多次出现类似的章节：众神的下属或坐骑违规犯错，但是众神道貌岸然的解释说，唐僧取经必然要受劫难，下属的袭击正是这些劫难的一部分，所以，尽管下属的目的很阴暗，但是间接上为如来佛祖的考验工作出了不少力，帮助唐僧完成了受罪的任务，因此从本质上讲，他们的工作属于帮助性质，不是敌我关系，可以既往不咎、保留原职重新录用。如此高论，为所有有实力、有背景的妖精提供了绝佳的机遇，他们的工作风险已经下降为零，而收益仍然很高，这样有杀无赔的买卖能不让妖怪们竭尽全力、前赴后继？ <BR>　　 <BR>　　　　与此相对应的是孙大圣，他并无成佛的野心，对抗妖怪的目的不是杀尽天下妖魔鬼怪，只是为了保护师傅去西天取经。他与妖怪以前也无血海深仇，只有在妖怪袭击唐僧时才出手相救，所以工作属于被动反击性质。军事上称进攻是最好的防御，单纯防御是十分危险的行为，因此孙大圣在战斗中已经先输了一着。 <BR>　　 <BR>　　　　同时，由于被保护人唐僧缺少自我保护意识和抵御风险的能力，经常被妖怪扣为人质，使得孙大圣在援救工作中常常处于投鼠忌器的状态，在工作中不能放开手脚，于是又输了一着。 <BR>　　 <BR>　　　　加上唐僧十分迂腐，经常怀疑孙大圣滥杀无辜，并以酷刑“紧箍咒”进行频繁地打击，不但严重挫伤了孙大圣的工作积极性，而且使之不能有效地做好危机前的准备工作，更不能主动出击消除隐患，信息的前馈工作陷于僵局，只好通过反馈工作解决问题，战斗力再输一着。 <BR>　　 <BR>　　　　因此，在这场孙大圣和妖怪的竞争中，妖怪知己知彼、充分准备，而孙大圣畏首畏尾、束手束脚，尚未交战锐气已弱了一半，战斗胜利的可能性当然急剧减小。 <BR>　　 <BR>　　　　再看此时出手相援的众神，他们都是奉旨帮忙，所以第一是任务关乎天庭荣誉，必须完成，第二是性质属于天庭组织的无偿援助，有天庭作为后盾。因此，在妖怪没有大闹天宫的前提下，他一方面要提防自己失败后孙大圣和玉皇大帝都拿自己出气，同时又明白即使自己失败，整个组织——天庭失败的概率也很小——大不了再请如来佛祖出山，肯定手到擒来。所以，每个相援的神仙都会使出浑身解数，亮出绝活一展身手，只要自己尽力，孙大圣和玉皇大帝都没有口实怪罪，当然，拼命是不可能的，就像对付青牛怪一仗中，众神失去武器后不是继续进攻，而是徒呼奈何后就坐等更厉害的神仙来帮忙。 <BR>　　 <BR>　　　　那天写到这里，我感觉对情况的分析已经基本清楚，于是倒头便睡，不想当晚众神托梦于我，皆感叹天庭生存不易，人情世故与人间并无二致，未料想苦苦修行却只换来如此下场，真是可悲可叹……此时玉皇大帝突然现身，对我大发雷霆，说此文严重影响天庭形象，是对其管理能力的否定，要求我承担所有不良后果云云，我只是一介草民，哪里见过这种场面，不由又惊又怕，梦醒方知是为一梦，为避免人神共愤，在此特别申明，本文仅代表个人观点，且只为学术探讨，绝无借古讽今、否定名著之意，请各位姑妄听之，权当一笑。<BR></A>]]></description>
</item><item>
<title><![CDATA[全才的狗]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1616</link>
<author>topiemie</author>
<pubDate>2005/1/6 17:55:57</pubDate>
<description><![CDATA[（请各位勿对号入座） 一个公司想招聘一名新职员，于是就在临街的橱窗里贴出广告：“招聘文职人员，需会打字、懂电脑、精通两种语言。符合条件者机会均等。” 　　令经理惊讶的是，第一个来应聘的竟然是一条狗。 　　“对不起，我不能雇用一条狗在公司里做事。”经理说。 　　狗不服气，抬起前爪指着广告上“机会均等”字样叫了两声表示抗议。 　　经理没有办法，叹了口气问道：“你会打字吗？” 　　那条狗默默地走到打字机前，准确地打了一封信。 　　“你懂得怎样用电脑吗？”经理又问。 　　那条狗又坐在一台电脑前，迅速地编了个程序，操作的非常熟练。 　　经理有点儿气急败坏：“我真的不能雇一条狗工作。就算会打字、懂电脑，但是我需要的雇员要能说两种语言。”经理一下子想起了此事，认为这条狗应该知难而退了。 　　那条狗抬头看着经理说：“喵。。。。。。汪。。。。。。” <BR>]]></description>
</item><item>
<title><![CDATA[利用数据库复制技术 实现数据同步更新     选择自 lobeben 的 Blog]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1615</link>
<author>topiemie</author>
<pubDate>2005/1/6 17:46:57</pubDate>
<description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent> 
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">利用数据库复制技术</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"> </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">实现数据同步更新</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制的概念</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制是将一组数据从一个数据源拷贝到多个数据源的技术，是将一份数据发布到多个存储站点上的有效方式。使用复制技术，用户可以将一份数据发布到多台服务器上，从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新，从而保证数据的一致性。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>SQL</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制的基本元素包括</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">出版服务器、订阅服务器、分发服务器、出版物、文章</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>SQL</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制的工作原理</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>SQL SERVER </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器，负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器，分发服务器包含有一个分发数据库，可接收数据的所有改变，并保存这些改变，再把这些改变分发给订阅服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>SQL SERVER</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制技术类型</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>SQL SERVER</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">提供了三种复制技术，分别是：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>1</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、快照复制（呆会我们就使用这个）</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>2</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、事务复制</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>3</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、合并复制</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">第一先来配置出版服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(1)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选中指定</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">节点</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(2)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">工具</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下拉菜单的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">子菜单中选择</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">发布、订阅服务器和分发</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">命令</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(3)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">系统弹出一个对话框点</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下一步</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">然后看着提示一直操作到完成。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(4)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">(distribution)<BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">第二创建出版物</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(1)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选中指定的服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(2)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">工具</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">菜单的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">子菜单中选择</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">创建和管理发布</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">命令。此时系统会弹出一个对话框</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(3)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选择要创建出版物的数据库，然后单击</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">创建发布</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]<BR>(4)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">创建发布向导</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的提示对话框中单击</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下一步</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">其他两个大家可以去看看帮助</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">) <BR>(5)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">单击</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下一步</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">系统要求指定可以订阅该发布的数据库服务器类型，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SQLSERVER</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">允许在不同的数据库如</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"> ORACLE</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ACCESS</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">之间进行数据复制。但是在这里我们选择运行</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">"SQL SERVER 2000"</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的数据库服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(6)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">单击</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下一步</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">系统就弹出一个定义文章的对话框也就是选择要出版的表</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(7)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">然后</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下一步</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">第三设计订阅</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(1)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选中指定的订阅服务器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(2)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">工具</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下拉菜单中选择</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">复制</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">子菜单的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">请求订阅</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]<BR>(3)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">按照单击</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下一步</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">操作直到系统会提示检查</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SQL SERVER</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代理服务的运行状态，执行复制操作的前提条件是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">SQL SERVER</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代理服务必须已经启动。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR>(4)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">单击</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">[</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">完成</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。完成订阅操作。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢？这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">——</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">发布内容</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">——</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">右键发布内容</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">——</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">属性</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">——</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">击活</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">——</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生，每一分钟，在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">00</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">00</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">23</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">59</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">59</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">之间。接下来就是判断复制是否成功了打开</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">—<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>一个手工同步的方案</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>定时同步服务器上的数据</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>例子</FONT></SPAN><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">:<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">测试环境</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,SQL Server2000,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">远程服务器名</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">:xz,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">用户名为</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">:sa,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">无密码</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">测试数据库</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">:test<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">服务器上的表</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">(</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">查询分析器连接到服务器上创建</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">)<BR>create table [user](id int primary key,number varchar(4),name varchar(10))<BR>go<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">以下在局域网</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">(</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">本机操作</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">)<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">本机的表</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,state</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">说明</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">:null </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">表示新增记录</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,1 </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">表示修改过的记录</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,0 </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">表示无变化的记录</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)<BR>drop table [user]<BR>GO<BR>create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)<BR>go<BR>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">创建触发器</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">维护</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">state</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">字段的值</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>create trigger t_state on [user]<BR>after update<BR>as<BR>update [user] set state=1<BR>from [user] a join inserted b on a.id=b.id<BR>where a.state is not null<BR>go<BR>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">为了方便同步处理</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">创建链接服务器到要同步的服务器</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">这里的远程服务器名为</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">:xz,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">用户名为</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">:sa,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">无密码</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>if exists(select 1 from master..sysservers where srvname='srv_lnk')<BR>exec sp_dropserver 'srv_lnk','droplogins'<BR>go<BR>exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','xz'<BR>exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa'<BR>go<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>创建同步处理的存储过程</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_synchro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)<BR>drop procedure [dbo].[p_synchro]<BR>GO<BR>create proc p_synchro<BR>as<BR>--set XACT_ABORT on<BR>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">启动远程服务器的</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">MSDTC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">服务</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output<BR>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">启动本机的</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">MSDTC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">服务</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--exec master..xp_cmdshell 'net start msdtc',no_output<BR>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">进行分布事务处理</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">如果表用标识列做主键</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">用下面的方法</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--BEGIN DISTRIBUTED TRANSACTION<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>同步删除的数据</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>delete from srv_lnk.test.dbo.[user]<BR>where id not in(select id from [user])<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>同步新增的数据</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>insert into srv_lnk.test.dbo.[user]<BR>select id,number,name from [user] where state is null<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>同步修改的数据</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>update srv_lnk.test.dbo.[user] set<BR>number=b.number,name=b.name<BR>from srv_lnk.test.dbo.[user] a<BR>join [user] b on a.id=b.id<BR>where b.state=1<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>同步后更新本机的标志</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>update [user] set state=0 where isnull(state,1)=1<BR>--COMMIT TRAN<BR>go<BR>--</FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">创建作业</SPAN><SPAN lang=EN-US><FONT face="MS Shell Dlg">,</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">定时执行数据同步的存储过程</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>if exists(SELECT 1 from msdb..sysjobs where name='</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>数据处理</FONT></SPAN><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">')<BR>EXECUTE msdb.dbo.sp_delete_job @job_name='</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">数据处理</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">'<BR>exec msdb..sp_add_job @job_name='</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">数据处理</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">'<BR>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">创建作业步骤</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>declare @sql varchar(800),@dbname varchar(250)<BR>select @sql='exec p_synchro' --</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>数据处理的命令</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>,@dbname=db_name() --</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>执行数据处理的数据库名</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>exec msdb..sp_add_jobstep @job_name='</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>数据处理</FONT></SPAN><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">',<BR>@step_name = '</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">数据同步</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">',<BR>@subsystem = 'TSQL',<BR>@database_name=@dbname,<BR>@command = @sql,<BR>@retry_attempts = 5, --</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">重试次数</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>@retry_interval = 5 --</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>重试间隔</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>--</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>创建调度</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>EXEC msdb..sp_add_jobschedule @job_name = '</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>数据处理</FONT></SPAN><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">', <BR>@name = '</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">时间安排</SPAN></FONT><FONT size=2><SPAN lang=EN-US><FONT face="MS Shell Dlg">',<BR>@freq_type = 4, --</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'">每天</SPAN></FONT><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>@freq_interval = 1, --</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>每天执行一次</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>@active_start_time = 00000 --0</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'MS Shell Dlg'; mso-hansi-font-family: 'MS Shell Dlg'"><FONT size=2>点执行</FONT></SPAN><SPAN lang=EN-US><BR><FONT face="MS Shell Dlg" size=2>go</FONT></SPAN></P></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/lobeben/" target=_blank>http://blog.csdn.net/lobeben/</A></DIV>]]></description>
</item><item>
<title><![CDATA[SQL Server口令密码对照表     选择自 lobeben 的 Blog]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1614</link>
<author>topiemie</author>
<pubDate>2005/1/6 17:44:17</pubDate>
<description><![CDATA[<A>　<SPAN id=ArticleContent1_ArticleContent1_lblContent>SQL Server在1433端口传输的数据大部分是明文的，这包括IP地址，连接用户名，成功和失败消息这样一来，就很容易使用嗅探器嗅探在这个网段内SQL Server的相关信息，得到用户名和IP后，就差口令了，其实SQL的口令加密是十分脆弱的．　　 <BR><BR>　　昨天我用了半小时，整理了一份口令字符对照表，在分析SQL Server加密口令的时候，同时发现了SQL Server一个不大不小的BUG----如果你用";"做口令将导致口令失效，原因是SQL Server的口令对照表中，没有这个字符，当SQL Server遇到这个口令字符的时候，就会主动放弃这个字符，这样一来，口令长度将与实际长度不符，当你下次连接1433的时 候，这个字符就无法被系统识别出来，从而报告口令错误。 　　 <BR><BR>　　口令对照表的用法： <BR><BR>　　 <BR><BR>　　1.用16进制编辑器打开你Sniff到的东西，然后找到SQL Server连接的用户名，从用户名开始后面的第一个0x5a - 1的位置就是口令的第一位，每一位口令均以0x5a分隔开来，口令字的变换请对照口令字符 <BR><BR>　　对照表： 　　 <BR><BR>　　a 0xb3 <BR><BR>　　b 0x83 <BR><BR>　　c 0x93 <BR><BR>　　d 0xe3 <BR><BR>　　e 0xf3 <BR><BR>　　f 0xc3 <BR><BR>　　g 0xd3 <BR><BR>　　h 0x23 <BR><BR>　　i 0x33 <BR><BR>　　j 0x03 <BR><BR>　　k 0x13 <BR><BR>　　l 0x63 <BR><BR>　　m 0x73 <BR><BR>　　n 0x43 <BR><BR>　　o 0x53 <BR><BR>　　p 0xa2 <BR><BR>　　q 0xb2 <BR><BR>　　r 0x82 <BR><BR>　　s 0x92 <BR><BR>　　t 0xe2 <BR><BR>　　u 0xf2 <BR><BR>　　v 0xc2 <BR><BR>　　w 0xd2 <BR><BR>　　x 0x22 <BR><BR>　　y 0x32 <BR><BR>　　z 0x02 <BR><BR>　　1 0xb6 <BR><BR>　　2 0x86 <BR><BR>　　3 0x96 <BR><BR>　　4 0xe6 <BR><BR>　　5 0xf6 <BR><BR>　　6 0xc6 <BR><BR>　　7 0xd6 <BR><BR>　　8 0x26 <BR><BR>　　9 0x36 <BR><BR>　　0 0xa6 <BR><BR>　　- 0x77 <BR><BR>　　= 0x76 <BR><BR>　　\ 0x60 <BR><BR>　　[ 0x10 <BR><BR>　　] 0x70 <BR><BR>　　' 0xd7 <BR><BR>　　, 0x67 <BR><BR>　　. 0x47 <BR><BR>　　/ 0x57 <BR><BR>　　` 0xa3 <BR><BR>　　! 0xb7 <BR><BR>　　@ 0xa1 <BR><BR>　　# 0x97 <BR><BR>　　$ 0xe7 <BR><BR>　　% 0xf7 <BR><BR>　　^ 0x40 <BR><BR>　　&amp; 0xc7 <BR><BR>　　* 0x07 <BR><BR>　　( 0x27 <BR><BR>　　) 0x37 <BR><BR>　　A 0xb1 <BR><BR>　　B 0x81 <BR><BR>　　C 0x91 <BR><BR>　　D 0xe1 <BR><BR>　　E 0xf1 <BR><BR>　　F 0xc1 <BR><BR>　　G 0xd1 <BR><BR>　　H 0x21 <BR><BR>　　I 0x31 <BR><BR>　　J 0x01 <BR><BR>　　K 0x11 <BR><BR>　　L 0x61 <BR><BR>　　M 0x71 <BR><BR>　　N 0x41 <BR><BR>　　O 0x51 <BR><BR>　　P 0xa0 <BR><BR>　　Q 0xb0 <BR><BR>　　R 0x80 <BR><BR>　　S 0x90 <BR><BR>　　T 0xe0 <BR><BR>　　U 0xf0 <BR><BR>　　V 0xc0 <BR><BR>　　W 0xd0 <BR><BR>　　X 0x20 <BR><BR>　　Y 0x30 <BR><BR>　　Z 0x00 <BR><BR>　　_ 0x50 <BR><BR>　　+ 0x17 <BR><BR>　　　 0x62 <BR><BR>　　{ 0x12 <BR><BR>　　} 0x72 <BR><BR>　　: 0x06 <BR><BR>　　" 0x87 <BR><BR>　　&lt; 0x66 <BR><BR>　　&gt; 0x46 <BR><BR>　　? 0x56 <BR><BR>　　~ 0x42 <BR><BR>　　; 不存在　　 <BR><BR>　　以上文章是珍藏的东西。希望能对你在hacking有帮助</SPAN> <BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG></A><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/lobeben/" target=_blank>http://blog.csdn.net/lobeben/</A><A></DIV>
<DIV style="FONT-SIZE: 14px; COLOR: #900; LINE-HEIGHT: 25px"><STRONG>相关文章</STRONG></DIV>
<TABLE id=ArticleContent1_ArticleContent1_RelatedArticles style="BORDER-COLLAPSE: collapse" cellSpacing=0 border=0>
<TBODY>
<TR>
<TD><A href="http://dev.csdn.net/article/article/58/58550.shtm">SQL Server口令密码对照表</A> </TD></TR>
<TR>
<TD><A href="http://dev.csdn.net/article/article/52/52303.shtm">利用数据库复制技术 实现数据同步更新</A> </TD></TR></TBODY></TABLE></A>]]></description>
</item><item>
<title><![CDATA[ASP.NET常用函数]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1610</link>
<author>topiemie</author>
<pubDate>2005/1/6 16:30:07</pubDate>
<description><![CDATA[<A>　ASP.NET常用函数 <BR>添加时间：2004-7-12&nbsp;&nbsp; 查看：124次 &nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Abs(number) 取得数值的绝对值。 <BR><BR>Asc(String) 取得字符串表达式的第一个字符ASCII 码。 <BR><BR>Atn(number) 取得一个角度的反正切值。 <BR><BR>CallByName (object, procname, usecalltype,[args()]) 执行一个对象的方法、设定或传回对象的属性。 <BR><BR>CBool(expression) 转换表达式为Boolean 型态。 <BR><BR>CByte(expression) 转换表达式为Byte 型态。 <BR><BR>CChar(expression) 转换表达式为字符型态。 <BR><BR>CDate(expression) 转换表达式为Date 型态。 <BR><BR>CDbl(expression) 转换表达式为Double 型态。 <BR><BR>CDec(expression) 转换表达式为Decimal 型态。 <BR><BR>CInt(expression) 转换表达式为Integer 型态。 <BR><BR>CLng(expression) 转换表达式为Long 型态。 <BR><BR>CObj(expression) 转换表达式为Object 型态。 <BR><BR>CShort(expression) 转换表达式为Short 型态。 <BR><BR>CSng(expression) 转换表达式为Single 型态。 <BR><BR>CStr(expression) 转换表达式为String 型态。 <BR><BR>Choose (index, choice-1[, choice-2, ... [, choice-n]]) 以索引值来选择并传回所设定的参数。 <BR><BR>Chr(charcode) 以ASCII 码来取得字符内容。 <BR><BR>Close(filenumberlist) 结束使用Open 开启的档案。 <BR><BR>Cos(number) 取得一个角度的余弦值。 <BR><BR>Ctype(expression, typename) 转换表达式的型态。 <BR><BR>DateAdd(dateinterval, number, datetime) 对日期或时间作加减。 <BR><BR>DateDiff(dateinterval, date1, date2) 计算两个日期或时间间的差值。 <BR><BR>DatePart (dateinterval, date) 依接收的日期或时间参数传回年、月、日或时间。 <BR><BR>DateSerial(year, month, day) 将接收的参数合并为一个只有日期的Date 型态的数据。 <BR><BR>DateValue(datetime) 取得符合国别设定样式的日期值，并包含时间。<BR><BR>Day(datetime) 依接收的日期参数传回日。 <BR><BR>Eof(filenumber) 当抵达一个被开启的档案结尾时会传回True。 <BR><BR>Exp(number) 依接收的参数传回e 的次方值。 <BR><BR>FileDateTime(pathname) 传回档案建立时的日期、时间。 <BR><BR>FileLen(pathname) 传回档案的长度，单位是Byte。 <BR><BR>Filter(sourcearray, match[, include[, compare]]) 搜寻字符串数组中的指定字符串，凡是数组元素中含有指定字符串，会将它们结合成新的字符串数组并传回。若是要传回不含指定字符串的数组元素，则 include 参数设为False。compare 参数则是设定搜寻时是否区分大小写，此时只要给TextCompare 常数或1 即可。 <BR><BR>Fix(number) 去掉参数的小数部分并传回。 <BR><BR>Format(expression[, style[, firstdayofweek[, firstweekofyear]]]) 将日期、时间和数值资料转为每个国家都可以接受的格式。 <BR><BR>FormatCurrency(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 将数值输出为金额型态。 <BR><BR>numdigitsafterdecimal 参数为小数字数，includeleadingdigit 参数为当整数为0 时是否补至整数字数。 <BR><BR>FormatDateTime(date[,namedformat]) 传回格式化的日期或时间数据。 <BR><BR>FormatNumber(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回格式化 <BR><BR>的数值数据。Numdigitsafterdecimal 参数为小数字数，includeleadingdigit 参数为当整数为0 时是否补至整数字数。 <BR><BR>FormatPercent(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回转换为百分比格式的数值数据。numdigitsafterdecimal 参数为小数字数，includeleadingdigit 参数为当整数为0 时是否补至整数字数。 <BR><BR>GetAttr(filename) 传回档案或目录的属性值。 <BR><BR>Hex(number) 将数值参数转换为16 进制值。 <BR><BR>Hour(time) 传回时间的小时字段，型态是Integer。 <BR><BR>Iif(expression, truepart, falsepart) 当表达式的传回值为True 时执行truepart 字段的程序，反之则执行falsepart 字段。 <BR><BR>InStr([start, ]string1, string2) 搜寻string2 参数设定的字符出现在字符串的第几个字符，start 为由第几个字符开始寻找，string1 为欲搜寻的字符串，string2 为欲搜寻的字符。 <BR><BR>Int(number) 传回小于或等于接收参数的最大整数值。 <BR><BR>IsArray(varname) 判断一个变量是否为数组型态，若为数组则传回True，反之则为False。<BR><BR>IsDate(expression) 判断表达式内容是否为DateTime 型态，若是则传回True，反之则为False。 <BR><BR>IsDbNull(expression) 判断表达式内容是否为Null，若是则传回True，反之则为False。 <BR><BR>IsNumeric(expression) 判断表达式内容是否为数值型态，若是则传回True，反之则为False。 <BR><BR>Join(sourcearray[, delimiter]) 将字符串数组合并唯一个字符串，delimiter 参数是设定在各个元素间加入新的字符串。 <BR><BR>Lcase(string) 将字符串转换为小写字体。 <BR><BR>Left(string, length) 由字符串左边开始取得length 参数设定长度的字符。 <BR><BR>Len(string) 取得字符串的长度。 <BR><BR>Log(number) 取得数值的自然对数。 <BR><BR>Ltrim(string) 去掉字符串的左边空白部分。 <BR><BR>Mid(string, start[, length]) 取出字符串中strat 参数设定的字符后length 长度的字符串，若length 参数没有设定，则取回start 以后全部的字符。 <BR><BR>Minute(time) 取得时间内容的分部分，型态为Integer。 <BR><BR>MkDir(path) 建立一个新的目录。 <BR><BR>Month(date) 取得日期的月部分，型态为Integer。<BR><BR>MonthName(month) 依接收的月份数值取得该月份的完整写法。 <BR><BR>Now() 取得目前的日期和时间。 <BR><BR>Oct(number) 将数值参数转换为8 进制值。 <BR><BR>Replace(expression, find, replace) 将字符串中find 参数指定的字符串转换为replace 参数指定的字符串。 <BR><BR>Right(string,length) 由字符串右边开始取得length 参数设定长度的字符。 <BR><BR>RmDir(path) 移除一个空的目录。 <BR><BR>Rnd() 取得介于0 到1 之间的小数，如果每次都要取得不同的值，使用前需加上Randomize 叙述。 <BR><BR>Rtrim(string) 去掉字符串的右边空白部分。 <BR><BR>Second(time) 取得时间内容的秒部分，型态为Integer。 <BR><BR>Sign(number) 取得数值内容是正数或负数，正数传回1，负数传回-1，0 传回0。 <BR><BR>Sin(number) 取得一个角度的正弦值。 <BR><BR>Space(number) 取得number 参数设定的空白字符串。<BR><BR>Split(expression[, delimiter]) 以delimiter 参数设定的条件字符串来将字符串分割为字符串数组。 <BR><BR>Sqrt(number) 取得一数值得平方根。 <BR><BR>Str(number) 将数字转为字符串后传回。 <BR><BR>StrReverse(expression) 取得字符串内容反转后的结果。 <BR><BR>Tan(number) 取得某个角度的正切值。 <BR><BR>TimeOfDay() 取得目前不包含日期的时间。 <BR><BR>Timer() 取得由0:00 到目前时间的秒数，型态为Double。 <BR><BR>TimeSerial(hour, minute, second) 将接收的参数合并为一个只有时间Date 型态的数据。 <BR><BR>TimaValue(time) 取得符合国别设定样式的时间值。 <BR><BR>Today() 取得今天不包含时间的日期。 <BR><BR>Trim(string) 去掉字符串开头和结尾的空白。 <BR><BR>TypeName(varname) 取得变量或对象的型态。 <BR><BR>Ubound(arrayname[, dimension]) 取得数组的最终索引值，dimension 参数是指定取得第几维度的最终索引值。 <BR><BR>Ucase(string) 将字符串转换为大写。 <BR><BR>Val(string) 将代表数字的字符串转换为数值型态，若字符串中含有非数字的内容则会将其去除后，合并为一数字。 <BR><BR>Weekday(date) 取的参数中的日期是一个星期的第几天，星期天为1、星期一为2、星期二为3 依此类推。 <BR><BR>WeekDayName(number) 依接收的参数取得星期的名称，可接收的参数为1 到7，星期天为1、星期一为2、星期二为3 依此类推。<BR><BR>&nbsp;<BR>&nbsp;<BR><BR></A>]]></description>
</item><item>
<title><![CDATA[帮你免于失业的十大软件技术]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1598</link>
<author>topiemie</author>
<pubDate>2005/1/6 15:39:56</pubDate>
<description><![CDATA[
<P>帮你免于失业的十大软件技术&nbsp; <BR>作者: beiyan（翻译） 类别: 软件工程/其他 日期: 2003-1-21 11:53:55&nbsp; <BR>&nbsp;<BR>帮你免于失业的十大软件技术 beiyan（翻译） </P>
<P>关键字 软件 技术 xml design pattern object oriented javascript sql </P>
<P>出处 <A href="http://www.devx.com/DevX/Article/10244">http://www.devx.com/DevX/Article/10244</A> </P>
<P>&nbsp;The 10 Technologies that Will Help You Stay Employed<BR>Keeping up with key technologies is the best thing you can do to give yourself an edge in the employment market now—and in the future. Are you at least semi-proficient with all 10 of the technologies on our list? </P>
<P>by A. Russell Jones, Executive Editor </P>
<P><BR>能跟上关键技术的发展，是你在就业市场和未来保持优势的最佳手段。你对我们列出的十门技术精通吗？哪怕是大略精通？<BR>&nbsp;罗素·琼斯，执行编辑 2002年12月11日&nbsp;</P>
<P>我不知道你的具体工作是什么。如果你是某冷门领域的专家而变得不可或缺，或者你们的公司十分稳固，以你现有的技术就足以安度你的职业生涯，那我不知道你是否有失业的危险。不管怎样，请你先不要急着寄出那些告诉我你们的公司对用VB3十分满意或你们除C以外永不用其它语言的信件，并保留起那些讲述.NET将如何把Java扫地出门、XML将如何取代关系型数据库、或你怎样能用汇编语言或C写任何软件而任何其它开发工具都不重要的信件。&nbsp;</P>
<P>现在，想象一下如果你像很多受裁员和公司倒闭影响的同行一样失去了工作，那将会怎样。如果你突然需要搬往它处该怎么办？如果你的公司突然做了技术转向又怎么办？&nbsp;</P>
<P>在目前的就业市场，经理们是根据当前和未来的开发需要招聘雇员。作为开发人员，你所掌握的知识是你找工作和保住工作的关键。你要了解技术的发展方向，跟上技术的变化，这一点十分重要，即使你永远不用再找开发方面的工作。</P>
<P>&nbsp;这里是我选出的当前最重要的十大开发技术，最重要的排在前面。看完本文后，请务必加入talk.editors.devx讨论组，提出你选出的十大技术。</P>
<P>&nbsp;1. XML<BR>首先，你要了解XML。我不是说仅仅是XML规格本身，还包括一系列相关的基于XML的语言：最重要的是XHTML、XSLT、XSL、DTDs、XML Schema (XSD)、XPath、XQuery和SOAP。那些在过去5年内从未碰过键盘的人，可能不知道XML为何物。XML是一种文本文件，使用与HTML类似的标记。XML能定义一个树状结构，并能描述所含的数据。<BR>XML最好的一点是既能存结构化数据也能存非结构化数据。它既能存贮和描述“规格的”(regular)表格数据，也能容纳和描述“粗糙的”(ragged)文件数据。<BR>XHTML是现今写HTML的首选方法。因为它是形式完好（well formed）的XML，比起古老的、通常是畸形（malformed）的HTML文件，XHTML格式的文件更容易处理。<BR>XSLT和XSL是用于把XML文件转成其它格式的语言。可转换的格式包括：文本文件、PDF文件、HTML、以逗号为分隔符的文件，或其它XML文件。<BR>DTD和XML Schema描述XML文件所能包含的内容的类型，并让你“验证”XML文件内容的合理性，而不用写特殊代码以确保内容符合规则要求。<BR>XPath和XQuery是用于从XML文件中抽取单个项目或一组项目的查询语言。XQuery扩展了XPath，因而更重要。XQuery与XML的关系正像SQL与关系数据库的关系。<BR>SOAP是Web服务之间的一个标准通讯协议。尽管你不需要对SOAP标准一清二楚，你应该熟悉一般的schema和它的工作原理，以便能应用这门技术。</P>
<P>&nbsp;2. Web服务</P>
<P>Web服务是XML流行后的一个直接产物。因为你能用XML描述数据和物件，因为你能用schema确保XML文件内容的合理性，因为XML是基于文本的规范，XML为跨平台通讯标准提供了一个极其方便的基本格式。如果你还从来没碰到Web服务，你可能很快就会碰到，在未来5年内，你几乎肯定会碰到。熟悉Web服务十分重要，因为它是目前所有跨不同机器、不同语言、不同平台和不同地点的通讯协议中最简单的一个。不管你需要与否，Web服务是迈向互用性的重要一步。</P>
<P>XML工作组主席John Bosak曾说XML“给Java一些事做”。实际上，Web服务让所有语言都有了一些事做。Web服务让在大型机上运行的COBOL应用软件能调用在手持设备上运行的Java应用程序、能让Java applet与.NET服务器交谈、能让微机软件与Web服务器无缝连接，并提供了一个相对容易的方法，让企业不光能向外界提供数据，还能提供功能，而且是一种与语言、平台和位置都独立的方法。</P>
<P>3. 面向对象的编程</P>
<P>很多程序员仍认为OOP是象牙塔里的技术。但如果你想一下是什么语言在过去的10年里占主导地位，你就会理解OOP不是象牙塔里的技术。OOP从Smalltalk开始，传到C++和Pascal (Delphi)。Java使OOP大踏步地迈向主流，几年后的VB.NET和C#则完全确立了OOP的优势地位。尽管这些语言中的多数并不要求你必须会OOP，但我觉得如果你不了解OOP的基本概念也不知道如何应用这些概念，你能找到的编程工作将越来越少。&nbsp;</P>
<P>4. Java、C++、C#和VB.NET</P>
<P>我把这些语言列在一起，并不是建议你成为每一种语言的专家。我的理由是：学习编程最有效的方法之一是看代码，而你能看到的大量的代码很可能不是用你所喜爱的语言编写的。</P>
<P>在过去几年，各语言的能力越来越接近。现在，你可以用VB.NET写Windows服务、Web应用程序或命令行程序。即使你只使用一种语言，你也应该学一些其它语言，以便能看懂那些样例，并将其翻译到你所用的语言。这4种语言是基本核心，还有其它一些满足不同需要、颇具用途的语言，如FORTRAN、COBOL、APL、ADA、Perl和Lisp。</P>
<P>5. JavaScript</P>
<P>尽管名字有些相像，但Java与JavaScript并无关联。为什么一个脚本语言会如此重要呢？因为所有主流浏览器都用JavaScript。如果你需要写Web应用程序，你就有足够的理由学JavaScript。JavaScript可以用作ASP或ASP.NET的服务器语言，也可以当做用于扩展XSLT的功能语言(functional language)。JavaScript是Mozilla/Netscape中用于激活基于XUL的程序接口的首选语言。JavaScript的一个变种ActionScript是Flash MX的编程语言。将来，JavaScript很可能成为新设备的编程语言，以及大型应用软件中的宏语言。<BR>与JavaScript相对照的是VBScript。尽管Microsoft的软件对VBScript有良好的支持，但VBScript在未来的开发工作中很可能是一个糟糕的选择。就是Microsoft也倾向于用JavaScript（或Microsoft自己的变种：JScript）写客户端程序。在选择脚本语言时，请选择JavaScript。</P>
<P>6. 正则表达式（Regular Expressions）<BR>查寻关系数据库可以用SQL，查询XML可以用XPath和XQuery，查询纯文本文件则可以用正则表达式。例如，你可以用一个命令从一个HTML文件中查找并删除所有的注释。各种开发语言内置的一些简单的文本查询功能，如"IndexOf"函数或VB中经典的"InStr"函数或"Like"操作符，根本不能与正则表达式相提并论。现在，各种主要的开发语言都提供使用正则表达式的途径。尽管正则表达式本身既难懂更难读（是回到早期计算机时代的一种倒退），但它却是一个功能强大而且未被充分利用的工具。&nbsp;</P>
<P>7. 设计模式<BR>正像OOP通过把对象分类以简化编程一样，设计模式对一些普遍的对象之间的交互进行分类，并赋予一个恰当的名称。OOP用得越多，设计模式就越有用。一些最常用的模式的名称已经变成了软件开发领域共同使用的术语，所以要跟上信息的主流，你就要对设计模式有相当的理解。</P>
<P>8. Flash MX&nbsp;</P>
<P>如果你需要在客户端得到比HTML和CSS更多的图形和更强的编程功能，Flash是你的答案。用Flash编程比开发Java applets或写.NET代码要快得多，也容易得多。在最新版本 (MX) 中，Flash不仅仅是画图和制造动画的工具，它已经成为一个编程功能强大的开发环境：能调用SOAP Web服务，也能调用远端服务器上的ColdFusion、Java或.NET程序。Flash无处不在。它的引擎存在于世界上大多数客户端计算机，包括手持设备、置顶盒、甚至是新的书写板电脑。所以使用Flash能大大扩展你的程序的应用范围。</P>
<P>9. Linux/Windows<BR>熟悉Linux。在一台旧机器或新机器上安装Linux。下载图形用户界面，在其基础上写一些程序。安装Apache，写一个Web应用程序。这个世界不再仅仅是属于Windows，这种趋势可能还会持续下去。如果你是一名中坚的Linux开发人员，那就抛弃你对Windows的憎恶，看看你能否做一些Windows编程。Windows能继续在台式电脑上称王是有其原因的，这不仅仅是因为Microsoft控制了这个市场。<BR>没人知道你们公司会在什么时候决定从Linux转向Windows（或从Windows转向Linux），或者你想跳到一家用另一种平台的公司，或者你想出了开发一个杀手软件的好主意，所以你要争取拥有在不同操作系统上的编程经验。</P>
<P>10. SQL</P>
<P>尽管SQL不像本文讨论的其它技术那样新，而且SQL的重要性在未来10年内很可能降低，但它仍然是一项基本技能。很多开发人员还没有掌握这门技术，或掌握得不够，不足以有效率地使用它。不要依赖具有图形用户界面的SQL生成器替你做事情，你要自己手工地写查询命令，直到你熟悉基本的SQL语法为止。了解SQL不仅能帮助你日后学习XQuery，你还有可能马上发现能简化或改进目前项目的方法。</P>
<P>培养好奇心</P>
<P>最后，（对，我意识到这是第11门技术），好奇心是你最重要的技能。要去尝试各种东西。新语言或新技术对你当前或将来的工作可能有用，也可能没用，但并不是你所学的每一件事都是为了工作。不要害怕失败，万事开头难，学新技术也是如此。大多数失败是因为人们希望太快地学到太多的东西。要对每一点进步感到满意，不要让时间（或缺乏时间）妨碍你。相反，你要安排时间留心、研究、试验新的开发技术和工具。</P>
<P>你可能永远也没有必要成为这些技术的专家，而且我的选择可能根本不适合你的特殊情况，但通过培养好奇心，你将会发现你应该了解的东西。</P>
<P>编辑注：现在就到talk.editors.devx讨论组去评论罗素的选择，并提出你自己的清单。</P>
<P>罗素·琼斯是DevX的执行编辑。E-mail地址是：<A href="mailto:rjones@devx.com">rjones@devx.com</A>。</P>
<P>? 版权所有2003 DevX Inc.<BR>&nbsp;<BR>&nbsp;<BR></P>]]></description>
</item><item>
<title><![CDATA[URL欺骗(转载)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1597</link>
<author>topiemie</author>
<pubDate>2005/1/6 15:36:16</pubDate>
<description><![CDATA[<P>URL欺骗(转载) <BR>原文：URL欺骗(转载) </P>
<P>By Razvan Peteanu (<A href="mailto:razvan.peteanu@home.com">razvan.peteanu@home.com</A>) for SecurityPortal.com <BR>Trans By <A href="mailto:F@tFox">F@tFox</A> (<A href="mailto:fatfox@yesky.com">fatfox@yesky.com</A>) <BR>翻译：fatfox <BR>来源:绿色兵团bbs <A href="http://www.vertarmy.org/bbs/">http://www.vertarmy.org/bbs/</A> </P>
<P>URL结构 </P>
<P>我们来仔细看看URLs和与其有关的安全含义。一种“有趣”的URL利用方式已被垃圾广告投递者发现很长时间了，不过现在“KB”（Knowledge Base）欺骗和二月发表于Crypto-Gram的文章，已经使得URL可以做更多的事。 </P>
<P>虽然大部分Internet用户把WWW地址或FTP同URLs联系起来，但Uniform Resource Locators（URL，统一资源定位器）使用的更普遍一些。URLs的标准在RFC1738中规定，其中最普通的形式定义为： <BR>: <BR>部分是网络协议名称，部分被定义为： <BR>//:@:/ <BR>其中只有部分是必须的。":"和"@"字符具有特殊的含义,从而服务器可以解析完整的字符串.如果用户名和密码包含在URL中,部分只是从"@"字符后开始.看看在KB欺骗论及的例子: <BR>"<A href="http://www.microsoft.com&amp;item=q209354@www.hwnd.net/pub/mskb/Q209354.asp">http://www.microsoft.com&amp;item=q209354@www.hwnd.net/pub/mskb/Q209354.asp</A>"<BR>其中真正的主机是"<A href='http://www.hwnd.net"."www.microsoft.com'>www.hwnd.net"."www.microsoft.com</A>"在这个URL中不过是个假的用户名,服务器会忽略它. </P>
<P>虽然上面的例子是合乎语法的,但是却可能引起同安全相关的问题.在Internet节点的终端,不是网卡、Modems或计算机，而是人.他们有意识或无意识都应该考虑到屏幕上出现的东西是否值得信任. </P>
<P>信任是最基本的安全评价.像上面例子那样的带有欺骗性的URL,利用了我们对常识中URLs格式的信任.这种欺骗还利用了我们把主要注意力都集中到主要内容而不是URL地址(虽然有时URL可以帮助我们判断可信度)这个事实.SSL保护的站点,把一部分对可信度的判断工作交给浏览器,浏览器会比较带有SSL认证信息的域;另一方面,如果目的主机是虚构的,那么仅仅依靠加密技术并不能提供太多有用的评价. </P>
<P><BR>隐藏 </P>
<P>上面关于URL的分析只是简单的隐藏了它的真实目的地.我们可以用更好的方法来进行隐藏.由于某些原因(有可能是内部处理引起的),有的操作系统对IP地址的操作并不是通过我们常用的格式,就象是:aaa.bbb.ccc.ddd,而是相应的十进制数. </P>
<P>上面这类地址可以改写成十进制的值:aaa*256^3+bbb*256^2+cccc*256+ddd.这样,3633633987就是216.148.218.195(属于"<A href="http://www.redhat.com">www.redhat.com</A>"红帽子公司).你可以在浏览器中输入3633633987,你会发现你已经来到了REDHAT公司的网站上.上面的操作可以使用IE5.X或者是Linux下的Lynx,但并没对其他操作系统进行测试,可能会相差很多.一些软件会对你的输入提示"非法的URLs",但你只要用很少的软件(包括常用的工具,如ping)进行测试,你就可以判断出这个操作系统是否支持这种URLs的使用方式. </P>
<P>如果该操作系统支持这种使用,那么就可以通过构造如下的URL来制造更大的迷惑:"<A href="http://www.toronto.comntario@3633633987/">http://www.toronto.comntario@3633633987/</A>",这个URL仍然指到REDHAT.因为很多的网站都把HTTP的SessionID存在URL中,来代替使用Cookie,所以Internet使用者并不会注意URL中的数字值,这样上面构造的URL不会带来任何怀疑.密码部分可以省略,这样"<A href="http://www.toronto.com@3633633987/">http://www.toronto.com@3633633987/</A>"的迷惑性更强</P>
<P>现在,我们可以使用一些HTTP知识:anchor(锚)标记允许显示的文本指到一个不是文本本身的连接上,这样我们可以把连接写成"<A href="http://www.toronto.com">http://www.toronto.com</A>",然后把连接的文字设成锚,再把这个锚连接到"<A href="http://www.toronto.com@3633633987/">http://www.toronto.com@3633633987/</A>"上,是不是很危险,如果你点击这个连接,依旧会把你带到REDHAT公司</P>
<P>另一个对信任的利用是可信站点的间接寻址提供的.很多知名网站通过如下格式的连接来记录引导访问者来此的网址:"<A href="http://www.thisisarespectablesite.com/outsidelinks/http://externalsite">http://www.thisisarespectablesite.com/outsidelinks/http://externalsite</A>",在服务器端捕获请求信息后,再把用户重定向到目标网站上. </P>
<P>这就使任何人都可以使用这种间接寻址服务,通过与URL困惑组合使用,给欺诈性的URLs提供更多的合法性.可以限制HTTP提交区域的输入值,来避免非法的输入,但很少有网站这么做. </P>
<P>如果你觉着以上说的还不够,哪你还可以利用Unicode编码,把真实目的URL通过Unicode码写出,再解析时会还原成真实目的. </P>
<P>上面的这些对于"知识渊博"的垃圾广告制造者来说都不是新东西,但对于用来攻击一般不会起疑的用户来说,还是非常有用的. </P>
<P><BR>One-click 攻击 </P>
<P>下面,我们对URL安全问题进一步讨论. </P>
<P>很多"标准"的攻击都可以从缓冲区溢出开始,但是现在这种溢出却不好找到.那么,我们怎么办呢? </P>
<P>在注册表中,有如下的键值:HKEY_LOCAL_MACHINE＼SOFTWARE＼Classes＼PROTOCOLS＼Handler,在HKEY_CLASSES_ROOT＼Shell下还有"URL Protocol"这个子键(你可以使用查找来搜索这些键).其中你可以找到"<A href="ftp://http://,https://,mailto://">ftp://http://,https://,mailto://</A>, <A href="news://">news://</A>, pnm://"和其他协议.这里面有很多协议都是以前没见过的,比如msee://.通过快速的试验,发现msee://是"微软大百科"使用的,可能是用来查阅内部文章用的."微软大百科"是否会引起缓冲区溢出呢,如果是,那么是否可以实际利用呢?这些都要进行更深的研究. </P>
<P>我们可以找到很多在安装软件时添加的URL构造(比如copernic://就是copernic搜索工具生成的).另外,还可以使用脚本语言修改受害机注册表来添加我们的URL结构,脚本语言可以用vbs编制,然后通过email发送过去,在然后.........你就可以使用这个URL结构来引起缓冲区溢出了.虽然这看起来同URL联系不大,但多少还有些联系,所以就一起说了. </P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[纪念!!!]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=topiemie&amp;id=1595</link>
<author>topiemie</author>
<pubDate>2005/1/6 14:54:37</pubDate>
<description><![CDATA[<P>今天刚刚申请好，以前只看别人用过，今天自己也申请一个试试。</P>
<P>打算以后自己也写一个。</P>]]></description>
</item>
</channel>
</rss>