分类: tech

  • 技术笔记-关于c/c++中的const

    共享一个有趣的关于const的例子(在网上看到的)

    const int a = 1;
    int *p = const_cast<int*>(&a);
    *p = 2;
    cout << “value a=”<< a << endl;
    cout << “value *p=” <<*p << endl;
    cout << “address a=” <<&a << endl;
    cout << “address p=” <<p << endl;
    这段代码输出的结果如下:
    value a=1
    value *p=2
    address a=0xbff1d48c
    address p=0xbff1d48c
    地址都是一样的,可值为什么不一样呢?

    我使用VC6编译了一个更简单的c++代码。查看汇编部分,发现了原因。

    深红色和红色部分就是区别所在,当单步调试到int i1 = a,很有趣的就是a的值是2,但是赋值以后i1的值却变成了1.
    关键就是当进行这个赋值,是直接给i1设置一个值1,而不是像深红色部分那样的赋值过程,
    这也许也是一种优化考虑,对于const变量,赋值时候它会比一般变量跑的更快。

    _main PROC NEAR ; COMDAT

    ; 8 : {

    push ebp
    mov ebp, esp
    sub esp, 80 ; 00000050H
    push ebx
    push esi
    push edi
    lea edi, DWORD PTR [ebp-80]
    mov ecx, 20 ; 00000014H
    mov eax, -858993460 ; ccccccccH
    rep stosd

    ; 9 : const int a = 1;

    mov DWORD PTR _a$[ebp], 1

    ; 10 : int *p = (int*)(&a);

    lea eax, DWORD PTR _a$[ebp]
    mov DWORD PTR _p$[ebp], eax

    ; 11 : *p = 2;

    mov ecx, DWORD PTR _p$[ebp]
    mov DWORD PTR [ecx], 2

    ; 12 :
    ; 13 :
    ; 14 : int i1 = a;

    mov DWORD PTR _i1$[ebp], 1

    ; 15 : int i2 = *p;

    mov edx, DWORD PTR _p$[ebp]
    mov eax, DWORD PTR [edx]
    mov DWORD PTR _i2$[ebp], eax

    ; 20 : }
    ; 21 :
    ; 22 : return 0;

    xor eax, eax

    ; 23 : }

  • 浅论C++在Windows下的GUI自动测试(Unit Test)

    昨天,公司开发组与测试组开会总结上一个release的经验教训,期间就提到一个问题,如何更好的更自动化的测试程序。

    公司正在研究的是IBM的RFT,这个东西不用说,一定是功能强大、极难使用,IBM的软件做的如此有特色,也是不易。问题是作为一个开发人员,我只想能够快速的、可重复、可添加用例的测试自己的代码,难道只能用屏幕定位、鼠标模拟、控件按钮定位这样的“高深”技术?

    最近在开发的主要是一些接口,给另外一个产品使用,没有界面上的任何东西。美国的同事开发了一个测试程序,跑在命令行下,每次我添加一个新的功能或者修改了一些代码,他那边只要跑一遍,就知道对以前的功能有没有影响。

    这个东西不新鲜,就是unit test,几乎每个新兴的开源代码(以java、python、ruby为代表)都会有一个unittest字样的目录,里面就是一些主要的功能测试代码。可是为何我们一直没有很好的利用这个工具呢?

    我想原因也很简单,unit test需要开发人员更好的对代码进行抽象化、模块化。有人一定会反驳说,对于GUI紧密相关的,没法做Unit Test。这是一个问题,但是不是绝对的,也不能成为不进行unit test的理由。关键还是要很好的做到MVC各个模块分离,降低他们之间的耦合度。

    通常对于一个Windows程序员来说,一个GUI界面,会包含几个功能,一是按钮或者控件的响应,比如按下一个按钮,它要变成灰色,直到运行功能完成再恢复原状,或者是一个控件,点击一下会让用户输入,输入完成以后校验,根据校验的结果保存或者提醒用户出现问题。这些都是比较common sense的流程。

    但是这些流程显然不是原子的(atom),它们涉及到了M(model)、V(View)、C(control)的各个方面,对于Windows程序员,这三个方面往往都被放入到CXXXDialog这样的类里面实现,自己还感觉封装的非常好。

    我们就拿用户校验来说明一下如何分解这个MVC过程。

    “一个控件,点击一下让用户输入”,这一部分显然是V和C的,个人感觉,这部分的测试可以由test方面做更深入的检查,开发人员需要保证功能实现完整,简单运行正确。

    “接受用户输入、检查输入数据”,这一部分,显然是比较复杂的逻辑,涉及到Model和Control,View在这一部分可以被忽略掉,输入部分就是数据,输出部分就是检查的结果。很显然,这一部分可以被包装、抽象起来,自己单独做Unit Test。

    “如果出错,反馈用户出错的结果”,这一部分基本上也是以View为主,是需要tester发现问题的部分。

    “如果正确,保存用户的输入”,这块很显然也是可以分离出来单独进行自动测试的。

    从上面分析可以看出来,GUI的测试不是不能进行,而是需要开发人员做更多的工作,需要很好的抽象逻辑计算部分的代码,如果可能,界面展示规则代码也可以抽象处理单独测试。

    这不容易实现,但是值得去做。

    另外,在研究C++的GUI测试,发现了一个很好的帖子:http://bytes.com/forum/thread606579.html

    摘选一些比较精华的部分,中文部分是我的简单翻译:
    Do a google for ‘TFUI’ – its a good technique for your problem.搜索一下“TFUI”,这是一个很好的技术,可以用来解决你的问题。(我找的结果是这里http://c2.c2.com/cgi/wiki?TestFirstUserInterfacesPrinciples)

    Aside from that, the main approach is to treat the GUI library like any other 3rd party library – mainly, don’t try and unit test it, unit test your code that uses it.另外,主要的一点是应该把GUI库当作其他的第三方库来看待,不要试图对他们做单元测试,要测试使用这些库的代码。(简单说,就是不要测View界面部分,而是测试逻辑或者数据部分)

    By this, I mean: ensure all of your logic (business rules, gui presentation rules, data retrival and updates, etc) are completed separated from the gui code. In your gui’s event handlers, don’t do anything except delegate to a plain old C++ Class.我是说:确保所有你的逻辑(商业逻辑,gui展示规则,数据存取更新等等)是完全的与界面代码分离,在GUI事件处理里面,不要做任何事情,除了代理到一个简单的C++类里。

    By separating your code from the gui code, you can easily test your code, without having to even link to the gui library.通过分离代码(功能部分、规则部分)和GUI,就可以很容易测试代码而不需要连接到GUI库。

    In software, abstract is usually the way to solve a problem.在软件中,抽象通常都是解决一个问题的办法。

    Andrew

    另一篇回复,

    ————————-

    Its a great book for working with un tested code, and for seeing how
    to create ‘seams’ between areas like GUI libraries and our code.(这本书应该是《修改代码的艺术》)

    For those interested in unit testing, a good guide that M Features,
    myself and plenty of others use is:

    A unit test does NOT :
    * Use any file IO
    * Connect to a db
    * Present anything on screen
    * communicate across a network.

    单元测试不应该:

    1,使用任何文件输入输出。

    2,连接到数据库。

    3,展示任何东西到屏幕。

    4,通过网络连接通讯。
    The rational for this, is many, but boils down to forcing us to create
    a design that is decoupled from these areas, which nearly always
    results in a good, clean & highly cohesive design. For example, how
    many times have we in the past put logic directly into a dialog
    class? Where as with this style of testing, we force ourselves to
    separate out the UI aspect from the logic part, resulting in us using
    the MVC or MVP or Humble Dialog design patterns, as they allow us to
    unit test the logic without going anywhere near the GUI.

    The second major win is speed of test runs.

    I can run 1200 unit tests in 42.7 seconds currently (and these are
    Java unit tests!) because of following these guidelines. And because
    they run soo fast the Team runs ALL tests ALL of the time.
    Slow tests mean we run them fewer times, the less we run them, the
    longer it is before we find out we broken something. The longer time
    before finding out we broke something, the more costly it is to
    fix…..

    Andrew

  • developer必须知道的网站

    好啦,我承认标题是哗众取宠,这里列出的网站只是个人觉得比较重要的,当然,也希望能对各位看官有用。

    我是一个dos下启蒙,windows下成长的通俗型程序员,何为通俗?既然不是天才,那就通俗一点好了,通俗小说大家都爱看,通俗程序员大家也应该都喜欢吧?废话太多,转入正题,既然是微软族的成员,那么微软的开发圣地一定不要错误,记得经常去朝拜哦。

    1)http://msdn.microsoft.com

    如果安装过微软的msdn就知道,文档上G字节,而且只是离线的部分,如果加上各种周边培训、文章、论坛、wiki,msdn足够你看一辈子。

    下一个不算强悍,但是很有用,就是我们的codeproject,

    2) http://www.codeproject.com

    有个博客写文章,说codeproject投票关于source control软件的占有率云云,岂不知,codeproject主要就是windows平台开发,还有什么选择,自然是sourcesafe。如果跑到sf或者google code,那sourcesafe连毛都看不到,肯定是cvs或者subversion的天下,弄不好git都要强过它,咳,又跑题了。codeproject的重要性体现在两方面,一个是良好的分类,另一个是打分系统,二者结合起来,使得我们很容易找到一个自己需要的实例,足够用而且足够简单,可以直接套用到编程上,省得自己再造轮子。

    第三名给wiki,也就是我们通常所说的维基百科

    3)http://en.wikipedia.org

    所谓百科,就不仅仅是编程了,实际上编程只是很小一部分,但是内容也是相当有用了,比如快速排序的算法实现,就有c语言的、java的等等,或者是某个不了解的术语、概念,都可以找到很丰富的资源链接。

    作为一个程序员,我有一个习惯,当看到一个应用的时候,就想知道它是怎么实现的,比如说c语言里的malloc,它是c runtime library的一部分,但是它是如何实现的呢?这时候源代码搜索引擎就有用处了。

    4)http://www.google.com/codesearch

    尽管第四名才出现google的应用,但是google实际上已经取代了microsoft对于我的重要性,我会去用google搜索而不是msn,其它方面更是举不胜举,个人感觉,在网络应用这个领域,微软已经败给了google。虽然微软极力想找回失去的领地,可是21世纪已经是网络时代,网络已经取代了操作系统,变成最重要的应用平台。

    在这里多说几句题外话,微软的哲学是大而全,想要满足用户的所有需求,操作系统、office、企业应用(包含数据库及服务器)算是它的支柱,但是,windows总给人一种侵略性或者略微有些丑陋的感觉,好比那个庞大可怕的vista。而google像是继承了unix的简约哲学,但是简约不代表简单,就像google的主页,那个搜索输入框后面,是众多庞大的服务器集群,一群高智商的专家团队,以及众多的拥护者鼓吹者。google以及apple,都不仅仅是一个IT公司,而是一种文化现象。很难想象,如果微软在北京开个专卖店,会有人在前一天晚上去排队等候,可是apple就能做到这一点,google虽然不卖硬件,但是,当google推出某个服务需要邀请,那种热闹劲不亚于苹果店排队。

    好了,先写到这吧,如果有时间,再写一些不那么通用的。

  • 都市生存手册

    都市生存手册

    当你听到电话中,任何女性(尤其是老婆/家人/女朋友/亲密朋友,也可能是男性):

    * 正和你本人在一起,和已过世的人在一起,和出差/出国的人在一起,和任何不可能的人在一起,在XX地点……
    * 任何不可能、异常、蹊跷的事
    * 跟你借钱,急用
    * 电话异常挂断 (一定打回去,不能再通就更紧急危险)

    这是求救信号!立刻报警!救援!

    * 不要以为她疯了,不要骂她有病,不要说她明明有钱,不要说出你和她的真实关系或任何实际情况(以防是被迫用手机扬声器或是免提电话)
    * 记住任何与地点信息(如在XX吃饭,XX商场—很可能在车库遇到危险;家—很可能入室抢劫)
    * 她没说地点要尽量问详(在X家,问X哪个家,尽避X可能就一个家),她不正面回答要用只需表示肯定否定的一般疑问句尽量问出来

    (btw,如果平时手机要没电了打电话时先说明,既是尊重对方也免得让对方误会或担心你有紧急情况。当然尽量不要让手机处于这种状态,耽误事且辐射比满电大n多倍)

    遇到明显异常的信息时,多一份留意,因为你的朋友正在向你呼救!尤其是你,需要多小心了!

    一、敏感身边异常现象

    一妇女被劫持,正好其老公打电话过来,她在电话里应付了一通,说正与她妈妈外出。 随后警察赶到,终于得救。原因即在于,她妈妈早已去世,她丈夫即意识到存在问题。 而遗憾的是,我们多数人,没有这样敏捷的反应能力和应变能力。

    附件是个事例,前不久在深圳也发生过一起类似事件:

    一男驾车被绑架,他与歹徒周旋说没钱,只是小白领,歹徒要其打电话跟家人、朋友借。他很机警的跟家人、朋友每人借三、五千,当然有朋友立刻反应过来,他不可能找他们急借这么点钱。 结果他姐姐在大呼 “你还跟我哭穷,你刚赚了钱”,一朋友也大叫”你小子一顿饭就 花三、五千” 等等,——酿成惨重后果。所以遇事务必保持冷静,设法周旋,向外传递信息。 若遇到明显异常的信息时,多一份留意,因为你的朋友正在向你呼救。

    二、警惕入室盗窃

    昨夜遭遇持刀盗贼入室行窃,此刻我仍然惊魂未定,这是我亲身经历的事情,想给我身边的每一 位朋友一个警觉,永远不要以为很多事情不会降临自己的身上,永远不要以为自己总是幸运的那一个,危险总是出现在我们丧失警觉的时候。

    首先交待一下出事的地点及背景:为了迁就公司搬到了北四环以及照顾周末在北大读书人的老公,我们在望京的新家还没有装修好之前,租住在北大中关园教工宿舍,我家是在2楼。

    就在这里 7月26日凌晨3点左右,本来打着微微鼾声的先生突然说:” 老婆你听到什么声音了吗”? 迷迷糊糊的我说 ” 没有啊” 但是紧接着,先生喊了一声”嘿,干什么”,我也应声而起 ” 嘿” 。当时恐惧和正义的力量让我的声音非常大。

    先生迅速关上卧室的门并反锁,两个人迅速穿上衣服,我走到凉台把窗户打开,当时想要是歹徒不要命的闯进来,我跟先生可以从窗户逃走,避免跟他搏斗。但是很快冷静下来,先生从阳台上喊保安,我开始打110。

    110啊110这个从小被我熟记的救命电话号码,这个被我心中神圣而威严的保护伞,在我用手机拨了10几次后,仍然没有人工接通的迹象,电话接通后出现电脑声音, ” 这里是110报警台”然后持续44秒之后自动挂断,始终没有人应答。此刻,先生的手机不在房间内,卧室内也没有固定电话。

    我急中生智,走到卧室门口隔着门大声说:
    “喂喂,110我要报警,嗯嗯 。。,我这里有人入室盗窃,目前盗贼还在室内,嗯嗯,是的,请马上过来吧” “我的地点啊,地点在北大中关园,XX楼,X单元,对对对,就是方正大厦的后边,好好,多长时间赶到,嗯好,你们马上赶到是吧,,嗯嗯,好好,我明白”” 谢谢你们” 而其实这一切都是我在自言自语。

    我走到阳台跟先生小声说,我 110压根没打通,刚才诈一下歹徒。然后两个人坐在床上,先生一个劲的对我说: “老婆,你看你平时老是不爱关窗户,万一我出差不在家,你怎么办啊” 我无言,只有惊恐,心里默念请菩萨保佑。

    就这样大概过了将近20分钟,我们听着好像没有动静了,也担心是不是自己听错了,想着歹徒听了我之前的诈报警应该已经逃走了。彼此小声会意了歹徒可能藏身的地方,因为门口的左边就是家,在客厅门口和家门之间有个可以挂衣服和放鞋子的衣架,我们确信歹徒很可能藏身在衣架的后面。老公抄着凳子,但是我的武器只有是阳台上的木头衣架了,于是先生迅速打开门,凳子朝着衣架方向抡去,没有动静,我们打开客厅的灯,这个小小的1室1厅就尽收眼底了(房子是个长方形,北边是厕所,厨房,中间是小客厅,南边是卧室,卧室外面是凉台,南北通透,盗贼就是从厨房进来的)。

    我走进厨房,发现原来放在厨房窗台上的两层小架子(平时会放一些洗菜的盆子方便面什么的)已经被移动到地下,我很佩服盗贼的技巧,居然把我很辛苦放在那里的小架子就轻易的挪到地上。厨房的窗户开着,先生的笔记本电脑和我的一个真皮手提包放在地上,先生的手机放在我的手提包。

    回头看到客厅,果然在衣架的旁边,先生的西装在地上,厨房的菜刀也在那里。 天哪,如此胆大的盗贼,如此凶残的盗贼。

    先生的笔记本电脑原本是在卧室的桌子上的,盗贼居然从我们的床前明目张胆来回取走了笔记本电脑。此刻又注意到卧室门口有一条毛巾,那绝对不是我们的毛巾。后来分析是歹徒放在客厅门边,以 备主人发现关门,不能关死,这样他才可以顺利逃脱。

    天哪,我开始回想今晚的一些反常迹象。我跟老公11:00多钟睡觉,大概凌晨2点多钟。感觉蚊子特别多,先生自责可能是自己放进来蚊子。而其实入夏以来,我们的房间里面还从来没有过一个蚊子。猜想盗贼可能1点多钟就已经开始进入厨房了,厨房的窗户开着放进来了蚊子。由于被蚊子咬醒了,先生起身给他还有我抹了花露水,过了一会,我还是睡不着,没开灯去了洗手间,推算大概2:20左右,这时发现卧室门口有个包,当时迷迷糊糊的我也没在意,反而把包挪了一下放在旁边,心里嘀咕是不是老公没把包放好,怎么可以放在门口的路上。从洗手间往卧室里面走,发现地上有个东西,由于我是高度近视也没想什么东西,想着可能是什么东西掉了,懒得拣了,踢到了旁边,事后发现那是歹徒的毛巾,防止门被锁死的。

    先生用他的没被盗贼偷走手机终于拨通了110,3个防爆警察10钟之内就赶到了,这点我稍感欣慰,看到他们手中的枪,觉得踏实多了,可惜之前110 没有打通;小区保安随后也来了,过了1个多小时,刑警来了,现场取了指纹,拍照,询问了事情发生的经过。说抱歉来迟了,因为派出所的人都出去 —— 到一个自杀现场去了,天哪,我没想到身边会有这么多的事情。之后刑警帮助我们总结的如下经验:

    1. 110的系统是从总局到分局分层下达的,偶尔110系统也会出问题,出现我之前无法到达人工接听的情形,或者110非常繁忙无法及时接听,应该记得管辖派出所的电话,直接打派出所的电话是最快最好的方式。所以请大家牢记自己所在派出所的电话,避免出现紧急事务无法到达110的情况。

    2. 晚上的门窗务必关好,天再热也不能放松警惕,盗贼就是这样乘虚而入的,不要以为这样的事情离你很遥远,其实盗贼就在你身边。

    3. 遇到入室盗贼尽量不要与其搏斗(除非你是警察或者有专业搏斗训练),按照刑警的经验,盗贼都是持刀入室的,前不久颐和山庄一个保姆发现盗贼入室而被刺死。并非不信任我们的警察侦破能力,这样的被害与虚意被谋杀是两回事情,除了现场指纹等,没有什么有效的线索帮助他们破案了。我们的生命远远贵重于我们的财产。提醒在遇到事情的时候首先自保。比如我们迅速关上反锁卧室门,而不是急于求证歹徒是否被吓走,或者与歹徒正面冲突。

    4. 遇到事情不要惊惶,不防对歹徒使诈,事后刑警说我当时自言自语的电话,吓唬盗贼起了很大作用。

    5. 尽量不要破坏案发现场,然后报警。

    此刻的我想起客厅衣架旁边的菜刀,确信我去厕所的时候,歹徒就藏匿在那里并用先生的西装作遮挡(后来发现先生的西装是在地上的),我们去完厕所,盗贼等我们熟睡后准备逃离时候,被我们发现。一直庆幸我们去洗手间的时候没有发现持刀盗贼。万一当时惊动盗贼,生死未卜,此次钱物基本没有丢失,人身没有受到伤害,但是我昨夜难以入眠,此刻仍然惊魂未定。我检讨自己的大意,检讨自己总以为很多事情不会发生在自己的身上,事情绝非如此,无论何时当我们放松警惕的时候,危险可能就在我们身边。洋洋洒洒千言,并非危言耸听而是我亲身经历的事实,提醒我得朋友提高警惕,希望每个人都平平安安。请朋友们互相转告,一定注意安全。

    三、当事人已经够笨了,警察更笨

    5月7号,我们单位有一个女生,在家里被人入室抢劫,身中13刀!肺被扎穿,经抢救终于活过来!同事去看她,带回她惊险的故事,我听了以后双腿发软、双腿发软。不是我脆弱,实在是太 可怕了!

    这个女生一个人租住在一个比较老旧的小区,被歹徒盯了一个多月。夜里俩点歹徒用钥匙打开她的家门,把她掐醒、蒙上双眼、索要钱财。她一直合作,冷静而机智的与歹徒周旋,凌晨四点歹徒把她绑起来说是要出去联系买主把她的车卖了。这个女生在半小时后确认歹徒已经离开,挣扎着松绑、报警、给自己的弟弟打电话,然后吓木了的她在家里等待警方支援(这是她的致命失误!!)谁知歹徒又回来了,俩人在客厅面对面撞上了!

    歹徒惊慌失措,气急败坏质问她是否报警,她极力否认说只是给家人打了个电话搪塞过去。突然电话铃响了,她接,是110的确认电话。这个女生仍冷静机智,说”妈妈,我没事,我平安到家了”,谁知110的笨蛋一点都没职业素质,说:我不是你妈,是110,你刚才是不是报警了?我们确认一下!(天哪,这个笨蛋!害死人哪!以后有危险谁还能相信警察?!)女生重复说妈妈我没事,你放心吧,把电话挂掉!

    歹徒已经起疑,女生陷入生死境地!这时候家里的电话又响了!是弟弟打来的!歹徒接了电话,弟弟以为是警察,说找***,然后问姐姐,忘了姐姐家在哪个桥拐了(这个慌乱糊涂的弟弟哟,就是这个电话害了姐姐呀)。可怜的姐姐又在编:**老师,我从老家回来太累了不太舒服,明天不上班了,跟您请个假!那个弟弟不明所以:我是弟弟呀我就问你在哪个桥拐?姐姐只好说**桥——话还没说完,歹徒按下电话丧心病狂地朝她猛扎!这个女生先还反抗,后来只能装死,直到歹徒离去……

    三分钟后,警察赶到!在外面敲门说是接到报警电话。可怜的女生忍着剧痛爬去开门,警察看见 地上躺这一个浑身是血的人,第一句话是:还是个大案!(我靠)女生报出自己的车号叫他们拦截歹徒,他们无一人出门侦查追踪!女生又让他们叫救护车,然后,弟弟终于赶到……

    警察打电话确认确实是现在的工作方式。因为110是总台,110接到报警电话后会转到出事地点的片警。但现在看来对于这类入室抢劫的案子还电话确认是有问题。我以前也没想到过类似问题。

    注意:歹徒 tmd 拿钥匙开门。看来还是需要一个插销之类的东西才保险。在家被抢后,换个地方等警察,人多的公共场合,也可以找邻居。

    经验教训:

    1,这样要紧的电话一定要打给很熟悉自己近况的人,而且反应要快。警察往往不可靠。
    2,派出所或者公安局的电话一定要记牢,110有时候也不管用。不过可以考虑119。

    昨晚我参加一个的安全防范的研习会,让我很惊叹!这场研习会是由一个叫Pat Malone的人主持,他是知名人士的保镳,也为FBI工作,并教授警察及海军的SEALS徒手格斗。

    以下建议非常实用,多看几次,受用无穷!

    1. 警方的提醒 : 手肘是身体最有力的部位。距离够近,就善用手肘!

    2. 假如歹徒向你要皮夹或钱包,不要递给他,而是往远处丢去。歹徒很可能 对财物比对你有兴趣,他会去拿皮夹或钱包,这是你逃跑的机会。 往反方向拼命跑!

    3. 假如被丢进车子的后备厢:把车后灯踢破,手从洞中伸出去,用力挥手,驾驶人看不到你,但是其他人看得到。这个方法救过无数人命。

    4. 女性常常在购物、吃饭及下班後进入车子,然後就坐在驾驶座上处理事情(如记帐、列清单等)。千万不要这么做! 歹徒会藉机观察情势,闯入车内,拿枪威胁,控制你的行动。进入车内,立即锁门,驶离现场。

    5. 在平面停车场及立体停车场的几个注意事项 :

    A. 要警觉: 环顾四周;察看车内的副驾和后座。(接近车子时,留意车底。)
    B. 假如你的车停在箱型车旁,则应该从副驾车门进入你的车子。许多连续杀人犯都是趁著女性要进入车中时,将她们拖进箱型车中加害。
    C. 观察停放在你左右两边的车。如果有男性单独坐在最近的邻车内,最好回到购物中心或办公室,找男同事、保安或警察陪你回去。 宁愿防患未然,也不要终生遗憾。 (大惊小敝总比丧命好。 )

    6. 永远搭电梯,不要走楼梯。(楼梯间是一个可怕的地方,容易让人形单影支,变成最好的犯罪场所。)

    7. 假如歹徒有枪而你并没有受到他的控制, 一定要跑! 一百次中,只有四次歹徒会袭击逃跑的目标;即使他攻击你,大多不会是致命的部位, 要跑!

    8. 身为女性,我们总是发挥同情心: 不要再这样! 这样会增加被强暴或是杀害的机会。一个叫泰得 · 邦迪(TedBundy)的连续杀人犯就是一个相貌堂堂并且受过良好教育的人,总是利用女性的同情心。他走路时带著一根手杖或是跛行,经常要求别人“帮忙 ”他进入车内或是看一下他的车子,趁机绑架受害者。

    最近有人告诉我,他的朋友在晚上听到门口有婴儿在哭,不过当时已经很晚了,而且她认为这件事很奇怪,於是她打电话给警察。警察告诉她:“无论如何,绝对不要开门。”这位女士表示那声音听起来像是婴儿爬到窗户附近哭,她担心婴儿会爬到街上,被车子碾过。警察告诉她:我们已经派人前往,无论如何不能开门。警方认为这是一个连续杀人犯,利用婴儿哭声的录音带,诱使女性以为有人在外面遗弃婴儿,骗她们出门察看。虽然尚未证实此事,但是警方已经接到许多女性打电话来说,他们晚上独自在家时,听到门外有婴儿的哭声,请将这个消息传给其他人,不要因为听到婴儿的哭声而开门。

    请严肃看待 , 因为上礼拜六“美国头号通缉犯”(America’s Most Wanted)节目中,报导路易斯安那州的连续杀人犯时 , 提到了“哭泣婴儿”的假设 。

  • 简单设计、傻瓜式编程

    入行已经五年,不敢说自己资格老,不过也算做了一些东西。

    平时工作用的工具是Visual C++,开发语言自然是用C++。

    C++是个很有意思的东西,你想多复杂,它就能多复杂,你想简单,那也很容易,高级特性少用就是了。

    C++最新的0x标准即将推出,不过我们公司基本用不上那些高级特性。作为一个没啥资格说C++好坏的开发者,只能简单谈谈自己的感想。

    语言再强大,它只是一个工具,目的就是要完成一个任务一个工作,这是它的本分,也是程序员的本分。忘记这个本分,就是一种失职。

    有的人爱比较某个语言和另一种语言的强弱对比,得出某某语言很好、应该学的结论。好好笑哦。

    牛逼的人,用汇编语言都能写windows内核。一般的人,用basic也能编出赚大钱的商业软件,那么你能说牛逼人就比一般人强么?有没有人会说开宝马的一定比开大货的更懂汽车,也许开宝马的只是二奶,开大货的都能自己修理汽车。为何到了编程这方面就变得如此没有逻辑?变成工具反而决定人了呢。

    编程里经常碰到很多问题,有自己的,也有遗留的。经常看到有些开发者炫技,弄些莫名其妙的技巧出来,反而画虎不成反类犬,这样的地方变得非常容易出问题。比如说,把一些内联函数的代码写在一行之内,搞得好像这样就会跑的更快。或者是函数写上几百行上千行,好像这样就显得思维敏锐,好不混乱啊也么哥。所以说,bug多数不是因为水平低,而是因为水平不高不低造成的。bug多数出现的地方是在设计阶段,而不是编码阶段。每个开发者都应该学习一下“重构”的思想,时刻牢记“unit test”,时刻记得把代码的感觉变得优雅。有些做法也许看上去笨拙,但是更容易维护,更容易理解,这也是我这么多年的经验。

    编程就是一种工作,可以说有些艺术家的成分在里面,但是大多数时间还是要简单简单再简单。如果自己写的代码,外行都能看懂,那就是最高的境界了。 我是准备往这个方向发展,嘻嘻嘻。