2007/3

书的目录

公布一下书的目录,不过不太详细,因为估计到以后还会有大的变化。同时列出一些解释,希望得到你宝贵的回复。

前言

(介绍本书的内容,面向读者。)

第0章 计算机编程应该是一门艺术

(既然书名是《C语言编程艺术》,开篇应该介绍一下为什么这是一门艺术。碰巧我写过这篇文章。)

第1章 过去与现在

(介绍C语言的历史和现状。)

第2章 关于C的思考

(深入分析关于C的一些细小问题。)

第3章 解读C语言标准

(很大的一章,详细分析C语言标准。估计内容会很多,考虑以后可以切成上下两章。)

第4章 三步曲──编译,链接,运行

(从编译器的角度去理解C语言,此章我现在写还有点难度。)

第5章 巧夺天工──内核编程艺术

(介绍C在内核中的一些精彩使用,主要是Linux内核,如果时间允许,可以考虑BSD内核。)

第6章 应用的艺术

(分析其它一些编写精彩的实例代码,打算介绍glibc。)

第7章 文化及其它

(关于C的一些其它有趣的东西,技术之外的。)

附录

1.C/C++预留标识符
2.GCC 4.1对C99的支持情况
3. GNU公用许可证
4. 参考资料

(考虑到参考资料列表很长,现在在考虑是否要把它切割到每个章节。)

请问您对上面的安排有什么好的建议 吗?您哪些东西不应该在此书出现?哪些东西又被我忽略了?非常期待您的回复!

谢谢!

宣布几个重要决定

1.决定接受阿元的建议,不再写关于cn的话题,否则以后找工作都麻烦。

2.决定接受小公子的建议,去gov那里备案,否则这里不久就被和谐掉了。不过备案之前先要自己先把这里“和谐”一下。

3.公布一个最重要的消息:我正在写一本书,书名叫做《C语言编程艺术》(这很少有人知道,包括小公子)。现在,前三章已经写了个差不多了。先公布第二章的内容,点击这里可以下载,其它部分章节以后也会陆续公布(如果出版社允许,我非常乐意全部公开)。之所以公布,是想:(1) 请大家给我一些建议,你想读到一本什么样的C语言的书?我哪里写得好?哪里写得不好?里面有错误吗? (2)问一下谁有兴趣和我一起完成本书的写作?(要求:必须_精通_C语言。)(3) 请大家督促我尽快完成本书的写作。;-p

感谢各位朋友!

真的好想你

歌手:周冰倩 专辑:真的好想你

真的好想你
我在夜里呼唤黎明
追月的彩云哟也知道我的心
默默地为我送温馨
真的好想你
我在夜里呼唤黎明
天上的星星哟也了解我的心
我心中只有你
千山万水怎么能隔阻我对你的爱
月亮下面轻轻地飘着
我的一片情
真的好想你
你是我灿烂的黎明
寒冷的冬天哟也早已过去
愿春色铺满你的心
你的笑容就像一首歌
滋润着我的爱
你的身影就象一条河
滋润着我的情
真的好想你
你是我生命的黎明
寒冷的冬天哟也早已过去
但愿我留在你的心

从C/C++到Java(三)

1. Java中对象的创建都是通过new操作符,而在C++中显然没有必要,你可以还通过定义一个实例来创建一个对象。

2. static在Java和C,C++中的意思差别挺大:
(1) 在Java中用它指明一个类成员是先于类而存在的,即可以不定义一个类的实例就可以直接使用。
(2) 在C++中有些复杂,第一个意思和Java类似,即可以不定义实例就使用类的成员,第二个意思是static成员可以直接继承到子类的作用域中,第三个意思是类定义中的static数据成员并不在类中定义,而且该成员并不属于该类,该类的实例共享同一个static成员。
(3)在C中,static的意义往往让人困惑。其实C中的static不外乎有两种作用,一种是限制存储域,一种是限制作用域。它用于函数时表示该函数是定义在该文件中的,外面的不能调用,当它用于局部变量时,它限制局部变量的存储域,让局部变量每次存取都维持上一次的值,当它作用于全局变量时,它限制该全局变变量只在其定义的文件中有效。

3. Java和C++都可以在运行时决定类型,C++是用typeid,而Java是用instanceof。

4. Java中的abstract和C++的virtual还不太相同。abstract类是不能有实例的,只能用来继承,abstract方法没有实体,它必须在所有子类中被覆盖(override)。上面的abstract方法在C++中被称做pure virtual,virtual方法在C++中的意思比Java中的abstract方法要复杂得多,virtual方法可以在各个类中定义,最后使用时调用哪个是动态决定的。再多说一句,C++中的基类的析构函数都必须是virtual的,而构造函数必须不能是virtual类型。

5. Java中没有运算符重载,虽然C++的运算符重载可以产生一些很好的代码,但是掌握它的使用也是要花一些代价的。

6. Java中没有模板,不过Object可以代为完成这个功能。因为Object是所有类的父类,所以它可以用来作为通用类,换句话说,在某种程度上完全可以当做模板。

从C/C++到Java(二)

1. ISO C中的下列关键字在Java中被剔出:

(1)goto:Java不需要goto,即使是在C中被很好使用的goto。Java的错误处理机制才用的throw/try/catch,有点像C++。
(2)sizeof:Java的基本类型都有固定的大小,而你不需要知道非基本类型的大小,所以Java不需要这个操作符。
(3)typedef:Java的类型使用class来定义,而且不需要为它们起一个别名。

2. ISO C中的下类型(或类型修饰符)被剔出:

struct,union,enum,auto,extern,register,signed/unsigned,volatile

这时你应该能猜到,Java中也不会有位字段。

3. Java中没有宏,Java认为宏会引入一些不良的特性,导致调试困难。;-)实际上,你在C++中也应该避免使用宏。如果你需要常量,请用const。C++之父这样评价宏[The C++ Programming Language]:“如果不是必须,别使用它们……因为它们在编译器看到之前重新安排了程序代码,对于很多编程工具来说宏也是一个很大的问题,所以当你使用宏时你应该预料到一些工具会给你较差的服务,比如:调试器,交叉引用工具和分析器。”

4. Java中没有可变参数,如果你需要不确定个数的参数列表,可以把它们放到Vector里,别担心,Vector里可以放不同类型的数据。

5. 在C中,函数作为独立的单元而存在,而在Java中函数必须在类中,作为类的方法进行定义。C++在Java和C之间做了个整合,怎么定义都可以,这就使得C++的名字空间成为必要。而Java对名字空间的管理有着统一而简洁的规则。

6. 在C++中,把一个类的方法定义在内部意味着该方法要被inline。Java不会,因为它根本就没有头文件和inline关键字。

7. Java中没有严格的声明,只有定义。C++不同,当你在花括号中描述了一个类的成员和方法时,它才算是被定义;否则就是声明。

8. Java没有C++中的友元,在Java中,同一个Package中的类其实就是朋友关系,它们可以访问彼此的protected成员。

9. Java和C++都有构造函数,名字都和类同名,而且可以被重载(overload)。不同的一点是Java没有析构函数,Java中的一个可替代的选择是finalize()函数,它会在适当的时候被GC调用。

小公子,我不同意你的理由

小公子在他的博客上写了一篇题为《我为什么要考研》的文章,读完之后忍不住要批一下。首先要声明的是,我不反对你考研,只是看着你的理由太脆弱了,怕误导了后来的孩子们,特写此文。

小公子写道:

>1,考研是我改变专业的一次机会
>考研可以跨专业考,由于在高考报志愿是还是小P孩,不知道自己真正喜欢什么,所以上了“贼船”,考研给了我一个下船的机会。套用中学作文的一句话:某位哲人曾经这样说过,人的一生有很多步,但关键的就那几步。考研对于我来说是最关键的一步。
法律硕士考试规定只有非法律本科才能考,给了我一个公平竞争的机会。

这首先说明了高考制度的危害。

公平?我怀疑。 请不要在我面前谈中国的公平!我早就不信了!

>2,考研是对意志力的一次磨练
>考研是变态的,每天十几个小时的自习不是说说玩的,如果这都能撑下来,估计也没有什么事做不成了。猪狗不如的考研生活。

磨练意志有多种方式,考研是最差的一种。这条是赤裸裸的借口。

>3,考研可以让我更进一步体会中国教育制度
>我们都知道,如果你要想批评一种食物,最好的方法就是先品尝它,所以在我批判它之前先批判的接收一点也未必是坏事。所谓批判的接受就是这个道理。

你接受了15年的中国教育(5+3+3+4) 还不够多吗?人生能有几个15年?如果你到现在还不能“品尝”到它的危害,只能说明你根本就没想去体会。(现在想体会了?恐怕也是受我的怂恿吧?谢谢我吧!)

>4,考研是我唯一的选择
>不喜欢本专业,暂不打算出国,虽然只剩下考研一个选择,但总比没有选择强多了,起码我知道我该干嘛。

典型的中国教育受害者,二十多的大男人了自己想做什么都不清楚,只能求助于考研。同情你!我只能说一句:“哀其不幸,怒其不争。 ”

>5,如果我不换专业,我能够成为一名合格甚至是出色的程序员,但如果我是律师,我会是出类拔萃的。
不想解释,爱信不信。

出色?我怀疑,从你那数学功底来看, 合格都难。

这几天一直忙兴趣小组的项目,没多少时间去兼顾其它东西。自己这边原来计划做的事一踏糊涂,看来必须尽早从小组项目中抽身,一些工作交给别人去做。

Java的语法基本上全部弄清楚了(abstract的作用是指定该方法必须由子类来实现,和Object语义不同,Object有点像C++中的模板)。今天突然发现昨天看的ftpClient竟然不是Java标准API,看来初步设想的类模型得稍做修改。刚查阅了《Java In a Nutshell》,发现SocketChannel是一个可替换的选择。明天应该把这一部分搞清楚,把这几类的功能界定开。下面是一个不太成熟的客户端的类模型:


类关系模型

另一个棘手的问题是还得为图形界面留足接口,但我看初步设计的类模型基本上能整合GUI,如果要修改的话改的地方也不是很多。说到这,不能不提Java的AWT,感觉这块混乱得很,思路没有理清。不过,这现在还不是大问题。

总的来说,客户端问题不大,我大可在设计完之后抽身去做一些服务器端的工作。;-p

另:管理一个项目可真不容易,很累,要做的工作很多。你有什么好的建议吗?

我为什么不考研?

因为:

1. 任何考试都是有害的,因为:

(1) 它扼杀了我的兴趣,逼我去学很多我不想学的东西。

(2) 它迫使我去学习如何才能适应它,而这是在其它地方根本就是没用的东西。

(3) 它侮辱了我的智商,因为它往往在我擅长的地方出一些愚蠢到家的问题来考我。

(4) 它过分鼓励竞争,误导我去一味和别人竞争而忽视合作,而后者,我发现,才是更为重要的。

(5) 最重要的是,它迫使我们去信奉该死的课本(或某某大纲)和充满错误的教授,阻碍了进步,严重扼杀了创新!

2. 考研要考政治,这是我最不愿意面对的。我们知道,政治这东西只不过是人类愚蠢的优雅托辞,而且在各个国家都难免沦为一种统治的工具(想拯救可怜的人类?学习自然科学吧!)。我被迫接受这种政治“洗脑”达13年(5+3+3+2),我是不想再上当了。

3. 我现在已经超过相当一部分研究生了,没必要再继续去受中国教育的毒害了。虽然可能考上一些学校意味着可以很快到“罗马”,但是请记住:“条条大路通罗马”。

4. 众所周知,中国的学术腐败已经病入膏肓,我不想冒着选到一个SB导师的风险去考研,更不想和那群人同流合污。中国,继续!

5. 我不想再花父母的钱了。

6. 我不想在继续被封闭在象牙塔中,咱们早晚都要进入社会。虽然我恨这个肮脏的世界,但是,现在的象牙塔里也不见得干净到哪里去!

7. 我想换一种生活,我想要更多的自由,而不是约束。

项目文档──软件需求说明书 beta

(注:最新的版本可以在这里得到。)

软件需求说明书beta

作者:王聪

1. 引言

1.1 编写目的

对整个项目做总体分析,参与开发的每个人都应该读一下。这份文档是为客户端编写,服务器端和此可作互相参考。

1.2 背景

a.
项目名称:xylFTP

b.
指导老师:陈老师,王老师
开发者:
服务器端:林峰,刘洋,董溥,刘伟,贾孟树,聂海海,郭拓

客户端:孔建军,金明洁,王聪,赵崇日,周晓炜

1.3 定义

FTP—File Transfer Protocol, See RFC 959.

1.4 参考资料

a. TCP/IP Illustrated, Vol I, W. Richard Stevens
b. Unix Network Programming, Vol I, W. Richard Stevens, etc.
c. The Art Of Unix Programming, Eric S. Raymond
d. The Mythical Man-Month: Essays on Software Engineering, Anniversary
Edition (2nd Edition), Frederick Phillips Brooks, Jr
e. Unix Systems Programming: Communication, Concurrency and Threads,
Robbins, Steve Robbins
f. Java Network Programming, Elliotte Rusty Harold
g. 软件文档国家标准

2. 任务概述

2.1 目标

开发一个功能完善的FTP客户端和服务器端,初期实现基本功能,具体见[3.1]。如果初期顺利完成,则在此基础之上进行下一步的开发。

2.2 用户特点

xylFTP客户端是面向Linux/Windows普通用户。

2.3 假定和约束

经费:无
期限:1~2个月

3. 需求规定

3.1 对功能的规定

(注:[]里面的表示可选,不带[]的则是必选)

(1) 使用命令行界面,用Java开发。
(2) 能处理简单的命令行参数,两种格式大致如下:

xylftp [-h|—help] [-V|—version]

显示帮助信息,或版本信息。

xylftp [-v|—verbose][-u $USERNAME|—user=$USERNAME][-p $PASSWORD | —password=$PASSWORD][-d|—debug] $HOST

建立与$HOST的连接。

-v或—verbose:显示较多的额外信息
-u $USERNAME或—user=$USERNAME:以$USERNAME用户身份连接,如果无此选项,则尝试默认的anonymous
-p $PASSWORD或—password=$PASSWORD:用$PASSWORD密码登录。如果此项未指定,尝试默认的空密码。
(FIXME:当用户名是anonymous时,密码能不为空吗?)
-d或—debug:显示比—verbose更多的信息,供开发者使用。

(3) 交互式地接受简单的命令,包括:

help [$CMD] — 显示本客户端支持的命令列表
quit — 退出
bye — 等同于quit
open $HOST — 建立与$HOST的FTP连接,如果启动此客户端时没有指定的话
pwd — 列出服务器端的当前路径
cwd [$DIR] — 进入服务器$DIR目录
dir [$DIR] — 列出服务器$DIR目录下的文件
get $FILE — 从服务器获取名为$FILE的文件,保存至本地当前路径
put $FILE — 将本地的$FILE文件传送至服务器端的当前路径
close — 断开当前连接,并返回交互式界面
!! — 执行本地shell
? [$CMD] — 等同于help

3.3 输人输出要求

客户端应该采用交互界面,因此还要能处理错误输入。

3.4 安全性要求

服务器端应该首先考虑系统安全问题,比如:文件存储权限,日志记录,用户管理。
3.5 故障处理要求

下列错误应予以考虑,出错信息列表:

客户端:

01-无法连接远程主机
02-无法上传文件出错
03-无法下载文件出错
04-下载过程中出错
05-远程主机关闭
4 运行环境规定

4.1 设备

客户端使用Java编写,应该能在所有带JVM的机器上运行。

4.2 支持软件

客户端应该在Linux/Windows上无差别地顺利运行。

To Live Is To Function

Oliver Holmes

In this symposium my part is only to sit in silence. To express one’s feelings as the end draws near is too intimate a task.

在这次座谈会上,我的职责只是安静地坐着。要在生命即将完结之时表达个人感受并非易事。

But I may mention one thought that comes to me as a listener. The riders in a race do not stop short when they reach the goal. There is a little finishing canter before coming to a standstill. There is time to hear the kind voices of friends and to say to oneself: The work is done. But just as one says that, the answer comes: “The race is over, but the work never is done while the power to work remains. The canter that brings you to a standstill need not be only coming to rest. It cannot be, while you still live. For to live is to function. That is all there is to living.”

但我只是想谈谈作为一名倾听者的看法。在比赛中,骑手在到达目的地后并不会突然止步,在完全停下以前他还要进行一阵小跑,他还有时间听听朋友们亲切的话语,还有时间对自己说:大功告成了,然后话音刚落,他就听到了应答:“比赛虽已结束,但只要还有力气去做,工作就永无止境,使你止步的那阵小跑未必只以休息告终,只要你还活着,就要发挥作用,那才是活着的全部意义。”

And so I end with a line from a Latin poet who uttered the message more than fifteen hundred years ago, “Death plucks my ear and says: Live — I am coming.”

所以,我用一位拉丁诗人的一行诗句作为结束语,这是他在1500多年前所说的:“死神拉着我的耳朵说,活着吧—-我来了。”