2004年09月21日

如题……

2004年09月13日

原来每次上网总是先打开donews的,因为上面有不少的精品文章和业界新闻,可随着时间的推移,这种思想越来越淡薄了,大家仔细看看,有多少文章的回复超过两位数的,有多少是真正的原创文章….一下子发那么多文章有意义吗?看着那一串0从上而下,我唯一能做的就是关闭窗口

2004年09月03日

随着Gmail推出上G的邮箱之后,各大网站纷纷效仿,雅虎也挤了进来.

我忍不住想问一句,上G的邮箱究竟有意义吗?你真的需要那么大的邮箱空间吗?有那么多邮件吗?真的需要那么多的网络存储空间吗?而且随着邮箱容量的扩大,打开邮箱的速度势必变慢,那么多的信件势必给寻找带来麻烦……

2004年09月01日

今天又买了一本<<青年文摘>>,一本很有味道的杂志,从高中到现在都一直没离过手,加上对这本杂志还有另一份特殊的情感,就得一直买下去了,纪念自己走过的一段路,纪念那一份…..

2004年08月31日

3721不知什么时候已成为多数电脑爱好者装系统的必备,个人觉得3721也不是那么的讨厌,大家不妨一起聊聊吧…..

2004年08月30日

不知不觉中,大学一半的时间已经过去了,过去的两年就这样迷迷糊糊的混过去了,有时还自以为学了点东东,其实是空架子一副.明年的上半年将面临实习,大三这一年至关重要.好好把握吧…..

2004年08月21日

据安全研究人员表示,他们开始在微软的最新安全升级软件Windows XP SP2中发现了漏洞。

据德国的Heise安全厂商上周曾经报道说,在Windows XP SP2中存在的两个漏洞可以用来绕过在运行不被信任的软件时显示的安全警告框,为有可能的攻击者在用户的PC上运行代码提供了一个可乘之机。

安全漏洞评估厂商PivX方案公司的高级安全研究人员托尔·拉霍姆于本周三表示,有关Windows XP SP2中出现的漏洞问题还会有更多有待披露中。自Windows XP SP2发布以来,拉霍姆就一直在寻找Windows XP SP2中的漏洞,并已经向微软公司通报了几个问题,但他没有详述有关其中的细节问题。他表示,在未来的几个周内,我们肯定能够看到Windows XP SP2出现的危急漏洞,并且在未来几个月内,蠕虫病毒将能够躲避Windows XP SP2安全功能的查杀。拉霍姆通过过去的几年时间已经在Windows XP操作系统和IE浏览器中发现了数十个漏洞,而且还维护着一个显示IE浏览器中还未得到修补的漏洞的网页。

微软公司没有对是否已经收到了有关Windows XP SP2中出现新漏洞的报告进行争辩,但它表示,公司的研究人员已经在研究由Heise公司提出的问题,并已获得了预期的成果。据微软公司的一位代表表示,公司的安全响应中心正在调查和研究这些报告。此功能用于保护用户不会执行来历不明的文件的执行,目前,我们尚未发觉有黑客能够通过电子邮件或浏览器绕过这一功能的事情发生。

安全研究人员还指出了微软公司集成在Windows XP SP2中的安全技术并未能解决一些众所周知的问题。据安全软件厂商eEye数字安全公司负责黑客事务的首席官员马克·迈弗雷特表示,尽管提高了防火墙的功能,但它仍然能够绕过任意一个在本地机上运行的软件,这也是大多数个人防火墙存在的问题。这些有关漏洞方面的报告可能会使企业对安装Windows XP SP2的决定向后推移。许多企业都已经表示,在完全的测试前,它们不会安装Windows XP SP2的。

通过对操作系统代码和配置的改变,Windows XP SP2旨在提高Windows XP操作系统在处理网络数据、软件内存、浏览活动和电子邮件时的安全性能。除了使软件通过自动升级之外,微软公司将允许信息技术管理人员下载一个企业用于升级它们的机器的软件。至于Windows XP操作系统本身的漏洞,迈弗雷特表示,升级是为了通过增添更多新的保护功能和更好的配置,使Windows XP操作系统的安全性能得到了更大的提高,而不是为了发现所有的安全漏洞。他表示,微软公司从来都没有承诺过SP2能够关闭Windows XP操作系统中所有的漏洞。

2004年07月20日
微软2千万美元和解与Lindows的商标争端
 

Lindows 周一(7月19日)表示,该公司和微软已于上周五就一项商标争端达成和解,微软将总共向Lindows支付2000万美元,以换取对Lindows.com和其他相关域名的所有权。

  一份周一提交给美国证券交易委员会(SEC)的修正后的S-1文件显示,微软将在8月15日之前向Lindows支付约1,500万美元,其余500万美元将于2005年2月1日支付。

  据报导,微软曾于2001年12月对Lindows提起法律诉讼,指控后者使用与微软视窗(Windows)操作系统相似名称的做法侵犯了该公司的商标权。

  文件显示,根据和解协议,Lindows同意在9月14日之前将公司名称变更为Linspire,并将停止使用包括www.lindows.com在内的所有“Lindows”标识。

2004年07月17日
        code生活之外,程序员们的生活应该多姿多彩!虽然这里谈及的依然是图书,但却没有抠代码的紧张。这些图书让我们在放松之余感受到的是文化气息的扑鼻而来。
[ 查看本指南所提及的书籍 ]
这里列举的读物都是关注率非常高的,在这里作一整理也是希望大家不要将他们遗忘,继续体会其中蕴含的道理。当然,这里的只是笔者熟悉的几本,如果读过同样精彩的图书,就拿出来和大家分享呢!!

============1================

 DOOM启世录 
      我有一大学同学是quake迷,也就是大一那时知道了这种游戏的魅力。当此书准备上市前夕,他急切让我帮忙购买的急切让我了解到铁杆的游戏玩家对doom、quake的喜爱已经升华到一种信仰。这些经典游戏的开发故事你知道么?两个玩家是如何走上游戏之路,如何制作出迄今为止影响力最大的游戏作品,以及他们为何在最辉煌的时候分道扬镳??这本图书,就如此神奇的带领我们感受着那段传奇般的经历。在此贴出一位读者的书评,那种玩家的狂热怎能不让你我热血沸腾:

“如果说有一个游戏对PC世界的发展起到了重要的影响,那一定就是DOOM了。
     依稀还记得高中时曾在一个昏暗的游戏室里,鏖战DOOM直到奔向门外呕吐不止。虽然最后因为性格等方面原因还是没有成为DOOM系列的铁杆玩家,但是这个游戏对彼时还在三国志2中奋战的我来说,其冲击力是不言而喻的。也因此买过两本DOS下游戏编程的书籍折腾过一段时间,在掌握了三维建模的一点基本知识后,还是因为天资不够最后只能回来学我很有前途的十级野球拳 :P
     而潜藏在心中的那份对DOOM背后那些天才的崇拜之情,在读了《DOOM启示录》一书后又燃烧了起来。那是怎样的一个传奇的时代啊,又是怎样一批已经成为传奇的天才们创作了一个又一个的传奇。相比那些骚姿弄首的所谓明星来说,他们才是真正值得我们崇拜的偶像
     强烈推荐《DOOM启示录》一书,呵呵,体验我们曾经错过的传奇时代!”

     此书的编辑方舟曾撰写了一篇精彩的读书感悟:速度与激情,相信你会和大家一样深深着迷于那样的故事...

===========2==================

 旷世之战—— IBM深蓝夺冠之路 
这本图书大家似乎不太熟悉,正如一些读过的网友所说,此书和《Doom启示录》是同一种风格的图书。也许是DOOM启示录的热潮依旧,这本另一领域的佳作也耐不住了寂寞。从最近的销售排行上可以看出,这种休闲、学习于一体的图书实在难得。
"深蓝"一个神奇的机器人,它与卡斯帕罗夫之战这一引起全世界关注的历史事件幕后蕴含了多少故事。
本书作者Monty Newborn是国际计算机象棋协会的主席,他的权威性我想是不容置疑的。对于那些对人工智能、象棋感兴趣的朋友来说,这种综合性的图书可是一次难得的享受。

=========3====================
 你的灯亮着吗? 
     此书销售的火爆真是惊人,连续数月雄踞销售排行前列,现在再版已经完成。站点曾经刊登了一个“提高思维的三本好书”的读书列表,此书作为其中之一深受大家好评。这里再次提出也是希望大家继续挖掘温伯格大叔(温伯格图书专题)的智慧之言。下边是章柏幸先生在重印后的发言:
"我曾经和朋友说过,好书有3种,一种是让人产生共鸣,一种是让人顿悟,一种是让人动手去按照它的做。在不同的读者眼里,这3种角色《灯》都扮演过。
     我们说,我们引进的这些作品,实际上已经在很多方面渗透到我们的生活之中了,因此,对于《灯》里面的故事,其实已经不新鲜了,这种不新鲜,给读者带来的就是共鸣,所谓似曾相识的感觉。这在我们今天看来不新鲜的故事,却依然会给人顿悟的感觉,实在是有点匪夷所思的;因为对于西方文化的引进,从19世纪初就已经如火如荼了;但是有一些很有价值思想在很长一段时间内,在我们的国家丢失了;一些读者关于顿悟的反馈,实际上是打破了以往传统思维的窠臼,修行多在个人,而与该书关系不大。从《灯》写作的框架看来,作者希望在“如何解决问题”方面给出一个可供操作的步骤,这一点可以直接在目录中看出来。
     这种分析,似乎把《灯》捧到天上去了,这样不好。所以,从我个人理解,《灯》需要表达的内容,其实是可以在几千字里面说清楚的;如此的话,用这么多故事来作佐证似乎是有深意的;那么,我这里不妨大胆揣测,《灯》的目的是让大家重视这种看待问题、分析问题的方法,另一方面,也从各行各业的实例论证了书中观点的普适性……"
由于这里只是作一介绍,如果想看关于此文更加详细的请访问作者的blog
[-->温伯格大叔的图书专题]

=========4=====================
《borland传奇》
此书可以说久负盛名。通过人物和产品的交错描述,Borland发展过程中的喜怒哀乐逐渐展现在读者眼前。种种令人举手加额、抑或是扼腕叹息的事件,逐一娓娓道来。据编辑介绍修订版中增添了更多精彩的故事。
[此书修订版已经完成( Borland传奇(第二版) )]

《java夜未眠》
这是一本程序员写给程序员的散文集,清新自然的笔触记录下了作者学习、工作生活中的所见所思。篇篇文章透露着程序员共同的心声,相信每一次共鸣都是一杯清香醇厚的咖啡,让孤独的身影不再冷清寂寞。
[修订版已经上市( 爪哇夜未眠(第二版) )]

编者注:以上两本图书的修订版已经陆续上市,详细可以查看专题:传奇再继续,爪哇夜未眠

 过河卒 
戴习为真实写照,内容引人深思。此书饱含着作者对人生、对世界,对IT软件独特的感受,
对于商品化、市场化中快速发展起来的中国新一代IT人,有着很强的参考和借鉴作用。
=========5====================
 最后期限 
“为什么一本讲项目管理的小说要以主人公被绑架开始?汤普金斯先生,这位爱打瞌睡的资深项目经理,公司近期裁员的牺牲品,被绑架到一个完全陌生的国度,委以一项近乎不可能的任务,开始一次奇异的、难以测度的冒险……这听起来完全像一部卡夫卡式的荒诞小说,但其实却是IT名著《最后期限》的开头。”这段话刘天北:人怎样对软件工程说话的介绍已经说明这本书通过鲜活的文字和曲折的情节改变了项目管理书籍枯燥乏味的一贯形象。

2004年07月15日

本文介绍了三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型。

措施一:改写类的实例方法
通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码重用机制。换句话说,如果不继承整个类的所有方法和数据成员,我们无法重用该类里面的单个方法。继承总是带来一些多余的方法和数据成员,它们总是使得重用类里面某个方法的代码复杂化。另外,派生类对父类的依赖关系也使得代码进一步复杂化:对父类的改动可能影响子类;修改父类或者子类中的任意一个类时,我们很难记得哪一个方法被子类覆盖、哪一个方法没有被子类覆盖;最后,子类中的覆盖方法是否要调用父类中的对应方法有时并不显而易见。

任何方法,只要它执行的是某个单一概念的任务,就其本身而言,它就应该是首选的可重用代码。为了重用这种代码,我们必须回归到面向过程的编程模式,把类的实例方法移出成为全局性的过程。为了提高这种过程的可重用性,过程代码应该象静态工具方法一样编写:它只能使用自己的输入参数,只能调用其他全局性的过程,不能使用任何非局部的变量。这种对外部依赖关系的限制简化了过程的应用,使得过程能够方便地用于任何地方。当然,由于这种组织方式总是使得代码具有更清晰的结构,即使是不考虑重用性的代码也同样能够从中获益。

在Java中,方法不能脱离类而单独存在。为此,我们可以把相关的过程组织成为独立的类,并把这些过程定义为公用静态方法。

例如,对于下面这个类:

class Polygon {
.
.
public int getPerimeter() {…}
public boolean isConvex() {…}
public boolean containsPoint(Point p) {…}
.
.
}

我们可以把它改写成:

class Polygon {
.
.
public int getPerimeter() {return pPolygon.computePerimeter(this);}
public boolean isConvex() {return pPolygon.isConvex(this);}
public boolean containsPoint(Point p) {return pPolygon.containsPoint(this, p);}
.
}

其中,pPolygon是:

class pPolygon {
static public int computePerimeter(Polygon polygon) {…}
static public boolean isConvex(Polygon polygon) {…}
static public boolean
containsPoint(Polygon polygon, Point p) {…}
}

从类的名字pPolygon可以看出,该类所封装的过程主要与Polygon类型的对象有关。名字前面的p表示该类的唯一目的是组织公用静态过程。在Java中,类的名字以小写字母开头是一种非标准的做法,但象pPloygon这样的类事实上并不提供普通Java类的功能。也就是说,它并不代表着一类对象,它只是Java语言组织代码的一种机制。

在上面这个例子中,改动代码的最终效果是使得应用Polygon功能的客户代码不必再从Polygon继承。Polygon类的功能现在已经由pPolygon类以过程为单位提供。客户代码只使用自己需要的代码,无需关心Polygon类中自己不需要的功能。但它并不意味着在这种新式过程化编程中类的作用有所削弱。恰恰相反,在组织和封装对象数据成员的过程中,类起到了不可或缺的作用,而且正如本文接下来所介绍的,类通过多重接口实现多态性的能力本身也带来了卓越的代码重用支持。然而,由于用实例方法封装代码功能并不是首选的代码重用手段,所以通过类继承达到代码重用和多态性支持也不是最理想的。

措施二:把参数类型改成接口
正如Allen Holub在《Build User Interfaces for Object-Oriented Systems》中所指出的,在面向对象编程中,代码重用真正的要点在于通过接口参数类型利用多态性,而不是通过类继承:

“……我们通过对接口而不是对类编程达到代码重用的目的。如果某个方法的所有参数都是对一些已知接口的引用,那么这个方法就能够操作这样一些对象:当我们编写方法的代码时,这些对象的类甚至还不存在。从技术上说,可重用的是方法,而不是传递给方法的对象。”

在“措施一”得到的结果上应用Holub的看法,当某块代码能够编写为独立的全局过程时,只要把它所有类形式的参数改为接口形式,我们就可以进一步提高它的可重用能力。经过这个改动之后,过程的参数可以是实现了该接口的所有类的对象,而不仅仅是原来的类所创建的对象。由此,过程将能够对可能存在的大量的对象类型进行操作。

例如,假设有这样一个全局静态方法:

static public boolean contains(Rectangle rect, int x, int y) {…}

这个方法用于检查指定的点是否包含在矩形里面。在这个例子中,rect参数的类型可以从Rectangle类改变为接口类型,如下所示:

static public boolean contains(Rectangular rect, int x, int y) {…}

而Rectangular接口的定义是:

public interface Rectangular {Rectangle getBounds();}

现在,所有可以描述为矩形的类(即,实现了Rectangular接口的类)所创建的对象都可以作为提供给pRectangular.contains()的rect参数。通过放宽参数类型的限制,我们使方法具有更好的可重用性。

不过,对于上面这个例子,Rectangular接口的getBounds方法返回Rectangle,你可能会怀疑这么做是否真正值得。换言之,如果我们知道传入过程的对象会在被调用时返回一个Rectangle,为什么不直接传入Rectangle取代接口类型呢?之所以不这么做,最重要的原因与集合有关。让我们假设有这样一个方法:

static public boolean areAnyOverlapping(Collection rects) {…}

该方法用于检查给定集合中的任意矩形对象是否重叠。在这个方法的内部,当我们用循环依次访问集合中的各个对象时,如果我们不能把对象cast成为Rectangular之类的接口类型,又如何能够访问对象的矩形区域呢?唯一的选择是把对象cast成为它特有的类形式(我们知道它有一个方法可以返回矩形),它意味着方法必须事先知道它所操作的对象类型,从而使得方法的重用只限于那几种对象类型。而这正是前面这个措施力图先行避免的问题!

措施三:选择最简单的参数接口类型
在实施第二个措施时,应该选用哪一种接口类型来取代给定的类形式?答案是哪一个接口完全满足过程对参数的需求,同时又具有最少的多余代码和数据。描述参数对象要求的接口越简单,其他类实现该接口的机会就越大——由此,其对象能够作为参数使用的类也越多。从下面这个例子可以很容易地看出这一点:

static public boolean areOverlapping(Window window1, Window window2) {…}

这个方法用于检查两个窗口(假定是矩形窗口)是否重叠。如果这个方法只要求从参数获得两个窗口的矩形坐标,此时相应地简化这两个参数是一种更好的选择:

static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {…}

上面的代码假定Window类型实现了Rectangular接口。经过改动之后,对于任何矩形对象我们都可以重用该方法的功能。

有些时候可能会出现描述参数需求的接口拥有太多方法的情况。此时,我们应该在全局名称空间中定义一个新的公共接口供其他面临同一问题的代码重用。

当我们需要象使用C语言中的函数指针一样使用参数时,创建唯一的接口描述参数需求是最好的选择。例如,假设有下面这个过程:

static public void sort(List list, SortComparison comp) {…}

该方法运用参数中提供的比较对象comp,通过比较给定列表list中的对象排序list列表。sort对comp对象的唯一要求是要调用一个方法进行比较。因此,SortComparison应该是只带有一个方法的接口:

public interface SortComparison {
boolean comesBefore(Object a, Object b);
}

SortComparison接口的唯一目的在于为sort提供一个它所需功能的钩子,因此SortComparison接口不能在其他地方重用。

总而言之,本文三个措施适合于改造现有的、按照面向对象惯例编写的代码。这三个措施与面向对象编程技术结合就得到了一种可在以后编写代码时使用的新式代码编写技术,它能够简化方法的复杂性和依赖关系,同时提高方法的可重用能力和内部凝聚力。

当然,这里的三个措施不能用于那些天生就不适合重用的代码。不适合重用的代码通常出现在应用的表现层。例如,创建程序用户界面的代码,以及联结到输入事件的控制代码,都属于那种在程序和程序之间千差万别的代码,这种代码几乎不可能重用。