Monthly Archives: March 2010

读《程序员修炼之道》- 基本工具

“持久地存储知识的最佳格式是纯文本。” “GUI的好处是WYSIWYG-所见即所得(what you see is what you get)。缺点是WYSIAYG-所见即全部所得(what you see is all you get)。” “在shell提示下,你可以调用你的全套工具,并使用管道、以这些工具原来的开发者从未想过的方式把它们组合在一起。通过对shell进行编程,你可以构建复杂的宏命令,用来完成你经常进行的各种活动。” “用好一种编译器。只是依次输入、并使用鼠标进行剪贴是不够的。对于常见的编辑操作,与鼠标或菜单驱动的命令相比,只使用键击效率更高,因为你的手无须离开键盘。” “确保每样东西都处在源码控制之下-文档、电话号码表、给供应商的备忘录、makefile、构建与发布流程、烧制CD母盘的shell小脚本……” “把整个项目置于源码控制系统的保护之下具有一项很大的、隐蔽的好处:你可以进行自动和可重复的产品构建。” “在技术竞技场上,你应该专注于修正问题,而不是发出指责。”

Posted in Reading | Leave a comment

zz “西厢计划”原理小解

待月西厢下,迎风户半开。隔墙花影动,疑是玉人来。 最近推上最流行的一个关键词是”西厢计划”, 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻墙去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部 件,可以不依赖于服务端工作。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代 码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。 先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。只要服务器不忽略 Reset, 客户端再怎么弄都没用,因为服务器会停止发送数据,Reset 这条连接。所以,很多报道说西厢计划是忽略 Reset, 我从源代码来看应该不是这样。在我看来,西厢计划是利用了墙的一个可能的弱点–墙只在连接发起的时候把一个 TCP 连接加入监听序列,如果墙认为这个连接终止了,就会从监听序列中去掉这条记录,这样,这条连接上后续的包就不会被监听。西厢计划就是让墙“认为”这个连接 终止的一个绝妙的方法。只要墙认为这个连接两端都是死老虎,墙就不会触发关键词检测,其后所有的数据,都不存在连接被重置的问题了。

Posted in TCP/IP | Leave a comment

读《程序员修炼之道》- 注重实效的途径

“系统中的每一项知识都必须具有单一、无歧义、权威的表示” “DRY-Don’t Repeat Yourself  不要重复自己” “代码为什么需要注释:糟糕的代码才需要许多注释。DRY法则告诉我们,要把低级的知识放在代码中,它属于那里;把注释保留给其他的高级说明。否则,我们就是在重复知识,而每一次改变都意味着既要改变代码,也要改变注释。” “如果你觉得受到诱惑,想一想古老的格言:”欲速则不达”。其中许多问题是由开发者的懒惰造成的。无耐性的重复是一种容易检测和处理的重复形式,但那需要你接受训练,并愿意为避免以后的痛苦而预先花一些时间。” “在计算技术中,正交性用于表示某种不相依赖或是解耦性。如果两个或更多事物中的一个发生变化,不会影响其他事物,这些事物就是正交的。” “不要依赖你无法控制的事物属性” “让你的代码保持解耦;避免使用全局数据;避免编写相似的函数。养成不断地批判对待自己的代码的习惯。寻找任何重新进行组织、以改善其结构和正交性的机会。这个过程叫重构。” “修正bug也是评估整个系统的正交性的好时候。当你遇到问题时,评估修正的局部化程度。你是否改动了一个模块,或者改动分散在整个系统的各个地 方?当你做出改动时,它修正了所有问题,还是又神秘地出现了其他问题?当你在测试之后、把代码签回时,标记所做的bug修正。随后你可以运行月报,分析每 个bug修正所影响的源文件数目的变化趋势。” “可撤消性:不存在最终决策”

Posted in Reading | Leave a comment

读《程序员修炼之道》- 注重实效的哲学

“不要留着”破窗户”(低劣的设计、错误的决策、或是糟糕的代码)不修。发现一个就修一个。如果没有足够的时间进行适当的修理,就用木板把它钉起 来。或许你可以把出问题的代码放入注释,或是显示”未实现”消息,或是用虚设的数据加以替代。采用某种行动防止进一步的损坏,并说明情势处在你的控制之 下” “一辆废弃的轿车放了一个星期,无人理睬。而一旦有一扇窗户被打破,数小时之内车上的设备就被抢夺一空,车也被翻个底朝天” 石头汤:士兵通过煮石头吸引村民共同分享食物。 “今天的了不起的软件常常比明天的完美软件更可取。如果你给用户某种东西,让他们及早使用,他们的反馈常常会把你引向更好的最终解决方案。” “定期为你的知识资产投资:” “定期投资:定期为你的知识资产投资。每年至少学习一门语言,每季度阅读一本技术书籍。” “多元化:计算机技术的面貌变化很快–今天的热闹技术明天就可能变得近乎无用。你掌握的技术越多,你就越能更好地进行调整,赶上变化。” “管理风险:不要把你所有的技术放在一个篮子里。” “低买高买:在新兴的技术流行之前学习它可能就和找到被低估的股票一样困难,但所得到的就和那样的股票带来收益一样。”

Posted in Reading | Leave a comment

一致代码段与特权级

一、一致代码段与非一致代码段 “一致”的意思大约是这样,当转移的目标是一个特权级更高的一致代码段时,当前的特权级会被延续下去,而向特权级更高的非一致代码段的转移则会引起常规的保护异常,除非使用调用门或者任务门。一致代码段往往是用在内核共享的段,这些段是允许应用程序去访问的,而不需要内核转移到应用程序中来访问这些共享的资源。对于一致代码段,有以下规则: 特权级高的程序不允许访问特权级低的数据。比如,核心态不允许调用用户态的数据。 特权级低的程序可以访问到特权级高的数据,但是访问程序的特权级不会发生变化。比如,用户态访问内核态共享的资源时,不会变成内核态。 而对于非一致代码段,则有着不同的规则: 只允许同级访问。 绝对禁止不同级程序访问。即内核态不能访问用户态,用户态也不能访问内核态。 之所以这么做是为了系统的安全性考虑,分离内核和用户程序,使内核不能被用户程序干涉,同时避免使用户态程序修改内核态的逻辑,导致在内核态下执行用户程序的代码。上面所说的是代码段,而数据段则全都是非一致的,这意味着不可能被低特权级的代码访问到。然而,与代码段不同的是,数据段可以被更高特权级的代码访问到,而不需要使用特定的门。规则总如如下: 特权级 低->高 特权级 高->低 特权级 同级之间 适用于何种代码 一致代码段 Yes No Yes 不访问受保护的资源和某些类型的异常处理的系统代码 非一致代码段 No No Yes 避免低特权级的程序访问而被保护起来的系统代码 数据段 (总是非一致) No Yes Yes

Posted in Operating System | Leave a comment