• 首先澄清一个误区,mkv不是一种压缩格式,DivX、XviD才是视频压缩格式,mp3、ogg才是音频压缩格式。而mkv是个“组合”和“封装”的格式,换句话说就是一种容器格式。

    举个例子的话就比较容易理解了,把只有视频的XviD和只有音频的mp3组合起来,然后以一种多媒体介质的形式出现,最常见的就是avi,其次就是ogm,还有mp4等不太常见的。


    avi的出现已经超过了10年,渐渐体现出老态了,...
  • 2007-11-13

    L71的问题

    前段时间我的L71没有电了,放了半天,再开机便启动不了了,老是白屏闪动。本来想找修手机的求助,但查到刷机可能解决问题,最后还是决定自己动手试试。对于一般的刷机我还是有些操作的,换个屏幕啊,搞个软件啥的,至于真正的刷新的系统,还是比较触的,因为我的一个朋友用了摩托罗拉的手机,没事刷机刷坏了,我也害怕这个问题。但现在没有办法,只好试试了,我找了n多的版本,都没有办法刷机成功,最后发现我的版本需要比这个高级的才可以,最后找到了一个比较新的高版本试了下,果然可以,呵呵!终于问题解决了,但是我里面的n多联系人没有办法导出,只好重新一个一个去找电话,郁闷啊!!!所以以后遇到情况尽量保存一把电话信息,可以使用mpt来保存的。

    如果朋友们也出现了这个问题,希望可以帮到你们。大家可以去摩托罗拉的论坛找找,很多问题可以...
  • 昨天遇到个问题,发现一台服务器(windows 2003)的桌面连接不停的断开,查看了很多地方,都没有问题,然后发现在管理工具下面的终端服务配置上的会话选项下,有断开连接的时间是10分钟,终于找到了原因了,肯定是流氓软件干的,被人中了木马之流,后来便查找哪里可以将其改回原先的从不的选项,最后在组策略编辑器下,管理模板--windows组件下找到了会话选项中的为断开的会话设置时间的选项,然后改回原先的样子就ok了,问题解决了!

     

    ...
  • 2007-11-13

    cvs与svn的比较

    1 对重命名、删除文件的支持
       cvs:不支持本地文件重命名提交
               删除分remove和erase两种前者把本地和库中文件都删除 后者只是删除本地文件
               ...

  • Foxmail和Outlook Express无疑是是两款非常优秀的邮件客户端程序,在国内都拥有大量的用户。许多人往往同时使用这两款软件。Foxmail以“网际飞狐”的美名扬名天下,拥有相当多的国内用户,但Outlook Express系出名门,同样不能小觑。因此,许多用户的机器里同时装有这两款软件。那么,在实际操作中能不能在两者之间交换数据呢?

    一、基础知识

    我们先来了解一下Foxmail和Outlook Express的目录结构。

    Foxmail的默认安装目录是“\program files\Foxmail”,邮箱数据都保存在“\Foxmail\mail\账户名”

    目录下,其中“账户名”目录对应于Foxmail中建立的账户。...
  • 全名:文特沃斯·厄尔·米勒三世 Wentworth Earl Miller
    昵称:Stinky(这是因为他在大学合唱团牙尖嘴利,可不是臭烘烘的意思)
    出生地:英国牛津郡西北郊区的景区古镇
    居住地:洛杉矶 生日:1972年6月12日
    星座:双子座
    家庭成员:父母,两个妹妹
    外型:Went有着近乎完美的骨骼结构,187的身高,黑色卷发,不过最扯的是他的双瞳颜色不同,左眼为淡褐色,右眼为淡绿色。(哇!这不是传说中的妖瞳吗?)不过Went为了掩盖自己眼睛的“秘密”,平常总是带有色的隐形眼镜,所以照片上看不出双瞳的不同颜色。他的出色外型主要归功于他的父母,Went 有着复杂的血统,他的父亲有美国黑人,牙买加,英国,德国犹太人血统,母亲则有法国,荷兰,叙利亚,黎巴嫩血统,可说是&...
  •  CAS(Central Authentication Service) Yale 大学发起的一个开源项目,据统计,大概每 10 个采用开源构建 Web SSO Java 项目,就有 8 个使用 CAS 。对这些统计,我虽然不以为然,但有一点可以肯定的是, CAS 是我认为最简单实效,而且足够安全的 SSO 选择。

           本节主要分析 CAS 的安全性,以及为什么 CAS 被这样设计,带着少许密码学的基础知识,我希望有助于读者对 CAS 的协议有更深层次的理解。

    从结构体系看, CAS 包含两部分:

    l         CAS Server

    CAS Server 负责完成对用户的认证工作, CAS Server 需要独立部署,有不止一种 CAS Server 的实现, Yale CAS Server ESUP CAS Server 都是很不错的选择。

    CAS Server 会处理用户名 / 密码等凭证 (Credentials) ,它可能会到数据库检索一条用户帐号信息,也可能在 XML 文件中检索用户密码,对这种方式, CAS 均提供一种灵活但同一的接口 / 实现分离的方式, CAS 究竟是用何种认证方式,跟 CAS 协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展。

    l         CAS Client

    CAS Client 负责部署在客户端(注意,我是指 Web 应用),原则上, CAS Client 的部署意味着,当有对本地 Web 应用的受保护资源的访问请求,并且需要对请求方进行身份认证, Web 应用不再接受任何的用户名密码等类似的 Credentials ,而是重定向到 CAS Server 进行认证。

    目前, CAS Client 支持(某些在完善中)非常多的客户端,包括 Java .Net ISAPI Php Perl uPortal Acegi Ruby VBScript 等客户端,几乎可以这样说, CAS 协议能够适合任何语言编写的客户端应用。

     剖析协议就像剖析设计模式,有些时候,协议让人摸不着头脑。 CAS 的代理模式要相对复杂一些,它引入了一些新的概念,我希望能够在这里描述一下其原理,有助于读者在配置和调试 CAS SSO 有更清晰的思路。

    如果没记错, CAS 协议应该是由 Drew Mazurek 负责可开发的,从 CAS v1 到现在的 CAS v3 ,整个协议的基础思想都是基于 Kerberos 的票据方式。

           CAS v1 非常原始,传送一个用户名居然是 ”yes\ndavid.turing” 的方式, CAS v2 开始使用了 XML 规范,大大增强了可扩展性, CAS v3 开始使用 AOP 技术,让 Spring 爱好者可以轻松配置 CAS Server 到现有的应用环境中。

    CAS 是通过 TGT(Ticket Granting Ticket) 来获取 ST(Service Ticket) ,通过 ST 来访问服务,而 CAS 也有对应 TGT ST 的实体,而且他们在保护 TGT 的方法上虽然有所区别,但是,最终都可以实现这样一个目的——免去多次登录的麻烦。

           下面,我们看看 CAS 的基本协议框架:

    基础协议

    cas_protocol-1.jpg 
                                                     

                                                     CAS
    基础模式

           上图是一个最基础的 CAS 协议, CAS Client Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同时, CAS Client 会分析 HTTP 请求中是否包请求 Service Ticket( 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的,于是, CAS Client 会重定向用户请求到 CAS Server Step 2 )。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials CAS Server 会产生一个随机的 Service Ticket ,然后,缓存该 Ticket ,并且重定向用户到 CAS Client (附带刚才产生的 Service Ticket ), Service Ticket 是不可以伪造的,最后, Step 5 Step6 CAS Client CAS Server 之间完成了一个对用户的身份核实,用 Ticket 查到 Username ,因为 Ticket CAS Server 产生的,因此,所以 CAS Server 的判断是毋庸置疑的。

           该协议完成了一个很简单的任务,就是 User(david.turing) 打开 IE ,直接访问 helloservice 应用,它被立即重定向到 CAS Server 进行认证, User 可能感觉到浏览器在 helloservcie casserver 之间重定向,但 User 是看不到, CAS Client CAS Server 相互间的 Service Ticket 核实 (Validation) 过程。当 CAS Server 告知 CAS Client 用户 Service Ticket 对应确凿身份, CAS Client 才会对当前 Request 的用户进行服务。

    CAS 如何实现 SSO

           当我们的 Web 时代还处于初级阶段的时候, SSO 是通过共享 cookies 来实现,比如,下面三个域名要做 SSO

    http://www.blogjava.net

    http://www.matrix.org.cn

    http://www.csdn.net

    如果通过 CAS 来集成这三个应用,那么,这三个域名都要做一些域名映射,

    http://blogjava.cas.org

    http://matrix.cas.org

    http://csdn.cas.org

    因为是同一个域,所以每个站点都能够共享基于 cas.org cookies 。这种方法原始,不灵活而且有不少安全隐患,已经被抛弃了。

    CAS 可以很简单的实现跨域的 SSO ,因为,单点被控制在 CAS Server ,用户最有价值的 TGC-Cookie 只是跟 CAS Server 相关, CAS Server 就只有一个,因此,解决了 cookies 不能跨域的问题。

    回到 CAS 的基础协议图,当 Step3 完成之后, CAS Server 会向 User 发送一个 Ticket granting cookie (TGC) User 的浏览器,这个 Cookie 就类似 Kerberos TGT ,下次当用户被 Helloservice2 重定向到 CAS Server 的时候, CAS Server 会主动 Get 到这个 TGC cookie ,然后做下面的事情:

    1              如果 User 的持有 TGC 且其还没失效,那么就走基础协议图的 Step4 ,达到了 SSO

  • “粉飞客”大概在《爱丽斯梦游仙境》的19世纪就有了,小说“粉丝”按自己意愿让爱丽斯梦游了好几个版本。在《越狱》的中国“粉丝”站点、FOX官网、livejournal上,分散着诸多“粉飞客”,有的纯属恶搞,有的却透着认真劲。
  • 从北京时间上午8点美国开始播放《越狱》第13集,到下午18点,国内网民可以下载到内嵌中文字幕的片子,整个过程不过10个小时。因为传播渠道畅通,中国的《越狱》“粉丝”过上了 “天涯共此时”的日子,但在与剧组互动上,却颇有点“天高皇帝远”。
  • 互联网正在将世界推平,从美国电视台播放一集《越狱》,到中国网民通过有关途径下载中文字幕版本的新片,相隔不过12小时。观众,尤其是“粉丝”开始获得空前的选择权与参与权。电视还有前途吗?也许,它的前途就是嫁给互联网。
  • 前几天中了病毒(或者说是流氓软件),老是系统不正常的重启explorer,出现错误等等。

    于是对系统检测一把,发现了在ie中加载了插件,无法删除,然后发现多个系统进程(explorer,winlogin,services等)中都驻留了流氓软件。

    面对这样的状况,你在安全模式下杀毒是没有办法解决的,因为这些都是驱动层面的,即使杀毒软件能清楚驱动级别的,但是如果要启动explorer就没有意义了,因此只有驱动级别的杀毒软件(无界面的)可以处理!

    因此鉴于瑞星,诺顿都无法解决,卡卡和安全卫士360都不能处理的情况下,我只好考虑进入纯dos下解决问题了。目前有很多工具可以帮助进入纯dos,修改文件系统,将reporter.dll ,wmpkn.dll和rd.sys,hdfs.sys都删除。然后进入安全模式,将注册表里面的一些相关信息清除掉,关闭相关的ie插件。再重启,进入系统,问题解决~~

  • MySQL的操作权限完整列表,解释了user,db,host等等表中对应列的操作权限。

    对用户管理很有帮助的参考信息。

    用户的具体创建和授权,可以参考相关文档,都有比较详细的说明,这里就不列出了。

    MYSQL版本5.1。

    'Privilege' 'Context' 'Comment'
    'Alter' 'Tables' 'To alter the table'
    'Alter routine' 'Functions,Procedures' 'To alter or drop stored functions/procedures'
    'Create' 'Databases,Tables,Indexes' 'To create new databases and tables'
    'Create routine' 'Functions,Procedures' 'To use CREATE FUNCTION/PROCEDURE'
    'Create temporary tables' 'Databases' 'To use CREATE TEMPORARY TABLE'
    'Create view' 'Tables' 'To create new views'
    'Create user' 'Server Admin' 'To create new users'
    'Delete' 'Tables' 'To delete existing rows'
    'Drop' 'Databases,Tables' 'To drop databases, tables, and views'
    'Event' 'Server Admin' 'To create, alter, drop and execute events'
    'Execute' 'Functions,Procedures' 'To execute stored routines'
    'File' 'File access on server' 'To read and write files on the server'
    'Grant option' 'Databases,Tables,Functions,Procedures' 'To give to other users those privileges you possess'
    'Index' 'Tables' 'To create or drop indexes'
    'Insert' 'Tables' 'To insert data into tables'
    'Lock tables' 'Databases' 'To use LOCK TABLES (together with SELECT privilege)'
    'Process' 'Server Admin' 'To view the plain text of currently executing queries'
    'References' 'Databases,Tables' 'To have references on tables'
    'Reload' 'Server Admin' 'To reload or refresh tables, logs and privileges'
    'Replication client' 'Server Admin' 'To ask where the slave or master servers are'
    'Replication slave' 'Server Admin' 'To read binary log events from the master'
    'Select' 'Tables' 'To retrieve rows from table'
    'Show databases' 'Server Admin' 'To see all databases with SHOW DATABASES'
    'Show view' 'Tables' 'To see views with SHOW CREATE VIEW'
    'Shutdown' 'Server Admin' 'To shut down the server'
    'Super' 'Server Admin' 'To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.'
    'Trigger' 'Tables' 'To use triggers'
    'Update' 'Tables' 'To update existing rows'
    'Usage' 'Server Admin' 'No privileges - allow connect only'

  • 前段时间老是发现上不了gmail了,显示的是操作代码无法执行,错误代码是007。然后换个账号就可以登录了,可见问题是在客户端。有可能是本机的cookie或者本机的google产品出了问题。

    我清理了一下cookie,然后清除了脱机文件,再登录就可以,问题解决。

  • 分代收集( Generational Collecting )算法
    和大多数软件开发技术一样,统计学原理总能在技术发展的过程中起到强力催化剂的作用。 1980 年前后,善于在研究中使用统计分析知识的技术人员发现,大多数内存块的生存周期都比较短,垃圾收集器应当把更多的精力放在检查和清理新分配的内存块上。这个发现对于垃圾收集技术的价值可以用餐巾纸的例子概括如下:

    如果垃圾收集机器人足够聪明,事先摸清了餐厅里每个人在用餐时使用餐巾纸的习惯——比如有些人喜欢在用餐前后各用掉一张餐巾纸,有的人喜欢自始至终攥着一张餐巾纸不放,有的人则每打一个喷嚏就用去一张餐巾纸——机器人就可以制定出更完善的餐巾纸回收计划,并总是在人们刚扔掉餐巾纸没多久就把垃圾捡走。这种基于统计学原理的做法当然可以让餐厅的整洁度成倍提高。

    D. E. Knuth , T. Knight , G. Sussman 和 R. Stallman 等人对内存垃圾的分类处理做了最早的研究。 1983 年, H. Lieberman 和 C. Hewitt 发表了题为“基于对象寿命的一种实时垃圾收集器( A real-time garbage collector based on the lifetimes of objects )”的论文。这篇著名的论文标志着分代收集算法的正式诞生。此后,在 H. G. Baker , R. L. Hudson , J. E. B. Moss 等人的共同努力下,分代收集算法逐渐成为了垃圾收集领域里的主流技术。

    分代收集算法通常将堆中的内存块按寿命分为两类,年老的和年轻的。垃圾收集器使用不同的收集算法或收集策略,分别处理这两类内存块,并特别地把主要工作时间花在处理年轻的内存块上。分代收集算法使垃圾收集器在有限的资源条件下,可以更为有效地工作——这种效率上的提高在今天的 Java 虚拟机中得到了最好的证明。

    应用浪潮
    Lisp 是垃圾收集技术的第一个受益者,但显然不是最后一个。在 Lisp 语言之后,许许多多传统的、现代的、后现代的语言已经把垃圾收集技术拉入了自己的怀抱。随便举几个例子吧:诞生于 1964 年的 Simula 语言, 1969 年的 Smalltalk 语言, 1970 年的 Prolog 语言, 1973 年的 ML 语言, 1975 年的 Scheme 语言, 1983 年的 Modula-3 语言, 1986 年的 Eiffel 语言, 1987 年的 Haskell 语言……它们都先后使用了自动垃圾收集技术。当然,每一种语言使用的垃圾收集算法可能不尽相同,大多数语言和运行环境甚至同时使用了多种垃圾收集算法。但无论怎样,这些实例都说明,垃圾收集技术从诞生的那一天起就不是一种曲高和寡的“学院派”技术。

    对于我们熟悉的 C 和 C++ 语言,垃圾收集技术一样可以发挥巨大的功效。正如我们在学校中就已经知道的那样, C 和 C++ 语言本身并没有提供垃圾收集机制,但这并不妨碍我们在程序中使用具有垃圾收集功能的函数库或类库。例如,早在 1988 年, H. J. Boehm 和 A. J. Demers 就成功地实现了一种使用保守垃圾收集算法( Conservative GC Algorithmic )的函数库(参见 http://www.hpl.hp.com/personal/Hans_Boehm/gc )。我们可以在 C 语言或 C++ 语言中使用该函数库完成自动垃圾收集功能,必要时,甚至还可以让传统的 C/C++ 代码与使用自动垃圾收集功能的 C/C++ 代码在一个程序里协同工作。

    1995 年诞生的 Java 语言在一夜之间将垃圾收集技术变成了软件开发领域里最为流行的技术之一。从某种角度说,我们很难分清究竟是 Java 从垃圾收集中受益,还是垃圾收集技术本身借 Java 的普及而扬名。值得注意的是,不同版本的 Java 虚拟机使用的垃圾收集机制并不完全相同, Java 虚拟机其实也经过了一个从简单到复杂的发展过程。在 Java 虚拟机的 1.4.1 版中,人们可以体验到的垃圾收集算法就包括分代收集、复制收集、增量收集、标记-整理、并行复制( Parallel Copying )、并行清除( Parallel Scavenging )、并发( Concurrent )收集等许多种, Java 程序运行速度的不断提升在很大程度上应该归功于垃圾收集技术的发展与完善。

    尽管历史上已经有许多包含垃圾收集技术的应用平台和操作系统出现,但 Microsoft .NET 却是第一种真正实用化的、包含了垃圾收集机制的通用语言运行环境。事实上, .NET 平台上的所有语言,包括 C# 、 Visual Basic .NET 、 Visual C++ .NET 、 J# 等等,都可以通过几乎完全相同的方式使用 .NET 平台提供的垃圾收集机制。我们似乎可以断言, .NET 是垃圾收集技术在应用领域里的一次重大变革,它使垃圾收集技术从一种单纯的技术变成了应用环境乃至操作系统中的一种内在文化。这种变革对未来软件开发技术的影响力也许要远远超过 .NET 平台本身的商业价值。

    大势所趋
    今天,致力于垃圾收集技术研究的人们仍在不懈努力,他们的研究方向包括分布式系统的垃圾收集、复杂事务环境下的垃圾收集、数据库等特定系统的垃圾收集等等。

    但在程序员中间,仍有不少人对垃圾收集技术不屑一顾,他们宁愿相信自己逐行编写的 free 或 delete 命令,也不愿把垃圾收集的重任交给那些在他们看来既蠢又笨的垃圾收集器。

    我个人认为,垃圾收集技术的普及是大势所趋,这就像生活会越来越好一样毋庸置疑。今天的程序员也许会因为垃圾收集器要占用一定的 CPU 资源而对其望而却步,但二十多年前的程序员还曾因为高级语言速度太慢而坚持用机器语言写程序呢!在硬件速度日新月异的今天,我们是要吝惜那一点儿时间损耗而踟躇不前,还是该坚定不移地站在代码和运行环境的净化剂——垃圾收集的一边呢?

  • 走向成熟
    从 1970 年代开始,随着科学研究和应用实践的不断深入,人们逐渐意识到,一个理想的垃圾收集器不应在运行时导致应用程序的暂停,不应额外占用大量的内存空间和 CPU 资源,而三种传统的垃圾收集算法都无法满足这些要求。人们必须提出更新的算法或思路,以解决实践中碰到的诸多难题。当时,研究者的努力目标包括:

    第一,提高垃圾收集的效率。使用标记-清除算法的垃圾收集器在工作时要消耗相当多的 CPU 资源。早期的 Lisp 运行环境收集内存垃圾的时间竟占到了系统总运行时间的 40% !——垃圾收集效率的低下直接造就了 Lisp 语言在执行速度方面的坏名声;直到今天,许多人还条件反射似地误以为所有 Lisp 程序都奇慢无比。

    第二,减少垃圾收集时的内存占用。这一问题主要出现在复制算法中。尽管复制算法在效率上获得了质的突破,但牺牲一半内存空间的代价仍然是巨大的。在计算机发展的早期,在内存价格以 KB 计算的日子里,浪费客户的一半内存空间简直就是在变相敲诈或拦路打劫。

    第三,寻找实时的垃圾收集算法。无论执行效率如何,三种传统的垃圾收集算法在执行垃圾收集任务时都必须打断程序的当前工作。这种因垃圾收集而造成的延时是许多程序,特别是执行关键任务的程序没有办法容忍的。如何对传统算法进行改进,以便实现一种在后台悄悄执行,不影响——或至少看上去不影响——当前进程的实时垃圾收集器,这显然是一件更具挑战性的工作。

    研究者们探寻未知领域的决心和研究工作的进展速度同样令人惊奇:在 1970 年代到 1980 年代的短短十几年中,一大批在实用系统中表现优异的新算法和新思路脱颖而出。正是因为有了这些日趋成熟的垃圾收集算法,今天的我们才能在 Java 或 .NET 提供的运行环境中随心所欲地分配内存块,而不必担心空间释放时的风险。

    标记-整理( Mark-Compact )算法
    标记-整理算法是标记-清除算法和复制算法的有机结合。把标记-清除算法在内存占用上的优点和复制算法在执行效率上的特长综合起来,这是所有人都希望看到的结果。不过,两种垃圾收集算法的整合并不像 1 加 1 等于 2 那样简单,我们必须引入一些全新的思路。 1970 年前后, G. L. Steele , C. J. Cheney 和 D. S. Wise 等研究者陆续找到了正确的方向,标记-整理算法的轮廓也逐渐清晰了起来:

    在我们熟悉的餐厅里,这一次,垃圾收集机器人不再把餐厅分成两个南北区域了。需要执行垃圾收集任务时,机器人先执行标记-清除算法的第一个步骤,为所有使用中的餐巾纸画好标记,然后,机器人命令所有就餐者带上有标记的餐巾纸向餐厅的南面集中,同时把没有标记的废旧餐巾纸扔向餐厅北面。这样一来,机器人只消站在餐厅北面,怀抱垃圾箱,迎接扑面而来的废旧餐巾纸就行了。

    实验表明,标记-整理算法的总体执行效率高于标记-清除算法,又不像复制算法那样需要牺牲一半的存储空间,这显然是一种非常理想的结果。在许多现代的垃圾收集器中,人们都使用了标记-整理算法或其改进版本。

    增量收集( Incremental Collecting )算法
    对实时垃圾收集算法的研究直接导致了增量收集算法的诞生。

    最初,人们关于实时垃圾收集的想法是这样的:为了进行实时的垃圾收集,可以设计一个多进程的运行环境,比如用一个进程执行垃圾收集工作,另一个进程执行程序代码。这样一来,垃圾收集工作看上去就仿佛是在后台悄悄完成的,不会打断程序代码的运行。

    在收集餐巾纸的例子中,这一思路可以被理解为:垃圾收集机器人在人们用餐的同时寻找废弃的餐巾纸并将它们扔到垃圾箱里。这个看似简单的思路会在设计和实现时碰上进程间冲突的难题。比如说,如果垃圾收集进程包括标记和清除两个工作阶段,那么,垃圾收集器在第一阶段中辛辛苦苦标记出的结果很可能被另一个进程中的内存操作代码修改得面目全非,以至于第二阶段的工作没有办法开展。

    M. L. Minsky 和 D. E. Knuth 对实时垃圾收集过程中的技术难点进行了早期的研究, G. L. Steele 于 1975 年发表了题为“多进程整理的垃圾收集( Multiprocessing compactifying garbage collection )”的论文,描述了一种被后人称为“ Minsky-Knuth-Steele 算法”的实时垃圾收集算法。 E. W. Dijkstra , L. Lamport , R. R. Fenichel 和 J. C. Yochelson 等人也相继在此领域做出了各自的贡献。 1978 年, H. G. Baker 发表了“串行计算机上的实时表处理技术( List Processing in Real Time on a Serial Computer )”一文,系统阐述了多进程环境下用于垃圾收集的增量收集算法。

    增量收集算法的基础仍是传统的标记-清除和复制算法。增量收集算法通过对进程间冲突的妥善处理,允许垃圾收集进程以分阶段的方式完成标记、清理或复制工作。详细分析各种增量收集算法的内部机理是一件相当繁琐的事情,在这里,读者们需要了解的仅仅是: H. G. Baker 等人的努力已经将实时垃圾收集的梦想变成了现实,我们再也不用为垃圾收集打断程序的运行而烦恼了。

  • 复制( Copying )算法
    为了解决标记-清除算法在垃圾收集效率方面的缺陷, M. L. Minsky 于 1963 年发表了著名的论文“一种使用双存储区的 Lisp 语言垃圾收集器( A LISP Garbage Collector Algorithm Using Serial Secondary Storage )”。 M. L. Minsky 在该论文中描述的算法被人们称为复制算法,它也被 M. L. Minsky 本人成功地引入到了 Lisp 语言的一个实现版本中。

    复制算法别出心裁地将堆空间一分为二,并使用简单的复制操作来完成垃圾收集工作,这个思路相当有趣。借用餐巾纸的比喻,我们可以这样理解 M. L. Minsky 的复制算法:

    餐厅被垃圾收集机器人分成南区和北区两个大小完全相同的部分。午餐时,所有人都先在南区用餐(因为空间有限,用餐人数自然也将减少一半),用餐时可以随意使用餐巾纸。当垃圾收集机器人认为有必要回收废旧餐巾纸时,它会要求所有用餐者以最快的速度从南区转移到北区,同时随身携带自己正在使用的餐巾纸。等所有人都转移到北区之后,垃圾收集机器人只要简单地把南区中所有散落的餐巾纸扔进垃圾箱就算完成任务了。下一次垃圾收集的工作过程也大致类似,惟一的不同只是人们的转移方向变成了从北区到南区。如此循环往复,每次垃圾收集都只需简单地转移(也就是复制)一次,垃圾收集速度无与伦比——当然,对于用餐者往返奔波于南北两区之间的辛劳,垃圾收集机器人是决不会流露出丝毫怜悯的。

    M. L. Minsky 的发明绝对算得上一种奇思妙想。分区、复制的思路不仅大幅提高了垃圾收集的效率,而且也将原本繁纷复杂的内存分配算法变得前所未有地简明和扼要(既然每次内存回收都是对整个半区的回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存就可以了),这简直是个奇迹!不过,任何奇迹的出现都有一定的代价,在垃圾收集技术中,复制算法提高效率的代价是人为地将可用内存缩小了一半。实话实说,这个代价未免也太高了一些。

    无论优缺点如何,复制算法在实践中都获得了可以与标记-清除算法相比拟的成功。除了 M. L. Minsky 本人在 Lisp 语言中的工作以外,从 1960 年代末到 1970 年代初, R. R. Fenichel 和 J. C. Yochelson 等人也相继在 Lisp 语言的不同实现中对复制算法进行了改进, S. Arnborg 更是成功地将复制算法应用到了 Simula 语言中。

    至此,垃圾收集技术的三大传统算法——引用计数算法、标记-清除算法和复制算法——都已在 1960 年前后相继问世,三种算法各有所长,也都存在致命的缺陷。从 1960 年代后期开始,研究者的主要精力逐渐转向对这三种传统算法进行改进或整合,以扬长避短,适应程序设计语言和运行环境对垃圾收集的效率和实时性所提出的更高要求。

  • 引用计数( Reference Counting )算法
    1960 年以前,人们为胚胎中的 Lisp 语言设计垃圾收集机制时,第一个想到的算法是引用计数算法。拿餐巾纸的例子来说,这种算法的原理大致可以描述为:

    午餐时,为了把脑子里突然跳出来的设计灵感记下来,我从餐巾纸袋中抽出一张餐巾纸,打算在上面画出系统架构的蓝图。按照“餐巾纸使用规约之引用计数版”的要求,画图之前,我必须先在餐巾纸的一角写上计数值 1 ,以表示我在使用这张餐巾纸。这时,如果你也想看看我画的蓝图,那你就要把餐巾纸上的计数值加 1 ,将它改为 2 ,这表明目前有 2 个人在同时使用这张餐巾纸(当然,我是不会允许你用这张餐巾纸来擦鼻涕的)。你看完后,必须把计数值减 1 ,表明你对该餐巾纸的使用已经结束。同样,当我将餐巾纸上的内容全部誊写到笔记本上之后,我也会自觉地把餐巾纸上的计数值减 1 。此时,不出意外的话,这张餐巾纸上的计数值应当是 0 ,它会被垃圾收集器——假设那是一个专门负责打扫卫生的机器人——捡起来扔到垃圾箱里,因为垃圾收集器的惟一使命就是找到所有计数值为 0 的餐巾纸并清理它们。

    引用计数算法的优点和缺陷同样明显。这一算法在执行垃圾收集任务时速度较快,但算法对程序中每一次内存分配和指针操作提出了额外的要求(增加或减少内存块的引用计数)。更重要的是,引用计数算法无法正确释放循环引用的内存块,对此, D. Hillis 有一段风趣而精辟的论述:

    一天,一个学生走到 Moon 面前说:“我知道如何设计一个更好的垃圾收集器了。我们必须记录指向每个结点的指针数目。” Moon 耐心地给这位学生讲了下面这个故事:“一天,一个学生走到 Moon 面前说:‘我知道如何设计一个更好的垃圾收集器了……’”

    D. Hillis 的故事和我们小时候常说的“从前有座山,山上有个庙,庙里有个老和尚”的故事有异曲同工之妙。这说明,单是使用引用计数算法还不足以解决垃圾收集中的所有问题。正因为如此,引用计数算法也常常被研究者们排除在狭义的垃圾收集算法之外。当然,作为一种最简单、最直观的解决方案,引用计数算法本身具有其不可替代的优越性。 1980 年代前后, D. P. Friedman , D. S. Wise , H. G. Baker 等人对引用计数算法进行了数次改进,这些改进使得引用计数算法及其变种(如延迟计数算法等)在简单的环境下,或是在一些综合了多种算法的现代垃圾收集系统中仍然可以一展身手。

    标记-清除( Mark-Sweep )算法
    第一种实用和完善的垃圾收集算法是 J. McCarthy 等人在 1960 年提出并成功地应用于 Lisp 语言的标记-清除算法。仍以餐巾纸为例,标记-清除算法的执行过程是这样的:

    午餐过程中,餐厅里的所有人都根据自己的需要取用餐巾纸。当垃圾收集机器人想收集废旧餐巾纸的时候,它会让所有用餐的人先停下来,然后,依次询问餐厅里的每一个人:“你正在用餐巾纸吗?你用的是哪一张餐巾纸?”机器人根据每个人的回答将人们正在使用的餐巾纸画上记号。询问过程结束后,机器人在餐厅里寻找所有散落在餐桌上且没有记号的餐巾纸(这些显然都是用过的废旧餐巾纸),把它们统统扔到垃圾箱里。

    正如其名称所暗示的那样,标记-清除算法的执行过程分为“标记”和“清除”两大阶段。这种分步执行的思路奠定了现代垃圾收集算法的思想基础。与引用计数算法不同的是,标记-清除算法不需要运行环境监测每一次内存分配和指针操作,而只要在“标记”阶段中跟踪每一个指针变量的指向——用类似思路实现的垃圾收集器也常被后人统称为跟踪收集器( Tracing Collector )

    伴随着 Lisp 语言的成功,标记-清除算法也在大多数早期的 Lisp 运行环境中大放异彩。尽管最初版本的标记-清除算法在今天看来还存在效率不高(标记和清除是两个相当耗时的过程)等诸多缺陷,但在后面的讨论中,我们可以看到,几乎所有现代垃圾收集算法都是标记-清除思想的延续,仅此一点, J. McCarthy 等人在垃圾收集技术方面的贡献就丝毫不亚于他们在 Lisp 语言上的成就了。

  • 拓荒时代
    国内的程序员大多是在 Java 语言中第一次感受到垃圾收集技术的巨大魅力的,许多人也因此把 Java 和垃圾收集看成了密不可分的整体。但事实上,垃圾收集技术早在 Java 语言问世前 30 多年就已经发展和成熟起来了, Java 语言所做的不过是把这项神奇的技术带到了广大程序员身边而已。

    如果一定要为垃圾收集技术找一个孪生兄弟,那么, Lisp 语言才是当之无愧的人选。 1960 年前后诞生于 MIT 的 Lisp 语言是第一种高度依赖于动态内存分配技术的语言: Lisp 中几乎所有数据都以“表”的形式出现,而“表”所占用的空间则是在堆中动态分配得到的。 Lisp 语言先天就具有的动态内存管理特性要求 Lisp 语言的设计者必须解决堆中每一个内存块的自动释放问题(否则, Lisp 程序员就必然被程序中不计其数的 free 或 delete 语句淹没),这直接导致了垃圾收集技术的诞生和发展——说句题外话,上大学时,一位老师曾告诉我们, Lisp 是对现代软件开发技术贡献最大的语言。我当时对这一说法不以为然:布满了圆括号,看上去像迷宫一样的 Lisp 语言怎么能比 C 语言或 Pascal 语言更伟大呢?不过现在,当我知道垃圾收集技术、数据结构技术、人工智能技术、并行处理技术、虚拟机技术、元数据技术以及程序员们耳熟能详的许多技术都起源于 Lisp 语言时,我特别想向那位老师当面道歉,并收回我当时的幼稚想法。

    知道了 Lisp 语言与垃圾收集的密切关系,我们就不难理解,为什么垃圾收集技术的两位先驱者 J. McCarthy 和 M. L. Minsky 同时也是 Lisp 语言发展史上的重要人物了。 J. McCarthy 是 Lisp 之父,他在发明 Lisp 语言的同时也第一次完整地描述了垃圾收集的算法和实现方式; M. L. Minsky 则在发展 Lisp 语言的过程中成为了今天好几种主流垃圾收集算法的奠基人——和当时不少技术大师的经历相似, J. McCarthy 和 M. L. Minsky 在许多不同的技术领域里都取得了令人艳羡的成就。也许,在 1960 年代那个软件开发史上的拓荒时代里,思维敏捷、意志坚定的研究者更容易成为无所不能的西部硬汉吧。

    在了解垃圾收集算法的起源之前,有必要先回顾一下内存分配的主要方式。我们知道,大多数主流的语言或运行环境都支持三种最基本的内存分配方式,它们分别是:

    一、静态分配( Static Allocation ):静态变量和全局变量的分配形式。我们可以把静态分配的内存看成是家里的耐用家具。通常,它们无需释放和回收,因为没人会天天把大衣柜当作垃圾扔到窗外。

    二、自动分配( Automatic Allocation ):在栈中为局部变量分配内存的方法。栈中的内存可以随着代码块退出时的出栈操作被自动释放。这类似于到家中串门的访客,天色一晚就要各回各家,除了个别不识时务者以外,我们一般没必要把客人捆在垃圾袋里扫地出门。

    三、动态分配( Dynamic Allocation ):在堆中动态分配内存空间以存储数据的方式。堆中的内存块好像我们日常使用的餐巾纸,用过了就得扔到垃圾箱里,否则屋内就会满地狼藉。像我这样的懒人做梦都想有一台家用机器人跟在身边打扫卫生。在软件开发中,如果你懒得释放内存,那么你也需要一台类似的机器人——这其实就是一个由特定算法实现的垃圾收集器。

    也就是说,下面提到的所有垃圾收集算法都是在程序运行过程中收集并清理废旧“餐巾纸”的算法,它们的操作对象既不是静态变量,也不是局部变量,而是堆中所有已分配内存块。

  • 2006-10-22

    升级IE7.0!!

    Windows Internet Explorer 7 正式版 for XP 汉化版

    官方中文版在不久的将来会发布的,如果想快点体验到IE7正式版,而又不太会英文的朋友,推荐使用这个汉化版.仅仅把语言文件中的英文翻译为了中文,不会对程序稳定性造成任何影响.请放心使用.
    1、下载之后直接安装即可,不需要英文版.安装之后即为100%中文界面.
    2、仅替换了语言文件,未处理正版验证机制.
    3、由于安装程序具有数字签名验证,因此没有汉化安装程序.
    4、其中的语言文件(*.mui)完全适用于 IE7 for Server 2003 版本,您可以自行替换安装.不适用于64位版本.
    (其中可能要对windows的版本做正版验证,但可以通过,请放心使用)
    下载:Windows Internet Explorer 7 正式版 for XP 汉化版 

  • 摘自ZCXP.Net netguest撰写的文章:
    1.硬盘浪费空间产生的原因
    了解了文件大小和所占空间的原理后,我们知道,因为“簇”的存在,多数情况下每个文件实际占用的硬盘空间要大于文件的实际大小,这样不可避免地存在一定程度的硬盘空间浪费:因为每个文件的最后一簇都有可能有未被完全利用的空间(称为尾簇空间),一般来说,当文件个数比较多时,平均每个文件要浪费半个簇的空间;由于不同硬盘“簇”大小的不同,因此不同的硬盘或分区都存在不同的“使用效率”。同时,一个文件的数据会根据硬盘上扇区的实际使用情况,被分成若干段像一条链子一样存放,这种存储方式称为文件的链式存储。硬盘上的文件常常要进行创建、删除、修改等操作,这样的操作越多,文件就有可能被分得越零碎(每段至少是1簇),文件的读写效率也就越低,这其实也是“文件碎片”产生的原因。
    2.分析硬盘的使用率
    我们最终目的是要采取措施,尽最大可能提高硬盘使用率,减少存储空间的浪费,提高硬盘的存取效率。因此,我们要先使用Diskdata、Diskvision、PQ Magic等工具得到当前硬盘空间的使用效率。运行PQ Magic后,在其主界面中右击需要调整的分区名称,如H,选择“属性”可打“分区属性”对话框,切换到“浪费的簇”选项卡,即可查看到该分的使用率,如图所示。接下来应该对硬盘使用效率较低的情况进行分析。例如,如果要存储大量的小文件(一般小于4KB),选择越小的簇越能提高硬盘利用率。对于体积较大的文件(如视频、音频文件等),可以选择较大的簇提高硬盘的访问效率。对于数量较多的小文件和体积较大的文件,最好能分区存放,且选择不同的硬盘簇大小,这样既能减少硬盘空间浪费,也可以提高硬盘读取效率。
    3.提高硬盘使用率的实例
    例如,一个1.2GB 大小的分区,安装了钱龙股票软件,所有的文件实际大小为480MB,但占用的硬盘空间却达到1192MB,足足浪费了近700MB的空间!原来该分区使用的文件系统是FAT格式,一个簇的大小是64KB。钱龙软件中的大部分文件体积都很小,用户每天收到的大量股评和新闻也都是体积很小的文本文件,但每个文件都至少要占用64KB的空间,从而造成了硬盘空间较大的浪费。解决的办法很简单:将该分区从FAT转为FAT32,将簇从64KB减小为4KB,即可将浪费的大部分空间找回来。
    同样道理,如果你的空间有很多 1k / 2k 大小的图片 asp文件 htm文件 空间将将大量被浪费
    如果你的空间是 100m 的,那么作为测试空间大小,你可以上传1个100m 电影文件,如果可以上传,那说明空间大小是正常的.
    如果你的空间刚安装一个论坛论坛,假设是10m大小,但过了一段时间,我没有ftp上传文件啊?为什么占用空间达到 88m 了呢?因为不断注册用户,不断发帖子,数据库会不断变大,论坛上传的图片也会占用空间
    方法是:运行PQ Magic后,在其主界面中右击需要调整的分区名称,如H,选择“转换”可打开“转换分区”对话框,选择转换后的分区格式,如FAT32,再单击“确定”。然后在PQ Magic主界面右击需要调整的分区名称,选择“高级→调整簇的大小”,然后在“新建簇大小”后面选择新建簇的大小,如4KB,再单击“确定”即可。
    FATFAT: File Allocation Table 是"文件分配表"。顾名思义,就是用来记录文件所在位置的表格。不同的操作系统所使用的文件系统不尽相同。Dos使用FAT16; Windows NT 使用NTFS;Windows 95/98 同时提供了 FAT16 和 FAT32 供用户使用。2 FAT16 文件系统FAT16 使用了16 位的空间来表示每个扇区 (Sector) 配置文件的情形,故称之为FAT16。由于受到先天限制,FAT16每超过一定容量分区之后,所使用的簇 (Cluster) 大小就必须扩增,以适应更大的磁盘空间。每个要存到磁盘的文件都必须配置足够数量的簇,才能存放到磁盘。FAT16 各分区与簇的大小的关系如下表:
    FAT16 簇大小 分区大小 16MB - 127MB 2KB 128MB - 255MB 4KB 256MB - 511MB 8KB 512MB - 1023MB 16KB 1024MB - 2047MB 32KB
    如果你在一个1000MB 的分区中存放50KB的文件,由于该分区簇的大小为16KB,因此它要用到4个簇。而如果是一个1KB的文件,它也必须使用一个簇来存放。那么每个簇中剩下的空间可否拿来使用呢?答案是不行的。所以在使用磁盘时,都会或多或少的损失一些磁盘空间。由上可知,FAT16文件系统有两大缺点:
    缺 点 解 释 磁盘分区最大只能到2GB 当前8.4GB, 10GB, 20GB以上的硬盘比比皆是FAT16文件系统已不能适应当前这种大容量硬盘,必须被迫分成几个逻辑磁盘分区。而分区磁盘的大小又牵扯出簇的问题,可谓影响颇大。 使用簇大小不恰当 试想如果一个只有1KB大小的文件放置在一个1000MB的磁盘分区中,它所占用的空间并不是1KB,而是16KB,足足浪费了15KB!大多数的HTML文件大小多为1KB、2KB。如果硬盘上有100个这种小文件,你浪费的磁盘空间可从 700KB (511MB的分区)到3.1MB(2047MB的分区)。
    以上这两个问题常常使得用户在"分多大的分区才能节省空间,同时又可使硬盘使用更加方便有效"的抉择中徘徊不定。3. FAT32 文件系统为解决FAT16的问题,微软开发出FAT32系统。FAT32使用了32位空间来表示每个扇区(Sector) 配置文件状态。利用FAT32所能使用的单个分区,最大可达到2TB(2048GB),而且各种大小的分区所使用簇的大小,也恰如其分,上述优点,使硬盘利用更有效。现将分区与簇的大小汇整如下。
    分区大小 FAT16 簇大小 FAT32 簇大小 16MB - 127MB 2KB 512bytes 128MB - 255MB 4KB 512bytes 256MB - 259MB 8KB 512bytes 260MB - 511MB 8KB 4KB 512MB - 1023MB 16KB 4KB 1024MB - 2047MB 32KB 4KB 2048MB - 8GB 不支持 4KB 8GB - 16GB 不支持 8KB 16GB - 32GB 不支持 16KB 32GB以上 不支持 32KB
    3.1 FAT32使用上的限制看到这些优点,你一定迫不及待地想将FAT16转换为FAT32。不过在转换之前,要注意以下几点:1. 与其他PC操作系统不兼容。当前支持FAT32的操作系统近有 Windows95的 OSR2,以及Windows98;2. 有些磁盘工具、防毒软件还不认识FAT32,可能会造成转换后磁盘工具软件不能对FAT32的分区进行磁盘处理工作,而防毒软件会不认得这种文件系统,误判为中毒现象;3. 一些版本较旧的软件不能在FAT32的分区中执行;4. 小于512MB的分区不能转换为FAT32;5. 不能在FAT32分区中做磁盘压缩;6. 如果主板的BIOS支持 "Suspend - to - Disk"的功能,请将这项关闭, 因为在FAT32分区中是不能使用的;7. Windows98 所提供的转换工具只能将FAT16转换为FAT32,并不能再转换回来。Flash ROMFlash ROM在系统内起更新数据的作用,而无需使用刻录机。它位于主板上,用户可以很容易地更新BIOS,而无须打开电脑机箱。Flash ROM 在写入数据时是以块为单位的,例如,若块的大小为为4KB,则一次清除及写入4KB,不像EEPROM是针对每一字节进行写入。 Windows可以同时支持FAT32和NTFS两种文件系统,FAT32长于兼容性,NTFS长于系统安全性。在满足应用的前提下,怎样设置文件系统才能充分发挥Windows的特性呢?在讨论这个问题之前,我们先来看一下FAT32和NTFS两种文件系统各有哪些特点。
      FAT32文件系统
      在推出FAT32文件系统之前,通常PC机使用的文件系统是FAT16。像基于MS-DOS,Win 95等系统都采用了FAT16文件系统。在Win 9X下,FAT16支持的分区最大为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的情况下,分区越大簇就相应的要增大,存储效率就越低,势必造成存储空间的浪费。并且随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系统的要求。在这种情况下,推出了增强的文件系统FAT32。同FAT16相比,FAT32主要具有以下特点:
      1. 同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到2TB(2047GB),但是不能支持小于512MB的分区。基于FAT32的Win 2000可以支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。
      2. 由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多,通常情况下可以提高15%。
      3. FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性。
      NTFS文件系统
      NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。使用非常广泛的Windows NT 4.0采用的就是NTFS 4.0文件系统,相信它所带来的强大的系统安全性一定给广大用户留下了深刻的印象。Win 2000采用了更新版本的NTFS文件系统——NTFS 5.0,它的推出使得用户不但可以像Win 9X那样方便快捷地操作和管理计算机,同时也可享受到NTFS所带来的系统安全性。
      NTFS 5.0的特点主要体现在以下几个方面:
      1. NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Win 2000中的FAT32支持分区的大小最大为32GB。
      2. NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。
      3. NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不需要事先由其他程序进行解压缩,当对文件进行读取时,文件将自动进行解压缩;文件关闭或保存时会自动对文件进行压缩。
      4. NTFS采用了更小的簇,可以更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统,当分区的大小在2GB以下时,簇的大小都比相应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB),簇的大小都为4KB。相比之下,NTFS可以比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。
      5. 在NTFS分区上,可以为共享资源、文件夹以及文件设置访问许可权限。许可的设置包括两方面的内容:一是允许哪些组或用户对文件夹、文件和共享资源进行访问;二是获得访问许可的组或用户可以进行什么级别的访问。访问许可权限的设置不但适用于本地计算机的用户,同样也应用于通过网络的共享文件夹对文件进行访问的网络用户。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,应用审核策略可以对文件夹、文件以及活动目录对象进行审核,审核结果记录在安全日志中,通过安全日志就可以查看哪些组或用户对文件夹、文件或活动目录对象进行了什么级别的操作,从而发现系统可能面临的非法访问,通过采取相应的措施,将这种安全隐患减到最低。这些在FAT32文件系统下,是不能实现的。
      6. 在Win 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。设置磁盘配额后,可以对每一个用户的磁盘使用情况进行跟踪和控制,通过监测可以标识出超过配额报警阈值和配额限制的用户,从而采取相应的措施。磁盘配额管理功能的提供,使得管理员可以方便合理地为用户分配存储资源,避免由于磁盘空间使用的失控可能造成的系统崩溃,提高了系统的安全性。
      7. NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。
  • 故障重现:单位的机器XP Pro CHS with SP2 ,安装的MS office 2003。每次打开office文档,都会出现“MSISR.PRODUCTNAME不能被修复,请卸载后重新安装”。

    故障分析:上google、baidu中搜索到的相关信息也都是求助,没有解决的办法。尝试修复或重装office 2003均无果。从报错内容大致判断,应该是MSI(Microsoft Installer)出了问题。

    故障解决:下载并安装Windows Installer CleanUp Utility,然后运行该程序,在其给出的列表框中选中"(All Users) MSISR.PRODUCTNAME"并点击Remove按钮将其删除。

  • 流氓软件的技术五花八门,任何一项功能都有可能成为流氓技术,就象武器,用好了可以伸张正义,用歪了却成为罪恶的帮凶。
    首先我从win32下的一些流氓着数分析开始:
    1。我想做为一个流氓软件,首先要做到的是实时运行,譬如在注册表的run下,在boot下增加它的启动。这应该是比较老的方法,以前 3721好象就是在run下,但是现在一般的人都知道了。
    2。作为流氓软件,已经改变了以前一些木马的特性了,他没必要使自己一定要实时启动了,而是需要自己的时候再启动,譬如说打开一个浏览器窗口,这是一般流氓软件的方法,因为他需要连上网才能有利益可图,所以浏览器肯定是流氓软件必定监控的进程。
    3。使用BHO插件,这种技术早先特别流行,这是微软提供的接口,本意是让IE浏览器可以扩充功能。每当一个ie浏览器启动的时候,都会调用BHO下必要的插件,流氓软件就是利用这一点。监控了浏览器所有事件与信息。
    4。还有最笨的办法就是利用进程快照监控进程,判断有它自己所监控的进程启动,就使用atl得到浏览器指针,从而监控浏览器所有事件与信息。
    5,还有一种方法就是使用spi,这是我在网上看到的。spi是分层协议,当winsock2启动的时候都会调用它的dll,可以监控所有应用层数据包。从而监控用户信息,而且能实时启动。
    6。hook方法,hook技术可以所应用太广泛了,特别是监控方面。所以流氓软件也不会错过。首先应用的是api函数hook,譬如windows核心编程里的apihook类,或者微软的detous都可以完成,两者方法其实相同就是修改IDT函数入口地址。api hook钩住createprocess 就可以监控进程,比进程快照性能更强,可以钩住spi下的函数可以完成spi下的所有功能。还有消息hook,鼠标消息,键盘消息,日子消息等等钩子,方法实在太多,都可以利用。
    上面列举了一些流氓软件的使用方法,但是流氓软件的一个特性是他无法卸载。所以它又要使用下面的方法了
    因为上面的很多方法都可以删除注册表卸载他们,那怎么办呢,那就会时时监控,它会在它的进程,或者线程里监控注册表项,设置一个循环监控,发现没了就继续安装,增加。我想这应该是很多流氓软件的技术。
    那现在又出现了一个新问题,那就是流氓软件的进程线程要是结束掉怎么办呢???看西面
    7。一种方法就是上面的api hook技术,钩住openprocess ,用自己的函数判断只要打开的是自己进程就返回正确,使用这种方法,用户或者一般的软件就无法结束它的进程了。
    8。还有一种是上面象bho,spi根本没有进程。一般的用户也无法删除他
    9。还有一种方法是远程线程,这个技术用的也很普遍,首先是象api hook一样向目标进程里申请一段内存空间,然后使用自己映射过去,然后使用CreateRemoteThread创建远程线程。一般很多流氓软件或者以前的一些木马程序,都是把线程注入到系统进程譬如explorer,service等等,使用用户或者一般的杀毒软件很难处理或者结束。。
    10。注册成服务后,也可以简单的隐藏进程。还有更可笑的是把自己的进程名跟一些系统进程名譬如lsass相同后,也就无法结束了。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    从我上面列举的方法已经差不多可以形成好几款流氓软件了。但是你别高兴太早,因为这些技术只是应用层的,现在出现了一堆驱动层的反流氓软件工具,譬如超级兔子,完美卸载,木马克星,雅虎助手,还有现在火热的360安全卫士。
    这些反流氓软件的方法删除以上流氓软件软件就比较简单。优先于流氓软件启动,截获所有访问流氓软件文件的irp,然后删除注册表项,删除文件。轻松的完成了反流氓任务。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    为了针对这些反流氓软件,流氓软件出现了内核层的了。
    1。首先是使用文件过滤驱动,保护自己的文件,流氓软件过滤了create里对于自己文件的所有fileopen外的所有irp和SetInformation下所有的irp,从而有效的保护了自己的文件。
    2。内核级hook技术,可hook住所有公开的或者未公开的内核函数,譬如zwcreatefile,zwSetInformation,也可以有效的保护文件。
    3。驱动层下的流氓软件还使用内核级hook技术,替换Regdeletekey,RegDeleteValueKey,RegSetValueKey从而有效的保护了注册表
    4。利用内核级hook技术还有隐藏进程,或者监控进程,重起进程。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    对于上面的流氓软件的方法一些驱动层下的反流氓软件工具又有点束手无策了。因为同是驱动程序相互拦截irp等于大家都无法操作,反流氓软件工具的删除irp会被拦截,或者删除函数会被替换。删除注册表函数会被替换。虽然驱动的加载有先后,但是无法保证能完全的删除流氓软件,从而出现了一些更顶级的反流氓软件,他直接发删除文件irp到文件系统.,删除注册表也直接发送到文件系统。这类流氓软件又能有效的完成了反流氓任务,但是根据我了解,这样的软件不多。现在火热的360安全卫士都还只是使用了笨办法,优先于驱动流氓软件启动,创建一个驱动流氓软件同设备名的设备,,使流氓驱动创建不成功。具我了解他优先于流氓驱动启动是把自己创建于PNP_TDI这个组下面,就是简单的ndis就能优先于360启动。如果前面的组,那360就束手无策了。所以对付这类流氓驱动只能用直接发irp到文件系统。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    流氓软件又怎么来防止直接发irp到文件系统的反流氓软件呢?rootkit,我看很多对于rootkit有误解,很多都认为hook也是rootkit.呵呵,rootkit说白了就是嵌入操作系统文件。你不是发irp到文件系统吗?,可是我把文件系统给改了,不过rootkit根据我的观察unix或者linex下比较多,在windows下还是比较少的,因为需要使用汇编了,我想如果流氓软件做到这个技术程度,它也没必要做流氓了,直接做操作系统得了。
  • “RSS(?)的出现对于全球互联网的影响有多大?”-上帝知道,或许你也知道。

    “为什么要增加RSS订阅数?”-可以满足一下某些人的虚荣心和其他动机。

    “这几个法子有效吗?”-如果3个月后还是无效的话,你可能首先要关心一下自己的人品,然后再发一封措辞严厉的邮件给我。

    “写这篇文章的人是不是很虚伪?”-猜对了,本人写这篇文章的动机之一就是要争取免费游杭州的名额。

    “你为什么要写这么多废话?”-因为一周也就这么一次机会能在这里跟你废话。

    增加RSS订阅数的13个方法

    1. 使用Feed烧录服务
      可以获得一个不变的RSS订阅地址方便日后搬家,同时还能统计订阅数。如果你使用独立Blog,并且有强劲的系统(wordpress和movable type)和稳定的服务器完全不必理会这点。
    2. 只提供一个订阅地址
      实现方法请参考第8点
    3. 写一篇文章
      标题叫《欢迎订阅我的RSS》,然后写上一堆有用的废话。对了,置顶后效果更好!
    4. 输出全文RSS
      这招完全是在讨好读者,对名气不大的Blog作用比较明显。
    5. 挂上各种订阅工具按钮
      相信我,读者大人们都”很忙”,如果你不够牛就乖乖照做吧。顺便介绍一个订阅按钮生成网站feedbutton
    6. 强化Feed的功能
      Wordpress用户可以尝试这一大堆RSS插件,Feedburner上也有几个优化选项(PingShot, SmartFeed, FeedFlare, BuzzBoost.)。至于Feedsky用户,请发扬自力更生的精神
    7. 使用显眼的订阅标志
      你可以像一样使用很素的模版,然后在侧边栏冒出一个大橙色的symbol。当然不反对你考虑下这些更夸张的图标
    8. 加上RSS自动嗅探标签
      怎样征服像Firefox、Oprea、Maxthon这类自带RSS嗅探功能的浏览器呢?答案是在你的Blog模版的<head> </head>中间插入下面这段代码
      < link rel="alternate" type="application/rss+xml" title="Feed的大名” href=”RSS地址” >
    9. 提交到任何可以提交Feed的地方
      增加曝光率会对订阅数产生一定影响,要加强这种影响,请在feed的名称旁边加上”(推荐)”造成一种被推荐的假像。-这招跟你的人品有没有关系呢?
    10. 使用抓虾作为阅读器
      抓虾应该是目前国内用户最多的在线阅读器,出现在他们的”热文排行”的门槛很低,一般只要9个推荐就可以。该怎么做自己想像……
    11. 标题要吸引人
      一般我们看报纸都是先看标题然后再决定是否继续阅读。所以标题对于吸引RSS订阅者来说意义尤为重大,要知道有些rss阅读器只显示标题(有些则是用户自己设定成只接收标题信息,像我的抓虾就是)。
    12. 提供Email订阅方式
      虽然用这种方式的人不多,但加上去后感觉会更专业点。操作方法参考FeedBlitz简明操作指南
    13. 显示Feed订阅统计图标
      不错的统计数字可以给新访客增加一个订阅你的理由,同时也会影响你在他们心中的地位和权威性。尽管那个可疑的统计图标是伪造出来的。

    上面提到的方法对订阅数在500以上的Blog而言可能几乎没有什么实质性的影响。

  • Zend创建者Andi Gutmans为我们带来了一段非常精炼的Web 2.0诠释,抓住Web 2.0的几个要点,对Ajax、Blog、Wash-Up等Web2.0标志概念以及之间的关系进行了简明扼要的阐述,足以作为Web 2.0的经典定义。(感谢Chris笔录)

    “大家好,我是Zend的Andi Gutmans,今天我们将要讨论的问题是:什么是Web 2.0?
    也许你早已听说过Web 2.0的部分特征,例如Blog,Mash-up,Ajax,但是Web 2.0含义究竟是什么?Flickr、Youtube这些概念网站就可以代表Web 2.0么?其实不然,Web 2.0的定义更为深入。

    Web 2.0由三个部分组成,第一个部分--RIA,Rich Internet Applications(丰富互联网应用程序),Flash、Ajax等网络应用技术便归于RIA旗下--改进强化用户浏览器体验,将桌面操作带入浏览器操作的方法--最典型的,在网页中支持超级托拽功能。

    Web 2.0第二个部分--SOA,Service-Oriented Architecture(面向服务架构),也是Web 2.0的核心部分,相关词汇:Feeds、RSS、Web Services、Mash-Up。SOA的核心问题--开放、互通,如何让来自不同服务商的网络应用能够协作运行。作为SOA核心词汇之一,Mash-Up其实就在我们身边--例如,Google开放功能模块API接口的行为直接导致一系列以Google Earth为核心的第三方网络服务产生。

    Web 2.0第三个部分--Social Web(网络社交),Web 2.0应用大大提高了终端用户的互动性,用户不再仅仅是服务的使用者,同时成为服务的创造参与者--WiKi、Blog、Tag、Podcast等用户交互行为让Web 2.0应用更能“吸引”用户,并且激发用户行为创造资源和内容。

    如何才能创建一个成功的Web 2.0网站/产品?

    亦有三点需要注意的问题。

    首先,你需要规划一个出色的Ajax支持产品--Ajax特指一系列创建Web 2.0服务的关键技术,是创造丰富用户体验的技术基础,当然,在浏览器支持方面也要IE/火狐通吃。

    其次,为你的产品选择合适的编程语言,能够完成你需要创立的网络服务--服务产品是Web 2.0关键,选择好合适的语言是产品的技术基础。

    最后,拥有一个可迭代(Iterative)的软件架构,可以非常方便地添加、部署、升级功能特性--这对拥有大量用户的情况下进行持续更新十分必要。”

    文中关键词总结:

    RIA--Ajax、Flash
    SOA--RSS、Feeds、Web Services、Mash-Up,API
    Social Web--Wiki、Blog、Tagging、Podcast
    Iterative


  • 从根本上来说,所有的敏捷开发实践,诸如测试驱动开发、结对编程、持续集成和重构,都有唯一一个统一的观念,那就是决不会停滞。这就像是一个优秀的撞球选手总要确保他的每一次击球都要为他的下一次击球创造好机会,敏捷人每迈一步都要确保能走出下一步。一个优秀的敏捷人决不会走出一步,然后就无法向前,或是让别人无法向前。

    你怎么知道你的进度停滞了呢?如果你无法让系统运行,进度就是停滞了。如果你不能通过测试,进度就是停滞了。在敏捷世界里,进度只能通过一个能通过测试的可执行系统来衡量。如果系统无法运行或是测试失败,那么所有的进度都无法进展,因为反馈循环告诉我们代码出了问题。当你写的代码无法执行,就像是驾驶着汽车却看不到挡风玻璃的外面。车轮可能还在转动,可是你却不知道正在驶往哪个方向,或许你正要驶落悬崖。保持系统时刻都可运行,就像是保持挡风玻璃的清洁。除非我们能看见东西,否则我们无法有所进展。

    设想一下,例如,两个程序员正开发一个项目。Jack说他要写J模块,而Bob说他要写B模块。当Bob写代码写到一个程度就必须要去找J。可是J还没完成,而Bob就必须要等。假如Bob那时是个优秀的敏捷开发者,他决不会走到那一步。他会给J创建一个接口,然后用假代码实现它,以至于他可以保持他那部分的测试能运行,因此可以继续开发。

    设想一个四人团队工作在一个三层架构的管理信息系统上。他们已经通过架构层次来分好了工。Gerry和George工作在GUI上,Marvin工作在中间层,而Debeay工作在数据库。当增加一些新功能的时候,Debeay做的头一件事情就是去改变开发库的表结构。GUI要等中间层能运行了它才能运行。Debeay已将黑漆涂洒在挡风玻璃上,整个团队就像是瞎子开车。假如Debeay那时是个优秀的敏捷人,她会发现一种能够循序渐进的修改数据结构的方法,增加新的列或是表而不用改变旧的。一直到迭代的最终完成,数据结构会达到最终的样子,而系统在此过程中绝不会不可运行。

    保持系统能够持续的运行是首要目标。你绝不会做出一些事情以至于会让系统被破坏超过几秒钟。如果你要做一个巨大的设计改变,你会找到一种方式,让每一步的改变都微小的可以确保系统能运行。你找到一种方式能保持所有测试能运行。你就真的决不会让系统超过几秒钟的停滞。

    这可不是一个容易掌握的观念。开发者总是习惯于做出一些改变把整个系统都撕碎掉,然后再试图去把一片片的碎片拼凑起来。很多人很热衷于这种体验。其实,我曾于一个开发者交谈,他说把系统撕得粉碎再把它拼凑起来是一个程序员所必需的能耐。他为他有能力做这种事感到很棒。这对他的自尊来说很重要。我不得不很礼貌的劝说他,他的这种自我成就感是建立在他所冒的风险和为雇主创造利润背道而驰的基础上的。实际上,他对他的这种赖以生存的能力感到欢喜雀跃。他是一个冒险成性的人,拿他雇主的财产冒险。这可不是专业行为。敏捷开发好像一场谨慎的象棋游戏,不是一个不计后果的休闲游戏。优秀的敏捷开发者为他们的目标谋划了一条小心的路,那就是每一小步都能保持系统的可运行和测试能够通过。

    一些开发者认为这样做效率低而且缓慢。他们觉得先把系统弄乱然后再重组为一个新形式会来得更快。可能有时这样做更快些。然而,这样做就像是你想要开车去商店你就调整方向直指商店,把挡风玻璃漆成黑色,然后不管红灯和路况就径直的朝着商店开。如果碰巧能行,你就开得更快。但更多的时候这么开在路上就会出岔子。

    这个首要目标可以延伸的团队和组织的各个层面。决不停滞意味着你设置好了你的开发环境以至于停滞不会发生。优秀的敏捷团队使用不停滞的源代码控制方法。如果Bill有个模块已经签出,Bob也可以将其签出,但第一个签入的人是成功的。假设核心团队正在为我们打造一个可复用的框架,而我们需要的一些功能还没就绪,我们会先自己写好它,而晚些再使用核心团队的功能,等他们好了的时候。如果企业架构支持我们的这种迂回婉转的方式,那么我们只需花上几天时间学习它,然后我们就能忽略企业架构,而让功能的开发以一种简单的方式来进行。我们就不会停滞。

    来源:http://computebank.spaces.live.com/Blog/cns!955689A6CF175077!225.entry

  • sourceforge在其九月八号的新闻邮件里面说,九月份从流量上来看,北半球的人们度假归来工作了,sourceforge表示欢迎。暑假期间,处在冬天的南半球对sourceforge的访问量一度领先,前二十名的国家有:巴西,阿根廷,澳大利亚,秘鲁,智利等。在西方国家的度假高峰的六七月,巴西超过了德国成为访问sourceforge最多的国家。

    文中还提到了sourceforge数据库服务器的更新,以及将要施行的新的功能。照例,sourceforge评选出当月最好的开源项目是Linux-NTFS。并且给出了在其12万八千多个项目中排名前25位的开源项目。 

    1. Gaim
    https://sourceforge.net/projects/gaim
    2. ZK - Ajax but no JavaScript
    https://sourceforge.net/projects/zk1
    3. Azureus
    https://sourceforge.net/projects/azureus
    4. PDFCreator
    https://sourceforge.net/projects/pdfcreator
    5. Inkscape
    https://sourceforge.net/projects/inkscape
    6. OpenWFE
    https://sourceforge.net/projects/openwfe
    7. MegaMek
    https://sourceforge.net/projects/megamek
    8. XOOPS Dynamic Web CMS
    https://sourceforge.net/projects/xoops
    9. FileZilla
    https://sourceforge.net/projects/filezilla
    10. MiKTeX
    https://sourceforge.net/projects/miktex

    11. jEdit
    https://sourceforge.net/projects/jedit
    12. aMSN
    https://sourceforge.net/projects/amsn
    13. phpMyAdmin
    https://sourceforge.net/projects/phpmyadmin
    14. Openbravo ERP
    https://sourceforge.net/projects/openbravo
    15. RSSOwl | RSS / RDF / Atom Newsreader
    https://sourceforge.net/projects/rssowl
    16. KoLmafia
    https://sourceforge.net/projects/kolmafia
    17. Gallery
    https://sourceforge.net/projects/gallery
    18. PhpGedView
    https://sourceforge.net/projects/phpgedview
    19. UFO:Alien Invasion
    https://sourceforge.net/projects/ufoai
    20. JasperReports - Java Reporting
    https://sourceforge.net/projects/jasperreports
    21. FCKeditor
    https://sourceforge.net/projects/fckeditor
    22. Saxon XSLT and XQuery Processor
    https://sourceforge.net/projects/saxon
    23. ODF Add-in for Microsoft Word
    https://sourceforge.net/projects/odf-converter
    24. KeePass Password Safe
    https://sourceforge.net/projects/keepass
    25. MinGW - Minimalist GNU for Windows
    https://sourceforge.net/projects/mingw

  • 众所周知微软的互联网战略遭遇Google后,爆发剧烈甚至短兵相接的PK战。Google服务多的令人眼花,针对Google微软live也都在相关领域展开了布局,那么到底这些服务有多少呢?

    Google的各类服务
    Google Web网页搜索 ,Google Images图片搜索, Google Groups社区讨论组 ,Google News新闻 ,Google Local本地搜索, Google Blog搜索, Google Books 图书搜索 ,Google Maps地图 ,Google Scholar学术搜索 ,Google Video视频搜索, Google
    Music音乐服务, Google Directory 分类目录,Google Finance财经, Google Catalogs邮购目录 ,Google Answers问答服务,

    专用搜索入口:Google Linux ,Google Apple,Google Microsoft

    电子商务、企业营销服务:Google FroogleGoogle BaseGoogle StoreGoogle ADwords,Google ADsenseGoogle publisher

    个人应用型产品:Search History , Bookmarks , Feed Reader, Google Calendar, Page Creator ,Writely.com,GMail ,PicasaWeb ,Spreadsheets,IG Personalised Home 个人首页Blogger publish,Google Alerts , Gmail host邮局


    其他八卦和趣味服务:Google Suggest, Google Sets ,Google Moon ,Google Mars ,Google earth ,Google Current TV ,Google Zeitgeist,
    Google Jobs ,Google Anatomy ,Google webmaster,Google Analytics ,Google Accounts ,Mentalplex ,Pigeon Rank ,Moonbase Google ,Google Gulp ,Google Romance ,Google code,orkut社交圈


    Google推出的软件:Google Desktop ,Google Earth ,Google Talk ,Google Toolbar ,Google Video/Music Player ,Google Picasa ,定制的Firefox,

    微软的Live服务起步稍晚,目前也已达数十项,无论是Beta还是一再跳票的产品或服务,都能看的出来,微软的live战略将是个长期的占领入口跟Google分天下的战略。

    目前Live旗下的搜索:
    Windows Live Academic Search , Live Book Search ,Windows Live Dev 开发者中心,Windows Live Expo百科 ,Windows Live Image Search ,Windows Live Local, Windows Live Near Me Search ,Windows Live News Search,Windows Live QnA问答社区,Windows Live Search



    其他的服务: Windows Live Drive提供在存储空间,Windows Live Account统一帐户管理中心 ,Windows Live
    Agora ,Windows Live Call ,Windows Live Call for Free ,Windows
    Live Custom Domains 免费邮局
    Windows Live Favorites
    ,Windows Live Feeds ,Windows Live Gallery ,Windows Live ID ,Windows Live Ideas,Windows Live Mail ,Windows Live Mobile ,Windows Live Mobile Mail ,Windows Live Mobile Search ,Windows Live
    Publishing Portal ,Windows Live Product Search ,Windows Live.com,Windows Live Wifi
    Suite ,Windows Live Web Search ,Windows Live Web Search SDK ,Windows Live Spaces,Windows Live Search Translation
    ,Windows Live Feeds提供FEED订阅功能。

    Windows live软件:Windows Live Mail Desktop ,Windows Live Messenger,Windows Live Newsbot,Windows Live OneCare , Windows Live Safety Center ,Windows Live Search Answers , Windows Live Search Desktop,Windows Live Search Help, Windows Live Search Macros ,Windows Live Toolbar and
    Desktop Search,Windows Live Essentials 软件包。

  • 昨天晚上闲着看了电影《黑社会》和《黑社会2:以和为贵》,一贯杜琪峰的风格,还不错,色彩,音效,演员,情节都还算近年来香港电影的上乘,喜欢。

    电影昭示了一些东西,这些东西是我们现实社会中出现的,其中关于大陆公安的情节,反应了些东西,明白了和谐社会的定义,有些话是有道理的,和谐就是相安无事,不要冲突,不要破坏社会安定,斗争要在社团内部解决,不要扩大,不要威胁政府的形象和公安的业绩,保障社会表面的安定,这就是和谐,用和谐和平这张大外衣把所有的不稳定因素遮盖起来,这个就是现实。内涵告诉了我们许多,很不错,告诉我们现实社会是什么,我们该怎么去接收,老百姓就该这样去面对,去理解。

  • JIRA,一个非常出色的Issue跟踪系统,这里的Issue不单单是指BUG, 很多时候也可以是TASK, IMPROVEMENT, NEW FEATURE, 甚至是一个QUESTION。在多年前, 我曾经尝试使用过那个经典的的Bugzilla, 但是一个项目作下来,大家都反映那个东西的界面实在是太粗糙,简直无法忍受而且报表功能也是在太弱。最后大家就讨论自己作一个BUG的跟踪系统,就在大家已经完成了设计文档准备编码的时候, 我们发现JIRA原来就是我们要找的东西,而且比我们要的更多。 它内置一个可以配置的工作流引擎(osworkflow),一个快捷的全文检索功能(基予Apache Lucene).和一个可以配置的Dashboard(portlet), 以及一个和CVS连接的引擎,通过这个连接,在一个Issue中直接可以看到修改的文件名称,如果配置了viewcvs的话,还直接直接定位到行, 根据一个问题可以跟踪到代码的行,这正式我们梦寐一求的功能。 也正是这种特性,才使我们能够把一个个Issue当作发布和版本管理的一个单元。

    CVS,这个应该大家都知道。在系统开发过程中,一切的源代码和设计文档都应该进入版本管理系统来进行管理, 有的时候可能资源库可能会膨胀的很大, 但这个代价是值得的。

    XPlanner, 在整个管理体系中,进度管理一直是一个䒈比较薄弱的环节, 我也曾试过dotproject这样的管理软件,但由于dotproject管理的太过详细,填报起来太复杂,大家渐渐都失去了填报的热情。这个XPlanner软件可就简单多了。指定了迭代,story,然后就可以填写进度了。由于这个软件也是OpenSource的,所以如果觉得不满意,修改起来也很方便,现在老林就对这个系统作了些改进,可以直接和JIRA系统连接起来,JIRA中建立issue后,可以在XPlaner中反映出来,连填写story的时间都省去了, 然后在下班之前可以生成一个详细的报告,列出每个人在这一天内在自己负责的Issue在上的处理时间和进度。

    WIKI, 在项目管理中,我们一直把它当作文档管理和Portlet系统来使用,它现在已经变成我们的小组的工作台,在WIKI中我们制定了包括系统开发设计规范在内的一切设计文档,以及数十个经常的HOWTO项目,例如如何配额一个标准的开发环境,如何使用CVS客户端,如何使用JIRA,以及自己的JavaDoc, JSDoc等。 我们也可以通过Wiki来简单的整合系统, 在Wiki中我们列出了所有开发环境和开发工具的入口,例如上面就放了进入JIRA,XPlanner以及我们各个Project的连接,甚至到Apache中常用的Project的JavaDoc的连接,现在再也没有人去记录这些URL了,只要打开Wiki所有的资源都在面前了, 并且由于wiki本身的开放性, 所以每个团队的成员都是一个维护者,同时也是这个系统的受益者。在很多的团队中经常出现的情况是一个小子对某个技术特别在行, 大家遇到这方面的问题都问他,在小的团队中, 面对面的交流通常是最快的交流方式, 但是放到大的团队中,这个就不大可行了,那个小子迟早有一天会被问的烦到吐血为至,特别是他自己的工作也无法按时完工的时候。还是抽一个小时写出来,放到wiki里面吧, 别问我, 自己去查Wiki。

    基于ISSUE的发布管理。

    从版本管理的角度来考虑, 最理想的发布方法就是把CVS中的代码拿下来, 打上一个tag, 编译并且测试一直到发布。 这样的管理方式的确是很简单的, 但事实上用户可不买帐的, 用户觉得在新的版本中某个新的功能他还不想要, 这可能是他还没有整理好业务初始数据或者在实际的业务流程上或人员上没有做好准备, 上帝说了不要咱就不能把这个新功能发布。在这个情况下, 基于Issue的发布管理是一个好的方案。

    这里讲的Issue就是前面JIRA系统中的一个issue。 通常每个Issue的完成都会伴随这一些代码的修改。 基于Issue的发布简单的来说就是把一组Issue变更的文件用patch的形式发布到正式的系统中。

    基于Issue发布的前提就是要在Issue和Source之间建立连接, 使发布人员清楚的知道每个Issue修改的源代码是什么。我们实践下来最简单的办法就是在提交source的时候必须加上JIRA编号, 没有JIRA编号代码是不能提交的。 这样有以下好处。
    1)防止一些没有经验的程序员无意义的提交, 比如一个小子今天提交了一个java文件,明天发现这个变量命名有点不爽, 修改后就要提交, 在这种情况下, 这个提交是没有意义的,如果测试组已经测试这个Issue, 是否测试组要重新测试? 为一个变量名称化这样的时间和冒险是可嫩的。 小伙子还是在第一次提交的时候就把变量名想好了再提交。

    2)程序员偷偷的修改代码, 一个小伙子发现自己的已经Closed的Issue中有一个Bug, 便偷偷的修改代码。 这个当然也是不可能的, 凡是提交到CVS中的代码就不是自己的了,那是大家的, 没有足够的理由想改当然没有那么容易。 先自己建立建立个Issue, 向Team leader报告, 然后再去修改代码。

  • 2006-07-17

    齐达内之歌!

    齐达内we say hi  -------------莫艳琳

    歌词

    (We say Hi,to you 齐达内
    所有的期待 梦想都有你在
    Say goodbye, 过去和现在
    时间过太快 Ah... ha )

    一群人跑臭汗满身 都不肯停下 还追着那个圆的球
    不留神 他们转过身 往那边去 快跑

    两扇门 隔一万公分 跑得太累 还装作大家都不熟
    太可恨 被你缠住身 就算你狠 喔 转眼皮球不见了

    NA......NA .......NA......
    NA........NA.....有你 我们更精彩
    We say Hi,to you 齐达内
    所有的期待 梦想都有你在
    Say goodbye, 过去和现在
    时间过太快 不愿看你离开
    We say Hi,to you 齐达内
    荣誉和失败 永远一样精彩
    Don't say goodbye 共同的年代
    我们的心中 将永远有你在

    一群人跑臭汗满身 都不肯停下 还追着那个圆的球
    不留神 他们转过身 往那边去 快跑

    两扇门 隔一万公分 跑得太累 还装作大家都不熟
    太可恨 被你缠住身 就算你狠 喔 转眼皮球不见了

    NA......NA .......NA......
    NA........NA.....有你 我们更精彩
    We say Hi,to you 齐达内
    所有的期待 梦想都有你在
    Say goodbye, 过去和现在
    时间过太快 不愿看你离开
    We say Hi,to you 齐达内
    荣誉和失败 永远一样精彩
    Don't say goodbye 共同的年代
    我们的心中 将永远有你在
    We say Hi,to you 齐达内
    所有的期待 梦想都有你在
    Don't say goodbye 共同的年代
    我们的心中 将永远有你在