2009年5月10日星期日

《Battlestar Galactica|太空堡垒卡拉狄加》观看顺序

神作!不仅仅是SF,值得一看!追了这么久,看到结局,猛然意识到“我们”也许是人形CYLON的后代。。。。。。

迷你剧:Battlestar Galactica MINI Series (2003)

迷你剧是全部故事的开始
屠杀 毁灭 逃亡 ...
人形CYLON出现 扑朔迷离
是在看第一季之前一定不能错过的预热


第一季
第一季共13集 2005年播出
延续BSG传统风格 更黑暗...更邪恶

第二季
第二季一共20集
2005年下半年~2006年上半年播出
分为两部分
2.0季1-10集 为上半部分
2.5季11-20集 为下半部分
网络剧:反抗/THE RESISTANCE
第二季和第三季之间的过渡
讲述BSG舰队跳走以后 留在新卡的的人们艰辛的反抗历程
共十集 每集2-4分钟
第三季
2006年下半年~2007年上半年播出
共20集

Razor: Flashbacks/利刃之回闪

在塞昂进化之前,卡拉狄加尚未成为方舟之时,曾有过另一场战争
向我们讲述,41年前,阿达玛年轻时,在第一次塞昂战争中的故事

《Razor》电视电影《利刃》 2007年11月上映

Season Final(4.0)/第四季 上半季

4.5季开篇的网络剧,共10集。
讲述找到地球后,菲里克斯·盖塔中尉在一次意外中的遭遇。
这个故事直接影响了最终集剧情的发展,至关重要。

最终集(Season 4.5 下半季)

来源; http://bbs.flyine.net/thread-76904-1-1.html

2009年5月7日星期四

先毕业还是先就业?

先毕业还是先就业?貌似这不是个问题,没毕业又怎么来就业呢。可是问题的关键不是在这里,长久以来一直被这个问题所困扰,今日算是爆发了。

毕业,我也算是09年的应届生,理所当然今年6月份应该毕业,然后找到个公司报道,应该很正常才对,可是现实却并非如此!

首先毕业论文,6月前是不可能的了,也就谈不上正常毕业了,要想今年拿到证,那就要必须9月中旬答辩,异常艰辛——看来辞职回去写论文是必然的了!学校证书按照上面的政策步骤执行,而论文答辩又是按照自己的进度来进行,夹在中间的我们也是左右无奈,到底是2年还是2.5年,应届还是往届,是个问题!

还有就业的问题,目前为止实习了2家单位了,貌似还不满意,我到底在想什么?关于应届生的问题,其实学校里面是没有任何问题,关键是公司。看公司是准备把我作为今年的计划还是明年的计划,或者只能现在学校把论文争取早点写出来,和导师磨合一段时间,基本没什么太大问题,一条路是参加秋季招聘,找到家公司,愿意在10年春季之前可以与我正式签约的,第二条路还是通过实习,实习对公司不仅是个廉价劳动力,也是产生正式员工的所在。

看来又要开始循环了,希望这不是个死循环!

PS:翻了一下,发现之前的日志怨念很多啊!看来太年轻,“沉”的功夫太浅了!

2009年4月25日星期六

KMPlayer常见问题

解决KMPlayer“其他程序正在使用覆盖合成器[Overlay]”

电脑重装后,使用KMPlayer,发现打开视频文件总是提示“其他程序正在使用覆盖合成器[Overlay]。请关闭其他专业播放器等程序再尝试播放”。

解决办法:

在桌面空白处右击--属性--设置--高级--疑难解答--将硬件加速的标记设置成全加速即可

2009年4月18日星期六

很诡异的过了省考大线,既很高兴也很无语

今年请本科的3个同学吃饭,回来接了个老妈的电话,说公务员成绩出来了,我便上网查了看看,结果打出乎我的所料,居然过了,算半个秀才了,一时心中即是高兴也有点无语。

这次我的成绩是公共基础知识45.5分,行政职业能力56.6分,申论50分,总分152.1分。而A类职务要求总分150分,行政职业能力50分就可过线。

老实说,这次公务员考试自己几乎可以算是没有准备,大概是考前1个月才开始稍微看点东西。可是1本200元买的参考书看了还不到100页,往年的试卷做的比价凌乱,去年的试卷是差不多做了一遍,再往前的做的也不是很多。这样的状况,考前一周这些内容又看都没看,直接去考试了,考下来居然险过,着实在我的意料之外。

总说人很贪心,我也不否认,我现在一无所有,有的只是无穷的欲望,这句话够直白的了,呵呵。这让我有了一个很大的猜想或者说是妄想,既然这次省考我都没怎么复习都过了,不管是运气好还是有实力,也许我还可以挑战更高难度的考试,更困难的职位。。。

面试差不多5月中旬进行,而且没有过职位的线,排名第36,没有机会参加面试了。不过这次也算给了我一次很不错的教训,说明一切皆有可能啊!

2009年4月16日星期四

P2P终结者

发现一款非常流氓强大的软件,P2P终结者,简而言之用于局域网用户抢带宽用,非常霸道!


功能简介:


  • 带宽管理
  • P2P下载管理
  • 您可以为局域网内主机分别指定最大上下行带宽,可以有效杜绝因个别主机滥用下载而导致网络中所有主机无法正常上网情况。您可以选择需要封锁哪些P2P下载软件,并把规则指派给对应的主机,那么这些主机就无法再使用这些P2P软件进行下载。
     
  • 聊天工具管理
  • Web网页管理
  • 您可以根据管理需要来灵活选择需要封锁哪种聊天工具,目前软件支持对QQ、MSN、泡泡、UC和飞信的管理。

    您可以设置主机访问WWW网站时的规则,软件支持黑名单、白名单,也可以封锁未经允许私自开设代理的主机。

     
  • 自定义规则
  • 自定义时间段
  • 软件针对主机的管理是以规则方式配置,您可以建立、编辑多个控制规则,然后将规则指派给一个主机,也可以将同一规则指派给多个主机。您可以自己定义规则生效的时间范围,以便在正常工作时间和下班业余时间指派不同的控制规则,达到更加人性化管理。
     
  • 日流量统计
  • 主机扫描及备注
  • 软件可以对每个被控主机统计日流量,并显示在主机列表中显示;你还可以对历史日流量进行查询。软件可以扫描出本地网络中所有开机并且联网的主机,您可以为每个主机添加备注,方便日后网络管理。

    来源:http://www.netsoft2005.com/chs/index.htm

    我的小侄女和小弟弟

    保留两张我的小侄女和小弟弟的照片,手机拍的,不算很清晰
    顺带说明一下,侄女是我南京表哥的千金,小弟弟是我外公的南京外甥的公子,有点复杂







    2009年2月21日星期六

    霹雳布袋戏

    1984年-1988年

    01.霹雳城.8集.1984年.开始发行录像带.VHS.
    02.霹雳神兵.8集.1985年.
    03.霹雳金榜.8集.19886年.
    04.霹雳震九宵.8集.1987年.
    05.霹雳战将.8集.1988 年.

    1988年-1990年

    06.霹雳金光.16集.1988-06.
    07.霹雳眼.20集.1989-06.
    08.霹雳至尊.15集.1989-11.
    09.霹雳孔雀令.10集.1989-11.
    10.霹雳剑魂.20集.1990-01.
    11.霹雳异数.40集.1990-02.
    12.霹雳劫.30集.1990-03.
    13.霹雳天阙.30集.1990-06.

    1991年-1995年

    14.霹雳紫脉线.20集.1992-05.
    15.霹雳烽云.20集.1993-04.
    16.霹雳天命.14集.1993-11.
    17.霹雳狂刀.60集.1993-12.
    18.霹雳王朝.30集.1995-03.
    19.霹雳幽灵箭【第一部】.25集.1995-09.

    1996年-2000年

    20.霹雳外传之叶小钗传奇.6集.1996-02.
    21.霹雳幽灵箭【第二部】.20集.1996-03.
    22.霹雳英雄榜.50集.1996-07.
    23.霹雳烽火录.30集.1997-03.
    24.霹雳风暴.40集.1997-07.
    25.霹雳狂刀之创世狂人.50集.1998-04.
    26.霹雳雷霆.30集.1999-02.开始发行录像带.VHS.VCD.
    27.霹雳英雄榜之江湖血路.40集.1999-07.
    28.霹雳英雄榜之风起云涌【第一部】.20集.2000-03.
    29.霹雳英雄榜之风起云涌【第二部】.30集.2000-07.

    2001年-2005年

    30.霹雳英雄榜之争王记.30集.2001-01.
    31.霹雳图腾.20集.2001-05.开始发行VCD.DVD.D5.1集1片.
    32.霹雳异数之龙图霸业.40集.2001-08.
    33.霹雳封灵岛.20集.2002-04.
    34.霹雳兵燹.48集.2002-07.
    35.霹雳刀锋.30集.2003-01.
    36.霹雳异数之万里征途.32集.2003-06.
    37.霹雳九皇座.50集.2003-11.
    38.霹雳劫之阇城血印.26集.2004-04.
    39.霹雳劫之末世录.24集.2004-07.
    40.霹雳皇朝之龙城圣影.40集.2004-10.
    41.霹雳剑踪.30集.2005-02.
    42.霹雳兵燹之刀戟戡魔录.30集.2005-06.
    43.霹雳兵燹之刀戟戡魔录【第二部】.40集.2005-09.开始仅发行DVD.D9.2集1片.

    2006年-2010年

    44.霹雳奇象.40集.2006-02.
    45.霹雳谜城.40集.2006-06.
    46.霹雳皇龙纪.50集.2006-11.
    47.霹雳皇朝之铡龑史.30集.2007-05.
    48.霹雳开疆纪.40集.2007-08.
    49.霹雳神州.30集.2008-01.
    50.霹雳神州II之苍玄泣.46集.2008-04.
    51.霹雳神州III之天罪.2008-09.
    52 . 霹雳天启 . 2009-03

    2009年2月16日星期一

    2008的过去-纪念在ARDC实习的半年

    现在是2009年的2月16日,今天和老大说明了我的去意,老大也没说什么,即使说什么我也听不进去了。我意已决,兄勿多言。

    半年前,也就是2008年7月15日一早,我背着个包和张兄一起来到ARDC(SHARP ADVANCED R&D CENTER),看到了分配给我使用的座位与电脑,见到了我这半年实习的领导,见到了和我一起共事半年的共事,也听到了目前项目组的当前工作项目,终于开始了人生头一次离开校园的实习。也许我还年轻,看不了它的成长,也许我太浮躁,总想去外面的花花世界看看,也许我真的性格使然,实习期间也没认识几个朋友,几乎有一半时间在想自己的事情,也许是初涉社会的茫然与无知,总认为老大给的任务还是比较简单的,在早早做完后,就开始看各种招聘实习相关的信息。也许我真的是想赌一把,最终选择离开了ARDC,选择去另外一家可能实习待遇还不如ARDC、公司规模远没有作为世界500强之一的SHARP大,甚至面对的可能会有很多加班、更加幸苦的单位!但是我毕竟是个年轻人,“身于忧患,死于安乐”,“机会永远大于安定”,最终选择了离开,从一个火坑往另外一个火坑义无反顾的跳了进去!

    首先说一下ARDC,实际是由日本本部直接投资的,但是由于成立初期,僧少粥也少,暂时挂在SES下属,财务也是由SES把持。经济大权不在自己手上,其实对ARDC的发展还是有所限制的。ARDC主要是为SHARP其产品、其子公司各种需求而制作软件的,基本是属于自产自销的地步,即亏损了有母公司买单,盈利了也不一定能得到好处。我个人觉得如果ARDC要做到长远发展,软件开发必须要“走出去”。

    我在ARDC一共参加了2个项目。头一个项目是SVG Authoring Tool,说白了,就是基于J2SE,利用NetBean IDE,编写的SVG创作工具。
    1. SVG文件为了增强与用户的交互性,曾加了animation和set属性,用来标记动画效果。animation和set中用begin,end来标记动画触发的一些时间标记,而begin和end应该可以相互关联,如果有animation(set)被删除的话,begin与set理论上也应做相应的修改;如果图形元素删除,所属的animation、set也一并删除。而在实际的程序中,begin与end已经作为固定的字符串属性赋给了相应的animation(set),与它所对应的animation(set)间并没有直接的联系,这就给操作上带来了问题,造成系统在运行后产生系统垃圾的可能性大为提高。我的修改方案是在animation(set)中新建一个静态的Hashmap对象,用来存储animation(set)之间的相互映射关系,每次SVG载入时,通过载入,初始化animation(set)之间的关系,当对animation(set)的begin、set或者其本身进行操作时,相应的修改这个静态的Hashmap,退出时相应的从Hashmap中读取映射关系,加以保存。但我这种修改方案随之带来一个问题,增加了一个变量,同时就引入了数个方法,这样虽然解决了问题,但由于引入了一个新的关系,导致程序产生了新的未知BUG,甚至是ERROR,FAULT。在发现了这些问题后,解决方法是尽量采用局部变量,在不增加系统方法的前提下,增加局部变量以减少系统的开销。
    2. SvgDocument类过于庞大,SVG Authoring Tool设计SVG文件可以通过软件输出成*.svg格式的文件,这就要求将存储在内存中的对象按照svg文件格式逐条输出,svg文件有手机、TV上两种版本,而且存在一定的差异性。原先的程序是每个版本一个方法,其存在不少代码功能上的重复不说,而且每个方法都过于庞大,不宜读懂,如果修改起来很是麻烦,重构是不可避免的,将相同的过程抽象出getEntityXml(),getDefsXML(),getDescriptionXML()等各种不同的方法。
    3. SVG Authoring Tool由于功能日趋完善,代码愈来愈多,所积累下来的BUG数目也与日俱增,其中大多涉及到SWING上面的一些设置与属性的相互关系。日方也提出了一些修改意见,animation(set)创建时,会有ID的属性,原先可以自动按顺序排列的功能取消,ID可以不连续,大大简化了对animation(set)的操作。

    第二个项目是基于J2ME的手机CXMDF阅读器。
    1. MIDP的文字断行功能。CXMDF的菜单都是基于MIDP底层面板进行编写的,对于排版这种高级的属性必须自行实现。文字断行也就是显示英文的时候,在一行的末尾不能将单词硬生生的拆开,使得一个单词横跨两行,影响阅读,主要是对单词是否结束做逻辑上的判断。判断一个单词的显示宽度,如果没有超过一行则从下一行开始显示;如果超过一行的宽度,则根据剩下的宽度找出单词应该断开的位置,插入“--“,前半段在第一后结尾显示,后半段则另起一行,从下一行开始显示。
    2. TextDlg的完成。根据日方给出的界面式样书,从主要的界面样式中分离出比较有代表性和抽象性的TextDlg,主要在其上完成对文本信息的显示。TextDlg继承自AbstractDlg,后者是所有Dlg的抽象类。AbstractDlg中已经实现了drawBackgroud,drawButton等方法,TextDlg主要实现drawDialog显示界面上的文本内容,dialogLoop通过循环实现对按键事件的相应。前者对文本以及文本后的按钮进行显示布局,若文本只有极少的一行则只需将该文本全屏居中显示即可,若行数多了,则不仅由上到下的居中处理,而且通过dialogLoop实现滚屏效果。附在文本后的按钮则按照不同的要求显示成按钮与链接两种模式。
    3. 实现漫画场景中显示菜单的功能,包括页面跳转、和功能菜单。因为之前项目中已经完成了几个Dlg的开发工作,这里的工作实际便是通过调用这几个Dlg来完成相应的功能,其中包括稍微修改了KomaSelectDlg的绘制布局,在BookSelectCanvas中增加了Property字段,用来判断显示菜单的事件,增加字段用来判断check是否有下一本书等。
    4. 系统中一些BUG的处理工作。当阅读器显示漫画场景的时候,若该漫画场景存在特殊效果,例如渐变、震动等,在漫画显示这些特殊效果时,无法做到翻页等命令,即特效无法被cancle。原因是处理画面特效效果的代码,与开启按键监听的代码是在一个线程中顺序执行的,即setlayout,drawlayout结束之后才开始监听按键。我的做法是将drawlayout中处理画面特效的代码独立作为一个线程来处理,但是在系统中多增加了一个线程,可能带来了与其他线程的冲突。事实也证明了我这种方法存在问题,应为Java对于这种线程的先后执行并没有明确的先后顺序,导致虽然实现了键盘监听,但特效的处理会向后延迟。

    CXMDF项目主要有日方(本部)提供设计方案,我们ARDC主要负责核心包的开发,测试交由香港的团队外包给第三方的公司来完成;而在我们的核心包开发完毕之后,台湾、香港的团队将完成基于核心包的外围应用程序的开发,并适用于当地的运营商和手机平台。

    综述一下,在ARDC的半年,算是对我启蒙的半年,在这半年我学到了很多东西,不过还很难说我已经从学生的角色中走出来了,路漫漫其修远兮,吾将上下而求索!

    2009年2月12日星期四

    软件工程师的一些思考

    作为技术能力,软件工程师不可不知的10个概念:

    1. 接口(Interfaces)
    软件工程中最重要的概念是界面。任何软件都是一个真实系统的模型。如何使用简单的用户界面进行模型化至关重要。很多软件系统走这样的极端,缺乏抽象的冗长代码,或者过分设计而导致无谓的复杂。 在众多软件工程书籍中,Robert Martin 写的《敏捷编程》值得一读。 关于模型化,以下方法对你会有帮助。首先,去掉那些只有在将来才可能用得着的方法,代码越精练越好。第二,不要总认为以前的东西是对的,要善于改变。第三,要有耐心并享受过程。

    2. 惯例与模板 (Conventions and Templates)
    命名惯例和基础模板在编程模式中常被忽视,然而它可能是最强大的方法。命名惯例使软件自动化成为可能,如,Java Beans 框架在 getter 和 setter 方法中,使用简单的命名惯例。del.icio.us 网站的 URL 命名也使用统一的格式,如 http://del.icio.us/tag/software 会将用户带到所有标签为 software 的页。 很多社会网络均使用简单命名,如,你的名字是 johnsmith ,那你的头像可能命名为 johnsmith.jpg,而你的 rss 聚合文件的命名很可能是 johnsmith.xml 。 命名惯例还用于单元测试,如,JUnit 单元测试工具会辨认所有以 test 开头的类。 我们这里说的模板(templates )指的并不是 C++ 或 Java 语言中的 constructs,我们说的是一些包含变量的模板文件,用户可以替换变量并输出最终结果。 Cold Fusion 是最先使用模板的程序之一,后来,Java 使用 JSP 实现模板功能。Apache 近来为 Java 开发了非常好用的通用模板, Velocity。PHP 本身就是基于模板的,因为它支持 eval 函数。

    3. 分层 (Layering)
    用分层来讨论软件架构是最容易的。John Lakos 曾出版过一本关于大型 C++ 系统的书。Lakos 认为软件包含了层,书中介绍了层的概念,方法是,对每个软件组件,数一下它所依赖的组件数目就可以知道它的复杂程度。 Lakos 认为,一个好的软件拥有金字塔结构,就是说,软件组件拥有层层积累的复杂度,但每个组件本身必须简单,一个优秀的软件包含很多小的,可重复使用的模块,每个模块有自己的职责。一个好的系统中,组件之间的依赖性不可交叉,整个系统是各种各样的组件堆积起来,形成一个金字塔。 Lakos 在软件工程的很多方面都是先驱,最著名的是 Refactoring (代码重构)。代码重构指的是,在编程过程中需要不断地对代码进行改造以保证其结构的健壮与灵活。

    4. 算法的复杂性 (Algorithmic Complexity)
    关于算法的复杂性,软件工程师需要理解这样几件事。第一,大O标记法(big O notation);第二,你永远都不应该使用嵌套式循环(循环里面套循环),你应该使用 Hash 表,数组或单一循环;第三,如今优秀类库比比皆是,我们不必过分纠缠于这些库的效能的差别,我们以后还有机会进行细调;最后,不要忽视算法的优雅及性能,编写紧凑的,可读的代码可以让你的算法更简单,更干净。

    5. 散列法(Hashing)
    Hashing 的目的是加速访问速度。如果数据是序列存储的,从中查询一个项的时间取决于数据列的大小。而散列法对每一个项计算一个数字作为索引,在一个好的 Hashing 算法下,数据查找的速度是一样的。 除了存储数据,散列法对分布式系统也很重要。统一散列法(uniform hash )用来在云数据库环境下,在不同计算机之间分存数据。Google 的索引服务就是这种方法的体现,每一个 URL 都被散列分布到特定计算机。 散列函数非常复杂,但现代类库中都有现成的类,重要的是,如何对散列法进行细调以获得最好的性能。

    6. 缓存(Caching)
    缓存对现代 Web 程序不可或缺,缓存是从数据库取回,并存放在内存中的数据。因为数据库直接存取的代价非常高,将数据从数据库取回并放在缓存中访问就变得十分必要。比如,你有一个网站,要显示上周的畅销书,你可以从数据将畅销书榜一次性取回放在缓存中,而不必在每次访问时都去数据库读数据。 缓存需要代价,只有最常用的内容才可以放入缓存。很多现代程序,包括 Facebook,依靠一种叫做 Memcached 的分布式缓存系统,该系统是 Brad Firzpatrick 在工作于 LiveJournal 项目时开发的,Memcached 使用网络中空闲的内存资源建立缓存机制,Memcached 类库在很多流行编程语言,包括 Java 和 PHP 中都有。

    7. 并发 (Concurrency)
    并发是软件工程师最容易犯错的地方,这可以理解,因为我们一直遵从线形思维,然而并发在现代系统中非常重要。 并发是程序中的并行处理,多数现代编程语言包含内置的并发能力,在 Java,指的是线程。关于并发,最经典的例子是“生产/消费”模式,生产方生产数据和任务,并放入工作线程消费或执行。并发的复杂性在于,线程需要经常访问共同数据,每个线程都有自己的执行顺序,但需要访问共同数据。Doug Lea 曾写过一个最复杂的并发类,现在是 core Java 的一部分。

    8. 云计算 (Cloud Computing)
    RWW 最近的关于云计算的文章 Reaching For The Sky Through Compute Clouds 讲到了云计算如何改变大规模 Web 应用的发布。大规模的并行,低成本,与快速投入市场。 并行算法发明以来,首先迎来的是网格计算,网格计算是借助空闲的桌面计算机资源进行并行计算。最著名的例子是 Berkley 大学的 SETI@home 计划,该计划使用空闲的 CPU 资源分析太空数据。金融机构也大规模实施网格计算进行风险分析。空闲的资源,加上 J2EE 平台的崛起,迎来了云计算的概念:应用服务虚拟化。就是应用按需运行,并可以随着时间和用户规模而实时改变。 云计算最生动的例子是 Amazon 的 Web 服务,一组可以通过 API 进行调用的应用,如云服务(EC2),一个用来存储大型媒体文件的数据库(S3),索引服务(SimpleDB),序列服务(SQS)

    9. 安全 (Security)
    随着黑客的崛起与数据敏感性的上升,安全变得非常重要。安全是个广义的概念,涉及验证,授权与信息传输。 验证是对用户的身份进行检查,如要求用户输入密码。验证通常需要结合 SSL (secure socket layer)进行;授权在公司业务系统中非常重要,尤其是一些工作流系统。最近开发的 OAuth 协议可以帮助 Web 服务将相应信息向相应用户开放。Flickr 便使用这种方式管理私人照片和数据的访问权限。 另外一个安全领域是网络设防,这关系到操作系统,配置与监控。不仅网络危险重重,任何软件都是。Firefox 被称为最安全的浏览器,仍然需要频频发布安全补丁。要为你的系统编写安全代码就需要明白各种潜在的问题。

    10. 关系数据库 (Relational Databases)
    关系数据库因为在大规模 Web 服务上缺乏可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就。关系数据库对处理订单,公司数据方面有着出色的表现。 关系数据库的核心是以记录表示数据,记录存放在数据库表,数据库使用查询语言(SQL)对数据进行搜索与查询,同时,数据库对各个数据表进行关联。
    数据库的标准化技术(normalization)讲的是使用正确的方式对数据进行分存以降低冗余,并加快存取速度。

    JAVA软件工程师需具备的能力
    • 深入理解OOA/OOD,具备软件工程思想 
    • 熟悉J2EE体系架构及设计模式 
    • 熟悉JBuilder或Eclipse IDE工具 
    • 熟悉oracle/sqlserver/db2至少一种数据库 
    • 熟悉Unix/Linux系统 
    • 熟悉UML建模,熟练掌握ROSE。 
    • 熟悉weblogic和websphere的配置和开发 
    • 独立完成需求分析、设计、开发和单元测试
    •  n年以上应用项目开发经验 
    • 能够迅速接受新技术,快速学习 
    • 专业化、规范化
    J2EE软件工程师应具备的能力
    • 1.熟练掌握java语言,深入理解OOP,OOA,OOD等编程思想. 
    • 2.掌握j2ee各个技术模块 (jsp/servlet, jdbc, ejb, websphere, weblogic等) 
    • 3.熟悉各种Java IDE和相关开发工具 (Eclipse, Jbuilder, WSAD<最牛>, CVS, ANT, Junit) 
    • 4.理解ROB的设计原理, 熟练掌握Oracle/SQL Server/DB2 其中至少一种. 
    • 5.熟悉UML建模, 熟练掌握Rational Rose 
    • 6.深入理解Design Patten, 熟悉 Struts,spring,hibernate等框架技术 
    • 7.有中,大型项目开发经验,能独立完成整个软件模块分析,设计开发,单元测试 
    • 8.能迅速接受新技术,快速学习和应用 
    • 9.熟悉软件工程,了解前沿技术规范(CMM)和先进开发模式(RUP, XP) 
    • 10.英语,逻辑思维能力,团队精神等非技术要求.
    软件工程师的实务职业生涯规划
    1. 好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!
    2. 可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!
    3. 不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!
    4. 多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!
    5. 知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!
    6. 抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!
    7. 逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!
    8. 工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!
    9. 要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...
    10. 该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!

    2009年2月3日星期二

    IT技术EN缩写总结-不断更新

    计算机方面技术越来越多,英文缩写也愈来愈多,简直多如牛毛,总结一下,不断跟新

    DataBase

    SQL:Structured Query Language结构化查询语言
    DDL:Data Definition Language数据库定义语言,负责数据机构定义与数据库对象定义的语言

    MDAC:Microsoft Data Access Components
    ODBC:Open Database Connectivity开发数据库互连
    DAO:Data Access Objects数据访问对象
    RDO:Remote Data Objects远程数据对象
    OLE DB:Object Linking and Embedding DataBase对象链接嵌入式数据库
    ADO:ActiveX Data Objects,是一个用来存取数据源的COM组件
    ADOX:ADO Extensions for DDL and Security,DDL与安全ADO扩展
    RDS:Remote Data Service

    URL:Uniform/Universal Resource Locator统一资源定位符
    IIS:Internet Information Services互联网信息服务

    COM:Component Object Model组件对象模型(元件对象模型)

    .Net
    CLR:Common Language Runtime共通语言运行平台
    MSIL:Microsoft Intermediate Language微软中间语言
    JIT:Just In Time即时
    CTS:Common Type System公共类型系统

    MSDN:Microsoft Developer Network微软开发网络

    API:Application Programming Interface应用程序接口(应用编程接口)

    XML
    XML:Extensible Markup Language可扩展标记语言
    XSL:Extensible Stylesheet Language扩展样式表语言
    XSLT:XSL Transformations,XSL转换
    XSL-FO:Extensible Stylesheet Language Formatting Objects可扩展样式表语言格式化对象
    XLink:XML Linking Language,XML链接语言
    XPointer:XML Pointer Language,XML指针语言
    DTD:Document Type Definition文档类型定义
    XSD:XML Schema Definition,XML Schema定义
    XML DOM:XML Document Object Model,XML文档对象模型
    SOAP:Simple Object Access Protocol简单对象访问协议
    WSDL:Web Services Description Language网络服务描述语言
    RDF:Resource Description Framework资源描述框架
    RSS:
    WAP:Wireless Application Protocol无线应用协议

    Java
    ANT:Another Neat Tool(另一个整洁的工具),

    2008的过去-纪念科索的一年

    想了很久,还是想写点东西留给已经过去一个月的2008年,这一年很多事情发生了,很多事情没有发生,总之有精彩也有失落,还是记个流水帐吧。

    2008年实在老邓的算法考试中开始的,过了元旦便是考试,算是对研一上学期的总结。老实说这考试其实不难,如果好好准备再加上平时再认真点,应该不成问题。

    鼠年的春节是在家里的仓库中度过的,第一次在这个“新家”过年啊,运气非常好,回到家第二天老天便开始下雪了,而且一下就没个停,2008年初的雪灾便开始了。在家浑浑噩噩地过了一个春节,终于回到了学校,开始了这一比较关键的学期,在这一学期里面将决定我的实习单位,而这一学期里确实发生了不少事情,不管从个人来讲还是从研究生会、班级来讲。

    说到东南大学软件学院研究生会,不得不提到“科索”虚拟公司。这个科索,是英文“CoseSoft”的音译,也就是软件学院的Software的意思。这个虚拟公司也是对原来研究生会的改组,不再工商局注册,在学院注册,呵呵,注册资本为¥20,000整(这一点我非常感谢我们的老吴院长-吴介一同志,真的,对于我们这个较为冲动、不是很成熟的行动不仅有精神上的支持,更有物质上的支持,难能可贵,不愧是老院长,我们的楷模啊),目的并不是为了给软院创收,我们也暂时没这个能力,哈,单纯是为了大家能有一个比较好的学习实践的环境,不是简简单单的课程实践,而是很多实实在在的具体项目。

    从上到下我说一下科索的组织架构,单说学生这一层面,不包括老师、学院的部分。“食物链”的最上端是个叫“主席”的人,呵呵,也就相当于学生会会长的职位,主要是对我们公司的日常工作进行总体把握,监督和督促各个部长的工作,总理公司日常的各种事务,包括初期的筹划、人员的招募、公司标志的确定、服务器的日常管理等等很多事务都是这位宋兄牵头的,可谓劳苦功高啊。“食物链”往下看,有五大支柱部分,简称“五柱”(这种说法好像很NB,怎么当初没想到,呵呵),分别是Web开发部(主打软件),嵌入式开发部(主打硬件),人力资源部,培训部,还有一个貌似可以叫做财务部。“食物链”的最下端便是众多的公司普通“员工”了,可以被剥削,被压迫的对象,呵呵,不过我们之间没有任何强制手段亦没有任何报酬,这种关系从建立起来便显得很脆弱。

    财务部,主管的是一个叫波波的小男生(年纪貌似比我大一岁,呵呵),主要是对公司的日常支出进行统筹规划,下面还有一个日常辅助秘书(是我们这个“公司”唯一有“小秘”的人啊),不过我好像觉得平时支出几乎为零,主要的支出还是活动支出。2007年的最后,我们公司的年会由波波牵头组织的,我个人觉得还是比较成功的,虽然其中毛病不断,意外不断,呵呵。培训部头便是朱老大,培训部一年貌似也没有什么动静,说搞培训都雷声大雨点小或者没有,可能朱老大确实很忙吧,一笔带过。人力组员部头是位女士,叫狒狒(为什么叫狒狒,怎么叫狒狒,我这就不多说了),貌似也是公司刚建立招募人员的时候忙活了一整,之后也没什么大事,一笔带过。嵌入式开发部,管事的是个胖子,比较喜欢吃零食(他的桌子上一半是零食,一半是电路板、电线等等乱七八糟的元器件,我一直觉得他那的零食会不会有工业污染啊。。。),他们部门主要负责了外面公司接过来的一个项目,大体是一块板子的底层通信的问题。作为一个旁观者,整个实施、设计、进度管理的过程中确实暴露出了很多问题,我基本是在和我的项目进行对比,改进。最后这个项目无痛流产了,这其中有太多因素交织在一起了,不仅是技术的问题、领导者、甚至与老师之间的交流都存在问题,不多说了。

    Web开发部,其实这个部门的名字就存在问题,两个项目中之后一个项目涉及Web,另一个压根不是,当初为什么叫Web开发部,这个名字不是太好。我这个部长也是稀里糊涂的混到了,也是“部长级人物”里面唯一参加过人员招募所谓的“面试”的人了,呵呵,荣幸之至啊,起初没有“掺和”研究生会的事情,是因为我的另外一个头衔,不过怎么又“掺和”了,着实让人摸不着头脑。开发部内主要有两个项目,一个是学院的校友录系统,这个主要由小华负责;一个是组织部的党校考试系统,这个由我负责。

    说到这个考试系统,着实让我捶胸顿足,仰天长啸,好不痛苦啊。技术水平只能算一般,在同学们当中还算说得过去,头一次带人一起做项目,我可是想了很久,可是真正实践起来可又是另一番景象。
    1. 首先是如何计划、如何安排进度、如何管理队员。以前学过了软件工程,了解了面向对象的分析与开发过程,但都是一知半解,谈不上缺乏经验,是没有经验可谈!这个项目实施过程几乎是一边摸索、一边前进、一边修正的不停循环。
    2. 需求,是我和组织部的老师商量后确定了的,然后由我再统一向各个组员转述,分工任务。第一个环节就出现了问题,一下子上来了整个考试系统,功能较为繁杂,且需要在N多台机器上进行部署。对于主要功能的剥离基本上还算成功,但是需求的细节却是经过了反复确认。由于经验不足,在主题框架与细节功能剥离过程中并没有做到完全的面向对象、比较好的解耦合,使得后期需求的变更让整个开发付出了比较大的代价,而且在部署期间出现了些并发症!
    3. 对于开发工作和技术的选择,选择了C#+SQL Server2000。为什么C#?起初客户需要对MS Office文档进行操作,自然而然采用了Visual Studio平台,开发人员主要是大二的同学组成,C++作为基础大一已经学过,C#已经开始学习了;而我对于C#没有经验,很多技术细节把握不了。当初选择这个语言,也是想自我挑战一下,可是开发到后期依然出现了危机。当习惯了Java平台,即使在困难的问题,网上找不到答案的问题,把底层的代码翻出来,看看是怎么实现的,几乎不存在解决不了的问题。而MS的平台,尤其是其.Net Framework优秀的封装性,底层代码无法得知,在服务器与客户端异步通信时经常会发生一些“概率性”的BUG,很难捕捉问题在哪里,这也几乎成了我们这个系统最大的不安定因素和测试失败的最大原因。
    4. 对于任务的分配,依然存在不少问题。开始是让研究生组完成系统的设计,然后交由本科生开发完成。主要是考虑研究生大多数并不是本专业出生,技术能力层次不齐,过于薄弱,且不想少数本科生那样比较好“使唤”,呵呵。而本科生其实真正做事情的没有几个,想想自己本科的时候什么样子就知道了,呵呵。在设计阶段,由于对技术把握的不是很好以及需求的反复确认,使得详细设计几乎与开发过程断开了,唯一起到作用的大概还是数据库的详细设计。而在开发过程中,完全交由本科生开发,而我统合代码。我是在本科生的基础上整合代码的,可以说基本框架是出自他们之手。没有经验的开发导致了我们这个项目的结构比较混乱,而且缺少注释,使得开发、需求变更、BUG修改都会要付出很大的代价。以至于后来个人忙于寻找实习单位,只是完成了一个初始版本,将这个系统交给了本科生们。
    5. 过程控制,事先缺少比较详细的计划安排,导致了开发过程中的进度控制不太好。这一点不完全是主观原因,处于学校的环境中,还是要以上课为主,只能用少量的课余时间在完成了其他一些琐事之后再来管这个项目的事情。
    6. 在测试过程中,对于真实的运行环境估计不足,是导致数次系统出问题的首要原因。
    7. 。。。。。。
    这么多的问题其实还是用经验不足就可以概括了,一回生,二回熟,如果回头再重新做这个项目,我应该会管理、控制的更好的。不过最后把所有的文档、代码顺利移交给本科的同学了,据说开发到现在已经快顺利部署了,恭喜他们了,呵呵。

    科索,拜了。在这里我学到了不少东西,永远不会忘记我的第一个“项目”。


    2009年1月21日星期三

    I Have A Dream

    今天奥巴马上台了,一个黑皮肤的人成了美国,从某种意义上也可以说是这个世界的领导人。网上搜到了Martin Luther King与August 28,1963.Washington,D.C.的演讲

    Martin Luther King Speeches

    I Have a Dream - Address at March on Washington

    August 28, 1963. Washington, D.C.



    I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation. [Applause]

    Five score years ago, a great American, in whose symbolic shadow we stand signed the Emancipation Proclamation. This momentous decree came as a great beacon light of hope to millions of Negro slaves who had been seared in the flames of withering injustice. It came as a joyous daybreak to end the long night of captivity.

    But one hundred years later, we must face the tragic fact that the Negro is still not free. One hundred years later, the life of the Negro is still sadly crippled by the manacles of segregation and the chains of discrimination. One hundred years later, the Negro lives on a lonely island of poverty in the midst of a vast ocean of material prosperity. One hundred years later, the Negro is still languishing in the corners of American society and finds himself an exile in his own land. So we have come here today to dramatize an appalling condition.

    In a sense we have come to our nation's capital to cash a check. When the architects of our republic wrote the magnificent words of the Constitution and the declaration of Independence, they were signing a promissory note to which every American was to fall heir. This note was a promise that all men would be guaranteed the inalienable rights of life, liberty, and the pursuit of happiness.

    It is obvious today that America has defaulted on this promissory note insofar as her citizens of color are concerned. Instead of honoring this sacred obligation, America has given the Negro people a bad check which has come back marked "insufficient funds." But we refuse to believe that the bank of justice is bankrupt. We refuse to believe that there are insufficient funds in the great vaults of opportunity of this nation. So we have come to cash this check -- a check that will give us upon demand the riches of freedom and the security of justice. We have also come to this hallowed spot to remind America of the fierce urgency of now. This is no time to engage in the luxury of cooling off or to take the tranquilizing drug of gradualism. Now is the time to rise from the dark and desolate valley of segregation to the sunlit path of racial justice. Now is the time to open the doors of opportunity to all of God's children. Now is the time to lift our nation from the quicksands of racial injustice to the solid rock of brotherhood.

    It would be fatal for the nation to overlook the urgency of the moment and to underestimate the determination of the Negro. This sweltering summer of the Negro's legitimate discontent will not pass until there is an invigorating autumn of freedom and equality. Nineteen sixty-three is not an end, but a beginning. Those who hope that the Negro needed to blow off steam and will now be content will have a rude awakening if the nation returns to business as usual. There will be neither rest nor tranquility in America until the Negro is granted his citizenship rights. The whirlwinds of revolt will continue to shake the foundations of our nation until the bright day of justice emerges.

    But there is something that I must say to my people who stand on the warm threshold which leads into the palace of justice. In the process of gaining our rightful place we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred.

    We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again we must rise to the majestic heights of meeting physical force with soul force. The marvelous new militancy which has engulfed the Negro community must not lead us to distrust of all white people, for many of our white brothers, as evidenced by their presence here today, have come to realize that their destiny is tied up with our destiny and their freedom is inextricably bound to our freedom. We cannot walk alone.

    And as we walk, we must make the pledge that we shall march ahead. We cannot turn back. There are those who are asking the devotees of civil rights, "When will you be satisfied?" We can never be satisfied as long as our bodies, heavy with the fatigue of travel, cannot gain lodging in the motels of the highways and the hotels of the cities. We cannot be satisfied as long as the Negro's basic mobility is from a smaller ghetto to a larger one. We can never be satisfied as long as a Negro in Mississippi cannot vote and a Negro in New York believes he has nothing for which to vote. No, no, we are not satisfied, and we will not be satisfied until justice rolls down like waters and righteousness like a mighty stream.

    I am not unmindful that some of you have come here out of great trials and tribulations. Some of you have come fresh from narrow cells. Some of you have come from areas where your quest for freedom left you battered by the storms of persecution and staggered by the winds of police brutality. You have been the veterans of creative suffering. Continue to work with the faith that unearned suffering is redemptive.

    Go back to Mississippi, go back to Alabama, go back to Georgia, go back to Louisiana, go back to the slums and ghettos of our northern cities, knowing that somehow this situation can and will be changed. Let us not wallow in the valley of despair.

    I say to you today, my friends, that in spite of the difficulties and frustrations of the moment, I still have a dream. It is a dream deeply rooted in the American dream.

    I have a dream that one day this nation will rise up and live out the true meaning of its creed: "We hold these truths to be self-evident: that all men are created equal."

    I have a dream that one day on the red hills of Georgia the sons of former slaves and the sons of former slave owners will be able to sit down together at a table of brotherhood.

    I have a dream that one day even the state of Mississippi, a desert state, sweltering with the heat of injustice and oppression, will be transformed into an oasis of freedom and justice.

    I have a dream that my four children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character.

    I have a dream today.

    I have a dream that one day the state of Alabama, whose governor's lips are presently dripping with the words of interposition and nullification, will be transformed into a situation where little black boys and black girls will be able to join hands with little white boys and white girls and walk together as sisters and brothers.

    I have a dream today.

    I have a dream that one day every valley shall be exalted, every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight, and the glory of the Lord shall be revealed, and all flesh shall see it together.

    This is our hope. This is the faith with which I return to the South. With this faith we will be able to hew out of the mountain of despair a stone of hope. With this faith we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood. With this faith we will be able to work together, to pray together, to struggle together, to go to jail together, to stand up for freedom together, knowing that we will be free one day.

    This will be the day when all of God's children will be able to sing with a new meaning, "My country, 'tis of thee, sweet land of liberty, of thee I sing. Land where my fathers died, land of the pilgrim's pride, from every mountainside, let freedom ring."

    And if America is to be a great nation this must become true. So let freedom ring from the prodigious hilltops of New Hampshire. Let freedom ring from the mighty mountains of New York. Let freedom ring from the heightening Alleghenies of Pennsylvania!

    Let freedom ring from the snowcapped Rockies of Colorado!

    Let freedom ring from the curvaceous peaks of California!

    But not only that; let freedom ring from Stone Mountain of Georgia!

    Let freedom ring from Lookout Mountain of Tennessee!

    Let freedom ring from every hill and every molehill of Mississippi. From every mountainside, let freedom ring.

    When we let freedom ring, when we let it ring from every village and every hamlet, from every state and every city, we will be able to speed up that day when all of God's children, black men and white men, Jews and Gentiles, Protestants and Catholics, will be able to join hands and sing in the words of the old Negro spiritual, "Free at last! free at last! thank God Almighty, we are free at last!"

    转自:http://www.mlkonline.net/dream.html

    http://www.youtube.com


    2009年1月15日星期四

    C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝

    关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符
    摘要:
        在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。
        如果对象在申明的同时马上进行的初始化操作,则称之为拷贝运算。例如:
            class1 A("af"); class1 B=A;
         此时其实际调用的是B(A)这样的浅拷贝操作。
        如果对象在申明之后,在进行的赋值运算,我们称之为赋值运算。例如:
            class1 A("af"); class1 B;
            B=A;
            此时实际调用的类的缺省赋值函数B.operator=(A);
            不管是浅拷贝还是赋值运算,其都有缺省的定义。也就是说,即使我们不overload这两种operation,仍然可以运行。
    那么,我们到底需不需要overload这两种operation 呢?
            答案就是:一般,我们我们需要手动编写析构函数的类,都需要overload 拷贝函数和赋值运算符。

            
     下面介绍类的赋值运算符
    1.C++中对象的内存分配方式
            在C++中,对象的实例在编译的时候,就需要为其分配内存大小,因此,系统都是在stack上为其分配内存的。这一点和C#完全不同!千万记住:在C#中,所有类都是reference type,要创建类的实体,必须通过new在heap上为其分配空间,同时返回在stack上指向其地址的reference.
            因此,在C++中,只要申明该实例,在程序编译后,就要为其分配相应的内存空间,至于实体内的各个域的值,就由其构造函数决定了。
        例如:
        
    class A
    {
    public:
        A()
        
    {
        }

        A(
    int id,char *t_name)
        
    {
        _id
    =id;
        name
    =new char[strlen(t_name)+1];
        strcpy(name,t_name);
        }
        private:
            char *username;
            int _id;
    }


    int main()
    {
    A a(
    1,"herengang");
    A b;
    }

    在程序编译之后,a和b在stack上都被分配相应的内存大小。只不过对象a的域都被初始化,而b则都为随机值。
    其内存分配如下:


    2. 缺省情况下的赋值运算符
        如果我们执行以下:
        b=a;
            则其执行的是缺省定义的缺省的赋值运算。所谓缺省的赋值运算,是指对象中的所有位于stack中的域,进行相应的复制。但是,如果对象有位于heap上的域的话,其不会为拷贝对象分配heap上的空间,而只是指向相同的heap上的同一个地址。
            执行b=a这样的缺省的赋值运算后,其内存分配如下:

            因此,对于缺省的赋值运算,如果对象域内没有heap上的空间,其不会产生任何问题。但是,如果对象域内需要申请heap上的空间,那么在析构对象的时候,就会连续两次释放heap上的同一块内存区域,从而导致异常。
        ~A()
        
    {        
            delete name;
        }

    3.解决办法--重载(overload)赋值运算符
            因此,对于对象的域在heap上分配内存的情况,我们必须重载赋值运算符。当对象间进行拷贝的时候,我们必须让不同对象的成员域指向其不同的heap地址--如果成员域属于heap的话。    
    因此,重载赋值运算符后的代码如下:
    class A
    {
    public:

        A()
        
    {
        }

        A(
    int id,char *t_name)
        
    {
            _id
    =id;
            name
    =new char[strlen(t_name)+1];
            strcpy(name,t_name);
        }

        
        A
    & operator =(A& a)
    //注意:此处一定要返回对象的引用,否则返回后其值立即消失!
        
    {
                if(name!=NULL)
                    delete name;
            
    this->_id=a._id;
            
    int len=strlen(a.name);
            name
    =new char[len+1];
            strcpy(name,a.name);
            
    return *this;
        }


        
    ~A()
        
    {
            cout
    << "~destructor"<<endl;
            delete name;
        }


        
    int _id;
        
    char *name;
    }
    ;

    int main()
    {
     A a(1,"herengang");
     A b;
     b=a;

    }

    其内存分配如下:

    这样,在对象a,b退出相应的作用域,其调用相应的析构函数,然后释放分别属于不同heap空间的内存,程序正常结束。


    references:
    类的深拷贝函数的重载
        public class A
    {
        public:
            ...
            A(A &a);//重载拷贝函数
            A& operator=(A &b);//重载赋值函数
            //或者 我们也可以这样重载赋值运算符 void operator=(A &a);即不返回任何值。如果这样的话,他将不支持客户代买中的链式赋值 ,例如a=b=c will be prohibited!
        private:
            int _id;
            char *username;
    }

    A::A(A &a)
    {
        _id=a._id;
        username=new char[strlen(a.username)+1];
        if(username!=NULL)
            strcpy(username,a.usernam);
    }

    A& A::operaton=(A &a)
    {
            if(this==&a)//  问:什么需要判断这个条件?(不是必须,只是优化而已)。答案:提示:考虑a=a这样的操作。
                return *this;
            if(username!=NULL)
                delete username;
            _id=a._id;
            username=new char[strlen(a.username)+1];
            if(username!=NULL)
                strcpy(username,a.usernam);
            return *this;    
    }
    //另外一种写法:
    void A::operation=(A &a)
    {
            if(username!=NULL)
                delete username;
            _id=a._id;
            username=new char[strlen(a.username)+1];
            if(username!=NULL)
                strcpy(username,a.usernam);
    }

    其实,从上可以看出,赋值运算符和拷贝函数很相似。只不过赋值函数最好有返回值(进行链式赋值),返回也最好是对象的引用(为什么不是对象本身呢?note2有讲解), 而拷贝函数不需要返回任何同时,赋值函数首先要释放掉对象自身的堆空间(如果需要的话),然后进行其他的operation.而拷贝函数不需要如此,因为对象此时还没有分配堆空间。 

    note1:
        不要按值向函数传递对象。如果对象有内部指针指向动态分配的堆内存,丝毫不要考虑把对象按值传递给函数,要按引用传递。并记住:若函数不能改变参数对象的状态和目标对象的状态,则要使用const修饰符 

    note2:问题:
        对于类的成员需要动态申请堆空间的类的对象,大家都知道,我们都最好要overload其赋值函数和拷贝函数。拷贝构造函数是没有任何返回类型的,这点毋庸置疑。 而赋值函数可以返回多种类型,例如以上讲的void,类本身class1,以及类的引用 class &? 问,这几种赋值函数的返回各有什么异同?
        答:1 如果赋值函数返回的是void ,我们知道,其唯一一点需要注意的是,其不支持链式赋值运算,即a=b=c这样是不允许的!
              2 对于返回的是类对象本身,还是类对象的引用,其有着本质的区别!
                  第一:如果其返回的是类对象本身
       A operator =(A& a)
        
    {
                if(name!=NULL)
                    delete name;
            
    this->_id=a._id;
            
    int len=strlen(a.name);
           name
    =new char[len+1];
            strcpy(name,a.name);
            
    return *this;
        }

              其过程是这样的:
                           class1 A("herengnag");
                            class1 B;   
                            B=A;
                        看似简单的赋值操作,其所有的过程如下:
                           1 释放对象原来的堆资源
                           2 重新申请堆空间
                           3 拷贝源的值到对象的堆空间的值
                           4 创建临时对象(调用临时对象拷贝构造函数),将临时对象返回
                           
    5. 临时对象结束,调用临时对象析构函数,释放临时对象堆内存
    my god,还真复杂!!
                但是,在这些步骤里面,如果第4步,我们没有overload 拷贝函数,也就是没有进行深拷贝。那么在进行第5步释放临时对象的heap 空间时,将释放掉的是和目标对象同一块的heap空间。这样当目标对象B作用域结束调用析构函数时,就会产生错误!!
                因此,如果赋值运算符返回的是类对象本身,那么一定要overload 类的拷贝函数(进行深拷贝)!
                第二:如果赋值运算符返回的是对象的引用,
       A& operator =(A& a)
        
    {
                if(name!=NULL)
                    delete name;
            
    this->_id=a._id;
            
    int len=strlen(a.name);
           name
    =new char[len+1];
            strcpy(name,a.name);
            
    return *this;
        }

            那么其过程如下:
                       1 释放掉原来对象所占有的堆空间
                       1.申请一块新的堆内存
                       2 将源对象的堆内存的值copy给新的堆内存
                       3 返回源对象的引用
                        4 结束。
        因此,如果赋值运算符返回的是对象引用,那么其不会调用类的拷贝构造函数,这是问题的关键所在!!
     
    完整代码如下:

    // virtual.cpp : Defines the entry point for the console application.
    //

    #include 
    "stdafx.h"
    #include 
    "string.h"
    #include 
    "stdlib.h"
    #include 
    "assert.h"

    class complex
    {
    public:
            
    int real;
            
    int virt;
    public:
        complex()
    {real=virt=0;}
        complex(
    int treal,int tvirt){real=treal;virt=tvirt;}
        complex 
    operator+(const complex &x)
        
    {
            real
    +=x.real;
            virt
    +=x.virt;
            
    return *this;
        }

        complex 
    operator=(const complex &x)
        
    {
            
    return complex(x.real,x.virt);
        }

    }
    ;


    class A
    {
    public:
        A()
    {m_username=NULL;printf("null constructor");}
        A(
    char *username)
        
    {
            
    int len;
            len
    =strlen(username);
            m_username
    =new char[len+1];//(char*)malloc(sizeof(len+1));
            strcpy(m_username,username);
            printf(
    "\nUsername is %s\n",m_username);
        }

        
        A(A 
    &a);
        A 
    operator=(A &b);
        
    int test(const int &x)
        
    {
            
    return x;
        }


        
    virtual ~A()
        
    {
        
    //    if(m_username)
            {
            delete m_username;
            printf(
    "\nA is destructed\n");
            }

        }




    protected:
        
    char *m_username;

    }
    ;



    A::A(A 
    &a)
    {

        
    int len=strlen(a.m_username);
        
    this->m_username=new char[len+2];
        strcpy(m_username,a.m_username);
        strcat(m_username,
    "f");
        printf(
    "\ndeep copy function");
    }



    A A::
    operator=(A &b)
    {
        
    if(m_username)
            delete m_username;

        
    int len=strlen(b.m_username);
        
    this->m_username=new char[len+1];
        strcpy(m_username,b.m_username);
    //    printf("copied successfully!");
         return *this;
    }


     

    class B:public A
    {
    public:
        B(
    char *username,char *password):A(username)
        
    {
            
    int len=strlen(password)+1;
            m_password
    =new char[len];//(char *)malloc(sizeof(len));
            strcpy(m_password,password);
            printf(
    "username:%s,password:%s\n",m_username,m_password);
        }

        
    ~B()
        
    {
            delete m_password;
            printf(
    "B is destructed\n");
        }

    protected:
        
    char *m_password;
    }
    ;

    int main(int argc, char* argv[])
    {
    //    B b("herengang","982135");
    //    A *a=&b;
    //    delete a;
        A a("haha");
        A b;

        printf(
    "\nbegin to invoke copy function");
        b
    =a;

    //    printf("%d",b.test(2));
        
    //complex x(1,3),y(1,4);
        
    //x=(x+y);
        
    //printf("%d,%d",x.real,x.virt);
        return 0;


    }


    1 重载赋值运算符返回结果为类对象的运行结果


    明显, 运算符最后调用了拷贝构造函数

    2 重载赋值运算符返回结果为类对象引用的运行结果

    很明显,没有调用拷贝构造函数


    转自:http://www.cnblogs.com/Winston/archive/2008/06/03/1212700.html

    我的简介