rw_《计算机是怎样跑起来的》4-11 章

2016.07.15 - 08.19
《计算机是怎样跑起来的》4-11 章。
- 矢泽久雄 / 著
- 胡屹 / 译
个人学习笔记。

[知识的范围(编程)]

4 程序像河水一样流淌着

问题 & 重点

07.15
初级问题。Flow Chart的中文意思是什么?
[1] 流程图。[来自度娘]

中级问题。请说出自然界中河流的三种流动方式。
[1] 向着一个方向流;流着流着产生支流;卷成旋涡。[读后,实在没懂问题何意]

高级问题。事件驱动是什么?
[1] 是一种触发条件。[读前]
[2] 用户的操作等产生事件后,由事件决定程序的流程。[读后,专业全面多了]

重点。主题是程序的流程(事物进行中的次序或顺序的布置和安排)。程序是流动着的 —— (一核)CPU在同一时刻只能解释、执行一条指令。把指令和作为指令操作对象的数据排列起来就形成了程序。请想象把若干指令一条挨一条地依次排列起来就形成了程序。然后把这条纸带展开抻平,从顶端开始依次解释并执行上面的每条指令,这样看起来程序就好像流动起来了。这就是程序的流程。(但程序的流程不只有这一种)[好有情趣的作者]

4.1 程序的流程分三种

顺序执行。程序从内存中的低地址开始,向着高地址流下去(PC依次保存连续地址)。
循环。循环是在程序的特定范围内反复执行若干次的一种流程。
条件分支。条件分支是根据若干个条件的成立与否,在程序的流程中中产生若干个分支的流程。
[对没学过计算机语言又不结合CPU取指过程者来说,实在抽象]

4.2 用流程图表示程序的流程

流程图。表示程序流程的图。(作者有过的经历,画流程图花费了一个月之久,但是对着流程图专心写程序只需要两天的时间)

流程图符号
rw_《计算机是怎样跑起来的》4-11 章_第1张图片

4.3 表示循环程序块的“帽子”和“短裤”

07.16
机器/汇编语言循环流程图 —— 跳转指令。使用机器语言或汇编语言所提供的跳转指令,就可以将PC寄存器的值设置为任意的内存地址。如果将它的值设为之前执行过的步骤所对应的内存地址,那么就构成了循环。因此表示这种循环的流程图仅仅使用带有菱形符号的图形就可以了。如下图
rw_《计算机是怎样跑起来的》4-11 章_第2张图片

高级语言循环流程图 —— 程序块。在高级语言中,程序员使用“程序块”(程序代码集合)表示循环而不是跳转指令。程序中要被循环处理的部分,就是一种代码块。用程序块表循环的流程图如下
rw_《计算机是怎样跑起来的》4-11 章_第3张图片

4.4 结构化程序设计

07.21
结构化编程设计。就是“为了把程序编写得具备结构性,仅使用顺序执行、条件分支和循环表示程序的流程即可,而不再使用跳转指令(不再使用高级语言中提供的跳转指令,如C的go语句,这样的跳转指令会使程序陷入到流程错综复杂的状态)。”在程序设计的世界中,如果看到了以“结构化”开头的术语,就可以这样认为:程序的流程是由程序块表示的,而不是用go语句等跳转指令实现的。(如果把用高级语言所编写的程序转换成机器语言,像结构化异常处理的语句还是会被转换为跳转指令)

4.5 画流程图来思考算法

算法就是解决既定问题的步骤。想让计算机解决问题,就需要把问题的解决方法转换成程序流程

思考算法。思考算法可以分为两步走,先从整体上考虑程序的粗略流程,再考虑程序各个部分细节的流程。几乎所有的程序从整体来看都具有一个一成不变的流程,那就是“初始化处理”–>“循环处理”–>“收尾处理”。

4.6 特殊的程序流程 —— 中断处理

中断处理。指计算机使程序的流程突然跳转到程序中的特定地方,这样的地方被称为中断处理例程(Routine)或是中断处理程序(Handler),而这种跳转是通过CPU所具备的硬件功能实现的。(平常用的所谓的电脑的中断处理程序内置于ROM中的BIOS中,或是内置于Windows等操作系统中)。

4.7 特殊的程序流程 —— 事件驱动

事件驱动。通常把用户在应用程序中点击鼠标或者敲击键盘这样的操作称作为“事件”(Event)。负责检测事件的是操作系统(应用程序中调用系统调用检测)。而应用程序则根据事件类型做出相应处理。这种机制就是事件驱动。

用便于表示事件驱动的“状态转化图”表示事件驱动程序。状态转化图中有多个状态,反映了由于某种原因从某个状态转化到另一个状态的流程。在状态转化图中,在矩形中协商状态的名称,用箭头表示状态转化的方向,并且在箭头上标注所引起状态转化的原因(事件)。也可以使用“状态转化表”来表示事件驱动的转化。

5 与算法成为好朋友的七个要点

0 问题 & 重点

初级问题。Algorithm翻译成中文是什么?
[1] 算法。

中级问题。辗转相除法是用于计算什么的算法?
[1] 得到数字的每一位。[读前]
[2] 求最大公约数。[读前。哦,对]

高级问题。程序中的“哨兵”指的什么?
[1] 用于作参考的一个值(比如某排序算法中,将当前最小值存在某个变量中,并将该元素放在诸如第一个位置上,这个元素被称为哨兵)。
[2] “哨兵”指的是一种含有特殊值的数据,可用于标识数据的结尾等。[读后]

[有些曾经可能知道的东西,多久没看,怎么就忘了]

重点。程序是用来在计算机上实现现实世界中的业务和娱乐活动的。为了达到这个目的,程序员们需要结合计算机的特性,用程序来实现世界中对问题的处理步骤,即处理流程。在对问题的处理步骤(算法)中,有表示程序整体大流程的算法,也有表示程序局部小流程的算法。本章的重点是表示小流程的算法。

07.26

5.1 算法是程序设计的“熟语”

契机。通常指事物发展过程中的关键、枢纽火决定性的环节。

5.2 要点1:算法中解决问题的步骤是明确且有限的

5.3 要点2:计算机不靠直觉而是机械地解决问题

5.4 要点3:了解并应用典型算法

算法辞典参考。《算法精解:C语言描述》(Kyle Loudon;肖翔,陈珂译);《算法技术手册》(George T.Heineman、Grary Pollice、StanleySelkow;杨晨,李明译)
应该了解的典型算法。辗转相除法(求解最大公约数);埃拉斯托特尼算法( 筛选算法判定素数);顺序查找、二分查找、哈希查找(检索数据);冒泡排序、快速排序(数据排序)。

5.5 要点4:利用计算机的处理速度

5.6 要点5:使用编程技巧提升程序执行速度

5.7 要点6:找出数字间的规律

5.8 要点7:现在纸上考虑算法

画流程图可以很方便地把算法用图表示出来,因此可以大量地、灵活地应用它。如果不想画流程图,也可以用语言把算法描述出来。写成文书,总之先写到纸上这一点很重要。在纸上画完流程以后,再把具体的数据代入以跟踪流程的处理,确认是否能得到预期的结果。

有一本Algrorithms + Data Strctures = Programs(Niklaus Wirth)名著。

6 与数据结构成为好朋友的七个要点

07.29

0 问题 & 重点

初级问题。程序中的变量是指什么?
[1] 程序中的变量对应一块内存,内存大小和被解释的方式跟其类型和限制符有关。
[2] 变量是数据的容器。

中级问题。把若干个数据沿直线排列起来的数据结构叫什么?
[1] 线性 数据结构。
[2] 叫作“数组”。

高级问题。栈和队列的区别是什么?
[1] 栈后进先出,只能在栈顶进行操作;队列先进先出,出操作在队列头,进操作在队尾。
[2] 栈中数据的存取形式LIFO;队列中数据的存取形式是FIFO。

重点。本章的主题是数据结构,也就是如何结合计算机的特性,用程序来表示现实世界中的数据结构。程序员有必要把算法(处理问题的步骤)和数据结构(作为处理对象的数据的排列方式)两者放到一起考虑。

6.1 要点1:了解内存和变量的关系

因为依靠指定地址的方式编写程序很麻烦,所以在C语言、Java、BASIC等几乎所有的编程语言中,都是使用变量把数据存储进内存,或从内存中把数据读出来的。

6.2 要点2:了解作为数据结构基础的数组

数组实际上为了存储多个数据而在内存上集中分配出的一块内存空间,并且为这块空间整体赋予了一个名字。数据是数据结构的基础,之所以这么说是因为数组反映了内存的物理结构本身。

典型数据结构。栈、队列、链表以及二叉树。

6.3 要点3:了解数组的应用 —— 作为典型算法的数据结构

6.4 要点4:了解并掌握典型数据结构的类型和概念

6.5 要点5:了解栈和队列的实现方法

6.6 要点6:了解结构体的组成

6.7 要点7:了解链表和二叉树的实现方法

07.31
请思考一下不使用链表且还要对大量的数据进行排序时应该怎么处理。答案是必须要改变元素在内存上的物理排列顺序了。这不仅要改变大量数据的位置,而且程序的处理时间也会变长。如果使用链表,对元素的排序就只需要变更指针的值。在实际的程序中,为了能够处理大量的数据,都会在各种各样的情境下灵活地应用链表。

二叉树多用于实现那些勇于搜索数据的算法,比如二分查找法。

无论是在哪种编程语言中,数据结构的基础都是数组,因此设法灵活应用数组才是关键。

即便是有了由睿智的学者们提出的那些了不起的算法和数据结构,也不能100%地依赖它们。希望诸位要经常自己动脑思考算法和数据结构。在了解了典型的算法和数据结构(也就是基础)之后,请不要忘记还要灵活地去应用它们。只要诸位灵活地去应用典型算法和数据结构,就能创造出出色的原创作品,而能够创造出原创作品的程序员才是真正的技术者。[快来谨遵前辈教诲]

7 成为会使用面向对象编程的程序员吧

0 问题 & 重点

初级问题。Object翻译成中文是什么?
[1] 对象。

中级问题。OOP是什么的缩写?
[1] Orient Object Programming。
[2] Object Oriented Programming。

高级问题。哪种编程语言在C语言的基础上增加了对OOP的支持。
[1] C++。
++表示自增的C语言运算符。之所以被命名为C++,是因为C++在C语言的基础上增加了面向对象的机制。另外,将C++进一步改良的编程语言就是Java和C#。

重点。笔者想让诸位掌握有关面向对象的概念。理解面向对象编程有着各种各样的方法,程序员们对它的观点也因人而异。在读完本章后,请诸位一定要和朋友或是前辈就什么是面向对象编程展开讨论。

7.1 面向对象编程

OOP。面向对象编程(OOP)是一种编写程序的方法,旨在提升开发大型程序的效率,使程序易于功能的修改和扩展。因此在企业中,特别是管理层的领导们都青睐于开发中使用面向对象编程。因为如果开发效率得以提高、代码易于维护,那么就意味着企业可以大幅度地削减成本(开发费用+维护费用)。甚至可以这样说,即使管理者们并不十分清楚面向对象编程到底是什么,他们也还是会相信“面向对象编程是个好东西”。[有趣]

虽然面向对象编程很麻烦,但笔者还是要讲解一下面向对象编程。因为在未来的开发环境中,将成为主流的不是Java就是.NET(作者写于2003年),而无论选择哪个,面向对象编程的知识都是不可或缺的。这使得在这之前还对其敬而远之的程序员们也不得迎头赶上了,因为他们已经没有退路了。[现在似乎不是这个样子]

的确,精通面向对象编程需要花费大量的时间。所以请诸位先通过阅读本章,掌握一些基础知识,至少能够说出面向对象是什么。然后再为实践面向对象编程而开始踏踏实实的深层学习把。[面向对象编程学些路线]

7.2 对OOP的多种理解方法

计算机辞典。面向对象编程是一种基于以下思路的程序设计方法:将关注点置于对象本身,对象构成要素包含对象的行为及操作(在C语言中,结构体是数据的集合,它将数据捆绑在一起,是的我们可以将这些数据看作是一个整体。而对结构体中的数据进行操作的函数却写在结构体的外部。然而在面向对象编程中,将表示事物行为的函数也放入了这个整体,这就形成了对象的改变,使得整体既能描述属性,又能描述行为),以此为基础进行编程。这种方法使程序易于复用,软件的生产效率因而得以提升。其中所使用的主要编程技巧有继承、封装、多态三种。

从以下7个观点再理解OOP。

7.3 观点1:面向对象编程通过把组件拼装到一起构建程序

组件拼接。在面向对象编程中,使用了一种称为“类”的要素,通过把若干个类组装到一起构建一个完整的程序。从这一点看,可以说类是程序的组件。面向对象编程的关键在于能否灵活地应用类。

。把有关联的函数和变量汇集到一起编程组就形成了类。

7.4 观点2:面向对象编程能够提升程序的开发效率和可维护性

类库。在使用面向对象编程语言开发时,并不是所有的类都必须由程序员亲自编写。大部分类都已内置于面向对象编程语言中了,这些类可以为来自各个领域的程序员所使用。通常将像这样的一组类(一组组件)称作“类库”。

通过利用类库可以提升编程的效率。还有一些类原本是为开发其他程序而编写的,如果可以把这些现成的类拿过来使用,那么程序的开发效率就更高了。

企业级程序。指的是对可维护性有较高要求的程序。可维护性体现在当程序投入使用后对已有功能的修改和新功能的扩充上。

创造类。对于创造类的程序员,他们考虑的是程序的开发效率和可维护性,并决定应该将什么抽象为类。如果一个类的修改导致其他的类就也要跟着修改,这样的设计是不行的。在功能升级后,旧组件能够被新组件所替换的设计也是必不可少的。

接口。类的创造者和使用者之间需要事先商定类的使用规范。对于类的使用者而言“类看起来是什么样子的”这种关于规范的描述通常被称为“接口”(Interface)。

7.5 观点3:面向对象编程是适用于大型程序的开发方法

假设一个程序需要10000个函数和20000个变量,如果这个程序用100个类组织起来,那么平均一个类里就只有100个函数和200个变量。程序的复杂度就降到了原来的1%。[类创造和和调用者]

为了拉近计算机和人的距离,使计算机成为更容易使用的机器,围绕着计算机的各种技术都在不断发展。在人的直觉中,大件物品都是由组件组装起来的。因此可以说面向对象编程方法把同样的直觉带给了计算机,创造了一种顺应人类思维习惯的先进的开发方法。[我似乎低于一般人之下]

7.6 观点4:面向对象编程就是在为现实世界建模

程序可以在计算机上实现现实世界中的业余和娱乐活动。计算机本身并没有特定的用途,而是程序赋予了计算机各种各样的用途。在面向对象编程中,可以通过“这个是由什么样的对象构成的呢?”这样的观点来分析即将转换成程序的现实世界。这种分析过程叫作“建模”。可以说建模对于开发者而言,反映的是他们的世界观,也就是在他们的眼中的现实世界看起来是什么样子的。[水平高低,由此而分;而我是低于一般人之下的]

在实际建模的过程中,要进行“组件化”和“省略化”这两步。所谓组件化,就是将可看作是由若干种对象构成的集合的显示世界分割成组件,因为并不需要把现实世界100%地搬入到程序中,所以就可以忽略掉其中一部分事物。

7.7 观点5:面向对象编程可以借助UML设计程序

UML。可以说,建模就是在为面向对象编程做设计。为了把现实世界建模的结果以图形的形式表示出来,还经常使用被称作UML(Unified Modeling Language,统一建模语言)的表记方法。UML是通过统一历史上曾经出现的各种各样的表记方法而发明出来的,事实上UML已经成为了建模表记方法中的世界标准。

UML中规定的9种图。

名称 主要用途
用例图(Use Case Diagram) 表示用户使用程序的方式
类图(Class Diagram) 表示类以及多个类之间的关系
对象图(Object Diagram) 表示对象
时序图 从时间上关注并表示多个对象间的交互
状态图(Statechart Diagram) 表示对象状态的变化
活动图(Activity Diagram) 表示文件以及多个文件之间的关系
配置图(Deployment Diagram) 表示计算机或程序的部署配置方法

UML仅仅规定了建模的表记方法,并不专门用于面向对象编程(可以使用UML中的“时序图”和“协作图”表示面向对象编程程序的运行过程)。

面向对象编程设计。在进行面向对象编程的设计时,要在一开始就把所需的类确定下来,然后再在每个类中列举出该类应该具有的函数和变量,而不要到了后面才把零散的函数和变量组织到类中。也就是说,要一边观察作为程序参照物的现实世界,一边思考待解决的问题是由哪些事物(类)构成的。正因为在设计时要去关注对象,这种编程方法才被称为OOP。在传统的开发方法中,进行设计则是要先考虑程序应该由什么样的功能和数据来构成,然后理解确定与之相应的函数和变量。与此相对在面向对象编程的设计中,一上来就要确定有哪些类,从而构成程序的函数和变量就必然会被组织到类中。

7.8 观点6:面向对象编程通过在对象间传递消息驱动程序

消息传递。通过由一个对象去调用另一个对象所拥有的函数。这种调用方式被称为对象间的“消息传递”。

7.9 观点7:面向对象编程中使用继承、封装和多态

面向对象编程的三个基本特性继承(Inheritance)指的是通过继承已存在的类所拥有的成员而新生的类;封装(Encapsulation)指的是在类所拥有的成员中,隐藏掉那些没有必要展现给该类调用者的成员;多态(Polymorphism)指的是针对同一种消息,不同的对象可以进行不同的操作(注意类和对象的区别)。

很多人会被所学到的语法结构和编程技术中所涉及的大量知识所束缚,以致不能按照自己的想法编写程序

只要去继承已存在的类,就能高效地生成新的类。如果一个类被多个类所继承,那么只要修正了这个类,就相当于把继承了这个类的所有类都修正了。只要通过封装把外界不关心的成员隐藏起来,类就可以被当作黑盒子,变成了易于使用且便于维护的组件了。而且由于隐藏起来的成员不能被外界所访问,所以也就可以放心随意地修改这些成员。只要利用了多态生成对同一个消息可以执行多种操作的一组类,使用这组类的程序员所需记忆的东西就减少了。总之,无论是那一点,都是面向对象编程带来的好处,都可以实现开发效率和可维护性的提升。[对面向对象编程三个基本特性的理解与掌握]

7.10 类和对象的区别

在面向对象编程中,类和对象被看作是不同的概念而予以区别对待。类是对象的定义,而对象是类的实例(Instance,类在内存上的一个副本,这个副本就是对象)。

7.11 类有三种使用方法

定义类。即创建类,该种程序员需要考虑类的复用性、可复用性、如何对现实世界建模以及易用性等,而且还要把相关的函数和变量汇集到类中。
而使用类的程序员可以通过三种方法使用类。[1] 仅调用类所持有的个别成员(函数和变量);[2] 在类的定义中包含其他的类(这种方法被称为组合);[3] 通过继承已存在的类定义出新的类。

7.12 在Java和.NET中有关的OOP的知识不能少

框架。Java和.NET其实是位于操作系统之上,旨在通过隐藏操作系统的复杂性从而提升开发效率的程序集,这样的程序集也被称为框架。框架由两部分组成,一部分是负责安全执行程序的“执行引擎”,另一部分是作为程序组件集合的“类库”。
rw_《计算机是怎样跑起来的》4-11 章_第4张图片
[盗课本中的图示框架位置]

无论是使用Java还是.NET,都需要依赖类库进行面向对象编程。在Java中,使用的是与框架同名的Java语言。而在.NET中,使用的是.NET框架支持的C#、Visual Basic.NET、Visual C++、NetCOBOL等语言进行开发。

不要把面向对象当成一门学问。程序员是工程师,工程师一种亲身参与的活动而不是一门学问。请诸位把面向对象编程作为一种能提升编程效率、写出易于维护的代码的编程方法,在适当的场合实践面向对象编程,而不要被它各种各样的概念以及所谓的编程技巧所束缚。[作者是领导哦]

[数据库]

8 一用就会的数据库

08.02

0 问题 & 重点

初级问题。数据库术语中的“表”是什么意思?
[2] 表示被整理成表格形式的数据。一张表由若干个列和行组成。列也被称为字段(Filed)(也被称为列或属性),行也被称为记录(Record)(记录有时候也被行或元组)。

中级问题。DBMS是什么的简称?
[1] Database Management Studio
[2] Database Management System
市面上的DBMS有SQL Sever、Oracle、DB2等。无论是哪种DBMS都可以用基本相同的SQL语句操作。

高级问题。键和索引的区别是什么?
[2] 键用于设定表和表之间的关系,而索引是提升数据检索速度的机制。
其上每个值都能够唯一标识一条记录的字段称为主键。为了在表和表之间建立关系而在表中添加的、其他表主键的字段称为外键。而索引是与键无关的机制。

[关于数据库的知识,的确知道得少点]

重点不仅是数据库,其他计算机技术也一样,不实际地应用,就不能充分掌握。首先介绍数据库的概况,然后通过文字的描述,请诸位体验一下编写简单的数据库应用程序的过程。这样就不但能理解数据库术语的含义,而且还能灵活应用这些知识了。(本章所介绍的方法只是其中一种)

8.1 数据库是数据的基地

数据库。所谓数据库就是数据的基地(虽然使用纸质文件整理出来的数据也可以称为数据库,但是利用善于处理数据的计算机整理会更加方便。因为计算机是提高手工工作效率的工具,所以就成为了数据的基地)。

关系型数据库。适合存储大规模数据的是关系型数据库(Relational Database)。在关系型数据库中,数据被拆分整理到多张表中,同时表与表之间关系也可以被记录下来。

8.2 数据文件、DBMS和数据库应用程序

DBMS。数据库的实质虽然是某种数据文件,但是诸位编写的应用程序并不是直接去读写这些数据文件,而是以DBMS为中介间接地读写。DBMS不但可以使应用程序轻松地读写数据文件,而且还具有“一致并且安全地存储”数据的功能。
rw_《计算机是怎样跑起来的》4-11 章_第5张图片
[盗取书中图片]

数据库系统的构成要素。“数据库文件”“DBMS”“应用程序”三部分。在小型系统中,把三个要素全部部署到一台计算机上,称作“独立型系统”。在中型系统中,把数据文件部署在一台计算机上,并且使数据文件被部署了DBMS和应用程序的多态计算机共享,这样的系统被称为“文件共享型系统”。在大型系统中,把数据文件和DBMS部署在一台(或者多台)计算机上,然后用户从另外一些部署着应用程序的计算机上访问,这样的系统被称作“客户端/服务型系统”。其中部署着数据文件和DBMS的计算机是服务器;部署着应用程序的计算机是客户端。如果把服务器和客户端之间用互联网联结起来,就形成了Web系统。在Web系统中,一般情况下应用程序也是部署在服务器中的,在客户端只部署Web浏览器。
rw_《计算机是怎样跑起来的》4-11 章_第6张图片
[盗取书中图片]

rw_《计算机是怎样跑起来的》4-11 章_第7张图片
[盗取书中图片]

8.3 设计数据库

设计数据库第一步是从“你想要了解什么”的视角出发找出需要的数据。

08.08
数据库的使用者决定存储的数据是否够用。如果缺少了所需的数据,就算使用了数据库,也不能使其发挥作用。反过来,如果包含了不必要的数据,存储包含着这些数据的文件就会白白浪费掉磁盘空间。

[2] 把必要的数据筛选出来以后,下一步要考虑的是各种数据的属性。属性也称作模式(内模式),具体来说就是数据的类型(是数字还是字符串),数字的话是整数还是浮点小数,字符串的话最多允许包含多少个字符,是否允许NULL值(表示未知或者不存在的值)。

几乎所有的DBMS都提供了通过可视化界面设置数据属性的工具。通过这种工具,既可以生成逻辑上的表,又可以生成物理上存储数据的文件

8.4 通过拆表和整理数据实现规范化

将生活中的数据录入表中时可能会有以下问题:
[1] 用户多次录入相同的数据(录入重复数据不仅使应用程序的操作变得繁琐,更白白浪费了磁盘空间)
[2] 录入的名称不同指代的却是相同的商品(有时候输入错误)。

如果只使用一张表,就会和应用卡片型数据库(每条记录对应一张卡片)时面临相同的问题。

规范化。为了解决以上描述的问题,在设计关系数据库时,还要进行“规范化”。所谓规范化,就是将一张大表分割成多张小表,然后再在小表之间建立关系,以此来达到整理数据库结构的目的。(DBMS提供了可视化工具,用户仅仅通过简单的操作就可以进行规范化)规范化的要点是在一个数据库中要避免重复存储相同的数据

8.5 用主键和外键在表间建立关系

为了在表间建立关系,就必须加入能够反映表与表之间关系的字段,为此所添加的字段就被称为键(Key)。首先要在各个表中添加一个名为主键(Prime Key)的字段,该字段的值能够唯一地标识表中的一条记录(所以,主键中不能存储相同的值,否则DBMS会产生错误提示)。(主键既可以只有一个字段充当,也可以将多个字段组合在一起形成复合主键)
其它表中的主键对于本表来说就可以是“外键”。通过主键和外键上相同的值,多个表之间就产生了关联,就可以顺藤摸瓜取出数据。

表之间的关系使记录和记录关联了起来。记录之间虽然在逻辑上有一对一、对对多以及一对多的关系,但是在关系型数据库中无法直接表示多对多关系。当出现多对多关系时,可以在这两张表之间再加入一张表,把多对多关系分解成两个一对多关系

DBMS具有检查参照完整性的功能,这种机制是为了一致并且安全地存储数据(如在表中删除了某项记录,再对其它表中操作关于此项记录的操作就会受到DBMS的拒绝,若选择了参照完整性功能的话)。

8.6 索引能够提升数据的检索速度

08.10
索引表。索引仅仅是提升数据检索和排序速度的内部机制。一旦在字段上设置了索引,DBMS就会自动为这个字段创建索引表。索引表是一种数据结构,存储着字段的值以及字段所对应记录的位置(所对应的记录在数据文件中的位置)。与原来的表相比,索引表中的字段数更少,所以可以更快地进行数据的检索和排序。当查询数据时,DBMS先在索引表中进行数据的检索和排序,然后再根据位置信息从原来的数据表中把完整的记录取出来。索引所起的就是“目录”的作用。

一旦设置了索引,每次向表中插入数据时,DBMS都必须更新索引表。提升数据检索和排序速度的代价,就是插入或更新数据速度的降低。因此,只有对那些要频繁地进行检索和排序的字段,才需要设置索引。

8.7 设计用户界面

数据库的设计过程:了解数据库客户需求、通过拆表实现规范化(避免数据重复)、设置主键和外键(建立拆表之间的关系)、确保没有多对多关系、根据需要设置参照完整性和索引。

在设计系统时,请诸位记住一个重要的顺序:优先设计数据库,然后再设计用户界面。数据库应用程序只要能够对记录进行CRUD的操作就可以了。

CRUD。对数据库进行操作的种类通常称为CRUD。CRUD由以下四种操作的英文名称的首字母组成,即记录的插入(CREATE/INSERT)、获取(REFER)、更新(UPDATE)、删除(DELETE)。

8.8 向DBMS发送CRUD和操作的SQL语句

访问数据库的中介是DBMS。为了对数据库进行CRUD操作,就必须向DBMS发送命令,即SQL语言(Structural Query Language,结构化查询语言)。

8.9 使用数据对象向DBMS发送SQL语句

在windows应用程序中,向DBMS发送SQL语句时,一般下使用的都是被称为数据对象(Data Object)的软件组件。一般的开发工具中也都包含了数据对象组件[在Visual Basic 6.0中,使用的是被称为ADO(ActiveX Data Object,ActiveX数据对象)的数据对象]。

[ADO是以下几个类的统称,其中包括用于建立和DBMS连接的Connection类,向DBMS发送SQL语句的Command类以及存储DBMS返回结果的Recordset类等。]

8.10 事物控制也可以交给DBMS处理

事物。事物由若干条SQL语句构成,表示对数据库一系列相关操作的集合。如从顾客A的账户中给顾客B的账户中汇入1块钱,就需要将以下两条SQL语句依次发送给DBMS:[1] 把A的账户余额更新(UPDATE语句)为现有余额减去1块钱;[2] 把B的账户余额更新(UPDATE语句 )为现有余额加上七块钱。此时这两条SQL语句就构成了一个事物。

假设在第一条SQL语句执行后,网络或计算机发生了故障,第二条SQL语句无法执行,那么会发生什么呢?A的账户余额虽然减少了一块钱,但是B的账户余额却没有相应的增加一块钱,这就导致了数据不一致。为了防止出现这种问题,在SQL语言中设计了以下三条语句:
[1] BEGIN TRANSACTION(开启事物)语句,用于通知DBMS开启事务;
[2] COMMIT(提交事务)语句,用于通知DBMS提交事务;
[3] ROLL BACK(事务回滚)语句,用于在事物进行中发生问题时,把数据库中的数据恢复到事物开始前的状态。

[网络]

9 通过七个简单的实验理解TCP/IP网络

08.11

0 问题 & 重点

初级问题。LAN是什么的缩写语?
[2] Local Area Network(局域网)。通常把在移动建筑物内或是一间办公室的那种小规模网络称作LAN。与此相对,把互联网那样的大规模网络称作WAN(Wide Area Network,广域网),如把企业和企业联结起来的大规模网络。

中级问题。TCP/IP是什么的缩写语?
[2] Transmission Control Protocol/Internet Protocol(传输控制协议和网际协议)。TCP/IP协议族是互联网的一套标准协议。TCP/IP这个名字意味着同时使用了TCP协议和IP协议。

高级问题。MAC地址是什么?
[2] MAC地址就是能够标识网卡的编号。几乎所有的网卡都会在上市前被分配一个不可变更的MAC地址。

重点。通常,人们把通过连接多台计算机所组成的、可用于交换信息的系统称为“网络”(Network)。互联网是网络的一种,可以使我们的计算机和远在千里之外的计算机连接在一起。因为信息可以以电信号的形式在网线中传播,所以计算机彼此之间就能够进行信息交换。但为了交换信息,还必须在发送者和接收者之间事先确定发送方式。这种对信息发送方式的规定或约束就称为“协议”(Protocol)。

9.1 实验环境

集线器。“集线器”(Hub)是负责把各台计算机的网线连接在一起的集线设备。
路由器。“路由器”(Router)是负责把局域网和互联网连接起来的设备。路由器负责将LAN连接到WAN上。路由器的一端会先连接到互联网服务提供商的路由器上。而在服务提供商那里,又会继续将他们的路由器连接到其他路由器上,通过这种方式最终接入到互联网的主干线缆上。
(以企业内的LAN为一个基本单位,通过服务提供商的路由器把它们和其他企业LAN互联起来,而把这种联结方式延伸至世界各个角落的正是互联网。把像LAN这样的一张张小网都联结起来,就能织成一张叫作互联网的大网。)

9.2 实验1:查看网卡的MAC地址

网络也是硬件和软件的集合体。[1] 网卡(NIC,Network Interface Card);[2] 插到网卡上的网线;[3] 汇集网线的集线器;[4] 用于接入互联网的路由器。(这些硬件要相互匹配才能连接到一起),一旦硬件的规格一致,其中传输的电信号的形式也就一致了。

CSMA/CD(Career Sense Multiple Access with Collision Detection,带冲突检测的载波监听多路访问)。以太网使用了一种略显粗糙的方法连接LAN内的计算机。以太网中的每台计算机都需要先确认一件事情:在网线上有没有其他的计算机正在发送自己想传输的电信号。谁先抢到了网线的使用权,谁就先发送。万一遇到了多台计算机同时都想发送电信号的情况,只需要让这些计算机等待一段长度随机的时间后再重新发送相同的电信号即可。

在以太网中,发送给一台计算机的电信号也可以被其他所有的计算机收到。一台计算机收到了电信号以后会先作判断,如果是发送给自己的则接收,反之则选择忽略。可以用被称作MAC(Media Access Control)地址的编号来指定电信号的接收者。在每一块网卡所带有的ROM中,都预先烧录了一个唯一的MAC地址(MAC地址是由制造厂商的编号和产品编号两部分组成的,所以世界上的每一个MAC地址都是独一无二的)。
[在Windows的命令提示符cmd中,输入”ipconfig /all”(不同Windows OS可能有差异)的命令可查看MAC地址:物理地址后显示的是MAC地址(制造商编号,产品编号)]

9.3 实验2:查看计算的IP地址

不使用MAC地址标识计算机的原因。MAC地址虽然可以在硬件层面上标识网卡,可是如果只有MAC地址也很不方便。因为企业或组织需要对计算机分组管理,但是他们却没有办法把MAC地址前面的若干位统一起来。而且在互联网那种把全世界的计算机都连接在一起的大型网络中,又必须有一种机制能够把数据的发送目的地像邮政编码那样整理并标识出来。加入在互联网中智能使用MAC地址,那么会发生什么呢?在接入互联网的数量的众多计算机中,只有尚未进行任何分组处理的编号(MAC)。这样的话,仅仅是寻找信息的发送目的地就要花费大量的时间。

08.12
IP地址。IP地址是为每台计算机设定的一个软件编号。[通常把设定了IP地址的计算机称为“主机”(见后续描述)。因为路由器也算是计算机的一种,所以它们也有IP地址。在TCP/IP网络中,传输的数据都会携带MAC和IP两个地址。IP地址是一个32比特的整数,每8比特为一组,组间用“.”分隔,分成4段表示。8比特所表示的整数算成十进制后范围是0 ~ 255,因此可用作IP地址的整数时0.0.0.0 ~ 255.255.255.255,共计4294967296个。通过IP地址就可以轻松地对计算机进行分组管理了。比如用IP地址中的第一段到第三段的数值代表公司,用第四段的数值代表公司内部的计算机。例如,在AAA.BBB.CCC这个公司内,如果有一台计算机的编号为XXX,那么它的IP地址就是AAA.BBB.CCC. XXX。而看到了AAA.BBB.CCC.YYY这样一个IP地址,就能知道它是这个公司内的另外一台计算机。通常把IP地址中表示分组(即用来确定一个LAN)的部分称为“网络地址”、表示各台计算机(即用来确定一台主机)的部分称为“主机地址”。在本例中,AAA.BBB.CCCC这一部分是网络地址,而XXX或YYY的部分是主机地址。

在windows中的命令提示符(cmd)中输入”ipconfig /all”命令,查看IP地址和子网掩码两部分。子网掩码的作用是标识出在32比特的IP地址中,从哪一位到哪一位是网络地址,从哪一位到哪一位是主机地址。在子网掩码中,值为1的那些位对应着IP地址中的网络地址,后面值为0的那些位则对应着主机地址。[如255.255.255.240这个子网掩码即11111111.11111111.11111111.11110000,其对应的IP地址前28比特是网络地址,后4比特是主机地址。4个二进制数可以表示的范围是从0000到1111,共16个数。最开始的0000和最后的1111具有特殊的用途,所以该子网掩码下最多允许配置14个计算机,其主机地址范围从001到1110,若其中一个IP地址要分配给路由器,则最多只能再配置13台计算机主机。跟MAC地址一样,每个IP地址的值也是独一无二的。

9.4 实验3:了解DHCP服务器的作用

08.12
DHCP(Dynamic Host Configuuration Protocol,动态主机配置协议)。[若在“Internet 协议(TCP/IP)属性”对话框中选择“自动获得IP地址” 这个选项,这个选项会使得计算机在启动时会去从DHCP服务器获取IP地址和子网掩码,并自动配置它们。] DHCP服务器记录着可以被分配到LAN内计算机的IP地址值和子网掩码的值。作为DHCP客户端的计算机在启动时,就可以知道哪些地址还没有分配给其他的计算机。

“Internet 协议(TCP/IP)属性”对话框中的“默认网关”的值一般为路由器的IP地址(路由器是LAN到互联网的入口),路由器的IP地址也可以从DHCP获得。一般可以设置自动获取的选项的值都可以从DHCP服务器中获取。

9.5 实验4:路由器是数据传输过程中的指路人

路由器。路由器就是决定数据传输路径的设备。当一个LAN中的计算机A向另一个LAN中的计算机B发送数据时,B中的IP地址会被附加到A所发送的数据的发送目的地字段上(在每个计算机上线/启动时,其IP地址会被获取)。这样的数据会被A所在的LAN中的其他计算机忽略,但不会被A所在的LAN中的路由器忽略。因为路由器的工作原理就是查看附加到数据上的IP地址中的网络地址部分,只要发现这个数据不是发送给LAN内计算机的,就把它发送到LAN外,即互联网的世界中。

路由表。“路由表”用来记录应该把数据转发到哪里。在一台路由器的路由表中,只会记录通往与之相邻的路由器的路径,而并不会记录世界范围内的所有传输路径。

在Windows的cmd.exe中输入”route print”命令,可查看路由表:
rw_《计算机是怎样跑起来的》4-11 章_第8张图片
路由表由网络目标(Network Destination)、网络掩码(Netmask)、网关(Gateway)、接口(Interface)、跃点数(Metric)5列组成。前四列记录着数据发送的目的地和路由器的IP地址等信息。Metric这一项记录着路径的权重,这个值由某种算法决定,比如数据传输过程中经过的路由器的数量。如果遇到有多条候选路径都可以通往目的地的情况,路由器就会选择Metric值较小的那条路径。在路由表中还有以下规则:如果数据的发送目的地就在LAN中,则可以直接发送数据而无需经过路由器转发;反之如果在LAN外(或发送目的地的IP地址不在路由表中),则需要经过路由器转发。

9.6 实验5:查看路由器的路由过程

08.18
路由。通常把数据经过路由器转发的过程称为“路由”。
[在Windows的命令行窗口中执行“tracert 主机名或计算机名”命令可以查看路由的过程:执行命令的计算机所在的LAN的路由器(的IP地址);该LAN接到外界所租用的互联网提供商的路由器(的IP地址);其它服务提供商的路由器(的IP地址);所访问主机地址所在LAN所租用的互联网提供商的路由器(的IP地址);所访问的主机所在LAN的路由器(的IP地址);所访问主机的IP地址]

9.7 实验6:DNS服务器可以把主机名解析成IP地址

DNS。在互联网中存在一种叫作DNS(Domain Name System,域名系统)的服务器。该服务器将www.baidu.com这样的字符串解析为了百度网站所对应的IP地址。

FQDN。诸位的计算机都有一个主机名,每个LAN也都有一个域名。把主机名和域名组合起来就形成了能够标识一台计算机的独一无二的名字,这个名字与IP地址的作用是等价的。通常把这种主机名和域名组合起来的名字称作FQDN(Fully Qualified Domain Name, 完整限定域名)。

[在互联网中,难以记忆的IP地址使用起来很麻烦。于是人们就发明出了DNS服务器,这样只需要使用FQDN,DNS服务器就可以自动地把它解析为IP地址了(这个过程叫作“域名解析”)。DNS通常被部署在各个LAN中,里面记录着FQDN和IP地址的对应关系表。世界范围内的DNS服务器是通过相互合作运转起来的。如果一台DNS服务器无法解析域名,它就会去询问其他的DNS服务器。]

[在Windows中(不同版本可能命令有所不同),使用hostname可以查看主机名;使用ipconfig /all可查看到DNS域名(Host Name后面是主机名;DNS Suffix Search List后面的就是域名)。也可以通过访问DNS访问到其它域名下对应的IP地址(如输入nslookup命令后,输入一个域名回车后就会显示出该域名所对应的IP地址)。]

9.8 实验7:查看IP地址和MAC地址的对应关系

ARP。在互联网的世界中,到处传输的都是附带了IP地址的数据。但是能够标识作为数据最终接收者的网卡的,还是MAC地址。于是在计算机中就加入了一种程序用于实现IP地址到MAC地址的转换。这种功能被称为ARP(Address Resolution Protocol,地址解析协议)。

9.9 TCP的作用及TCP/IP网络的层级模型

TCP/IP表示在网络上同时使用了TCP和IP这两种协议。IP协议用于指定数据发送目的地的IP地址以及通过路由器转换数据。而TCP协议则用于通过数据发送者和接收者相互回应对方发来的确认信号,可靠地传输数据。通常把像这样的数据传送方式称作“握手(Handshake)”。**TCP协议中还规定,发送者要先把原始的大数据分割成以“包”(Packet)为单位的数据单元,然后再发送,而接收者要把收到的包拼装在一起还原出原始数据。

协议可以和约束等同起来,正因为发送者和接收者都遵循了相同的约束,双方才能够相互发送数据。为了能够在约束下发送数据,操作系统将实现了TCP/IP等协议的程序作为自身的一部分功能提供。遵循约束表现在统一数据的格式上。例如,诸位敲打键盘输入的电子邮件正文等数据,并不是原封不动地发送出去的,而是先通过实现了TCP协议的程序附加上TCP约束所需的信息,然后再通过实现了IP协议的程序,进一步附加了遵守IP约束所需的信息。实际上计算机发送的是以包为单位的、附加了各种各样信息的数据。
rw_《计算机是怎样跑起来的》4-11 章_第9张图片

硬件上发送数据的是网卡。在网卡之上是设备驱动程序(用于控制网卡这类硬件的程序),设备驱动之上是实现了IP协议的程序,IP程序之上则是实现了TCP协议的程序,而再往上才是应用程序,比如Web或电子邮件。TCP协议使用被称作“TCP端口号”的数字识别上层的应用程序。TCP端口号中有一些事预先定义好的,比如Web使用80端口,电子邮件使用25端口(用于发送)和110端口(用于接收)。
rw_《计算机是怎样跑起来的》4-11 章_第10张图片

10 试着加密数据吧

0 问题 & 重点

初级问题。通常把还原加密过的文件这一操作叫作什么?
[1] 解密。

中级问题。在字母A的字符编码上加上3,可以得到哪个字母?
[1] C
[2] D [A B C D]

高级问题。在数字签名中使用的信息摘要是什么?
[2] 信息摘要是指从作为数字签名对象的文件整体中计算出的数值。[对比由文件整体计算出的信息摘要,可以证明文件的内容有没有被篡改。加密处理过的信息摘要就是数字签名。没听懂,因为我对数字签名无体会]

重点。在互联网中,由于它联结的是全世界范围的企业和个人,所以会面临很多需要对数据进行加密处理的情况。举例来说,在网店购物时用户输入的信用卡卡号,就是应该被加密传输的代表性数据。假设卡号未经家吗就被发送出去,那么就会面临卡号被同样接入互联网的某人盗取(这个过程可以看成是修改了TCP/IP程序:就算发送者不是发给我的数据,我也可以接收)。因此像这种网店页面的URL,通常都是以http://开头,表示数据正在使用加密的方式进行传输。

10.1 先来明确一下什么是加密

字符编码。每个字符都被分配了一个数字(而存储在电脑中,用高低电平序列表示该数字),这个数字就是该数字的字符编码。定义了应该把哪个编码分配给哪个字符的字符编码体系叫作字符集

明文。把未经加密的文本数据称为明文。
密文。对明文加密后的数据就成了密文。

[虽然存在各种各样的加密技术,但是其中的手段无外乎还是字符编码的变换,即将构成明文的每个字符分别变换成其他的数值。通过反转这种变换过程,加密后的文本数据就可以还原。通常把密文还原成明文的过程称为解密]

10.2 错开字符编码的加密方式

密钥。一种简单的加密/解密过程:将文本数据中每个字符所对应的字符编码一律向后错三个,即给原字符编码的值加上3;解密时只需要将所得到的文本中的字符像前挪三个就可以实现解密。也就是说,加上3就是加密,减去3就是解密。因此通常把像3这样用于加密和解密的数字称作密钥。[用XOR运算进行加密和解密是密钥的一个经典体现 —— 可以把加密、解密的过程告知天下,只需要保密密钥即可(只要密钥够长,就很难被破解)]

10.3 密钥越长,解密越困难

一般情况下,会将所使用的加密方式公开,而只对密钥的值保密(为啥子)。

在互联网上经过加密的数据也难免被盗,因此就要先设法做到即使数据被盗了,其内容也难以被破解。

以XOR加密方式为例。假若仅用一位数作为密钥,那么只需要从0到9尝试十次就能破解密文。但是如果使用三位数的密钥,那么就有从000到999的1000种可能。如果更进一步把密钥的位数增长到10位,破解者就需要尝试10的10次方 = 100亿次。就算使用了1秒钟就可以进行100万次尝试的计算机,破解密文也需要话费100亿次 / 100万次 = 10000 s 约等于2.78小时。密钥每增一位,破解时间就会翻10倍。

10.4 适用于互联网的公开密钥加密技术

对称密钥加密技术(秘密密钥加密技术)。这种加密技术的特征是在加密和解密的过程中使用数值相同的密钥。因此,要使用这种技术,就必须事先把密钥的值作为只有发送者和接收者才知道的秘密保护好。[发送者如何才能把密钥悄悄地告诉接收者呢?若使用了某种办法,那么有多少个用户就要发多少次密钥]

公开密钥加密技术。在公开密钥加密技术中,用于加密的密钥可以公开给全世界,因此称为公钥,而用于解密的密钥是只有自己才知道的秘密,因此称为私钥。举例来说,作者的公钥是3,私钥是5(实际中会把更复杂的数字作为一对密钥使用)。作者就会向全世界公告其公钥是3。这之后当诸位要向作者发送数据时,用公钥3对数据进行加密。而作者收到该加密数据后,使用私钥5就可以对数据进行解密(而其他人并不知道该私钥,所以不能对该数据进行解密)。[其中,RSA算法就是公开密钥加密技术中的一种]

10.5 数字签名可以证明数据的发送者是谁

按照以下步骤生成数字签名。

【文本数据的发送者】
[1] 选取一段明文,如NIKKEI
[2] 计算出明文内容的信息摘要(一个数值,通过对构成明文的所有字符的编码进行某种运算就能得出该数值)。如(78 + 73 + 75 + 75 + 69 + 73) % 100 = 43(前括号的数字为字符对应的编码)
[3] 用私钥对计算出的信息摘要进行加密。如43 –> 66(字符B的编码)
[4] 把步骤[3]得出的值附加到明文后面再发送给接收者

【文本数据的接收者】
[1] 用发送者的公钥对信息摘要进行解密。66 –> 43
[2] 计算出明文部分的信息摘要。(78 + 73 + 75 + 75 + 69 + 73) % 100 = 43
[3] 比较在步骤[1]和[2]中求得的值,二者相同则证明接收的信息有效。

11 XML究竟是什么

0 问题 & 重点

08.19
初级问题。XML是什么的缩写?
[2] Extensible Markup Language,可扩展标记语言。 所谓标记语言,就是可以用标签为数据赋予意义的语言。

中级问题。HTML和XML的区别是什么?
[2] HTML是用于编写网页的标记语言。XML是用于定义任意标记语言的元语言。通常把用于定义新语言的语言称为元语言。通过XML可以定义出各种各样的新语言。

高级问题。在处理XML文档的程序组件中,哪个称为了w3c的推荐标准?
[2] DOM(Document Object Model,文档对象模型)。

重点。为了不至于对进化后的XML形态感到吃惊,趁着现在我们就先来整理一下XML的基础知识吧。

11.1 XML是标记语言

标签。用“ < ”和“ > ”括起来的单词。如< html > 、< head >。

标记标签被赋予了意义,如< head >表示网页的头部。通常把通过添加标签为数据赋予意义的行为称为“标记”。

标记语言。给数据赋予意义的行为定义规则的语言就是“标记语言”。HTML适用于编写网页的标记语言,更简单的说法就是HTML决定了可用于编写网页的标签。可使用的标签的种类决定了标记语言的规范。Web浏览器会对HTML的标签进行解析,把由它们标记的信息渲染成视觉上可以阅读的网页。

11.2 XML是可扩展语言

可扩展。XML本身并不限定标签的种类,反倒是允许XML的使用者随心所欲地创建标签。也就是说,在“ < ” 和 “ > ”中的单词可以是任意的。这就是所谓的“可扩展”。HTML是固定的可标记语言(规定了标签的种类)。

11.3 XML是元语言

XML约束
rw_《计算机是怎样跑起来的》4-11 章_第11张图片

XML标签是元语言。XML并没有限定标签的内容,只是限定了XML进行标记时标签的书写格式(XML约束)。根据XML约束可以随意定义标签种类。也就是说通过定义要使用的标签种类,就可以创造出一门新的标记语言。(表达稍显牵强)

11.4 XML可以为信息赋予意义

网页。网页是指使用HTML规定好的标签,将字符串和图片显示在Web浏览器上的页面。(HTML中规定的各种标签只能用来指定信息的呈现样式,而不能表示信息的含义。想想定义表格的标签)

而XML可以用标签标记信息的含义。(解析XML的程序解析XML标签和所标记的信息对)

W3C(World Wide Web Consortium,万维网联盟)。该机构以“W3C推荐标准”形式制定了一些列标准。XML于1996年成为了W3C的推荐标准。

11.5 XML是通用的数据交换格式

W3C的推荐标准并不依赖于特定厂商的通用规范。如果某家厂商的某个应用程序把数据保存到了XML文件中,那么其他厂商的另一个应用程序就可以通过加载这个XML文件来使用数据(前提是知道这些标签所代表的含义或使用解读XML文件的接口)。

CSV。在CSV文件中,记录的是经过“, ”分割后的信息。它也是仅由字符构成的纯文本文件。

11.6 可以为XML标签设定命名空间

XML命名空间的由来。主要是为了防止形同异义带来的混乱。如有的将< cat>标签解析为猫,有的将该标签解析为链接。

XML命名空间。所谓命名空间,通常是一个能代表企业或个人的字符串,用于修饰限定标签的名字。在XML文档中,通过把“xmlns= “命名空间名字””作为标签的一个属性记述,就可以为标签设定命名空间。通常用全世界唯一的标识符作为命名空间的名称(如公司的URI)如

<cat xmlns=”http://www.lxr.com/zlsbjz”?> 5月 cat>

这样的话,就可以与使用了其他命名空间的 cat 标签相区分了。

11.7 可以严格地定义XML的文档结构

有效的XML文档。指在XML文档中写有DTD(Document Type Definition,文档类型描述)信息。完整的XML包括XML声明、XML实例和DTD三部分。XML声明就是写在文档开头的、形如< ?xml version=”1.0” encoding=”Shift_JIS”?>的部分。XML实例是文档中通过标签被标记的部分。而DTD的作用是定义XML实例的结构。如下文本就是一个带有DTD的XML文档:
rw_《计算机是怎样跑起来的》4-11 章_第12张图片

用“< !DOCTYPE>”和“]>”括起来的部分就是DTD。DTD定义了在< myddata>标签中可以有一个以上的< company>标签;在< company>标签中可以包含< name>、< address>和< employee>标签。**只要定义了DTD,当遇到那些虽然记录了公司名称和地址,但还没有记录员工数量的数据时,就可以判断出这不是一个有效的XML实例。
XML Schema是为了XML新近研发的技术,因此与老传统DTD相比,它可以对XML文档执行更严格的检查。

11.8 用于解析XML的组件

DOM/SAX(Document Object Model,文档对象模型;Simple API for XML)。该组件用于处理XML文档,已成为W3C标准。它们只是组件的规范,实际的组件由某个厂商或社区提供。

11.9 XML可用于各种各样的领域

分布式计算。把程序分散部署在用网络连接起来的多台计算机上,使用这些计算机相互协作,充分发挥计算机整体的计算能力。SOAP(Simple Object Access Protocol,简单对象访问协议)可以用于分布式计算。SOAP就是使运行在A公司计算机中的A程序,可以调用运行在B公司计算机中的B程序。

SOAP的出现使过去的分布式计算变得更容易使用,也更通用。无论是调用程序时所需要的参数信息,还是程序执行后的返回结果,都可以用通用的数据格式XML表示。另一方面,SOAP手法数据时所用的传输协议并不固定,凡是能够收发XML数据的协议均可用,一般情况下使用HTTP或SMTP协议。

XML只有充当通用数据格式时才有价值。也就是说,只有像互联网那样的环境中,运行在不同机器中的不同应用程序相互联结,XML才会大有作为。只有一台独立的计算机,或者只在一家公司内部的话,使用XML格式存储数据反而体现不出优势,仅仅是文件的尺寸变大从而浪费存储空间罢了。同样地,在分布式计算中,如果是由不同种类的机器互联组成的系统,那么使用基于XML的SOAP才是有意义的。反之如果环境中的机器和应用程序全部来自同一厂商,那么使用厂商自己定制的格式而非基于XML的格式,反而可以更加快捷地处理信息。

总结

[1] 熟记作者的总结,并在生活中实践,让其“变成一种性格”。[如上一篇中的“计算机三要素”、“学问的学习方法”以及本章涉及的计算机所包含知识范围,以及每个知识点下的方法。可作为变成一种性格的参考]
[2] 写得太好了,有的篇章都被我全部抄写下来了。[对于村下的我来说真是太新奇了]
[3] 没懂数字签名。
[4] 数据库表设计-规范化1
rw_《计算机是怎样跑起来的》4-11 章_第13张图片
09.27
[5] TCP/IP相关
rw_《计算机是怎样跑起来的》4-11 章_第14张图片

路由表
rw_《计算机是怎样跑起来的》4-11 章_第15张图片
如果数据的发送目的地就在本LAN中,则可以直接发送数据而无需经过路由器转发;反之如果在LAN外(或发送目的地址不在路由表中),则需要经过路由器转发。[临近路由器会进行路由表信息的交互]

查看路由过程[小西南1012实验室查看到小西南官网的路由过程]
rw_《计算机是怎样跑起来的》4-11 章_第16张图片

第一行是1012室路由器的IP地址,第二行连接1012室局域网到更大局域网的路由器的IP地址,3-6依次为其它路由器,7行是西大服务器所在局域网的路由器的IP地址,8行是西大官网所在服务器的IP地址。

[查看FQDN和IP对应关系]
rw_《计算机是怎样跑起来的》4-11 章_第17张图片

[2016.08.01 - 09:02]

你可能感兴趣的:(碚大)