2008年10月22日星期三

(转) 给对电机领域有兴趣的学弟学妹建议

Abstract
假如能重新来过读大一,你会怎么读呢?以下是我对学弟学妹的建议。

Introduction
电机领域很大,有固态电子、IC设计、计算机、通讯、控制、光电、医工...等,由於我有兴趣的是IC设计和计算机,若学弟学妹对此领域有兴趣,我有以下建议:

在大一时,顷全力将C语言和Verilog两个语言搞好,为什么呢?
1.C语言:
这是软体语言的代表,这科影响了后续的资料结构、演算法、计算机组织、作业系统、驱动程式、系统程式、韧体实验、编译器的学习,也就是说只要是软体且要写程式,都逃不掉C语言,C语言没学好,剩下这几科根本学不好。

2.Verilog语言:
这是硬体语言的代表,这科影响了后续的逻辑设计、数位设计、计算机组织、VLSI、SOC、FPGA等科目的学习,当你学这些科目时,若你懂硬体语言,可以直接在code中理解背后的理论,所谓『有code有真相』,而且还能藉由理论自己实作来验证,如在计算机组织学到的pipeline理论,自己可以用Verilog将其实现,这样将更有感觉。

Conclusion
C语言和Verilog语言分别是软体语言和硬体语言的代表,若两个都熟,会帮你同时打通软体和硬体的任督二脉,尤其嵌入式系统的兴起,软体和硬体已经整合,没什么只懂硬体或只懂软体的人才,两个都得懂。大一电机系都会教C语言,只要跟著学校好好学就好(当然我承认C语言很难学),但是通常学校将Verilog或者VHDL放到大二或大三才教,我觉得太晚了,建议学弟学妹大一就自修Verilog,这样大二大三的逻辑设计、数位设计、计算机组织会学得更好,更有感觉,这我有深切的体认。

至於C++呢?我的建议是:『行有余力,再学C++』,毕竟C语言和Verilog的重要性远大於C++,虽然C++的物件导向泛型非常有趣,MFC、Qt、SystemC..等也是用C++,但对於电机系大一而言,C语言和Verilog的重要性远大於C++,所以先将这两科搞好比较重要。

C/C++几点知识

1. 为了节省内存,是否该使用char或short取代int做计算?
很早以前就有这个疑问,在C/C++中,若明知自己的计算没有很大,是否可以char或short来取代int以节省内存。C++ Primer 4th在P.38做了以下的建议:

When performing integer arithmetic, it is rarely right to use shorts. In most programs, using shorts leads to mysterious bugs when a value is assigned to a short that is bigger than the largest number it can hold. What happens depends on the machine, but typically the value "wrap around" so that a number too large to fit turns into a large negative numbers. For the same reason, even though char is an integral type, the char type should be used to hold characters and not for computation. The fact that char is signed on some implementations and unsigned on others makes it problematic to use it as a computational type.

2. 浮点运算时,该使用float还是double?
在C++ Primer 4th P.38,对float和double做了以下的建议
Determining which floating-point type to use is easier: It is almost always right to use double. The loss of precission implicit in float is significant, whereas the cost of double precision calculations versus single precision is negligible. In fact, on some machines, double precision is faster than single.

3. i++和++i哪个速度较快?
++i和i++哪个速度较快呢?在C++ Primer 4th整本书中,都是用++i。为什么,答案是因为++i较快,所以C++ Primer才都使用++i。

++i相当于
i = i + 1;
return i;

而i++相当于
int j = i;
i = i+1;
return j;

由于i++还必须copy值给j,所以速度较慢。

4. include了不必要的Header File,是否会增加编译后程序的大小呢?
编译器会根据您所撰写的程序内容自己到所含括进来的头文件去撷取所需要的信息,而没有使用到的信息则不属于这个程序的范围,故不会增加代码的大小。当然,我们也没有必要含括一些没有必要的头文件到程序来,因为这只会徒增程序阅读的困扰。
参考: C语言教学手册 P2-6,洪维恩著

数字图像处理的经典人物Lena

只要是搞图像处理方面的,一定都见过这张照片,虽然不知道她是谁,来自何处。她就是Lena小姐,她在各种图像处理书籍、论文经常出现,你想知道她究竟是谁,看看她的近照吗?

Lena这张照片出自PlayBoy 1972年11号,以下是影像领域所用的版本:
彩色


事实上,这张图片来自大名鼎鼎的playboy,原图如下:


Lena近照 (1997年) 算一算也11年前了....

(转) UML中文FAQ

(转) UML中文FAQ (OO) (UML)
V1.0 张恂 2003年10月29日

编者按:
一直很难找到中文的、适合国人看的UML FAQ,而英文的UML FAQ往往散落于各处不易收集和消化,导致很多看似简单却很基本、很关键的问题在网络论坛、BBS上被反复地提出,既浪费了提问者、解答者不少的时间和精力,也给大家学习总结、进一步提高带来了困难。于是,结合自己的所学所想试着编写了一个UML中文FAQ供各位参考。众人拾柴火焰高,有什么不足之处,欢迎大家多多提出宝贵意见,不断补充,一起来完善!
联系邮箱:zhangxun2001@hotmail.com

什么是UML?
UML有哪些特点?
UML有什么用?
UML不能做什么?
为什么要学习和掌握UML?
什么情况下不需要或不适合用UML?
什么情况下应该用UML?
促进UML普及和应用对于加强我国软件业的实力有什么重要意义?
UML的统一性表现在哪些方面?
UML是如何诞生的?
UML是一家之言,或少数派的观点吗?
UML之父是谁?
UML标准有哪些最新进展?
初学者如何开始学习UML?
世界上有哪些著名的公司、组织参与了UML标准的制订?

什么是UML?

Unified Modeling Language(统一建模语言)是国际对象管理组织OMG制定的一个通用的、可视化建模语言标准,可以用来描述(specify)、可视化(visualize)、构造(construct)和记载(document)软件密集型系统的各种工件(artifacts,又译制品)。

UML有哪些特点?
UML的"通用性"主要是指不仅仅可以用它来描述软件,而且还可以用它来描述一般企业或组织的业务流程以及由软、硬件共同组成、以软件为主的复杂系统(即所谓的软件密集型系统),甚至还包括非软件系统。

UML的"可视性"是指可以通过UML一系列的图形符号,组成多种视图(view)来直观、清晰地表达系统分析设计中方方面面的、许多复杂的概念。UML主要是为了人的阅读和使用而设计的,所以它采用了半形式化的,易于人们理解、交流的形式。

UML是一种分析设计专用的建模语言,它本身不是编程(programming)语言,不能直接用来生成可执行的软件。UML是一种抽象层次比C、C++、Java、VB、Delphi等文本高级语言更高的图形语言,通过它我们可以抽象地表示用高级编程语言编写的文本程序的逻辑结构和行为。相比传统的高级编程语言,UML能够更加高效、准确地反映软件设计的方案和思路,是真正用来"设计程序"(design programs)的语言。从这个意义上看,不妨称UML为"甚高级"程序设计语言。

UML基本上不能算作全新的发明,它并非学者教授、科研机构的研究成果,而是直接来自于产业界、工程界的实践总结,是在归纳基础上进行理论升华的产物,其核心内容反映了30多年来全球软件工业的领导者在软件设计构造领域的最佳实践和成功经验,因而具有很高的实用价值。

实践证明,OO分析设计(OOAD)方法比传统方法能更加准确、全面地描述现实世界。UML是用来表述OO概念的一种语言工具,而很奇妙,它本身作为一件产品同样也是用OO方法来设计的,这使得UML具有传统建模语言所不具备的很强的语义表达能力和非常灵活的可扩展性。

UML有什么用?

UML的用途非常广泛,可以概括为"描述、可视化、构造、记载"4种基本功能,在业务建模、需求分析、系统设计、实现和测试、数据建模、项目管理等阶段任务中均可根据需要采用。

UML建模是建立软件开发文档的一个有效手段,通过UML可视化地描述系统需求,记载软件构成,能够显著地提高文档的质量和可读性,减少编写文档的工作量。

UML实质上是一种系统分析设计专用语言,通过可视化的图形符号结合文字说明或标记可以帮助业务/系统分析员、软件架构师/设计师、程序员等各种建模者有效地描述复杂软件(或业务)的静态结构和动态行为,包括工作流(数据流和控制流)、功能需求、结构元素及关系、架构组成、设计模式、对象协作、事件响应和状态变化等等。

UML不能做什么?
UML不是高度形式化的语言,一般不能用于定理证明。
UML是基于OO方法的通用建模语言,不适合用户图形界面设计、超大规模集成电路(VLSI)设计、基于规则的人工智能等专业领域。
UML是一种离散型建模语言,适合对由软件、固件或数字逻辑构成的离散系统建模,不适合对工程和物理学领域中的连续系统建模。
本身作为语言,UML仅仅是一种表达形式,不是建模方法,在实际的软件项目开发中仅仅掌握一套标准的图形符号是远远不够的。用好UML首先需要掌握OOAD的基本原则和方法,并在一定的软件开发过程(如UP/RUP、XP等)的指导下进行有取舍的运用。

为什么要学习和掌握UML?

首先,UML对于当前大多数希望进一步改进质量的软件开发团队来说是必不可少或必须的。为什么这样说呢?因为,C++、Java等源码并不能直观、方便地反映复杂程序的设计:如内部逻辑结构、各种隐含的依赖关系、运行时的状态改变和特殊行为等等。写好的代码仅仅是一种实现方式,很难反映出现象背后的真实本质――设计,因此对于大多数稍稍复杂点的项目来说,仅有代码是不够的。

可视化建模历来是一种成功的工程实践做法,并非软件行业所特有。软件的设计方案在用C++、Java实现之前通常隐藏在人们的头脑当中,而设计正确与否是决定软件质量好坏的要害,一个前提是必须用适当的方式把它表达出来。通过程序代码来表达、讨论、评估和选择复杂软件的设计往往是很笨拙的,这一表达

方式的空欠唯有通过类似UML的建模语言来填补。

其次,OO方法是当代主流的软件开发技术。世界先进的软件团队和个人早已摆脱了对如何使用具体的平台API、个别编程语言特性的纠缠,而把更多的精力放在了需求、架构、设计机制和模式等对软件质量有重大影响的核心要素――分析与设计上。UML作为OO建模语言的事实上标准和主要的表达媒介,在这些场合能发挥关键的作用。所以,熟练地掌握并运用好UML是当今系统分析员、架构师/设计师以及程序员等软件工程师所必备的一项基本技能。

什么情况下不需要或不适合用UML?

对于一个特定的软件公司或开发团队,在下列情况下建议不采用UML:
1)传统的做法已完全适用,对OOAD的要求也不高,项目非常成功,无任何改进的必要;
2)开发的系统比较简单,直接用源码配上少量的文字就能解决问题,软件开发文档也无需添加图形来辅助说明;
3)开发人员更习惯于直接阅读源码,用源码交流,这样做不影响工作效率和质量;
4)开发的系统本身不属于OO方法、UML适用范围。

什么情况下应该用UML?

对于一个特定的软件公司或开发团队,在下列情况下建议采用UML:
1)OO方法是项目决定采用的方法论,是整个项目或产品成功的关键;
2)开发人员感觉用源码说明不了真正的问题,希望利用可视化建模语言简化文档,提高交流的效率,准确抓住问题的本质;
3)系统的规模和设计都比较复杂,需要用图形抽象地表达复杂的概念,增强设计的灵活性、可读性和可理解性,以便暴露深层次的设计问题,降低开发风险;
4)公司希望记录已成功项目、产品的公共设计方案,在开发新项目时可以参考、重用过去的设计,节省投入,提高成功率。
促进UML普及和应用对于加强我国软件业的实力有什么重要意义?

OO方法自上世纪80年代以来已经成为软件开发的主流技术,标准OO建模语言UML的问世说明OO技术的发展达到了一个新的高峰。推广普及UML的应用可以使我国软件开发人员、软件企业和客户乃至整个行业都从中获益:
1)个人
UML相关知识体系蕴含了非常丰富的当代软件工程先进知识。软件开发人员通过学习和掌握UML概念、表示法及相关的软件过程、软件工程技术,能够加深对OOAD原则、方法的理解,提高抽象思维能力,从而站在更高的层次上分析问题、解决问题,这是一条快速提高个人软件设计能力的有效途径。
2)企业
对软件企业内部,用好UML,不但能直接提升企业的软件设计开发能力,而且由于UML能形象直观地记录软件设计的核心思想,可以使软件开发管理透明
化,促进企业知识资产的保护和增值,促进软件重用和整体效益的提升。对外,由于UML是通行的软件行业国际标准,企业在业务交往中有效运用UML,无论对于开拓国内外产品市场还是保障工程承接、项目外包等业务的顺利开展都大有裨益。
3)行业
积极采用国际通行的软件描述和设计语言UML,一方面能增加信息透明度,显著降低软件企业之间、客户与开发商之间的沟通成本,减少项目失败的风险,另一方面能促进行业市场的规范化和标准化,增进国际技术交流,整体提高我国软件业的技术水平和参与国际市场竞争的能力。据悉,与UML有关的国家级标准目前正在考虑制定过程当中。

UML的统一性表现在哪些方面?

UML的统一性至少表现在以下几个方面:
1)随着OO技术的蓬勃发展,到上世纪90年代初OO方法已经多达50余种,它们之间既有很多共通之处也存在许多没有必要的细节差异,这妨碍了技术进步,不利于产业的发展。UML统一了多种互补的、最具代表性、最受业界欢迎的主流OO方法,这既是历史的必然,也OO方法成熟的一个重要标志。UML及与其配套的OO统一过程(RUP)在实现"合并同类项"的基础上又向前迈出了一大步,不愧为当代OO建模方法的集大成者。
2)UML适用于各个行业的信息化工程,包括电信、银行、保险、税务、办公自动化、电力、电子、国防、航天航空、制造、工业自动化、医疗、交通、商业、电子商务等诸多领域的业务建模和软件分析设计,尤其适合对大中型、复杂、分布式应用系统或软件产品建模,在这些广泛的领域中都可以统一使用一套标准的建模语言。
3)作为一种独立于具体实现的、抽象的表述方式,UML广泛地适用于各种现代程序设计语言、数据库和开发平台。
4)有了UML标准,面向各种不同的软件开发方法和过程(如重载/轻载,瀑布式/迭代递增式),在软件开发生命周期各个阶段的工作(如业务建模、需求分析、设计、实现、测试)中,都可以采用一套统一的概念和表示法,避免了语言转换的麻烦。
5)UML明确定义了一套公共的内部概念,建立了统一的关于建模语言的元模型,反映了在软件和信息建模技术领域的最新成果。

UML是如何诞生的?

识时务者为俊杰。为了突破上世纪90年代初OO方法论混战的局面,1994年杰出的Rational公司OO大师Grady Booch邀请通用电气公司著名OO大师James Rumbaugh博士加盟Rational,启动了OO方法的统一历程。他们于1995年发表了"统一方法0.8"。与此同时,另一位超一流OO大师、爱立信公司的Ivar Jacobson博士也在该年加入了二人的行列。

1996年,3人正式把他们的统一成果命名为"统一建模语言",UML于此诞生。同时,他们还做出了一个非常重要的决定――把UML提交到非赢利性的OMG进行标准化,让全世界的软件开发人员都可以自由地分享这一软件史上的重大成果。

于是,在全球软件界具有广泛影响力的国际对象管理组织OMG从此开展了一系列OO建模语言的标准化工作。1997年11月,UML 1.1经OMG各成员投票被正式采纳为行业标准。


UML是一家之言,或少数派的观点吗?

否,UML是全球工业界和学术界的领导者协同努力的成果。自从进入OMG程序后,UML就不再由Rational一家公司所有或由少数人控制,而成为凝结了百家之长的公共知识结晶。具有丰富企业信息系统和信息工程经验的OO大师、Martin/Odell方法的领军人物James Odell为此曾表明放弃自己的方法,并直接参与领导了UML 1.x系列标准的制订工作。另一位OO大师Coad/Yourdon方法的创始人之一Peter Coad,虽然没有直接参与UML制订,但却独具慧眼创办了TogetherSoft公司(已被Borland收购),开发了著名的UML集成开发环境Together ControlCenter,成为Rational Rose的有力竞争者。事实说明,UML的确促进了各种OO方法和流派的大融合,在OO建模语言领域具有不可替代的地位。

UML之父是谁?

UML之父有三位:他们是Grady Booch(Booch方法),James Rumbaugh(OMT方法)和Ivar Jacobson(OOSE方法)。人们亲切地称他们为"3 amigos"(即"三高",类似于大家给予合作举办世纪音乐会的,世界上3位顶尖男高音歌唱家的称谓)。

UML标准有哪些最新进展?

UML 1.x系列的最新版本是于2003年3月发布的1.5版本(http://www.uml.org/)。
OMG(http://www.omg.org/)从2000年起启动了UML 2.0标准的制定工作。U2P组织(UML2 Partners Consortium,http://www.u2-partners.org/)在UML 2.0标准的制定过程中发挥了主导作用。目前UML 2.0的上层结构(Superstructure)规范已经在2003年6月12日获得通过。
OMG已经与国际标准化组织ISO开展了合作,预示着UML将来有望成为ISO标准,值得关注。

初学者如何开始学习UML?

无外乎几种方式:读书、上网、实践、培训。

最近几年国内一窝蜂地出版了不少与UML有关的中英文书籍,但说实话,有点良莠不齐。初学者不管自学还是参加培训,选择合适的UML教材/读物是很重要的。

Craig Larman的《UML和模式应用》是一本非常好的内容丰富、真正实用的入门教材,在国际上也是用得最多的一本,无出其右者。纵观全书,以实案为中心,脉络清晰,组织老到,深浅适当,循循善诱,非常适合UML、UP、设计模式的初学者和一直对OOAD、UML的价值存有疑虑的结构化人士一读。对于熟悉OO的人来说,阅读此书也是再一次享受梳理知识、进行系统性训练的美妙体验。本人尤其推荐第2版(内容更新了不少,听说正在引进翻译,值得期待)。

如果希望与大师对话,全面深入地掌握UML的基本要领,通过领悟UML设计者的思想和意图来达到在实战中得心应手运用OO建模技术的目的,建议一定要阅读UML之父Grady Booch亲自撰写的《UML用户指南》。本书相当全面,偏重理论分析和概念阐释,这些内容和抽象技术对于真正理解UML是非常基本、必不可少的,所以它适合喜欢认真探究一切的读者。

用好UML离不开有好的过程作指导。RUP极其丰富的内容令人生畏,Ivar Jacobson大师在《统一软件开发过程》一书中从管理者和系统架构师的角度,通过实例分析系统地讲解了将UML用于分析设计实践的完整过程,深入浅出,言简意赅,可以说此书正是RUP的精华所在。带领自己的团队用好UML,得此书足矣。

此外,IT之源(http://www.iturls.com/)、UMLChina(http://www.umlchina.com/)等网站提供了非常丰富的学习资料和参考文章。

UML规范、《UML参考手册》内容深、篇幅大,主要面向UML工具开发者、专家和研究人员,不适合初学者阅读。

世界上有哪些著名的公司、组织参与了UML标准的制订?

历年来,参与UML标准制订的一些核心公司和组织包括(1.x、2.0):
全能型IT公司:HP, IBM, Unisys
大型软件公司:CA, Microsoft, Oracle
CASE厂商:I-Logix, Rational(已被IBM收购), Telelogic
电信供应商:Alcatel,Ericsson,Fujitsu,Motorola
行业组织:OMG
IT系统集成商:EDS
等等

UML在业界的影响力和地位由此可见一斑。

OpenOffice运行更快的技巧

OpenOffice.org 现在是我主力办公软件,要坚持在linux下也用。但它有一个令人诟病的地方:启动时总是慢吞吞的,这让人十分不爽。今天在 Zolved 上读到一篇可使 OpenOffice.org 提速的技巧文章,在试验后感觉效果很明显,记录并分享之。

首先,启动 OpenOffice.org Writer,在设置后,其他的 Calc、Impress、Draw 等组件也会生效。接着,执行"工具->选项"菜单命令,选择左边的"内存",设置要点如下:

在"撤销"选项,步骤数目建议设置为 20 或 30,总之应小于 100。

在"图形缓存"选项,OpenOffice.org 使用设置为 128MB,每个对象的内存设置为 20MB。

在"插入对象缓存"选项,设置对象数为 20。

选中"启用快速启动"选项。

然后,再选择左边的"Java",取消选择"使用 Java 运行环境"选项。最后点击"确定"保存你的设置。
现在你可以关闭 OpenOffice.org 并再次启动它以感受速度的变化了。

标准的makefile写法

一个很典型的Linux C/C++的makefile写法,其它的应用可根据此template修改。
(注意每一行的前面若有空格,是tab,不是space)

#Source file

SRC = ThreadQueue.cpp
#Object file
OBJ = $(SRC:.cpp=.o)

#Output execution file
PROGRAM = ThreadQueue

#Compiler
CC = g++

#Include
INCLUDE = -I/usr/include/ncurses -I/usr/include/

#Linker Parameter
LINKPARAM = -lpthread -lncurses

#Options for development

#CFLAGS = -ansi -g -Wall

#Options for release

CFLAGS = -ansi -O -Wall

all: $(PROGRAM)

$(PROGRAM): $(OBJ)

$(CC) -o $(PROGRAM) $(LINKPARAM) $(OBJ)

.SUFFIXES : .cpp

.cpp.o:

$(CC) $(INCLUDE) $(CFLAGS) -c $<

clean:

rm *.o

如果编译时出现了Makefile:8: *** 遗漏分隔符  停止的错误
原因是在编写makefile文件时:
gcc前的是tab分隔符,不能用空格,
make中规定每一Shell命令之前的开头必须使用字符。



郑弘仪「教你投资脑袋致富八招」

郑弘仪「教你投资脑袋致富八招」
1 乐于接近人们,学习新事物
2 大量阅读,成为杂食性阅读动物
3 每个月存3000 元,适当投资经营,退休将有六千万.(注:此处为台币,1元人民币大约等于4元新台币)
4 提早社会化,建立正确价值观
5 做自己擅长、喜欢的事,只做能力可负担的
6 不要太有自己的人际门坎,每个人都有值得学习的地方
7 如果没空研究股票,就别投资
8 学习阅读财务报表,收集信息、学习判断