2009年6月17日星期三

功能驱动与用例驱动(关于用例、用户故事和特征的解释)

软件开发过程中,描述并分析需求会同时采用不同的角度和方式。例如功能分析和场景分析。

其中功能分析是指描述系统所应该具有的功能。场景分析是指在特定场景中用户的操作步骤以及系统给出的相应的反应。

功能分析文档所列出的清单一般会叫做“软件需求”或者“系统特征”。

场景分析文档所列出的内容一般就是“用例文档”

由此可见,RUP中所使用的用例驱动开发,XP中所使用的用户故事驱动开发以及特征驱动开发,表面上看起来是以其分割粒度的不同进行排列下来的。其实我们可以看出,用户故事和特征都是从功能分析的角度对系统的需求进行的描述。其与RUP所说的用例驱动完全使用了不同的分析方法。

这样我们就可以更好的理解XX驱动开发之间的区别在那里。

下面是功能驱动与用例驱动之间的对比表格:

功能驱动

用例驱动

  1. 当你有许多未密切相关的不同功能时,工作会进行得比较好。
  2. 让你可以较快想客户展示可运作的程序代码
  3. 是非常功能性驱动的。采用此方式,你不会忘记任何功能。
  4. 对具有许多未连接功能性片段的系统,进行的特别好。
  1. 当你的应用程序有许多流程与场景,而不是个别的功能性片段时,进行得比较好。
  2. 让你在每个开发阶段可以向客户展示较大的功能性片段。
  3. 是非常以用户为中心的。采用此方式,你将为用户使用此系统的所有方式编写程序代码。
  4. 对交易式系统(系统以冗长、复杂的流程定义而成),进行的特别好。

在实际需求分析的过程中,两种分析方式相辅相成,都有其独到的贡献,最好能够结合使用。

我理解,互联网类型的项目更适合功能驱动开发,而企业业务系统类型的项目更适合用例驱动的开发。

2009年5月18日星期一

芜湖项目现场需求调研阶段总结

芜湖项目现场需求调研阶段,工作效率高,工作成果的质量也很好,现在总结如下:

  1. 需求分析团队人员要尽量少,减少沟通成本。尽量只允许业务核心人员参与,这样能够以最快速度对业务流程进行确认。
    反观现在大平台的项目,需求分析阶段有30多个人参加,包括了国家局的人员和各省市的人员。分成了6个分析小组。诸多问题无法现场进行确认,因为参加的人多,因此大家都不作结论,只能会后通过EMAIL来回来去。由于分组很多,因此涉及到很多跨小组的问题进一步增加了沟通成本。
  2. 需求讨论会议现场形成文档,由于文档形式上是共同创作完成,因此可以省略客户确认文档的过程。
    反观现在大平台的项目,会议之后,需求分析人员晚上加班形成需求访谈报告,需要客户确认,然后再形成需求规格说明书,再要求客户确认,这样效率非常差。
  3. 关于需求分析的团队构成,建议如下:
    - 客户业务人员
    - 客户IT人员
    - 主力业务分析人员:主要负责需求分析工作,引导大家使用正确的方式和正确的方向进行需求分析工作。
    - 业务分析助理:主要使用合适的工具,现场进行文档撰写工作。也可以提出自己的建议。因此该人员也需要有一定的需求分析能力和文档撰写经验。
    - 项目助理:负责对会议中的各种未定事项以及决议进行跟踪,并且进行其他的一些辅助性工作。
    - 解决方案顾问团队:辅助角色,可以离线支持。主要对相关业务领域或者IT技术领域进行咨询工作。
    - 开发组组长以及主要设计人员
    - 系统实施负责人
  4. 使用的工具建议如下:
    - 业务流程分析工具,以便团队成员能够在早期对业务流程有全貌的认识,如BPMN, EPC图等等
    - 快速互动原型工具,以便快速形成可以进行互动的动态系统原型,给客户良好的感受。推荐serena prototype composer或者axure rp等。
    - Sparx Enterprise architect,全面的项目模型管理,在此阶段主要使用到:用例分析,领域模型,需求条目管理等等。(在用例中需要填写senario条目,并且需要与需求条目进行关联)
    - Balsamiq Mockups,对操作页面进行设计。
  5. 对目前的大平台,现在能想到的建议如下:
    - 分组尽量少,1~2各组,人员尽量少,减少沟通成本。
    - 现场形成文档。
    - 在早期需要有总体业务流程分析过程,然后在进入细节系统需求分析过程。
    - 使用上述的工具
    - 使用上述的团队组织结构

综上,发现上述经验并不太符合敏捷过程,反而与《人月神话》中的理论非常相似。起码,可以总结出来两点:1.架构(需求分析)是贵族专有的工作内容。2.需要组成外科手术型的团队结构。

2009年5月17日星期日

芜湖出差,巡回取货项目的一些心得

五一之后到芜湖,客串巡回取货项目的项目经理,负责需求调研工作。整两周的时间,有如下一些心得体会:
出差两周,其中需求调研工作大约占用了6个工作日的时间。另外有2个工作日大约是各种各样的汇报。
工作进行的比较顺利。体验也很好,主要是可以按照自己比较推荐的方法来进行项目工作,大家都比较轻松,工作效率也很高。客户方也反映工作效率很高,工作很有成效。
开始的几天,使用serena prototype composer工具,项目组成员在同一个会议室中,主要讨论工作流程(与系统无关)。然后同样使用这个工具,讨论大致的系统操作流程,同时画出初步的系统界面。这个阶段成果效果非常好:大家对系统的总体概念已经形成,基本确认了系统范围。并且形成了可以进行互动的系统界面原型。
然后开始使用EA和Balsamiq Mockups配合进行用例分析与界面设计。在EA中复制了serena prototype composer中的工作流程,然后进行用例分析,在用例中进行场景senario步骤描述。针对每一个用例,至少使用Mockups软件绘制一张界面设计图。另外在EA中进行领域模型的设计。
综上,提供出一份真正对开发有帮助的需求文档。
经估算,这两周的需求分析工作定义出的系统需求大约需要5人团队开发3个月的时间的工作量。开起来也非常符合比例。当然这仅仅是估算的合理值,估计和客户方面进行协商之后,时间上又会变得非常不合理。

客户非常高兴的从我这里拿到了上述的三款设计工具。不过,真正重要的是需要会使用这些工具啊。

在出差期间,抽时间学习“Head First OOAD”,有如下收获:
终于对需求和用例明确的区分开了。需求大约总是以“系统应该可以xxx”这样的格式描述,主要描述系统所具有的功能和能力。用例侧重于描述某某场景senario下面的操作步骤。因此大约会是包括正常路径/可选路径/替代路径等等。

不过,在出差期间,本计划使用类似极限编程方式的增量开发,结果未遂。最终变成了类似ICONIX方式的过程。

另外,意外的发现,原公司上班时,结识的MOTO客户,现在正在作为甲方折磨着现在我的客户。现在我的客户天天折磨我们,同时他们也在被MOTO客户折磨着。……

2009年4月2日星期四

软件开发过程DRY

依据RAILS框架所倡导的DRY (Don't Repeat Yourself)的思想,可以大大提高编程时的工作效率。如果能够由此推广开来,发现软件开发过程中有哪些工作内容是重复而浪费了,并能够有针对性的改善的话,是不是可以提高工作效率呢?
我们的现实情况是:需要满足客户以及老板和项目管理中心所谓正规软件工程所需要的标准过程,还有标准过程所要求的文档。所以,通常来讲,我们会按照这样的过程进行工作:

考虑以下一些方法:
  1. 利用用例分析或者用户故事,来讲需求分析与需求传递和培训两个过程合并。
  2. 考虑需求文档中的用例分析部分可以是主力需求分析人员带领开发团队共同完成。
  3. 需求文档的工作量很大,并且变更之后的维护也是问题。因此考虑需求文档与测试用例进行结合,减少需求文档中的内容。
  4. 使用某种形式的工具来自动生成规范格式的需求说明书。
  5. 概要设计说明书中仅包含系统架构层面的设计工作。
  6. 系统设计过程与测试案例编写过程融合(参考XP过程)。
  7. 实用工具(例如javadoc)来自动由编码生成详细设计文档。
  8. 现实存在详细设计过程,但是并不正规,仅仅产生一些中间产物文档,如界面草图、UML顺序图等等。

2009年3月30日星期一

关于敏捷软件开发新的理解

前两天,在一次聊天中,我问了问未来开发组的组长:眼看设计过程就要结束了,项目启动到现在进行了3个月的时间,想一想,前一阶段我们所做的工作中,有百 分之多少是对后面的工作有意义的?开发组长无奈的苦笑了一下。显然大家心里面都有数,这个比例很不理想。尤其是设计文档中的模块设计部分,大量的工作量, 完全是为了设计文档能够评审通过。

对于敏捷软件开发,目前理解期最重要的目的是识别软件过程中没有必要的任务或者是性能低下的任务,然后去除之或者改进之。基于这个出发点回顾一下目前的情况:
  1. 需求分析。唯一不变的就是变化。项目的早期集中时间进行需求分析然后确认基线,再等到真正动手开发某一模块的时候可能已经过去了一段时间,并且需求已经发生了变化。这样还需要对新的需求进行再次分析。在这样的情况下,前后的需求分析则存在工作量的浪费。
    1. 敏捷过程则是需求分析存在与整个项目的始终。细节的需求分析工作尽在真正开始代码之前才进行。虽然以后仍然有可能发生变化,但起码针对上面的情况做了优化。
  2. 软件设计。目前的项目,设计阶段需要的交付物有:架构设计,概要设计,详细设计,物理模型设计,接口设计等等。设计的目的当然是为了能够知道开发。这一部分工作显然是必须的,但是能否优化呢?敏捷过程典型的对策是1.仅仅做足够的设计;2.测试驱动开发。
    1. 系统的架构设计是需要的。但是针对某一功能来讲,仅仅在开发之前才做相应的详细设计。设计仅仅做到能够指导开发的程度,对文档的格式要求比较宽松。
    2. 传 统的UML设计包括类图、顺序图、协作图、活动图、状态图等等。这个敏捷过程一般没有强制要求。XP过程中推荐以TDD和CRC分析来代替。其中CRC分 析基本上是UML协作图的替代物,但是更加强调团队共同完成。而TDD则是在保证了测试自动化的同时还能够对软件设计进行指导,做一件事达到两个效果,体 现其高效率。
  3. 界面原型。我前面说过,希望能够在需求分析阶段就能够对系统的界面进行确认,还找了一些专业做页面原 型的辅助工具。现在看来,其实也存在浪费。其实更高效的做法是以最快的速度拿出开发出的成品或者半成品让用户进行确认(这样一来,唯一的问题是你能有多 快?;-) )。界面草图有的时候是需要的,但是它变成了非常不正式的中间产物,不必要进行存档。
  4. 重构。仔细想想,其实重构的工作对于任何一个项目来讲都是必须的。而现实是,如果没有采取全面的自动化测试的话,传统的软件开发项目没有能力也不敢进行深度的重构。而相反基于TDD的XP团队则更有勇气对软件进行彻底重构。
  5. 集成。集成的工作量无法节省。敏捷过程的做法是持续集成——将工作量分散到整个软件生命周期。这样能够及时发现问题,并从感受上减少工作量。
我有一个朋友,看他上网打桥牌的时候,经常发现他的搭档在抱怨他发生了失误。而实际的情况是怎么样的呢?我的朋友是全国顶级桥牌赛事的前四名获得者。那些被抱怨失误的牌都是由于他的搭档的水平不够,对于他的精妙招数无法理解。
在软件开发领域,其实我们也正在处于我的朋友的搭档的水平。经历的项目越多,越会发现业内大师的很多理论的精妙之处。很多情况是:如果大师们的理论你认为有很大问题的话,其实是因为你的层次还不够。

2009年3月15日星期日

现实很残酷

现在手头是这样的一个项目:
  1. 为期7个月
  2. 工作量分析的结果,项目团队需要60个人或者更多
  3. 项目组中只有包括我在内的3个人有相关行业经验
  4. 开发团队中有大约20多个人是刚刚招聘到位的
  5. 对于所使用的技术,除了JAVA开发之外,JAVA开发框架、BPM/BRM引擎、B2B网管、字符终端开发等等都是项目组第一次使用
  6. 项目组中几乎没有人有面向对象的设计和开发经验
  7. 客户方面政治斗争严重
这是我所经历过的第二个死亡之旅项目。

2009年2月5日星期四

考虑使用UberNote代替Google Notebook

刚刚发现一款新的Web应用:Ubernote
  • 展现方式同Google Notebook非常相似
  • 采用了不分层的Tag方式进行管理
  • 可以对Note进行所见即所得的富文本编辑
  • 可以多人合作共享Note
  • 有浏览器插件,可以直接抓取网页。而且插件很丰富:Toolbar, Clip, Bookmark, Snap
  • 居然能够直接从Atom导入现有的Google Notebook内容。
  • 缺点是对于每一个Note不能折叠显示。
所以真的可以考虑切换过去?

另一个可选的替代方案是:TiddlyWiki + Clipmarks,只是Clipmarks的速度比较慢。

2009年2月4日星期三

Google Notebook的备选替代品

Google Notebook停止开发了。虽然现在还能够使用,但是还是需要准备一些备选产品了。另外,Google Notebook的功能一切都好,唯一的问题是,不能存储网页篇幅很大的文章。
替代品列表:
  1. Office OneNote 2007:非常好的产品,文字编辑非常灵活方便,支持表格。分类清晰,功能强大,能够直接抓取网页。不能支持在线同步,但是只需要配合Dropbox就可以完美解决。唯一的问题是商业产品,需要收费。另外只能基于Windows平台。
  2. Evernote:也是业界很出名的产品。Tag方式的管理,支持全文搜索,能够直接抓取网页。有在线同步功能,同时还有桌面客户端。
    缺点是:体积庞大,免费版本每月有数据量的限制。并且不支持表格,编辑功能稍弱,不够灵活。
  3. TiddlyWiki:体积小巧,功能灵活。基于Tag方式管理,可以安装第三方插件。开源。支持UBB方式的自定义格式,非常方便。配合Dropbox可以实现在线同步。单一的HTML文件,所以跨平台。
    缺点是:不支持直接抓取网页。
现在看,TiddlyWiki的方式很好。所以正在寻找能够直接抓取网页并能够在线同步的工具进行配合使用。

对面向对象以及极限编程新的理解

传统的面向过程的开发是自顶向下逐步细化的过程。这是非常符合人们习惯的思维方式的。所以自然由需求分析->概要设计->详细设计->编码->测试->发布的瀑布模式成为了最规范的软件过程。
而面向对象的开发是自底向上的过程。在这样的过程中,往往是先实现已经了解的局部。逐渐的随着过程的推进,系统的全貌浮出水面。而基于面向对象开发的特点,在这个过程中,前面的工作成果往往能够很好的进行复用,重构的成本也很低。自然而然的,开发的过程会形成多次的迭代。但是,在这个过程中,最重要的是需要按照面向对象的思维方式进行设计与开发。

基于上面的认识,在回顾XP的各项原则会发现,以前认为不现实的内容其实都是顺理成章的事情了。唯一的问题仅仅是现场客户的问题,不过这个在一定的程度上 面也能够克服。由此可见,当深入了解了面向对象的开发的精髓之后,XP的各项原则实际上都是面向对象过程的一些内在的需求而已。

极限编程的12个原则:
  1. 计划的制定
  2. 小版本
  3. 简单设计
  4. 测试驱动
  5. 持续整合
  6. 重构
  7. 配对编程
  8. 代码共享
  9. 每周只工作40小时
  10. 现场客户
  11. 隐喻
  12. 编码标准

2009年1月22日星期四

关于OOD的一点点总结

很多成熟的设计过程摆在面前:用例驱动、XP用户故事、特征驱动FDD、模型驱动MDD、敏捷模型驱动、领域驱动、测试驱动等等等等……到底应该怎么设计呢?
简单的讲,过程内容会分为需求分析和设计。
需求驱动是最根本的,所以在需求阶段,所谓的各种驱动方法其实都是对需求的功能分解,以便日后进行分治的设计以及管理跟踪。
由Use Case -> User Story -> Feature其实是由粗到细对需求分解的不同粒度。
有了需求条目之后,针对每一个条目可以继续进行设计工作。
设计过程的目标其实很简单:
  • 类的识别
  • 类的结构(例如:继承、关联、聚合、依赖等等)
  • 类的属性
  • 类的方法
  • 系统运行是类之间的消息传递关系。
前三项是在整个设计过程中不断进行更新的,是个逐步细化的过程。分析的早期就可以识别大部分实体类,而在模拟需求条目的场景的过程中,逐步识别边界类(主要来自于页面流程分析)和控制类。主要的工具就是UML类图。
后两项则是通过模拟每一个需求条目所描述的场景来设计类之间的消息传递关系。在这个过程中,自然的完成对类分配方法。主要使用的工具如顺序图、协作图或者CRC分析。

对于MDD, AMDD以及DDD来讲,感觉上是针对非常熟悉的业务需求或者非常有经验的分析设计人员,因此采用了更新颖的设计路径。

而TDD应该理解为一种辅助设计手段。

2009年1月21日星期三

在Iconix过程中使用协作图

ICONIX过程步骤如下
  1. 系统界面原型,初步的领域分析(识别实体类,分析类之间关系,但不添加属性和方法),用例分析(仅关注用例内部的主干流程与分支流程,而忽略诸如前置条件、后置条件等细节)。
  2. 健壮性分析(分析用户与系统类之间的关系,在此期间识别边界类与控制类),更新用例,更新领域模型(添加部分类属性)。
  3. 详细设计(根据健壮性分析图而细化成顺序图,在此过程中给类分配方法),细化领域模型成为类图(静态模型)。
查阅了一些资料之后,有一个想法:
可以尝试使用UML协作图来代替顺序图。
因为协作图的样子本来就与健壮性分析图非常相似。这样,第2、3步仍然保留,但是产出物可以合并,即直接在健壮性分析图上面进行更新而成为协作图。
协作图中主要表现的是在一个场景中对象所拥有的职责(即所用到的对象的方法)以及对象之间的关联。这样看来,协作图所起到的作用与XP过程中所推荐的CRC分析是完全吻合的。
另外,对于普通的业务系统来讲,系统对时间的敏感程度并不高,这就增加的忽略顺序图的可能性。

如上,系统分析与设计的产物则为:
  • 页面流程图与页面布局原型
  • 用例分析
  • UML类图
  • UML协作图
  • 部署图与组件图(可选)

2009年1月20日星期二

在哪一个阶段画出操作界面

今天上午项目组内部开了一个会议,讨论需求文档的模板。大部分内容大家都比较一致,比如分成功能性需求和非功能性需求。功能性需求中主要以用例分析为主线,辅助以各个层次的工作流程图以及系统流程图。另外加入业务实体的各种信息等等。
但是在一个问题上面,项目组成员与我的引导无法达成一致:多数项目组成员认为系统操作界面不是需求阶段的产物。而应该是系统概要设计甚至详细设计阶段的产品。理由如下:需求的主要内容应该集中于业务分析,而系统界面更接近于设计的工作。而且在需求阶段需要画出页面的话,需求文档的工作量过大,需求评审阶段如果包括界面的话,那么需求阶段的时间会过长。
我无法说服大家的固有习惯,甚至无法说服大家仅仅写一些重要业务的操作界面。最终只能以大家的多数意见为准了。

这种情况显然是项目组内部对当前的OOAD技术缺乏经验所导致的。我的观点与大家相反,确认操作页面的工作越早越好!
  • 需求分析需要分为三个层次:战略目标需求(高层访谈),业务逻辑需求(中层访谈)以及操作需求(一线操作层访谈)。
  • 操作页面的确认工作应该是在需求访谈过程中同步进行的,而不是项目组内部闭门想出界面,然后拿给客户进行评审。
  • 画界面的工作不会因为推后而减少。
  • 需求访谈中对界面的访谈与分析有可能比用例分析还要早一步。示意图方式的界面会很大的消除需求的歧义。会给用户最直观的感受,是我们认识系统的第一个门户。
  • 更早的对操作页面进行确认会减少项目的风险。如果在概要设计评审的时候发现有一些界面设计的不合适,然后发现修改这些页面居然还会导致上一阶段的需求分析结果进行改动的话,这样的返工成本就要大很多了。时间压力也会更大。

现在公司的项目管理方式

由于手头的项目非常庞大(基本上是50人的团队,1500万的合同),对公司有战略意义,又是新老板来了之后的第一个大项目,因此,管理层对项目非常重视,老板会亲自关注细节。因此,该项目需要做的非常“规范”!当然,如何规范是针对现有公司的标准来讲的。具体特征表现在:
  1. 严格按照需求->概要设计->详细设计->编码->测试->发布的模式对项目进行计划。
    (听起来是严格的瀑布模式,呵呵,连一次迭代也没有。不过对于现在的公司来讲,能做到已经不错了。以前是基本没有设计阶段的,而且这次也会基本忽略测试阶段。)
  2. 设计过程要求严格,例如一定要先搞出来物理模型并进行评审。然后再对各个模块的输入输出进行严格的定义。
    (典型的面向过程的设计方式。我了解了一下,公司的整个软件部门似乎没有几个人使用过UML进行系统分析与设计,更不用说更加激进的CRC分析之类的了。所以,理所当然,技术人员多数觉得JAVA框架中的ORM一层基本没有什么作用。当你告诉他们OOAD的过程中,物理模型有可能是最后一步时,很多人难以接受。)
    (我想主要的原因很可能是:现在公司的管理层和技术骨干主要都是在90年代末期参加工作的,那时候国内正是面向过程的流行时期。所以大家都已经习惯于这样的设计方式。然后就是这样一代一代的延续下来……)
  3. 对文档的要求非常严格:包括在项目的第一周就需要提交细化到半年后的某一天的详细项目计划。而且各种文档名目繁多。
    (大家都听说过滚动式规划,但是做起事来还是如此。最后都变成了交差。)
  4. 项目计划的全部意义就是那个*.MPP文档。而且一般需要维护1000~2000行吧。
    (既然老板是这样认为的,所以也就没有人敢质疑该如何维护2000行的project文档。)
  5. 项目管理制度中规定:项目组内部沟通以正式的书面沟通为主,口头沟通作为辅助。
    (学过PMP或者对敏捷开发有兴趣的人会很吃惊是吧?)
  6. 加班将作为项目组工作的一种常态。加班的目的是为了营造紧张的项目组内部的气氛。
    (为了加班而加班!当然也有一部分原因是客户造成的。客户是国家机构,嘴里高喊“深入实践科学发展观”,做起事儿来完全“人有多大胆,地有多大产”。)
  7. 项目经理每天会忙于收发EMAIL,制定各种管理制度,以及制作各种报告等等。
不过似乎也不是一无是处,例如:
  1. 公司里面有一些强人自己包装了SPRING,开发了很好用的MDA框架。
  2. 老板亲自拍板,调集了公司最强的开发资源进入项目组。
  3. 暂时不用考虑项目成本问题。

2009年1月18日星期日

当面临的问题是生存时,任何承诺都是骗人的。

Google宣布:停止Notebook应用的开发,并停止其接纳新用户。
这让我想起了上一次的互联网泡沫破裂时的情况:263的老板在前一天还在信誓旦旦说要保留免费服务,转天就开始全面收费。
那一次事件之后,我对国内互联网服务提供商的信用彻底失望,虽然我不是受害者。从那以后我尽量会选用国外的服务提供商。
现在,在全球金融危机的影响下,大若Google都要出现类似的问题了。只不过,比起263,Google采用了很道德的方式。可以理解,当公司面临的问题是生存时,很可能别无选择。
我其实是非常依赖网络服务的:
  • Gmail
  • Google Bookmark
  • Google Docs
  • Google Reader
  • Google Site
  • Google Calendar
  • Google Notebook
  • Clipperz
  • Dropbox
  • Meebo
  • 等等
这一次,我可有些害怕了。正在考虑一些desktop替代品。例如:
MS OneNote, Firefox, Keepass, Pidgin等等。还是自己的硬盘上的东东可靠啊。

项目才刚刚开始,就收获了不少教训!

CNPL项目才刚刚开始第一周,就收获了不少教训。
上周一的时候项目刚刚启动,PMO的人找我谈话,希望我能配合工作。我当然满口答应。
周二的时候,收到PMO发来的邮件,让我周四就需要提交:人力资源管理计划以及项目实施方案两个文档。这两个文档我在之前都没有听说过,仔细看了看PMO发过来的例子,才发现项目实施方案其实就相当于PMP中所说的完整的项目管理计划了。
于是加班加点写了所有能写的内容,周四的时候发了出去。其实这个时候需求访谈才刚刚开始,项目组内所有的人全都整天在客户方进行需求访谈。所以现在只能有需求访谈计划。我在发出去的邮件中还详细的注明了所有无法填写的内容的说明。
很快PMO就回了邮件,找出了很多问题。而且最郁闷的是,老板也回了邮件,针对我所注明的无法填写的内容一一批驳。话里话外好像是在说我的工作态度有问题。
于是我在周五的时候找我的二老板抱怨了一下。看来是传到老板耳朵里了,老板马上打电话过来安抚。而且,我看了一下老板批驳的邮件,还好,仅仅是发送给了我和二老板,并没有发送给PMO。所以心里也还好过了些。
由此事件,得出了以下一些教训:
  1. 我本来真的很重视PMO的工作,因为我有8年项目管理经验,我是PMP,而且我也曾经是上一个公司的PMO部门经理。但是,现在在这一家公司,PMO的需求的优先级并不高,是很有协调余地的。前几个月我还在感慨这个公司对项目管理不重视,PMO的人地位也很低。现在看,可怜之人必有可恨之处啊。只给我两天的时间让我完成庞大文档,而且时机也很是不对,这让我不可能保证质量完成工作。
  2. 我犯了一个错误:在项目初期就应该非常重视如何将工作分配到下属手中。
  3. 我犯了另一个错误,在分析干系人需求时,非常重视客户方面的满意度,反而忽视了老板的需求。我本不该犯这样的低级错误的,可能是因为在这个公司当前的管理能力下,我对自己的管理经验过分自信了,以后一定需要注意。
  4. 现在的客户的习惯是,一旦项目启动,就会立刻需要所有相关的文档。现在的公司也受其影响,老板养成相同的习惯。所以为了应对这样的特殊情况,需要在项目早期就写出非常详细的项目计划(甚至需要计划到9个月之后的某以前需要干什么)。当然,这样的文档没有任何实际意义,仅仅为了交差。而随着需求访谈的进行,项目范围渐渐明确了之后,才需要真正用功编写能够实际应用的项目管理计划。
  5. 现在的环境下,项目经理管理工作还有更多的内容,甚至包括长期出差人员的住宿问题、办公场地的桌椅等等细节问题。这些在书本上是找不到的。

2008年12月16日星期二

关于软件过程的比较



关于软件管理过程,目前敏捷过程最为热门。主要的敏捷过程有以下几种:XP 极限编程, SCRUM, FDD 特征驱动开发, DDD 领域建模驱动开发, ICONIX, ASD 自适应, CRYSTAL 水晶, DSDM, TDD 测试驱动开发, AMDD 敏捷建模。再加上“传统”的RUP。
浏览这些过程会发现这些敏捷过程所涉及的领域还是有所区别的。简单来讲,可以粗略的划分为管理过程和设计过程。例如:
  • SCRUM:很明显是管理过程。在实践框架中提供了一些可以明确执行的实践指南。而其中对于设计方法或者过程基本没有什么要求。
  • FDD:应该属于管理过程。其中明确了对项目的进行如何规划。而对设计方法所述比较少。
  • ASD, CRYSTAL:属于管理过程,其中重点讨论对人的管理理念。管理框架具有很大的灵活性。
  • DDD:属于设计过程,重点描述如何从业务需求导出到系统设计编码的过程。
  • AMDD:属于设计过程。
  • XP:比较特殊,不是完整的管理体系。而对设计过程也很少描述,仅仅提供了一些最佳实践。由于其要求非常明确,所以我觉得更接近与设计过程。
  • TDD:应该不算是过程,仅仅是一种辅助设计的方法。所以经常被其它敏捷过程所引用。
  • ICONIX:对管理过程与设计过程都有所涉及。不过更加接近于设计过程。
  • DSDM:不太了解,无法分类。
基于此原因,所以经常可以看到将两种或者以上的敏捷过程组合进行应用的现象。如:SCRUM+XP, FDD+DDD等等。而AMDD和TDD更是经常被其他过程所引用。
不过这也侧面说明,这些敏捷过程往往内容都不够完整,或者说是针对性比较强。

现 在看来,敏捷过程的宣传者针对的往往是一些传统的重型过程,如CMM, ISO等等。而由于RUP内容比较复杂,所以往往也被算进来。这其实是由于对RUP的误解造成的。RUP被设计为统一过程,所以必然包罗万象,以便适应于 更多类型的项目。这就造成了RUP的复杂性,其实也说明了RUP内容的丰富。但是,当具体到某一个项目的时候,必然会根据项目特点或者企业环境因素对 RUP过程进行裁剪,以形成特色的过程。所以针对小型项目,RUP完全可能变成为非常“敏捷”的过程。
不过这也属于一个矛盾:1. 对于小型项目的项目经理来讲基本没有精力或者经验对整个RUP体系进行完整的研究。2. 如果缺乏对RUP体系的研究,就不可能对RUP体系进行恰当的裁剪。
基于这个矛盾,出现了很多伪RUP过程实践。
这样的现象是因为RUP中缺乏对一些比较典型的项目类型的具体指导和模版,来使项目经理可以快速的对RUP开始实践。而在这方面敏捷过程往往做得更好。例如XP过程,提出了明确的原则和实践指南,使得人可以非常简单清晰的学习和实践练习。
基于此,例如XP这样的过程就在程序员中很受欢迎,因为程序员多数项目管理经验不够充足,所有如果有简单而明确的实践规则的话,当然更容易付诸实施。
但 反过来讲,这些敏捷过程对项目类型的要求往往非常严格,例如,XP过程就会要求:项目组规模、办公地点、用户现场、合同类型等等。所以当人们将它应用与不 同的领域时又不得不对它进行改良或者采用其它的软件过程。在这方面RUP就会好很多,深入研究RUP可以使你用一种软件过程应对更多类型的项目。
ICONIX是所以受欢迎,就是因为它延续了RUP的思路而有提供了可明确参考的工作步骤。

当然反过来,对敏捷过程的误解也是存在的,例如:RUP的支持者往往认为XP过程没有设计。实际情况是XP过程也是相当重视设计的,只不过方式不同。XP过程不建议进行预先设计,而是使用其它的一些辅助手段保证软件设计的优化,例如TDD、重构等等。

再看看思维方式。新兴的敏捷过程往往宣传自己基于小型迭代,并以此来对应变更,使项目满足客户业务需求。但所谓迭代一词应该更加细分成:“增量开发”与“迭代开发”,之间的区别如图所示。

由此看来,如XP, SCRUM, FDD等过程其实都属于增量开发。而RUP和ICONIX过程属于迭代开发。所以,对此概念模糊的人就会误解RUP更像瀑布模式。
其实增量与迭代无所谓优劣,仅仅是思维方式的不同。

2008年12月8日星期一

关于系统设计的文章摘抄

模型(Model)代表应用程序的数据(data)和用于控制访问和修改这些数据的业务规则(business rule)。通常模型被用来作为对现实世界中一个处理过程的软件近似。
视图(View)被用来组织模型的内容,它从模型那里获得数据并指定这些数据如何表现。
控制器(Controller)定义了应用程序的行为;它负责对来自视图的用户要求进行解释,并把这些要求映射成相应的行为,这些行为由模型负责实现。

有人提到
MVC模式时说MVC代表了模型层、视图层、控制层,我觉得这是不对的。在经典的J2EE三层架构中,三层是分为Web层、业务层、持久化层;这个经典分层是基于分布式应用(EJB)的,也就说,Web层物理上是在Web服务器中, 业务层和持久化层物理上是在应用服务器中。在这种情况下,MVC只是属于Web层这一层的,而不是分为三层。在这种分布式应用中,视图就是JSP(如果采用的话),控制器就是Servlet(如果采用的话),而模型就是就是调用业务层的在Web层中的桩子。假如我们采用轻量级的SSH技术架构,视图还是JSP,控制器是Struts,而模型就是Spring+Hibernate。这里最难理解的就是模型的概念。我觉得模型是有状态和行为的,那么Struts中的Action调用的Servcie方法就是模型的行为,而返回给JSP的DTO(DO)就是模型的状态。

对于一个页面请求,总要有个地方负责处理和页面跳转的地方,这个地方就是页面控制器。页面控制器有两种,一种是如
Servlet的脚本文件,一种是如JSP的服务器页面。对于Java来说,JSP就是只应该用来显示动态的或静态的信息,而不是用来负责处理Request并Redirect页面,否则Servlet就要失业了。尽管一个Web程序可以全由JSP文件组成,但将控制甚至业务脚本杂乱的穿插在Tag中真的是太糟糕的实践了。

贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。似乎现在流行的架构就是这样,当然层次还可以细分。
该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。

充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。
它的优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。
缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。 其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。

贫血模型是对OO的 非常经典的诠释!数据交给s/g,业务全部交给业务对象来完成。耦合度很低,逻辑清晰,重构空间大!而且在业务逻辑上事务控制的关注点也小!但是也很明 显,业务对象做的事情实在太多了,在领域对象上这个叫做超职责。s/g和业务对象分工虽然明确但工作量截然不同, 也就是说这个对象的职责过于复杂,在一定程度上背离了细力度的OO模型原则。

网友: 对某一个实体信息的管理维护,是分出增加、删除、修改还是只看作一个维护用例?
UMLchina_潘加宇:关键是要找出CRUD背后可能隐藏的业务。

网友: 到底要画哪些图?序列图是必须的吗?
UMLchina_潘加宇:
如果不是面向对象开发,只有用例文档是必须的,然后直接编代码都可以。如果是面向对象开发,需要用类图描述结构,顺序图分配责任。


Martin: 关于这些项目中不写文档的说法是荒诞的。文档和计划当然要做,不过他们不再是过程的一部分,而是过程中的一个任务。在敏捷项目中,会有很多任务,有些任务会包含文档化、项目计划等这些管理团队需要做的规范操作。但它们不再是过程的一部分,这句话的意思是说,它们的秩序不是固定的,我们不是一定要先写文档,也不是一定最后写文档,我们在写文档这个工作变得重要的时候来做它,它会和其它任务一样在日程中进行安排。

Martin: 对.NET开发者而言,在学习敏捷开发的过程中最大的挑战就是测试驱动开发。敏捷开发对单元测试和自动化接受测试的要求很高。TDD现在已经被全行业所接受了,就算你是微软,也是一样的。


那么测试代码是否可以完全取代自然语言形式的设计文档呢?我看还不行,原因有三:
其一,测试代码虽然比源代码容易理解,但它仍然是代码,不是所有人都能理解的;
其二,测试代码的宏观表达能力还是不如自然语言或图表;
其三,很多人习惯看文字而不是看代码,彻底改变人的习惯很难。
所以在TDD开发过程中,比较好的形式是自然语言的文档和测试代码相结合,用自然语言的文档做一个够用的设计就行了,这个设计只要详细到模块关系这一级别就足够了,各个模块的详细设计就由测试代码充当。

Q: 单元测试怎么能反映/代替需求 ?

A: 单元测试未必能直接反映宏观上的需求, 但

  1. 功能测试和集成测试能够反映宏观需求.

  2. 单元测试能够反映系统的其它部分对当前单元的需求.

而从文本的角度, 测试用例的名字就是需求的描述. 换句话说, 你从传统的需求文档中把描述抠出来, 放到测试代码中作为测试用例的名字, 你便拥有了可执行的需求文档


当你试图测试一个单元时, 却发现需要创建大量的其它对象, 而且按照你脑海中的实现, 有些对象是在单元内部创建的, 根本无法在测试环境中假冒它们. 这时候, 你即使只是为了减少测试的难度, 也会逼迫自己思考:

  1. 这个单元是否做了太多的事, 承担了额外的职责, 违反了单一职责原则?

  2. 是否应该把依赖让外界设置进来, 而不是自己在内部创建, 这样测试时就能把依赖设置为假冒的实现?

是的, 单元测试警示你思考一下自己的设计


2008年11月24日星期一

业务流程建模与软件项目需求


在软件开发的阶段定义中,以前一直不太分得清需求阶段内部的子阶段划分。
在以前的项目中,我们仅仅出具软件功能需求文档,并且认为这份文档就是全部的项目需求文档。文档的内容主要包括:功能性需求的用例分析,用例内部的流程图(活动图),用例内部的系统原型,如果需要的话,还要加入模块以及的流程图和系统的WHOLE PICTURE,其他内容(包括:非功能性需求,项目业务目标,名词解释,设计人员等等)。

到新的公司之后,刚刚进入了物流项目组大约一个月,发现软件需求中的业务需求和功能需求还是有所区别。
在项目的早期,我们需要对客户的应用系统所涉及的业务逻辑和业务流程进行分析,并形成业务需求文档。这一份文档的目的是能够是项目组的相关成员对客户的业务有更好的理解,或者是新进入项目组的成员能够对项目的业务背景有一个比较完整的认识。准确的定义客户的业务需求对后面的软件需求分析具有指导性的意义。在这份文档中,将主要使用业务流程建模工具,如数据流图、工作流程图、UML活动图等等。
在分析的业务需求之后,进入到软件功能需求阶段。在这个阶段,将根据将来的系统建设需要对业务需求中所涉及到的功能进行重新的拆分组合排序,并进行一些补充。使之更加贴近设计人员的需要。在这个阶段的产物软件功能需求文档中,将会更多的将用户业务的语言翻译成为软件开发专业的业务描述。这份文档的目的是直接作为系统设计的输入,并能够指导开发工作,所以其还需要能够比较容易的进行任务分解。在这份文档中,将会更多的使用用例分析和业务领域分析、原型设计等工具。

目前新公司的物流项目正处于早期的业务调研阶段。在这一段时间内,我目前正在了解有关业务流程建模的工具。以前一直是在使用UML的活动图,但是总觉的其表现力还是不够丰富,所以也经常在使用跨职能的流程图进行辅助。最近查阅了相关的资料发现,UML在业务流程建模领域的确是弱项。在这个领域现在有很多成熟的工具和理论。最典型的是BPMN和EPC。
BPMN图是官方组织发布的专门用于业务流程建模的规范。目前的版本大约是2.0。图例非常丰富——不下50多个。也有很多专门的绘图工具,其中包括免费的产品BizAgi Process Modeler和很多基于Visio的图例插件。不过,对于如何规范的规制业务模型的资料,网上却少得可怜。
EPC图不是行业标准或者规范。但是由于能够绘制EPC图的软件ARIS被内嵌在了者名的SAP软件中,所以EPC图基本上是事实上的行业标准。EPC图例并不复杂,但却能组合起来清晰的表现业务流程。
所以在现在的项目中,我尝试的使用EPC图的方式进行了一些业务流程的说明。当然,在使用的过程中,我对EPC的图例进行了微小的扩展。
下面是我做的一个EPC图的例子。

2008年11月17日星期一

关于业务模型分析的绘图需求

在业务模型分析过程中,发现有以下的一些绘图需求:
  • 需要能够表达工作流程。
  • 需要能够表达系统的功能。
  • 需要能够表达工作流程中的动作。其中最好能够区分关联到系统功能的动作和系统外部的动作。
  • (系统功能和流程中的动作或许可以等同对待)
  • 需要能够表达系统功能的输入和输出,可能是:纸质的单据,电子数据或者业务对象。
  • 需要能够表达操作系统功能的系统角色以及其所属的组织结构。
  • 需要能够表示出发系统功能的事件。或者系统功能完成之后的流程状态。
  • 需要能够表达流程分支的情况,例如:and, or, xor,并行等等。
  • 需要能够对某一个系统功能或者动作进行扩展。例如某一个系统功能中可能会有其子流程。
  • 需要能够对上述的业务对象以及系统角色进行“引用”方式的绘图,以便统一管理。
  • 可以对业务对象进行详细设计(类图)。
  • 最好能够附带对某一节点关联系统页面原型的设计功能。

目前正在参考以下一些工具,但似乎都不能完全满足需求。当然也有可能是没有完全发掘以下一些工具的全部功能。
  • UML活动图+UML类图
  • EPC图(Event-drive Process Chain)
  • Serena Prototype Composer工具

2008年11月13日星期四

Google Chat可以Video

今天一早打开GMAIL主页,在左上角发现了一个新的链接:New! Video chat
点击之。
发现被自动引导至www.google.cn主页,奇怪。
于是重来一遍,在浏览器刷新的过程中使用ESC,遂看到video chat页面。再次使用该方法,终于下载了google video chat插件。

OK,现在在gmail主页中发现了video chat设置,成功。

2008年11月11日星期二

应用软件设计需要原型设计工具

依据ICONIX过程与AMDD方法,敏捷设计的过程可以大致总结为以下的几个步骤:
  1. 进行用例分析(或者用户故事),同时设计初步的域(domain)模型。
    输出:初步用例、领域模型
  2. 同时参照用例和领域模型进行系统健壮性分析(robust)。
    输出:健壮性分析图、更新的用例、初步细化的系统类图(由领域模型而来)。
  3. 参照健壮性分析图,进行系统详细设计——画出UML顺序图。
    输出:顺序图(针对每一个用例至少一个顺序图)、最终细化的系统类图。
以上过程比较清晰,其中robust分析过程是为了弥补用例分析用顺序图之间的GAP而加入的过程。
不过,在第二步与第三步之间,如果能够加入原型分析(界面草图与页面流程),则其输出文档显然比系统顺序图更加直观。系统原型分析的结果能够更加有助于编程人员对与系统需求的理解,而这一步也是AMDD方法建议的步骤。
所以建议加入一步:
2.5. 依据用例分析文档,健壮性分析进行系统原型设计
输出:原型分析文档(页面流程图、系统界面草稿)

你现在在使用什么工具进行系统原型设计?MS Visio, Powerpoint, yEd, Dreamwaver, Flash还是纸和笔?(Sparx EA中虽然集成了界面设计工具,但是毕竟太过简单了)
其实现在已经有很多专业的原型设计工具了,主要的有以下几种:
  1. Axure RP
  2. Caretta GUI Design Studio
  3. iRise Studio
  4. Elegance Lucid Spec
  5. Mockup Screens
  6. OmniGraffle (only for MAC)
  7. Balsamiq Mockups
    有免费版本,但是有功能限制(不能保存,只能其他工具进行抓图了)。但是画出来的图是手写风格的,真的非常漂亮。
  8. Serena Prototype Composer (free)
    免费版本,功能非常齐全(建立项目、多层次的流程设计、界面设计、数据流转设计等等)。
  9. Pencil (firefox addon)
    居然是作为firefox插件形式的产品。免费。虽然只有界面设计功能,但是已经足够令人惊奇的了。
以上产品功能各具特色,都是很成熟的产品,而且非常容易使用。但是值得提到的是Serena Prototype Composer,使我们可以免费的使用到高品质的产品,强烈建议使用。

2008年9月11日星期四

完美To-do List: Toodledo

使用很多年to do list工具了。但是越来越发现难以找到能够完全满足要求的。
结合GTD理论以及柯维的First Things First理论,现在总结需求如下:
  1. 需要能对任务的内容(context)进行分类
  2. 需要能对任务的状态(status)进行分类(next action, action, waiting for, sometimes, finish...)
  3. 另外,各种任务有以下区别:
a. 某一阶段的目标Goal
b. 日常工作
c. 特定日期需要完成的任务Task
d. 某段时间需要不停关注,例如:项目(project),一般有起止时间。
e. 仅仅是某些想法,记录以备参考。Reference
  1. 任务管理需要能够集成日程表(calendar)
  2. 结合日历,可以每天记一些工作日志(相比BLOG应该更加偏向于一些机械性的工作内容)。
  3. 任务(task)不等于日程(appointment)

可用的软件中:
  • outlook理念落后(outlook2007还可以,但也不完全匹配)
  • GTD类软件普遍功能简单,而且不能集成日程表
  • Google Calendar只有日程,没有任务。
  • PlanPlus过于笨重,而且价格不菲。

直到最近看到了www.toodledo.com,发现其可以完全满足上述需求。而且还有额外的功能:
  • 集成Google Calendar
  • 合作与共享
  • 其他功能还在摸索中。

不过强烈建议使用。

新款密码管理工具: LastPass

经常上网的人,有许多username和password需要记住,例如:电子邮箱,网上银行,网上购物,论坛,求职网站,BLOG,社区网站,同学录等等等等。
想全部记住不同的密码,很难;全部使用相同的密码,极不安全。于是乎出现了很多密码管理的软件来帮助人们记住密码。流行的软件有以下一些种:
  1. AIRoboForm:这个领域最著名的产品。功能十分强大,使用方便,能够集成多种浏览器。能够自动识别网站切进行登录,能够管理注册表单,还能够记录一些与网站无关的个人保密数据。唯一的不足是无法进行网络存储且同步。虽然是收费的软件,但物有所值。
  2. KeePass / ALPass:免费产品。KeePass的缺点是操作比较繁琐。ALPass的缺点是仅仅支持IE浏览器。而且两款软件的数据也都是本地存储。
  3. Firefox插件,如Magic Password:免费产品,使用方便。这类软件多是利用网站的关键字和用户设置的主密码来自动计算网站登录的密码。优点是生成的密码非常规范,不易破解,而且没有任何数据进行本地或网络存储,非常安全。缺点是仅仅支持Firefox浏览器,且对插件的依赖性很大。
  4. 密码管理网站:优点是对本地系统没有任何要求,只要有浏览器即可,网络存储,所以随时可以使用。缺点是操作非常不便,基本上需要手工维护。典型的如:豌豆网, PassPack, Clipzz等等。
  5. 浏览器自带的密码管理功能,如IE, Firefox, Opera。功能往往很弱且不完整。
  6. Google Browser Sync:现已停止下载,主要是将Firefox的各种数据(包括书签、密码、Cookie等)同步到GMAIL帐号中。非常方便,缺点是只支持Firefox浏览器。

新产品LastPass与众不同:
  • 集成不同的浏览器,包括IE和Firefox。
  • 帐号密码网络加密存储,所以不需要进行备份。
  • 能够进行自动识别与自动填充,操作方便。
  • 能够自动生成密码,也可以手动输入密码,所以对软件本身没有很强的依赖。
  • 能够导入流行的密码管理软件的导出数据,包括:AIRoboForm,KeePass等。

结论:强烈推荐使用。

2008年9月3日星期三

Redmine试用

由于project server庞大而且安装使用复杂,所以正在考虑使用一些轻量级的项目管理软件。暂时选中Redmine。

  1. 安装
  • 安装instantrails
  • 启动instantrails服务
  • 使用phpmyadmin在mysql中建立数据库
  • 配置database.yaml
  • 启动webrick
  1. 特色
  • 建立项目
  • 建立子项目
  • 自定义项目角色
  • 自定义角色的权限
  • 自定义问题状态流程
  • 自定义问题状态
  • 自定义跟踪标签
  • 自定义版本(相当于里程碑)
  • 自定义问题类型
  • 分配任务
  • 任务日历
  • 任务甘特图
  • 项目成员根据问题(相当于任务)填报工时
  • 灵活的工作量统计报表
  • 基于项目的wiki
  • 基于项目的文档管理
  • 基于项目的论坛
  • 上传文件
  • 新闻/公告
  • 系统活动跟踪
  • 里程碑状态报告
  • 个人的dashboard
  • 缺陷跟踪(问题跟踪)
  • 多语言支持,多时区支持
  • email自动发送
  • 导出到csv/pdf…
  • 版本控制支持(包括subversion, cvs等等)
  1. 没有的功能
  • 人员成本
  • 项目预算
  • 问题不能有子问题(问题不能分层)
  • 问题只能分配给一个成员
  • 版本控制不支持:vss, clearcase, starteam
  • 甘特图的显示细节无法进行自定义
  • 没有pert图
  • 无法定义项目流程规范(模板)
  • 虽然可以进行缺陷跟踪,但是很遗憾无法同时集成test case管理(如果testlink能够集成redmine就好了)

结论:
  • 基于项目组级别的项目管理软件,轻量级的,足以应付一般的软件管理。
  • 不具备企业级的功能,但是如果能够配合一些管理手段的话,也足够用了。
  • 对于一款开源的产品来讲,Redmine已经非常出色了!

2008年9月2日星期二

谈谈人员素质

在国内的现状就是这样的:由于IT行业人员需求量大,而且平均工资水平也还过得去,所以有大批的人才虽然从性格、爱好、综合素质等多方面来看并不适合这一行业,但是出于就业的考虑,也加入了这一行。
在上一家软件外包公司,我参与了3年的毕业生招聘工作,就是说,招聘部门负责面试综合能力,我来负责面试技术。中国的高校发展参差不齐,所以我明白我不能过分苛求应届的毕业生要有某某项目的实战经验。于是乎,我对毕业生的考察以课内的基本功为主。

数据结构:
第一题:没有指针机制的情况下,如何实现链表结构?(只有20%左右的人能够回答出使用数组,其中又有一半的人是蒙的而不知道如何实现。)
第二题:哈夫曼编码的作用是什么?(大约60%的学生能够提供正确的答案。)
第三题:列举出你所知道的排序算法的名称,仅仅是名称就可以?(大约90%的学生回答出了冒泡排序;有70%的学生同时回答出了插入排序;又有20%的学生同时答出了快速排序;在我的印象里,几乎没有人能够提及谢尔排序、归并排序和堆排序等等。)
操作系统:
第一题:请解释一下什么是进程死锁?(令我吃惊的是,大约只有40%的学生能够让我确认他正确理解了进程死锁。)
第二题(如果你正确回答了第一题的话):最常用的避免进程死锁的方法是什么(提示:教材中所讲解过的)?(只有10%的人能够想起来PV信号灯)
第三题(如果前两道都答对的话):请解释一下操作系统的内存分页管理机制?(要求不高,能够提及局部性原理即可,但是只有零星几个人能够通过)
数据库原理:
第一题:请列举出数据库表设计原则中,都有哪几种范式?(大约60%的人能够说出第一到第四范式)
第二题(如果答出第一题的话):其中那一种范式又叫做正规范式?(只有20%的人回答是第三范式,其实说第三范式也不准确,不过马马虎虎就算过了)
C语言:
第一题:在struct中可以定义属性,但能否同时定义函数?(当然不可以,否则不成了class?这道题难住了40%的学生)
第二题:函数能否作为另一函数的参数?(呵呵,我相信很多人听到这个问题的时候都蒙了)

其实我从心里最想问的问题是:你们大学4年都学什么了?

我在上大学期间绝对不是什么好学生,在班里排名中等,逃课作弊不在话下,所以对不用功的学生绝对没有仇视心态。不过,我的同学当中,就算最不用功的学生也会非常用心的去听数据结构课程,因为我们都知道:我将来想干这个行业,就得指着这个吃饭啊。我们公司的生源学校也不全是二三流的学校,也包括了几个211工程中的国家重点院校。
不过,在面试的学生中,有两类人回答问题的结果不错:一是考研失败的学生,因为这些内容他刚刚复习过的(课程年了两遍,效果当然不同);二是工作几年之后又读了硕士的研究生毕业生,因为这些人在读研的时候更清楚自己想要学些什么。

我曾经面试过这样一个研究生毕业生,上面的所有问题对答如流,于是,我稍稍来了一点比较邪恶的:
问:C语言,现在有a, b两个变量,想把它们的值交换过来,有什么方法?
答:比较通常的做法是使用第三个临时变量,不过使用“异或”更有效率。

回答完这个问题之后,我告诉人力资源部门:这个人应该高于普通研究生入职标准2000元的水平进行招聘。后来我就再没有见过这个学生,很遗憾,可能多给2000还是少了点,要不然就是老板没有批准我的建议。

再说说在职人员的招聘。
由于以前的公司是做业务应用系统的,所以程序员需要天天和数据库打交道,SQL语句经常使用。所以在招聘的时候,我可以不太看重程序员对编程语言的熟悉程度,但是SQL语句必须熟练。针对这点,我编了两道SQL语言的笔试题。题目不太复杂,第一道主要是考group by 和case when,第二道主要是考union。我准备给候选人们半个小时的时间来完成这两道题。但是这两道题可是难住了一大部分前来面试的候选人。以至于我在怀疑这两道题是不是太难了?
于是我将这两道题发给了两个同事来做测试,其中一个是项目经理,另外一个是作为初级程序员的一个小女生。5分钟之后项目经理交卷。15分钟之后初级程序员交卷。两个人提供的答案和我的参考答案几乎完全相同。

有意思的是,后来我通过MSN MESSENGER将这两道题发给了我一个正在读研的师妹。大约半小时之后,答案发送回来。其中第二道题的答案思路非常奇特,我仔细的看了之后,发现不仅能够得到正确结果而且比我提供的算法效率还要高一些!非常遗憾,我最终没能说服她毕业之后来到我们公司。当然,这对她个人来讲不是坏事。

说到算法效率,还有一个有意思的故事:
我们曾经有一次给客户开发一个业务应用系统。系统的报表功能中,有一个关于返修率的报表。在系统试运行期间,发现该报表无法得出结果。后来,我发现,程序员在生成报表的后台SQL语句中使用了函数,在当时的数据量情况下,粗略的估计这条SQL语句执行完毕需要80几个小时!I am shocked by the result!
我只得亲自出手在客户现场进行优化。2个小时之后,将报表的生成时间控制在了5分钟之内。
后来,其他的项目组在对该客户进行别的项目时,也用到了返修率报表。当时那个项目组的人员并不太清楚返修率报表以前的故事,所以委派他们组里的一个小女生来开发这个报表。结果呢?新开发的报表平均生成时间在15秒之内!I am shocked by the result again!

很遗憾,最终我没能在我的部门中留住这个小姑娘——她后来被人力资源的人偷偷的卖到客户现场去了。为了此事,我和人力资源的经理直吵到了副总经理办公室。但是木已成舟,也无可奈何了。

2008年9月1日星期一

极限编程是否符合中国国情?

XP为什么不适合国内的现状?下面是我个人的一些看法。

针对极限编程的准则:

  1. 用户故事
    先说说XP的描述:不需要在一开始完全了解需求,因为以后很可能会变化。不需要一开始就了解详细的需求,只需要到可以估算的程度就可以了,可以一边实现一边详细了解,因为有现场客户在。不需要详细的需求文档,代之以用户故事,因为沟通胜过文档,而且用户故事简单又容易编写。
    我的想法:用户故事体现了将需求分解为条目的思想,在这点上来说,是可取的。但是其他的说法就有问题了。
    首先是不需要一开始就完全了解需求的说法。对于互联网项目来讲,这种说法可能是正确的,因为需求变化非常快速。但是对于一般的业务应用系统来讲呢?需求会变化,但是关键的业务流程是相对比较稳定的。当你明明可以掌握全局的时候如果还要偏激的从局部开始着眼的话,岂不是有些钻牛角尖了?就好比要盖一座房子,在初期我可以不清楚将来的卫生间如何装修,但是总是需要在一开始的时候就了解需要打多深的地基吧?全面了解需求肯定有助于在项目开始时候建立正确的系统架构方案。
    其次是关于需求文档的问题。不可否认,在一定的项目规模内,有现场客户在,再加上充分的沟通,能够达到比文档更好的效果。但是,限定条件是不是太多了一点啊?大一点的项目,如果需要40个成员都需要和现场客户进行沟通怎么办?另外,我们知道,很多项目都会一期一期的做下去,铁打的营盘流水的兵,几期项目做下来,项目组成员甚至现场客户早就不是原来的人了,这些人靠什么来对项目进行了解呢?是不是项目组的老员工每个人都能够知道项目的所有细节呢?有很多情况,如果想要比较透彻的理解需求和业务,则需要对该业务的发展背景以及生成原因有所了解,程序员和测试人员当然有权了解这些。而这些当然都需要有文档来进行传承,仅靠用户故事显然不能胜任。有很多情况,我们需要从更高的层面来观察客户的业务,需要看到一张客户业务的全局性视图,而从用户故事那里我们能够得到什么呢,全部都是局部的片段。有很多时候,一些非常复杂的业务流程是技术人员和客户进行艰苦的讨论得出的成果,这些讨论的过程和结果如果不能够记录下来的话,早晚有一天,你会发现艰苦的讨论经常会重复的出现。
    第三,我们需要在项目初期就明确项目的business goal,明确项目边界,我们还需要明确项目的非功能需求,这些都是用户故事所无法承担的工作。
    最后,用户故事代替需求需要有一个非常严格的配合条件:必须要有现场客户,并且进行结对编程。
  2. 紧急设计过程
    XP的原则:对于每个故事做少于15分钟的预先设计,主要设计工具是白板和CRC卡片,使用最简单的方式来实现眼前的问题。对于系统中出现的问题,使用重构来解决。
    我的看法:XP承认这样会带来一些问题,所以必须严格执行配合条件:持续的重构。
    同样,对于互联网项目来讲,有一定的道理,但也是局部的。而对于业务应用系统来讲呢?对于相对比较稳定的需求,我们仍然需要走到哪里设计到哪里并且修改的哪里吗?设计阶段多花些时间能够避免的问题依靠编码之后的重构来进行解决吗?重构的工作量会比预先设计的工作量小吗?(按照教科书的说法应该是被放大10倍了吧?)这不是人为的造成的浪费吗?你的客户除非就是你某个uncle,能够允许你如此糟蹋他的资金。
    中国古人扁鹊曾经介绍:真正的医术高手其实是他的师兄,但是他的师兄为什么没有他的名气大呢?因为扁鹊的师兄总是在别人的健康又出现问题的前兆的时候,就已经出手化解了。(这才是高手中的高手啊!)亡羊补牢虽不算晚,但是防患于未然岂不是更好?
    事无巨细的预先设计是不现实的,但是完全省略也不是个办法。
    设计文档需要吗?显然非常需要。还是那句话,很多项目是需要进行延续的。对于一个新的项目组成员来讲,源代码就算再规范,其可读性也比不上设计文档。做人真的不能只想着自己方便……
    说的更远一些,你的项目组中的经验丰富的有设计能力的成员将无法充分发挥他的聪明才智。他将经常看到别的一些经验不够多的程序员对子写的低水平代码,然后对他们进行重构。这种感觉就像经常需要给别人擦屁股。
  3. 现场客户
    XP的原则:客户长期与开发人员在同一间办公室办公,随时解决开发人员关于需求的问题。现场客户负责编写用户故事,负责决定用户故事的优先级以及实现顺序。现场客户负责编写验收测试用例。
    说说实话吧,你见过这样的客户吗?
    哪个客户的公司能够安排一个全职的客户代表来参与到项目中呢?如果真的安排了一个客户代表的话,他真的能够全面了解需求并对之进行把握吗?
    哪个客户公司的客户代表有能力完成这些任务呢?如果有的话,我看其他的XP原则就算都不坚持,项目结果也不会差到哪里去,因为你的客户代表本身就应该是一个很有经验的项目经理了。
    我们对客户的要求过高了一点点吧?
    而且,如果你所负责的项目的业务在客户公司是跨部门的,那该怎么办?每个部门派一个客户代表来吗?
    我看最有希望实施现场客户原则的项目应该是那种为公司内部开发的业务系统。即便如此,也很玄。
  4. 小型发布
    XP的原则:每隔一到两个月对客户进行一次系统发布,尽量早的让客户看到可执行的系统。
    我的看法:非常好。但是发布规模小到什么程度不能一概而论,只能说是尽量小。要做到小型发布,则必须先实现持续集成,否则很难承担多次的发布成本。
  5. 规划
    XP强调了对每个迭代进行规划。
    我的看法:XP的说法并没有错,只是还缺了一些东西。我们需要对整个项目进行规划,虽然越远期的计划可能越粗略,但是还是很有必要的。
    软件开发的合同不仅仅只是要求“我限定你这些时间,你看你能完成什么?”,还会要求“我需要完成这些功能,你看看你需要多长时间?”所以,做到哪里算哪里的想法似乎只能存在于政府或高校的研发部门吧。
  6. 隐喻
    在XP中,隐喻用来使项目成员对于系统的实现方式达成共识,但是似乎XP的教科书中对隐喻也没有进行很透彻的讲解。
    在我看来:隐喻是设计和沟通的辅助手段,适当的应用效果理想。但是也仅仅就是一种辅助手段而已。
  7. 简单设计
    XP的原则:力求使用最简单的方式实现当前的需求。简单的就是最好的。
    我的看法:这个说法本身就非常模糊,无法度量。简单与复杂都是相对的,仅仅存在于人们的头脑中,我觉得简单的问题可能你就觉得非常复杂。现实当中无法一概而论。
    另外,所有的时候最简单的就是最好的吗?典型的如8皇后问题,8重循环是最简单的解决方案……
    其实我们所追求的应该是不做不必要的复杂设计。
    同样,如果需要保持简单设计原则有效,则必须配合重构原则。
  8. 结对编程
    XP的原则:结对编程的优势在于:代码会被100%review,有效地降低代码缺陷率,提供了很好的机会进行知识传递,使每个成员都有机会了解系统的全貌,提高生产效率。更换结对的周期从半天到3天不等。
    我的看法:结对编程优点与缺点都很明显。
    每个项目组的成员都是有自己的特长和喜好的。最成功的管理是充分发挥每个人的优势,而不是将每个人编程一模一样的编程机器。有的人一边讨论一边工作时思维会更加活跃,而有的人则是喜欢独自安静的思考。同样,遇到不解的问题时,有的人喜欢立刻向别人请教,有的人喜欢现场是自己解决。我们必须面对这些差异性,而不是试图将它们消除。从这个方面来讲,XP显得不那么以人为本。
    开发人员作为技术人员群体,其中有相当一部分人个性很强但主动沟通能力不足。在国内,这样的情况则更为夸张一些。而往往这些技术强人在项目组成员当中有很有影响力。在这样的情况下,如果我们不得不强迫进行结对编程的话,我想,管理层后面将面临非常棘手的问题。
    结论:结对编程是好东西,但需要根据具体情况适度运用。要想进行结对编程,必须具备项目组统一的编码标准。
  9. 代码集体拥有
    XP原则:项目组的所有开发人员有权更改所有的代码。每个人都对所有的代码负有责任。
    我的看法:容易落入的陷阱是:没有人对代码负有责任。
    代码集体拥有的前提是结对编程。否则的话,这就是一句空话。
    编程有时候和体育竞技有些类似的地方:高手的某个出招(实现技巧)在庸手看来是非常愚蠢的。在这样的情况下,庸手会根据代码集体所有权理直气壮的对高手的精品代码进行重构……
    结论:代码集体拥有可以实施,但是不能简单处理,需要进行更多的沟通和一些技巧。
  10. 持续集成
    XP原则:开发人员坚持随时进行提交,系统每天一次集成。
    我的想法:这是很好的原则。但愿我们能够做到。
  11. 编码标准
    XP原则:实行项目组统一的编码标准,严格执行。
    我的看法:这是最基本的。而且越严格越好。我们时刻需要提醒自己:软件项目的产出是产品而不是艺术品。开发人员的想象力不需要浪费在这样的地方。每个人写的代码不仅仅是给自己看的。
  12. 测试先行
    XP原则:对于每一个用户故事,在开始代码之前,现场客户就需要编写验收用例,而开发人员需要先编写单元测试。这样能够保证每一个用户故事是可测的而且是自动化测试。
    我的看法:这是个非常令人憧憬的奋斗目标。但是,理想很美好,现实很残酷。
    作为一个典型的国内软件公司来讲,你所处的项目小组是什么样的人员素质呢?如果项目组有10个人的话,那么其中3 个有经验的开发人员,具有一定的设计能力。3个经验稍差的熟练工,另外大约还会有2个应届的毕业生。2个专职的测试人员,大约1-2年的工作经验。这应该算是平均水平了吧,很多团队连这个水平也达不到。这样一个团队存在什么问题呢?
    开发人员不会做测试,更加不会写测试用例。个别开发人员甚至不太清楚单元测试是程序员的责任之一。测试人员不会写代码,多数都是高校it专业能力不足的毕业生,接收单位经考察认为无法胜任开发工作,所以就去做测试吧。并不夸张,现状就是如此。
    在这样一个团队中强制执行测试先行,简直就是自虐。
    要实现这样的目标需要循序渐进:第一步要求编码人员自己完成单元测试并养成习惯,要求测试人员能够撰写全面的系统测试案例;第二步要求编码人员能够编写单元测试代码,要求测试人员能够运用自动化测试工具进行回归测试;第三步要求编码人员将单元测试编码工作提前到编程之前进行,要求测试人员提前根据需求编写自动化测试脚本。
  13. 重构
    XP的原则:随时对代码进行重构,要进行残忍的重构。
    我的看法:有时候重构是必需的,但是重构不能代替预先设计。
    进行重构时也需要小心,基于两个因素:
    第一,你的项目组成员有没有能力进行正确的重构?中国的开发人员有百分之多少充分理解了设计模式呢?而耐心学习过重构的人会更少一些吧?我看你还是现在项目组内部做一些技术培训再说吧。
    第二,你的老板或客户能否允许你这样做?重构是一件需要消耗成本、不产生利润又需要冒很大风险的活动,至少表面看上去是这样的。去说服你的老板支持你的做法对每个人来讲都是挑战。
    实施重构原则的前提是:必须实施代码集体拥有原则。
  14. 每周工作40小时
    XP原则:加班只会造成质量低下,要坚持每周工作40小时。
    我的看法:这个不难,我所管理的项目没有实施XP,也都轻松实现了这个原则。

上面就是我对极限编程的一些看法,极限编程并非一无是处,而是不适合中国国情。而且极限编程的各个实施原则之间是紧密耦合互相补充的,所以很难进行裁剪。

在我看来,极限编程的最大问题就在于“极限”二字。“水满则溢,月盈而亏”是国人都明白的道理,所以对于极限编程而言,我们都需要问一句:“把所有的事情都做到极端就好吗?”

最后,推荐ICONIX过程,一个相对比较中庸的敏捷过程,实施起来也不困难,指导明确,效果明显。

2008年8月31日星期日

新工作,项目管理以及一些相关软件

新的工作入职已经两个月了。进入项目两周之后慢慢发现,这个项目是在是一个烂摊子。作为这个项目的副项目经理,以我的工作经验而言,放眼望去,几乎到处都是管理上的错误典范。为了将来能够有机会对项目组进行改进,现在自己在慢慢的列出这个项目中的一些问题,以备将来能参考。列表如下:
  • 项目管理不严格,进度前松后紧,大部分阶段人员工作量不饱满,后期全体加班。
  • 缺乏项目的整体计划,项目组成员不知道项目的里程碑和各个阶段点。后期补了项目计划,但难以追踪,其中有一部分人为原因。
  • 由于没有明确计划,测试人员感觉无所适从。测试人员对项目质量缺乏信心。
  • 个别有经验的程序员不愿将已有的实现进行文档化,对工作交接以及后期维护不利。
  • 项目缺乏设计,导致代码质量不高。
  • 缺乏统一的编码规范,没有必要的代码走查。
  • 沟通不畅,程序员不了解需求,导致经常发生返工现象。
  • 项目组成员对分给自己的任务责任心不强。
  • 项目组工作氛围沉闷。
  • 日常工作分工不明确,例如没有明确指定SCM/SQA人员等等。
  • 对常用功能的设计缺乏基本的规范,导致经常出现低级bug。例如输入合法性检查等等。
  • 没有建立问题报警机制。
  • 缺乏政策性的文档提交列表以及文档模板或规范。
  • 缺乏任务管理系统和报工系统,难以统计项目成本。
  • 缺乏人员评价机制。奖惩制度不明确。
  • 缺乏测试案例管理系统。
  • 缺乏需求追踪表,对设计和测试进行必要的覆盖度审计。
  • 测试时间过短,无法进行充分测试。没有充分利用单元测试工具和自动回归测试工具。

呵呵,听起来想是能犯的错误都犯了。

当然,仅仅找出问题还不能够算是有建设性,找出并解决问题才是管理人员需要做的。其实,只要公司能够给我明确的位置,改变现状应该并不太难。当然,对于现在的情况,不要奢望能够一口吃成胖子,循序渐进是比较现实的方法。

由于现在天天在客户现场上班,没有办法接入互联网。可以这样也算有利有弊。好处就是:可以有充分的时间进行一些学习。

例如:仅仅用了一整天的时间就详细的读完了一本关于XP的书,并且还做了笔记。

最近看了一些关于XP软件过程的书籍,心里在想是否可以解决目前项目中的问题。看来人真的是很容易被洗脑的,尤其是对于自己没有经历过的事情。我几乎是充满期待的憧憬着将来能够在项目中应用XP。

但是,同时也看了一本叫做《重构极限编程》的书(内容是批判XP的)。结果,发现我在这本书里面感受到了更加强烈的共鸣。

今天突然发现,在这里的BLOG中,我在2年以前其实就对XP做了结论性的记载。其实我在4年以前就已经比较详细的研究过XP了。结论和现在基本相同。

和当初一样,我现在还是觉得ICONIX过程是比较适合国内现状的敏捷过程。不过,在ICONIX的经典书籍中,主要还是对于建模过程比较偏重,而对项目管理方法涉及较少。有些遗憾。

公司让我在业余时间研究一下MS Project Server。试了几次才发现,安装过程居然是如此的繁琐!微软的产品麻烦到了如此地步,还是比较少见。而且还是非常昂贵。于是上网去寻找一些开源的或者免费的产品。

结论:开源产品少得可怜。有限的几个,功能少,质量差。基本无法满足需要。

于是转向免费产品或者便宜产品:

  • kiwi manager:收费产品,BS模式软件
  • VersionOne:有免费产品和收费产品,BS模式软件,主要针对敏捷过程
  • ComindWork:收费产品,BS模式软件
  • PlanBee:收费产品,BS/CS模式软件
  • TargetProcess:有免费产品和收费产品,BS模式软件,主要针对敏捷过程
  • Rally:有免费产品和收费产品,BS模式软件,主要针对敏捷过程
  • Mingle:收费产品,BS模式软件,特别针对敏捷过程(极限编程)。极耗资源。
  • ExtremePlanner:针对XP, SCRUM过程,收费产品。

再有就是一些online service:

  • ComindWork:收费产品
  • Basecamp:著名的小型项目管理网络应用,免费产品
  • everydo.com:basecamp的我内仿造品,免费,仿的还不错
  • Projectmanager.com:收费产品
  • Goplan.info:有免费产品和收费产品。免费产品功能很少。
  • Liquidplanner.com:收费产品
  • PlanProjects.com:免费产品,功能较少。
  • Wrike.com:收费产品
  • Huddle.net:有免费产品和收费产品。

有一些开源产品值得注意:

  • Redmine:其实就是Basecamp的开源版本,可以安装在本地。
  • Xplanner:专门针对与敏捷过程。可以支持SCRUM和XP,功能比较单一。

其他的:

  • ]project open[:最著名的开源产品,功能比较多。但是难以使用,界面丑陋。
  • dotProject:软件主页失效。仅仅在sourceforge上面有项目。安装复杂。
  • Onepoint Project:有免费版和收费版。不过功能有些简单。安装复杂。
  • GanttProject:只能算是一个画甘特图的桌面工具。

2008年8月13日星期三

对于书签的管理

长期以来,一直在寻找更加方便的书签管理方法。IE自己的收藏夹管理功能比较弱。于是使用一些书签管理软件。
曾经使用过的最典型的这类软件就是URLMenu和AcqURL。后来发现即使使用这些软件仍然有问题:对这些软件的数据库文件需要进行备份和恢复(以备重装系统),另外如果在多处上网的话,就无法同步数据。
再后来开始使用一些online的书签管理工具,最典型的如: google bookmark和del.icio.us。当然还有firefox下面的Google Browser Sync。
最近,我注意到一个问题:
其实在大多数情况下,我经常使用的网站地址并不很多,这些网址其实完全不用使用书签我也可以记住。
另外一些网址,有可能我在浏览的当时会觉得比较有用,但是过后有可能一年到头也访问不了几次。对于这些地址,google和百度足以临时解决我的问题。对于这类地址,需要记住的往往是一些关键字,例如XX软件的名称等等。
其实书签有用的时候多数是在第三类地址上:使用频率中等(比如一个月会用到几次),地址有比较复杂。这类地址最典型的是网上银行网站。
所以,目前看来,主要寻找的解决方案是:
1. 对于第三类地址的书签管理。
2. 有很多时候,我在浏览时,想收藏下来的其实是网页上面的某一篇文章,而不是整个网站。所以需要寻找文章收藏工具。这类工具也有一些典型的软件。 桌面版的如:MyBase,良友,Evernote等等。 在线的如Clipmarks,Google Notebook等等。在线工具显然比桌面版有很大优势,但是Clipmarks操作并不方便,而且速度也是奇慢,Google Notebook更是经常无法访问。
3. 另外一类就是密码管理,如:招聘网站,论坛的,软件网站的,EMAIL的等等等等。 这类工具其实也是,在线的工具显然更有优势。但是目前能够使用的工具很少,多数也是很不方便。这类工具最典型的有:onedoor, Google Browser Sync 桌面版的工具也有一些很经典的:AI Roboform, keepass, alpass

以上这三类工具,目前还在寻找中。

2008年5月19日星期一

Google又一次先走一步

刚刚发现Google在beta版的toolbar中更新了他的bookmarks和notebook服务方式。

我曾经在del.icio.us和clipmarks两个服务中间犯难,不知道应该使用哪一个。后来我慢慢发现:收藏互联网上的文章和收藏网站地址本来就是两个完全不同而又互相联系的需求。

现在Google也意识到这一点了:将bookmarks和notebook服务进行了整合。

现在唯一的问题:Google Notebook还是经常的无法访问。真的不知道是什么原因搞得?

2008年4月30日星期三

Google Calendar与Outlook同步

google刚刚出了新的服务:能将本地的outlook中的数据与google calendar同步,真够NB的。

新的facebook帐号

今天刚刚申请了一个facebook.com帐号,并且将blogger和facebook链接到了一起。

2007年12月21日星期五

Testing email

This is a testing blog email

2007年8月1日星期三

si.Mail

一直想找到一个比较方便的email客户端,原因是现有的客户端总是不能十全十美。
现有的客户端大多有以下的问题:
  • email的备份与恢复不方便。我希望最好是能简单的file copy就可以。
  • email的导入与导出不方便。我希望其本身的邮箱文件格式最好就是标准格式,如unix_mbox,然后还可以方便的对.eml文件进行操作。
  • 通讯录的导入导出不方便。
  • 方便的对帐号信息进行备份与恢复。希望最好是简单的file copy就可以。
  • spam filter功能
  • 对中文的支持

在sourceforge.net上面搜了一下,找到了si.mail。现在看,可以作为一中新的选择。他有几个比较好的特点:
  • 绿色,只需要解压缩就可以执行,不需要安装
  • 邮件筛选和查找功能非常强
  • 对邮件进行选项卡方式的查看——可以在一个窗口中同时打开好几个待处理的邮件

2007年7月31日星期二

远程共享大型文件——Pando

如果有亲朋好友在国外,而又想与他们共享一下最近新近完成的视频文件或者旅游照片该怎么办呢?
以前我使用www.mofile.com, 但是现在mofile的接力站的功能关闭了。所以只好上网寻找一些新的办法。

找到了软件Pando
下载安装。选中share new按钮,这是软件回询问你将要发送的email地址/im/web。将你的好友的email地址填好。然后选择需要共享的文件/文件夹。还可以填写一些关于文件的描述。
另外,还可以将自己的email地址填好,以便好友回复你的邮件。然后就可以上传文件了。
确定之后,在软件的sent选项卡中就可以看到你要共享的文件正在上传过程中。当然,还可以观察到你上传的文件被下载了几次。
你的好友呢,将收到一封有pando服务器发送的email,email中回描述这是你发给他的邮件。邮件带有一个很小的附件,这个附件就是一个种子。收到邮件的一方使用pando将这个种子文件打开就可以下载服务器上面的文件啦。

2007年7月29日星期日

TheBat! + AnitspamSniper

Windows下面的两款极品电子邮件客户端:TheBat和Becky! Mail。可惜的是这两款软件可能是历史太过悠久了,所以对垃圾邮件过滤方面好似都不太擅长。
这两款软件都有非常强大的邮件过滤功能,但是对付垃圾邮件,传统的邮件过滤器就不太好使了。
好在最近发现了TheBat下面的Spam Filter插件:AnitspamSniper for TheBat!。试了一下,安装简单,免费,过滤效果也很好!
如果不是我现在已经完全使用GMAIL了,TheBat绝对会重新成为我的主力邮件客户端。

中国是一个没有诚信的国家

是的,中国是一个没有诚信的国家。
这种没有诚信是自上而下的。
大到政府的政策不停的变换,而且变换的结果居然可以追溯到政策变化之前的合同。
小到小学生们就开始购买别人写的作文来冒充自己的。
这样的结果就是,几乎每个人都对自己所说的话不负责任。其实这也是中国市场上面假货泛滥的根源。
最可悲的是,广大的老百姓已经对这样的情况习以为常了。

2007年7月27日星期五

Firefox的Gladder插件与无界浏览

由于中国的G*F*W封锁了几乎所有的国外BSP(Blog Service Provider),所以给我现在写BLOG造成了不少的麻烦。
而国内的BSP提供的服务有时在太差了。
另外,发现几乎所有的.tw网站都无法访问。

解决方案有两个:
1-使用firefox的插件gladder,应用这个插件,可以让你在访问已经设定的网站是自动的使用国外的代理。
优点是使用方便,不用设置firefox的代理,只需要在插件里面进行设置就可以了。插件可以自动判断是否使用代理。
缺点是速度有点慢。

2-使用无界浏览啦,目前是Ultrasurf v8.2。
优点是速断非常理想,几乎与访问国内的网站速度差不多。
缺点是需要在访问这些网站时开启本软件,如果不是IE浏览器的话,还需要将代理设置到这个软件上面。不过我在使用firefox时,使用插件QuickProxy就方便多了。

2007年7月26日星期四

邮箱监视——POP Peeper

我有二十来个常用的电子邮箱地址,为了不是他们过期失效,我使用了下面的办法。

对于国内的邮箱,大都支持pop方式进行登录收信,而且多数支持pop3代理功能。所以,我使用163的邮箱,然后在163的邮箱中收取其他的国内邮箱中的邮件。这样,只需要定期的登录一下163的邮箱就可以了。

对 于国外的邮箱,多数不支持pop方式。在这样的情况下,我使用邮箱监视软件——POP Peeper。他不但可以对pop3的邮箱进行监控,还支持多种web方式的邮箱监控,其中就包括:hotmail, yahoo mail, gmail, excite, mail.com等等。这样就好啦,我可以随时对这些邮箱进行监控了。还有一个好处,可以在不打开浏览器的情况下,将这些邮箱中的垃圾邮件进行删除。
唯一的缺点就是目前还不支持aol和netscape邮箱的监控。不过,一个免费的软件来讲,已经足够强大的了。

2007年7月18日星期三

暂时转移我的BLOG

决定暂时将BLOG转移到my.opera上面去了。

http://my.opera.com/redouble

Mail REDirect

酷爱使用GMAIL,所以对于公司的邮件,我也使用GMAIL来处理。
1-使用GMAIL的发送邮件代理功能,可以模仿公司的邮件地址给客户发送邮件。
2-GMAIL最近有开发了收取邮件的代理功能,可以将其他支持POP3的邮箱中的邮件收到GMAIL的邮箱中。
但是最近发现,GMAIL收取公司的邮箱中的邮件总是有问题,尤其是最近几天,已经彻底收不下来了。在网上查了一下,大体上有两种说法,其一是由于G * F * W,所以国外的服务器收取国内的邮箱都有问题。另一个说法是因为GMAIL自身的bug。

还好,上网搜了一下,找到了软件:Mail REDirect。
安装之后,配置了一下,完全成功。它可以将任意某个邮箱的邮件直接重定向到另外的一个邮箱。
这样的方案和原来的GMAIL方案有两个区别:
1-Mail REDirect需要一个SMTP服务器来讲收取下来的邮件发送出去。好在这个不是问题,我直接使用公司的SMTP服务器就可以了。
2-GMAIL可以在后台进行邮件收取,即你即使不在线,GMAIL也定时的将你制定的邮箱中的邮件收取过来。而Mail REDirect就需要你开着你的电脑,并且在线。不过,对于上班是才处理的工作邮件,也可以对付了。

Mail REDirect是共享软件,注册之后可以同时收取多个邮箱中的邮件。未注册版本只可以收取一个邮箱中的邮件。不过,我主要用来处理公司的邮件,所以刚刚好够用。:smile:

勒沙特列原理——我的哲学化的应用

勒沙特列原理:如果改变影响化学平衡的一个条件,平衡就向能够减弱这种改变的方向移动。

我在上高中刚刚在化学课中学到这个原理的时候就意识到,这不仅仅是一个化学的原理,而是明确的含有哲学内容。
我试着将这个原理应用到物理课中。从此,涉及到电磁学的判断题时,我再也不用伸出左手和右手了。

2007年5月21日星期一

使用StarUML代替SparxEA

在此之前,我撰写项目的需求文档一直是在使用SparxEA来画UML用例图。今天在Sourceforge上面找到了一款开源的画uml的工具StarUML。
使用StarUML我可以:
  1. 画全部的UML图
  2. 可以在编辑用例的各种属性,其中包括用例的描述。
  3. 可以利用Class图来生成源代码。
  4. 可以对系统中的项目文件生成DOC格式的文档。

能做到这些功能已经可以基本对应我撰写需求以及设计文档的需要了。

当然,相对于商业软件SparxEA来讲,StarUML的功能还算不上完整。SparxEA有以下一些非常有用的功能:

  1. 可以在系统中维护需求条目(不同于Use Case)
  2. 可以在系统中维护Test Case
  3. 可以在系统中维护项目计划
  4. 可以在系统中维护数据字典
  5. 可以使用系统来创建界面DEMO
  6. 可以集成SCC版本管理工具
  7. 可以导出HTML格式的文档

当然,使用商业软件同时也会带来破解的问题。这样的一款专业用途的软件,破解本来就不多,而且也比较麻烦。

2007年5月11日星期五

告别Ubuntu

由于工作的需要,就要暂时告别Ubuntu & Linux了。
使用Ubuntu半年多以来,真的是学到了不少的东西。下面列出目前我使用的Linux的感受:
给我带来方便的内容:
  • 不再担心病毒、攻击、木马……
  • 不用定期的进行磁盘的碎片整理
  • 不用上网到处寻找软件的破解(当然换来的是到处寻找合适的软件)
  • 美观大方的屏幕字体
  • 内置的一些软件在windows下面没有很好的替代品,例如:磁盘使用分析器……
困扰我的地方:
  • 设备的驱动太难找了,即使找到了也难以安装。例如:ati显卡,声卡,手机驱动,DV,DC,CDMA无线网卡等等等等。
  • 有时还必须使用windows,可是虚拟机下面的windows太不稳定了。经常崩溃。
其他的呢?差不多都是软件的问题而非OS的区别了。总得来说OS仅仅是工具,当你熟悉了他们之后,其实区别并不是很大。

2007年4月21日星期六

今天安装了Ubuntu 7.04

今天安装了Ubuntu 7.04,过程比我想象的要顺利很多。

2007年4月19日星期四

刚刚发现,Google又有NB的服务出来了!

刚刚才发现,Gmail又有了新的功能:
可以Get mail from another mailbox。这真的是我期盼已久的功能啦!
现在我就可以使用Gmail将随是收取公司邮箱的邮件,发邮件呢,也可以使用Gmail代理公司的邮件地址发送。
Thunderbird 2.0眼看着就要发布了,但是我现在再也不用关心这个了。
Email的备份也曾经是我的日常工作注意事项之一,现在也不用考虑了。

最近google好像是发布了不少新的功能,如google note和google checkout。google note代替了以前使用的clipmarks,google checkout呢,还没来得及试呢。

我最近将“德云班主”的blog加入了google reader。

按照计划,ubuntu 7.04是今天发布,但是我到现在也没有在ubuntu的网站上面看到。可能是时区的原因吧。

2007年4月11日星期三

一部难得的国内好片

最近每天晚上都在看中央8套播放的电视剧《爱情20年》。

《爱情20年》是继《武林外传》之后的一部难得的国内好电视剧!最起码,里面的人物都比较正常。
评审完毕!

2007年4月10日星期二

关于web2.0类型的书签管理

最近突然发现了很多的网络书签的管理工具,例如:
del.icio.us
clipmarks
blueorganizer
jeteye
google-bookmark
google-note
而且这些工具在firefox上面还都有插件。实现的功能呢:从地址收藏到文摘在到多媒体等等方法不一,但是效果都差不多。
附加的功能呢,还是web2.0那些:共享,发布到BLOG,RSS/ATOM,TAG等等。

现在我暂时使用的是:del.icio.us和clipmarks

2007年4月6日星期五

新的firefox插件:clipmarks

刚刚发现了一个新的(对于我来说)firefox插件:clipmarks。
它可以将你在浏览的时候发现的任何网页上面的信息(甚至包括视频)都标记为clip。然后呢?存到clipmarks的服务器上面,或者加入到自己的BLOG,或者干脆email给自己的朋友。当然,存到服务器上面的clips是可以共享的啦。
对于这些clips你可以自己定义title和tag。

这样的思路和del.icio.us与flickr如出一辙,不仅感慨现在的网络发展的,真是在考大家的创造力。

还是换回到thunderbird了

使用了几个月的mutt之后,今天还是换回到thunderbird了。
虽然mutt功能强大,但是想来想去,还是觉得thunderbird的操作比较顺手。可能还是因为我一经习惯了以前在windows下面的操作方式吧。
但是我感觉其实是这样的:现在thunderbird更加接近gmail。我现在对gmail的操作方式非常的满意,所以在thunderbird下面的gmailui是我必不可少的插件。只是现在还没有发现哪一个插件可以实现gmail的session管理方式。
另外,gmail的label如果可以作成tag cloud的样子就更好了。

反正我现在安装了thunderbird 2.0beta2,用的挺好。非常期待thunderbird 2.0正式版的到来。

由于mutt也使用的是unix mailbox的标准格式,所以邮件的迁移非常方便,文件的copy就可以解决问题。

2007年4月3日星期二

BLOGSPOT又一次复活?

前两天BLOGSPOT一直无法访问。后来,PKBLOGS居然也不行了。
以至于我这几天一直在考虑将这里的BLOG搬家。或者到OPERA上去,或者到WORDPRESS上去。不过由于技术原因,一直没有行动。
今天居然发现BLOGSPOT又能访问了。。。。。。
这里的功能还好,只是实在是经常出毛病。

2007年3月28日星期三

Firefox的Password Management插件:Password Hasher & Magic Password Generator

转到了ubuntu下面之后,一直就没有能够真正的放弃使用windows,因为有一些软件只能在windows下面使用:
  • 股票软件的客户端
  • 招商银行专业版
  • Bridge Base Online
  • 淘宝旺旺
下面是一些不太常用的:
  • MindManger
  • Sparx EA
  • 若干网上找到的一些电子书
当然,为了和同事们进行交互,所以还需要使用:
  • MS Office 2003
  • MS Visio 2003
另外,Windows下面还有一款非常优秀的软件,在linux下面没有替代品:
  • AI RoboForm
这一款软件更能丰富,而且操作非常简便。基本可以对个人的所有有关帐号、密码,以及其他的一些私有的数据进行分类的管理。遗憾的是,这款软件虽然可以整合进Firefox,但是却没有基于linux的版本。而且是收费的软件。

Firefox下面也有密码管理的功能,但是内置的功能非常的简单,管理功能比较差。于是我就在网上搜索了以下,找到以下的方案来基本可以代替windows下面的做法了。
  1. 仍然使用firefox内置的密码管理功能。
  2. 安装Password Exporter插件,可以对firefox下面保存的帐号以及密码进行导入和导出。这样可以对这些信息进行比较简单的备份。
  3. 安装Password Hasher插件。
    1. 这个插件的理念是:你需要定义一个通用的master key,它就可以根据你的master key和你对某个网站定义的label来生成一个针对这个网站的password。如此,你只需要自己记忆一个master key就可以使用不同的密码来登录不同的网站了。
    2. 这个插件会自动的在网页上面的每一个password文本框后面加入一个#按钮,使用这个按钮就可以生成密码了。
    3. 当你提交新注册帐号的页面是,该插件会自动的在firefox的密码管理器中加入一条记录。这是对firefox密码管理器最有用的增强了。
    4. 当你使用的是公用的计算机,上面没有安装Password Hasher插件甚至是firefox时,还可以使用该插件所提供的一个网页,来临时的生成基于某一网站的密码。作者还是想的够周到的。
  4. 类似Password Hasher的插件还有Magic Password Generator。它的功能和Password Hasher基本完全相同,只是操作方式略有不同。它不是在网页上加入了新的按钮,而是在firefox工具条中加入了新的按钮。而且同样也提供了供临时使用是使用的生成密码的网页。
基于上面所说的组合,基本可以满足我的需求了。
我原来还使用Google Browser Sync插件来将密码同步到Google服务器上面。其实这是一个很好的方案。可惜的是,最近我发现,这个插件的功能还不算完善,偶尔会有数据丢失的情况发生,所以放弃了。

最近,将google bookmark上面的数据已经完全的转移到了del.icio.us上面了。

2007年3月26日星期一

关于书签与图片的服务

本来一直在del.icio.us于google bookmark中进行比较,好几个月了,在同时使用这两个服务。最近终于准备下决心放弃其中的一个。
由于据说(仅仅是据说)google bookmark不支持书签共享,并且不支持在blog中引用,所以自然放弃它啦。
对于del.icio.us,firefox上面的插件有:del.icio.us Bookmarks, del.icio.us, del.icio.us complete, Foxylicious等等。其中第一个插件是yahoo开发的官方插件,也是功能最强大的一个。
对于google bookmark,firefox上面的插件有:Google Toolbar for Firefox, Firefox Google Bookmarks, Google Bookmarks Button等等。功能都差不多。
所以,我现在使用浏览器的方法是:Firefox, del.icio.us Bookmarks (Store Bookmark), Google Browser Sync, Flashgot, Adblock Plus...

另外一直在flickr和google pisaca服务中进行比较。当然他们都可以存储图片,上传的方法也不太相同,但是还都算方便。其中google我使用pisaca,flickr我使用firefox的插件fireflix。不同点是:flickr对于普通用户有每月上传大小的限制。google最多只能上传200M。
最近听说flickr对于非付费用户又有了其他的限制。看来只能放弃flickr了。google的空间又太小,看来需要考虑的是使用自己的虚拟主机喽。

blogspot最近几天怒慢!基本上不去了。不知道是何原因?
正在考虑把blog转移到自己的虚拟主机上面。现在my-place.us和110mb是可选择的对象。正在评估中......

2007年3月2日星期五

VirtualBox的新版本好使!

刚刚把VirtualBox更新到1.3.6了,于是忍不住又安装了一个WindowsXP。有新的发现!
1-在devices菜单中安装guest additions,于是就可以达到了vmware的vmware tools的效果,包括鼠标集成。同时会使系统变得更加快速+流畅+稳定!厉害!
2-在host机中建立一个空文件,virtualbox可以将他mount成软盘,在guest中简单的格式化就可以使用啦!有什么用呢:新版本的招商银行专业版在备份数字签名的时候,不允许备份到本地硬盘上!现在我可以将它备份到软盘镜像文件上啦!
3-virtualbox的guest系统偶有崩溃的现象,但是还好,不会影响host。

春节期间的一副牌

今年春节的初六初七,朋友们到我家聚会打牌,到了晚上,有一副牌如下:
[North]
S-Jxxx
H-T98xx
D-x
C-Qxx

[South]
S-AKQxx
H-A
D-AQTxx
C-KJ

叫牌过程如下:



















ESWN
1CDB/1H
/2C/2H
/2S/3S
/4D/4S
ALL PASS


很明显,6S是很好的定约。
实际上我拿了南家的牌。我和几个朋友们都认为北家不能叫4S示弱,而应该在4D之后义务性的叫出5D,这样南家就可以轻松得叫出6S了。
而我的搭档和她的固定搭档则认为,南家在听到了北家的3S加叫后,有能力在4S之后再扣叫出5C,此时北家才有能力叫出5D。
这样的说法我无法确定就是不对的,我只能说我比较倾向于前一种方式。

2007年2月28日星期三

使用getmail4来代替了fetchmail

据说getmail4是专门为了替代fetchmail而设计的,又据说fetchmail有很多得问题。于是尝试着使用getmail4来代替fetchmail。
1- sudo apt-get install getmail4
2- mkdir .getmail
3- vim .getmail/getmailrc
[options]
verbose = 0
read_all = false
delete = true
message_log = ~/Logs/getmail.log

[retriever]
type = SimplePOP3Retriever
server = mail.xxxxx.com.cn
username = xxxxx
password = xxxxx

[destination]
type = MDA_external
path = /usr/bin/procmail
unixfrom = true

4- 更改.muttrc
macro index G "!getmail\n" "Invoke getmail"
macro pager G "!getmail\n" "Invoke getmail"

5- 让getmail每隔10分钟自动运行
crontab -e
然后加入下面一行:
0,10,20,30,40,50 * * * * getmail

2007年2月7日星期三

搞定了系统使用圆体字

几个小小的TIP:
1-在firefox上面安装了flashgot插件,另外又安装了gwget,这样就可以让firefox使用gwget作为默认的下载工具了。gwget是基于wget的,肯定巨稳定。
2-lftp有书签的功能,可以记录一些ftp server的地址。
3-安装了mc(midnight commander),发现也很好用嘛。
4-发现使用终端来管理mysql貌似比phpmyadmin还要方便嘛。
5-gaim居然有text base的模式,厉害!而且对中文的支持比tmsnc/centericq强的多了。只是不太稳定。
6-发现对于gnome的终端可以进行很多配置,包括背景的半透明!
7-对应于windows上面的远程桌面,linux下面有rdesktop,而且非常方便,功能也不错,强!
8-另一个更弱的问题:对于一个目录来讲,必须设置为7(具有x权限)才可以cd进去,否则permisstion denied。
9-将.vmware目录己下面的所有文件,将xxx/VirtualMachines目录及下面的所有文件,使用chown和chgrp命令将所有者和所有者组由root改为当前的用户,这样就不用再使用sudo来运行vmplayer了。

另外,按照ubuntu wiki cn上面的说法,终于成功安装了圆体中文字体!本来安装完了之后仍然很难看,几乎差点就卸载了。但是有发现了一个小的技巧,wiki里面没有写:需要调整系统字体的分辨率。因为圆体字的小号字体也不怎么好看,所以我将原来的96dpi增加到了120dpi,现在屏幕好看多了!

2007年2月6日星期二

几个小的技巧:lftp & pdf & wget

关于lftp不能显示中文得问题:
vim ~/.lftp/rc
然后加入两行:
set ftp:charset UTF-8 #服务器上的字符集,还可以使用GBK ...
set file:charset UTF-8 #本机的字符集。

关于中文的PDF文件乱码的问题:
sudo apt-get install xpdf-chinese-simplified

使用wget进行断点续传
wget -bc http://......
其中-b表示后台下载,-c表示在以前的基础上断点续传。

2007年1月30日星期二

VirtualBox更不好用

昨天刚刚从linuxtoy上面看到了一篇文章,说道另一款虚拟机产品virtualbox已经开源了。我立刻想到了我现在使用的vmware。
由于我不得不使用招商银行专业版、方正股票、BBO、以及淘宝旺旺,另外我不得不使用MS Office格式与同事们交换文档,所以,我在我现在使用的Ubuntu上面安装了vmware+windowsXP。
最开始是vmware server,因为免费。但是,在虚拟中之中,访问某些网站时(不论使用ie/firefox)会造成整台机器(包括ubuntu宿主机)的瘫痪。后来换用了vmplayer,情况一样,没有改观。
于是现在考虑virtualbox是不是能够好一些?用新利得查了一下,居然在ubuntu的安装源里面就有,好!安装。
安装windows 和office的过程都还算顺利。但是发现,在copy文件的过程中会经常发现虚拟机进程突然消失的情况。于是值得放弃了,又回到vmplayer上面来了。
因此,也没有机会比较vmware和virtualbox的性能了。

2007年1月27日星期六

又对mutt的设置做了一些小改动

  1. 刚刚发现esmtp一直没有记log。原因是esmtprc中~符号不能表示home。所以在.muttrc中改为:
    set sendmail="/usr/bin/esmtp -v -X $HOME/Logs/.esmtplog"
  2. 将set mbox_type=maildir改为 set mbox_type=mbox
  3. 为了能够正确显示中文的日期,set locale="zh_CN"是错误的,而应该是:
    set locale="zh_CN.UTF-8"
  4. 重新定义index_format:
    set index_format="%4C %Z %{%b %d} %-15.15L (%4c)%X %s"
  5. 重新定义folder_format:
    set folder_format="%2C %t %N %F %2l %-8.8u %-8.8g %10s %d %f"
  6. 重新定义attach_format:
    set attach_format="%u%D%I %t%2n %T%.40d%> [%.7m/%.10M, %.6e%?C?, %C?, %s] "

2007年1月25日星期四

搞定CVS SERVER!

今天终于搞定了困扰了我好几天的CVS server的安装。本来网络上面有很多关于CVS的文章,但是看起来都是互相在引用,所以内容基本上都是完全相同的。为了日后可以灵活的使用,我根据自己的情况做了一些配置上的改动,没想到过了这么多天才能够成功。下面记录一下整个的安装过程。
环境:ubuntu 6.10

1 安装软件
$sudo apt-get install cvs

2 建立库目录
网上的说法都是建立新的用户组和新的用户,这样CVS的库目录就与新的用户的home目录相同。但是如果强制这么做的话未免有些教条了。我为了实验,变换了一下
$mkdir my.working/cvsroot
同时为了是其它的用户可以访问CVS
$chmod 771 my.working/cvsroot

3 建立仓库
$cvs -d ~/my.working/cvsroot init

4 更改xinetd配置
$sudo vim /etc/xinetd.d/cvspserver
内容如下:
# default: on
# description: The cvs server sessions;
service cvspserver
{
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/home/rick/my.working/cvsroot pserver
log_on_failure += USERID
}
然后:
$sudo chmod 644 cvspserver

5 加入services端口
$sudo vim /etc/services
加入行:
cvspserver 2401/tcp

6 重启xinetd
$sudo /etc/init.d/xinetd restart

==========server安装完成==========

7 配置客户端的环境变量
$vim ~/.bashrc
加入行:
export CVSROOT=:pserver:username@server_name:/home/rick/my.working/cvsroot

8 好了,后面就可以正常的进行cvs的使用了:
$cvs login
$cvs import -m "some comment" cvstestproject v_0_0_1 start
$cvs co cvstestproject
$cvs update
$cvs status
$cvs ci -m "some comment" testingfile
$cvs add fileorfolder
$cvs remove fileorfolder
......

关于mutt的邮件附件

最近使用了一段时间的mutt,目前发现的最大的问题是:发送邮件的附件的文件名问题。
如果是直接发送的邮件:
  • 英文文件名没有任何问题;
  • 中文文件名会被自动得改为ATT000XX.xxx。目前还没有找到办法解决。
如果是需要转发代附件的邮件:
  • 使用b来将邮件直接转发出去,但是无法进行编辑。
  • 使用f来转发邮件,中间可以编辑邮件内容。
      • 如果同时在.muttrc中设置了set mine_forward_decode=yes,则邮件内容以及邮件附件会被整体打包转发。
      • 如果没有设置的话,则邮件的附件无法转发。
  • 使用v来查看附件,然后使用t选中要转发的附件,然后使用f将附件转发走。
  • 使用Esc e将当前邮件作为模板进行编辑,然后使用Esc f更改from段为自己,然后发送。但是如果是HTML的邮件,编辑起来会十分麻烦。
-如果需要转发的邮件的附件使用了中文的文件名,则转发后的邮件中附件的文件名会变成______.xxx,此时需要使用d来自行更改文件名。

真够麻烦的。看来没有十全十美的软件啊!

2007年1月24日星期三

正在选择一些text based software

因为最近迷上了字符界面的软件,所以现在正在在一些软件中选择:
  1. EmailClient,不用选了,就是mutt。试用了一段时间了,越来越顺手了。现在得问题只有:发送邮件的附件的文件名的问题。所以目前我正在考虑什么时间将email软件正式从thunderbird转移到mutt上面来。(爽的是,邮件的迁移也异常的方便,这的确与unix的理念有关。)
    听说pine也可以用,不过好像还是mutt更主流,有机会试一试吧。
  2. Editor,目前是vim,几乎我能想到的功能都有了。对于emacs还没有入门。不过目前来讲vim的功能就足够用了。所以还是先用好vim,以后有时间再看emacs吧。
  3. Browser,目前是w3m,的确,我不可能仅仅使用w3m,这个领域,我不可能离开firefox/IE的。不过w3m稳定且快速,很适合我使用google/baidu搜索资料时使用。lynx也可以,不过对中文支持不好,而且w3m居然可以在终端中显示图片,所以更能贴近原样的显示网页的内容,所以我选择了w3m。
  4. GTD tool,目前是tdl。
    pyGTD从来就没有成功运行起来,只能暂时放弃。
    pal功能不错,中文支持也挺好。但是在显示日历的时候,由于中文月份名称的问题,日历总是显示的无法对齐格式。
    wyrd中文显示乱吗,而且操作非常古怪。另外,好像只有calendar,没有to-do-list。
    calcurse界面非常好,有calendar & to-do-list,操作也很简单。很可惜,无法支持中文。
    所以,tdl虽然简单了些,但是现在基本能够满足我的需求。
  5. IM software,tmsnc & centericq,其中centericq可以支持多种即时通讯的协议。可惜的是,这两款软件在使用时,对中文的显示都存在部分乱码的问题。所以目前还没有好的方法。
另外,目前正在考虑是不是自己编写一款适合自己使用的GTD软件。目前有如下需求:
  1. 对于每个item,有类别属性,如business, personal, computer...
  2. 对于每个item,有状态属性,如next action, action, waiting on, tracking, finish, reference...
  3. 对于每个item,可以有begin time & end time,对于有这些属性的item,可以在一个日历中显示他们。
  4. item可以有project id属性,来标识该item属于哪一个项目。
目前暂时先有这些吧。

2007年1月20日星期六

VIM剪切板的小技巧

转自 Cash的烘培鸡 (修正了一些错字)

  VIM是Linux下功能非常强大的一款字符处理软件,功能如何,在这里就不再做过多的评述了。很多朋友在使用VIM的时候,可能都会遇到一个非常简单,但是又很奇怪的问题,就是关于VIM的剪切板。

  我们先做这样一个小小的尝试,请打开浏览器,从网页上随便复制一段文字,然后打开VIM,用VIM,用“p”粘贴一下,你会发现,什么都没有站 贴过来,呵呵……原因是这样的,不同于Windows,VIM具有多个剪贴板,并且和系统剪贴板是完全独立的,所以当你复制浏览器里的文字的时候,这段文 字保存在了系统剪贴板,当你是用“p”来粘贴的时候,实际上,他读取的是VIM的剪切板。

  那怎么方便的将系统剪贴板的内容复制过来呢?简单!用另外一个快捷方式“Shift+Insert”就可以了,如果你在使用Gvim的话,直接用鼠标中键也可起到相同的作用。是不是很简单?
  好了!现在您已经学习到了VIM剪贴板技巧的基础!OK!我们开始进阶!

  我们前面说过,VIM具有多个剪切板,目的是为了用户在做较复杂的字符处理的时候,可以更方便的复制粘贴。请现在使用一下“:reg”命令(先 按ESC键,退出编辑模式,然后按:进入命令模式,然后输入reg回车),看到了?屏幕上的输出结果!是不是特别眼熟,对了!就是您之前复制过的所有内 容!也许这时候您还发现,VIM的剪切板原来有这么多个,按照数字还有符号一个一个的区分开的,这里举一个编号的例子——“”5,看到了吗?是以”开头 的。还有!有没有看到编号为”+的剪切板?里面的内容是不是刚才你在浏览器里复制的那段文字啊?呵呵……没错了!系统剪切板的编号就是”+。

  好了,这时候您已经知道了如何查看之前的所有剪贴板内容,我们现在就试着把某一个特定剪切板的内容复制进我们正在编辑的文件中。我们知道,vi 的粘贴指令是“p”,但是如果要粘贴一个特定的剪贴板,只是用p就不行了,那怎么办?简单!把剪贴板的编号带上不就可以了?现在先按ESC,退出编辑模 式,然后依次按”+p这三个字符(怎么按?不会吧!”和+怎么按?用Shift啊!),好了!你看看,之前在浏览器中复制的这段文本,是不是被粘贴进文档 中了?

  如何将系统剪切板里的内容复制进VIM当中,您已经清楚了。那如何将ViM中复制的字符粘贴到其他地方呢?很简单,我们只需要把要复制的文字, 复制进”+剪切板不就可以了?(”+剪切板是系统剪切板,忘记了?)在VIM中,复制的指令是y(在非编辑模式下按y就可以了),那要将文本复制进指定的 剪切板,只需要加上剪切板的编号就可以了。举个例子,我们希望把VIM中的一段文本复制下来,然后粘贴到浏览器的地址栏中:第一步,现把需要复制的文字选 中(非编辑模式下),然后在键盘上依次按”+y这三个字符,OK!已经复制下来了,现在用:reg命令看看,是不是在”+剪切板中了?

  呵呵……好了,目前为止,您已经大致掌握了VIM剪切板的基本用法,当然,VIM剪切板的功能还很强大,本文也不能尽数道来,就请您继续发掘吧……

使用SpamAssassin来过滤垃圾邮件

安装了SpamAssassin,因为听说是目前最NB的SPAM过滤软件了。于是又开始到处查阅如何进行配置。
发现,SpamAssassin基本不用改动。只需要改动.procmail。改动如下:

MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/
LOGFILE=$HOME/Logs/procmail.log
VERBOSE=off
NL=""

:0fw
# The following line tells Procmail to send messages to SpamAssassin only if they are less than 256000 bytes. Most spam falls well below this size and a larger size could seriously affect performance.
* <256000
| /usr/bin/spamassassin -P

:0e
{
EXITCODE=$?
}

:0
* ^X-Spam-Status: Yes
$MAILDIR/spam/

:0
* .*
$MAILDIR/inbox/

保存!运行mutt,发现一切OK!

2007年1月19日星期五

一些新的改动!

又在mutt上面有一些新的改动

1-原来mutt自己就有自动加入邮件签名的功能,可以不用借助于vim。在.muttrc中加入:
set signature="~/Mail/sign.mail"
set sig_on_top=yes
即可,然后在.vimrc中删除autocmd那一行。

2-MIME的支持。加入一个链接:
ln -s /etc/mailcap ~/.mailcap.my
然后在.muttrc中加入:
set mailcap_path="~/.mailcap.my"
同时注释掉
auto_view...一行。
这样在mutt中就可以直接使用enter来查看附件了。

3-安装了lbdb,在.muttrc中加入:
set query_command="lbdbq '%s'"
然后编辑.lbdbrc
METHODS=m_muttalias
MUTT_DIRECTORY=.mutt
MUTTALIAS_FILES=.mutt.alias
这样在mutt中就可以使用Q来进行地址查询了。

终于把abook调通了,真是费劲,网上的介绍错误实在是很多,必须同时对照help来看。

1-下面是~/.abook/abookrc
set autosave=true
set show_all_emails=true
set emailpos=25
set extra_column=mobile
set extra_alternative=workphone
set extrapos=55
set mutt_command=mutt
set mutt_return_all_emails=true
set print_command=lpr
set www_command=w3m
set address_style=us
set use_ascii_only=false
set add_email_prevent_duplicates=true
set sort_field=nick

2-然后建立一个可执行的文件 ~/.abook/abook-autoexport
#!/bin/sh
abook ${@}
abook --convert \
--informat abook --infile $HOME/.abook/addressbook \
--outformat mutt --outfile $HOME/.mutt.alias.new
mv $HOME/.mutt.alias $HOME/.mutt.alias.bak
mv $HOME/.mutt.alias.new $HOME/.mutt.alias

3-最后是修改.muttrc文件
# define address book
macro index,pager A \
"!~/.abook/abook-autoexport\n:source ~/.mutt.alias\n" \
"Start abook"
macro index,pager a \
"|~/.abook/abook-autoexport --add-email\n:source ~/.mutt.alias\n" \
"Create new alias from the actual message"

当然了,以前定义的A键为将mail存档,现在必须改为B键了。

2007年1月18日星期四

最近迷上了字符界面!

最近在努力钻研Ubuntu的过程中,渐渐迷上了古朴的字符型界面。同时又有了不少新的软件使用心得。如下:
  • 学习了ftp, ncftp, lftp等等命令。发现也很容易嘛。
  • 练习使用了find命令来查找文件,好使。
  • 练习使用了tar & gzip命令来对文件进行归档,发现比印象中要简单。
  • 在系统中安装了tree命令。
  • 在系统中安装了mc(Midnight Commander)和sc(Text Based Excel)命令。
  • 重新编辑了一下.procmailrc文件,使之可以进行简单的spam过滤。如下:
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/
LOGFILE=$HOME/Logs/procmail.log
VERBOSE=off
# FORMAIL=/usr/bin/formail
NL=""

:0
* ^Subject:.*(sexcreditcashmoneydebtsaleloanjobdiscount)*
$MAILDIR/spam/

:0
* .*
$MAILDIR/inbox/

  • 对mutt加入了一些配置项,是指可以实现如下的功能:使用d键可以将邮件转移到trash目录,使用A键可以将邮件转移到archive目录。在trash目录中使用d键可以将邮件删除。配置如下:
folder-hook . ''macro index d "s=trash\r\r"
folder-hook ~/Mail/trash 'bind index d delete-message'
folder-hook . 'macro index A "s=archive\r\r"'

#另外,对MAIL的显示
auto_view text/html application/msword
alternates "name@address.com"
set to_chars=" +TCFL"


  • 安装了abook软件,这是基于字符界面的地址簿管理程序,还可以和mutt整合。正在使用,还没有完全的转移过来。
  • 重新发现了vim的很多功能。对.vimrc文件进行了配置,使之可以自动的进行语法加亮、自动缩进等等,更爽的是,可以进行自动得判断,如果是mutt打开的vim进行邮件编辑,则自动的加入邮件签名!配置文件如下:
syn on
set hlsearch
set tabstop=4
set cindent shiftwidth=4
set autoindent shiftwidth=4
set fencs=utf-8,gb2312,db18030,gbk
autocmd BufNewFile,BufRead mutt-* 0r ~/Mail/sign.mail

  • 使用w3m来进行网页浏览,还居然可以显示图片,而且没有中文问题,强!在页面中,使用enter可以对超链进行访问,在文本框中使用enter可以进行输入。使用shift-b可以进行网页的回退。
  • 使用w3m来对mutt中的html格式的email进行浏览,并可以直接浏览.doc格式的附件。如下: .mailcap文件内容
application/msword; wvHtml --charset=gb2312 %s - w3m -dump %s; nametemplate=%s.html; copiousoutput
text/html; w3m -dump %s; nametemplate=%s.html; copiousoutput

2007年1月4日星期四

胸大无脑的黄金甲

前天在朋友家看到了《黄金甲》的DVD,观后有如下的感想:
  1. 的确如一些评论所言,隆胸的主题在影片中过为突出。有很多镜头中,女演员闪闪发亮的胸部明显抢了她的美丽容颜的镜头。令人产生局部大于整体幻觉。此时此刻,我作为观众,脑子里会立刻出现一个词汇:胸大无脑。
  2. 影片中个别局部细节的视觉效果的美轮美奂,无法掩饰整部影片的垃圾内涵。拿我高中语文老师的话讲,就是:空洞无物,不知所云。
  3. 看完影片之后,脑子里出现的第二个词汇就是:智障!影片情节有很多逻辑上让人不可理解的问题,于是剧中人物给人的感觉是过于幼稚或者智商过低。从而让人联系到:第一,导演以及编剧的智商是不是也有问题?第二,剧中担任主角的各个大腕演员们是不是也傻啊?接这样的戏不是毁自己吗?
  4. 这样的垃圾影片在北京的电影院里面居然50-75一张票!制片方一方面在骗钱,老百姓也真容易上当啊。自从在《英雄》上面上了一次当之后,我就再也不为这样的所谓大制作“捐款”了。

2006年12月29日星期五

基于Ruby的GTD工具:Tracks

最近在学习一些Ruby编程。于是将自己的GTD由GTDGmail迁移到了本地电脑建立的Tracks系统中。
Tracks系统就是基于Ruby on Rails开发的。
现在觉得使用这个系统起码速度比使用Gmail要快一些,而且对于内容得显示也比GTDGmail要清晰。然后呢,又不像gtd-php那么复杂,挺好!唯一的问题就是:似乎无法定义stuff的status,而只有context和project,又没有reference。美中不足啊,但是应该足够用的了。

2006年12月27日星期三

最近的乱七八糟事儿

最近够乱的!
  • e2e的订单终于出来的,但是少了几张?又对了一下,据说是今天能出,在看看吧。
  • mc30的联系人终于联系上了,自从订单下了之后已经两个礼拜了,现在居然还说要2周才能将它release?!老板逼着我年底之前开发票呢,气愤ing。
  • 之前送往e2e部门的一个员工消失几天之后终于找到了,回答居然是不想做这份工作了?!你丫倒是早说啊,谁也不能把你怎么样了,玩什么消失啊?这样搞的话,这个position基本上我们就会丢了!
  • 最近发现,这一个月以来,为了一个岗位,我们送了十几个人居然都不成功的原因居然在我们的自己员工的身上!因为主要面试的人不是客户而是我们自己的员工!恶心!
  • 今天发现很多网站都访问不了了,上网一看居然是台湾又地震了!奇怪的是GOOGLE居然一点问题也没有,NB啊!

2006年12月20日星期三

新的thunderbird插件 & vi

前天晚上和老婆在五道口吃晚饭,下城铁的时候,老婆的车票找不到了。于是站在出口出一通猛找,还是没有找到。无奈,准备去补票,发现补票的窗口已经关闭了。刚刚下定决心,准备带着我老婆混出车站,这时,检票员出现了!问我们出了什么事,告知,票找不到了,准备去补票。回答:自觉性真好!这一次就别补了。于是乎大摇大摆的出了车站。
对于此事,有以下感想:
1、由混出车站被捉住到大摇大摆出站之间只差了1秒钟,够险的。
2、有一种被管理的感觉,不爽。
3、看来平时逃票的人是在太多了,以至于检票员看到我们这样的,好像很稀罕。

昨天抽时间仔细的看了一下vi的使用,发现并没有我想象的那么困难嘛,很快就可是熟练使用了。

今天早上找到了一个新的thunderbird插件:copy sent to current,可以自动的将已经发出的邮件保存到指定的文件夹中。这样,我就可以将已经发出的邮件保存到archive文件夹中了,在此文件夹中就可以对我所有的邮件进行线索的显示方式,这样就很象GMAIL啦。

另外,终于搞明白了一些Flickr上传软件的使用方法。还挺另类的。

2006年12月13日星期三

phpmyadmin, amule & google,今天的小长进

晚上下班的时候,搞了一下amule的设置。原来服务器文件不用到处找,就用安装的时候缺省的就可以了。 然后点击他左边的蓝色三角就可以下载到服务器列表了。当我把这个搞清楚的时候,我忽然觉得自己很傻。

昨晚在系统中安装了mysql/apache/php & phpmyadmin,出乎预料的顺利,安装之后,就没有怎么手工的设置,直接在浏览器中就可以访问phpmyadmin了。回想起来前几天在windows系统下面搞这些,简直把人折腾死。看来,本就是在linux平台下面开发的软件,移植到windows平台下面就是会有差距,反过来其实也是一样。

今天下班的时候开始,到现在,google一直访问不了,不知道为什么。
最近又看到google toolbar for firefox新版的beta已经出来了,终于集成了书签功能。但是我现在使用的google bookmarks buttun插件已经挺顺手的了。这几天再研究一下,看看有什么其他的新特点,然后再下载安装喽。

2006年12月12日星期二

准备建立部门管理数据库

其实早就应该作这一件事情了,只是最近在研究Ubuntu给耽误了。现在我的部门人员管理数据还都在一张excel表各种维护,随着管理内容的逐渐细化以及管理数据的增多,excel文件显然已经不够用得了,应该建立相应的数据库。只是现在还没有决定是使用mysql数据库还是使用OOo的数据库,如果还是在windows环境下面的话,很简单,access!在加上我多年access下面的编程经验,肯定非常快且功能强大。现在呢,为了比较主流,暂时决定使用mysql数据库。

另外,今天的ubuntu知识:
1、vmplayer的安装很不顺利,所以现在看还是vmware-server最好用,功能很全了,而且免费!
2、现在ubuntu下面的ati mobility radeon x1400显卡的3D加速功能仍然没有被启用,好几天了,几乎看遍了网上的说明,也没有搞定。郁闷!
3、已经正式的开始使用firefox的插件GTDGmail了。看了3天的说明,终于搞懂了他的用法。我是不是随着年龄的增长,接受新事物的能力也逐渐下降了?这么个简单的东东居然用了3天才搞懂?

2006年12月11日星期一

今天的Ubuntu之旅

今天继续昨天的Linux之路。
一早到了公司,上不了网,因为路由器中的mac地址过滤器中还没有把我的新电脑的mac地址加入进去。但是......我怎么在linux下面查询mac地址啊?好在用同事的机器上网查了一下:ifconfig,居然和dos下面的命令差不多。上网成功,然后继续。

1、按照说明安装了beryl,然后,为了保险起见,没有在启动会话中加入beryl-manager,手工运行,发现所有的窗口的标题栏全都不见了。只好重新启动系统。然后在网上找到一篇文章,说是要改/etc/gdm/ 下面的两个文件,按照说明改了gdm.conf和gdm.conf-custom文件,然后重新启动系统。完蛋!登录界面还没有出来就卡住不动了。还好,想了想办法,启动时进入了系统恢复模式,在命令行方式下面将两个配置文件改了回去,系统复活。一场虚惊!在命令行方式下面还顺便练习了一下使用vi。回到图形界面之后,一气之下将beryl全部删除。

2、发现了一个问题:OpenOffice.org在linux系统下面居然没有前几天说的鼠标滚轮的问题。

3、试了几次之后,找到了需要的程序,安装了鼠标触摸板的设置程序:在新立得软件包管理器中搜索touchpad,在返回的结果中找到gsynaptics,安装即可。

4、在启动vmware-server时出错!系统提示vmware虽然安装了,但是没有正确的配置。而运行配置脚本时却又出错。上网查找相关的文档,说需要删除/etc/vmware目录下面的not_configured文件。结果发现并不有效。再查,发现又有文章说:需要将以前安装过的vmplayer进行彻底的删除,然后在删除not_configured文件,重启系统。这招儿好用!

5、在vmware/windows下面解压了crossover的安装程序,需要想办法copy回linux系统下面。结果发现linux系统如果想访问windows的共享的话,必须使用ip地址访问windows主机,现在双向的共享都可以了。

6、发现了几款ubuntu自带的软件!
- skype
- nvu: html edit software
- gnomebaker: cd/dvd burn
另外还安装了freemind

2006年12月10日星期日

巨大的冒险!

连着两天,正在进行巨大的冒险!
昨天,公司刚刚发了新的电脑T60,回家一看:NB!繁体中文操作系统!进入一键恢复:同样,繁体中文!
怎么办?同事告诉了我一个巨复杂的方法,可以根据网上下载的T60的7张CD的恢复判进行安装。于是我的脑子里浮现了一个冒险的方案:host(Ubuntu)+guest(WindowsXP),以前在T43上面成功安装Ubuntu的经验在勾引我继续进行。
动手安装。。。
1、硬盘分了三个区:/(20G), /home(34G), /swap(1G)
2、安装的过程还算顺利,但是不久就遇到了麻烦。
3、T60的显卡没有正确的识别!查了一下说明书:ati mobile radeon x1300/1400。还好!先到ati的主站上面下载了一个驱动程序,然后按照说明安装!怎么不成功?这样的提示:
./ati-installer.sh: 176: Syntax error: Bad substitution
Removing temporary directory: fglrx-install
再上google查,这个网站有说明!好使,安装成功!重新启动系统,没有什么变化?!
再上google查,这里是Ubuntu的Wiki,上面居然介绍了两种安装方法,一种就是ati官方的驱动程序,另一种是使用apt-get的源。照着做了一遍,重启系统,成功了!分辨率达到了1400,显卡的问题几乎耗去了我一个晚上!
4、后面的几步还算顺利:更新源、安装中文输入法,更新系统,安装一些软件。
5、下面开始安装vmware了,因为我有时仍然必须使用windows。
o 到www.vmware.com下载了一个vmware server,100M
o 按照说明安装,不成功!提示:没有操作./vmware-vix/bin的权限?查了一下,没有这个文件夹?于是又google,仅仅有一篇文章,而且好用!在./vmware-vix下面建立了一个指向./bin的软链接!成功了!
o 然后在菜单里运行vmware server,失败!还好,我灵机一动,修改该菜单项目为在终端中执行,命令中加入sudo,成功!
o 安装windows
6、下面的问题是,如何在host与guest之间进行文件共享?在ubuntu中安装了samba,然后将一个文件夹共享。进入windows,可以访问主机,但是需要用户名和密码?怎么输入都不对?接着上网查询:原来samba有自己的用户管理,和linux的是分开的。于是新建用户名和密码,好了,现在真的可以访问了!
7、在windows下面安装了office 2003, winrar, dameon tools等等软件。
8、工作告一段落。

目前的问题是:运行在vmware server中的windows xp好像不太稳定,已经出现了好几次host & guest全都死机的情况,不知道是为什么?正在摸索规律,好像和guest中的ie有关系。

10个serial no.

今天在www.vmware.com上面申请了10个vmware server for linux的serial no:
9AN6X-YPKDD-22771-4K310
9AN4R-YM64T-222G0-4U3HN
98MFR-YP6DW-28PE0-4HNJ5
9A1FD-YM36R-28Q5H-4RJJE
9216W-YPL4R-2077N-4H29W
905FX-YM369-283E4-4KHKW
90J6W-YY7DD-20P50-4HPA1
985FE-YY24W-20QG1-4K22X
9AM68-YYLFE-28PE5-4UNU1
98N4W-YWP6W-2A3G4-4H2U8

2006年12月8日星期五

两个OpenOffice.org的功能缺陷

用了几天的OpenOffice.org,总体上觉得还可以,最大的优点是可以非常快速的生成PDF文件。
但是同时也发现了两个非常愚蠢的功能缺陷,目前是在Windows XP平台上发现的,还没有在Linux平台上测试过。
1、居然不支持鼠标滚轮?
2、在OOo calc中,不支持合并单元格的插入行。例如:A列的1、2行已经合并了单元格,这时如果想在第一行与第二行中间插入一整行,则是不被允许的。

2006年12月4日星期一

关于Thunderbird的插件GmailUI的一些信息

在thunderbird上面使用插件GMailUI已经有几天了,这个插件的思路已经非常好了,但是觉得还有改进的余地,例如:可以将email进行标签,应该按照会话组织邮件等等。于是昨天就随手给插件的作者写了一封email。
没想到今天就收到了回信。信中作者的意思是说:在thunderbird 2.0版本中加入了tag功能,应该就是类似于gmail的label。另外作者也相信,thunderbird 2.0版本肯定可以让用户在收件箱中也能查到以发送的邮件,这样一来,thunderbird就越来越像gmail了。

现在真是期待thunderbird 2.0 final release的来临啊,上网查了一下,计划日期是2007年的Q1。

另外,今天终于把Flickr的用法搞得差不多了,并在自己的BLOG中加入了一组Flickr的相册,但是过了一会儿还是觉得不如picasa的相册好看些,只得又删了。呵呵,穷折腾。

2006年12月3日星期日

记不得今天都干了些啥

一个周末又快过去了,今天一天都干了些啥已经快记不请了,反正是一天都没有出屋。
回头想想:
- 看到blogger升级改版,于是把这里的内容又完全的重新定制了一下。
- 把以前在msn spaces上面的blog内容完全搬迁了过来。
- 传了大部分以前的照片到picasa上面,因为blogger改版的原因,以后就可以在这里的blog上面显示我的相册了。
- 给ubuntu下面的bmp加了一些skin

就像昨天一样。
昨天的情况是:刚刚买了新的adsl modem之后没有几天,发现自己实际上应该使用歌华有线的宽带。
今天的情况是:昨天刚刚下了决心需要在国外租用一台主机来建设属于自己的BLOG site,今天就发现blogger改版,改成了这样之后,好像没有什么必要再自己组一个主机来搞什么blog了。

我在linux下面得新的长进:mplayer

也是昨天,又在linux下面折腾了半天,有了一些新的收获:

mplayer:已经在windows下面证明了非常nb的软件,现在需要在linux下面使用起来。
下载了解码器的文件包,放在哪里呢?安装说明上说是放在/usr/local/lib/codecs下面,网上得文章说是放在/usr/lib/codecs下面?两个都是了一下,都不好使!
网上的文章多是讲解如何从头编译此款软件的同时将解码器也搞定,但是像我这样的从apt自动安装的mplayer的情况下,后期该怎么配置解码器得位置呢?没有说明!一直到了晚上,很偶然的在一篇文章中看到需要将mplayer选项中的vedio选项卡中的driver改为X11!!!果然好使!解码器就放在/usr/lib/codecs下面就行了。
再接再厉,又下载了若干skin,这下痛快了!
在此期间,也发现在linux下面mount上的windows下面的分区原来都放在/media目录下面。

搞定windows下面的php & mysql

昨天!就是昨天,又体验了一把上学的时候的那种作为初级程序员的感觉。其实很多知识都是这样一点一点抠嗤出来的。
因为最近我看到了一些文章,所以正在考虑将我现在租用的主机与域名放弃,然后将主机改在国外,将我的BLOG完全搬到自己的主机之中。于是有了下面的几步:
第一步,选择主机供应商。好在网络上面介绍的文章还不少,经过了比较详细的对比,暂时选定了ixwebhosting,价格、空间、服务都还不错。
第二步,需要在自己的机器上面安装php,mysql作为测试使用。
1-安装mysql还算顺利,没有出什么问题。
2-安装php,可费了劲了。
@装了很多遍都不行,最后看到有一篇文章写道php最好不要安装在路径中有空格的目录下面,例如默认的c:\program files\php。再一次重装!装在了c:\php下面。
@将php的安装路径加入windows的环境变量中。
@由于我在安装的时候是选择的iis4isapi的方式,所以需要对iis进行配置。打开默认网站的属性进行配置,首先是isapi filter,加入php,应用程序是php安装目录下面的php5isapi.dll。然后是主目录下面的配置按钮,添加.php文件扩展名,应用程序同上。最后一步是添加默认得启动页面,这个简单。将IIS服务停止再启动。
@修改php安装目录下面的php.ini文件。register_globals = Off改为On;extension_dir = "C:\php\ext";;extension=php_mysql.dll解除注释。
@基本ok了,可以试一下了。将网站代码copy到c:\inetpub\wwwroot下面。发现ie可以正常浏览,firefox却不行,对网页浏览变成了下载文件?再查资料,发现需要在iis下面create网站应用程序,这样才好了。
3-还需要安装phpmyadmin作为对mysql的管理。也很烦,对其下面的config.inc.php文件进行了N多的修改具体得记不清楚了,有印象的是:username/password, update/save directory。
终于差不多了!
第三步,测试并比较BLOG代码。我选择了两个还算比较主流的:pivot & wordpress。其中pivot不需要使用mysql数据库。
1-其中pivot还算比较顺利,基本上是立刻就可以正常运行了。中文也没有问题。可以自己定义BLOG发布的时间。只是没有找到如何才能建立自己的相册。
2-wordpress就比较麻烦,好在试了几次也可以运行了。可以自己定义BLOG发布的时间。但是中文显示有些问题,现在还没有找到解决办法,另外也是不知道如何建立自己的相册。不过这两个问题并不严重,因为网上使用wordpress的人很多,有中文的,也有带相册的。所以肯定有办法。另外比较重要的一点:wordpress有导入的功能,可以自动的导入blogger中的内容!

所以考虑了一下,暂时选定wordpress,保险一些。