﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-jacky-文章分类-其他</title><link>http://www.blogjava.net/jackywjj/category/2058.html</link><description>To follow the path:
look to the master,
follow the master,
walk with the master,
see through the master,
become the master.</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:46:49 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:46:49 GMT</pubDate><ttl>60</ttl><item><title>教你如何查看自己开放的端口！</title><link>http://www.blogjava.net/jackywjj/articles/68030.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 06 Sep 2006 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/68030.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/68030.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/68030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/68030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/68030.html</trackback:ping><description><![CDATA[
		<p>最近被病毒搞的头昏脑涨的，不过也收获不小哟，知道了点小方法，与大家共勉。<br />当前最为常见的木马通常是基于TCP/UDP协议进行client端与server端之间的通讯的，既然利用到这两个协议，就不可避免要在server端（就是被种了木马的机器了）打开监听端口来等待连接。例如鼎鼎大名的冰河使用的监听端口是7626，Back Orifice 2000则是使用54320等等。那么，我们可以利用查看本机开放端口的方法来检查自己是否被种了木马或其它hacker程序。以下是详细方法介绍。<br />1． Windows本身自带的netstat命令<br />关于netstat命令，我们先来看看windows帮助文件中的介绍：</p>
		<p>Netstat<br />显示协议统计和当前的 TCP/IP 网络连接。该命令只有在安装了 TCP/IP 协议后才可以使用。</p>
		<p>netstat [-a] [-e] [-n] [-s] [-p protocol] [-r] [interval]</p>
		<p>参数</p>
		<p>-a</p>
		<p>显示所有连接和侦听端口。服务器连接通常不显示。</p>
		<p>-e</p>
		<p>显示以太网统计。该参数可以与 -s 选项结合使用。</p>
		<p>-n</p>
		<p>以数字格式显示地址和端口号（而不是尝试查找名称）。</p>
		<p>-s</p>
		<p>显示每个协议的统计。默认情况下，显示 TCP、UDP、ICMP 和 IP 的统计。-p 选项可以用来指定默认的子集。 </p>
		<p>-p protocol</p>
		<p>显示由 protocol 指定的协议的连接；protocol 可以是 tcp 或 udp。如果与 -s 选项一同使用显示每个协议的统计，protocol 可以是 tcp、udp、icmp 或 ip。</p>
		<p>-r</p>
		<p>显示路由表的内容。</p>
		<p>interval</p>
		<p>重新显示所选的统计，在每次显示之间暂停 interval 秒。按 CTRL+B 停止重新显示统计。如果省略该参数，netstat 将打印一次当前的配置信息。</p>
		<p>
				<br />好了，看完这些帮助文件，我们应该明白netstat命令的使用方法了。现在就让我们现学现用，用这个命令看一下自己的机器开放的端口。进入到命令行下，使用netstat命令的a和n两个参数：<br />C:\&gt;netstat -an</p>
		<p>Active Connections</p>
		<p>Proto Local Address Foreign Address State<br />TCP 0.0.0.0:80 0.0.0.0:0 LISTENING<br />TCP 0.0.0.0:21 0.0.0.0:0 LISTENING<br />TCP 0.0.0.0:7626 0.0.0.0:0 LISTENING<br />UDP 0.0.0.0:445 0.0.0.0:0 <br />UDP 0.0.0.0:1046 0.0.0.0:0 <br />UDP 0.0.0.0:1047 0.0.0.0:0 </p>
		<p>
				<br />解释一下，Active Connections是指当前本机活动连接，Proto是指连接使用的协议名称，Local Address是本地计算机的 IP 地址和连接正在使用的端口号，Foreign Address是连接该端口的远程计算机的 IP 地址和端口号，State则是表明TCP 连接的状态，你可以看到后面三行的监听端口是UDP协议的，所以没有State表示的状态。看！我的机器的7626端口已经开放，正在监听等待连接，像这样的情况极有可能是已经感染了冰河！急忙断开网络，用杀毒软件查杀病毒是正确的做法。<br />2．工作在windows2000下的命令行工具fport</p>
		<p>使用windows2000的朋友要比使用windows9X的幸运一些，因为可以使用fport这个程序来显示本机开放端口与进程的对应关系。<br />Fport是FoundStone出品的一个用来列出系统中所有打开的TCP/IP和UDP端口，以及它们对应应用程序的完整路径、PID标识、进程名称等信息的软件。在命令行下使用，请看例子：<br />D:\&gt;fport.exe<br />FPort v1.33 - TCP/IP Process to Port Mapper<br />Copyright 2000 by Foundstone, Inc.<br /><a href="http://www.foundstone.com">http://www.foundstone.com</a></p>
		<p>Pid Process Port Proto Path<br />748 tcpsvcs -&gt; 7 TCP C:\WINNT\System32\ tcpsvcs.exe<br />748 tcpsvcs -&gt; 9 TCP C:\WINNT\System32\tcpsvcs.exe<br />748 tcpsvcs -&gt; 19 TCP C:\WINNT\System32\tcpsvcs.exe<br />416 svchost -&gt; 135 TCP C:\WINNT\system32\svchost.exe</p>
		<p>
				<br />是不是一目了然了。这下，各个端口究竟是什么程序打开的就都在你眼皮底下了。如果发现有某个可疑程序打开了某个可疑端口，可千万不要大意哦，也许那就是一只狡猾的木马！<br />Fport的最新版本是2.0。在很多网站都提供下载，但是为了安全起见，当然最好还是到它的老家去下：<a href="http://www.foundstone.com/knowledge/zips/fport.zip">http://www.foundstone.com/knowledge/zips/fport.zip</a><br />3.与Fport功能类似的图形化界面工具Active Ports</p>
		<p>Active Ports为SmartLine出品，你可以用来监视电脑所有打开的TCP/IP/UDP端口，不但可以将你所有的端口显示出来，还显示所有端口所对应的程序所在的路径，本地IP和远端IP(试图连接你的电脑IP)是否正在活动。</p>
		<p>
				<br />更棒的是，它还提供了一个关闭端口的功能，在你用它发现木马开放的端口时，可以立即将端口关闭。这个软件工作在Windows NT/2000/XP平台下。你可以在<a href="http://www.smartline.ru/software/aports.zip">http://www.smartline.ru/software/aports.zip</a>得到它。<br />其实使用windows xp的用户无须借助其它软件即可以得到端口与进程的对应关系，因为windows xp所带的netstat命令比以前的版本多了一个O参数，使用这个参数就可以得出端口与进程的对应来。<br />上面介绍了几种查看本机开放端口，以及端口和进程对应关系的方法，通过这些方法可以轻松的发现基于TCP/UDP协议的木马，希望能给你的爱机带来帮助。但是对木马重在防范，而且如果碰上反弹端口木马，利用驱动程序及动态链接库技术制作的新木马时，以上这些方法就很难查出木马的痕迹了。所以我们一定要养成良好的上网习惯，不要随意运行邮件中的附件，安装一套杀毒软件，像国内的瑞星就是个查杀病毒和木马的好帮手。从网上下载的软件先用杀毒软件检查一遍再使用，在上网时打开网络防火墙和病毒实时监控，保护自己的机器不被可恨的木马入侵。<br /></p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/68030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-06 14:52 <a href="http://www.blogjava.net/jackywjj/articles/68030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象入门</title><link>http://www.blogjava.net/jackywjj/articles/67305.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Sat, 02 Sep 2006 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/67305.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/67305.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/67305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/67305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/67305.html</trackback:ping><description><![CDATA[
		<p>“为什么面向对象的编程会在软件开发领域造成如此震憾的影响？” </p>
		<p>面向对象编程（OOP）具有多方面的吸引力。对管理人员，它实现了更快和更廉价的开发与维护过程。对分析与设计人员，建模处理变得更加简单，能生成清晰、易于维护的设计方案。对程序员，对象模型显得如此高雅和浅显。此外，面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务。每个人都可从中获益，至少表面如此。 <br />如果说它有缺点，那就是掌握它需付出的代价。思考对象的时候，需要采用形象思维，而不是程序化的思维。与程序化设计相比，对象的设计过程更具挑战性——特别是在尝试创建可重复使用（可再生）的对象时。过去，那些初涉面向对象编程领域的人都必须进行一项令人痛苦的选择： <br />(1) 选择一种诸如Smalltalk的语言，“出师”前必须掌握一个巨型的库。 <br />(2) 选择几乎根本没有库的C++（注释①），然后深入学习这种语言，直至能自行编写对象库。 </p>
		<p>①：幸运的是，这一情况已有明显改观。现在有第三方库以及标准的C++库供选用。 </p>
		<p>事实上，很难很好地设计出对象——从而很难设计好任何东西。因此，只有数量相当少的“专家”能设计出最好的对象，然后让其他人享用。对于成功的OOP语言，它们不仅集成了这种语言的语法以及一个编译程序（编译器），而且还有一个成功的开发环境，其中包含设计优良、易于使用的库。所以，大多数程序员的首要任务就是用现有的对象解决自己的应用问题。本章的目标就是向大家揭示出面向对象编程的概念，并证明它有多么简单。 <br />本章将向大家解释Java的多项设计思想，并从概念上解释面向对象的程序设计。但要注意在阅读完本章后，并不能立即编写出全功能的Java程序。所有详细的说明和示例会在本书的其他章节慢慢道来。 </p>
		<p>1.1 抽象的进步 <br />所有编程语言的最终目的都是提供一种“抽象”方法。一种较有争议的说法是：解决问题的复杂程度直接取决于抽象的种类及质量。这儿的“种类”是指准备对什么进行“抽象”？汇编语言是对基础机器的少量抽象。后来的许多“命令式”语言（如FORTRAN，BASIC和C）是对汇编语言的一种抽象。与汇编语言相比，这些语言已有了长足的进步，但它们的抽象原理依然要求我们着重考虑计算机的结构，而非考虑问题本身的结构。在机器模型（位于“方案空间”）与实际解决的问题模型（位于“问题空间”）之间，程序员必须建立起一种联系。这个过程要求人们付出较大的精力，而且由于它脱离了编程语言本身的范围，造成程序代码很难编写，而且要花较大的代价进行维护。由此造成的副作用便是一门完善的“编程方法”学科。 <br />为机器建模的另一个方法是为要解决的问题制作模型。对一些早期语言来说，如LISP和APL，它们的做法是“从不同的角度观察世界”——“所有问题都归纳为列表”或“所有问题都归纳为算法”。PROLOG则将所有问题都归纳为决策链。对于这些语言，我们认为它们一部分是面向基于“强制”的编程，另一部分则是专为处理图形符号设计的。每种方法都有自己特殊的用途，适合解决某一类的问题。但只要超出了它们力所能及的范围，就会显得非常笨拙。 <br />面向对象的程序设计在此基础上则跨出了一大步，程序员可利用一些工具表达问题空间内的元素。由于这种表达非常普遍，所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在方案空间的表示物称作“对象”（Object）。当然，还有一些在问题空间没有对应体的其他对象。通过添加新的对象类型，程序可进行灵活的调整，以便与特定的问题配合。所以在阅读方案的描述代码时，会读到对问题进行表达的话语。与我们以前见过的相比，这无疑是一种更加灵活、更加强大的语言抽象方法。总之，OOP允许我们根据问题来描述问题，而不是根据方案。然而，仍有一个联系途径回到计算机。每个对象都类似一台小计算机；它们有自己的状态，而且可要求它们进行特定的操作。与现实世界的“对象”或者“物体”相比，编程“对象”与它们也存在共通的地方：它们都有自己的特征和行为。 </p>
		<p>Alan Kay总结了Smalltalk的五大基本特征。这是第一种成功的面向对象程序设计语言，也是Java的基础语言。通过这些特征，我们可理解“纯粹”的面向对象程序设计方法是什么样的： </p>
		<p>(1) 所有东西都是对象。可将对象想象成一种新型变量；它保存着数据，但可要求它对自身进行操作。理论上讲，可从要解决的问题身上提出所有概念性的组件，然后在程序中将其表达为一个对象。 <br />(2) 程序是一大堆对象的组合；通过消息传递，各对象知道自己该做些什么。为了向对象发出请求，需向那个对象“发送一条消息”。更具体地讲，可将消息想象为一个调用请求，它调用的是从属于目标对象的一个子例程或函数。 <br />(3) 每个对象都有自己的存储空间，可容纳其他对象。或者说，通过封装现有对象，可制作出新型对象。所以，尽管对象的概念非常简单，但在程序中却可达到任意高的复杂程度。 <br />(4) 每个对象都有一种类型。根据语法，每个对象都是某个“类”的一个“实例”。其中，“类”（Class）是“类型”（Type）的同义词。一个类最重要的特征就是“能将什么消息发给它？”。 <br />(5) 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法，大家不久便能理解。由于类型为“圆”（Circle）的一个对象也属于类型为“形状”（Shape）的一个对象，所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”，令其自动控制所有符合“形状”描述的对象，其中自然包括“圆”。这一特性称为对象的“可替换性”，是OOP最重要的概念之一。 </p>
		<p>一些语言设计者认为面向对象的程序设计本身并不足以方便解决所有形式的程序问题，提倡将不同的方法组合成“多形程序设计语言”（注释②）。 </p>
		<p>②：参见Timothy Budd编著的《Multiparadigm Programming in Leda》，Addison-Wesley 1995年出版。 </p>
		<p>1.2 对象的接口 <br />亚里士多德或许是认真研究“类型”概念的第一人，他曾谈及“鱼类和鸟类”的问题。在世界首例面向对象语言Simula-67中，第一次用到了这样的一个概念： <br />所有对象——尽管各有特色——都属于某一系列对象的一部分，这些对象具有通用的特征和行为。在Simula-67中，首次用到了class这个关键字，它为程序引入了一个全新的类型（clas和type通常可互换使用；注释③）。 </p>
		<p>③：有些人进行了进一步的区分，他们强调“类型”决定了接口，而“类”是那个接口的一种特殊实现方式。 </p>
		<p>Simula是一个很好的例子。正如这个名字所暗示的，它的作用是“模拟”（Simulate）象“银行出纳员”这样的经典问题。在这个例子里，我们有一系列出纳员、客户、帐号以及交易等。每类成员（元素）都具有一些通用的特征：每个帐号都有一定的余额；每名出纳都能接收客户的存款；等等。与此同时，每个成员都有自己的状态；每个帐号都有不同的余额；每名出纳都有一个名字。所以在计算机程序中，能用独一无二的实体分别表示出纳员、客户、帐号以及交易。这个实体便是“对象”，而且每个对象都隶属一个特定的“类”，那个类具有自己的通用特征与行为。 <br />因此，在面向对象的程序设计中，尽管我们真正要做的是新建各种各样的数据“类型”（Type），但几乎所有面向对象的程序设计语言都采用了“class”关键字。当您看到“type”这个字的时候，请同时想到“class”；反之亦然。 <br />建好一个类后，可根据情况生成许多对象。随后，可将那些对象作为要解决问题中存在的元素进行处理。事实上，当我们进行面向对象的程序设计时，面临的最大一项挑战性就是：如何在“问题空间”（问题实际存在的地方）的元素与“方案空间”（对实际问题进行建模的地方，如计算机）的元素之间建立理想的“一对一”对应或映射关系。 <br />如何利用对象完成真正有用的工作呢？必须有一种办法能向对象发出请求，令其做一些实际的事情，比如完成一次交易、在屏幕上画一些东西或者打开一个开关等等。每个对象仅能接受特定的请求。我们向对象发出的请求是通过它的“接口”（Interface）定义的，对象的“类型”或“类”则规定了它的接口形式。“类型”与“接口”的等价或对应关系是面向对象程序设计的基础。 <br />下面让我们以电灯泡为例： </p>
		<p> </p>
		<p>Light lt = new Light(); <br />lt.on(); </p>
		<p>在这个例子中，类型／类的名称是Light，可向Light对象发出的请求包括包括打开（on）、关闭（off）、变得更明亮（brighten）或者变得更暗淡（dim）。通过简单地声明一个名字（lt），我们为Light对象创建了一个“句柄”。然后用new关键字新建类型为Light的一个对象。再用等号将其赋给句柄。为了向对象发送一条消息，我们列出句柄名（lt），再用一个句点符号（.）把它同消息名称（on）连接起来。从中可以看出，使用一些预先定义好的类时，我们在程序里采用的代码是非常简单和直观的。 </p>
		<p>1.3 实现方案的隐藏 <br />为方便后面的讨论，让我们先对这一领域的从业人员作一下分类。从根本上说，大致有两方面的人员涉足面向对象的编程：“类创建者”（创建新数据类型的人）以及“客户程序员”（在自己的应用程序中采用现成数据类型的人；注释④）。对客户程序员来讲，最主要的目标就是收集一个充斥着各种类的编程“工具箱”，以便快速开发符合自己要求的应用。而对类创建者来说，他们的目标则是从头构建一个类，只向客户程序员开放有必要开放的东西（接口），其他所有细节都隐藏起来。为什么要这样做？隐藏之后，客户程序员就不能接触和改变那些细节，所以原创者不用担心自己的作品会受到非法修改，可确保它们不会对其他人造成影响。 </p>
		<p>④：感谢我的朋友Scott Meyers，是他帮我起了这个名字。 </p>
		<p>“接口”（Interface）规定了可对一个特定的对象发出哪些请求。然而，必须在某个地方存在着一些代码，以便满足这些请求。这些代码与那些隐藏起来的数据便叫作“隐藏的实现”。站在程式化程序编写（Procedural Programming）的角度，整个问题并不显得复杂。一种类型含有与每种可能的请求关联起来的函数。一旦向对象发出一个特定的请求，就会调用那个函数。我们通常将这个过程总结为向对象“发送一条消息”（提出一个请求）。对象的职责就是决定如何对这条消息作出反应（执行相应的代码）。 <br />对于任何关系，重要一点是让牵连到的所有成员都遵守相同的规则。创建一个库时，相当于同客户程序员建立了一种关系。对方也是程序员，但他们的目标是组合出一个特定的应用（程序），或者用您的库构建一个更大的库。 <br />若任何人都能使用一个类的所有成员，那么客户程序员可对那个类做任何事情，没有办法强制他们遵守任何约束。即便非常不愿客户程序员直接操作类内包含的一些成员，但倘若未进行访问控制，就没有办法阻止这一情况的发生——所有东西都会暴露无遗。 </p>
		<p>有两方面的原因促使我们控制对成员的访问。第一个原因是防止程序员接触他们不该接触的东西——通常是内部数据类型的设计思想。若只是为了解决特定的问题，用户只需操作接口即可，毋需明白这些信息。我们向用户提供的实际是一种服务，因为他们很容易就可看出哪些对自己非常重要，以及哪些可忽略不计。 <br />进行访问控制的第二个原因是允许库设计人员修改内部结构，不用担心它会对客户程序员造成什么影响。例如，我们最开始可能设计了一个形式简单的类，以便简化开发。以后又决定进行改写，使其更快地运行。若接口与实现方法早已隔离开，并分别受到保护，就可放心做到这一点，只要求用户重新链接一下即可。 <br />Java采用三个显式（明确）关键字以及一个隐式（暗示）关键字来设置类边界：public，private，protected以及暗示性的friendly。若未明确指定其他关键字，则默认为后者。这些关键字的使用和含义都是相当直观的，它们决定了谁能使用后续的定义内容。“public”（公共）意味着后续的定义任何人均可使用。而在另一方面，“private”（私有）意味着除您自己、类型的创建者以及那个类型的内部函数成员，其他任何人都不能访问后续的定义信息。private在您与客户程序员之间竖起了一堵墙。若有人试图访问私有成员，就会得到一个编译期错误。“friendly”（友好的）涉及“包装”或“封装”（Package）的概念——即Java用来构建库的方法。若某样东西是“友好的”，意味着它只能在这个包装的范围内使用（所以这一访问级别有时也叫作“包装访问”）。“protected”（受保护的）与“private”相似，只是一个继承的类可访问受保护的成员，但不能访问私有成员。继承的问题不久就要谈到。 </p>
		<p>1.4 方案的重复使用 <br />创建并测试好一个类后，它应（从理想的角度）代表一个有用的代码单位。但并不象许多人希望的那样，这种重复使用的能力并不容易实现；它要求较多的经验以及洞察力，这样才能设计出一个好的方案，才有可能重复使用。 <br />许多人认为代码或设计方案的重复使用是面向对象的程序设计提供的最伟大的一种杠杆。 <br />为重复使用一个类，最简单的办法是仅直接使用那个类的对象。但同时也能将那个类的一个对象置入一个新类。我们把这叫作“创建一个成员对象”。新类可由任意数量和类型的其他对象构成。无论如何，只要新类达到了设计要求即可。这个概念叫作“组织”——在现有类的基础上组织一个新类。有时，我们也将组织称作“包含”关系，比如“一辆车包含了一个变速箱”。 <br />对象的组织具有极大的灵活性。新类的“成员对象”通常设为“私有”（Private），使用这个类的客户程序员不能访问它们。这样一来，我们可在不干扰客户代码的前提下，从容地修改那些成员。也可以在“运行期”更改成员，这进一步增大了灵活性。后面要讲到的“继承”并不具备这种灵活性，因为编译器必须对通过继承创建的类加以限制。 <br />由于继承的重要性，所以在面向对象的程序设计中，它经常被重点强调。作为新加入这一领域的程序员，或许早已先入为主地认为“继承应当随处可见”。沿这种思路产生的设计将是非常笨拙的，会大大增加程序的复杂程度。相反，新建类的时候，首先应考虑“组织”对象；这样做显得更加简单和灵活。利用对象的组织，我们的设计可保持清爽。一旦需要用到继承，就会明显意识到这一点。 </p>
		<p>1.5 继承：重新使用接口 <br />就其本身来说，对象的概念可为我们带来极大的便利。它在概念上允许我们将各式各样数据和功能封装到一起。这样便可恰当表达“问题空间”的概念，不用刻意遵照基础机器的表达方式。在程序设计语言中，这些概念则反映为具体的数据类型（使用class关键字）。 <br />我们费尽心思做出一种数据类型后，假如不得不又新建一种类型，令其实现大致相同的功能，那会是一件非常令人灰心的事情。但若能利用现成的数据类型，对其进行“克隆”，再根据情况进行添加和修改，情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。在继承过程中，若原始类（正式名称叫作基础类、超类或父类）发生了变化，修改过的“克隆”类（正式名称叫作继承类或者子类）也会反映出这种变化。在Java语言中，继承是通过extends关键字实现的 <br />使用继承时，相当于创建了一个新类。这个新类不仅包含了现有类型的所有成员（尽管private成员被隐藏起来，且不能访问），但更重要的是，它复制了基础类的接口。也就是说，可向基础类的对象发送的所有消息亦可原样发给衍生类的对象。根据可以发送的消息，我们能知道类的类型。这意味着衍生类具有与基础类相同的类型！为真正理解面向对象程序设计的含义，首先必须认识到这种类型的等价关系。 <br />由于基础类和衍生类具有相同的接口，所以那个接口必须进行特殊的设计。也就是说，对象接收到一条特定的消息后，必须有一个“方法”能够执行。若只是简单地继承一个类，并不做其他任何事情，来自基础类接口的方法就会直接照搬到衍生类。这意味着衍生类的对象不仅有相同的类型，也有同样的行为，这一后果通常是我们不愿见到的。 <br />有两种做法可将新得的衍生类与原来的基础类区分开。第一种做法十分简单：为衍生类添加新函数（功能）。这些新函数并非基础类接口的一部分。进行这种处理时，一般都是意识到基础类不能满足我们的要求，所以需要添加更多的函数。这是一种最简单、最基本的继承用法，大多数时候都可完美地解决我们的问题。然而，事先还是要仔细调查自己的基础类是否真的需要这些额外的函数。 </p>
		<p>1.5.1 改善基础类 <br />尽管extends关键字暗示着我们要为接口“扩展”新功能，但实情并非肯定如此。为区分我们的新类，第二个办法是改变基础类一个现有函数的行为。我们将其称作“改善”那个函数。 <br />为改善一个函数，只需为衍生类的函数建立一个新定义即可。我们的目标是：“尽管使用的函数接口未变，但它的新版本具有不同的表现”。 </p>
		<p>1.5.2 等价与类似关系 <br />针对继承可能会产生这样的一个争论：继承只能改善原基础类的函数吗？若答案是肯定的，则衍生类型就是与基础类完全相同的类型，因为都拥有完全相同的接口。这样造成的结果就是：我们完全能够将衍生类的一个对象换成基础类的一个对象！可将其想象成一种“纯替换”。在某种意义上，这是进行继承的一种理想方式。此时，我们通常认为基础类和衍生类之间存在一种“等价”关系——因为我们可以理直气壮地说：“圆就是一种几何形状”。为了对继承进行测试，一个办法就是看看自己是否能把它们套入这种“等价”关系中，看看是否有意义。 <br />但在许多时候，我们必须为衍生类型加入新的接口元素。所以不仅扩展了接口，也创建了一种新类型。这种新类型仍可替换成基础类型，但这种替换并不是完美的，因为不可在基础类里访问新函数。我们将其称作“类似”关系；新类型拥有旧类型的接口，但也包含了其他函数，所以不能说它们是完全等价的。举个例子来说，让我们考虑一下制冷机的情况。假定我们的房间连好了用于制冷的各种控制器；也就是说，我们已拥有必要的“接口”来控制制冷。现在假设机器出了故障，我们把它换成一台新型的冷、热两用空调，冬天和夏天均可使用。冷、热空调“类似”制冷机，但能做更多的事情。由于我们的房间只安装了控制制冷的设备，所以它们只限于同新机器的制冷部分打交道。新机器的接口已得到了扩展，但现有的系统并不知道除原始接口以外的任何东西。 <br />认识了等价与类似的区别后，再进行替换时就会有把握得多。尽管大多数时候“纯替换”已经足够，但您会发现在某些情况下，仍然有明显的理由需要在衍生类的基础上增添新功能。通过前面对这两种情况的讨论，相信大家已心中有数该如何做。 </p>
		<p>1.6 多形对象的互换使用 <br />通常，继承最终会以创建一系列类收场，所有类都建立在统一的接口基础上。我们用一幅颠倒的树形图来阐明这一点（注释⑤）： </p>
		<p>⑤：这儿采用了“统一记号法”，本书将主要采用这种方法。 </p>
		<p>对这样的一系列类，我们要进行的一项重要处理就是将衍生类的对象当作基础类的一个对象对待。这一点是非常重要的，因为它意味着我们只需编写单一的代码，令其忽略类型的特定细节，只与基础类打交道。这样一来，那些代码就可与类型信息分开。所以更易编写，也更易理解。此外，若通过继承增添了一种新类型，如“三角形”，那么我们为“几何形状”新类型编写的代码会象在旧类型里一样良好地工作。所以说程序具备了“扩展能力”，具有“扩展性”。 <br />以上面的例子为基础，假设我们用Java写了这样一个函数： </p>
		<p> </p>
		<p>void doStuff(Shape s) { <br />s.erase(); <br />// ... <br />s.draw(); <br />} </p>
		<p>这个函数可与任何“几何形状”（Shape）通信，所以完全独立于它要描绘（draw）和删除（erase）的任何特定类型的对象。如果我们在其他一些程序里使用doStuff()函数： </p>
		<p>
				<br />Circle c = new Circle(); <br />Triangle t = new Triangle(); <br />Line l = new Line(); <br />doStuff(c); <br />doStuff(t); <br />doStuff(l); </p>
		<p>那么对doStuff()的调用会自动良好地工作，无论对象的具体类型是什么。 <br />这实际是一个非常有用的编程技巧。请考虑下面这行代码： <br />doStuff(c); <br />此时，一个Circle（圆）句柄传递给一个本来期待Shape（形状）句柄的函数。由于圆是一种几何形状，所以doStuff()能正确地进行处理。也就是说，凡是doStuff()能发给一个Shape的消息，Circle也能接收。所以这样做是安全的，不会造成错误。 <br />我们将这种把衍生类型当作它的基本类型处理的过程叫作“Upcasting”（上溯造型）。其中，“cast”（造型）是指根据一个现成的模型创建；而“Up”（向上）表明继承的方向是从“上面”来的——即基础类位于顶部，而衍生类在下方展开。所以，根据基础类进行造型就是一个从上面继承的过程，即“Upcasting”。 <br />在面向对象的程序里，通常都要用到上溯造型技术。这是避免去调查准确类型的一个好办法。请看看doStuff()里的代码： </p>
		<p>s.erase(); <br />// ... <br />s.draw(); </p>
		<p>注意它并未这样表达：“如果你是一个Circle，就这样做；如果你是一个Square，就那样做；等等”。若那样编写代码，就需检查一个Shape所有可能的类型，如圆、矩形等等。这显然是非常麻烦的，而且每次添加了一种新的Shape类型后，都要相应地进行修改。在这儿，我们只需说：“你是一种几何形状，我知道你能将自己删掉，即erase()；请自己采取那个行动，并自己去控制所有的细节吧。” </p>
		<p>1.6.1 动态绑定 <br />在doStuff()的代码里，最让人吃惊的是尽管我们没作出任何特殊指示，采取的操作也是完全正确和恰当的。我们知道，为Circle调用draw()时执行的代码与为一个Square或Line调用draw()时执行的代码是不同的。但在将draw()消息发给一个匿名Shape时，根据Shape句柄当时连接的实际类型，会相应地采取正确的操作。这当然令人惊讶，因为当Java编译器为doStuff()编译代码时，它并不知道自己要操作的准确类型是什么。尽管我们确实可以保证最终会为Shape调用erase()，为Shape调用draw()，但并不能保证为特定的Circle，Square或者Line调用什么。然而最后采取的操作同样是正确的，这是怎么做到的呢？ <br />将一条消息发给对象时，如果并不知道对方的具体类型是什么，但采取的行动同样是正确的，这种情况就叫作“多形性”（Polymorphism）。对面向对象的程序设计语言来说，它们用以实现多形性的方法叫作“动态绑定”。编译器和运行期系统会负责对所有细节的控制；我们只需知道会发生什么事情，而且更重要的是，如何利用它帮助自己设计程序。 <br />有些语言要求我们用一个特殊的关键字来允许动态绑定。在C++中，这个关键字是virtual。在Java中，我们则完全不必记住添加一个关键字，因为函数的动态绑定是自动进行的。所以在将一条消息发给对象时，我们完全可以肯定对象会采取正确的行动，即使其中涉及上溯造型之类的处理。 </p>
		<p>1.6.2 抽象的基础类和接口 <br />设计程序时，我们经常都希望基础类只为自己的衍生类提供一个接口。也就是说，我们不想其他任何人实际创建基础类的一个对象，只对上溯造型成它，以便使用它们的接口。为达到这个目的，需要把那个类变成“抽象”的——使用abstract关键字。若有人试图创建抽象类的一个对象，编译器就会阻止他们。这种工具可有效强制实行一种特殊的设计。 <br />亦可用abstract关键字描述一个尚未实现的方法——作为一个“根”使用，指出：“这是适用于从这个类继承的所有类型的一个接口函数，但目前尚没有对它进行任何形式的实现。”抽象方法也许只能在一个抽象类里创建。继承了一个类后，那个方法就必须实现，否则继承的类也会变成“抽象”类。通过创建一个抽象方法，我们可以将一个方法置入接口中，不必再为那个方法提供可能毫无意义的主体代码。 <br />interface（接口）关键字将抽象类的概念更延伸了一步，它完全禁止了所有的函数定义。“接口”是一种相当有效和常用的工具。另外如果自己愿意，亦可将多个接口都合并到一起（不能从多个普通class或abstract class中继承）。 </p>
		<p>1.7 对象的创建和存在时间 <br />从技术角度说，OOP（面向对象程序设计）只是涉及抽象的数据类型、继承以及多形性，但另一些问题也可能显得非常重要。本节将就这些问题进行探讨。 <br />最重要的问题之一是对象的创建及破坏方式。对象需要的数据位于哪儿，如何控制对象的“存在时间”呢？针对这个问题，解决的方案是各异其趣的。C++认为程序的执行效率是最重要的一个问题，所以它允许程序员作出选择。为获得最快的运行速度，存储以及存在时间可在编写程序时决定，只需将对象放置在堆栈（有时也叫作自动或定域变量）或者静态存储区域即可。这样便为存储空间的分配和释放提供了一个优先级。某些情况下，这种优先级的控制是非常有价值的。然而，我们同时也牺牲了灵活性，因为在编写程序时，必须知道对象的准确的数量、存在时间、以及类型。如果要解决的是一个较常规的问题，如计算机辅助设计、仓储管理或者空中交通控制，这一方法就显得太局限了。 <br />第二个方法是在一个内存池中动态创建对象，该内存池亦叫“堆”或者“内存堆”。若采用这种方式，除非进入运行期，否则根本不知道到底需要多少个对象，也不知道它们的存在时间有多长，以及准确的类型是什么。这些参数都在程序正式运行时才决定的。若需一个新对象，只需在需要它的时候在内存堆里简单地创建它即可。由于存储空间的管理是运行期间动态进行的，所以在内存堆里分配存储空间的时间比在堆栈里创建的时间长得多（在堆栈里创建存储空间一般只需要一个简单的指令，将堆栈指针向下或向下移动即可）。由于动态创建方法使对象本来就倾向于复杂，所以查找存储空间以及释放它所需的额外开销不会为对象的创建造成明显的影响。除此以外，更大的灵活性对于常规编程问题的解决是至关重要的。 <br />C++允许我们决定是在写程序时创建对象，还是在运行期间创建，这种控制方法更加灵活。大家或许认为既然它如此灵活，那么无论如何都应在内存堆里创建对象，而不是在堆栈中创建。但还要考虑另外一个问题，亦即对象的“存在时间”或者“生存时间”（Lifetime）。若在堆栈或者静态存储空间里创建一个对象，编译器会判断对象的持续时间有多长，到时会自动“破坏”或者“清除”它。程序员可用两种方法来破坏一个对象：用程序化的方式决定何时破坏对象，或者利用由运行环境提供的一种“垃圾收集器”特性，自动寻找那些不再使用的对象，并将其清除。当然，垃圾收集器显得方便得多，但要求所有应用程序都必须容忍垃圾收集器的存在，并能默许随垃圾收集带来的额外开销。但这并不符合C++语言的设计宗旨，所以未能包括到C++里。但Java确实提供了一个垃圾收集器（Smalltalk也有这样的设计；尽管Delphi默认为没有垃圾收集器，但可选择安装；而C++亦可使用一些由其他公司开发的垃圾收集产品）。 <br />本节剩下的部分将讨论操纵对象时要考虑的另一些因素。 </p>
		<p>1.7.1 集合与继承器 <br />针对一个特定问题的解决，如果事先不知道需要多少个对象，或者它们的持续时间有多长，那么也不知道如何保存那些对象。既然如此，怎样才能知道那些对象要求多少空间呢？事先上根本无法提前知道，除非进入运行期。 <br />在面向对象的设计中，大多数问题的解决办法似乎都有些轻率——只是简单地创建另一种类型的对象。用于解决特定问题的新型对象容纳了指向其他对象的句柄。当然，也可以用数组来做同样的事情，那是大多数语言都具有的一种功能。但不能只看到这一点。这种新对象通常叫作“集合”（亦叫作一个“容器”，但AWT在不同的场合应用了这个术语，所以本书将一直沿用“集合”的称呼。在需要的时候，集合会自动扩充自己，以便适应我们在其中置入的任何东西。所以我们事先不必知道要在一个集合里容下多少东西。只需创建一个集合，以后的工作让它自己负责好了。 <br />幸运的是，设计优良的OOP语言都配套提供了一系列集合。在C++中，它们是以“标准模板库”（STL）的形式提供的。Object Pascal用自己的“可视组件库”（VCL）提供集合。Smalltalk提供了一套非常完整的集合。而Java也用自己的标准库提供了集合。在某些库中，一个常规集合便可满足人们的大多数要求；而在另一些库中（特别是C++的库），则面向不同的需求提供了不同类型的集合。例如，可以用一个矢量统一对所有元素的访问方式；一个链接列表则用于保证所有元素的插入统一。所以我们能根据自己的需要选择适当的类型。其中包括集、队列、散列表、树、堆栈等等。 <br />所有集合都提供了相应的读写功能。将某样东西置入集合时，采用的方式是十分明显的。有一个叫作“推”（Push）、“添加”（Add）或其他类似名字的函数用于做这件事情。但将数据从集合中取出的时候，方式却并不总是那么明显。如果是一个数组形式的实体，比如一个矢量（Vector），那么也许能用索引运算符或函数。但在许多情况下，这样做往往会无功而返。此外，单选定函数的功能是非常有限的。如果想对集合中的一系列元素进行操纵或比较，而不是仅仅面向一个，这时又该怎么办呢？ <br />办法就是使用一个“继续器”（Iterator），它属于一种对象，负责选择集合内的元素，并把它们提供给继承器的用户。作为一个类，它也提供了一级抽象。利用这一级抽象，可将集合细节与用于访问那个集合的代码隔离开。通过继承器的作用，集合被抽象成一个简单的序列。继承器允许我们遍历那个序列，同时毋需关心基础结构是什么——换言之，不管它是一个矢量、一个链接列表、一个堆栈，还是其他什么东西。这样一来，我们就可以灵活地改变基础数据，不会对程序里的代码造成干扰。Java最开始（在1.0和1.1版中）提供的是一个标准继承器，名为Enumeration（枚举），为它的所有集合类提供服务。Java 1.2新增一个更复杂的集合库，其中包含了一个名为Iterator的继承器，可以做比老式的Enumeration更多的事情。 <br />从设计角度出发，我们需要的是一个全功能的序列。通过对它的操纵，应该能解决自己的问题。如果一种类型的序列即可满足我们的所有要求，那么完全没有必要再换用不同的类型。有两方面的原因促使我们需要对集合作出选择。首先，集合提供了不同的接口类型以及外部行为。堆栈的接口与行为与队列的不同，而队列的接口与行为又与一个集（Set）或列表的不同。利用这个特征，我们解决问题时便有更大的灵活性。 <br />其次，不同的集合在进行特定操作时往往有不同的效率。最好的例子便是矢量（Vector）和列表（List）的区别。它们都属于简单的序列，拥有完全一致的接口和外部行为。但在执行一些特定的任务时，需要的开销却是完全不同的。对矢量内的元素进行的随机访问（存取）是一种常时操作；无论我们选择的选择是什么，需要的时间量都是相同的。但在一个链接列表中，若想到处移动，并随机挑选一个元素，就需付出“惨重”的代价。而且假设某个元素位于列表较远的地方，找到它所需的时间也会长许多。但在另一方面，如果想在序列中部插入一个元素，用列表就比用矢量划算得多。这些以及其他操作都有不同的执行效率，具体取决于序列的基础结构是什么。在设计阶段，我们可以先从一个列表开始。最后调整性能的时候，再根据情况把它换成矢量。由于抽象是通过继承器进行的，所以能在两者方便地切换，对代码的影响则显得微不足道。 <br />最后，记住集合只是一个用来放置对象的储藏所。如果那个储藏所能满足我们的所有需要，就完全没必要关心它具体是如何实现的（这是大多数类型对象的一个基本概念）。如果在一个编程环境中工作，它由于其他因素（比如在Windows下运行，或者由垃圾收集器带来了开销）产生了内在的开销，那么矢量和链接列表之间在系统开销上的差异就或许不是一个大问题。我们可能只需要一种类型的序列。甚至可以想象有一个“完美”的集合抽象，它能根据自己的使用方式自动改变基层的实现方式。 </p>
		<p>1.7.2 单根结构 <br />在面向对象的程序设计中，由于C++的引入而显得尤为突出的一个问题是：所有类最终是否都应从单独一个基础类继承。在Java中（与其他几乎所有OOP语言一样），对这个问题的答案都是肯定的，而且这个终级基础类的名字很简单，就是一个“Object”。这种“单根结构”具有许多方面的优点。 <br />单根结构中的所有对象都有一个通用接口，所以它们最终都属于相同的类型。另一种方案（就象C++那样）是我们不能保证所有东西都属于相同的基本类型。从向后兼容的角度看，这一方案可与C模型更好地配合，而且可以认为它的限制更少一些。但假期我们想进行纯粹的面向对象编程，那么必须构建自己的结构，以期获得与内建到其他OOP语言里的同样的便利。需添加我们要用到的各种新类库，还要使用另一些不兼容的接口。理所当然地，这也需要付出额外的精力使新接口与自己的设计方案配合（可能还需要多重继承）。为得到C++额外的“灵活性”，付出这样的代价值得吗？当然，如果真的需要——如果早已是C专家，如果对C有难舍的情结——那么就真的很值得。但假如你是一名新手，首次接触这类设计，象Java那样的替换方案也许会更省事一些。 <br />单根结构中的所有对象（比如所有Java对象）都可以保证拥有一些特定的功能。在自己的系统中，我们知道对每个对象都能进行一些基本操作。一个单根结构，加上所有对象都在内存堆中创建，可以极大简化参数的传递（这在C++里是一个复杂的概念）。 <br />利用单根结构，我们可以更方便地实现一个垃圾收集器。与此有关的必要支持可安装于基础类中，而垃圾收集器可将适当的消息发给系统内的任何对象。如果没有这种单根结构，而且系统通过一个句柄来操纵对象，那么实现垃圾收集器的途径会有很大的不同，而且会面临许多障碍。 <br />由于运行期的类型信息肯定存在于所有对象中，所以永远不会遇到判断不出一个对象的类型的情况。这对系统级的操作来说显得特别重要，比如违例控制；而且也能在程序设计时获得更大的灵活性。 <br />但大家也可能产生疑问，既然你把好处说得这么天花乱坠，为什么C++没有采用单根结构呢？事实上，这是早期在效率与控制上权衡的一种结果。单根结构会带来程序设计上的一些限制。而且更重要的是，它加大了新程序与原有C代码兼容的难度。尽管这些限制仅在特定的场合会真的造成问题，但为了获得最大的灵活程度，C++最终决定放弃采用单根结构这一做法。而Java不存在上述的问题，它是全新设计的一种语言，不必与现有的语言保持所谓的“向后兼容”。所以很自然地，与其他大多数面向对象的程序设计语言一样，单根结构在Java的设计方案中很快就落实下来。 </p>
		<p>1.7.3 集合库与方便使用集合 <br />由于集合是我们经常都要用到的一种工具，所以一个集合库是十分必要的，它应该可以方便地重复使用。这样一来，我们就可以方便地取用各种集合，将其插入自己的程序。Java提供了这样的一个库，尽管它在Java 1.0和1.1中都显得非常有限（Java 1.2的集合库则无疑是一个杰作）。 </p>
		<p>1. 下溯造型与模板／通用性 <br />为了使这些集合能够重复使用，或者“再生”，Java提供了一种通用类型，以前曾把它叫作“Object”。单根结构意味着、所有东西归根结底都是一个对象”！所以容纳了Object的一个集合实际可以容纳任何东西。这使我们对它的重复使用变得非常简便。 <br />为使用这样的一个集合，只需添加指向它的对象句柄即可，以后可以通过句柄重新使用对象。但由于集合只能容纳Object，所以在我们向集合里添加对象句柄时，它会上溯造型成Object，这样便丢失了它的身份或者标识信息。再次使用它的时候，会得到一个Object句柄，而非指向我们早先置入的那个类型的句柄。所以怎样才能归还它的本来面貌，调用早先置入集合的那个对象的有用接口呢？ <br />在这里，我们再次用到了造型（Cast）。但这一次不是在分级结构中上溯造型成一种更“通用”的类型。而是下溯造型成一种更“特殊”的类型。这种造型方法叫作“下溯造型”（Downcasting）。举个例子来说，我们知道在上溯造型的时候，Circle（圆）属于Shape（几何形状）的一种类型，所以上溯造型是安全的。但我们不知道一个Object到底是Circle还是Shape，所以很难保证下溯造型的安全进行，除非确切地知道自己要操作的是什么。 <br />但这也不是绝对危险的，因为假如下溯造型成错误的东西，会得到我们称为“违例”（Exception）的一种运行期错误。我们稍后即会对此进行解释。但在从一个集合提取对象句柄时，必须用某种方式准确地记住它们是什么，以保证下溯造型的正确进行。 <br />下溯造型和运行期检查都要求花额外的时间来运行程序，而且程序员必须付出额外的精力。既然如此，我们能不能创建一个“智能”集合，令其知道自己容纳的类型呢？这样做可消除下溯造型的必要以及潜在的错误。答案是肯定的，我们可以采用“参数化类型”，它们是编译器能自动定制的类，可与特定的类型配合。例如，通过使用一个参数化集合，编译器可对那个集合进行定制，使其只接受Shape，而且只提取Shape。 <br />参数化类型是C++一个重要的组成部分，这部分是C++没有单根结构的缘故。在C++中，用于实现参数化类型的关键字是template（模板）。Java目前尚未提供参数化类型，因为由于使用的是单根结构，所以使用它显得有些笨拙。但这并不能保证以后的版本不会实现，因为“generic”这个词已被Java“保留到将来实现”（在Ada语言中，“generic”被用来实现它的模板）。Java采取的这种关键字保留机制其实经常让人摸不着头脑，很难断定以后会发生什么事情。 </p>
		<p>1.7.4 清除时的困境：由谁负责清除？ <br />每个对象都要求资源才能“生存”，其中最令人注目的资源是内存。如果不再需要使用一个对象，就必须将其清除，以便释放这些资源，以便其他对象使用。如果要解决的是非常简单的问题，如何清除对象这个问题并不显得很突出：我们创建对象，在需要的时候调用它，然后将其清除或者“破坏”。但在另一方面，我们平时遇到的问题往往要比这复杂得多。 <br />举个例子来说，假设我们要设计一套系统，用它管理一个机场的空中交通（同样的模型也可能适于管理一个仓库的货柜、或者一套影带出租系统、或者宠物店的宠物房。这初看似乎十分简单：构造一个集合用来容纳飞机，然后创建一架新飞机，将其置入集合。对进入空中交通管制区的所有飞机都如此处理。至于清除，在一架飞机离开这个区域的时候把它简单地删去即可。 <br />但事情并没有这么简单，可能还需要另一套系统来记录与飞机有关的数据。当然，和控制器的主要功能不同，这些数据的重要性可能一开始并不显露出来。例如，这条记录反映的可能是离开机场的所有小飞机的飞行计划。所以我们得到了由小飞机组成的另一个集合。一旦创建了一个飞机对象，如果它是一架小飞机，那么也必须把它置入这个集合。然后在系统空闲时期，需对这个集合中的对象进行一些后台处理。 <br />问题现在显得更复杂了：如何才能知道什么时间删除对象呢？用完对象后，系统的其他某些部分可能仍然要发挥作用。同样的问题也会在其他大量场合出现，而且在程序设计系统中（如C++），在用完一个对象之后必须明确地将其删除，所以问题会变得异常复杂（注释⑥）。 </p>
		<p>⑥：注意这一点只对内存堆里创建的对象成立（用new命令创建的）。但在另一方面，对这儿描述的问题以及其他所有常见的编程问题来说，都要求对象在内存堆里创建。 </p>
		<p>在Java中，垃圾收集器在设计时已考虑到了内存的释放问题（尽管这并不包括清除一个对象涉及到的其他方面）。垃圾收集器“知道”一个对象在什么时候不再使用，然后会自动释放那个对象占据的内存空间。采用这种方式，另外加上所有对象都从单个根类Object继承的事实，而且由于我们只能在内存堆中以一种方式创建对象，所以Java的编程要比C++的编程简单得多。我们只需要作出少量的抉择，即可克服原先存在的大量障碍。 </p>
		<p>1. 垃圾收集器对效率及灵活性的影响 <br />既然这是如此好的一种手段，为什么在C++里没有得到充分的发挥呢？我们当然要为这种编程的方便性付出一定的代价，代价就是运行期的开销。正如早先提到的那样，在C++中，我们可在堆栈中创建对象。在这种情况下，对象会得以自动清除（但不具有在运行期间随心所欲创建对象的灵活性）。在堆栈中创建对象是为对象分配存储空间最有效的一种方式，也是释放那些空间最有效的一种方式。在内存堆（Heap）中创建对象可能要付出昂贵得多的代价。如果总是从同一个基础类继承，并使所有函数调用都具有“同质多形”特征，那么也不可避免地需要付出一定的代价。但垃圾收集器是一种特殊的问题，因为我们永远不能确定它什么时候启动或者要花多长的时间。这意味着在Java程序执行期间，存在着一种不连贯的因素。所以在某些特殊的场合，我们必须避免用它——比如在一个程序的执行必须保持稳定、连贯的时候（通常把它们叫作“实时程序”，尽管并不是所有实时编程问题都要这方面的要求——注释⑦）。 </p>
		<p>⑦：根据本书一些技术性读者的反馈，有一个现成的实时Java系统（<a href="http://www.newmonics.com">www.newmonics.com</a>）确实能够保证垃圾收集器的效能。 </p>
		<p>C++语言的设计者曾经向C程序员发出请求（而且做得非常成功），不要希望在可以使用C的任何地方，向语言里加入可能对C++的速度或使用造成影响的任何特性。这个目的达到了，但代价就是C++的编程不可避免地复杂起来。Java比C++简单，但付出的代价是效率以及一定程度的灵活性。但对大多数程序设计问题来说，Java无疑都应是我们的首选。 </p>
		<p>1.8 违例控制：解决错误 <br />从最古老的程序设计语言开始，错误控制一直都是设计者们需要解决的一个大问题。由于很难设计出一套完美的错误控制方案，许多语言干脆将问题简单地忽略掉，将其转嫁给库设计人员。对大多数错误控制方案来说，最主要的一个问题是它们严重依赖程序员的警觉性，而不是依赖语言本身的强制标准。如果程序员不够警惕——若比较匆忙，这几乎是肯定会发生的——程序所依赖的错误控制方案便会失效。 <br />“违例控制”将错误控制方案内置到程序设计语言中，有时甚至内建到操作系统内。这里的“违例”（Exception）属于一个特殊的对象，它会从产生错误的地方“扔”或“掷”出来。随后，这个违例会被设计用于控制特定类型错误的“违例控制器”捕获。在情况变得不对劲的时候，可能有几个违例控制器并行捕获对应的违例对象。由于采用的是独立的执行路径，所以不会干扰我们的常规执行代码。这样便使代码的编写变得更加简单，因为不必经常性强制检查代码。除此以外，“掷”出的一个违例不同于从函数返回的错误值，也不同于由函数设置的一个标志。那些错误值或标志的作用是指示一个错误状态，是可以忽略的。但违例不能被忽略，所以肯定能在某个地方得到处置。最后，利用违例能够可靠地从一个糟糕的环境中恢复。此时一般不需要退出，我们可以采取某些处理，恢复程序的正常执行。显然，这样编制出来的程序显得更加可靠。 <br />Java的违例控制机制与大多数程序设计语言都有所不同。因为在Java中，违例控制模块是从一开始就封装好的，所以必须使用它！如果没有自己写一些代码来正确地控制违例，就会得到一条编译期出错提示。这样可保证程序的连贯性，使错误控制变得更加容易。 <br />注意违例控制并不属于一种面向对象的特性，尽管在面向对象的程序设计语言中，违例通常是用一个对象表示的。早在面向对象语言问世以前，违例控制就已经存在了。 </p>
		<p>1.9 多线程 <br />在计算机编程中，一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作，改为处理其他一些问题，再返回主进程。可以通过多种途径达到这个目的。最开始的时候，那些拥有机器低级知识的程序员编写一些“中断服务例程”，主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法，但编出的程序很难移植，由此造成了另一类的代价高昂问题。 <br />有些时候，中断对那些实时性很强的任务来说是很有必要的。但还存在其他许多问题，它们只要求将问题划分进入独立运行的程序片断中，使整个程序能更迅速地响应用户的请求。在一个程序中，这些独立运行的片断叫作“线程”（Thread），利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程，用户可按下一个按钮，然后程序会立即作出响应，而不是让用户等待程序完成了当前任务以后才开始响应。 <br />最开始，线程只是用于分配单个处理器的处理时间的一种工具。但假如操作系统本身支持多个处理器，那么每个线程都可分配给一个不同的处理器，真正进入“并行运算”状态。从程序设计语言的角度看，多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程；假如机器本身安装了多个处理器，那么程序会运行得更快，毋需作出任何特殊的调校。 <br />根据前面的论述，大家可能感觉线程处理非常简单。但必须注意一个问题：共享资源！如果有多个线程同时运行，而且它们试图访问相同的资源，就会遇到一个问题。举个例子来说，两个进程不能将信息同时发送给一台打印机。为解决这个问题，对那些可共享的资源来说（比如打印机），它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定，在完成了它的任务后，再解开（释放）这个锁，使其他线程可以接着使用同样的资源。 <br />Java的多线程机制已内建到语言中，这使一个可能较复杂的问题变得简单起来。对多线程处理的支持是在对象这一级支持的，所以一个执行线程可表达为一个对象。Java也提供了有限的资源锁定方案。它能锁定任何对象占用的内存（内存实际是多种共享资源的一种），所以同一时间只能有一个线程使用特定的内存空间。为达到这个目的，需要使用synchronized关键字。其他类型的资源必须由程序员明确锁定，这通常要求程序员创建一个对象，用它代表一把锁，所有线程在访问那个资源时都必须检查这把锁。 </p>
		<p>1.10 永久性 <br />创建一个对象后，只要我们需要，它就会一直存在下去。但在程序结束运行时，对象的“生存期”也会宣告结束。尽管这一现象表面上非常合理，但深入追究就会发现，假如在程序停止运行以后，对象也能继续存在，并能保留它的全部信息，那么在某些情况下将是一件非常有价值的事情。下次启动程序时，对象仍然在那里，里面保留的信息仍然是程序上一次运行时的那些信息。当然，可以将信息写入一个文件或者数据库，从而达到相同的效果。但尽管可将所有东西都看作一个对象，如果能将对象声明成“永久性”，并令其为我们照看其他所有细节，无疑也是一件相当方便的事情。 <br />Java 1.1提供了对“有限永久性”的支持，这意味着我们可将对象简单地保存到磁盘上，以后任何时间都可取回。之所以称它为“有限”的，是由于我们仍然需要明确发出调用，进行对象的保存和取回工作。这些工作不能自动进行。在Java未来的版本中，对“永久性”的支持有望更加全面。 </p>
		<p>1.11 Java和因特网 <br />既然Java不过另一种类型的程序设计语言，大家可能会奇怪它为什么值得如此重视，为什么还有这么多的人认为它是计算机程序设计的一个里程碑呢？如果您来自一个传统的程序设计背景，那么答案在刚开始的时候并不是很明显。Java除了可解决传统的程序设计问题以外，还能解决World Wide Web（万维网）上的编程问题。 </p>
		<p>1.11.1 什么是Web？ <br />Web这个词刚开始显得有些泛泛，似乎“冲浪”、“网上存在”以及“主页”等等都和它拉上了一些关系。甚至还有一种“Internet综合症”的说法，对许多人狂热的上网行为提出了质疑。我们在这里有必要作一些深入的探讨，但在这之前，必须理解客户机／服务器系统的概念，这是充斥着许多令人迷惑的问题的又一个计算领域。 </p>
		<p>1. 客户机／服务器计算 <br />客户机／服务器系统的基本思想是我们能在一个统一的地方集中存放信息资源。一般将数据集中保存在某个数据库中，根据其他人或者机器的请求将信息投递给对方。客户机／服务器概述的一个关键在于信息是“集中存放”的。所以我们能方便地更改信息，然后将修改过的信息发放给信息的消费者。将各种元素集中到一起，信息仓库、用于投递信息的软件以及信息及软件所在的那台机器，它们联合起来便叫作“服务器”（Server）。而对那些驻留在远程机器上的软件，它们需要与服务器通信，取回信息，进行适当的处理，然后在远程机器上显示出来，这些就叫作“客户”（Client）。 <br />这样看来，客户机／服务器的基本概念并不复杂。这里要注意的一个主要问题是单个服务器需要同时向多个客户提供服务。在这一机制中，通常少不了一套数据库管理系统，使设计人员能将数据布局封装到表格中，以获得最优的使用。除此以外，系统经常允许客户将新信息插入一个服务器。这意味着必须确保客户的新数据不会与其他客户的新数据冲突，或者说需要保证那些数据在加入数据库的时候不会丢失（用数据库的术语来说，这叫作“事务处理”）。客户软件发生了改变之后，它们必须在客户机器上构建、调试以及安装。所有这些会使问题变得比我们一般想象的复杂得多。另外，对多种类型的计算机和操作系统的支持也是一个大问题。最后，性能的问题显得尤为重要：可能会有数百个客户同时向服务器发出请求。所以任何微小的延误都是不能忽视的。为尽可能缓解潜伏的问题，程序员需要谨慎地分散任务的处理负担。一般可以考虑让客户机负担部分处理任务，但有时亦可分派给服务器所在地的其他机器，那些机器亦叫作“中间件”（中间件也用于改进对系统的维护）。 <br />所以在具体实现的时候，其他人发布信息这样一个简单的概念可能变得异常复杂。有时甚至会使人产生完全无从着手的感觉。客户机／服务器的概念在这时就可以大显身手了。事实上，大约有一半的程序设计活动都可以采用客户机／服务器的结构。这种系统可负责从处理订单及信用卡交易，一直到发布各类数据的方方面面的任务——股票市场、科学研究、政府运作等等。在过去，我们一般为单独的问题采取单独的解决方案；每次都要设计一套新方案。这些方案无论创建还是使用都比较困难，用户每次都要学习和适应新界面。客户机／服务器问题需要从根本上加以变革！ </p>
		<p>2. Web是一个巨大的服务器 <br />Web实际就是一套规模巨大的客户机／服务器系统。但它的情况要复杂一些，因为所有服务器和客户都同时存在于单个网络上面。但我们没必要了解更进一步的细节，因为唯一要关心的就是一次建立同一个服务器的连接，并同它打交道（即使可能要在全世界的范围内搜索正确的服务器）。 <br />最开始的时候，这是一个简单的单向操作过程。我们向一个服务器发出请求，它向我们回传一个文件，由于本机的浏览器软件（亦即“客户”或“客户程序”）负责解释和格式化，并在我们面前的屏幕上正确地显示出来。但人们不久就不满足于只从一个服务器传递网页。他们希望获得完全的客户机／服务器能力，使客户（程序）也能反馈一些信息到服务器。比如希望对服务器上的数据库进行检索，向服务器添加新信息，或者下一份订单等等（这也提供了比以前的系统更高的安全要求）。在Web的发展过程中，我们可以很清晰地看出这些令人心喜的变化。 <br />Web浏览器的发展终于迈出了重要的一步：某个信息可在任何类型的计算机上显示出来，毋需任何改动。然而，浏览器仍然显得很原始，在用户迅速增多的要求面前显得有些力不从心。它们的交互能力不够强，而且对服务器和因特网都造成了一定程度的干扰。这是由于每次采取一些要求编程的操作时，必须将信息反馈回服务器，在服务器那一端进行处理。所以完全可能需要等待数秒乃至数分钟的时间才会发现自己刚才拼错了一个单词。由于浏览器只是一个纯粹的查看程序，所以连最简单的计算任务都不能进行（当然在另一方面，它也显得非常安全，因为不能在本机上面执行任何程序，避开了程序错误或者病毒的骚扰）。 <br />为解决这个问题，人们采取了许多不同的方法。最开始的时候，人们对图形标准进行了改进，使浏览器能显示更好的动画和视频。为解决剩下的问题，唯一的办法就是在客户端（浏览器）内运行程序。这就叫作“客户端编程”，它是对传统的“服务器端编程”的一个非常重要的拓展。 </p>
		<p>1.11.2 客户端编程（注释⑧） <br />Web最初采用的“服务器－浏览器”方案可提供交互式内容，但这种交互能力完全由服务器提供，为服务器和因特网带来了不小的负担。服务器一般为客户浏览器产生静态网页，由后者简单地解释并显示出来。基本HTML语言提供了简单的数据收集机制：文字输入框、复选框、单选钮、列表以及下拉列表等，另外还有一个按钮，只能由程序规定重新设置表单中的数据，以便回传给服务器。用户提交的信息通过所有Web服务器均能支持的“通用网关接口”（CGI）回传到服务器。包含在提交数据中的文字指示CGI该如何操作。最常见的行动是运行位于服务器的一个程序。那个程序一般保存在一个名为“cgi-bin”的目录中（按下Web页内的一个按钮时，请注意一下浏览器顶部的地址窗，经常都能发现“cgi-bin”的字样）。大多数语言都可用来编制这些程序，但其中最常见的是Perl。这是由于Perl是专为文字的处理及解释而设计的，所以能在任何服务器上安装和使用，无论采用的处理器或操作系统是什么。 </p>
		<p>⑧：本节内容改编自某位作者的一篇文章。那篇文章最早出现在位于<a href="http://www.mainspring.com">www.mainspring.com</a>的Mainspring上。本节的采用已征得了对方的同意。 </p>
		<p>今天的许多Web站点都严格地建立在CGI的基础上，事实上几乎所有事情都可用CGI做到。唯一的问题就是响应时间。CGI程序的响应取决于需要传送多少数据，以及服务器和因特网两方面的负担有多重（而且CGI程序的启动比较慢）。Web的早期设计者并未预料到当初绰绰有余的带宽很快就变得不够用，这正是大量应用充斥网上造成的结果。例如，此时任何形式的动态图形显示都几乎不能连贯地显示，因为此时必须创建一个GIF文件，再将图形的每种变化从服务器传递给客户。而且大家应该对输入表单上的数据校验有着深刻的体会。原来的方法是我们按下网页上的提交按钮（Submit）；数据回传给服务器；服务器启动一个CGI程序，检查用户输入是否有错；格式化一个HTML页，通知可能遇到的错误，并将这个页回传给我们；随后必须回到原先那个表单页，再输入一遍。这种方法不仅速度非常慢，也显得非常繁琐。 <br />解决的办法就是客户端的程序设计。运行Web浏览器的大多数机器都拥有足够强的能力，可进行其他大量工作。与此同时，原始的静态HTML方法仍然可以采用，它会一直等到服务器送回下一个页。客户端编程意味着Web浏览器可获得更充分的利用，并可有效改善Web服务器的交互（互动）能力。 <br />对客户端编程的讨论与常规编程问题的讨论并没有太大的区别。采用的参数肯定是相同的，只是运行的平台不同：Web浏览器就象一个有限的操作系统。无论如何，我们仍然需要编程，仍然会在客户端编程中遇到大量问题，同时也有很多解决的方案。在本节剩下的部分里，我们将对这些问题进行一番概括，并介绍在客户端编程中采取的对策。 </p>
		<p>1. 插件 <br />朝客户端编程迈进的时候，最重要的一个问题就是插件的设计。利用插件，程序员可以方便地为浏览器添加新功能，用户只需下载一些代码，把它们“插入”浏览器的适当位置即可。这些代码的作用是告诉浏览器“从现在开始，你可以进行这些新活动了”（仅需下载这些插入一次）。有些快速和功能强大的行为是通过插件添加到浏览器的。但插件的编写并不是一件简单的任务。在我们构建一个特定的站点时，可能并不希望涉及这方面的工作。对客户端程序设计来说，插件的价值在于它允许专业程序员设计出一种新的语言，并将那种语言添加到浏览器，同时不必经过浏览器原创者的许可。由此可以看出，插件实际是浏览器的一个“后门”，允许创建新的客户端程序设计语言（尽管并非所有语言都是作为插件实现的）。 </p>
		<p>2. 脚本编制语言 <br />插件造成了脚本编制语言的爆炸性增长。通过这种脚本语言，可将用于自己客户端程序的源码直接插入HTML页，而对那种语言进行解释的插件会在HTML页显示的时候自动激活。脚本语言一般都倾向于尽量简化，易于理解。而且由于它们是从属于HTML页的一些简单正文，所以只需向服务器发出对那个页的一次请求，即可非常快地载入。缺点是我们的代码全部暴露在人们面前。另一方面，由于通常不用脚本编制语言做过份复杂的事情，所以这个问题暂且可以放在一边。 <br />脚本语言真正面向的是特定类型问题的解决，其中主要涉及如何创建更丰富、更具有互动能力的图形用户界面（GUI）。然而，脚本语言也许能解决客户端编程中80％的问题。你碰到的问题可能完全就在那80％里面。而且由于脚本编制语言的宗旨是尽可能地简化与快速，所以在考虑其他更复杂的方案之前（如Java及ActiveX），首先应想一下脚本语言是否可行。 <br />目前讨论得最多的脚本编制语言包括JavaScript（它与Java没有任何关系；之所以叫那个名字，完全是一种市场策略）、VBScript（同Visual Basic很相似）以及Tcl/Tk（来源于流行的跨平台GUI构造语言）。当然还有其他许多语言，也有许多正在开发中。 <br />JavaScript也许是目常用的，它得到的支持也最全面。无论NetscapeNavigator，Microsoft Internet Explorer，还是Opera，目前都提供了对JavaScript的支持。除此以外，市面上讲述JavaScript的书籍也要比讲述其他语言的书多得多。有些工具还能利用JavaScript自动产生网页。当然，如果你已经有Visual Basic或者Tcl/Tk的深厚功底，当然用它们要简单得多，起码可以避免学习新语言的烦恼（解决Web方面的问题就已经够让人头痛了）。 </p>
		<p>3. Java <br />如果说一种脚本编制语言能解决80％的客户端程序设计问题，那么剩下的20％又该怎么办呢？它们属于一些高难度的问题吗？目前最流行的方案就是Java。它不仅是一种功能强大、高度安全、可以跨平台使用以及国际通用的程序设计语言，也是一种具有旺盛生命力的语言。对Java的扩展是不断进行的，提供的语言特性和库能够很好地解决传统语言不能解决的问题，比如多线程操作、数据库访问、连网程序设计以及分布式计算等等。Java通过“程序片”（Applet）巧妙地解决了客户端编程的问题。 <br />程序片（或“小应用程序”）是一种非常小的程序，只能在Web浏览器中运行。作为Web页的一部分，程序片代码会自动下载回来（这和网页中的图片差不多）。激活程序片后，它会执行一个程序。程序片的一个优点体现在：通过程序片，一旦用户需要客户软件，软件就可从服务器自动下载回来。它们能自动取得客户软件的最新版本，不会出错，也没有重新安装的麻烦。由于Java的设计原理，程序员只需要创建程序的一个版本，那个程序能在几乎所有计算机以及安装了Java解释器的浏览器中运行。由于Java是一种全功能的编程语言，所以在向服务器发出一个请求之前，我们能先在客户端做完尽可能多的工作。例如，再也不必通过因特网传送一个请求表单，再由服务器确定其中是否存在一个拼写或者其他参数错误。大多数数据校验工作均可在客户端完成，没有必要坐在计算机前面焦急地等待服务器的响应。这样一来，不仅速度和响应的灵敏度得到了极大的提高，对网络和服务器造成的负担也可以明显减轻，这对保障因特网的畅通是至关重要的。 <br />与脚本程序相比，Java程序片的另一个优点是它采用编译好的形式，所以客户端看不到源码。当然在另一方面，反编译Java程序片也并不是件难事，而且代码的隐藏一般并不是个重要的问题。大家要注意另外两个重要的问题。正如本书以前会讲到的那样，编译好的Java程序片可能包含了许多模块，所以要多次“命中”（访问）服务器以便下载（在Java 1.1中，这个问题得到了有效的改善——利用Java压缩档，即JAR文件——它允许设计者将所有必要的模块都封装到一起，供用户统一下载）。在另一方面，脚本程序是作为Web页正文的一部分集成到Web页内的。这种程序一般都非常小，可有效减少对服务器的点击数。另一个因素是学习方面的问题。不管你平时听别人怎么说，Java都不是一种十分容易便可学会的语言。如果你以前是一名Visual Basic程序员，那么转向VBScript会是一种最快捷的方案。由于VBScript可以解决大多数典型的客户机／服务器问题，所以一旦上手，就很难下定决心再去学习Java。如果对脚本编制语言比较熟，那么在转向Java之前，建议先熟悉一下JavaScript或者VBScript，因为它们可能已经能够满足你的需要，不必经历学习Java的艰苦过程。 </p>
		<p>4. ActiveX <br />在某种程度上，Java的一个有力竞争对手应该是微软的ActiveX，尽管它采用的是完全不同的一套实现机制。ActiveX最早是一种纯Windows的方案。经过一家独立的专业协会的努力，ActiveX现在已具备了跨平台使用的能力。实际上，ActiveX的意思是“假如你的程序同它的工作环境正常连接，它就能进入Web页，并在支持ActiveX的浏览器中运行”（IE固化了对ActiveX的支持，而Netscape需要一个插件）。所以，ActiveX并没有限制我们使用一种特定的语言。比如，假设我们已经是一名有经验的Windows程序员，能熟练地使用象C++、Visual Basic或者BorlandDelphi那样的语言，就能几乎不加任何学习地创建出ActiveX组件。事实上，ActiveX是在我们的Web页中使用“历史遗留”代码的最佳途径。 </p>
		<p>5. 安全 <br />自动下载和通过因特网运行程序听起来就象是一个病毒制造者的梦想。在客户端的编程中，ActiveX带来了最让人头痛的安全问题。点击一个Web站点的时候，可能会随同HTML网页传回任何数量的东西：GIF文件、脚本代码、编译好的Java代码以及ActiveX组件。有些是无害的；GIF文件不会对我们造成任何危害，而脚本编制语言通常在自己可做的事情上有着很大的限制。Java也设计成在一个安全“沙箱”里在它的程序片中运行，这样可防止操作位于沙箱以外的磁盘或者内存区域。 <br />ActiveX是所有这些里面最让人担心的。用ActiveX编写程序就象编制Windows应用程序——可以做自己想做的任何事情。下载回一个ActiveX组件后，它完全可能对我们磁盘上的文件造成破坏。当然，对那些下载回来并不限于在Web浏览器内部运行的程序，它们同样也可能破坏我们的系统。从BBS下载回来的病毒一直是个大问题，但因特网的速度使得这个问题变得更加复杂。 <br />目前解决的办法是“数字签名”，代码会得到权威机构的验证，显示出它的作者是谁。这一机制的基础是认为病毒之所以会传播，是由于它的编制者匿名的缘故。所以假如去掉了匿名的因素，所有设计者都不得不为它们的行为负责。这似乎是一个很好的主意，因为它使程序显得更加正规。但我对它能消除恶意因素持怀疑态度，因为假如一个程序便含有Bug，那么同样会造成问题。 <br />Java通过“沙箱”来防止这些问题的发生。Java解释器内嵌于我们本地的Web浏览器中，在程序片装载时会检查所有有嫌疑的指令。特别地，程序片根本没有权力将文件写进磁盘，或者删除文件（这是病毒最喜欢做的事情之一）。我们通常认为程序片是安全的。而且由于安全对于营建一套可靠的客户机／服务器系统至关重要，所以会给病毒留下漏洞的所有错误都能很快得到修复（浏览器软件实际需要强行遵守这些安全规则；而有些浏览器则允许我们选择不同的安全级别，防止对系统不同程度的访问）。 <br />大家或许会怀疑这种限制是否会妨碍我们将文件写到本地磁盘。比如，我们有时需要构建一个本地数据库，或将数据保存下来，以便日后离线使用。最早的版本似乎每个人都能在线做任何敏感的事情，但这很快就变得非常不现实（尽管低价“互联网工具”有一天可能会满足大多数用户的需要）。解决的方案是“签了名的程序片”，它用公共密钥加密算法验证程序片确实来自它所声称的地方。当然在通过验证后，签了名的一个程序片仍然可以开始清除你的磁盘。但从理论上说，既然现在能够找到创建人“算帐”，他们一般不会干这种蠢事。Java 1.1为数字签名提供了一个框架，在必要时，可让一个程序片“走”到沙箱的外面来。 <br />数字签名遗漏了一个重要的问题，那就是人们在因特网上移动的速度。如下载回一个错误百出的程序，而它很不幸地真的干了某些蠢事，需要多久的时间才能发觉这一点呢？这也许是几天，也可能几周之后。发现了之后，又如何追踪当初肇事的程序呢（以及它当时的责任有多大）？ </p>
		<p>6. 因特网和内联网 <br />Web是解决客户机／服务器问题的一种常用方案，所以最好能用相同的技术解决此类问题的一些“子集”，特别是公司内部的传统客户机／服务器问题。对于传统的客户机／服务器模式，我们面临的问题是拥有多种不同类型的客户计算机，而且很难安装新的客户软件。但通过Web浏览器和客户端编程，这两类问题都可得到很好的解决。若一个信息网络局限于一家特定的公司，那么在将Web技术应用于它之后，即可称其为“内联网”（Intranet），以示与国际性的“因特网”（Internet）有别。内联网提供了比因特网更大的安全级别，因为可以物理性地控制对公司内部服务器的使用。说到培训，一般只要人们理解了浏览器的常规概念，就可以非常轻松地掌握网页和程序片之间的差异，所以学习新型系统的开销会大幅度减少。 <br />安全问题将我们引入客户端编程领域一个似乎是自动形成的分支。若程序是在因特网上运行，由于无从知晓它会在什么平台上运行，所以编程时要特别留意，防范可能出现的编程错误。需作一些跨平台处理，以及适当的安全防范，比如采用某种脚本语言或者Java。 <br />但假如在内联网中运行，面临的一些制约因素就会发生变化。全部机器均为Intel/Windows平台是件很平常的事情。在内联网中，需要对自己代码的质量负责。而且一旦发现错误，就可以马上改正。除此以外，可能已经有了一些“历史遗留”的代码，并用较传统的客户机／服务器方式使用那些代码。但在进行升级时，每次都要物理性地安装一道客户程序。浪费在升级安装上的时间是转移到浏览器的一项重要原因。使用了浏览器后，升级就变得易如反掌，而且整个过程是透明和自动进行的。如果真的是牵涉到这样的一个内联网中，最明智的方法是采用ActiveX，而非试图采用一种新的语言来改写程序代码。 <br />面临客户端编程问题令人困惑的一系列解决方案时，最好的方案是先做一次投资／回报分析。请总结出问题的全部制约因素，以及什么才是最快的方案。由于客户端程序设计仍然要编程，所以无论如何都该针对自己的特定情况采取最好的开发途径。这是准备面对程序开发中一些不可避免的问题时，我们可以作出的最佳姿态。 </p>
		<p>1.11.3 服务器端编程 <br />我们的整个讨论都忽略了服务器端编程的问题。如果向服务器发出一个请求，会发生什么事情？大多数时候的请求都是很简单的一个“把这个文件发给我”。浏览器随后会按适当的形式解释这个文件：作为HTML页、一幅图、一个Java程序片、一个脚本程序等等。向服务器发出的较复杂的请求通常涉及到对一个数据库进行操作（事务处理）。其中最常见的就是发出一个数据库检索命令，得到结果后，服务器会把它格式化成HTML页，并作为结果传回来（当然，假如客户通过Java或者某种脚本语言具有了更高的智能，那么原始数据就能在客户端发送和格式化；这样做速度可以更快，也能减轻服务器的负担）。另外，有时需要在数据库中注册自己的名字（比如加入一个组时），或者向服务器发出一份订单，这就涉及到对那个数据库的修改。这类服务器请求必须通过服务器端的一些代码进行，我们称其为“服务器端的编程”。在传统意义上，服务器端编程是用Perl和CGI脚本进行的，但更复杂的系统已经出现。其中包括基于Java的Web服务器，它允许我们用Java进行所有服务器端编程，写出的程序就叫作“小服务程序”（Servlet）。 </p>
		<p>1.11.4 一个独立的领域：应用程序 <br />与Java有关的大多数争论都是与程序片有关的。Java实际是一种常规用途的程序设计语言，可解决任何类型的问题，至少理论上如此。而且正如前面指出的，可以用更有效的方式来解决大多数客户机／服务器问题。如果将视线从程序片身上转开（同时放宽一些限制，比如禁止写盘等），就进入了常规用途的应用程序的广阔领域。这种应用程序可独立运行，毋需浏览器，就象普通的执行程序那样。在这儿，Java的特色并不仅仅反应在它的移植能力，也反映在编程本身上。就象贯穿全书都会讲到的那样，Java提供了许多有用的特性，使我们能在较短的时间里创建出比用从前的程序设计语言更健壮的程序。 <br />但要注意任何东西都不是十全十美的，我们为此也要付出一些代价。其中最明显的是执行速度放慢了（尽管可对此进行多方面的调整）。和任何语言一样，Java本身也存在一些限制，使得它不十分适合解决某些特殊的编程问题。但不管怎样，Java都是一种正在快速发展的语言。随着每个新版本的发布，它变得越来越可爱，能充分解决的问题也变得越来越多。 </p>
		<p>1.12 分析和设计 <br />面向对象的范式是思考程序设计时一种新的、而且全然不同的方式，许多人最开始都会在如何构造一个项目上皱起了眉头。事实上，我们可以作出一个“好”的设计，它能充分利用OOP提供的所有优点。 <br />有关OOP分析与设计的书籍大多数都不尽如人意。其中的大多数书都充斥着莫名其妙的话语、笨拙的笔调以及许多听起来似乎很重要的声明（注释⑨）。我认为这种书最好压缩到一章左右的空间，至多写成一本非常薄的书。具有讽剌意味的是，那些特别专注于复杂事物管理的人往往在写一些浅显、明白的书上面大费周章！如果不能说得简单和直接，一定没多少人喜欢看这方面的内容。毕竟，OOP的全部宗旨就是让软件开发的过程变得更加容易。尽管这可能影响了那些喜欢解决复杂问题的人的生计，但为什么不从一开始就把事情弄得简单些呢？因此，希望我能从开始就为大家打下一个良好的基础，尽可能用几个段落来说清楚分析与设计的问题。 </p>
		<p>⑨：最好的入门书仍然是Grady Booch的《Object-Oriented Design withApplications，第2版本》，Wiely &amp; Sons于1996年出版。这本书讲得很有深度，而且通俗易懂，尽管他的记号方法对大多数设计来说都显得不必要地复杂。 </p>
		<p>1.12.1 不要迷失 <br />在整个开发过程中，最重要的事情就是：不要将自己迷失！但事实上这种事情很容易发生。大多数方法都设计用来解决最大范围内的问题。当然，也存在一些特别困难的项目，需要作者付出更为艰辛的努力，或者付出更大的代价。但是，大多数项目都是比较“常规”的，所以一般都能作出成功的分析与设计，而且只需用到推荐的一小部分方法。但无论多么有限，某些形式的处理总是有益的，这可使整个项目的开发更加容易，总比直接了当开始编码好！ <br />也就是说，假如你正在考察一种特殊的方法，其中包含了大量细节，并推荐了许多步骤和文档，那么仍然很难正确判断自己该在何时停止。时刻提醒自己注意以下几个问题： <br />(1) 对象是什么？（怎样将自己的项目分割成一系列单独的组件？） <br />(2) 它们的接口是什么？（需要将什么消息发给每一个对象？） <br />在确定了对象和它们的接口后，便可着手编写一个程序。出于对多方面原因的考虑，可能还需要比这更多的说明及文档，但要求掌握的资料绝对不能比这还少。 <br />整个过程可划分为四个阶段，阶段0刚刚开始采用某些形式的结构。 </p>
		<p>1.12.2 阶段0：拟出一个计划 <br />第一步是决定在后面的过程中采取哪些步骤。这听起来似乎很简单（事实上，我们这儿说的一切都似乎很简单），但很常见的一种情况是：有些人甚至没有进入阶段1，便忙忙慌慌地开始编写代码。如果你的计划本来就是“直接开始开始编码”，那样做当然也无可非议（若对自己要解决的问题已有很透彻的理解，便可考虑那样做）。但最低程度也应同意自己该有个计划。 <br />在这个阶段，可能要决定一些必要的附加处理结构。但非常不幸，有些程序员写程序时喜欢随心所欲，他们认为“该完成的时候自然会完成”。这样做刚开始可能不会有什么问题，但我觉得假如能在整个过程中设置几个标志，或者“路标”，将更有益于你集中注意力。这恐怕比单纯地为了“完成工作”而工作好得多。至少，在达到了一个又一个的目标，经过了一个接一个的路标以后，可对自己的进度有清晰的把握，干劲也会相应地提高，不会产生“路遥漫漫无期”的感觉。 <br />座我刚开始学习故事结构起（我想有一天能写本小说出来），就一直坚持这种做法，感觉就象简单地让文字“流”到纸上。在我写与计算机有关的东西时，发现结构要比小说简单得多，所以不需要考虑太多这方面的问题。但我仍然制订了整个写作的结构，使自己对要写什么做到心中有数。因此，即使你的计划就是直接开始写程序，仍然需要经历以下的阶段，同时向自己提出一些特定的问题。 </p>
		<p>1.12.3 阶段1：要制作什么？ <br />在上一代程序设计中（即“过程化或程序化设计”），这个阶段称为“建立需求分析和系统规格”。当然，那些操作今天已经不再需要了，或者至少改换了形式。大量令人头痛的文档资料已成为历史。但当时的初衷是好的。需求分析的意思是“建立一系列规则，根据它判断任务什么时候完成，以及客户怎样才能满意”。系统规格则表示“这里是一些具体的说明，让你知道程序需要做什么（而不是怎样做）才能满足要求”。需求分析实际就是你和客户之间的一份合约（即使客户就在本公司内部工作，或者是其他对象及系统）。系统规格是对所面临问题的最高级别的一种揭示，我们依据它判断任务是否完成，以及需要花多长的时间。由于这些都需要取得参与者的一致同意，所以我建议尽可能地简化它们——最好采用列表和基本图表的形式——以节省时间。可能还会面临另一些限制，需要把它们扩充成为更大的文档。 <br />我们特别要注意将重点放在这一阶段的核心问题上，不要纠缠于细枝末节。这个核心问题就是：决定采用什么系统。对这个问题，最有价值的工具就是一个名为“使用条件”的集合。对那些采用“假如……，系统该怎样做？”形式的问题，这便是最有说服力的回答。例如，“假如客户需要提取一张现金支票，但当时又没有这么多的现金储备，那么自动取款机该怎样反应？”对这个问题，“使用条件”可以指示自动取款机在那种“条件”下的正确操作。 <br />应尽可能总结出自己系统的一套完整的“使用条件”或者“应用场合”。一旦完成这个工作，就相当于摸清了想让系统完成的核心任务。由于将重点放在“使用条件”上，一个很好的效果就是它们总能让你放精力放在最关键的东西上，并防止自己分心于对完成任务关系不大的其他事情上面。也就是说，只要掌握了一套完整的“使用条件”，就可以对自己的系统作出清晰的描述，并转移到下一个阶段。在这一阶段，也有可能无法完全掌握系统日后的各种应用场合，但这也没有关系。只要肯花时间，所有问题都会自然而然暴露出来。不要过份在意系统规格的“完美”，否则也容易产生挫败感和焦燥情绪。 <br />在这一阶段，最好用几个简单的段落对自己的系统作出描述，然后围绕它们再进行扩充，添加一些“名词”和“动词”。“名词”自然成为对象，而“动词”自然成为要整合到对象接口中的“方法”。只要亲自试着做一做，就会发现这是多么有用的一个工具；有些时候，它能帮助你完成绝大多数的工作。 <br />尽管仍处在初级阶段，但这时的一些日程安排也可能会非常管用。我们现在对自己要构建的东西应该有了一个较全面的认识，所以可能已经感觉到了它大概会花多长的时间来完成。此时要考虑多方面的因素：如果估计出一个较长的日程，那么公司也许决定不再继续下去；或者一名主管已经估算出了这个项目要花多长的时间，并会试着影响你的估计。但无论如何，最好从一开始就草拟出一份“诚实”的时间表，以后再进行一些暂时难以作出的决策。目前有许多技术可帮助我们计算出准确的日程安排（就象那些预测股票市场起落的技术），但通常最好的方法还是依赖自己的经验和直觉（不要忘记，直觉也要建立在经验上）。感觉一下大概需要花多长的时间，然后将这个时间加倍，再加上10％。你的感觉可能是正确的；“也许”能在那个时间里完成。但“加倍”使那个时间更加充裕，“10％”的时间则用于进行最后的推敲和深化。但同时也要对此向上级主管作出适当的解释，无论对方有什么抱怨和修改，只要明确地告诉他们：这样的一个日程安排，只是我的一个估计！ </p>
		<p>1.12.4 阶段2：如何构建？ <br />在这一阶段，必须拿出一套设计方案，并解释其中包含的各类对象在外观上是什么样子，以及相互间是如何沟通的。此时可考虑采用一种特殊的图表工具：“统一建模语言”（UML）。请到<a href="http://www.rational.com">http://www.rational.com</a>去下载一份UML规格书。作为第1阶段中的描述工具，UML也是很有帮助的。此外，还可用它在第2阶段中处理一些图表（如流程图）。当然并非一定要使用UML，但它对你会很有帮助，特别是在希望描绘一张详尽的图表，让许多人在一起研究的时候。除UML外，还可选择对对象以及它们的接口进行文字化描述（就象我在《Thinking in C++》里说的那样，但这种方法非常原始，发挥的作用亦较有限。 <br />我曾有一次非常成功的咨询经历，那时涉及到一小组人的初始设计。他们以前还没有构建过OOP（面向对象程序设计）项目，将对象画在白板上面。我们谈到各对象相互间该如何沟通（通信），并删除了其中的一部分，以及替换了另一部分对象。这个小组（他们知道这个项目的目的是什么）实际上已经制订出了设计方案；他们自己“拥有”了设计，而不是让设计自然而然地显露出来。我在那里做的事情就是对设计进行指导，提出一些适当的问题，尝试作出一些假设，并从小组中得到反馈，以便修改那些假设。这个过程中最美妙的事情就是整个小组并不是通过学习一些抽象的例子来进行面向对象的设计，而是通过实践一个真正的设计来掌握OOP的窍门，而那个设计正是他们当时手上的工作！ <br />作出了对对象以及它们的接口的说明后，就完成了第2阶段的工作。当然，这些工作可能并不完全。有些工作可能要等到进入阶段3才能得知。但这已经足够了。我们真正需要关心的是最终找出所有的对象。能早些发现当然好，但OOP提供了足够完美的结构，以后再找出它们也不迟。 </p>
		<p>1.12.5 阶段3：开始创建 <br />读这本书的可能是程序员，现在进入的正是你可能最感兴趣的阶段。由于手头上有一个计划——无论它有多么简要，而且在正式编码前掌握了正确的设计结构，所以会发现接下去的工作比一开始就埋头写程序要简单得多。而这正是我们想达到的目的。让代码做到我们想做的事情，这是所有程序项目最终的目标。但切不要急功冒进，否则只有得不偿失。根据我的经验，最后先拿出一套较为全面的方案，使其尽可能设想周全，能满足尽可能多的要求。给我的感觉，编程更象一门艺术，不能只是作为技术活来看待。所有付出最终都会得到回报。作为真正的程序员，这并非可有可无的一种素质。全面的思考、周密的准备、良好的构造不仅使程序更易构建与调试，也使其更易理解和维护，而那正是一套软件赢利的必要条件。 <br />构建好系统，并令其运行起来后，必须进行实际检验，以前做的那些需求分析和系统规格便可派上用场了。全面地考察自己的程序，确定提出的所有要求均已满足。现在一切似乎都该结束了？是吗？ </p>
		<p>1.12.6 阶段4：校订 <br />事实上，整个开发周期还没有结束，现在进入的是传统意义上称为“维护”的一个阶段。“维护”是一个比较暧昧的称呼，可用它表示从“保持它按设想的轨道运行”、“加入客户从前忘了声明的功能”或者更传统的“除掉暴露出来的一切臭虫”等等意思。所以大家对“维护”这个词产生了许多误解，有的人认为：凡是需要“维护”的东西，必定不是好的，或者是有缺陷的！因为这个词说明你实际构建的是一个非常“原始”的程序，以后需要频繁地作出改动、添加新的代码或者防止它的落后、退化等。因此，我们需要用一个更合理的词语来称呼以后需要继续的工作。 <br />这个词便是“校订”。换言之，“你第一次做的东西并不完善，所以需为自己留下一个深入学习、认知的空间，再回过头去作一些改变”。对于要解决的问题，随着对它的学习和了解愈加深入，可能需要作出大量改动。进行这些工作的一个动力是随着不断的改革优化，终于能够从自己的努力中得到回报，无论这需要经历一个较短还是较长的时期。 <br />什么时候才叫“达到理想的状态”呢？这并不仅仅意味着程序必须按要求的那样工作，并能适应各种指定的“使用条件”，它也意味着代码的内部结构应当尽善尽美。至少，我们应能感觉出整个结构都能良好地协调运作。没有笨拙的语法，没有臃肿的对象，也没有一些华而不实的东西。除此以外，必须保证程序结构有很强的生命力。由于多方面的原因，以后对程序的改动是必不可少。但必须确定改动能够方便和清楚地进行。这里没有花巧可言。不仅需要理解自己构建的是什么，也要理解程序如何不断地进化。幸运的是，面向对象的程序设计语言特别适合进行这类连续作出的修改——由对象建立起来的边界可有效保证结构的整体性，并能防范对无关对象进行的无谓干扰、破坏。也可以对自己的程序作一些看似激烈的大变动，同时不会破坏程序的整体性，不会波及到其他代码。事实上，对“校订”的支持是OOP非常重要的一个特点。 <br />通过校订，可创建出至少接近自己设想的东西。然后从整体上观察自己的作品，把它与自己的要求比较，看看还短缺什么。然后就可以从容地回过头去，对程序中不恰当的部分进行重新设计和重新实现（注释⑩）。在最终得到一套恰当的方案之前，可能需要解决一些不能回避的问题，或者至少解决问题的一个方面。而且一般要多“校订”几次才行（“设计范式”在这里可起到很大的帮助作用。有关它的讨论，请参考本书第16章）。 <br />构建一套系统时，“校订”几乎是不可避免的。我们需要不断地对比自己的需求，了解系统是否自己实际所需要的。有时只有实际看到系统，才能意识到自己需要解决一个不同的问题。若认为这种形式的校订必然会发生，那么最好尽快拿出自己的第一个版本，检查它是否自己希望的，使自己的思想不断趋向成熟。 <br />反复的“校订”同“递增开发”有关密不可分的关系。递增开发意味着先从系统的核心入手，将其作为一个框架实现，以后要在这个框架的基础上逐渐建立起系统剩余的部分。随后，将准备提供的各种功能（特性）一个接一个地加入其中。这里最考验技巧的是架设起一个能方便扩充所有目标特性的一个框架（对这个问题，大家可参考第16章的论述）。这样做的好处在于一旦令核心框架运作起来，要加入的每一项特性就象它自身内的一个小项目，而非大项目的一部分。此外，开发或维护阶段合成的新特性可以更方便地加入。OOP之所以提供了对递增开发的支持，是由于假如程序设计得好，每一次递增都可以成为完善的对象或者对象组。 </p>
		<p>⑩：这有点类似“快速造型”。此时应着眼于建立一个简单、明了的版本，使自己能对系统有个清楚的把握。再把这个原型扔掉，并正式地构建一个。快速造型最麻烦的一种情况就是人们不将原型扔掉，而是直接在它的基础上建造。如果再加上程序化设计中“结构”的缺乏，就会导致一个混乱的系统，致使维护成本增加。 </p>
		<p>1.12.7 计划的回报 <br />如果没有仔细拟定的设计图，当然不可能建起一所房子。如建立的是一所狗舍，尽管设计图可以不必那么详尽，但仍然需要一些草图，以做到心中有数。软件开发则完全不同，它的“设计图”（计划）必须详尽而完备。在很长的一段时间里，人们在他们的开发过程中并没有太多的结构，但那些大型项目很容易就会遭致失败。通过不断的摸索，人们掌握了数量众多的结构和详细资料。但它们的使用却? </p>
		<p> </p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/67305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-02 20:14 <a href="http://www.blogjava.net/jackywjj/articles/67305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于2006的若干技术预言</title><link>http://www.blogjava.net/jackywjj/articles/29034.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 23 Jan 2006 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/29034.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/29034.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/29034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/29034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/29034.html</trackback:ping><description><![CDATA[1、Ajax的光环不再，人们开始认识到其实没有什么新玩意儿，只不过是DHTML而已。像Dion指出，Ajax会成为你在网面开发中的一个工具箱而不是认为我正在“使用Ajax”，就像我们对使用HTML与DOM的态度。<BR><BR>2、EJB3的发布再次引起人们的注意，但希望这次会带来更多些实际的东西，少些中看中不用的（的确EJB在JAVA世界中占有一席之地，但注意一下，他比大部分EJB厂商和书作者所期望的要少的多）。<BR><BR>3、Vista将延迟到2007，尽管微软已经很努力了。但同时，WinFX(也就更有效的.NET3.0)会如期发布，大家会发现工作流（WWF）将比WPF/WCF/WWF三人组更有趣。注意这里我说的不是“更强大”或“更重要”，而是“有趣”。<BR><BR>4、<SPAN style="COLOR: red"><FONT color=#000000>脚本语言会在2006年达到他的高点</FONT></SPAN>。向Ruby的转换会遇到一个极点，可能在2006年下半年我们会听到一个使用Ruby的主要项目失败，很可能是一个较大的咨询公司尝试复制Ruby传道者的成功经验却还没有深刻了解。换名话说，相同的故事，不同的技术，相同的结果。到2007年时Ruby可能会走下坡。<BR><BR>5、对联结动态与静态语言的兴趣正在增长，最初如E4X，ECMAScipt集成XML的变体。<BR><BR>6、Java开发人员开始对胖Java应用的兴趣再增加。（坦率地说，这是一个赌注，但SUN的Swing研究人员已经做了这方面的工作，可能在2006年中期就会达到其黄金时期）<BR><BR>7、微软内部的一些开始强烈要求CLR团队增加对保存点(continuation)的支持，记要显示将会在4.0的发布版本中支持。<BR><BR>8、《有效Java编程》（Effective Java第二版）将会出版。<BR><BR>9、《有效.NET编程》（Effective .NET）将会出版。<BR><BR>10、《XML服务实战》（Pragmatic XML Services）将会出版。<BR><BR>11、JDK6会发布，一大群Java社区中自称行家的人声称其值得期待。<BR><BR>12、Java开发人员开始讨论在JDK7中需要新增和改变的特性。有许多新的想法被提出，希望大多数都可以实现。幸运的是，Joshua Bloch and Neal Gafter会继续参与改进的过程，也会提出更有力的想法并将他们实现出来。<BR><BR>13、<SPAN style="COLOR: purple"><FONT color=#000000>我更大的期望，而不仅仅是对2006的预测，是Sun能够认识到Java平台不仅是一种语言，而且是一个平台</FONT></SPAN>，并且给予更多的信任和期望来建立一个支持多语言的JVM平台系统。<BR><BR>14、<SPAN style="COLOR: red"><FONT color=#000000>我最大的梦想是JBoss脱离商业平台，并将其源代码回归给那些致力于维护开源项目而不是想着赚钱的开发人员</FONT></SPAN>，就像开发Geronimo项目的那些小伙子们做的。换句话说，开源社区要停止内战来齐心协力地朝同一方向努力。<BR></DD><img src ="http://www.blogjava.net/jackywjj/aggbug/29034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-23 17:55 <a href="http://www.blogjava.net/jackywjj/articles/29034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>加速你的Win2000/XP </title><link>http://www.blogjava.net/jackywjj/articles/28995.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 23 Jan 2006 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/28995.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/28995.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/28995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/28995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/28995.html</trackback:ping><description><![CDATA[（1）停止不必要的服务。在Win2000/XP中有许多默认的系统服务。不过，有一些是你不需要的服务，停止他们可以加快系统启动速度、降低系统和内存占用，让你的Win2000/XP加速。 <BR>　　如果你不是局域网用户，单击“管理工具→服务”停止以下服务。 <BR>　　Alerter——系统发生故障时向管理员发送警报。 <BR>　　Clipbook——允许网络中的用户查看你的剪贴板。 <BR>　　Computer Browser——该服务控制的是网络邻居和其他网络功能。 <BR>　　Messenger——在网络中发送、接收信息。 <BR>　　Network DDE ——管理网络中动态数据交换。 <BR>　　Network DDE DSDM——同上。 <BR>　　Server——用来管理网络中文件和打印服务器。 <BR>　　如果你没有一些如打印机、UPS等外设，单击“管理工具→服务”停止以下服务。 <BR>　　Uninterruptible Power Supply——管理UPS。 <BR>　　Print Spooler——管理打印机。 <BR>　　不需要一些扩展应用的，单击“管理工具→服务”停止以下服务。 <BR>　　Fax service——发送或接收传真。 <BR>　　Ftp publishing service——做为FTP服务器使用。 <BR>　　IIS admin service——做为Web服务器使用。停止了这些服务以后系统运行和启动速度是不是明显快了许多啊。 <BR>2）清理日志文件。每次开关机、运行、系统出错时，日志文件都会记录下它们。但日志文件体积会不断变大，并大大影响系统启动速度。我们可以自己指定日志文件的大小及处理方式。点击“管理工具→事件查看器”，如图9。
<CENTER><IMG src="http://www.knowsky.com/img/041206sf9.jpg"></CENTER>
<P><BR>　　在右栏中会显示“应用程序日志、安全日志和系统日志”。在任意一种日志上面右击并选择“属性”，就可以在如图10所示的对话框中为日志文件设定大小，还可以选择当日志达到最大以后的处理方式。 </P>
<CENTER><IMG src="http://www.knowsky.com/img/041206sf10.jpg"></CENTER>
<P><BR>　　单击“筛选器”选项卡还可以指定需要写入日志文件的事件类型。 <BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/28995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-23 11:38 <a href="http://www.blogjava.net/jackywjj/articles/28995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML文档中小meta的大作用</title><link>http://www.blogjava.net/jackywjj/articles/28210.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 16 Jan 2006 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/28210.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/28210.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/28210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/28210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/28210.html</trackback:ping><description><![CDATA[<FONT face=宋体>HTML文档中小meta的大作用&nbsp;<BR><BR>meta 是用来在HTML文档中模拟HTTP协议的响应头报文。meta&nbsp;标签用于网页的＜head＞与＜/head＞中，meta&nbsp;标签的用处很多。meta&nbsp; 的属性有两种：name和http-equiv。name属性主要用于描述网页，对应于content（网页内容），以便于搜索引擎机器人查找、分类（目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类）。这其中最重要的是description（站点在搜索引擎上的描述）和 keywords（分类关键词），所以应该给每页加一个meta值。比较常用的有以下几个：&nbsp;<BR>name&nbsp;属性<BR>＜meta&amp;nbspname="Generator"&amp;nbspcontect=""＞用以说明生成工具（如Microsoft&amp;nbspFrontPage&amp;nbsp4.0）等；<BR><BR>＜meta&amp;nbspname="KEYWords"&amp;nbspcontect=""＞向搜索引擎说明你的网页的关键词；<BR><BR>＜meta&amp;nbspname="DEscription"&amp;nbspcontect=""＞告诉搜索引擎你的站点的主要内容；<BR><BR>＜meta&amp;nbspname="Author"&amp;nbspcontect="你的姓名"＞告诉搜索引擎你的站点的制作的作者；<BR><BR>＜meta&amp;nbspname="Robots"&amp;nbspcontect="all|none|index|noindex|follow|nofollow"＞<BR>其中的属性说明如下：<BR>设定为all：文件将被检索，且页面上的链接可以被查询；<BR><BR>设定为none：文件将不被检索，且页面上的链接不可以被查询；<BR><BR>设定为index：文件将被检索；<BR><BR>设定为follow：页面上的链接可以被查询；<BR><BR>设定为noindex：文件将不被检索，但页面上的链接可以被查询；<BR><BR>设定为nofollow：文件将不被检索，页面上的链接可以被查询。<BR>http-equiv属性<BR>＜meta&amp; nbsphttp-equiv="Content-Type"&amp;nbspcontect="text/html";charset=gb_2312 -80"＞和&nbsp;＜meta&amp;nbsphttp-equiv="Content-Language"&amp;nbspcontect="zh- CN"＞用以说明主页制作所使用的文字以及语言；又如英文是ISO-8859-1字符集，还有BIG5、utf-8、shift-Jis、Euc、 Koi8-2等字符集；<BR><BR>＜meta&amp;nbsphttp-equiv="Refresh"&amp;nbspcontect="n;url=http://yourlink"&nbsp;＞定时让网页在指定的时间n内，跳转到页面http;//yourlink；<BR><BR>＜meta&amp; nbsphttp-equiv="Expires"&amp;nbspcontect="Mon,12&amp;nbspMay&amp;nbsp2001&amp; nbsp00:20:00&amp;nbspGMT"＞可以用于设定网页的到期时间，一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式；<BR><BR>＜meta&amp;nbsphttp-equiv="Pragma"&amp;nbspcontect="no-cache"＞是用于设定禁止浏览器从本地机的缓存中调阅页面内容，设定后一旦离开网页就无法从Cache中再调出；<BR><BR>＜meta&amp; nbsphttp-equiv="set-cookie"&amp;nbspcontect="Mon,12&amp;nbspMay&amp;nbsp2001&amp; nbsp00:20:00&amp;nbspGMT"＞cookie设定，如果网页过期，存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式；<BR><BR>＜meta&amp;nbsphttp-equiv="Pics-label"&amp;nbspcontect=""＞网页等级评定，在IE的internet选项中有一项内容设置，可以防止浏览一些受限制的网站，而网站的限制级别就是通过meta属性来设置的；<BR><BR>＜meta&amp;nbsphttp-equiv="windows-Target"&amp;nbspcontect="_top"＞强制页面在当前窗口中以独立页面显示，可以防止自己的网页被别人当作一个frame页调用；<BR><BR>＜meta&amp; nbsphttp-equiv="Page-Enter"&amp;nbspcontect="revealTrans(duration=10,transtion =50)"＞和＜meta&amp;nbsphttp-equiv="Page-Exit"contect="revealTrans(duration =20，transtion=6)"＞设定进入和离开页面时的特殊效果，这个功能即FrontPage中的“格式/网页过渡”，不过所加的页面不能够是一个frame页面。<BR></FONT><img src ="http://www.blogjava.net/jackywjj/aggbug/28210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-16 16:12 <a href="http://www.blogjava.net/jackywjj/articles/28210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简明 Linux 词汇表</title><link>http://www.blogjava.net/jackywjj/articles/27628.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 11 Jan 2006 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/27628.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/27628.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/27628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/27628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/27628.html</trackback:ping><description><![CDATA[<P>Linux 白皮书 <BR>关于本词汇表对于初涉 Linux® 世界的 Microsoft® Windows® 用户而言，有许多新的术语需要学习。<BR>本词汇表简明地解释了 Linux 产品常用的许多术语、首字母缩写词和缩写的意思和意义。<BR>（其中有些术语并不是 Linux 所特有的，但许多 Windows 用户可能仍然对它们感到很陌生。）<BR>本文档将有助于澄清对 Linux 的一些混淆；但是，这里并没有包含最常用的硬件、软件和通信方面的术语，这是因为在别处很容易找到它们。<BR>注：为使定义简短，所以其中有些可能过于简化。这些定义并不用来作为详细的教程，而只是用来为新用户做一个大体的解释。<BR>如果不能在这里找到您要找的单词，那么另有许多其它来源可供选择，这些来源同样是关于首字母缩写词、缩写和通用计算术语的<BR>（这些术语并不全都特定于 Linux）。由于一些术语可能会在某一本字典中出现但没有在另一本字典中出现，也由于某个来源中的<BR>一些定义可能比其它来源中的定义更清晰或者更全面，因此下面按照字母顺序给出了供您选择的来源：<BR>·&nbsp;PC 硬件与数据通信术语字典（Dictionary of PC Hardware and Data Communications Terms，<A href="http://www.oreilly.com/reference/dictionary">www.oreilly.com/reference/dictionary</A>） <BR>·&nbsp;免费在线计算字典（Free Online Dictionary of Computing，wombat.doc.ic.ac.uk/foldoc/foldoc.cgi?Free+On-line+Dictionary） <BR>·&nbsp;PC 与因特网术语词汇表（homepages.enterprise.net/jenko/Glossary/G.htm） <BR>·&nbsp;IBM 计算字典（<A href="http://www.networking.ibm.com/nsg/nsgmain.htm">www.networking.ibm.com/nsg/nsgmain.htm</A>） <BR>·&nbsp;Kadow 因特网与 UNIX(R) 字典（<A href="http://www.msg.net/kadow/answers">www.msg.net/kadow/answers</A>）<BR>·&nbsp;Linux 指南（Linux Guide，<A href="http://www.firstlinux.com/guide">www.firstlinux.com/guide</A>） <BR>·&nbsp;Lucent Technologies 词汇表（<A href="http://www.lucent.com/search/glossary">www.lucent.com/search/glossary</A>）<BR>·&nbsp;TechWeb TechEncyclopedia（<A href="http://www.techweb.com/encyclopedia">www.techweb.com/encyclopedia</A>） <BR>·&nbsp;Ugeek 技术词汇表（Ugeek Technical Glossary，<A href="http://www.geek.com/glossary/glossary.htm">www.geek.com/glossary/glossary.htm</A>） <BR>·&nbsp;Webopedia（<A href="http://www.pcwebopedia.com/">http://www.pcwebopedia.com/</A>）<BR>·&nbsp;Whatis.com（<A href="http://www.whatis.com/">http://www.whatis.com/</A>） <BR>常用 Linux 术语（A）<BR>·&nbsp;帐户名称（Account Name） — 等同于登录标识、用户标识或用户名。是指派给 UNIX/Linux 系统上用户的名称。<BR>可以在系统上对多个用户设置唯一的帐户名称，每个用户具有不同的访问（权限）级别。在安装完 Linux 之后，帐户名称由超级用户（Superuser）或 root 操作员指派。<BR>·&nbsp;AfterStep — 用户界面（窗口管理器）之一，AfterStep 使得 Linux 的外观很象 NeXTSTEP，而且还有些增强功能。要获取更多关于 AfterStep 的信息，请访问 <A href="http://www.afterstep.org/">www.afterstep.org</A>。（另请参阅“Enlightenment”、“GNOME”、“KDE”和“X Window 系统”。） <BR>·&nbsp;Awk（Aho、Weinberger 和 Kernighan） — 一种编程语言，因其模式匹配语法而特别有用，通常用于数据检索和数据转换。一个 GNU 版本称为 Gawk。 <BR>·&nbsp;APM（高级电源管理，Advanced Power Management） — 一种工业标准，它允许系统处理器和各个组件进入省电模式，包括挂起、睡眠和关机。APM 软件对于移动设备尤为重要，因为它节省了电池电量。 ·&nbsp;附加符号（Append Symbol） — 两个键盘字符 &gt;（也就是 &gt;&gt;）。通常用它将命令的输出发送到文本文件，将数据附加到文件的尾部，而不是替换现有的内容。例如，ls -a &gt;&gt; output.txt 将当前目录列表发送到名为 output.txt 的文件，并将其添加到该文件的尾部。重复执行该命令会不断地将新数据添加到文件尾部。（另请参阅“管道符号”和“重定向符号”。） <BR>·&nbsp;归档文件（Archive） — 含有多个文件的单个大型文件，通常对其进行压缩以节省存储空间。经常创建归档文件以方便计算机之间的传送。流行的归档格式包括 ARJ、TAR、ZIP 和 ZOO。它们都可以用来创建这样的归档文件。 <BR>·&nbsp;ARJ — 流行的文件压缩／归档工具，可以用于 UNIX/Linux、DOS/Windows 和其它操作系统。用这种方式压缩的文件的扩展名通常是 .arj 或 .ar。 （B）<BR>·&nbsp;后台进程（Background Process） — 运行时无须用户输入的程序。可以在诸如 UNIX/Linux 之类的多任务操作系统上运行多个后台进程，而用户则与前台进程交互（例如，数据输入）。有些后台进程（例如守护程序）从来都不需要用户输入。其它一些进程只是在用户忙于目前运行于前台的程序时才临时处于后台。 <BR>·&nbsp;Bash（Bourne Again SHell） — Bourne Shell 的增强版。（另请参阅“Korn Shell”。） ·&nbsp;BDF 字体 — 用于 X Window 系统的各种位图字体。（另请参阅“PostScript 字体”和“TrueType 字体”。） ·&nbsp;Bean — JavaBeans 体系结构的组件。 <BR>·&nbsp;Beowulf — 由相对廉价的计算机（包括 PC）组成的网络，这些计算机可能使用不同的处理器和硬件体系结构，由 Linux 和特殊的系统级软件将它们联合成一个海量并行计算系统。最终结果是一个能够以较低成本获得超级计算机计算能力的系统。这类系统对于诸如气象建模之类的计算密集型任务而言是非常理想的，因为可以将计算分配到几十、几百甚至几千个同时运行的独立处理器上。有时也称为“Beowulf 级超级计算机”或者超级群集计算机。更多关于 Beowulf 技术的信息，请阅读以下文章：<A href="http://www.linuxworld.com/linuxworld/lw-2000-04/lw-04-parallel.html">www.linuxworld.com/linuxworld/lw-2000-04/lw-04-parallel.html</A> 和 <A href="http://www.ibm.com/press/prnews.nsf/Searchvw/3f4e88b102477aa5852568460067a52a">www.ibm.com/press/prnews.nsf/Searchvw/3f4e88b102477aa5852568460067a52a</A>。 <BR>·&nbsp;Bin — 一个含有可执行程序的目录，这些程序主要是二进制文件。 <BR>·&nbsp;二进制文件（Binary） — 已被编译成可执行程序的源代码。在 UNIX/Linux 世界里，有些软件仅作为源代码分发；有些软件包既包含源代码又包含二进制文件；还有一些软件包则只以二进制文件格式分发。 ·&nbsp;引导盘（Boot Disk） — 一张软盘，其中含有操作系统（如 Linux）引导（启动）计算机并从命令行运行一些基本程序所需的足够内容。如果因某种原因导致系统表现为无法引导，那么引导盘是必需的。引导盘还用于对硬盘进行分区和格式化、恢复主引导记录（Master Boot Record）或者复制特定文件等。 <BR>·&nbsp;Bot — 机器人（Robot）的简称。它是一个程序，旨在在几乎没有人工干预下在因特网上搜索信息。 ·&nbsp;Bourne Shell — 一种流行的命令行 shell，它具有的优点比 DOS 命令提示符多很多。（另请参阅“Bash”和“Korn Shell”。） ·&nbsp;BSD（Berkeley 软件分发版，Berkeley Software Distribution）UNIX — 加州大学伯克利分校开发的 UNIX。（另请参阅“FreeBSD”。） ·&nbsp;Bzip2 — 一种较新的 UNIX/Linux 文件压缩程序，它比 Gzip 提供更大的压缩比。 （C）<BR>·&nbsp;CGI（公共网关接口，Common Gateway Interface） — 在 Web 服务器上，用来在脚本和／或应用程序之间传输数据，然后将该数据返回给 Web 页面或浏览器。CGI 脚本经常是使用 Perl 语言创建的，它能够生成动态 Web 内容（包括电子商业购物篮、讨论组、调查表单以及实时新闻等）。 <BR>·&nbsp;CHS（柱面／磁头／扇区，Cylinder/Head/Sector） — FDISK 在分区期间所需的磁盘信息。 <BR>·&nbsp;客户机（Client） — 向服务器请求服务（例如，电子邮件）的机器。 <BR>·&nbsp;CLU（命令行实用程序，Command Line Utility） — 从命令行会话或 shell 运行的程序，如 Tar 或 Mkdir。 ·&nbsp;群集（Cluster） — 由运行 Linux 的工作站（PC 或其它机器）组成的网络。（另请参阅“Beowulf”。） ·&nbsp;COLA — 因特网新闻组 comp.os.linux.announce 的简称，该新闻组宣布一些与 Linux 相关的参考资料。 ·&nbsp;命令行界面（Command Line Interface）（CLI） — 全屏或窗口化的文本方式会话，在该会话中用户通过输入命令来执行程序，这些命令可以带参数，也可以不带参数。CLI 显示来自操作系统或程序的输出文本，并为用户输入提供命令提示符。 <BR>·&nbsp;命令提示符（Command Prompt） — DOS/Windows 和 OS/2 术语，是命令行界面的一部分，用户在该界面中输入命令。（另请参阅“Shell 提示符”。） <BR>·&nbsp;编译（Compile） — 将编程源代码转换成可执行程序。 ·&nbsp;编译型语言（Compiled Language） — 一种语言，它需要编译器程序将编程源代码转换成可执行的机器语言二进制程序。一经编译，就可从程序的二进制形式多次运行程序，而无需再次编译。编译型语言／程序运行往往比解释型语言或伪代码语言快，但却需要编译器（可能很昂贵），而且用编译型语言编程常常会比用解释型语言和伪代码语言编程难。编译型语言的例子有 C 和 C++、COBOL 以及 FORTRAN。 <BR>·&nbsp;编译器（Compiler） — 用于将编程源代码转换成可执行程序的程序。 ·&nbsp;控制台应用程序（Console Application） — 不需要（即便是提供了）图形用户界面就能运行的命令行程序。 <BR>·&nbsp;Cron — Linux 守护程序，它在指定时间或按指定间隔执行规定的任务。 （D）<BR>·&nbsp;守护程序（Daemon） — 操作系统的后台进程，通常具有 root 安全级别许可权。守护程序通常隐藏在后台，直至被某个事件（例如特定的时间或日期、时间间隔、收到电子邮件等）触发后它才会进入活动状态。 ·&nbsp;桌面（Desktop） — 操作系统用户界面，旨在表示一个在上面放东西的办公桌。操作系统的桌面并不使用有形的电话、电灯、收／发箱等，而是使用程序及数据图标、窗口、任务栏和类似的东西。Linux 可以使用许多不同的桌面环境，包括 KDE、GNOME 和 X11，它们可以由用户安装。（另请参阅“GUI”、“窗口管理器”和“X Window 系统”。） <BR>·&nbsp;设备驱动程序（Device Driver） — 一种程序，它充当操作系统与设备（端口、驱动器、监视器、打印机等）之间的媒介，它向操作系统说明该设备具备哪些能力，同时将操作系统命令转换成该设备可以理解的指令。 ·&nbsp;分发版（Distribution） — 将 Linux 内核（核心）连同各种用户界面、实用程序、驱动程序及其它软件打包成可交付给用户的软件包。分发版通常是以免费下载或廉价 CD-ROM 软件包的形式提供给用户的。流行的分发版包括 Caldera OpenLinux、CoreLinux、Debian、Red Hat、Slackware、SuSE、TurboLinux 及其它软件。 <BR>·&nbsp;Dpkg（Debian 软件包管理器，Debian Package Manager） — 可从因特网下载的打包及安装工具，它包含在 Debian Linux 中，但与其它分发版兼容。它生成具有 .DEB 扩展名的文件。与 RPM 类似。 <BR>（E）·&nbsp;Emacs（用 MACroS 进行编辑，Editing with MACroS） — 一个流行的文本编辑器。 ·&nbsp;Enlightenment — 用户界面（窗口管理器）之一。更多关于 AfterStep 的信息，请访问 <A href="http://www.afterstep.org/">www.afterstep.org</A>。（另请参阅“AfterStep”、“GNOME”、“KDE”和“X Window 系统”。） （F）<BR>·&nbsp;文件系统（File System） — 一组程序，它们告诉操作系统如何访问及解释存储在磁盘或磁带驱动器或者其它存储媒介上的内容。常见的文件系统包括：FAT 和 FAT-32（DOS/Windows）、HPFS（OS/2）、NFS、NTFS（Windows NT/2000）以及其它文件系统。 ·&nbsp;过滤器（Filter） — 一种程序，它（从文件、程序输出或命令行输入）读取数据作为输入，根据一组预定义条件处理输入（如按字母顺序排序），然后输出处理过的数据。一些常见的过滤器包括 Awk、Grep、Sed 和 Sort。 ·&nbsp;Finger — UNIX/Linux 命令，它提供登录用户的有关信息。 ·&nbsp;前台进程（Foreground Process） — 在多任务操作系统（诸如 UNIX/Linux）中，前台进程是用户当前与之交互的程序（例如，数据输入）。随着用户在程序之间切换，会导致这些程序在不同的时刻处于前台。在层叠的窗口环境中，前台进程是最前面的窗口。 ·&nbsp;FreeBSD（免费伯克利软件分发版，Free Berkeley Software Distribution） — 类似于 Linux，因为它包含许多 GNU 程序，并且它运行的许多软件包与 Linux 所运行的相同。但一些内核功能的实现却不尽相同。（另请参阅“BSD UNIX”。） ·&nbsp;FTP（文件传送协议，File Transfer Protocol） — 与其它计算机（常常是软件资源库）来回传送文件的方法。 （G）·&nbsp;GCC（GNU C 编译器，GNU C Compiler） — 由 GPL 管理的一个高质量 C 编译器。 ·&nbsp;GIMP（GNU 图像操作程序，GNU Image Manipulation Program） — 一种用于 Linux 的、流行的图像编辑器／绘图程序。 ·&nbsp;GNOME（GNU 网络对象模型环境，GNU Network Object Model Environment） — 一种用于 Linux 的用户界面（窗口管理器），它是用 Gtk 构建的。更多关于 GNOME 的信息，请访问 <A href="http://www.gnome.org/">www.gnome.org</A>。（另请参阅“AfterStep”、“Enlightenment”、“KDE”和“X Window 系统”。） ·&nbsp;GNU（GNU 不是 Unix，GNU is Not Unix）项目 — 麻省理工学院（MIT）自由软件基金会（Free Software Foundation，FSF）为开发和促进替代专有 UNIX 实现的产品所进行的项目。GNU 软件使用 GPL 许可证。 ·&nbsp;GNU/Linux — 等同于 Linux。之所以这么称呼，是因为 Linux 分发版中包含的许多组件都是 GNU 工具。 ·&nbsp;GPL（GNU 通用公共许可证，GNU General Public License） — 一种公用及再分发许可证。请访问 <A href="http://www.linuxdoc.org/LDP/gs/app-gpl/node1.html">www.linuxdoc.org/LDP/gs/app-gpl/node1.html</A> 来查阅 GPL 协议的副本。 ·&nbsp;Grep（全局正则表达式及打印，Global Regular Expression and Print）— 一个工具，它在文件中搜索文本字符串，然后输出任何含该模式的行。 ·&nbsp;Gtk/Gtk+（GIMP 工具箱，GIMP ToolKit） — 一个功能强大而且快捷的开放源码图形库，用于 UNIX/Linux 上的 X Window 系统，程序员可以用来创建按钮、菜单及其它图形对象。（另请参阅“GNOME”、“Motif”和“Qt”。） ·&nbsp;GUI（图形用户界面，Graphical User Interface） — 图标、窗口及屏幕上其它图形图像的集合，它们提供了用户与操作系统交互的方法。（另请参阅“桌面”和“窗口管理器”。） ·&nbsp;Gzip（GNU zip） — UNIX/Linux 最初的文件压缩程序。最新的版本生成扩展名为 .gz 的文件。（扩展名 .z 或 .Z 表明是较老版本的 Gzip。）压缩是为了使文件紧凑以节省存储空间并缩短传送时间。（当与 Tar 结合使用时，生成文件的扩展名可能为 .tgz、.tar.gz 或 .tar.Z。） （H）·&nbsp;Home 目录 — 用户登录之后所在的目录。 ·&nbsp;HTML（超文本标记语言，Hyper Text Markup Language） — 用于设计 Web 页面的标准标记语言。标记“tag”或格式化命令允许 Web 页面设计人员确定突出显示、定位图形及创建超链接等等。 ·&nbsp;HTTP（超文本传输协议，Hyper Text Transport Protocol） — 一组创建的准则，用于请求和发送基于 HTML 的 Web 页面。 （I）·&nbsp;Init — 操作系统装入后立即运行的第一个进程。它以单用户方式启动系统或生成 shell 来读取启动文件，并打开指定用于登录的端口。 ·&nbsp;解释型语言（Interpreted Language） — 与编译型程序不同，每次运行解释型程序时都要由解释器程序实时地将源代码转换成二进制形式，而编译型程序由编译器一次性将源代码转换成可执行代码，随后从其二进制形式运行。解释型语言（以及用它们编写的程序）往往要比编译型语言及伪代码语言／程序慢，并且通常只有有限的底层操作系统功能访问权限或直接访问硬件的权限。但从另一角度来说，它们无需编译器（可能非常昂贵），并且经常包含在操作系统中，通常比编译型语言更容易编程。解释型语言的例子有 BASIC、Perl、Python 和 REXX/Object REXX。 （J）·&nbsp;Java® — Sun Microsystems® 开发的、独立于操作系统的面向对象编程语言。Java 通常用于 Web 服务器。Java 应用程序和 applet 有时以下载的形式提供给用户，以便在他们的系统上运行。Java 编程语言可以编制应用程序或较小的 Java“applet”。Java 是 C++ 语言稍加简化的版本，通常是进行解释而不是编译。（另请参阅“JIT 编译器”。） ·&nbsp;Java Applet — 嵌入在 Web 页面内的小型 Java 程序，它在浏览器内运行，而不是作为独立的应用程序运行。Applet 不能够访问本地计算机上的一些资源，如文件和串行设备（调制解调器、打印机等），通常也不能通过网络与其它计算机通信。 ·&nbsp;JavaBeans — Java 语言的组件体系结构。JavaBeans 组件称为 Bean。 ·&nbsp;JavaScript — 跨平台万维网脚本编制语言，似乎与 Java 有关。它可以用作服务器端脚本编制语言、由服务器解析的 HTML 中的嵌入语言以及浏览器中的嵌入语言。 ·&nbsp;JDK（Java 开发工具箱，Java Development Kit） — 由 Sun、IBM 或其它公司开发的 Java 编程工具箱，可以用于 UNIX/Linux 及其它操作系统。 ·&nbsp;JFS（日志文件系统，Journaled/Journaling File System） — 包含内置备份／恢复能力的文件系统。对索引的更改在生效之前先写入日志文件，这样如果索引遭到破坏（例如，在写索引期间断电），那么就可以从日志重建索引，包括对索引的更改。 ·&nbsp;Jini® — 读作“Genie”。Sun 开发的软件，工作起来有些象“即插即用”，因为它允许硬件设备在被连接时向操作系统通报自己（并提供关于该设备的详细信息），而无须系统重新引导。它也向系统所连接的网络通报它自己，从而方便地向网络提供设备共享。 ·&nbsp;JIT（Just-In-Time）编译器 — Java 语言编译器，它允许实时地将 Java 解释型程序自动编译成本机机器语言，以使程序执行的速度更快。有些 JVM 包含 JIT 编译器。 ·&nbsp;日志记录（Journaling） — 也就是“日志记录（logging）”。将信息写入日志文件，可以作为一种跟踪更改的方法。 ·&nbsp;JVM（Java 虚拟机，Java Virtual Machine） — Java 运行时环境，是运行 Java 程序所必需的，包含 Java 解释器。不同的操作系统（Linux、OS/2、Windows 98 等等）需要不同的 JVM，但任一 JVM 都可以运行某个 Java 程序的同一版本。 （K）·&nbsp;KDE（K 桌面环境，K Desktop Environment） — Linux 用户界面（窗口管理器）之一，是用 Qt 构建的。更多关于 KDE 的信息，请访问 <A href="http://www.kde.org/">http://www.kde.org/</A>。（另请参阅“AfterStep”、“Enlightenment”、“GNOME”和“X Window系统”。） ·&nbsp;内核（Kernel） — 操作系统的核心，其它所有组件都依赖于它。内核管理诸如低层硬件交互及资源共享之类的任务，包括内存分配、输入／输出、安全性和用户访问。 ·&nbsp;Korn Shell — Bourne Shell 的增强版本，包括广泛的脚本编制支持及命令行编辑。它支持许多为 Bourne Shell 编写的脚本。（另请参阅“Bash”。） （L）·&nbsp;LGPL（库 GPL，Library GPL） — GPL 的一种变体，它包含程序库。 ·&nbsp;LHArc — 一种较老的文件压缩和归档方法，现已很少使用。使用这一技术打包的文件的扩展名通常都是 .lha 或 .lzh。 ·&nbsp;LILO（Linux 装载程序，LInux LOader） — 一种流行的分区引导管理器实用程序，能够引导到 Linux 以外的操作系统。它并不特定于文件系统。 ·&nbsp;Linux — 类 UNIX 的开放源码操作系统，最初由 Linus Torvalds 发起。“Linux”实际上仅指操作系统内核或核心。已经有 200 多人为开发 Linux 内核做出了贡献。Linux 分发版的其余部分由各种实用程序、设备驱动程序、应用程序、用户界面和其它工具组成，一般也可对这些工具进行编译并在其它 UNIX 操作系统上运行。 ·&nbsp;Linux for RS/6000® — 一种可从 SuSE 获得的 Linux 版本，它旨在在 IBM RS/6000 超级计算机上运行。有关 Enterprise Linux for RS/6000 的信息，请阅读 <A href="http://www.suse.com/suse/news/PressReleases/ibmS6000.html">www.suse.com/suse/news/PressReleases/ibmS6000.html</A> 或者访问 SuSE 的主页 <A href="http://www.suse.com/">http://www.suse.com/</A>。 ·&nbsp;Linux for S/390® — 一种 Linux 版本，旨在作为虚拟机会话中的客户机操作系统，运行在 IBM S/390 大型机上。更多信息，请访问 oss.software.ibm.com/developerworks/opensource/linux390；关于 Linux 与业界强大的 S/390 体系结构结合优点的有趣文章，请参阅 <A href="http://www.linuxplanet.com/linuxplanet/reports/1532/1">www.linuxplanet.com/linuxplanet/reports/1532/1</A>；请访问 <A href="http://www.suse.com/suse/news/PressReleases/ibmsuse.html">www.suse.com/suse/news/PressReleases/ibmsuse.html</A> 以获取有关 SuSE Linux for S/390 的信息。 ·&nbsp;记录日志或日志（Log） — 存储应用程序或者系统消息或错误信息。也指存储这类信息的文件。 ·&nbsp;Lynx — 一种流行的非图形（基于文本的）Web 浏览器。 （M）·&nbsp;宏（Macro） — 一组以可执行形式存储的指令。宏可以是特定于应用程序的（诸如在电子表单或字处理程序内执行特定步骤的宏），也可以是通用的（例如，键盘宏，在键盘上按下 Ctrl-U 时输入用户标识）。 ·&nbsp;Man — 读取联机手册页的 UNIX/Linux 命令。 ·&nbsp;MBR（主引导记录，Master Boot Record） — 可引导磁盘驱动器上的第一个物理扇区。计算机刚开始引导时，系统 BIOS 查看该扇区以确定当前哪个分区是活动的（可引导的），随后读取该分区的第一个（引导）扇区并从该分区引导。 ·&nbsp;Mesa — OpenGL（开放图形库，Open Graphics Library）API（应用程序编程接口，Application Programming Interface）的一种实现。它为编写由硬件辅助的 2D 和 3D 图形软件提供了标准准则和工具集。 ·&nbsp;MIME（多用途因特网邮件交换，Multipurpose Internet Mail Exchange） — 允许文本电子邮件消息包含非文本（例如图形、视频或音频）数据的通信协议。 ·&nbsp;Motif — 用于 UNIX/Linux 的专有强大图形库，由开放软件基金会（Open Software Foundation (OSF)）开发，供程序员用来为 X Window 系统创建按钮、菜单及其它图形对象。（另请参阅“Gtk/Gtk+”。） ·&nbsp;挂装（Mount） — 在使用磁盘驱动器之前向文件系统标识磁盘驱动器。 ·&nbsp;多任务（Multitasking） — 操作系统一次运行多个程序或任务的能力。协作式多任务 OS，如 Windows 95/98，要求应用程序主动释放另一个程序请求的资源，以便另一个应用程序能够使用这些资源。抢先式多任务 OS（例如 UNIX/Linux、Windows NT/2000 或 OS/2）中，操作系统基于时间片或基于优先级命令应用程序释放资源时，应用程序释放资源，以便在其它程序需要资源时，正在使用这些资源的应用程序不会独占它们。（另请参阅“多线程”和“分时”。） ·&nbsp;多线程（Multithreading） — 操作系统并发运行被分成子组件或多个线程的程序的能力。如果运用得当，多线程可以更好地利用处理器及其它系统资源。多线程编程需要多任务／多线程操作系统，例如 UNIX/Linux、Windows NT/2000 或 OS/2，这些操作系统能够并发地运行多个程序。字处理程序可以充分利用多线程，因为它可以在前台进行拼写检查，同时在后台进行存盘并将输出发送到系统打印假脱机程序。（另请参阅“线程”。） （N）·&nbsp;NFS（网络文件系统，Network File System） — 一种允许跨网络或因特网共享文件的文件系统。 ·&nbsp;新手（Newbie） — 一般而言，指刚接触因特网、计算机的人或者指刚接触 Linux 的人（例如，“Linux 新手”）。 （O）·&nbsp;面向对象（Object-Oriented） — 一种软件开发方法，它为程序员提供标准可重用的软件模块（组件），而无需开发人员每次都编写定制编程代码。使用标准组件缩短了开发时间（因为其他程序员已经编写并测试了这些组件），并且通过使用相同的组件确保了程序具有标准的外观。 ·&nbsp;OO — 参阅“面向对象”。 ·&nbsp;开放源码（Open Source） — 一个稍显模糊的术语，是指同源代码一起发布的软件。提供源代码这一事实并不一定意味着用户可以修改和重新分发源代码。这个术语有时可以和“免费软件”互换使用，尽管它们的意思并不总是相同。（另请参阅“公共域”和“共享软件”。） ·&nbsp;OSS（开放声音系统，Open Sound System） — 用于在 UNIX/Linux 下访问声卡及其它音频设备的设备驱动程序。它是从 Linux 声音驱动程序（Linux Sound Driver）发展而来的，支持大多数流行的音频芯片及适配器。 ·&nbsp;OSS（开放源码软件，Open Source Software） — 参阅“开放源码”。 ·&nbsp;所有者（Owner） — 对文件具有访问特权的用户；通常是创建该文件的用户。 （P）·&nbsp;伪代码（P-code，Pseudo-code）语言 — 一种解释型语言。伪代码语言有点象个“混血儿”，执行方式介于编译型语言和解释型语言之间。和解释型语言一样，伪代码编程语言无需编译，在执行时自动转换成二进制形式。然而，和编译型语言不同的是，这种可执行的二进制文件是以伪代码的形式而不是机器语言的形式存储的。此外，不同于解释型语言的是，不必在每次运行该程序的时候，都必须将其转换成二进制。在第一次转换成伪代码后，以后每次执行都可使用该伪代码版本。伪代码语言（以及用它编写的程序）往往比编译型语言及程序慢，但比解释型语言快，它们通常具有访问一些低层操作系统功能的权限，但却不能直接访问硬件。它们不需要有时很昂贵的编译器，通常与操作系统包含在一起，有些伪代码语言比编译型语言更容易编程。伪代码语言的例子有 Java、Python 和 REXX/Object REXX。 ·&nbsp;PAM（可插入的认证模块，Pluggable Authentication Modules） — 用于系统安全性的可替换的用户认证模块，它允许在不知道将使用何种认证方案的情况下进行编程。这允许将来用其它模块来替换某个模块，却无需重写软件。 ·&nbsp;面板（Panel） — Linux 中对应于 Windows 任务栏的名称。 ·&nbsp;分区（Partition） — 磁盘驱动器的一个连续部分，它被操作系统当作物理驱动器。这样，可以为一个磁盘驱动器赋予几个驱动器符号。 ·&nbsp;PCF 字体 — X Window 系统使用的各种位图字体。 ·&nbsp;PD — 参阅“公共域”。 ·&nbsp;PDF（可移植文档格式，Portable Document Format）文件 — 用 Adobe Acrobat 或其它能够生成该格式输出的程序创建的二进制文件。用于生成独立于操作系统的文档，这种文档可以使用 Acrobat Reader 或其它程序（包括配备有 Acrobat Reader 插件的 Web 浏览器）来查看。 ·&nbsp;Perl（实用摘录与报告语言，Practical Extraction and Report Language） — 一种常用的脚本编制／编程语言。经常用在 UNIX/Linux Web 服务器上生成 CGI 脚本。 ·&nbsp;权限（Permission） — 读写文件和目录及执行程序的权限。超级用户或 root 操作员可以逐个文件、逐个目录地，或者按照帐户名称（用户标识）赋予各种权限级别。 ·&nbsp;PGP（高质量保密程序，Pretty Good Privacy） — 用于 UNIX/Linux 及其它操作系统的高安全性公钥数据加密程序。 ·&nbsp;管道符号（Piping Symbol） — 键盘字符 |（典型 101 键键盘的 Enter 键上面反斜杠的上档字符）。经常用来将某个命令或程序的输出提供给另一个命令或程序。例如，history | grep mcopy （用 history 命令）将 .bash_history 文件的内容发送到 grep 程序，以搜索字符串“mcopy”。（另请参阅“附加符号”和“重定向符号”。） ·&nbsp;移植（Port/Ported/Porting） — 一个过程，即获取为某个操作系统平台编写的程序，并对其进行修改使之能在另一 OS 上运行，并且具有类似的功能。通常很少或者干脆就不尝试定制程序以利用新操作系统的特有能力，这与为某个特定操作系统优化应用程序不同。 ·&nbsp;可移植（Portable） — 描述一类软件的术语，这类软件旨在只需少量修改和重新编译就可在多个操作系统上使用。 ·&nbsp;POSIX（UNIX 可移植操作系统接口，Portable Operating System Interface for uniX） — 一组编程接口标准，它们规定如何编写应用程序源代码以便应用程序可在操作系统之间移植。POSIX 基于 UNIX，它是 The Open Group 的 X/Open 规范的基础。 ·&nbsp;PostScript — Adobe Systems 开发的页描述语言，它告诉打印机如何在打印页上显示文本或图形。 ·&nbsp;PostScript 字体 — 可以用于 OS/2、MS Windows 和 X Window 系统的大量字体。这类字体文件的扩展名包括 .afm、.pfa 和 .pfb。有时称为 Adobe Type 1 字体或 ATM（Adobe Type Manager）字体。PostScript 字体通常需要与 PostScript 兼容的打印机。（另请参阅“BDF 字体”和“TrueType 字体”。） ·&nbsp;进程（Process） — 正在执行的程序。（另请参阅“多任务”和“多线程”。） ·&nbsp;公共域（Public Domain） — 可供任何人以任何目的使用和修改的软件，甚至可以将其并入商业软件的分发。公共域软件不保留版权，作者也不保留任何权利。（另请参阅“开放源码”和“共享软件”。） ·&nbsp;公钥加密（Public Key Encryption） — 一种包括两个单独密钥（公钥和私钥）的数据加密方法。使用公钥加密的数据只能用私钥解密，反之亦然。一般而言，公钥是公开的，可以用来加密发送给私钥持有者的数据，私钥用来对数据进行签名。 ·&nbsp;Python — 一种面向对象伪代码编程语言。 （Q）·&nbsp;Qt — 一种功能强大且快捷的开放源码图形库，用于 UNIX/Linux 上的 X Window 系统。它被程序员用来创建按钮、菜单和其它图形对象。（另请参阅“Gtk/Gtk+”和“KDE”。） ·&nbsp;队列（Queue） — （也时被错误地拼成 Que。）一列等待执行的任务，如“打印队列”。 （R）·&nbsp;RAID（独立／廉价磁盘／设备冗余阵列，Redundant Array of Independent/Inexpensive Disks/Devices）— 一种提供数据冗余、改善性能和／或从磁盘崩溃中迅速恢复数据的方法，它是通过在多个磁盘驱动器上分布或复制数据来实现这一点的。常用的 RAID 类型包括 RAID 0（数据条带化），RAID 1（磁盘镜像）和 RAID 5（具有分布式奇偶校验的条带化）。RAID 配置通常需要 SCSI 磁盘驱动器（而不是 IDE/EIDE），可能要求磁盘相同（相同的容量、品牌等等）。操作系统将 RAID 阵列看作单个设备。 ·&nbsp;RC 文件 — 含有程序（应用程序甚至操作系统）启动指令的脚本文件。这一文件在操作系统启动时会自动执行，它含有要运行的指令（命令或其它脚本）列表。 ·&nbsp;RCS（修订控制系统，Revision Control System） — 一组程序，它们控制组环境下文件的共享访问并跟踪文本文件的变化。常用于维护源代码模块的编码工作。 ·&nbsp;Rdev — 用于获取关于某个 Linux 系统信息的实用程序。用来查询和设置图像 root 设备、视频方式以及交换设备和 RAM 磁盘。 ·&nbsp;重定向符号（Redirection Symbol） — 键盘字符 &gt;。经常用于将命令的输出发送到文本文件。例如，ls -a &gt; output.txt 将当前目录列表发送到名为 output.txt 的文件。重复该命令将会用新数据替换该文件的内容。（另请参阅“附加符号”和“管道符号”。） ·&nbsp;RFS（远程文件共享，Remote File Sharing） — 一个程序，它让用户访问其它计算机上的文件，就好象文件在用户的系统上一样。 ·&nbsp;Root 操作员 — 具有执行所有系统级任务权限的用户标识。（也称作超级用户。） ·&nbsp;Root 窗口 — 运行 Linux 桌面的底层会话。 ·&nbsp;RPM（RPM 软件包管理器，RPM Package Manager） — 一种用于因特网下载包的打包及安装工具，它包含在某些 Linux 分发版中。它生成具有 .RPM 扩展名的文件。与 Dpkg 类似。 <BR><BR>（S）<BR>·&nbsp;脚本（Script） — 一组存储在文件中的命令。用于进行自动重复的执行。（另请参阅“RC 文件”。）<BR>·&nbsp;会话（Session） — 用户在登录到注销期间与操作系统之间的完整交互过程。 <BR>·&nbsp;共享软件（Shareware） — 一类商业软件，它以“先试用再买”的形式提供。如果客户在经过较短的试用期后继续使用该产品，那么他们就被要求支付规定数额（通常微乎其微）的费用。（另请参阅“开放源码”和“公共域”。） <BR>·&nbsp;Shell — 含有操作系统命令行界面的文本方式窗口。 <BR>·&nbsp;Shell 提示符 — shell 的用户输入区域。尽管在 DOS shell 中命令提示符指定为大于号（&gt;），但在 Linux 中，命令提示符通常是百分号（%）、美元符号（$）或其它特殊符号，这取决于所使用的 shell。（另请参阅“命令提示符”。） <BR>·&nbsp;Shell 脚本 — 设计成在 shell 启动时自动运行的脚本。 <BR>·&nbsp;SHTTP（安全超文本传输协议，Secure Hyper Text Transport Protocol） — HTTP 的一种安全的加密版本，用于金融交易以及其它借助因特网发送的保密信息。斜杠（/）— 文件路径名中使用的符号，而不是 DOS/Windows 和 OS/2 操作系统中使用的反斜杠（\）。 <BR>·&nbsp;源代码（Source Code） — 程序员输入的、原始状态的编程命令。有些编程语言允许命令实时地由程序解释器执行。其它语言则要求必须先将命令编译成可执行程序（二进制）后才能使用这些命令。在 UNIX/Linux 世界中，有些软件仅以源代码形式分发；另一些软件包则同时包含源代码和二进制代码；还有一些则仅以二进制格式分发。 <BR>·&nbsp;假脱机（Spool）（外围设备联机并发操作，Simultaneous Peripheral Operation On-Line） — 将数据发送给一个程序，该程序将该数据信息放入队列以备将来使用（例如，打印假脱机程序）。 <BR>·&nbsp;SQL（结构化查询语言（Structured Query Language）） — 用于操作关系数据库中的记录和字段（行和列）的语言。有时被错误地读成“sequel”。 <BR>·&nbsp;隐写术（Steganography） — 将一段信息隐藏在另一段信息中的做法。一个示例是在数字化照片中放置不可见的数字水印。 <BR>·&nbsp;字符串（String） — 字符序列，如“搜索字符串”。 <BR>·&nbsp;超级用户（Superuser） — 通常与 root 操作员同义。 <BR>·&nbsp;交换（Swap） — 暂时将数据（程序和／或数据文件）从随机存取存储器移到磁盘存储器（换出），或反方向移动（换入），以允许处理比物理内存所能容纳的更多的程序和数据。也称为虚拟内存。 <BR>·&nbsp;交换空间（Swap Space） — 被交换数据在磁盘上暂时存放的地方。Linux 用专用磁盘分区而不是特定交换文件来作为交换空间。 <BR>·&nbsp;符号链接（Symbolic link） — 程序或文件的别名或快捷方式。 <BR>·&nbsp;同步（Sync） — 将所有暂挂的输入／输出强制写回磁盘驱动器。 <BR>·&nbsp;系统日志（Syslog） — UNIX/Linux 系统日志记录程序，其中存储了所有系统消息或错误。 <BR><BR>（T）<BR>·&nbsp;标记（Tag） — 诸如 HTML 之类的标记语言中的命令，它以某种方式（如粗体、居中或使用某种字体）显示信息。 <BR>·&nbsp;Tar（磁带归档，Tape ARchive） — 包含在 UNIX/Linux 中的一个文件打包工具，用于将一组文件组装成一个组合的文件以便归档起来更容易。它最初设计用于磁带备份，但现在它也可用于其它存储介质。独自运行时，生成具有 .tar 扩展名的文件。当与 Gzip 结合用于数据压缩时，生成的文件扩展名可能是 .tgz、.tar.gz 或 .tar.Z。 <BR>·&nbsp;Tar 包（Tarball） — 用 Tar 实用程序创建的文件，含有一个或多个归档的，同时也有可能进行了压缩的文件。 <BR>·&nbsp;TeX — 基于宏的流行的文本格式化程序。它是包括 LaTeX 和 teTeX 在内的其它此类格式化程序的基础。 <BR>·&nbsp;文本编辑器（Text Editor） — 用于编辑文本文件的程序。类似于字处理程序，但没有大多数／全部格式化功能（例如设置页边距、斜体和字体等等。）。经常用于书写或编辑脚本、程序和 ASCII 文本文件（如 README.1ST）。 <BR>·&nbsp;文本格式化程序（Text Formatter） — 准备文本文档以供打印的程序，允许用户执行许多布局功能，如页边距、页眉、页脚、缩排、分页和对齐。 <BR>·&nbsp;TFTP（小型文件传送协议，Trivial File Transfer Protocol） — FTP 的简化版本，它没有 FTP 的认证以及其它许多基本特性。 <BR>·&nbsp;线程（Thread） — 一小段程序，其行为就象是较大程序的一个独立子集，也称为“进程”。多线程程序能够比单个程序或单线程程序运行得快得多，因为它可以并行（而不是串行（顺序））地执行几个甚至多个不同的任务。而且，单个应用程序内的多个线程可以共享资源，并且相互之间可以来回传递数据。 <BR>·&nbsp;分时（Time-sharing） — 一种允许多个用户分享处理器的方法，它以时间为基础给每个用户分配一部分处理器资源，按照这些时间段轮流运行每个用户的进程。（另请参阅“多任务”。） <BR>·&nbsp;Torvalds, Linus — 1991 年 Linux 内核的最初创建者，是 Linux 版权的拥有者，目前仍然是 Linux 开发项目的协调人。 <BR>·&nbsp;Touch — 一个命令，更改文件的日期／时间戳记，但不影响其内容。 <BR>·&nbsp;TrueType 字体 — 与 PostScript 字体不一样，它们旨在成为与打印机无关的各种字体。可用于 Apple Macintosh 和 Windows。不常用于 UNIX/Linux。（另请参阅“BDF 字体”和“PostScript 字体”。） <BR>·&nbsp;Tux — 虚构的 Linux 企鹅吉祥物的名字。 <BR><BR>（U）<BR>·&nbsp;UNIX — UNIX 最初作为一个专有操作系统，由 Bell 实验室在 20 世纪 60 年代开发。它最终衍生出了多个相互不兼容的商业版本，这些版本来自 Apple（Mac OS X）、Digital（Digital UNIX）、Hewlett-Packard（HPUX）、IBM（AIX®）和 NeXT (NeXTSTEP) 等公司。 <BR>·&nbsp;UUCP — 一组程序和协议，已成为世界范围的 UNIX 计算机网络的基础。是以 UNIX 到 UNIX 复制程序（UNIX to UNIX Copy Program）来命名的。 <BR><BR>（V）<BR>·&nbsp;虚拟桌面（Virtual Desktop） — 一种将用户的工作区扩展到计算机屏幕边界以外的方法。该桌面可以上下左右滚动，就好象一个更大的桌面放置在玻璃屏幕后面，并且可以四处移动以显示图标、窗口以及其它一些“在幕后”或视野以外的对象。或者，如同 KDE 桌面，可以使用多个按钮，每个按钮都显示大小等于玻璃屏幕的桌面区域，而且每个都含有不同对象。 <BR>·&nbsp;虚拟机（Virtual Machine） — 虚拟机（VM）是中央处理器芯片的特征，它将内存的某个区域同系统的剩余部分隔离开来。因为操作系统和应用程序运行于“保护模式”环境之下，所以如果某个程序在某个虚拟机中冻结了，那么它将不会影响运行于该虚拟机以外的程序和操作系统的运行。 <BR>·&nbsp;虚拟内存（Virtual Memory） — 使用一部分磁盘空间来作为内存的临时的存储区域的过程。与“交换”意思相同。 <BR>·&nbsp;VRML（虚拟现实建模语言，Virtual Reality Modeling Language） — 一种主要基于 Web 的语言，用于 3D 效果（如构建遍历）。 <BR>·&nbsp;窗口构件（Widget） — 用于 X Window 系统的图形用户界面编程对象（按钮、滚动条和单选按钮等等）。（另请参阅“X Window 系统”。） <BR>·&nbsp;窗口管理器（Window Manager） — 一个图形用户界面（GUI），它运行于 X Window 之上，以便为用户提供窗口、图标、任务栏和其它桌面对象。（另请参阅“桌面”。） <BR>·&nbsp;工作目录（Working Directory） — 当前目录或用户当前工作时所在的目录的另一名称。 <BR>·&nbsp;工作区（Workspace） — Root Window 或桌面的另一名称。 <BR>·&nbsp;封装器（Wrapper） — 用于启动另一个程序的程序。 <BR><BR>（X）<BR>·&nbsp;X Window 系统 — UNIX 的图形窗口环境。许多用户界面都需要的底层编程。（另请参阅“桌面”、“窗口管理器”和“XFree86”。） <BR>·&nbsp;X11 — X Window 系统的 V11。 <BR>·&nbsp;XDM（X 显示管理器，X Display Manager） — X Window 系统对用户友好的登录前端。经常用于网吧或校园环境，在这些地方，不熟悉 UNIX 的用户偶尔需要访问 UNIX。 <BR>·&nbsp;XFree86 — Linux 的一个 X Window 系统版本。被 GNOME、KDE 和其它 Linux 用户界面／窗口管理器所使用。 <BR>·&nbsp;XHTML（可扩展超文本标记语言，extensible Hyper Text Markup Language） — HTML 的增强版本，它支持象 XML 那样的由程序员定义的扩展。 <BR>·&nbsp;XML（可扩展标记语言，eXtensible Markup Language） — 用于设计 Web 页面的、功能强大的新型标记语言；它可以替代较老的 HTML，允许程序员定义他们自己的标记或格式化命令。 <BR><BR>（Y）<BR>·&nbsp;Y（为什么，why） — 为什么没有（Y not）？我需要一些以 Y 开头的术语… <BR><BR>（Z）<BR>·&nbsp;Zip — 一种流行的文件压缩／归档格式，可以用于许多操作系统平台，包括 DOS/Windows、OS/2 和 UNIX/Linux。流行的工具包括 PKZip/PKUnzip 和 Zip/Unzip。不要将其与 Iomega Zip 磁盘相混淆，后者是一种可移动存储设备。（令人迷惑的是，用 Zip 压缩的文件可以存储在 Zip 磁盘上，也可以不存储在该磁盘上。二者之间并无关联。）用 Zip 压缩的文件具有 .zip 扩展名。 <BR>·&nbsp;区域（Zone） — 在管理或其它控制下的网络区域。在名称服务器配置内，域可以是一个区域。区域可以进一步细分为子区域，每个都可以拥有自己的管理员和服务器。 <BR>·&nbsp;Zoo — Amiga 系统上一种流行的压缩和归档格式，也可用于 UNIX/Linux。用这种方法打包的文件，其扩展名为 .zoo。&nbsp;&nbsp; <BR><BR>Mark T. ChapmanIBM Server Group2000 年 6 月 30 日® Copyright IBM Corporation 2000IBM Server Group3039 Cornwallis RoadDept. LO6AResearch Triangle Park, NC 27709Produced in the United States of America7-00All rights reserved本出版物中所提到的 IBM 产品或服务并不意味着 IBM 打算在所有有 IBM 业务的国家或地区提供这些产品或服务。IBM 保留更改这些规范或其它产品信息的权利，而不另行通知。IBM、RS/6000、S/390 和 IBM 徽标是 IBM 公司在美国和／或其它国家或地区的商标。Linux 是 Linus Torvalds 的注册商标。Microsoft、Windows 和 Windows 徽标是 Microsoft Corporation 的商标或注册商标。Sun、Sun Microsystems、Java 和 Jini 是 Sun Microsystems, Inc. 在美国和／或其它国家或地区的商标或注册商标。UNIX 是由 X/Open Company Limited 独家许可的在美国和其它国家或地区的注册商标。其它所有商标和注册商标都属于它们各自的所有者。本出版物可能包含印刷错误和技术方面的不准确性，随时都可能被更改或撤消。其内容是以“按现状”的基础提供的，不附有任何形式的（无论是明示的，还是默示的）保证，包括适销性和适用于某特定用途的默示保证。某些国家或地区在某些交易中不允许免除明示或默示的保证，因此本免责声明可能不适用于您。本出版物可能含有到不受 IBM 控制或维护的第三方站点的链接。访问任何这类第三方站点所带来的风险都由用户自行承担，对于这类站点上的任何信息、数据、观点、建议或声明的准确性或可靠性，IBM 概不负责。IBM 仅仅是为了方便才提供这些链接的，包含这些链接并不暗示任何认可。&nbsp; </P>
<P><BR>&nbsp;</P><img src ="http://www.blogjava.net/jackywjj/aggbug/27628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-11 18:20 <a href="http://www.blogjava.net/jackywjj/articles/27628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高软件开发效率的八个要素</title><link>http://www.blogjava.net/jackywjj/articles/27626.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 11 Jan 2006 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/27626.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/27626.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/27626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/27626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/27626.html</trackback:ping><description><![CDATA[<P>&nbsp;工作三年多了，切身体会到软件开发是一种高强度的脑力劳动，理论性和实践性都很强。特别是软件工程，对软件开发的成功（按质按量，按期完成）有决定性作用。同时开发人的生产效率也对开发的周期和质量有很大影响。</P>
<P>&nbsp;&nbsp;&nbsp; 根据我的经验，我总结了软件开发中最重要、最容易出现偏差的八个要素，希望大家从中得到启发，把软件工程应用到开发中去，全面提高软件质量，把中国软件搞上去，超过印度。</P>
<P>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做好调研和需求分析，必要的话建立原型，保证软件特征是客户所需要的，尽量避免软件成型后客户才提出修改。</P>
<P>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保证需求分析和概要设计的时间和质量，记住这一阶段的错误，在以后的阶段要付出10-100倍的时间去弥补。合适的分析设计和编码的比例不好说，我曾经看到的两个国外的数字是60%。</P>
<P>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 软件开发是一种创造性的脑力劳动，因此营造一个宽松和谐的工作环境，让工作人员能安心投入去思考、创作非常重要。工作量不能用体力劳动的工作时间、工作强度来衡量。过大的工作压力非常有害。因为这只会让软件开发人员为赶进度、应付上级而写下未经考虑，Bug丛生的代码。</P>
<P>4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同事间应该有良好的关系和合作态度。良好的关系对效率的提高也许有限，但糟糕的关系往往对开发产生极大的影响。</P>
<P>5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码过程中，一个单元基本完成后，不要急于去做下一个单元，而要做单元测试和自测，因为现有单元的错误如果留到集成测试阶段，往往需要跟踪调试才能找出来，需要花费10倍时间，且很多错误是极难再现的。不能为赶进度而舍本逐末。</P>
<P>6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做好概要设计，保证整体框架简单可靠，能够满足所有需求及可能的适度扩展，避免后期修改框架带来的全局变动。</P>
<P>7)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求分析、概要设计、详细设计的结果要落实成文档（多用图表），避免口头交流带来的偏差和对细节的遗忘。当然对文档的口头讲解也必不可少。</P>
<P>8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做好注释。良好的注释可以减少修改维护，调用公用函数的时间和产生错误的机会。<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/27626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-11 18:14 <a href="http://www.blogjava.net/jackywjj/articles/27626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件需求模板</title><link>http://www.blogjava.net/jackywjj/articles/27625.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 11 Jan 2006 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/27625.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/27625.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/27625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/27625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/27625.html</trackback:ping><description><![CDATA[<P><BR>软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解， 使之成为整个开发工作的基础。编制软件需求说明书的内容要求如下：</P>
<P>　　1　引言</P>
<P>　　1．1编写目的</P>
<P>　　说明编写这份软件需求说明书的目的，指出预期的读者。</P>
<P>　　1．2背景 </P>
<P>　　说明： </P>
<P>　　a．待开发的软件系统的名称；<BR>　　b．本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络；<BR>　　C．该软件系统同其他系统或其他机构的基本的相互来往关系。 </P>
<P>　　1．3定义</P>
<P>　　列出本文件中用到的专门术语的定义和外文首字母组词的原词组。</P>
<P>　　1．4参考资料 </P>
<P>　　列出用得着的参考资料，如：<BR>　　a．本项目的经核准的计划任务书或合同、上级机关的批文；<BR>　　b．属于本项目的其他已发表的文件；<BR>　　c．本文件中各处引用的文件、资料、包括所要用到的软件开发标准。 列出这些文件资料的标题、文件编号、发表日期和出版单位，说明能够得到这些文件资料的来源。</P>
<P>　　2　任务概述 </P>
<P>　　2．1目标 </P>
<P>　　叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件，而且全部内容自含，则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分，则应说明本产品与该系统中其他各组成部分之间的关系，为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。</P>
<P>　　2．2用户的特点 </P>
<P>　　列出本软件的最终用户的特点，充分说明操作人员、维护人员的教育水平和技术专长，以及本软件的预期使甩频度。这些是软件设计工作的重要约束</P>
<P>　　2．3假定和约束</P>
<P>　　列出进行本软件开发工作的假定和约束，例如经费限制、开发期限等。</P>
<P>　　3　需求规定 </P>
<P>　　3．1对功能的规定</P>
<P>　　用列表的方式（例如IPO表即输入、处理、输出表的形式），逐项定量和定性地叙述对软件所提出的功能要求，说明输入什么量、经怎样的处理、得到什么输出，说明软件应支持的终端数和应支持的并行操作的用户数。 </P>
<P>　　3．2对性能的规定</P>
<P>　　3．2．1精度 </P>
<P>　　说明对该软件的输入、输出数据精度的要求，可能包括传输过程中的精度。</P>
<P>　　3．2．2时间特性要求 </P>
<P>　　说明对于该软件的时间特性要求，如对：<BR>　　a．响应时间；<BR>　　b．更新处理时间；<BR>　　c．数据的转换和传送时间；<BR>　　d．解题时间； 等的要求。</P>
<P>　　3．2．3灵活性 </P>
<P>　　说明对该软件的灵活性的要求，即当需求发生某些变化时，该软件对这些变化的适应能力，如：</P>
<P>　　a．操作方式上的变化；<BR>　　b．运行环境的变化； <BR>　　c．同其他软件的接口的变化；<BR>　　d．精度和有效时限的变化； <BR>　　e．计划的变化或改进。 <BR>　　对于为了提供这些灵活性而进行的专门设计的部分应该加以标明。</P>
<P>　　3．3输人输出要求</P>
<P>　　解释各输入输出数据类型，并逐项说明其媒体、格式、数值范围、精度等。对软件的数据输出及必须标明的控制输出量进行解释并举例，包括对硬拷贝报告（正常结果输出、状态输出及异常输出）以及图形或显示报告的描述。</P>
<P>　　3．4数据管理能力要求 </P>
<P>　　说明需要管理的文卷和记录的个数、表和文卷的大小规模，要按可预见的增长对数据及其分量的存储要求作出估算。 </P>
<P>　　3．5故障处理要求</P>
<P>　　列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。</P>
<P>　　3．6其他专门要求</P>
<P>　　如用户单位对安全保密的要求，对使用方便的要求，对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。 </P>
<P>　　4　运行环境规定 </P>
<P>　　4．1设备 </P>
<P>　　列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能，包括：<BR>　　a．处理器型号及内存容量；<BR>　　b．外存容量、联机或脱机、媒体及其存储格式，设备的型号及数量；<BR>　　c．输入及输出设备的型号和数量，联机或脱机； <BR>　　d．数据通信设备的型号和数量；<BR>　　e．功能键及其他专用硬件</P>
<P>　　4．2支持软件 </P>
<P>　　列出支持软件,包括要用到的操作系统、编译（或汇编）程序、测试支持软件等。</P>
<P>　　4．3 接口</P>
<P>　　说明该软件同其他软件之间的接口、数据通信协议等。</P>
<P>　　4．4控制 </P>
<P>　　说明控制该软件的运行的方法和控制信号，并说明这些控制信号的来源。<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/27625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-11 18:13 <a href="http://www.blogjava.net/jackywjj/articles/27625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何成为一个好的系统分析员</title><link>http://www.blogjava.net/jackywjj/articles/27624.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 11 Jan 2006 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/27624.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/27624.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/27624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/27624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/27624.html</trackback:ping><description><![CDATA[<P>Truely眼中的设计定义：设计的过程就是将事务处理抽象成计算机模型的过程。</P>
<P>1。首先要明白设计远比编程重要。</P>
<P>2。平时注重训练自己的思维严谨性和从全局考虑问题的能力。建立冷静思考问题的处事态度。</P>
<P>3。设计时（尤其是数据库设计时）不要完全被规矩约束，设计好比作诗，懂得韵律是对的，但完全被韵律所束缚，就作不出好诗了。</P>
<P>4。多做设计，经常总结自己的不足之处和成功之处，向他人请教。</P>
<P>5。专门去找别人设计的漏洞和不足，也是提高自己设计水平的重要手段。</P>
<P>（记住：这个好方法不要顺便外传，自己知道就行了，嘻嘻-:）</P>
<P>6。经验是重要的，但如果观念老化而不善于总结提高，所谓的经验就成为束缚自己进步的枷锁。</P>
<P>7。学好数学特别是理论数学如数学分析、运筹学、数学模型等。多玩策略性经营游戏也是有益的。推荐《帝国时代》和《模拟首都3000》以及《大富翁4》。（但不要沉陷在里面）</P>
<P>8。根据项目情况和开发平台工具的特点确定最佳的设计方法。模块化设计方法和面向对象设计。两种设计方法的结合使用。</P>
<P>9。将复杂无序的过程用模块化的方法进行分解，但要注重事务间的联系，并且用开放的眼光去设计。</P>
<P>10。设计时对严谨性、灵活性、开发效率、客户要求四个方面做衡量取舍。</P>
<P>11。设计时还要根据整个工程的进度安排和客户对软件的要求而决定是否设计得足够灵活和严谨。</P>
<P>12。复杂而无条理是最糟的设计，简单实用并不一定是最好的，但一定不是最坏的。（不要说我偷懒哟）</P>
<P>13。训练自己良好的表达能力，能用清晰明确而且简单的描述表达出自己的基本思路。</P>
<P>14。在一个项目中建立统一的系统分析模式和文档模板，同时，一个项目中必须至少有一个人对整个系统设计进行检查和进行全局的考虑。<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/27624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-11 18:12 <a href="http://www.blogjava.net/jackywjj/articles/27624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计方法、规范与技巧</title><link>http://www.blogjava.net/jackywjj/articles/27623.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 11 Jan 2006 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/27623.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/27623.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/27623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/27623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/27623.html</trackback:ping><description><![CDATA[<P>&nbsp;一、数据库设计过程<BR>数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境，构造最优的数据库模式，建立数据库及其应用系统，有效存储数据，满足用户信息要求和处理要求。<BR>数据库设计中需求分析阶段综合各个用户的应用需求（现实世界的需求），在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式（信息世界模型），用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型，形成数据库逻辑模式。然后根据用户处理的要求，安全性的考虑，在基本表的基础上再建立必要的视图（VIEW）形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<BR>1. 需求分析阶段 <BR>需求收集和分析，结果得到数据字典描述的数据需求（和数据流图描述的处理需求）。 <BR>需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。<BR>需求分析的方法：调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。 <BR>常用的调查方法有： 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。<BR>分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法（Structured Analysis，简称SA方法）从最上层的系统组织机构入手，采用逐层分解的方式分析系统，并把每一层用数据流图和数据字典描述。<BR>数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典（Data Dictionary，简称DD）来描述。<BR>数据字典是各类数据描述的集合，它是关于数据库中数据的描述，即元数据，而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。<BR>数据项描述＝｛数据项名，数据项含义说明，别名，数据类型，长度， <BR>　　　　　　　　　取值范围，取值含义，与其他数据项的逻辑关系｝ <BR>数据结构描述＝｛数据结构名，含义说明，组成:｛数据项或数据结构｝｝ <BR>数据流描述＝｛数据流名，说明，数据流来源，数据流去向， <BR>　　　　　　　　　组成:｛数据结构｝，平均流量，高峰期流量｝ <BR>数据存储描述＝｛数据存储名，说明，编号，流入的数据流，流出的数据流， 　　<BR>　　　　　　　　组成:｛数据结构｝，数据量，存取方式｝ <BR>处理过程描述＝｛处理过程名，说明，输入:｛数据流｝，输出:｛数据流｝, <BR>　　　　　　　　　　处理:｛简要说明｝｝ <BR>2. 概念结构设计阶段 <BR>通过对用户需求进行综合、归纳与抽象，形成一个独立于具体DBMS的概念模型，可以用E-R图表示。 <BR>概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。 <BR>概念模型特点：<BR>(1) 具有较强的语义表达能力，能够方便、直接地表达应用中的各种语义知识。 <BR>(2) 应该简单、清晰、易于用户理解，是用户与数据库设计人员之间进行交流的语言。<BR>概念模型设计的一种常用方法为IDEF1X方法，它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术，用于建立系统信息模型。<BR>&nbsp;&nbsp;&nbsp; 使用IDEF1X方法创建E-R模型的步骤如下所示:<BR>2.1 第零步——初始化工程<BR>这个阶段的任务是从目的描述和范围描述开始，确定建模目标，开发建模计划，组织建模队伍，收集源材料，制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果，业务流程，原有系统的输入输出，各种报表，收集原始数据，形成了基本数据资料表。<BR>2.2 第一步——定义实体<BR>实体集成员都有一个共同的特征和属性集，可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有“代码”结尾的术语，如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来，从而初步找出潜在的实体，形成初步实体表。<BR>2.3 第二步——定义联系<BR>IDEF1X模型中只允许二元联系，n元联系必须定义为n个二元联系。根据实际的业务需求和规则，使用实体联系矩阵来标识实体间的二元关系，然后根据实际情况确定出连接关系的势、关系名和说明，确定关系类型，是标识关系、非标识关系（强制的或可选的）还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识，则为标识关系，否则为非标识关系。非标识关系中，如果每个子实体的实例都与而且只与一个父实体关联，则为强制的，否则为非强制的。如果父实体与子实体代表的是同一现实对象，那么它们为分类关系。<BR>2.4 第三步——定义码<BR>通过引入交叉实体除去上一阶段产生的非确定关系，然后从非交叉实体和独立实体开始标识侯选码属性，以便唯一识别每个实体的实例，再从侯选码中确定主码。为了确定主码和关系的有效性，通过非空规则和非多值规则来保证，即一个实体实例的一个属性不能是空值，也不能在同一个时刻有一个以上的值。找出误认的确定关系，将实体进一步分解，最后构造出IDEF1X模型的键基视图（KB图）。<BR>2.5 第四步——定义属性<BR>从源数据表中抽取说明性的名词开发出属性表，确定属性的所有者。定义非主码属性，检查属性的非空及非多值规则。此外，还要检查完全依赖函数规则和非传递依赖规则，保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。<BR>2.6 第五步——定义其他对象和规则<BR>&nbsp;&nbsp;&nbsp; 定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。<BR>3. 逻辑结构设计阶段 <BR>&nbsp;&nbsp;&nbsp; 将概念结构转换为某个DBMS所支持的数据模型（例如关系模型），并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型，然后选择最合适的DBMS。<BR>将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则： <BR>1）一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。 <BR>2）一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 <BR>3）一个1:n联系可以转换为一个独立的关系模式，也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式，则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性，而关系的码为n端实体的码。 <BR>4）一个1:1联系可以转换为一个独立的关系模式，也可以与任意一端对应的关系模式合并。<BR>5）三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。&nbsp; <BR>6）同一实体集的实体间的联系，即自联系，也可按上述1:1、1:n和m:n三种情况分别处理。 <BR>7）具有相同码的关系模式可合并。 <BR>为了进一步提高数据库应用系统的性能，通常以规范化理论为指导，还应该适当地修改、调整数据模型的结构，这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准，即：<BR>表内的每一个值都只能被表达一次。<BR>??表内的每一行都应该被唯一的标识（有唯一键）。<BR>表内不应该存储依赖于其他键的非键信息。&nbsp;&nbsp; <BR>4. 数据库物理设计阶段 <BR>为逻辑数据模型选取一个最适合应用环境的物理结构（包括存储结构和存取方法）。根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<BR>5. 数据库实施阶段 <BR>运用DBMS提供的数据语言（例如SQL）及其宿主语言（例如C），根据逻辑设计和物理设计的结果建立数据库，编制与调试应用程序，组织数据入库，并进行试运行。 数据库实施主要包括以下工作：用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行&nbsp; <BR>6. 数据库运行和维护阶段 <BR>数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括：数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。</P>
<P>建模工具的使用<BR>为加快数据库设计速度，目前有很多数据库辅助工具（CASE工具），如Rational公司的Rational Rose，CA公司的Erwin和Bpwin，Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。<BR>ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式，描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型，不仅能得到优秀的业务功能和数据需求模型，而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中，IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中，ERwin可以定义对应的表、列，并可针对各种数据库管理系统自动转换为适当的类型。<BR>设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后，设计人员可以使用Erwin画ER图，将ER图转换为关系数据模型，生成数据库结构；画数据流图，生成应用程序。<BR>二、数据库设计技巧<BR>1. 设计数据库之前（需求分析阶段）<BR>1) 理解客户需求，询问用户如何看待未来需求变化。让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。<BR>2) 了解企业业务可以在以后的开发阶段节约大量的时间。<BR>3) 重视输入输出。<BR>在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。<BR>举例：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。<BR>4) 创建数据字典和ER 图表<BR>ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。<BR>5) 定义标准的对象命名规范<BR>数据库各种对象的命名必须规范。<BR>2. 表和字段的设计（数据库逻辑设计）<BR>表设计原则<BR>1) 标准化和规范化<BR>数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式，但Third Normal Form（3NF）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，遵守3NF 标准的数据库的表设计原则是：“One Fact in One Place”即某个表只包括其本身基本的属性，当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点：有一组表专门存放通过键连接起来的关联数据。<BR>举例：某个存放客户及其有关定单的3NF 数据库就可能有两个表：Customer 和Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向Customer 表里包含该客户信息的那一行。<BR>事实上，为了效率的缘故，对表不进行标准化有时也是必要的。<BR>2) 数据驱动<BR>采用数据驱动而非硬编码的方式，许多策略变更和维护都会方便得多，大大增强系统的灵活性和扩展性。<BR>举例，假如用户界面要访问外部数据源（文件、XML 文档、其他数据库等），不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行工作流之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。<BR>3) 考虑各种变化<BR>在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。<BR>举例，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。</P>
<P>字段设计原则<BR>4) 每个表中都应该添加的3 个有用的字段<BR>??dRecordCreationDate，在VB 下默认是Now()，而在SQL Server 下默认为GETDATE()<BR>??sRecordCreator，在SQL Server 下默认为NOT NULL DEFAULT USER<BR>??nRecordVersion，记录的版本标记；有助于准确说明记录中出现null 数据或者丢失数据的原因<BR>5) 对地址和电话采用多个字段<BR>描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的类型和标记类别。<BR>6) 使用角色实体定义属于某类别的列<BR>在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。<BR>举例：用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说，当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位，而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的PERSON_TYPE 表就包含了所有PERSON 的可能类型，比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。<BR>7) 选择数字类型和文本类型尽量充足<BR>在SQL 中使用smallint 和tinyint 类型要特别小心。比如，假如想看看月销售总额，总额字段类型是smallint，那么，如果总额超过了$32,767 就不能进行计算操作了。<BR>而ID 类型的文本字段，比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。<BR>8) 增加删除标记字段<BR>在表中包含一个“删除标记”字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 <BR>3. 选择键和索引（数据库逻辑设计）<BR>键选择原则：<BR>1) 键设计4 原则<BR>??为关联字段创建外键。<BR>??所有的键都必须唯一。<BR>??避免使用复合键。<BR>??外键总是关联唯一的键字段。<BR>2) 使用系统生成的主键<BR>设计数据库的时候采用系统生成的键作为主键，那么实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点：当拥有一致的键结构时，找到逻辑缺陷很容易。<BR>3) 不要用用户的键(不让主键具有可更新性)<BR>在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。<BR>4) 可选键有时可做主键<BR>把可选键进一步用做主键，可以拥有建立强大索引的能力。</P>
<P>索引使用原则：<BR>索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。<BR>1) 逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列采用非成组索引。考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。<BR>2) 大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。<BR>3) 不要索引memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。<BR>4) 不要索引常用的小型表<BR>不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。</P>
<P>4. 数据完整性设计（数据库逻辑设计）<BR>1) 完整性实现机制：<BR>实体完整性：主键<BR>参照完整性：<BR>父表中删除数据：级联删除；受限删除；置空值<BR>父表中插入数据：受限插入；递归插入<BR>父表中更新数据：级联更新；受限更新；置空值<BR>DBMS对参照完整性可以有两种方法实现：外键实现机制（约束规则）和触发器实现机制<BR>用户定义完整性：<BR>&nbsp;&nbsp;&nbsp; NOT NULL；CHECK；触发器<BR>2) 用约束而非商务规则强制数据完整性<BR>采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。<BR>3) 强制指示完整性<BR>在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。<BR>4) 使用查找控制数据完整性<BR>控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。<BR>5) 采用视图<BR>为了在数据库和应用程序代码之间提供另一层抽象，可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。<BR>5. 其他设计技巧<BR>1) 避免使用触发器<BR>触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。<BR>2) 使用常用英语（或者其他任何语言）而不要使用编码<BR>在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码，可以在编码旁附上用户知道的英语。<BR>3) 保存常用信息<BR>让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复（对Access）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。<BR>4) 包含版本机制<BR>在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 <BR>5) 编制文档<BR>对所有的快捷方式、命名规范、限制和函数都要编制文档。<BR>采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。<BR>对数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当过了一年多时间后再回过头来做第2 个版本，犯错的机会将大大减少。<BR>6) 测试、测试、反复测试<BR>建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。<BR>7) 检查设计<BR>在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。<BR>三、数据库命名规范<BR>1. 实体（表）的命名<BR>1) 表以名词或名词短语命名，确定表名是采用复数还是单数形式，此外给表的别名定义简单规则（比方说，如果表名是一个单词，别名就取单词的前4 个字母；如果表名是两个单词，就各取两个单词的前两个字母组成4 个字母长的别名；如果表的名字由3 个单词组成，从头两个单词中各取一个然后从最后一个单词中再取出两个字母，结果还是组成4 字母长的别名，其余依次类推）<BR>对工作用表来说，表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中，根据语义拼凑缩写即可。注意，由于ORCLE会将字段名称统一成大写或者小写中的一种，所以要求加上下划线。<BR>举例：<BR>定义的缩写 Sales: Sal 销售；<BR>Order: Ord 订单；<BR>Detail: Dtl 明细；<BR>则销售订单明细表命名为：Sal_Ord_Dtl;<BR>2) 如果表或者是字段的名称仅有一个单词，那么建议不使用缩写，而是用完整的单词。<BR>举例：<BR>定义的缩写 Material Ma 物品；<BR>物品表名为：Material, 而不是 Ma.<BR>但是字段物品编码则是：Ma_ID;而不是Material_ID<BR>3) 所有的存储值列表的表前面加上前缀Z<BR>目的是将这些值列表类排序在数据库最后。<BR>4) 所有的冗余类的命名(主要是累计表)前面加上前缀X<BR>冗余类是为了提高数据库效率，非规范化数据库的时候加入的字段或者表<BR>5) 关联类通过用下划线连接两个基本类之后，再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。<BR>关联表用于保存多对多关系。<BR>如果被关联的表名大于10个字母，必须将原来的表名的进行缩写。如果没有其他原因，建议都使用缩写。<BR>举例：表Object与自身存在多对多的关系,则保存多对多关系的表命名为：R_Object；<BR>表 Depart和Employee;存在多对多的关系；则关联表命名为R_Dept_Emp<BR>2. 属性（列）的命名<BR>1) 采用有意义的列名，表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码，统一命名为：ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型，你可以用_NO 作为后缀；如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。<BR>举例：销售订单的编号字段命名：Sal_Ord_ID；如果还存在一个数据库生成的自动编号，则命名为：ID。<BR>2) 所有的属性加上有关类型的后缀，注意，如果还需要其它的后缀，都放在类型后缀之前。<BR>注: 数据类型是文本的字段，类型后缀TX可以不写。有些类型比较明显的字段，可以不写类型后缀。<BR>3) 采用前缀命名<BR>给每个表的列名都采用统一的前缀，那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点，比如破坏了自动表连接工具的作用，后者把公共列名同某些数据库联系起来。<BR>3. 视图的命名<BR>1) 视图以V作为前缀，其他命名规则和表的命名类似；<BR>2) 命名应尽量体现各视图的功能。<BR>4. 触发器的命名<BR>触发器以TR作为前缀，触发器名为相应的表名加上后缀，Insert触发器加'_I'，Delete触发器加'_D'，Update触发器加'_U'，如：TR_Customer_I，TR_Customer_D，TR_Customer_U。<BR>5. 存储过程名<BR>存储过程应以'UP_'开头，和系统的存储过程区分，后续部分主要以动宾形式构成，并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。<BR>6. 变量名<BR>变量名采用小写，若属于词组形式，用下划线分隔每个单词，如@my_err_no。<BR>7. 命名中其他注意事项<BR>1)&nbsp; 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29（不包括标识字符@）。<BR>2)&nbsp; 数据对象、变量的命名都采用英文字符，禁止使用中文命名。绝对不要在对象名的字符之间留空格。<BR>3) 小心保留词，要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突<BR>5) 保持字段名和类型的一致性，在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数，那在另一个表里可就别变成字符型了。<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/27623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-11 18:11 <a href="http://www.blogjava.net/jackywjj/articles/27623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server的系统属性</title><link>http://www.blogjava.net/jackywjj/articles/25166.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 23 Dec 2005 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/25166.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/25166.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/25166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/25166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/25166.html</trackback:ping><description><![CDATA[<P>平常我们只听说过ADO等一类ASP对象，但在ASP中还有个鲜为人知的专门SQL Server的ASP访问对象,它就是SQLOLE.SQLServer对象。SQLOLE.SQLServer可以直接访问SQL Server的系统属性。以Set oSQLServer = CreateObject ("SQLOLE.SQLServer")语句将产生一个SQL Server服务器对象。 <BR>---- 若要查看此服务器中数据库的集合，可用语句： </P>
<P>&nbsp;</P>
<P>For Each SQLDB In oSQLServer.Databases<BR>Response.Write SQLDB.Name ‘将列出所有的数据库，如Pubs等<BR>Next</P>
<P>---- 若要查看某数据库中(如PUBS数据库)数据表的集合，可用语句： </P>
<P>&nbsp;</P>
<P>pubDatabase=oSQLServer.Databases(“pubs”)<BR>’oSQLServer是前面创建的SQL Server服务器对象<BR>For Each DBTable In pubDatabase.Tables<BR>Response.Write DBTable.Name<BR>Next</P>
<P>---- 下面的语句将列出数据库中(PUBS数据库)数据视图 </P>
<P>&nbsp;</P>
<P>pubDatabase =oSQLServer.Databases(“pubs”)<BR>’oSQLServer是前面创建的SQL Server服务器对象<BR>For Each DBView In pubDatabase.Views<BR>Response.Write DBView.Text<BR>Next</P>
<P>---- 以下语句将列出数据库中(PUBS数据库)存贮过程 </P>
<P>&nbsp;</P>
<P>pubDatabase =oSQLServer.Databases(“pubs”)<BR>’oSQLServer是前面创建的SQL Server服务器对象<BR>For Each DBSP In pubDatabase.StoredProcedures<BR>Response.Write DBSP.Text<BR>Next</P>
<P>---- 程序运行的结果（取数据表名）： </P>
<P>---- 取存贮过程的结果： </P>
<P>---- 一个完整的小例子源码附后（其它功能读者可加入）。 </P>
<P>&nbsp;</P>
<P>&lt; %@ LANGUAGE = VBScript % &gt;</P>
<P>&lt; HTML &gt;<BR>&lt; HEAD &gt;<BR>&lt; META NAME="GENERATOR" Content=<BR>"Microsoft Developer Studio" &gt;<BR>&lt; META HTTP-EQUIV="Content-Type"<BR>content="text/html; charset=gb2312" &gt;</P>
<P>&lt; TITLE &gt;&lt; /TITLE &gt;<BR>&lt; /HEAD &gt;</P>
<P>&lt; %<BR>On Error Resume Next<BR>Dim oSQLServer<BR>Set oSQLServer = CreateObject ("SQLOLE.SQLServer")</P>
<P><BR>strServer = "dep"<BR>strLogin = "sa"<BR>strPwd = ""</P>
<P><BR>oSQLServer.Connect strServer,strLogin,strPwd</P>
<P>&nbsp;</P>
<P>% &gt;</P>
<P><BR>&lt; BODY BGCOLOR=#ffffff &gt;<BR>数据库列表<BR>&lt; SELECT NAME="Database" &gt;<BR>&lt; %<BR>For Each SQLDB In oSQLServer.Databases<BR>If Not SQLDB.SystemObject Then<BR>Response.Write "&lt; OPTION VALUE=<BR>""" &amp; SQLDB.Name &amp; """ &gt;" &amp; SQLDB.Name</P>
<P>&amp; "&nbsp; "<BR>End If<BR>Next<BR>Set oSQLServer = Nothing<BR>% &gt;<BR>&lt; /SELECT &gt;<BR>&lt; /BODY &gt;<BR>&lt; /HTML &gt;</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/jackywjj/aggbug/25166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-23 10:14 <a href="http://www.blogjava.net/jackywjj/articles/25166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编码人员和美工的配合问题</title><link>http://www.blogjava.net/jackywjj/articles/25157.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 23 Dec 2005 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/25157.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/25157.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/25157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/25157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/25157.html</trackback:ping><description><![CDATA[<P><BR>公司的项目都是基于B/S结构的，绝大多数操作界面都是通过网页的形式展现在用户面前的，页面的美观就成了非常重要的问题。记得去年的这个时候公司迎来了它历史上的第一个专职美工。同时到来的就是程序员与美工的合作问题。</P>
<P>矛盾篇：</P>
<P>公司以前的系统都是由程序员来编写界面的，美观与否先不必说，单从效率上讲就是一个很大的问题。大部分时间都花在了界面的编写上，严重影响了项目的进展速度。美工到来以后，页面的美观程度和制作速度都有了很大提高，随之而来的程序员与美工的配合问题又成了一个新的问题。其中主要的问题、矛盾有以下几点：</P>
<P>1. 美工何时参与到项目中来</P>
<P>2. 程序员不懂如何将页面弄得美观，美工也不懂如何向页面中添加代码（即使是使用了Velocity）</P>
<P>3. 程序员和美工是两种完全不同的人，他们关心的事情也完全不同，这就导致两种人对页面代码（html）风格的要求大相径庭——程序员要得是简单易懂，美工要得是美观漂亮</P>
<P>4. 程序员要做的是将数据展现在页面上（使用简单的条件、循环语句），美工要做的是将美丽充满整个屏幕（程序员会叫道：天哪！这么复杂，我怎么用if、else、for来实现）</P>
<P>解决篇：</P>
<P>上面的这几点问题和矛盾从关系上来讲是层层递进的，要一个一个依次解决。先来说说美工何时介入到项目中来，在公司做过的这些项目以及我听说过的项目看，大致有以下几种：1）先有美工制作静态页面，完成后程序员直接向页面中添加程序代码；2）程序员随时和美工沟通，向美工描述页面需求，随要随做；3）程序员自己编写测试页面，然后让美工进行美化。</P>
<P>这3种方式可以说是个有利弊。方式1）对程序员来说绝对是个喜讯，它能使程序员最大限度的远离那些烦人的页面编码，提高程序员工作的含金量。同时，一套完整的页面可以展现全部业务的流程，对程序员开发也起到了规范的作用。但这种方式对美工的要求极高，美工要了解项目的需求，而这一般是达不到的。但可以让了解需求的人为其讲解，或是描绘出希望的页面的样式。这样虽然可以弥补美工对业务了解的不足，但也确实花掉了很多时间（而且是花掉了比较重要的人物的时间，因为了解整体业务的一般都是公司的牛人，他们的时间可是一刻千金呀）。方式2）是一个比较折中的方法，这样做无需太多的准备就可开始编码工作，程序员把握页面内容和样式，向美工详细描述，美工再根据描述设计页面，最后返回给程序员添加代码。这个反馈的过程一般比较迅速，效果也不错，可以达到程序员预期的效果，适用于项目时间要求比较紧的情况。该方式的问题在于没有一个形象化的完整的流程可供程序员参考，一切掌握在程序员手中，容易造成对需求的贪污和系统整体风格的不统一。方式3）一般用于对已有项目的美化上，对美工的要求也很高，她们需要具备在html和其他代码混合体的环境下工作的能力。而且修改的效果一般不是很佳，不到万不得已不推荐使用。</P>
<P>问题2.3.4.虽然表现出来的问题各不相同，但解决的方法却很相似。首先，美工要养成一些程序员编码时惯有的习惯，比如：文件命名要有意义、html代码要根据层次进行缩进等。其次，页面代码的一些细节也要注意，比如，使用居中或右对齐标签来取代空格，必须使用空格时也要用“&amp;nbsp;”，不使用&lt;p&gt;标签，尽量使用表格等。再次，如果在条件允许的情况下，美工也可以学习一下夹杂在页面中的各种程序代码，了解其语义和工作原理，这将对与程序员的合作起到很大的帮助的。最后，就是程序员要在向页面文件中添加代码前先对页面代码做一下审核工作，在这里并不是看美工的页面是否美观，而是看在原有页面代码的基础上是否能够使用简单的条件、循环语句来显示数据（比如，页面布局过于复杂，不能通过简单的循环来显示所有数据），否则就需要修改页面代码直到能满足要求为止。</P>
<P>做网站后台的流程一般是这样的：</P>
<P>一、网站规划阶段</P>
<P>　　这个阶段主要是对网站的功能、目标受众、内容、栏目进行规划。这期间会经常性地和有关领导进行沟通。首先，自己一定要对网站的整体规划清清楚楚，然后要吸收别人的建议。吸收别人的建议的过程，可以认认真真地做，也可以走过场，但是有这个过程以后，别人才不会对你的规划说三道四。<BR>　　至于领导的意愿，和你的规划靠得上边的，你一定要让领导明白，他们的设想已经在你的规划中被考虑进去了。<BR>　　项目的大致进度，要在这个阶段结束的时候确定下来。</P>
<P>二、后台模块划分和版面设计</P>
<P>　　这个阶段，程序员要和美工兵分两路分头行动。<BR>　　后台模块划分如果做好了，后面的效率会高一些。这个过程不能省。<BR>　　版面设计，美工既要考虑网站整体规划，又要考虑大家的建议，尤其是不能忽视领导们的观点（虽然大多数情况下领导的美术细胞少得可怜）。在这个大前提下，再兼顾美观、合理。一个好的美工，不仅仅能做出漂亮的页面，还要能迎合一下客户或者公司领导的意愿，而且能和程序员进行沟通。<BR>　　在这个阶段，程序员和项目经理（项目负责人）要拿出一个可操作的模块划分方案，而美工要确定网站的版面框架、美术风格，做出网站首页和二级页面。<BR>　　实际上，在第一个阶段（网站规划阶段），美工就应该开始思考网站的风格了。在第二个阶段，则需要把比较抽象的初级设想变成具体的页面。基本上，首页定了，整个网站的页面就定了一大半了。<BR>　　在这个阶段结束的时候，要将项目的进度计划进一步具体化。</P>
<P>三、数据库设计</P>
<P>　　这项工作很重要。但是程序员应该知道怎么去做。而且数据库设计是和一个人的理论水平、实际经验息息相关的，不是几句话能说明白的。大的、复杂的站点，数据库规划可能要用一周左右的时间，小的、简单的站点，数据库设计也需要2到3天。<BR>　　在这个阶段，美工最好别闲着，继续完成页面设计。要知道下一个阶段，程序员可就要用到美工的页面了。最好别出现这样的情况：程序员要用到某个页面，而美工还没有把那个页面确定下来。</P>
<P>四、后台程序编码</P>
<P>　　这个阶段，程序员要紧张工作，会比较辛苦的。<BR>　　程序员需要遵守的三个原则：<BR>　　1、团队合作；<BR>　　2、保证进度；<BR>　　3、保证质量。<BR>　　美工这个时候要辅助程序员做页面。这个阶段美工可能比较闲，但是一定要称职。</P>
<P>　　项目经理该和客户或者领导沟通的时候，一定要沟通。</P>
<P>五、除错、改进、页面美化</P>
<P>　　这个阶段，不多说了。项目经理和客户、领导的沟通，仍然是很重要的。</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/jackywjj/aggbug/25157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-23 09:44 <a href="http://www.blogjava.net/jackywjj/articles/25157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>客户需要的26个待遇</title><link>http://www.blogjava.net/jackywjj/articles/25155.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 23 Dec 2005 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/25155.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/25155.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/25155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/25155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/25155.html</trackback:ping><description><![CDATA[1、只要告诉我事情的重点就可以了：我不要又臭又长的谈话，等你对我稍有了解以后，请有话直说。<BR>2、告诉我实情，不要使用“老实说“这个字眼，它会让我紧张：如果你说的话让我觉得怀疑或者根本就知道那是假的，那么你就出局了。<BR>3、我要一位有道德的推销人员：因少数的几个没有道德良心的害群之马、而使推销人员背上莫须有的罪名。能够为你的良心做证的，是你的行为，而非你所说的话（把道德挂在嘴上的人，通常都是没有道德的人）。<BR>4、给我一个理由，告诉我为什这项商品（这个项目）再适合不过了：我必须先清楚它给我的好处。<BR>5、证明给我看。<BR>6、让我知道我并不孤单，告诉我一个与我处境类似者的成功案例。<BR>7、给我看一封满意的客户的来信。<BR>8、我会得到什么样的售后服务，请说给我听，做给我看。<BR>9、向我证明价格是合理的或利润是可观的（我捡了便宜）。<BR>10、告诉我最好的购买方式。<BR>11、给我机会做最后决定，提供几个选择：假如这是你的钱，你会怎么做。<BR>12、强化的我决定：我会担心自己做了错误的决定，我能得到什么好处，让我觉得买得很有信心，以这些事实帮助我，坚定我的决定。<BR>13、不要和我争辩：即使我错了，我也不需要一个自作聪明的推销人员来告诉我（或试着证明）；他或许是辩赢了，但是他却输掉了这笔交易。<BR>14、别把我搞糊涂了，说得感愈复杂，我愈不可能购买。<BR>15、不要告诉我负面的事：我希望每件事都很好，不要说别人（尤其是竞争对手），你自己、你的公司或者我的坏话。<BR>16、不要用瞧不起我的语气和我谈话：推销人员自以为什么都懂，把我当成笨蛋；不要告诉我你以为我想听的话，如果嫌我太笨了，我想我还是与别人合作好了。<BR>17、别说我购买的东西或我做的事情错了。我喜欢那种得意洋洋，深感自己很聪明的感觉；要是我错了，机灵点儿，让我知道其他人也犯了员样的错误。<BR>18、我在说话的时候，注意听：我试着告诉你我心中想做的生意，而你却忙着把你的生意推销给我。<BR>19、让我觉得自己很特别：如果我要花钱，我要花得开心，这全要仰仗你的言行举止。<BR>20、让我笑：让我有好心情，我才能购买；让我笑意味着我对你的同意，而你需要我的同意才能完成推销。<BR>21、对我的职业表示一点兴趣；或话它对你一点儿也不重要，但它却是我的全部。<BR>22、说话要真诚：假如你说谎，只是为了我的钱我看得出来。<BR>23、当你说你会做到什么时，要做到，别让我失望。<BR>24、帮助我决定，不要出卖我：我讨厌被出卖的感觉。<BR>25、当我无意购买时，不要用一堆老掉牙的推销技俩向我施压，强迫我购买：不要用推销员的口气说话，要象个朋友--某个想帮我忙的人。<BR>26、我更希望你能在其它生意上帮助我。这更会令你成为我的朋友，但这需要你有足够的知识水平<BR><img src ="http://www.blogjava.net/jackywjj/aggbug/25155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-23 09:42 <a href="http://www.blogjava.net/jackywjj/articles/25155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>英文技术词汇翻译</title><link>http://www.blogjava.net/jackywjj/articles/25153.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 23 Dec 2005 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/25153.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/25153.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/25153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/25153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/25153.html</trackback:ping><description><![CDATA[<P>A2A integration A2A整合 A2A整合、A2A集成<BR>(application-to-application integration) <BR>abstract 抽象的 抽象的<BR>abstract base class (ABC) 抽象基础类别 抽象基类<BR>abstract class 抽象类别 抽象类<BR>abstraction 抽象体、抽象物、抽象性 抽象、抽象物、抽象性<BR>access 存取、取用 存取、访问<BR>access level 存取级别 访问级别<BR>access function 存取函式 访问函数<BR>account 账户 账户<BR>action 动作 动作 <BR>activate 活化 激活<BR>active 作用中的 活动的<BR>actual parameter 实参<BR>adapter 配接器 适配器<BR>add-in 增益功能 插件<BR>address 位址 地址<BR>address space 位址空间 地址空间 <BR>address-of operator 取址运算子 取地址操作符<BR>ADL (argument-dependent lookup)<BR>ADO(ActiveX Data Object) ActiveX资料物件 ActiveX数据对象<BR>advanced 进阶的 高级的<BR>aggregation 聚合 聚合、聚集<BR>algorithm 演算法 算法<BR>alias 别名<BR>align 对齐、调整 排列、对齐<BR>allocate 配置 分配、配置<BR>allocator (空间)配置器 分配器、配置器<BR>angle bracket 角括弧 尖括号<BR>annotation 附注 注解、评注 <BR>API (Application Programming Interface) 应用程式编程介面 应用(程序)编程接口 <BR>app domain (application domain) 应用域 应用域<BR>application 应用程式 应用、应用程序<BR>application framework 应用程式框架、应用框架 应用程序框架<BR>appearance 外观 外观<BR>append 附加 附加<BR>architecture 架构、系统架构 架构、体系结构<BR>archive file 归档文件、存档文件<BR>argument 引数(传给函式的值)。参见parameter 参数、实参、自变量<BR>array 阵列 数组<BR>arrow operator arrow(箭头)运算子 箭头操作符<BR>ASP (Active Server Page) 活动伺服器页面 活动服务器页面<BR>ASP.NET worker process ASP.NET工作者行程 ASP.NET工作者进程 <BR>assembly 配件 装配件、配件<BR>assembly language 组合语言 汇编语言<BR>assembly manifest 组件(资讯)清单 装配件清单<BR>assert(ion) 断言<BR>assign 指派、指定、设值、赋值 赋值<BR>assignment 指派、指定 赋值、分配<BR>assignment operator 指派(赋值)运算子 = 赋值操作符<BR>associated 相应的、相关的 相关的、相关联的<BR>associative container 关联式容器(对应sequential container) 关联式容器<BR>asynchronous 非同步的 异步的<BR>atomic 不可分割的 原子的<BR>atomic operation 原子操作<BR>attribute 属性 特性、属性<BR>authentication service 验证服务 验证服务<BR>authorization 授权 授权<BR>audio 音讯 音频<BR>A.I. 人工智慧 人工智能<BR>---------------------------------------------------------------------------------------------------------------------<BR>B2B integration B2B整合 B2B整合、B2B集成<BR>(business-to-business integration) <BR>background 背景 背景、后台(进程)<BR>backward compatible 回溯相容 向后兼容、向下兼容<BR>backup 备份 <BR>backup device 备份设备 <BR>backup file 备份文件 <BR>bandwidth 频宽 带宽<BR>base class 基础类别 基类<BR>base type 基础型别 (等同于base class) 基类型<BR>batch 批次(意思是整批作业) 批处理<BR>BCL (base class library) 基底类别库 基类库 <BR>binary 二进位 二进制 <BR>binary search 二分搜寻法 二分查找<BR>binary tree 二元树 二叉树<BR>binary function 二元函式 双参函数<BR>binary large object 二进制大对象<BR>binary operator 二元运算子 二元操作符<BR>binding 系结 绑定<BR>bit 位元 位<BR>bitmap 点阵图 位图<BR>bitwise 以 bit 为单元逐一… 按位...<BR>bitwise copy 以 bit 为单元进行复制；位元逐一复制 按位拷贝<BR>bitwise operation 按位运算 <BR>block 区块 块、区块、语句块<BR>bookkeeping 簿记 簿记<BR>boolean 布林值(真假值，true或false) 布尔值<BR>border 边框、框线 边框<BR>bounds checking 边界检查<BR>boxing 装箱、装箱转换 <BR>brace (curly brace) 大括弧、大括号 大括号、花括号<BR>bracket (square brakcet) 中括弧、中括号 中括号、方括号<BR>breakpoint 中断点 断点<BR>browser applications 浏览器应用程式 浏览器应用(程序)<BR>browser-accessible application 可经由浏览器存取的应用程式 可经由浏览器访问的应用程序<BR>build 建置 编连(专指编译和连接)<BR>built-in 内建 内建、内置<BR>bus 汇流排 总线<BR>business 商务,业务 业务、商务(看场合)<BR>business Logic 商务逻辑 业务逻辑<BR>business rules 业务规则 <BR>buttons 按钮 按钮<BR>bug 臭虫 臭虫<BR>by/through 透过 通过<BR>byte 位元组(由8 bits组成) 字节<BR>---------------------------------------------------------------------------------------------------------------------<BR>cache 快取 高速缓存<BR>calendar 行事历 日历<BR>call 呼叫、叫用 调用<BR>callback 回呼 回调<BR>call-level interface (CLI) 调用级接口(CLI) <BR>call operator call(函式呼叫)运算子() 调用操作符<BR>candidate key 候选键 (for database)<BR>cascading delete 级联删除 (for database)<BR>cascading update 级联更新 (for database)<BR>casting 转型 转型、造型转换<BR>catalog 目录 目录<BR>chain 串链(例如chain of function calls) 链<BR>character 字元 字符<BR>character format 字符格式 <BR>character set 字符集 <BR>CHECK constraints CHECK约束 (for database) <BR>checkpoint 检查点 (for database)<BR>check box 核取方块 (i.e. check button) 复选框<BR>check button 方钮 (i.e. check box) 复选按钮<BR>checkpoint 检测点 检测点<BR>child class 子类别(或称为derived class, subtype) 子类<BR>CIL (common intermediate language) 通用中继语言 通用中间语言、通用中介语言<BR>class 类别 类<BR>class declaration 类别宣告、类别宣告式 类声明<BR>class definition 类别定义、类别定义式 类定义<BR>class derivation list 类别衍化列 类继承列表<BR>class factory 类厂<BR>class hierarchy 类别继承体系, 类别阶层 类层次结构<BR>class library 类别程式库、类别库 类库<BR>class loader 类别载入器 类装载器<BR>class template 类别模板、类别范本 类模板<BR>class template partial specializations 类别模板偏特化 类模板部分特化<BR>class template specializations 类别模板特化 类模板特化<BR>classification 分类<BR>clause 子句<BR>client application 客户端应用程序<BR>client cursor 客户端游标 (for database)<BR>code page 代码页 <BR>cleanup 清理、善后 清理、清除<BR>CLI (Common Language Infrastructure) 通用语言基础设施 通用语言基础设施<BR>client 客端、客户端、客户 客户、客户端<BR>client area 工作区 客户区<BR>client-server 主从架构 客户机/服务器、客户端/服务器<BR>clipboard 剪贴簿 剪贴板<BR>clone 复制 克隆 <BR>CLS (common language specification) 通用语言规格 通用语言规范<BR>code access security 程式码存取安全性 代码访问安全<BR>COFF (Common Object File Format) 通用物件档案格式 通用对象文件格式 <BR>collection 群集 集合<BR>COM (Component Object Model) 元件物件模型、组件物件模型 组件对象模型<BR>combo box 复合方块、复合框 组合框<BR>command line 命令列 命令行<BR>comment 注解 注释<BR>commit 认可 提交 (for database)<BR>communication 通讯 通讯<BR>compatible 相容 兼容<BR>compile time 编译期 编译期、编译时<BR>compiler 编译器 编译器<BR>component 组件 组件<BR>composite index 复合索引、组合索引 (for database)<BR>composite key 复合键、组合键 (for database) <BR>composition 复合、合成、组合 复合、组合<BR>concept 概念 概念<BR>concrete 具象的 具体的<BR>concrete class 具象类别 具体类<BR>concurrency 并行 并发、并发机制 <BR>constraint 约束 (for database)<BR>configuration 组态 配置、组态<BR>connection 连接，连线(网络,资料库) 连接 (for database)<BR>connection pooling 连接共用 连接池<BR>console 主控台 控制台<BR>constant 常数(相对于variable) 常量<BR>construct 构件 构件、成分、概念、构造（for language）<BR>constructor (ctor) 建构式 构造函数、构造器<BR>container 容器 容器<BR>containment 内含 包容<BR>context 背景关系、周遭环境、上下脉络 环境、上下文<BR>control 控制元件、控件 控件<BR>cookie (不译)<BR>copy 复制、拷贝 拷贝<BR>CORBA 通用物件请求中介架构 通用对象请求中介架构<BR>(Common Object Request Broker Architecture) <BR>cover 涵盖 覆盖、涵盖<BR>create/creation 产生、生成 创建、生成<BR>crosstab query 交叉表查询 (for database)<BR>CRTP (curiously recurring template pattern)<BR>CTS (common type system) 通用型别系统 通用类型系统<BR>cube 多维数据集 (for database)<BR>cursor 游标 光标<BR>cursor 游标 游标 (for database) <BR>custom 订制、自定 定制、自定义<BR>---------------------------------------------------------------------------------------------------------------------<BR>data 资料 数据<BR>data connection 数据连接 (for database)<BR>Data Control Language (DCL) 数据控制语言(DCL) (for database)<BR>Data Definition Language (DDL) 数据定义语言(DDL) (for database)<BR>data dictionary 数据字典 (for database)<BR>data dictionary view 数据字典视图 (for database)<BR>data file 数据文件 (for database)<BR>data integrity 数据完整性 (for database)<BR>data manipulation language (DML) 数据操作语言(DML) (for database)<BR>data mart 数据集市 (for database)<BR>data pump 数据抽取 (for database)<BR>data scrubbing 数据清理 (for database)<BR>data source 数据源 (for database)<BR>Data source name (DSN) 数据源名称(DSN) (for database)<BR>data warehouse 数据仓库 (for database)<BR>dataset 数据集 (for database) <BR>database 资料库 数据库 (for database)<BR>database catalog 数据库目录 (for database)<BR>database diagram 数据关系图 (for database)<BR>database file 数据库文件 (for database)<BR>database object 数据库对象 (for database)<BR>database owner 数据库所有者 (for database)<BR>database project 数据库工程 (for database)<BR>database role 数据库角色 (for database)<BR>database schema 数据库模式、数据库架构 (for database)<BR>database script 数据库脚本 (for database)<BR>data-bound 资料系结 数据绑定 (for database)<BR>data-aware control 资料感知控制项 数据感知控件 (for database)<BR>data member 资料成员、成员变数 数据成员、成员变量<BR>dataset 资料集 数据集 (for database)<BR>data source 资料来源 数据源 (for database)<BR>data structure 资料结构 数据结构<BR>data table 资料表 数据表 (for database)<BR>datagram 资料元 数据报文<BR>DBMS (database management system) 资料库管理系统 数据库管理系统 (for database)<BR>DCOM (distributed COM) 分散式COM 分布式COM<BR>dead lock 死结 死锁 (for database)<BR>deallocate 归还（与allocate对应） 归还<BR>debug 除错 调试<BR>debugger 除错器 调试器<BR>decay 退化<BR>decision support 决策支持 <BR>declaration 宣告、宣告式 声明<BR>declarative referential integrity (DRI) 声明引用完整性(DRI) (for database)<BR>deduction 推导(例：template argument deduction) 推导<BR>DEFAULT constraint 默认约束 (for database) <BR>default database 默认数据库 (for database)<BR>default instance 默认实例 (for database)<BR>default result set 默认结果集 (for database)<BR>default 预设 缺省、默认<BR>defer 延缓 推迟<BR>definition 定义、定义区、定义式 定义<BR>delegate 委派、委托、委任 委托<BR>delegation 委派、委托、委任 委托<BR>dependent name <BR>deploy 部署 部署 <BR>dereference 提领(取出指标所指物体的内容) 解引用<BR>dereference operator dereference(提领)运算子 解引用操作符<BR>derived class 衍生类别 派生类<BR>design by contract 契约式设计 契约式设计<BR>design pattern 设计范式、设计样式 设计模式<BR>destroy 摧毁、销毁 销毁<BR>destructor(dtor) 解构式 析构函数、析构器<BR>device 装置、设备 设备<BR>DHTML (dynamic HyperText Markup Language) 动态超文字标记语言 动态超文本标记语言<BR>dialog 对话窗、对话盒 对话框<BR>digest 摘要 摘要<BR>digital 数位的 数字的<BR>DIME (Direct Internet Message Encapsulation) 直接网际网路讯息封装 直接Internet消息封装<BR>directive 指令(例：using directive) (编译)指示符<BR>directory 目录 目录<BR>dirty pages 脏页 (for database)<BR>dirty read 脏读 (for database)<BR>disassembler 反组译工具、反组译器 反汇编器<BR>DISCO (Discovery of Web Services) Web Services的探索 Web Services的查找<BR>disk 碟 盘<BR>dispatch 分派 调度、分派、派发（我喜欢“调度”:)）<BR>DISPID (Dispatch Identifier) 分派识别码 分派标识符<BR>distributed computing 分布式计算 (分布式电算) 分布式计算<BR>distributed query 分布式查询 (for database) <BR>DNA (Distributed interNet Application) 分散式网际应用程式 分布式网间应用程序<BR>document 文件 文档<BR>DOM (Document Object Model) 文件物件模型 文档对象模型<BR>dot operator dot(句点)运算子 . (圆)点操作符<BR>driver 驱动程式 驱动(程序)<BR>DTD (document type definition) 文件型别定义 文档类型定义<BR>double-byte character set (DBCS) 双字节字符集(DBCS)<BR>dump 转储<BR>dump file 转储文件<BR>dynamic cursor 动态游标 (for database)<BR>dynamic filter 动态筛选 (for database)<BR>dynamic locking 动态锁定 (for database)<BR>dynamic recovery 动态恢复 (for database)<BR>dynamic snapshot 动态快照 (for database)<BR>dynamic SQL statements 动态SQL语句 (for database)<BR>dynamic assembly 动态组件 动态装配件、动态配件<BR>dynamic binding 动态系结 动态绑定<BR>---------------------------------------------------------------------------------------------------------------------<BR>EAI (enterprise application integration) 企业应用程式整合 企业应用程序集成(整合)<BR>EBCO (empty base class optimization) 空基类优化（机制）<BR>e-business 电子商务 电子商务<BR>EDI (Dlectronic Data Interchange) 电子资料交换 电子数据交换<BR>efficiency 效率 效率<BR>efficient 高效 高效<BR>end-to-end authentication 端对端身份验证 <BR>end user 终端用户 最终用户<BR>engine 引擎 引擎<BR>entity 物体 实体<BR>encapsulation 封装 封装<BR>enclosing class 外围类别(与巢状类别 nested class有关) 外围类<BR>enum (enumeration) 列举(一种C++资料型别) 枚举<BR>enumerators 列举元(enum型别中的成员) 枚举成员、枚举器<BR>equal 相等 相等<BR>equality 相等性 相等性<BR>equality operator equality(等号)运算子 == 等号操作符<BR>error log 错误日志 (for database)<BR>escape code 转义码 转义码<BR>escape character 转义符、转义字符<BR>exclusive lock 排它锁 (for database)<BR>explicit transaction 显式事务 (for database)<BR>evaluate 评估、求值、核定 评估<BR>event 事件 事件<BR>event driven 事件驱动的 事件驱动的<BR>event handler 事件处理器<BR>evidence 证据<BR>exception 异常情况 异常<BR>exception declaration 异常宣告 异常声明<BR>exception handling 异常处理、异常处理机制 异常处理、异常处理机制<BR>exception-safe 异常安全的<BR>exception specification 异常规格 异常规范<BR>exit 退离(指离开函式时的那一个执行点) 退出<BR>explicit 明白的、明显的、显式 显式<BR>explicit specialization 显式特化<BR>export 汇出 导出<BR>expression 运算式、算式 表达式<BR>---------------------------------------------------------------------------------------------------------------------<BR>facility 设施、设备 设施、设备<BR>fat client 胖客户端 <BR>feature 特性 特性、特征<BR>fetch 提取<BR>field 栏位 字段(java)<BR>field 资料栏位、栏位 字段 (for database)<BR>field length 字段长度 (for database)<BR>file 档案 文件<BR>filter 筛选 (for database)<BR>finalization 终结<BR>firewall 防火墙 防火墙<BR>finalizer 终结器<BR>firmware 韧体 固件<BR>flag 旗标 标记<BR>flash memory 快闪记忆体 闪存<BR>flush 清理、扫清 刷新<BR>font 字型 字体<BR>foreign key (FK) 外键(FK) (for database)<BR>form 表单(programming用语) 窗体<BR>formal parameter 形式参数 形参<BR>forward declaration 前置宣告 前置声明<BR>forward-only 唯向前的 只向前的<BR>forward-only cursor 只向前游标 (for database)<BR>fragmentation 碎片 (for database)<BR>framework 框架 框架<BR>full specialization 全特化(ref. partial specialization) 完全特化<BR>function 函式、函数 函数<BR>function call operator (即operator ()) 函式呼叫运算子 函数调用操作符<BR>function object 函式物件 函数对象<BR>function overloaded resolution 函式多载决议程序 函数重载解决(方案)<BR>functionality 功能、机能 功能<BR>function template 函式模板、函式范本 函数模板<BR>functor 仿函式 仿函数<BR>---------------------------------------------------------------------------------------------------------------------<BR>GAC (global assembly cache) 全域组件快取 全局装配件缓存、全局配件缓存<BR>GC (Garbage collection) 记忆体回收(机制) 垃圾回收(机制)、垃圾收集(机制)<BR>game 游戏 游戏<BR>generate 生成<BR>generic 泛型、一般化的 泛化的、一般化的、通用的<BR>generic algorithm 泛型演算法 通用算法<BR>genericity 泛型 泛型 <BR>getter (相对于 setter) 取值函式 取值函数<BR>global 全域的(对应于local) 全局的<BR>global object 全域物件 全局对象<BR>global scope resolution operator 全域生存空间(范围决议)运算子:: 全局范围解析操作符<BR>grant 授权 (for database)<BR>granularity 粒度<BR>group 群组 组、群<BR>group box 群组方块 分组框<BR>GUI 图形介面 图形界面<BR>GUID (Globally Unique Identifier) 全域唯一识别码 全球唯一标识符<BR>---------------------------------------------------------------------------------------------------------------------<BR>hand shaking 握手协商 握手<BR>handle 识别码、识别号、号码牌、权柄 句柄<BR>handler 处理常式 处理器<BR>hard-coded 编死的 硬编码的<BR>hard-copy 硬拷图 截屏图<BR>hard disk 硬碟 硬盘<BR>hardware 硬体 硬件<BR>hash table 杂凑表 散列表、哈希表<BR>header file 表头档、标头档 头文件<BR>heap 堆积 堆<BR>help file 说明档 帮助文件<BR>hierarchy 阶层体系 层次结构、继承体系<BR>hierarchical data 阶层式资料 阶层式数据、层次式数据<BR>hook 挂钩 钩子<BR>Host (application) 主应用程式 宿主(应用程序)<BR>hot key 热键 热键<BR>hyperlink 超链结 超链接<BR>HTML (HyperText Markup Language) 超文字标记语言 超文本标记语言 <BR>HTTP pipeline HTTP管线 HTTP管道 <BR>HTTP (HyperText Transfer Protocol) 超文字传输协定 超文本传输协议<BR>---------------------------------------------------------------------------------------------------------------------<BR>icon 图示、图标 图标<BR>IDE (Integrated Development Environment) 整合开发环境 集成开发环境<BR>IDL (Interface Definition Language) 介面定义语言 接口定义语言<BR>identifier 识别字、识别符号 标识符<BR>idle time 空闲时间<BR>if and only if 若且唯若 当且仅当<BR>IL (Intermediate Language) 中继语言 中间语言、中介语言<BR>image 影像 图象<BR>IME 输入法 输入法<BR>immediate base 直接的(紧临的)上层base class。 直接基类<BR>immediate derived 直接的(紧临的)下层derived class。 直接派生类<BR>immediate updating 即时更新 (for database)<BR>implicit transaction 隐式事务 (for database)<BR>incremental update 增量更新 (for database)<BR>index 索引 (for database)<BR>implement 实作、实现 实现<BR>implementation 实作品、实作体、实作码、实件 实现、实现品<BR>implicit 隐喻的、暗自的、隐式 隐式<BR>import 汇入 导入<BR>increment operator 累加运算子++ 增加操作符<BR>infinite loop 无穷回圈 无限循环<BR>infinite recursive 无穷递回 无限递归<BR>information 资讯 信息<BR>infrastructure 基础设施<BR>inheritance 继承、继承机制 继承、继承机制<BR>inline 行内 内联<BR>inline expansion 行内展开 内联展开<BR>initialization 初始化(动作) 初始化<BR>initialization list 初值列 初始化列表、初始值列表<BR>initialize 初始化 初始化<BR>inner join 内联接 (for database)<BR>in-place active 就地启动 现场激活<BR>instance 实体 实例<BR>instantiated 具现化、实体化(常应用于template) 实例化<BR>instantiation 具现体、具现化实体(常应用于template) 实例<BR>integrate 整合 集成、整合<BR>integrity 完整性 完整性、一致性<BR>integrity constraint 完整性约束 (for database)<BR>interprocess communication (IPC) 进程间通讯(IPC)<BR>interacts 交谈、互动 交互<BR>interface 介面 接口<BR>for GUI 介面 界面<BR>interoperability 互通性 互操作性、互操作能力<BR>interpreter 直译器 解释器<BR>introspection 自省<BR>invariants 恒常性 不变性<BR>invoke 唤起 调用<BR>isolation level 隔离级别 (for database)<BR>iterate 迭代 迭代<BR>iterative 反复的、迭代的 反复的、迭代的<BR>iterator 迭代器(一种泛型指标) 迭代器<BR>iteration 迭代(回圈每次轮回称为一个iteration) 迭代<BR>item 项目、条款 项、条款、项目<BR>---------------------------------------------------------------------------------------------------------------------<BR>JIT compilation JIT编译 JIT编译、即时编译<BR>---------------------------------------------------------------------------------------------------------------------<BR>key 键 (for database) <BR>key column 键列 (for database) <BR>---------------------------------------------------------------------------------------------------------------------<BR>laser 雷射 激光<BR>late binding 晚期系结 迟绑定<BR>left outer join 左向外联接 (for database)<BR>level 阶 阶、层<BR>例 high level 高阶 高阶、高层<BR>library 程式库、函式库 库<BR>lifetime 生命期、寿命 生命期、寿命<BR>link 联结、连结 连接、链接<BR>linkage 联结、连结 连接、链接<BR>linker 联结器、连结器 连接器、链接器<BR>literal constant 字面常数(例 3.14 或 "hi" 这等常数值) 字面常数<BR>list 串列(linked-list) 列表、表、链表<BR>list box 列表方块、列表框 列表框<BR>livelock 活锁 (for database)</P>
<P>load 载入 装载、加载<BR>load balancing 负载平衡 负载平衡<BR>loader 载入器 装载器、载入器<BR>local 区域的(对应于global) 局部的<BR>local object 区域物件 局部对象<BR>lock 机锁 锁<BR>log 记录档 日志<BR>login 登入 登录<BR>login security mode 登录安全模式 (for database)<BR>lookup table 查找表 (for database)<BR>loop 回圈 循环<BR>loose coupling 松散耦合 松散耦合<BR>lvalue 左值 左值<BR>---------------------------------------------------------------------------------------------------------------------<BR>machine code 机器码、机器代码<BR>macro 巨集 宏<BR>maintain 维护 维护<BR>managed code 受控代码、托管代码<BR>Managed Extensions 受控扩充件、托管扩展<BR>managed object 受控对象、托管对象<BR>mangled name <BR>manifest 清单<BR>manipulator 操纵器(iostream预先定义的一种东西) 操纵器<BR>many-to-many relationship 多对多关系 (for database)<BR>many-to-one relationship 多对一关系 (for database)<BR>marshal 编列 列集<BR>member 成员 成员<BR>member access operator 成员取用运算子(有dot和arrow两种) 成员存取操作符<BR>member function 成员函式 成员函数<BR>member initialization list 成员初值列 成员初始值列表<BR>memberwise 以member为单元…、members 逐一… 以成员为单位<BR>memberwise copy 以members为单元逐一复制<BR>memory 记忆体 内存<BR>memory leak 记忆体遗漏、记忆体漏失 内存泄漏<BR>menu 表单、选单 菜单<BR>message 讯息 消息<BR>message based 以讯息为基础的 基于消息的<BR>message loop 讯息回圈 消息环<BR>message queuing 讯息佇列 消息队列<BR>metadata 中继资料 元数据<BR>metaprogramming 元编程<BR>method 方法、行为、函式 方法<BR>micro 微 微<BR>middleware 中介层 中间件<BR>middle tier 中介层 中间层<BR>modeling 模塑 建模<BR>modeling language 塑模语言，建模语言 建模语言<BR>modifier 修饰词 修饰字、修饰符<BR>modem 数据机 调制解调器<BR>module 模组 模块<BR>most derived class 最末层衍生类别 最底层的派生类<BR>mouse 滑鼠 鼠标<BR>mutable 可变的 可变的<BR>mutex 互斥元、互斥体<BR>multidimensional OLAP (MOLAP) 多维OLAP(MOLAP) (for database)<BR>multithreaded server application 多线程服务器应用程序 <BR>multiuser 多用户<BR>multi-tasking 多工 多任务<BR>multi-thread 多执行绪 多线程<BR>multicast delegate 多点传送委托 组播委托、多点委托<BR>---------------------------------------------------------------------------------------------------------------------<BR>named parameter 具名参数、指名参数 命名参数<BR>named pipe 具名管道 命名管道<BR>namespace 命名空间 名字空间、命名空间<BR>native 原生的 原生的、本地的<BR>native code 机器码 本地码、本机码<BR>Native Image Generator (NGEN) 原生映像产生器 本地映像生成器<BR>nested class 巢状类别 嵌套类<BR>nested query 嵌套查询 (for database)<BR>nested table 嵌套表 (for database)<BR>network 网路 网络<BR>network card 网路卡 网卡<BR>nondependent name <BR>---------------------------------------------------------------------------------------------------------------------<BR>object 物件 对象<BR>object based 以物件为基础的 基于对象的<BR>object file 目的档 目标文件<BR>object model 物件模型 对象模型<BR>object oriented 物件导向的 面向对象的<BR>object pooling 物件共用 对象池化<BR>ODBC data source ODBC数据源 (for database)<BR>ODBC driver ODBC驱动程序 (for database)<BR>ODR (one-definition rule)<BR>OLE Automation objects OLE自动化对象 (for database)<BR>OLE Automation server OLE自动化服务器 (for database)<BR>OLE DB consumer OLE DB使用者 (for database)<BR>OLE DB for OLAP 用于OLAP的OLE DB (for database)<BR>OLE DB provider OLE DB提供者 (for database)<BR>one-to-many relationship 一对多关系 (for database)<BR>one-to-one relationship 一对一关系 (for database)<BR>online analytical processing (OLAP) 联机分析处理(OLAP) (for database)<BR>online redo log 联机重做日志 (for database)<BR>online transaction processing (OLTP) 联机事务处理(OLTP) (for database)<BR>Open Data Services (ODS) 开放式数据服务(ODS) (for database)<BR>Open Database Connectivity (ODBC) 开放式数据库连接(ODBC) (for database)<BR>operand 运算元 操作数<BR>operating system (OS) 作业系统 操作系统<BR>operation 操作、操作行为 操作<BR>operator 运算子 操作符、运算符<BR>option 选项，可选方案 选项<BR>optimizer 优化器<BR>outer join 外联接 (for database)<BR>overflow 上限溢位(相对于underflow) 溢出(underflow:下溢)<BR>overhead 额外负担、额外开销 额外开销<BR>overload 多载化、多载化、重载 重载<BR>overload resolution 重载决议<BR>overloaded function 多载化函式 重载的函数<BR>overloaded operator 多载化运算子 被重载的操作符<BR>override 改写、覆写 覆写、重载、重新定义<BR>---------------------------------------------------------------------------------------------------------------------<BR>package 套件 包<BR>packaging 封装 打包<BR>palette 调色盘、组件盘、工具箱 调色板<BR>parallel 平行 并行<BR>parameter 参数(函式参数列上的变数) 参数、形式参数、形参<BR>parameter list 参数列 参数列表<BR>parameterize 参数化 参数化<BR>parent class 父类别(或称base class) 父类<BR>parentheses 小括弧、小括号 圆括弧、圆括号<BR>parse 解析 解析<BR>parser 解析器 解析器<BR>part 零件 零件、部件<BR>partial specialization 偏特化 局部特化<BR>pass by address 传址(函式引数的传递方式)(非正式用语) 传地址<BR>pass by reference 传址(函式引数的一种传递方式) 传地址、按引用传递<BR>pass by value 传值(函式引数的一种传递方式) 按值传递<BR>pattern 范式、样式 模式<BR>PDA (personal digital assistant) 个人数位小帮手 个人数字助理<BR>PE (Portable Executable) file 可移植可执行文件 可移植可执行文件<BR>performance 效率、性能兼而有之 性能<BR>persistence 永续性 持久性<BR>PInvoke (platform invoke service) 平台叫用服务 平台调用服务 <BR>pixel 图素、像素 像素<BR>placement delete (for C++)<BR>placement new (for C++)<BR>placeholder 占位符<BR>platform 平台 平台<BR>POD (plain old data (type))<BR>POI (point of instantiation) 具现点 <BR>pointer 指标 指针<BR>poll 轮询 轮询<BR>pooling 池化<BR>polymorphism 多型 多态<BR>pop up 冒起式、弹出式 弹出式<BR>port 埠 端口<BR>postfix 后置式、后序式 后缀<BR>precedence 优先序(通常用于运算子的优先执行次序) 优先级<BR>prefix 前置式、前序式 前缀<BR>preprocessor 前处理器 预处理器<BR>primary key (PK) 主键(PK) (for database)<BR>primary table 主表 (for database)<BR>primary template 原始模板<BR>primitive type 基本型别(不同于base class) 原始类型<BR>print 列印 打印<BR>printer 印表机 打印机<BR>procedure 程序 过程<BR>procedural 程序性的、程序式的 过程式的、过程化的<BR>process 行程 进程<BR>profile 评测 评测<BR>profiler 效能(效率)评测器 效能(性能)评测器<BR>program 程式 程序<BR>programmer 程式员 程序员<BR>programming 编程、程式设计、程式化 编程、程序设计<BR>progress bar 进度指示器 进度指示器<BR>project 专案 项目、工程<BR>property 属性<BR>protocol 协定 协议<BR>pseudo code 假码、虚拟码、伪码 伪码<BR>---------------------------------------------------------------------------------------------------------------------<BR>qualified 经过资格修饰(例如加上scope运算子) 经过限定的、经过修饰的<BR>qualified name<BR>qualifier 资格修饰词、饰词 修饰符<BR>quality 品质 质量<BR>queue 伫列 队列<BR>---------------------------------------------------------------------------------------------------------------------<BR>race condition 竞态条件 竞争条件（多线程环境常用语）<BR>radian 径度 弧度<BR>radio button 圆钮 单选按钮<BR>raise 引发(常用来表示发出一个exception) 引发、引起<BR>random number 随机数、乱数 随机数<BR>range 范围、区间(用于STL时) 范围、区间<BR>rank 等级、分等 等级<BR>raw 生鲜的、未经处理的 未经处理的<BR>readOnly 唯读 只读<BR>record 记录 记录 (for database)<BR>recordset 记录集 记录集 (for database)<BR>recursive 递回 递归<BR>re-direction 重导向 重定向<BR>refactoring 重构、重整 重构<BR>refer 取用 引用、参考<BR>reference (C++中类似指标的东西，相当于 "化身") 引用、参考<BR>reference counting 引用计数<BR>referential integrity (RI) 引用完整性(RI) (for database)<BR>register 暂存器 寄存器<BR>reflection 反射 反射<BR>refresh data 刷新数据 (for database)<BR>regular expression 规则运算式 正则表达式<BR>relational database 关联式资料库 关系数据库<BR>remote 远端 远程<BR>remote request 远端要求、远端请求 远程请求<BR>represent 表述，表现 表述，表现<BR>resolve 决议 解析、决议 <BR>resolution 决议程序、决议过程 解析过程<BR>result set 结果集 (for database)<BR>retrieve data 撷取资料、取回资料 检索数据 <BR>return 传回、回返 返回<BR>return type 回返型别 返回类型<BR>return value 回返值 返回值<BR>right outer join 右向外联接 (for database)<BR>revoke 撤销 撤销<BR>robust 强固、稳健 健壮<BR>robustness 强固性、稳健性 健壮性<BR>roll back 复原 回滚 (for database)<BR>roll forward 前滚 (for database)<BR>routine 常式 例程<BR>row 行 (for database)<BR>row lock 行锁 (for database)<BR>rowset 行集 (for database)<BR>RPC (remote procedure call) RPC(远端程序呼叫) RPC(远程过程调用)<BR>runtime 执行期 执行期、运行期、执行时、运行时<BR>rvalue 右值 右值<BR>---------------------------------------------------------------------------------------------------------------------<BR>save 储存 保存<BR>savepoint 保存点 (for database)<BR>SAX (Simple API for XML) <BR>scalable 可扩展的、可延展的 可伸缩的、可扩展的<BR>schedule 排程 调度<BR>scheduler 排程器 调度程序<BR>schema 模式、纲目结构<BR>scroll bar 卷轴 滚动条<BR>scope 生存空间、生存范围、范畴 作用域、生存空间<BR>scope operator 生存空间(范围决议)运算子 :: 生存空间操作符<BR>scope resolution operator 生存空间决议运算子 生存空间解析操作符<BR>screen 萤幕 屏幕<BR>SDK (Software Development Kit) 软体开发套件 软件开发包<BR>sealed class 密封类别 密封类<BR>search 搜寻 查找<BR>semantics 语意 语义<BR>semaphore 信号量<BR>sequential container 序列式容器 序列式容器<BR>server 伺服器、伺服端 服务器、服务端<BR>serial 串行<BR>serialization/serialize 次第读写,序列化 序列化<BR>server cursor 服务端游标、服务器游标 (for database)<BR>session 会话 (for database)<BR>setter (相对于getter)设值函式 设值函数<BR>shared lock 共享锁 (for database)<BR>sibling 同层级 同级<BR>side effect 副作用<BR>signature 标记式、签名式、署名式 签名<BR>single-threaded 单一执行绪 单线程<BR>slider 滚轴 滑块<BR>slot 条孔、槽 槽<BR>smart pointer 灵巧指标、精灵指标 智能指针<BR>SMTP (Simple Mail Transfer Protocol) 简单邮件传输协定 简单邮件传输协议<BR>snapshot 萤幕快照(图) 截屏图<BR>snapshot 快照 (for database)<BR>specialization 特殊化、特殊化定义、特殊化宣告 特化<BR>specification 规格 规范、规格<BR>splitter 分裂视窗 切分窗口<BR>SOAP (simple object access protocol) 简单物件存取通讯协定 简单对象访问协议<BR>software 软体 软件<BR>source code 原始码 源码、源代码<BR>SQL (Structured Query Language) 结构化查询语言 (for database)<BR>stack 堆叠 栈、堆栈<BR>stack unwinding 堆叠辗转开解(此词用于exception主题) 栈辗转开解<BR>standard library 标准程式库 标准库<BR>standard template library 标准模板程式库 标准模板库<BR>stateless 没有状态的 无状态的<BR>statement 述句 语句、声明<BR>static cursor 静态游标 (for database)<BR>static SQL statements 静态SQL语句 (for database)<BR>stored procedure 存储过程 (for database)<BR>status bar 状态列、状态栏 状态条<BR>stream 资料流、串流 流<BR>string 字串 字符串<BR>stub 存根<BR>subobject 子对象<BR>subquery 子查询 (for database)<BR>subroutine 子例程<BR>subscript operator 下标运算子[] 下标操作符<BR>subset 子集<BR>subtype 子型别 子类型<BR>support 支援 支持<BR>suspend 虚悬 挂起<BR>symbol 符号 记号<BR>syntax 语法 语法<BR>system databases 系统数据库 (for database)<BR>system tables 系统表 (for database)<BR>---------------------------------------------------------------------------------------------------------------------<BR>table 表 (for database)<BR>table lock 表锁 (for database) <BR>table-level constraint 表级约束 (for database)<BR>tape backup 磁带备份 (for database)<BR>target 标的 目标<BR>task switch 工作切换 任务切换<BR>TCP (Transport Control Protocol) 传输控制协定 传输控制协议<BR>template 模板、范本 模板<BR>template-id<BR>template argument deduction 模板引数推导 模板参数推导<BR>template explicit specialization 模板显式特化(版本) 模板显式特化<BR>template parameter 模板参数 模板参数<BR>template template parameter<BR>temporary object 暂时物件 临时对象<BR>temporary table 临时表 (for database)<BR>text 文字 文本<BR>text file 程式本文档(放置程式原始码的档案) 文本文件<BR>thin client 精简型用户端 瘦客户端<BR>third-party 协力厂商 第三方<BR>thread 执行绪 线程<BR>thread-safe 线程安全的<BR>throw 丢掷(常指发出一个exception) 抛出、引发<BR>token 语汇单元 符号、标记、令牌（看场合）<BR>trace 跟踪<BR>transaction 交易 事务 (for database)<BR>transaction log 事务日志 (for database)<BR>transaction rollback 事务回滚 (for database)<BR>transactional replication 事务复制 (for database)<BR>translation unit 翻译单元<BR>traverse 巡访(来回走动) 遍历<BR>trigger 触发器 (for database)<BR>two-phase commit 两阶段提交 (for database)<BR>tuple<BR>two-phase lookup 两阶段查找<BR>type 型别 类型<BR>---------------------------------------------------------------------------------------------------------------------<BR>UDDI 统一描述、探索与整合 统一描述、查询与集成 <BR>(Universary Description, Discovery and Integration) <BR>UML unified modeling language 统一建模语言 统一建模语言<BR>unary function 一元函式 单参函数<BR>unary operator 一元运算子 一元操作符<BR>unboxing 拆箱、拆箱转换 <BR>underflow 下限溢位(相对于overflow) 下溢<BR>Union query 联合查询 (for database)<BR>UNIQUE constraints UNIQUE约束 (for database)<BR>unique index 唯一索引 (for database)<BR>unmanaged code 非受控代码、非托管代码<BR>unmarshal 反编列 散集<BR>unqualified 未经资格修饰(而直接取用) 未经限定的、未经修饰的<BR>URI (Uniform Resource identifier) 统一资源识别码 统一资源标识符<BR>URL (Uniform Resource Locator) 统一资源定位器 统一资源定位器<BR>user 使用者、用户 用户<BR>user interface 使用者介面、用户介面、人机介面 用户界面<BR>---------------------------------------------------------------------------------------------------------------------<BR>value types 数值型别 值类型<BR>variable 变数(相对于常数const) 变量<BR>vector 向量(一种容器，有点类似array) 向量、矢量（看场合）<BR>viable 可实行的、可行的 可行的<BR>video 视讯 视频<BR>view 视图<BR>VEE (Virtual Execution Engine) 虚拟执行引擎 虚拟执行引擎<BR>vendor 厂商 厂商<BR>view 资料检视表 视图 (for database)<BR>virtual function 虚拟函式 虚函数<BR>virtual machine 虚拟机器 虚拟机<BR>virtual memory 虚拟记忆体 虚拟内存<BR>vowel 母音 元音字母<BR>---------------------------------------------------------------------------------------------------------------------<BR>Web Services (不译) <BR>WHERE clause WHERE子句 (for database)<BR>wildcard characters 通配符字符 (for database)<BR>wildcard search 通配符搜索 (for database)<BR>window 视窗 窗口<BR>window function 视窗函式 窗口函数<BR>window procedure 视窗函式 窗口过程<BR>Windows authentication Windows身份验证 Windows身份验证<BR>wizard 精灵 向导<BR>word 字 单词<BR>word processor 文书处理器 字处理器<BR>wrapper 外覆、外包 包装、包装器<BR>write enable 写启用 (for database)<BR>write-ahead log 预写日志 (for database)<BR>write-only 唯写 只写<BR>WSDL (Web Service Description Language) Web Service描述语言 Web Service描述语言<BR>---------------------------------------------------------------------------------------------------------------------<BR>XML Message Interface (XMI) XML讯息介面 XML消息接口<BR>XML (eXtensible Markup Language) 可延伸标记语言 可扩展标记语言<BR>XSD (XML Schema Definition) XML模式定义语言<BR>XSL (eXtensible Stylesheet Language) 可延伸样式表语言 可扩展样式表语言<BR>XSLT 可延伸样式表语言转换 可扩展样式表语言转换<BR>(eXtensible Stylesheet Language Transformation) <BR>xxx based 以xxx为基础的、植基于xxx的 基于xxx的<BR>xxx oriented xxx导向 面向xxx</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/jackywjj/aggbug/25153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-23 09:40 <a href="http://www.blogjava.net/jackywjj/articles/25153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇编语言超浓缩教程</title><link>http://www.blogjava.net/jackywjj/articles/16971.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Thu, 27 Oct 2005 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/16971.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/16971.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/16971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/16971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/16971.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent><FONT size=2>“ 哎哟，哥们儿，还捣鼓汇编呢？那东西没用，兄弟用VB"钓"一个API就够你忙活个十天半月的，还不一定搞出来。”此君之言倒也不虚，那吾等还有无必要研他一究呢？（废话，当然有啦！要不然你写这篇文章干嘛。）别急，别急，让我把这个中原委慢慢道来：一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储，机器码可以被比较准确的翻译成汇编语言，这是因为汇编语言兼容性最好，故几乎所有跟踪、调试工具（包括WIN95/98下）都是以汇编示人的，如果阁下对CRACK颇感兴趣……；二、汇编直接与硬件打交道，如果你想搞通程序在执行时在电脑中的来龙去脉，也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干？一个真正的硬件发烧友，不懂这些可不行。三、如今玩DOS的多是“高手”，如能像吾一样混入（我不是高手）“高手”内部，不仅可以从“高手”朋友那儿套些黑客级“机密”，还可以自诩“高手”尽情享受强烈的虚荣感--#$%&amp; “醒醒!” </FONT>
<P><FONT size=2>　　对初学者而言，汇编的许多命令太复杂，往往学习很长时间也写不出一个漂漂亮亮的程序，以致妨碍了我们学习汇编的兴趣，不少人就此放弃。所以我个人看法学汇编，不一定要写程序，写程序确实不是汇编的强项，大家不妨玩玩DEBUG，有时CRACK出一个小软件比完成一个程序更有成就感（就像学电脑先玩游戏一样）。某些高深的指令事实上只对有经验的汇编程序员有用，对我们而言，太过高深了。为了使学习汇编语言有个好的开始，你必须要先排除那些华丽复杂的命令，将注意力集中在最重要的几个指令上（CMP LOOP MOV JNZ……）。但是想在啰里吧嗦的教科书中完成上述目标，谈何容易，所以本人整理了这篇超浓缩（用WINZIP、WINRAR…依次压迫，嘿嘿！）教程。大言不惭的说，看通本文，你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG，很有成就感的，试试看！那么――这个接下来呢？―― Here we go！（阅读时看不懂不要紧，下文必有分解）</FONT></P>
<P><FONT size=2>　　因为汇编是通过CPU和内存跟硬件对话的，所以我们不得不先了解一下CPU和内存：（关于数的进制问题在此不提）</FONT></P>
<P><FONT size=2>　　ＣＰＵ是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说，不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今，其CPU发展过程为：8086→80286→80386→80486→PENTIUM →……，还有AMD、CYRIX等旁支。后面兼容前面CPU的功能，只不过多了些指令（如多能奔腾的MMX指令集）、增大了寄存器（如386的32位EAX）、增多了寄存器（如486的FS）。为确保汇编程序可以适用于各种机型，所以推荐使用8086汇编语言，其兼容性最佳。本文所提均为8086汇编语言。寄存器（Register）是CPU内部的元件，所以在寄存器之间的数据传送非常快。用途：1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置，即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器，这些8位寄存器可分别组成16位寄存器：ＡＨ&amp;ＡＬ＝ＡＸ：累加寄存器，常用于运算；ＢＨ&amp;ＢＬ＝ＢＸ：基址寄存器，常用于地址索引；ＣＨ&amp;ＣＬ＝ＣＸ：计数寄存器，常用于计数；ＤＨ&amp;ＤＬ＝ＤＸ：数据寄存器，常用于数据传递。为了运用所有的内存空间，8086设定了四个段寄存器，专门用来保存段地址：ＣＳ（Code Segment）：代码段寄存器；ＤＳ（Data Segment）：数据段寄存器；ＳＳ（Stack Segment）：堆栈段寄存器；ＥＳ（Extra Segment）：附加段寄存器。当一个程序要执行时，就要决定程序代码、数据和堆栈各要用到内存的哪些位置，通过设定段寄存器 CS，DS，SS 来指向这些起始位置。通常是将DS固定，而根据需要修改CS。所以，程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以，程序和其数据组合起来的大小，限制在DS 所指的64K内，这就是COM文件不得大于64K的原因。8086以内存做为战场，用寄存器做为军事基地，以加速工作。除了前面所提的寄存器外，还有一些特殊功能的寄存器：IP（Intruction Pointer）：指令指针寄存器，与CS配合使用，可跟踪程序的执行过程；SP（Stack Pointer）：堆栈指针，与SS配合使用，可指向目前的堆栈位置。BP（Base Pointer）：基址指针寄存器，可用作SS的一个相对基址位置；SI（Source Index）：源变址寄存器可用来存放相对于DS段之源变址指针；DI（Destination Index）：目的变址寄存器，可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器FR（Flag Register）,有九个有意义的标志，将在下文用到时详细说明。</FONT></P>
<P><FONT size=2>　　内存是电脑运作中的关键部分，也是电脑在工作中储存信息的地方。内存组织有许多可存放数值的储存位置，叫“地址”。8086地址总线有20位，所以CPU拥有达1M的寻址空间，这也是DOS的有效控制范围，而8086能做的运算仅限于处理16位数据，即只有0到64K，所以，必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份：1.段基址(Segment)：16位二进制数后面加上四个二进制０，即一个16进制０，变成20位二进制数，可设定1M中任何一个64K段，通常记做16位二进制数；2.偏移量(Offset)：直接使用16位二进制数，指向段基址中的任何一个地址。如：2222（段基址）:3333（偏移量），其实际的20位地址值为：25553。除了上述营养要充分吸收外，你还要知道什么是DOS、BIOS功能调用，简单的说，功能调用类似于WIN95 API，相当于子程序。汇编写程序已经够要命了，如果不用MS、IBM的子程序，这日子真是没法过了（关于功能调用详见《电脑爱好者》98年11期）。</FONT></P>
<P><FONT size=2>　　编写汇编语言有两种主要的方法：1.使用MASM或TASM等编译器；2.使用除错程序DEBUG.COM。DEBUG其实并不能算是一个编译器，它的主要用途在于除错，即修正汇编程序中的错误。不过，也可以用来写短的汇编程序，尤其对初学者而言，DEBUG 更是最佳的入门工具。因为DEBUG操作容易：只要键入DEBUG回车，A回车即可进行汇编，过程简单，而使用编译器时，必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序，其中每一个程序都必须用到一系列相当复杂的命令才能工作，而且用编译器处理源程序，必须加入许多与指令语句无关的指示性语句，以供编译器识别，使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外，还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器，换句话说，DEBUG是为了让我们接触硬件而设计的。（8086常用指令用法将在每个汇编程序中讲解，限于篇幅，不可能将所有指令列出）。</FONT></P>
<P><FONT size=2>　　DEBUG的的A命令可以汇编出简单的COM文件，所以DEBUG编写的程序一定要由地址 100h（COM文件要求）开始才合法。FOLLOW ME，SETP BY SETP（步步回车）：</FONT></P>
<P><FONT size=2>　　输入 A100 ； 从DS：100开始汇编<BR>　　2.输入 MOV DL,1 ； 将数值 01h 装入 DL 寄存器<BR>　　3.输入 MOV AH,2 ； 将数值 02h 装入 DL 寄存器<BR>　　4.输入 INT 21 ； 调用DOS 21号中断2号功能，用来逐个显示装入DL的字符<BR>　　5.输入 INT 20 ； 调用DOS 20号中断，终止程序，将控制权交回给 DEBUG<BR>　　6.请按 Enter 键<BR>　　7.现在已将汇编语言程序放入内存中了，输入 G(运行)<BR>　　8.出现结果：输出一个符号。<BR>　　ㄖ ←输出结果其实不是它，因WORD97无法显示原结果，故找一赝品将就着。<BR>　　Program terminated normally</FONT></P>
<P><FONT size=2>　　我们可以用Ｕ命令将十六进制的机器码反汇编（Unassemble）成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码，而8086实际上就是以机器码来执行程序。<BR>　　1.输入 U100,106<BR>　　1FED:0100 B201 MOV DL,01<BR>　　1FED:0102 B402 MOV AH,02<BR>　　1FED:0104 CD21 INT 21<BR>　　1FED:0106 CD20 INT 20<BR>　　DEBUG可以用Ｒ命令来查看、改变寄存器内容。CS：IP寄存器，保存了将执行指令地址。<BR>　　1.输入R<BR>　　AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000<BR>　　DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC<BR>　　1FED:0100 B201 MOV DL,01</FONT></P>
<P><FONT size=2>　　当程序由DS：100开始执行，那么终止程序时，DEBUG会自动将IP内容重新设定为100。当你要将此程序做成一个独立的可执行文件，则可以用Ｎ命令对该程序命名。但一定要为COM文件，否则无法以DEBUG载入。<BR>　　输入N SMILE.COM ；我们得告诉DEBUG程序长度：程序从100开始到106，故占用7<BR>　　；字节。我们利用BX存放长度值高位部分，而以CX存放低位部分。<BR>　　2.输入RBX ；查看 BX 寄存器的内容，本程序只有7个字节，故本步可省略<BR>　　3.输入 RCX　 ；查看 CX 寄存器的内容<BR>　　4.输入 7　 ；程序的字节数<BR>　　5.输入 W ；用Ｗ命令将该程序写入（Write）磁盘中</FONT></P>
<P><FONT size=2>　　修行至此，我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候，通常不会直接将机器码放入内存中，而是打入一串助记符号（Mnemonic Symbols），这些符号比十六进制机器码更容易记住，此之谓汇编指令。助记符号，告诉CPU应执行何种运算。 也就是说，助忆符号所构成的汇编语言是为人设计的，而机器语言是对PC设计的。 </FONT></P>
<P><FONT size=2>　　现在，我们再来剖析一个可以将所有ASCII码显示出来的程序。<BR>　　1. 输入 DEBUG<BR>　　2. 输入 A100<BR>　　3．输入 MOV CX,0100 ；装入循环次数<BR>　　MOV DL,00 ；装入第一个ASCII码，随后每次循环装入新码<BR>　　MOV AH,02<BR>　　INT 21<BR>　　INC DL ；INC：递增指令，每次将数据寄存器 DL 内的数值加 1<BR>　　LOOP 0105 ；LOOP：循环指令，每执行一次LOOP，CX值减1，并跳<BR>　　；到循环的起始地址105，直到CX为0，循环停止<BR>　　INT 20<BR>　　4.输入 G即可显示所有ASCII码<BR>　<BR>　　当我们想任意显示字符串，如：UNDERSTAND？，则可以使用DOS21H号中断9H号功能。输入下行程序，存盘并执行看看：<BR>　　1.输入 A100<BR>　　 MOV DX,109 ；DS:DX ＝ 字符串的起始地址<BR>　　 MOV AH,9 ；DOS的09h功能调用<BR>　　INT 21 ；字符串输出<BR>　　INT 20<BR>　　DB 'UNDERSTAND？$'；定义字符串 </FONT></P>
<P><FONT size=2>　　在汇编语言中，有两种不同的指令：1.正规指令：如 MOV 等，是属于CPU的指令，用来告诉CPU在程序执行时应做些什么，所以它会以运算码（OP-code）的方式存入内存中；2.伪指令：如DB等，是属于DEBUG等编译器的指令，用来告诉编译器在编译时应做些什么。DB（Define Byte）指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。使用 9H 功能的字符串必须以$结尾。用Ｄ命令可用来查看DB伪指令将那些内容放入内存。<BR>　　6.输入 D100<BR>　　1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst<BR>　　1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F..E..F4.d.<BR>　　1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57 56 .E.3.^_.......WV<BR>　　1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2...<BR>　　1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.....E.......<BR>　　1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V...t..E....V.^_<BR>　　1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE ......k.....S.^.<BR>　　1975:0170 8B C2 E8 FB FD 0B C0 75-09 8B 5E FE 8B 47 0C E8 .......u..^..G..</FONT></P>
<P><FONT size=2>　　现在，我们来剖析另一个程序：由键盘输入任意字符串，然后显示出来。db 20指示DEBUG保留20h个未用的内存空间供缓冲区使用。<BR>　　输入A100<BR>　　 MOV DX,0116 ；DS:DX ＝ 缓冲区地址，由DB伪指令确定缓冲区地址<BR>　　MOV AH,0A ；0Ah 号功能调用<BR>　　INT 21 ；键盘输入缓冲区<BR>　　MOV DL,0A ；由于功能Ah在每个字符串最后加一个归位码（0Dh由 Enter<BR>　　MOV AH,02 ；产生），使光标自动回到输入行的最前端，为了使新输出的<BR>　　INT 21 ；字符串不会盖掉原来输入的字符串，所以利用功能2h加一<BR>　　；个换行码(OAh)，使得光标移到下一行的的最前端。<BR>　　MOV DX,0118 ；装入字符串的起始位置<BR>　　MOV AH,09 ；9h功能遇到$符号才会停止输出，故字符串最后必须加上<BR>　　INT 21 ；$，否则9h功能会继续将内存中的无用数据胡乱显示出来<BR>　　INT 20<BR>　　DB 20 ；定义缓冲区 <BR>　　送你一句话：学汇编切忌心浮气燥。</FONT></P>
<P><FONT size=2>　　客套话就不讲了。工欲善其事，必先利其器。与其说DEBUG 是编译器，倒不如说它是“直译器”，DEBUG的A命令只可将一行汇编指令转成机器语言，且立刻执行。真正编译器（MASM）的运作是利用文本编辑器（EDIT等）将汇编指令建成一个独立且附加名为.ASM的文本文件，称源程序。它是MASM 程序的输入部分。MASM将输入的ASM文件，编译成.OBJ文件，称为目标程序。OBJ文件仅包含有关程序各部份要载入何处及如何与其他程序合并的信息，无法直接载入内存执行。链结程序LINK则可将OBJ文件转换成可载入内存执行（EXEcute）的EXE文件。还可以用EXE2BIN，将符合条件的EXE文件转成COM文件（COM 文件不但占用的内存最少，而且运行速度最快）。<BR>　　下面我们用MASM写一个与用DEBUG写的第一个程序功能一样的程序。<BR>　　用EDIT编辑一个SMILE.ASM的源程序文件。<BR>　　源程序 DEBUG 程序<BR>　　prognam segment<BR>　　assume cs:prognam<BR>　　org 100h A100<BR>　　mov dl,1 mov dl,1<BR>　　mov ah,2 mov ah,2<BR>　　int 21h int 21<BR>　　int 20h int 20<BR>　　prognam ends<BR>　　end</FONT></P>
<P><FONT size=2>　　比较一下：1.因为MASM会将所有的数值假设为十进制，而DEBUG则只使用十六进制，所以在源程序中，我们必须在有关数字后加上代表进制的字母，如H代表十六进制，D代表十进制。若是以字母开头的十六进制数字，还必须在字母前加个0，以表示它是数，如0AH。2.源程序增加五行叙述：prognam segment 与 prognam ends 是成对的，用来告诉 MASM 及LINK，此程序将放在一个称为PROGNAM(PROGram NAMe)的程序段内，其中段名（PROGNAM）可以任取，但其位置必须固定。assume cs:prognam 必须在程序的开头，用来告诉编译器此程序所在段的位置放在CS寄存器中。end用来告诉MASM，程序到此结束, ORG 100H作用相当于DEBUG的A100，从偏移量100开始汇编。COM 文件的所有源程序都必须包含这五行，且必须依相同的次序及位置出现，这点东西记下就行，千篇一律。接着，我们用MASM编译SMILE.ASM。<BR>　　输入 MASM SMILE ←不用打入附加名.ASM。<BR>　　Microsoft (R) Macro Assembler Version 5.10<BR>　　Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.<BR>　　Object filename [SMILE.OBJ]: ←是否改动输出OBJ文件名，如不改就ENTER<BR>　　Source listing [NUL.LST]: ← 是否需要列表文件（LST），不需要就ENTER<BR>　　Cross-reference [NUL.CRF]: ←是否需要对照文件（CRF），不需要则ENTER<BR>　　50162 + 403867 Bytes symbol space free<BR>　　0 Warning Errors ←警告错误，表示编译器对某些语句不理解，通常是输入错误。<BR>　　0 Severe Errors ←严重错误，会造成程序无法执行，通常是语法结构错误。</FONT></P>
<P><FONT size=2>　　如果没有一个错误存在，即可生成OBJ文件。OBJ中包含的是编译后的二进制结果，它还无法被 DOS载入内存中加以执行，必须加以链结（Linking）。以LINK将OBJ文件（SMILE.OBJ）链结成 EXE 文件（SMILE.EXE）时，。<BR>　　1.输入 LINK SMILE ←不用附加名OBJ<BR>　　Microsoft (R) Overlay Linker Version 3.64<BR>　　Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.<BR>　　Run File [SMILE.EXE]: ← 是否改动输出EXE文件名，如不改就ENTER<BR>　　List File [NUL.MAP]: ← 是否需要列表文件（MAP），不需要则ENTER<BR>　　Libraries [.LIB]: ←是否需要库文件，要就键入文件名，不要则ENTER<BR>　　LINK : warning L4021: no stack segment← 由于COM文件不使用堆栈段，所以错误信息<BR>　　←"no stack segment"并不影响程序正常执行</FONT></P>
<P><FONT size=2>　　至此已经生成EXE文件，我们还须使用EXE2BIN 将EXE文件（SMILE.EXE），转换成COM文件（SMILE.COM）。输入EXE2BIN SMILE产生 BIN 文件（SMILE.BIN）。其实 BIN 文件与 COM 文件是完全相同的，但由于DOS只认COM、EXE及BAT文件，所以BIN文件无法被正确执行，改名或直接输入 EXE2BIN SMILE SMILE.COM即可。现在，磁盘上应该有 SMILE.COM 文件了，你只要在提示符号C：&gt;下，直接输入文件名称 SMILE ，就可以执行这个程序了。</FONT></P>
<P><FONT size=2>　　你是否觉得用编译器产生程序的方法，比 DEBUG 麻烦多了！以小程序而言，的确是如此，但对于较大的程序，你就会发现其优点了。我们再将ASCII程序以编译器方式再做一次，看看有无差异。首先，用EDIT.COM建立 ASCII.ASM 文件。<BR>　　prognam segment ;定义段<BR>　　assume cs:prognam ;把上面定义段的段基址放入 CS<BR>　　mov cx,100h ; 装入循环次数<BR>　　mov dl,0 ; 装入第一个ASCII码，随后每次循环装入新码<BR>　　next: mov ah,2<BR>　　 int 21h<BR>　　 inc dl ;INC：递增指令，每次将数据寄存器 DL 内的数值加 1<BR>　　loop next ; 循环指令，执行一次，CX减1，直到CX为0，循环停止<BR>　　int 20h<BR>　　 prognam ends ;段终止<BR>　　end ;汇编终止<BR>　　在汇编语言的源程序中，每一个程序行都包含三项元素：<BR>　　　 start: mov dl,1 ；装入第一个ASCII码，随后每次循环装入新码<BR>　　　 标识符 表达式 注解</FONT></P>
<P><FONT size=2>　　在原始文件中加上注解可使程序更易理解，便于以后参考。每行注解以“；”与程序行分离。编译器对注解不予理会，注解的数据不会出现在OBJ、EXE或COM文件中。由于我们在写源程序时，并不知道每一程序行的地址，所以必须以符号名称来代表相对地址，称为“标识符”。我们通常在适当行的适当位置上，键入标识符。标识符（label）最长可达31 个字节，因此我们在程序中，尽量以简洁的文字做为标识符。现在，你可以将此ASCII.ASM 文件编译成 ASCII.COM 了。1.MASM ASCII，2.LINK ASCII，3.EXE2BIN ASCII ASCII.COM。</FONT></P>
<P><FONT size=2>　　注意：当你以编译器汇编你设计的程序时，常会发生打字错误、标识符名称拼错、十六进制数少了ｈ、逻辑错误等。汇编老手常给新人的忠告是：最好料到自己所写的程序一定会有些错误（别人告诉我的）；如果第一次执行程序后，就得到期望的结果，你最好还是在检查一遍，因为它可能是错的。原则上，只要大体的逻辑架构正确，查找程序中错误的过程，与写程序本身相比甚至更有意思。写大程序时，最好能分成许多模块，如此可使程序本身的目的较单纯，易于撰写与查错，另外也可让程序中不同部份之间的界限较清楚，节省编译的时间。如果读程序有读不懂的地方最好用纸笔记下有关寄存器、内存等内容，在纸上慢慢比划，就豁然开朗了。 　　下面我们将写一个能从键盘取得一个十进制的数值，并将其转换成十六进制数值而显示于屏幕上的“大程序”。前言：要让8086执行这样的功能，我们必须先将此问题分解成一连串的步骤，称为程序规划。首先，以流程图的方式，来确保整个程序在逻辑上没有问题（不用说了吧！什么语言都要有此步骤）。这种模块化的规划方式，称之为“由上而下的程序规划”。而在真正写程序时，却是从最小的单位模块（子程序）开始，当每个模块都完成之后，再合并成大程序；这种大处著眼，小处著手的方式称为“由下而上的程序设计”。</FONT></P>
<P><FONT size=2>　　我们的第一个模块是BINIHEX，其主要用途是从8086的BX寄存器中取出二进制数，并以十六进制方式显示在屏幕上。注意：子程序如不能独立运行，实属正常。<BR>　　 binihex segment<BR>　　 assume cs:binihex<BR>　　mov ch,4 ;记录转换后的十六进制位数（四位）<BR>　　rotate: mov cl,4 ;利用CL当计数器，记录寄存器数位移动次数<BR>　　rol bx,cl ;循环寄存器BX的内容，以便依序处理4个十六进制数<BR>　　mov al,bl ;把bx低八位bl内数据转移至al<BR>　　and al,0fh ;把无用位清零<BR>　　add al,30h ;把AL内数据加30H，并存入al<BR>　　cmp al,3ah ;与3ah比较<BR>　　jl printit ;小于3ah则转移<BR>　　add al,7h ;把AL内数据加30H，并存入al<BR>　　printit:mov dl,al ;把ASCII码装入DL<BR>　　mov ah,2<BR>　　 int 21h<BR>　　 dec ch ;ch减一，减到零时，零标志置1<BR>　　jnz rotate ;JNZ：当零标志未置1，则跳到指定地址。即：不等，则转移<BR>　　int 20h ;从子程序退回主程序<BR>　　binihex ends<BR>　　 end</FONT></P>
<P><FONT size=2>　　利用循环左移指令ROL循环寄存器BX(BX内容将由第二个子程序提供)的内容，以便依序处理4个十六进制数:1. 利用CL当计数器，记录寄存器移位的次数。2.将BX的第一个十六进制值移到最右边。利用 AND （逻辑“与”运算：对应位都为１时，其结果为１，其余情况为零）把不要的部份清零，得到结果：先将BL值存入AL中，再利用AND以0Fh（00001111）将AL的左边四位清零。由于０到９的ASCII码为30h到39h，而Ａ到Ｆ之ASCII码为41h到46h，间断了7h，所以得到结果：若AL之内容小于3Ah，则AL值只加30h，否则AL再加7h。ADD指令会将两个表达式相加，其结果存于左边表达式内。标志寄存器（Flag Register）是一个单独的十六位寄存器，有9个标志位，某些汇编指令（大部份是涉及比较、算术或逻辑运算的指令）执行时，会将相关标志位置1或清0， 常碰到的标志位有零标志（ZF）、符号标志（SF）、溢出标志（OF）和进位标志（CF）。 标志位保存了某个指令执行后对它的影响，可用其他相关指令，查出标志的状态，根据状态产生动作。CMP指令很像减法，是将两个表达式的值相减，但寄存器或内存的内容并未改变，只是相对的标志位发生改变而已：若 AL 值小于 3Ah，则正负号标志位会置0，反之则置1。 JL指令可解释为：小于就转移到指定位置，大于、等于则向下执行。CMP和JG 、JL等条件转移指令一起使用，可以形成程序的分支结构，是写汇编程序常用技巧。</FONT></P>
<P><FONT size=2>　　第二个模块DECIBIN 用来接收键盘打入的十进制数，并将它转换成二进制数放于BX 寄存器中，供模块1 BINIHEX使用。<BR>　　decibin segment<BR>　　assume cs:decibin<BR>　　mov bx,0 ;BX清零<BR>　　newchar:mov ah,1 ;<BR>　　int 21h ;读一个键盘输入符号入al，并显示<BR>　　sub al,30h ;al减去30H，结果存于al中，完成ASCII码转二进制码<BR>　　jl exit ;小于零则转移<BR>　　cmp al,9d<BR>　　 jg exit ;左&gt;右则转移<BR>　　cbw ;8位al转换成16位ax<BR>　　xchg ax,bx ;互换ax和bx内数据<BR>　　mov cx,10d ;十进制数10入cx<BR>　　mul cx ;表达式的值与ax内容相乘，并将结果存于ax<BR>　　xchg ax,bx<BR>　　 add bx,ax<BR>　　 jmp newchar ;无条件转移<BR>　　exit: int 20 ;回主程序<BR>　　decibin ends<BR>　　 end<BR>　　CBW 实际结果是:若AL中的值为正，则AH填入00h；反之，则AH填入FFh。XCHG常用于需要暂时保留某个寄存器中的内容时。<BR>　　当然，还得一个子程序（CRLF）使后显示的十六进制数不会盖掉先输入的十进制数。<BR>　　crlf segment<BR>　　assume cs:crlf<BR>　　mov dl,0dh ;回车的ASCII码0DH入DL<BR>　　mov ah,2<BR>　　 int 21h<BR>　　 mov dl,0ah ;换行的ASSII码0AH入AH<BR>　　mov ah,2<BR>　　 int 21h<BR>　　 int 20 ;回主程序<BR>　　crlf ends<BR>　　end</FONT></P>
<P><FONT size=2>　　现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先，我们要将这三个模块子程序略加改动。然后，再写一段程序来调用每一个子程序。<BR>　　crlf proc near；<BR>　　mov dl,0dh<BR>　　mov ah,2<BR>　　int 21h<BR>　　mov dl,0ah<BR>　　mov ah,2<BR>　　int 21h<BR>　　ret<BR>　　crlf endp</FONT></P>
<P><FONT size=2>　　类似SEGMENT与ENDS的伪指令，PROC与ENDP也是成对出现，用来识别并定义一个程序。其实，PROC 真正的作用只是告诉编译器：所调用的程序是属于近程（NEAR）或远程（FAR）。 一般的程序是由 DEBUG 直接调用的，所以用 INT 20 返回，用 CALL 指令所调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址，而该地址是由调用此程序的 CALL指令所放入的。<BR>　　各模块都搞定了，然后我们把子程序组合起来就大功告成<BR>　　decihex segment ;主程序<BR>　　assume cs:decihex<BR>　　org 100h<BR>　　mov cx,4 ;循环次数入cx；由于子程序要用到cx，故子程序要将cx入栈<BR>　　repeat: call decibin;调用十进制转二进制子程序<BR>　　call crlf ;调用添加回、换行符子程序<BR>　　call binihex ;调用二进制转十六进制并显示子程序<BR>　　call crlf<BR>　　loop repeat ;循环4次，可连续运算4次<BR>　　mov ah,4ch ; 调用DOS21号中断4c号功能，退出程序，作用跟INT 20H<BR>　　int 21H ; 一样，但适用面更广，INT20H退不出时，试一下它<BR>　　decibin proc near push cx ;将cx压入堆栈，;<BR>　　┇ exit: pop cx ;将cx还原; retdecibin endp binihex proc near push cx<BR>　　┇ pop cx retbinihex endp crlf proc near<BR>　　 push cx<BR>　　┇ pop cx retcrlf endpdecihex ends end</FONT></P>
<P><FONT size=2>　　CALL指令用来调用子程序，并将控制权转移到子程序地址，同时将CALL的下行一指令地址定为返回地址，并压入堆栈中。CALL 可分为近程（NEAR）及远程（FAR）两种：1.NEAR：IP的内容被压入堆栈中，用于程序与程序在同一段中。2.FAR：CS 、IP寄存器的内容依次压入堆栈中,用于程序与程序在不同段中。PUSH、POP又是一对指令用于将寄存器内容压入、弹出，用来保护寄存器数据，子程序调用中运用较多。堆栈指针有个“后进先出”原则，像PUSH AX，PUSH BX…POP BX，POP AX这样才能作到保护数据丝毫不差。</FONT></P>
<P><FONT size=2>　　汇编语言超浓缩教程到这要告一段落了，希望能奠定你独立设计的基础。而更多更好的技巧则全依赖你平时的积累了。祝你成功！</FONT></P></SPAN><img src ="http://www.blogjava.net/jackywjj/aggbug/16971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-10-27 10:16 <a href="http://www.blogjava.net/jackywjj/articles/16971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计方法、规范与技巧</title><link>http://www.blogjava.net/jackywjj/articles/16972.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Thu, 27 Oct 2005 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/16972.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/16972.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/16972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/16972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/16972.html</trackback:ping><description><![CDATA[<P>数据库设计方法、规范与技巧（推荐） <BR>&nbsp;<BR>&nbsp;<BR>&nbsp;一、数据库设计过程<BR>数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境，构造最优的数据库模式，建立数据库及其应用系统，有效存储数据，满足用户信息要求和处理要求。<BR>数据库设计中需求分析阶段综合各个用户的应用需求（现实世界的需求），在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式（信息世界模型），用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型，形成数据库逻辑模式。然后根据用户处理的要求，安全性的考虑，在基本表的基础上再建立必要的视图（VIEW）形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<BR>1. 需求分析阶段 <BR>需求收集和分析，结果得到数据字典描述的数据需求（和数据流图描述的处理需求）。 <BR>需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。<BR>需求分析的方法：调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。 <BR>常用的调查方法有： 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。<BR>分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法（Structured Analysis，简称SA方法）从最上层的系统组织机构入手，采用逐层分解的方式分析系统，并把每一层用数据流图和数据字典描述。<BR>数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典（Data Dictionary，简称DD）来描述。<BR>数据字典是各类数据描述的集合，它是关于数据库中数据的描述，即元数据，而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。<BR>数据项描述＝｛数据项名，数据项含义说明，别名，数据类型，长度， <BR>　　　　　　　　　取值范围，取值含义，与其他数据项的逻辑关系｝ <BR>数据结构描述＝｛数据结构名，含义说明，组成:｛数据项或数据结构｝｝ <BR>数据流描述＝｛数据流名，说明，数据流来源，数据流去向， <BR>　　　　　　　　　组成:｛数据结构｝，平均流量，高峰期流量｝ <BR>数据存储描述＝｛数据存储名，说明，编号，流入的数据流，流出的数据流， 　　<BR>　　　　　　　　组成:｛数据结构｝，数据量，存取方式｝ <BR>处理过程描述＝｛处理过程名，说明，输入:｛数据流｝，输出:｛数据流｝, <BR>　　　　　　　　　　处理:｛简要说明｝｝ <BR>2. 概念结构设计阶段 <BR>通过对用户需求进行综合、归纳与抽象，形成一个独立于具体DBMS的概念模型，可以用E-R图表示。 <BR>概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。 <BR>概念模型特点：<BR>(1) 具有较强的语义表达能力，能够方便、直接地表达应用中的各种语义知识。 <BR>(2) 应该简单、清晰、易于用户理解，是用户与数据库设计人员之间进行交流的语言。<BR>概念模型设计的一种常用方法为IDEF1X方法，它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术，用于建立系统信息模型。<BR>&nbsp;&nbsp;&nbsp; 使用IDEF1X方法创建E-R模型的步骤如下所示:<BR>2.1 第零步——初始化工程<BR>这个阶段的任务是从目的描述和范围描述开始，确定建模目标，开发建模计划，组织建模队伍，收集源材料，制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果，业务流程，原有系统的输入输出，各种报表，收集原始数据，形成了基本数据资料表。<BR>2.2 第一步——定义实体<BR>实体集成员都有一个共同的特征和属性集，可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有“代码”结尾的术语，如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来，从而初步找出潜在的实体，形成初步实体表。<BR>2.3 第二步——定义联系<BR>IDEF1X模型中只允许二元联系，n元联系必须定义为n个二元联系。根据实际的业务需求和规则，使用实体联系矩阵来标识实体间的二元关系，然后根据实际情况确定出连接关系的势、关系名和说明，确定关系类型，是标识关系、非标识关系（强制的或可选的）还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识，则为标识关系，否则为非标识关系。非标识关系中，如果每个子实体的实例都与而且只与一个父实体关联，则为强制的，否则为非强制的。如果父实体与子实体代表的是同一现实对象，那么它们为分类关系。<BR>2.4 第三步——定义码<BR>通过引入交叉实体除去上一阶段产生的非确定关系，然后从非交叉实体和独立实体开始标识侯选码属性，以便唯一识别每个实体的实例，再从侯选码中确定主码。为了确定主码和关系的有效性，通过非空规则和非多值规则来保证，即一个实体实例的一个属性不能是空值，也不能在同一个时刻有一个以上的值。找出误认的确定关系，将实体进一步分解，最后构造出IDEF1X模型的键基视图（KB图）。<BR>2.5 第四步——定义属性<BR>从源数据表中抽取说明性的名词开发出属性表，确定属性的所有者。定义非主码属性，检查属性的非空及非多值规则。此外，还要检查完全依赖函数规则和非传递依赖规则，保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。<BR>2.6 第五步——定义其他对象和规则<BR>&nbsp;&nbsp;&nbsp; 定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。<BR>3. 逻辑结构设计阶段 <BR>&nbsp;&nbsp;&nbsp; 将概念结构转换为某个DBMS所支持的数据模型（例如关系模型），并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型，然后选择最合适的DBMS。<BR>将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则： <BR>1）一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。 <BR>2）一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 <BR>3）一个1:n联系可以转换为一个独立的关系模式，也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式，则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性，而关系的码为n端实体的码。 <BR>4）一个1:1联系可以转换为一个独立的关系模式，也可以与任意一端对应的关系模式合并。<BR>5）三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。&nbsp; <BR>6）同一实体集的实体间的联系，即自联系，也可按上述1:1、1:n和m:n三种情况分别处理。 <BR>7）具有相同码的关系模式可合并。 <BR>为了进一步提高数据库应用系统的性能，通常以规范化理论为指导，还应该适当地修改、调整数据模型的结构，这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准，即：<BR>表内的每一个值都只能被表达一次。<BR>??表内的每一行都应该被唯一的标识（有唯一键）。<BR>表内不应该存储依赖于其他键的非键信息。&nbsp;&nbsp; <BR>4. 数据库物理设计阶段 <BR>为逻辑数据模型选取一个最适合应用环境的物理结构（包括存储结构和存取方法）。根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<BR>5. 数据库实施阶段 <BR>运用DBMS提供的数据语言（例如SQL）及其宿主语言（例如C），根据逻辑设计和物理设计的结果建立数据库，编制与调试应用程序，组织数据入库，并进行试运行。 数据库实施主要包括以下工作：用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行&nbsp; <BR>6. 数据库运行和维护阶段 <BR>数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括：数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。</P>
<P>建模工具的使用<BR>为加快数据库设计速度，目前有很多数据库辅助工具（CASE工具），如Rational公司的Rational Rose，CA公司的Erwin和Bpwin，Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。<BR>ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式，描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型，不仅能得到优秀的业务功能和数据需求模型，而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中，IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中，ERwin可以定义对应的表、列，并可针对各种数据库管理系统自动转换为适当的类型。<BR>设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后，设计人员可以使用Erwin画ER图，将ER图转换为关系数据模型，生成数据库结构；画数据流图，生成应用程序。<BR>二、数据库设计技巧<BR>1. 设计数据库之前（需求分析阶段）<BR>1) 理解客户需求，询问用户如何看待未来需求变化。让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。<BR>2) 了解企业业务可以在以后的开发阶段节约大量的时间。<BR>3) 重视输入输出。<BR>在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。<BR>举例：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。<BR>4) 创建数据字典和ER 图表<BR>ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。<BR>5) 定义标准的对象命名规范<BR>数据库各种对象的命名必须规范。<BR>2. 表和字段的设计（数据库逻辑设计）<BR>表设计原则<BR>1) 标准化和规范化<BR>数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式，但Third Normal Form（3NF）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，遵守3NF 标准的数据库的表设计原则是：“One Fact in One Place”即某个表只包括其本身基本的属性，当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点：有一组表专门存放通过键连接起来的关联数据。<BR>举例：某个存放客户及其有关定单的3NF 数据库就可能有两个表：Customer 和Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向Customer 表里包含该客户信息的那一行。<BR>事实上，为了效率的缘故，对表不进行标准化有时也是必要的。<BR>2) 数据驱动<BR>采用数据驱动而非硬编码的方式，许多策略变更和维护都会方便得多，大大增强系统的灵活性和扩展性。<BR>举例，假如用户界面要访问外部数据源（文件、XML 文档、其他数据库等），不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行工作流之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。<BR>3) 考虑各种变化<BR>在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。<BR>举例，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。</P>
<P>字段设计原则<BR>4) 每个表中都应该添加的3 个有用的字段<BR>??dRecordCreationDate，在VB 下默认是Now()，而在SQL Server 下默认为GETDATE()<BR>??sRecordCreator，在SQL Server 下默认为NOT NULL DEFAULT USER<BR>??nRecordVersion，记录的版本标记；有助于准确说明记录中出现null 数据或者丢失数据的原因<BR>5) 对地址和电话采用多个字段<BR>描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的类型和标记类别。<BR>6) 使用角色实体定义属于某类别的列<BR>在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。<BR>举例：用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说，当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位，而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的PERSON_TYPE 表就包含了所有PERSON 的可能类型，比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。<BR>7) 选择数字类型和文本类型尽量充足<BR>在SQL 中使用smallint 和tinyint 类型要特别小心。比如，假如想看看月销售总额，总额字段类型是smallint，那么，如果总额超过了$32,767 就不能进行计算操作了。<BR>而ID 类型的文本字段，比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。<BR>8) 增加删除标记字段<BR>在表中包含一个“删除标记”字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 <BR>3. 选择键和索引（数据库逻辑设计）<BR>键选择原则：<BR>1) 键设计4 原则<BR>??为关联字段创建外键。<BR>??所有的键都必须唯一。<BR>??避免使用复合键。<BR>??外键总是关联唯一的键字段。<BR>2) 使用系统生成的主键<BR>设计数据库的时候采用系统生成的键作为主键，那么实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点：当拥有一致的键结构时，找到逻辑缺陷很容易。<BR>3) 不要用用户的键(不让主键具有可更新性)<BR>在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。<BR>4) 可选键有时可做主键<BR>把可选键进一步用做主键，可以拥有建立强大索引的能力。</P>
<P>索引使用原则：<BR>索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。<BR>1) 逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列采用非成组索引。考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。<BR>2) 大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。<BR>3) 不要索引memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。<BR>4) 不要索引常用的小型表<BR>不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。</P>
<P>4. 数据完整性设计（数据库逻辑设计）<BR>1) 完整性实现机制：<BR>实体完整性：主键<BR>参照完整性：<BR>父表中删除数据：级联删除；受限删除；置空值<BR>父表中插入数据：受限插入；递归插入<BR>父表中更新数据：级联更新；受限更新；置空值<BR>DBMS对参照完整性可以有两种方法实现：外键实现机制（约束规则）和触发器实现机制<BR>用户定义完整性：<BR>&nbsp;&nbsp;&nbsp; NOT NULL；CHECK；触发器<BR>2) 用约束而非商务规则强制数据完整性<BR>采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。<BR>3) 强制指示完整性<BR>在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。<BR>4) 使用查找控制数据完整性<BR>控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。<BR>5) 采用视图<BR>为了在数据库和应用程序代码之间提供另一层抽象，可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。<BR>5. 其他设计技巧<BR>1) 避免使用触发器<BR>触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。<BR>2) 使用常用英语（或者其他任何语言）而不要使用编码<BR>在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码，可以在编码旁附上用户知道的英语。<BR>3) 保存常用信息<BR>让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复（对Access）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。<BR>4) 包含版本机制<BR>在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 <BR>5) 编制文档<BR>对所有的快捷方式、命名规范、限制和函数都要编制文档。<BR>采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。<BR>对数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当过了一年多时间后再回过头来做第2 个版本，犯错的机会将大大减少。<BR>6) 测试、测试、反复测试<BR>建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。<BR>7) 检查设计<BR>在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。<BR>三、数据库命名规范<BR>1. 实体（表）的命名<BR>1) 表以名词或名词短语命名，确定表名是采用复数还是单数形式，此外给表的别名定义简单规则（比方说，如果表名是一个单词，别名就取单词的前4 个字母；如果表名是两个单词，就各取两个单词的前两个字母组成4 个字母长的别名；如果表的名字由3 个单词组成，从头两个单词中各取一个然后从最后一个单词中再取出两个字母，结果还是组成4 字母长的别名，其余依次类推）<BR>对工作用表来说，表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中，根据语义拼凑缩写即可。注意，由于ORCLE会将字段名称统一成大写或者小写中的一种，所以要求加上下划线。<BR>举例：<BR>定义的缩写 Sales: Sal 销售；<BR>Order: Ord 订单；<BR>Detail: Dtl 明细；<BR>则销售订单明细表命名为：Sal_Ord_Dtl;<BR>2) 如果表或者是字段的名称仅有一个单词，那么建议不使用缩写，而是用完整的单词。<BR>举例：<BR>定义的缩写 Material Ma 物品；<BR>物品表名为：Material, 而不是 Ma.<BR>但是字段物品编码则是：Ma_ID;而不是Material_ID<BR>3) 所有的存储值列表的表前面加上前缀Z<BR>目的是将这些值列表类排序在数据库最后。<BR>4) 所有的冗余类的命名(主要是累计表)前面加上前缀X<BR>冗余类是为了提高数据库效率，非规范化数据库的时候加入的字段或者表<BR>5) 关联类通过用下划线连接两个基本类之后，再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。<BR>关联表用于保存多对多关系。<BR>如果被关联的表名大于10个字母，必须将原来的表名的进行缩写。如果没有其他原因，建议都使用缩写。<BR>举例：表Object与自身存在多对多的关系,则保存多对多关系的表命名为：R_Object；<BR>表 Depart和Employee;存在多对多的关系；则关联表命名为R_Dept_Emp<BR>2. 属性（列）的命名<BR>1) 采用有意义的列名，表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码，统一命名为：ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型，你可以用_NO 作为后缀；如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。<BR>举例：销售订单的编号字段命名：Sal_Ord_ID；如果还存在一个数据库生成的自动编号，则命名为：ID。<BR>2) 所有的属性加上有关类型的后缀，注意，如果还需要其它的后缀，都放在类型后缀之前。<BR>注: 数据类型是文本的字段，类型后缀TX可以不写。有些类型比较明显的字段，可以不写类型后缀。<BR>3) 采用前缀命名<BR>给每个表的列名都采用统一的前缀，那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点，比如破坏了自动表连接工具的作用，后者把公共列名同某些数据库联系起来。<BR>3. 视图的命名<BR>1) 视图以V作为前缀，其他命名规则和表的命名类似；<BR>2) 命名应尽量体现各视图的功能。<BR>4. 触发器的命名<BR>触发器以TR作为前缀，触发器名为相应的表名加上后缀，Insert触发器加'_I'，Delete触发器加'_D'，Update触发器加'_U'，如：TR_Customer_I，TR_Customer_D，TR_Customer_U。<BR>5. 存储过程名<BR>存储过程应以'UP_'开头，和系统的存储过程区分，后续部分主要以动宾形式构成，并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。<BR>6. 变量名<BR>变量名采用小写，若属于词组形式，用下划线分隔每个单词，如@my_err_no。<BR>7. 命名中其他注意事项<BR>1)&nbsp; 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29（不包括标识字符@）。<BR>2)&nbsp; 数据对象、变量的命名都采用英文字符，禁止使用中文命名。绝对不要在对象名的字符之间留空格。<BR>3) 小心保留词，要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突<BR>5) 保持字段名和类型的一致性，在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数，那在另一个表里可就别变成字符型了。<BR>&nbsp;<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/16972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-10-27 10:16 <a href="http://www.blogjava.net/jackywjj/articles/16972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>别让保鲜膜碰到食物</title><link>http://www.blogjava.net/jackywjj/articles/7343.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 08 Jul 2005 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7343.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7343.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7343.html</trackback:ping><description><![CDATA[　　保鲜膜轻轻一撕，保住食物的美味，为食物保鲜带来极大的便利。只是，愈来愈多的研究发现，便利的代价可能超过人们的想象。&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;为了全家人的健康，千万不可将保鲜膜包着的食物送进微波炉加热烹煮！&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;塑料膜包装食物出售，到处可见，但科学家担心这种随手可得的方便，究竟安不安全？&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;因为有些塑料膜含有干扰内分泌的物质，会扰乱人体内的荷尔蒙，引起妇女乳癌、新生儿先天缺陷、男性精虫数减低，甚至精神疾病等。&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;动物实验证明有害数据显示，有些塑料膜(保鲜膜)的塑化剂是聚氯乙烯塑料包装产品，含有di-(2-ethylhexyl)adipate，简称为DEHA的一种塑化剂，以增加保鲜膜的附着力，但会渗入食物，尤其是高脂肪的食物。并且在加热时，塑料膜会加速释出塑化剂DEHA。&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;由于只有在动物实验(如白老鼠)证明有害，所以美国政府尚未禁阻工业界使用DEHA。英国早在10年前，就已规定改用其他较安全的塑化剂。不过有些美国的消费者，已经开始减少使用塑料膜包装食物。&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在塑料保鲜膜还在广泛使用的此时，身为消费者也可采取自保之道：&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;一回家就把肉、乳酪等食物从保鲜膜类的塑料包装中取出，洗净表层或浅削去表层后放在其他“食品级塑料袋”或容器中；&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;不让食物碰到任何塑料膜(保鲜膜)。多多改用有盖的瓷碗盘或不锈钢容器；&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;如果可能的话，买肉时，尽量用自备纸来包肉；&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;食物装在无盖的陶瓷碗内，如果上面附盖塑料膜(保鲜膜)，不要装满以免碰到食物；&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;食物包装任何塑料膜时(保鲜膜)，绝对不可使用微波炉烹调或在蒸笼、电饭锅中加热！即使没有接触到也最好去除塑料膜！<img src ="http://www.blogjava.net/jackywjj/aggbug/7343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-08 11:42 <a href="http://www.blogjava.net/jackywjj/articles/7343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>吃肉讲究的五大安全习惯</title><link>http://www.blogjava.net/jackywjj/articles/7344.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 08 Jul 2005 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7344.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7344.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7344.html</trackback:ping><description><![CDATA[　　动检专家指出，人们消费动物产品的安全取决于两方面因素：一个是动物产品本身是否有问题，另一个是消费者是否养成安全消费的好习惯。专家提醒消费者，在有关执法部门严控市场大门阻击劣、病动物产品流入市场的同时，消费者应主要从５方面养成安全食用习惯。 <BR>　&nbsp;第一，尽量选择新鲜肉类食用。与火腿肠、罐头等已加工肉类食品相比，要多食用新鲜肉类，尤其应首选冷却肉，其次是热鲜肉和冷冻肉。与这些新鲜肉类相比，火腿肠、罐头等肉类食品中复合磷酸盐、防腐剂、着色剂、淀粉等添加剂一旦超标，会对消费者身体健康造成或多或少的伤害。 <BR>　&nbsp;第二，生鲜肉要在４摄氏度的温度下保藏，并用保鲜膜包裹。如果购买量较大，需长期放置，最好是冷冻保藏，以确保肉的卫生质量。一旦发现肉及肉制品有味变质，要立即处理掉，以免被误食或污染其他食物。 <BR>　&nbsp;第三，进行烹调时，操作人所用的案板、刀具等一定要清洗干净，同时肉类要生熟分开，以免交叉污染。心、肝、肾等内脏器官是畜禽体内容易发生病变的部位，一定要煮熟、煮透才能食用。 <BR>　&nbsp;第四，不要在没有卫生防疫检验合格证明和从业人员体检健康证明的小摊小店购买熟肉、涮火锅，或消费肉类菜肴。 <BR>　&nbsp;第五、不要在外消费烧烤肉类食品。以烤牛羊肉串、烤鱼和烤鸡翅等为主的烧烤食品，由于肉类在高温下直接燃烧，被分解的脂肪滴于炭上，再与肉类蛋白质结合，产生“苯并芘”强致癌物，危害食用者身体健康。而不卫生和发霉变质的烧烤食品原料很容易传染各种病菌，使人患上如大肠杆菌、痢疾杆菌和肝炎病毒等传染病。<img src ="http://www.blogjava.net/jackywjj/aggbug/7344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-08 11:42 <a href="http://www.blogjava.net/jackywjj/articles/7344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>七类人不宜喝啤酒</title><link>http://www.blogjava.net/jackywjj/articles/7342.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 08 Jul 2005 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7342.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7342.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7342.html</trackback:ping><description><![CDATA[　　啤酒富含糖类、维生素、氨基酸、无机盐等多种营养成分，适量饮用能增进食欲，促进消化、散热解暑和消除疲劳。但是，对酒精过敏或不宜饮酒的人来说，喝啤酒不仅不是一种享受，反而还会带来诸多的麻烦，甚至危及生命。&nbsp; <BR>　　医学研究证明，下列人群应忌饮或慎饮啤酒：&nbsp; <BR>　　1.糖尿病患者1升12度的普通啤酒，产生的热量相当于800毫升牛奶或500克瘦肉，或250克面包。若糖尿病患者大量饮啤酒又不控制其他食物，会使血糖升高，导致酸中毒，使病情恶化。&nbsp; <BR>　　2.高血压患者啤酒中富含酪胺，能促使交感神经纤维中的肾上腺素释放，全身小动脉强烈收缩，使血压剧升，甚至引发高血压危象。&nbsp; <BR>　　3.慢性胃炎患者慢性胃炎患者饮用啤酒可抑制或减少胃黏膜合成前列腺素E，造成胃黏膜损害，引起腹胀、胃部烧灼感、嗳气、食欲减退等。&nbsp; <BR>　　4.孕产妇啤酒是以大麦为原料酿制成的。中医认为，大麦有回乳作用，用其配制的啤酒会抑制乳汁的分泌，影响母乳喂养。再者，酒精会通过脐带或乳汁传递给孩子，影响孩子的大脑发育。&nbsp; <BR>　　5.泌尿系统结石患者据研究，在配制啤酒的麦芽汁中，不但含有钙和草酸，还含有乌核苷酸和嘌呤核苷酸等，它们相互作用，能使人体中的尿酸量增加，促进肾结石的形成。因此，有泌尿系统结石的病人，应尽量少饮甚至不饮啤酒。&nbsp; <BR>　　6.肝病患者有急慢性肝炎的人，其肝脏功能不健全，乙醇和乙酸代谢生成的乙醛，可导致肝细胞坏死或变性，同时也影响肝脏对蛋白质、胆红素、药物等的代谢功能，导致肝病复发或加重。&nbsp; <BR>　　7.服用一些药物者痢特灵、优降宁等药物可增加机体对啤酒的敏感性，引起恶心、呕吐、腹痛、腹泻、呼吸困难等不良反应；此外，啤酒可增强解热镇痛感冒药对胃肠道的刺激作用，因此，在服用上述药物时，应忌饮啤酒。<img src ="http://www.blogjava.net/jackywjj/aggbug/7342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-08 11:41 <a href="http://www.blogjava.net/jackywjj/articles/7342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算机族必喝的健康饮品</title><link>http://www.blogjava.net/jackywjj/articles/7341.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 08 Jul 2005 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7341.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7341.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7341.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7341.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在以计算机维生的人越来越多了，但你知道吗！天天坐在计算机前面想要维系健康美丽，又要与岁月硬撑可不容易，循环不良的坐姿，三不五时的熬夜，若再加上没有吃对食物，时间久了身体可是会向您抗议的哦！<BR>　　这里帮你找出几种最适合计算机族喝的茶饮，或是点心，不但可以帮您对抗辐射的侵害，还可保护您的眼睛，抗烦躁呢！<BR>　　<STRONG>绿豆薏仁汤</STRONG><BR>　　绿豆可以清热解毒、利尿消肿，薏仁则可以健脾止泻，轻身益气，对于经常需要熬夜工作者或是心烦气躁、口干舌燥、便秘、长青春痘时，除了多吃蔬菜水果与补充水份外，把绿豆薏仁汤当点心食用，对于消暑除烦非常有帮助。<BR>　　<STRONG>绿茶</STRONG><BR>　　绿茶是近几年来最为人所津津乐道的养生饮品，因为其中含强效的抗氧化剂儿茶酚以及维他命C，不但可以清除体内的自由基，还能使副肾皮质分泌出对抗紧张压力的荷尔蒙，当然绿茶中所含的少量咖啡因也可以刺激中枢神经，提振精神。最好在白天饮用以免影响睡眠。<BR>　　<STRONG>枸杞茶</STRONG><BR>　　枸杞子含有丰富的β胡萝卜素，维生素B１、维生素C、钙、铁，具有补肝、益肾、明目的作用，因为本身就具有甜味，不管是泡茶或是像葡萄干一样当零嘴来吃对计算机族的眼睛酸涩、疲劳、视力加深的问题都有很大的帮助。<BR>　<STRONG>　菊花茶</STRONG><BR>　　有明目清肝的作用，有些人就干脆菊花加上枸杞一起泡来喝，或是用蜂蜜菊花茶都于疏肝解郁都很有帮助。<BR>　　<STRONG>决名子茶</STRONG><BR>　　决名子有清热、明目、补脑髓、镇肝气、益筋骨的作用，若有便秘的人还可以在晚餐饭后饮用，对于治疗便秘很有效果。<BR>　　<STRONG>杜仲茶</STRONG><BR>　　杜仲具有补血与强壮筋骨的作用，对于经常久坐，腰虽背痛很有帮助，男女都可以喝，若是女性朋友还可以在生理期的末期与四物汤一起服用。&nbsp;<BR><img src ="http://www.blogjava.net/jackywjj/aggbug/7341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-08 11:40 <a href="http://www.blogjava.net/jackywjj/articles/7341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>