Kestin's profile前朝记忆渡红尘, 伤人的不是刀刃,是你转世而来的...PhotosBlogListsMore Tools Help

Blog


    February 21

    ORA-12154 or ORA-6413 Running 32-bit Oracle Software on 64-bit Windows OS

    Applies to:

    Oracle Net Services - Version: 8.1.7.0 to 10.2.0.1
    Oracle Data Provider for .NET - Version: 8.1.7.0 to 10.2.0.1
    Oracle Objects for OLE - Version: 8.1.7.0 to 10.2.0.1
    Oracle Provider for OLE DB - Version: 8.1.7.0 to 10.2.0.1
    Oracle ODBC Driver - Version: 8.1.7.0 to 10.2.0.1
    Microsoft Windows XP (64-bit Itanium)
    Microsoft Windows Server 2003 (64-bit Itanium)
    Microsoft Windows XP (64-bit AMD64 and Intel EM64T)
    Microsoft Windows Server 2003 (64-bit AMD64 and Intel EM64T)

    Symptoms

    You are attempting to connect to the Oracle database from a Windows platform using one of the following programmatic interfaces

    • ODBC
    • OLEDB
    • OO4O
    • ODP.NET

    after installing 32-bit Oracle client software on a 64-bit Windows operating system (OS) you receive one of the following errors:

         ORA-12154: TNS:could not resolve the connect identifier specified

            or

         ORA-6413: Connection not open.

    Cause

    64-bit Microsoft OS's install 32-bit applications into the following location

     "C:\Program Files (x86)\..."

    rather than the typical location of

    "C:\Program Files\..."

    This causes an existing networking bug to occur where the networking layer is unable to parse program locations that contain parenthesis in the path to the executable which is attempting to connect to Oracle.

    The following bug has been filed to correct this behavior:

        Bug 3807408 CANNOT EXTERNALLY AUTHENTICATE USER WITH QUOTE IN USERNAME


    Additional Information
    -----------------------

    The reason you receive an ORA-12154 vs. an ORA-6413 is generally due to which programmatic interface you have chosen to use to connect to Oracle.

    The ORA-12154 is the typical error seen when connecting with up-to-date interfaces using the latest version of the Oracle Call Interface (OCI):

    • Oracle ODBC Driver
    • Oracle Provider for OLE DB
    • Oracle Objects for OLE
    • Oracle Data Provider for .NET (ODP.NET)
    • Microsoft's .NET Managed Provider for Oracle

    The ORA-6413 is typical of using older interfaces which make legacy API calls such as Oracle's OCI Version 7 API:

    • Microsoft ODBC Driver for Oracle
    • Microsoft OLE DB Provider for Oracle

    Solution

    To resolve this problem try either of the following solutions:

    SOLUTION 1:

    • Use a version of the Oracle client AND database software that contains the fix for Bug 3807408.  This fix requires that both the client and database software be patched.

          NOTE:  Currently this bug has not been resolved.  See SOLUTION 2 for now.

    SOLUTION 2:

    • Find the location of the application that is generating the error.  Check the path to this location and see if it contains any parenthesis.  If so, you must relocate the application to a directory without any parenthesis in the path.

    SOLUTION 3:

    Start the application using the short name version of the directory paths.  For example for the DTS Wizard in SQL Server 2005, run it using this command prompt:

    C:\PROGRA~2\Microsoft SQL Server\90\DTS\Binn\dtswizard.exe

    2007高校BBS上20个睿智的冷笑话

     1.真正的浪漫求婚应该是这样的:一位风度翩翩的男子请了10位同事吃饭,其中就有他心仪的mm。吃到一半时,他忽然站起来走到mm身旁,然后把mm坐的椅子整个搬了个90度面朝自己,而此刻mm嘴里塞满了各种食物……这时,他突然从兜里掏出4沓钱说:“这是4万元订金,你愿意嫁给我吗?”mm当即就惊呆了,激动的泪水夺眶而出,她呜咽着掏出验钞机,片刻后说:“这些都是真的——我愿意!”(同舟共济)  
      2.刚刚到火车站买票,结果却空手而归,路见一宣传标语:成都是一个来了就不想走的地方。现在终于明白这句话的“含义”了!成都,今夜请将我送上火车!(蓝色星空)  
      3.获奖通知:在校长的领导、教务处的支持、后勤部门的配合、指导老师的教诲下,我校三位同学获得由天津各高校举办的**杯作文竞赛一等奖。由于篇幅有限,获奖同学姓名将另行通知!(我爱南开)  
      4.四个学生在宿舍里打麻将,突然警察破门而入,把五个人都带走了……(北大未名)  
      5.加爵曾私下对我说:“钝到极点的刀才最具杀伤力——因为它是锤子!”(天涯大学校园)  
      6.售票员拼命地把最后一个乘客推上车后,乘客好心地回头劝道:“大姐,您就别挤了,实在上不来咱就等下趟车吧……”(水木社区)  
      7.学校招聘会上,米其林(就是做轮胎的)的一道笔试题:为什么鸟站在高压线上不会触电?  
      我寝室一同学回答:因为它穿着米其林牌橡胶鞋!  
      结果他是全校唯一被录用的本科生……(饮水思源)  
      8.大学军训时遇一教官,全班被他“修理”得很惨。军训结束,为庆祝解放,大家热情地把敬爱的教官抛向空中,当他幸福地下落时,却发现下面的人都已经走光……(饮水思源)  
      9.舍友:嫦娥为啥要急着奔月?
      我:后羿一射九日,就算神仙她也受不了啊!!!   (我爱南开)  
                10.那晚,有一场欧洲足球赛事将在凌晨2时现场直播,作为球迷,不容错过。可我又不能一直等到那时候,想先睡一会儿,于是我告诉老婆到时候千万要叫醒我。老婆说:“球赛一般会在第二天重播,何必为了看直播而耽搁休息呢?”我拿眼瞪她:“直播好比头婚,重播好比二婚,你说我该看直播还是该看重播?”老婆不吱声了。   睡得正香,突然被老婆掐醒:“快起来,球赛开始了。”当时我睡意正浓,就说:“还是明天看重播吧!”老婆一把拧住我的耳朵,厉声道:“怎么,你想二婚?”
            11.中国某商业巨片在日本译名为:《超爆乳   后唐の高级娘·狂喜乱舞黄金の铠甲》&《近亲相奸·义母の菊花哀号悲鸣五代十国编》。(水木社区)  
      12.隔壁那小子终于发誓要减肥了——毕业招聘会上,有人对他说了句:“哥们,让一下,你挡着我的手机信号了。”(水木社区)  
      13.一头猪对另一头猪说:“人家都说我们是猪,咱们还是分手吧!”(北大未名)  
      14.昨儿偶去鞋城逛,见一夫妇指着一双皮鞋问多少钱。  
      售货员:240。  
      夫妇:能便宜点吗?  
      售货员:看你们诚心买,那就省个打车钱吧!  
      夫妇:打车回北京???(紫丁香)  
      15.一新生在哈尔滨下火车时被掏包,正沮丧间,见不远处有人在向他招手。等他跑过去时那人已经不见了,地上却放着刚才他被掏的钱包,他赶忙打开查看,发现除了钱之外,身份证、银行卡、尤其是新生报到证等东西竟然都还在!旁边地上还留着一行楷体粉笔字:生活虽艰,盗亦有道!(紫丁香)  
      16.出门逛街,发现一店铺里挂满了各式各样的衣服,门口玻璃上贴着:开店大酬宾,高档西服30元/套,衬衫5元/件……心中莫名高兴:这么好的事情终于被我赶上了!于是急着往里冲,就在进门的一瞬间抬头看到:干洗店!(水木社区)  
      17.今天我去学校领了毕业证书,高兴之余拉住一路过的哥们问道:“哎,这学校叫什么来着?”   那哥们瞪了我一眼,狠狠地说道:“我怎么知道,我才上大一!”(天涯开心乐园)  
      18.辛苦工作一天,每天回窝推开房门时总有一丝期待:突然一个人从门口跳出来,嬉笑着迎上来把我眼蒙住……当然是乱想啦*^_^*,真有的话许会是贼~(北大未名)  
      19.新生开学,一哥们背着行李来我们宿舍,他问一躺在下铺睡觉的舍友:“你上铺没人住吧?”那睡觉的哥们迷迷糊糊的也没在意,随口说了句:“没有~”那哥们听了使足全身的力气把一大包行李扔到了上铺——结果上铺没床板!(水木社区)  
      20.我一高中同学写《再回母校》为命题的作文。  
      其中片断:我开着名贵跑车,傍着小蜜,回到母校。回母校揍嘛来了?来捐款呗!学生老师夹道欢迎,校长的脸都笑滥了,他高呼:“欢迎吴百万同学再回母校!”  
      老师看后评语写道:异想天开,不切实际,拿回去重写!  
      重写内容:我骑着飞鸽牌自行车,吱吱啊啊地驮着老婆小孩回到母校。揍嘛来了?拉赞助来了!校长皮笑肉不笑地说:“现在学校的经费也紧张啊”。最后,只有昔日的语文老师同情地甩给我50元,并一再叮嘱:“要重拾生活信心,好好再就业!”  
      老师看后评语写道:立意深刻,文笔朴实,少见的佳作! 
     
    February 16

    .net 2.0 x64 与 Oracle

    windows x64 with .net 2.0 x64 中
    如果安装了Oracle Client x86,使用.Net访问oracle数据库会得到错误提示
    System.InvalidOperationException: 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ---> System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
     
    解决办法,在安装了Oracle Client x86之后再安装Oracle Client x64
    .Net就可以正常访问了。。。
     
    但是PLSQL又不支持Oracle Client x64
    如果修改注册表到Wow6432Node后PLSQL会报如下异常
     
    Initialization error
    Count not load "c:\oracle\product\10.2.0\client_2\bin\oci.dll:
    OracleHomeKey : SOFTWARE\ORACLE\KEY_OraClient10g_home2
    OracleHomeDir: c:\oracle\product\10.2.0\client_2
    found: oci.dll
    Using: c:\oracle\product\10.2.0\client_2\bin\oci.dll
    LoadLibrary( c:\oracle\product\10.2.0\client_2\bin\oci.dll) return 0
     
    ----------------------------------
    发现如果只安装x64的oracle,也会报告如下错误
    查资料得知是 Machine.config 中的设置需要改变
     
        <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" />
            <bindingRedirect oldVersion="2.0.0.0-10.9.9.9" newVersion="2.102.3.2" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
        
    修改为
        <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" processorArchitecture="amd64" />
            <bindingRedirect oldVersion="2.0.0.0-10.9.9.9" newVersion="2.102.3.2" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
     

     
    February 15

    Using PL/SQL Developer on x64

    PL/SQL Developer不支持x64的oracle(提示Oci.dll不识别)
    PL/SQL Developer is not support Oracle Client x64
     
    但是支持连接Oracle 32-bit 装在 windows x64上
    but support Oracle Client x86 on windows x64
     
    安装Oracle 10g(10.2)之后,使用SqlPlus连接正常
    After installed Oracle 10g(10.2) client x86, SqlPlus work fine
     
    使用PL/SQL之后,提示12154错误
    but when logon oracle on PLSQL Developer, it show error Ora-12154
     
    导致该问题是因为PL/SQL安装在c:\Program Files (x86)\PLSQL Developer
    Reason : because it installed at [C:\Program Files (x86)\PLSQL Developer]
     
    而不是C:\Program Files\PLSQL Developer,重新安装就一切正常
    after re-installing it to "C:\Program Files\PLSQL Developer", everything works perfectly...
     
    该死的PL/SQL,居然还验证这个
    fxxk PLSQL Developer
     
     
    Question:
    I just got new HP xw6200 workstation at work but can't get PL/SQL to connect to oracle (I allways get ORA-12154 error)

    Oracle tnsping works, Network Configuration Utility sucessfully tested connection, SQL*Plus works...

    config:
    * WindowsXP professional x64 edition
    * CPU Intel Xeon 3.4GHz
    * tested both PL/SQL v5.1.6 & v6.0.5
    * tested Oracle clients 9.2 & 10.1
    * Oracle server is 9.2.0.4.0

    Is PL/SQL's not compatible with x64 or should I continue searching somewhere else?

    Thnx for any info...
     
    Answer:
    Just found what is wrong!!! Damn M$...

    PL/SQL as 32bit application is by default installed on x64 system to
    "C:\Program Files (x86)\PLSQL Developer"
    after re-installing it to
    "C:\Program Files\PLSQL Developer"
    everything works perfectly...

    狼的智慧始终与行动并存

    对付自然环境的恶劣,狼有着和人一样的顽强
    专一的目标是狼群默契配合的完美体现
    狼的生存能力已经超越了人的深层意识
    狼最关心什么对集体最有利,人却望尘莫及
    失败的阴影,改变不了狼对成功的渴求
    真情流露,使狼有着相互的理解和信任

     
    自信
    它是源自对敌我双方的了解,是一种对胜利的把握。
    狼在拼搏时所表现的英勇顽强,舍身忘死,正是因为自信及对胜利的渴望。
    有时,成功者只是比失败者多一些自信而已,所以狼永远是自信的。
    不攻则以,一攻必胜,狼在每次围捕中,很少有无攻而反的,更多的是胜利。
    在狼的幽深的双眼中,我们看到的是自信,他让人恐惧,在那一声声的狼嚎中,我们听到的是自信,他让人颤栗,其实,狼就代表着自信。
     
    勇敢
    狼是最勇敢无畏的,这种勇敢无畏让所有的对手都感到畏惧。
    狼也许会被打败但永远不会被打倒。
    即使只剩最后一匹狼,他也会勇往直前地与对手拼博。
    狼不会因为对手的强大而有任何的畏惧,更不会退缩。
    勇敢是每匹狼与生俱来的品质,是一种世代传袭的优良品德。
    这种勇敢不是勇猛无谋和不自量力,而是一种为了胜利而不顾一切的自我牺牲精神。
    更是一种自信。。。

    不屈
    狼绝对是不可驯的,宁死不屈是狼的天性。
    他们永远不会像狗一样,为了博得主任的宠爱和施舍,摇头晃尾,甘为仆人。
    狼的自由、独立和尊严是神圣不可侵犯的。
    狼绝大多数是战死的,他们不屈不挠的按照自己的意志生活,甚至不惜以生命为代价,来抗击几乎不可抗拒的外来力量,所有的屈辱将化作那旷野中一声声的引颈长啸。

    敏锐
    狼的嗅觉异常灵敏,善于捕捉机会,狼的嗅觉比狗强10倍,十里八里之外的猎物,经他一嗅,立马就能嗅到。
    在大草原上,狼无时无刻不在注视着他们的主要目标。
    窥视着猎物的活动规律和状况,一有机会,马上出击。
    眼观六路,耳听八方,有时候注视一个目标,甚至几个小时都保持一种姿势,从不轻易漏掉任何一个细节,这种耐心和专注非常让人敬佩。
    在没有了解对手状况之前,狼是不会轻易的对猎物进行攻击的。人们常常形容恶狼似的眼睛......

    速度
    狼的反应非常迅速。
    狼一旦发现猎物,会毫不犹豫地立即扑向猎物,而且不达目的决不罢休。
    狼在围猎布置战术时,随时会根据场面的情况迅速作出改变,随机应变。
    在紧张激烈的追捕当中,狼会集体保持自己的速度。
    当一只狼疲惫的时候,就会马上退到队伍的中间做适当的调整。
    其他的狼迅速冲上最前面,这样轮流的保护,狼的队伍永远都是保持最快的速度。狼在最佳时机出击,保存实力,麻痹对方,并在其最不易跑动时,突然出击,置对方于死地...
    February 14

    Oracle 数据库对x64的支持情况

     

    问题:各个版本的 Windows 都支持哪些版本的 Oracle 数据库?

    解答:

    Oracle Database 10g (10.1) 支持的 Windows 操作系统
    企业版(服务器) Windows 2000/XP/Server 2003
    标准版(服务器) Windows 2000/XP/Server 2003
    个人版 Windows 2000/XP/Server 2003
    客户端 Windows 2000/XP/Server 2003

    Oracle9i Release 2 (9.2) 支持的 Windows 操作系统
    企业版(服务器) Windows 2000/XP/Server 2003
    标准版(服务器) Windows 2000/XP/Server 2003
    个人版 Windows 2000/XP/Server 2003
    客户端 Windows 2000/XP/Server 2003

    Oracle9i 版本 1 (9.0.1) 支持的 Windows 操作系统
    企业版(服务器) Windows 2000/XP
    标准版(服务器) Windows 2000/XP
    个人版 Windows 2000/XP
    客户端 Windows 2000/XP

    Oracle8i 版本 3 (8.1.7) 支持的 Windows 操作系统
    企业版(服务器) Windows 2000
    标准版(服务器) Windows 2000
    个人版 Windows 2000
    客户端 Windows 2000

    注意:
    Windows 2000 支持表示支持专业版、服务器版、高级服务器版和数据中心版。
    Windows XP 支持指的是支持专业版(32 位)和 XP 2003(64 位 Itanium)。 Oracle9i 版本 2 以及更高版本支持 Windows XP 2003。
    Windows Server 2003 支持指的是支持标准版、企业版、数据中心版、Web 版本(32 位)以及企业版和 Datacenter 版(64 位 Itanium)。
    Oracle 不再支持 Windows NT 和 Windows 98。
    Oracle 标准版支持包括对标准版本 1 的支持。
    有关操作系统支持的更新信息,请访问 Oracle Metalink

    问题:Oracle 是否支持 Itanium 上的 64 位 Windows?

    解答:是的,Oracle 数据库支持 64 位 Windows Server 2003 和 XP 2003,可从 OTN 下载。Oracle 是第一个对外发布用于 64 位 Windows Itanium 平台的数据库软件的供应商,时间为在 2000 年 12 月。Oracle9i Database 版本 2 是 64 位 Windows 支持的第一个生产数据库。

    Oracle 是否支持针对 AMD64 和 Intel EM64T 的 Windows x64 (x86-64)?

    解答: 有关认证信息,请参阅下表。

    Oracle 数据库 10g (10.2) 版本 2 支持的 Windows 操作系统
    32 位数据库服务器和客户端 32 位 Windows
    32 位数据库服务器和客户端 64 位 Windows x64
    64 位数据库服务器和客户端 64 位 Windows x64

    Oracle Database 10g (10.1) 支持的 Windows 操作系统
    32 位数据库服务器和客户端 32 位 Windows
    32 位数据库客户端 64 位 Windows x64

    Oracle9i 版本 2 (9.2) 支持的 Windows 操作系统
    32 位数据库服务器和客户端 32 位 Windows
    32 位数据库客户端 64 位 Windows x64

    注意:
    32 位 Windows 由使用 AMD64 和 EM64T 的 32 位 Windows 操作系统系列组成。
    Windows x64 上的 32 位 Oracle 数据库客户端有望于 2005 年 4 月底推出。不支持 Windows x64 上的 32 位 Oracle 数据库服务器。
    Windows x64 由两个操作系统组成: Windows Server 2003 x64 版本(标准版、企业版、数据中心版)和 Windows XP Professional x64 Edition。

    有关操作系统支持的更新信息,请访问 Oracle Metalink

    Oracle 率先公开发布了用于 AMD64 和 Intel EM64T 芯片集的 64 位数据库开发人员版。

    VS.Net 2005 SP1 无法创建或打开ASP.Net项目解决办法

    导致原因:安装SP1之前未安装 Microsoft Visual Studio Tools for the Microsoft Office System
    在安装.net 2005时,如果未没有安装智能设备编程的话,就不会安装该组件
     
    解决办法:
    添加.Net组件,把 智能设备编程 装上去
    或则从 安装盘\wcu\VS Tools for Office 中安装该组件
     
    然后重新运行SP1补丁,等待其完成即可
     
    这样安装完成之后,可能在  文件->新建->网站 中看不到这个项目类型,
    但是可以从 文件->新建->项目 中看得到
     
    February 13

    单元测试之道C#版 第一章

    Trackback from www.cnblogs.com/chinasf

     单元测试之道C#版
    [美]Andrew Hunt Davrd Thomas 著 ,陈伟柱 陶文 译

    第1章      序言

    1.       自信的编码

    有一次——或许就是上个礼拜二——有两个开发者:Pat Dale。他们面临着相同的最后期限,而这一天也越来越近了。Pat 每天都在着急地编写代码,写完一个类又写一个类,写完一个函数又接着写另一个函数,还经常不得不停下来做一些调整,使得代码能够通过编译。

    Pat 一直保持着这种工作方式,直到最后期限的前一天。而这时已经是演示所有代码的时候了。Pat 运行了最上层的程序,但是一点输出也没有,什么都没有。这时只好用调试器来单步跟踪了。“Hmm,决不可能是这样的”,Pat 想,“此时这个变量绝对不是0 啊”。于是,Pat 只能回过头来看代码,尝试着跟踪一下这个难以琢磨的程序的调用流程。

    时间已经越来越晚了,Pat 找到并且纠正了这个bug;但在这个过程中,Pat 又找到了其他好几个bug;如此几次过后,bug 还是存在。而程序输出那边,仍然没有结果。这时,Pat 已经筋疲力尽了,完全搞不清楚为什么会这样,认为这种(没有输出的)行为是毫无道理的。

    而于此同时,Dale 并没像Pat 那么快地写代码。Dale 在写一个函数的时候,会附带写一个简短的测试程序来测试这个函数。这里没有什么特殊的地方,只是添加了一个简单的测试,来判断函数的功能是否和程序员期望的一致。显然,考虑如何写,然后把测试写出来,是需要占用一定时间的;但是Dale 在未对刚写的函数做出确认之前,是不会接着写新代码的。也就是说,只有等到已知函数都得到确认之后,Dale 才会继续编写下一个函数,然后调用前面的函数等等。

    在整个过程中,Dale 几乎不使用调试器;而且对Pat 的模样也有些困惑不解:只见他头埋在两手之间,嘀咕着各种难听的话语,咒骂着计算机,充血的眼球同时盯着好几个调试窗口。

    最后期限终于到了,Pat 未能完成任务。而Dale 的代码被集成到整个系统中,并且能够很好地运行。之后,在Dale 的模块中,出现了一个小问题;但是Dale 很快就发现了问题所在,在几分钟之内就解决了问题。

    现在,是该总结一下上面这个小故事的时候了:Dale Pat 的年纪相当,编码能力相当,智力也差不多。唯一的区别就是Dale 非常相信单元测试;对于每个新写的函数,在其他代码使用这个函数并对它形成依赖之前,都要先做单元测试。

    Pat 则没有这么做,他总是“知道”代码的行为应该和所期望的完全一样,并且等到所有代码都差不多写完的时候,才想起来运行一下代码。然而到了这个时候,要想定位bug,或者,甚至是确定哪些代码的行为是正确的,哪些代码的行为是错误的,都为时已晚了。

    2.       什么是单元测试

    单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list  中去,然后确认该值出现在list  的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。

    执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。

    对于客户或最终使用者而言,这种测试必要吗,它与验收测试有关吗?这个问题仍然很难回答。事实上,我们在此并不关心整个产品的确认、验证和正确性等等;甚至此时,我们都不去关心性能方面的问题。我们所要做的一切就是要证明代码的行为和我们的期望一致。因此,我们所要测试的是规模很小的、非常独立的功能片断。通过对所有单独部分的行为建立起信心,确信它们都和我们的期望一致;然后,我们才能开始组装和测试整个系统。

    毕竟,要是我们对手上正在写的代码的行为是否和我们的期望一致都没把握,那么其他形式的测试也都只能是浪费时间而已。在单元测试之后,你还需要其他形式的测试,有可能是更正规的测试,那一切就都要看环境的需要来决定了。总之,做测试如同做善事,总是要从家(代码最基本的正确性)开始。

    3.       为什么要使用单元测试

    单元测试不但会使你的工作完成得更轻松,而且会令你的设计变得更好,甚至大大减少你花在调试上面的时间。

    在我们上面的小故事里面,Pat 因为假设底层的代码是正确无误的而卷入麻烦之中,先是高层代码中使用了底层代码;然后这些高层代码又被更高层的代码所使用,如此往复。在对这些代码的行为没有任何信心的前提下,Pat 等于是在假设上面用竖立卡片堆砌了一间房子——只要将下面卡片轻轻移动,整间房子就会轰然倒塌。

    当基本的底层代码不再可靠时,那么必需的改动就无法只局限在底层。虽然你可以修正底层的问题,但是这些对底层代码的修改必然会影响到高层代码,于是高层代码也连带地需要修改;以此递推,就很可能会动到更高层的代码。于是,一个对底层代码的修正,可能会导致对几乎所有代码的一连串改动,从而使修改越来越多,也越来越复杂。于是,整间由卡片堆成的房子就由此倒塌,从而使整个项目也以失败告终。

    Pat 总是说:“这怎么可能呢?”或者“我实在想不明白为什么会这样”。如果你发现自己有时候也会有这种想法,那么这通常是你对自己的代码还缺乏足够信心的表现——你并不能确认哪些是工作正常的而哪些不是。

    为了获得Dale 所具有的那种对代码的信心,你需要“询问”代码究竟做了什么,并检查所产生的结果是否确实和你所期望的一致。

    这个简单的想法描述了单元测试的核心内涵:这个简单有效的技术就是为了令代码变得更加完美。

    4.       我需要做什么

    引入单元测试是很简单的,因为它本身就充满了乐趣。然而在项目交付的时候,我们给客户和最终用户的仍然是产品代码,而不包含单元测试的代码;因此,我们必须对单元测试的目的有个充分的认识。首先也是最重要的,使用单元测试是为了使你的工作——以及你队友的工作——完成得更加轻松。

    它的行为和我的期望一致吗?

    最根本的,你需要回答下面这个问题:“这段代码达到我的目的了吗?”也许就需求而言,代码所做的是错误的事情,但那是另外一个问题了。你要的是代码向你证明它所做的就是你所期望的。

    它的行为一直和我的期望一致吗?

    许多开发者说他们只编写一个测试。也就是让所有代码从头到尾跑一次,只测试代码的一条正确执行路径,只要这样走一遍下来没有问题,测试也就算是完成了。

    但是,现实生活当然不会这么事事顺心,事情也不总是那么美好:代码会抛出异常,硬盘会没有剩余空间,网络会掉线,缓冲区会溢出等——而我们写的代码也会出现bug。这就是软件开发的“工程”部分。就“工程”而言,土木工程师在设计一座桥梁的时候,必须考虑桥梁的负载、强风的影响、地震、洪水等等。电子工程师要考虑频率漂移、电压尖峰、噪音,甚至这些同时出现时所带来的问题。

    你不能这样来测试一座桥梁:在风和日丽的某一天,仅让一辆车顺利地开过这座桥。显然,这种测试对于桥梁测试来说是远远不够的。类似地,在测试某段代码的行为是否和你的期望一致时,你需要确认:在任何情况下,这段代码是否都和你的期望一致;譬如在风很大、参数很可疑、硬盘没有剩余空间、网络掉线的时候。

    我可以依赖单元测试吗?

    不能依赖的代码是没有多大用处的。但更糟糕的是,那些你自认为可以信赖的代码(但是结果证明这些代码是有bug 的)有时候也会让你花很多时间在跟踪和调试上面。显然,几乎没有项目可以允许你在这上面浪费太多的时间,因此无论如何,你都要避免这种“前进一步,后退两步”的开发方法。也就是说,要让开发过程保持稳定的步伐前进。

    没人能够写出完美无缺的代码;但是这并没有关系——只要你知道问题的所在就足够了。许多大型软件项目的失败,诸如只能把坏了的太空船搁浅在遥远的行星,或者在飞行的途中就爆炸了,都能通过认知软件的限制来避免。例如,Arianne 5 号火箭软件重用了来自于之前一个火箭项目的一个程序库,而这个程序库并不能处理新火箭的飞行高度(比原来火箭要高)(引入单元测试是很简单的,因为它本身就充满了乐趣。然而在项目交付的时候,我们给客户和最终用户的仍然是产品代码,而不包含单元测试的代码;因此,我们必须对单元测试的目的有个充分的认识。首先也是最重要的,使用单元测试是为了使你的工作——以及你队友的工作——完成得更加轻松。) ,从而在起飞40 秒之后就发生了爆炸,导致5 亿美元的损失。

    显然,我们希望能够依赖于所编写的代码,并且清楚地知道这些代码的功能和约束。

    例如,假设你写了一个反转数值序列的方法。在测试的过程中,你也许会传一个空序列给这个程序——但导致了程序崩溃。实际上,程序并没有要求该程序必须能够接收一个空序列,因此你可以只在方法的注释中说明这个约束:如果传递一个空序列给这个方法,那么这个方法将会抛出一个异常。现在你马上就知道了该代码的约束,从而也就不需要用其他很麻烦的方法来解决这个问题(因为在某些地点要解决这个问题并不方便,比如在高空大气层中)。

    单元测试说明我的意图了吗?

    对于单元测试而言,一个最让人高兴的意外收获就是它能够帮助你充分理解代码的用法。从效果上而言,单元测试就像是能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成的功能。

    项目成员能够通过查看单元测试来找到如何使用你所写代码的例子。如果他偶然发现了一个你没有考虑到的测试用例,那么他也可以很快地知道这个事实:你的代码可能并不支持这个用例。

    显然,在正确性方面,可执行的文档有它的优势。与普通的文档不同的是,单元测试不会出现与代码不一致的情况(当然,除非你选择不运行这些测试)。

    5.       如何进行单元测试

        单元测试本来就是一项简单易学的技术;但是如果能够遵循一些指导性原则(guideline)和基本步骤,那么学习将会变得更加容易和有效。

        首先要考虑的是在编写这些测试方法之前,如何测试那些可疑的方法。有了这样一个大概的想法之后,你将可以在编写实现代码的时候,或者之前,编写测试代码本身。

        下一步,你需要运行测试本身,或者同时运行系统模块的所有其他测试,甚至运行整个系统的测试,前提是这些测试运行起来相对比较快。在此,我们要确保所有的测试都能够通过,而不只是新写的测试能够通过;这一点是非常重要的。也就是说,在保证不引入直接bug 的同时,你也要保证不会给其他的测试带来破坏。

        在这个测试过程中,我们须要确认每个测试究竟是通过了还是失败了——但这并不意味着你或者其他倒霉的人须要查看每个输出,然后才决定这些代码是正确的还是错误的。在此,你慢慢地就会养成一个习惯:只要用眼睛瞄一下测试结果,就可以马上知道所有代码是否都是正确的,或者哪些代码是有问题的。关于这个问题,我们将留在讨论如何使用单元测试框架时来具体讨论。

    6.       不写测试的借口

    在听过了我们合情合理、热情洋溢的阐述之后,某些开发者会点头并且同意单元测试的必要性,但是也许仍然会告诉我们由于某些原因,不能编写单元测试。下面就是我们所听到的一些借口,当然其中也包含了我们的辩解。

    Joe提问:

    什么是间接损害?

    间接损害是:在整个系统中,当某一部分加入了新特性,或者修复了一个bug 之后,给系统的其他(与前面可能是互不相关的)部分引入了一个新的bug(或者损害)。如果无视这种损害并且继续开发的话,那么将可能带来一个很危险的问题,最后可能会导致整个系统崩溃,并且没人能够修复。

    我们有时候把这种损害称为“Whac-a-Mole”效应。在狂欢节中有一种游戏叫做“Whac-a-Mole”,在此游戏中,当小孔中的机械鼠探出头来的时候,参与者的任务就是敲这个机械鼠的头部,然而正在这个时候,机械鼠的头马上又缩了回去,不让你打个正着;而位于另一个孔的另一个机械鼠此时又探出头来。就这样,机械鼠的头以非常快的速度探出又缩回,使你总是打不到他,从而也就得不了分。最后,参与者通常只能无助地乱敲;然而机械鼠的动作却总是出乎你的意料。

    实际上,对于代码而言,大范围的间接损害就具有这样类似的效果。

    编写单元测试太花时间了

    对于开始做单元测试的初学者而言,这是出现次数最多的借口。当然,事实并不是这样的。首先,我们需要关注一下:在编写代码的时候,你在哪些地方花费了更多的时间。

    大多数人都把测试看成某种只有在项目结束时才做的工作。但是,如果你到了那个时候才做单元测试的话,那么肯定会花费更多的时间。事实上,要想只在项目快要结束的时候才做单元测试,那简直是扯淡。

    至少,我们可以这样来看待单元测试:假设你想用一台割草机来清除两英亩的草地。如果你在草很稀疏的时候就开始行动,那么工作将会很简单。但是如果你等到这块草地长上粗壮大树、缠绕灌木的时候才准备行动,那么工作将会变得非常困难。

                1.1   “立即测试”和“单一测试阶段”的比较

        从长远看来,使用“立即测试模型”的代价比“延后测试模型”的代价要低。在你编写实现代码的时候,同时编写独立的测试代码,在项目最后就可以避免出现做了无用功的问题;代码中的bug 也会更少,因为你所依赖的都是已经通过测试的代码。于是,通过在开发过程中多花一点时间在编写单元测试上面,你就可以最小化在项目后期花费大量时间的风险。

    从图 1.1 中你可以看到,“立即测试”和“延后测试”之间并没有权衡可言;而是直线效率和指数效率之间的对比,而且对于后者而言,复杂度会不断增加,并且在项目后期,很多工作需要从头再来。所有这些额外的工作都会影响你的工作效率,如图1.1 所示。

    显然,单元测试也并非免费的午餐。在立即测试模型中,单元测试是有开销的(在时间和金钱上面)。但是如果你查看右边曲线的方向,你会发现它花费了更多的开销——效率曲线急剧下降;而且生产率甚至会变成负值;这些生产率损耗可以很容易导致一个项目失败。

    因此,如果你仍然认为在编写产品代码的时候,还是没有时间编写测试代码,那么请先考虑下面这些问题:

        1.  对于所编写的代码,你在调试上面花了多少时间?

        2.  对于以前你自认为正确的代码,而实际上这些代码却存在重大的bug,你花了多少时间在重新确认这些代码上面?

        3.  对于一个别人报告的bug,你花了多少时间才找出导致这个bug 的源码位置?

        对于那些没有使用单元测试的程序员而言,上面这些问题所耗费的时间的递增速度是很快的,而且随着项目的深入,递增速度会变得更快;而另一方面,适当的单元测试却可以很大程度地减少这些时间,从而能够为你腾出足够的时间来编写所有的单元测试——甚至可能还有剩余的空闲时间。

    运行测试的时间太长了

        合适的测试是不会让这种情况发生的。实际上,大多数测试的执行都是非常快的,因此你在几秒之内就可以运行成千上万个测试。但是有时某些测试会花费很长的时间,因此我们不能每次都运行这些测试,有时你就要暂时停止运行这些测试。

    在这种情况下,需要把这些耗时的测试和其他测试分开。通常可以每天运行这种测试一次,或者几天一次;而对于运行很快的测试,则可以经常运行。

    测试代码并不是我的工作

    这是一个很有趣的借口。请问,到底什么是你的工作呢?假设你的工作只是为了编写产品代码。如果对于那些没有把握的代码,你就随便地扔给测试组,那么你实际上并没有完成你的工作。实际上,期望别人来清理我们的代码是很不好的做法;甚至在某种情况下,如果别人指出了一大摞有错误的代码,那么也意味着你的职位也就到此为止了。

    另一方面,如果测试员或者QA Quality Assurance )组发现很难在你的代码中挑出错误,那么你的名声将会一路高升——同时提升的还有你的职位。

    我并不清楚代码的行为,所以也就无从测试

    如果你实在不清楚代码的行为,那么估计现在并不是编码的时候。或许你应该先建立一个原型,这样才有助于你认清需求。

    如果你并不知道代码的行为,那么你又如何知道你编写的代码是正确的呢?

    但是这些代码都能够编译通过

    OK,还没有人把这个当成一个借口,至少没有大声地说出来。但是估计这很容易会成为一个借口,因为有些人总是认为:一个成功的编译就是成功的标记;通过了编译,就像通过了天堂的大门一样。

    但是,编译器的默许只是对代码一种非常粗略的肯定。实际上,任何编译器和解释器都只能验证你的语法是否正确,并不能保证代码的行为也正确。例如,C# 的编译器可以很容易地检测到下面这行代码是错误的:

    statuc void Main() { …….}

        上面有个明显的打印错误,第2 个单词应该是static ,而不是statuc。这是很容易看出来的。但是现在假设你编写了下面这些代码:

       public void Addit(Object anObject) {

          List myList = new List();

          myList.Add(anObject);

          myList.Add(anObject);

          // more code...

        }

        你是否想加同一个对象到相同list 两次呢?或许是,或许不是。就这一点来说,编译器并不能告诉你,只有你知道你期望代码完成什么样的功能(对于哪些基于你现有代码生成测试代码的自动化测试工具,同样会陷入这个陷阱——它们只会使用你编写的代码,而不是你期望的代码)。

    公司请我来是为了写代码,而不是写测试

    如果使用同样的逻辑,那么我们可以说:公司付给你薪水,并不是让你整天都在调试代码。显然,公司付给你薪水是为了让你编写产品代码,而单元测试大体上是一个工具,是一个和编辑器、开发环境、编译器等处于同一位置的工具。

    如果我让测试员或者QAQuality Assurance)人员没有工作,那么我会觉得很内疚

        你并不需要担心这些。请记住,我们在此只是谈论单元测试,而它只是一种针对源码的、低层次的,为程序员而设计的测试。在整个项目中,还有其他的很多测试需要这些人来完成,如:功能测试、验收测试、性能测试、环境测试、有效性测试、正确性测试、正规分析等等。

    我的公司并不会让我在真实系统中运行单元测试

        Whoa!我们所讨论的只是针对开发者的单元测试。也就是说,如果你可以在其他的环境下(例如在正式的产品系统中)运行这些测试的话,那么它们就不再是单元测试,而是其他类型的测试了。实际上,你可以在你的本机运行单元测试,使用你自己的数据库,或者使用mock 对象(见第6 章)。

        如果QA 部门或者其他测试人员希望在产品或者其他阶段运行这些测试的话,你可以调整一些技术细节,从而使他们也可以运行一些测试;但是同时要让他们清楚,这些调整后的测试已经不再是单元测试了。

    February 08

    Install Windows 2003 x64 on Thinkpad T60 (Note)

    此为个人笔记,如有补充欢迎交流
     
    安装系统过程跟x86版本一样,下面是驱动和配套软件部分安装方法
    Win2003 x64 install procedures is same as Win2003 x86, but the drive not, 
    Below list are how to install hardware drive and supporting software
     
    ******************驱动部分  Driver part*****************
    1. Intel Chipset
    从联想或Intel下载的驱动就支持了x64
    You can get this driver from Lenovo or Intel, it support x64 system
     
    2. Video : ATI X1400
    game.ati.com下载最新的winxp x64驱动并解压缩,使用DH Mob修改该驱动就可以安装,DH Mob下载地址 http://www.driverheaven.net/modtool
    Download lastest ATI graphic driver for winxp x64 from game.ati.com, you can install driver after use DH Mob modify the driver,  you can get DH Mob from http://www.driverheaven.net/modtool
     
    3. Audio : SoundMax
    从驱动之家下载ASUS发布的支持x64驱动并解压,然后打开设备管理器并找到声音设备,选择更新驱动,把目录指向 [解压的目录]\x64\SMAXWDM\W2K_XP
    备注: 我安装这个驱动之前并没有安装UAA总线驱动,但是也能运行
    Download ASUS SoundMax driver for x64 and unzip it,  open Device Manager and find the audio device, update device's driver,  set the driver folder to [ASUS SoundMax Driver Folder]\x64\SMAXWDM\W2K_XP
    P.S  I didn't install Microsft UAA before I install driver, because Microsoft offer en-us version and japanese version only, but it work fine
     
    4. Network : Intel Pro/1000 PL
    Intel已经提供该设备x64驱动的下载
    You can download it from Intel
     
    5. Network : Intel Pro/Wireless 3945ABG
    Intel已经提供该设备x64驱动的下载
    You can download it from Intel
     
    6. SATA
        如果之前尝试安装该驱动其他版本失败,先删除C:\WINDOWS\system32\drivers\iaStor.sys文件
        (1) 从联想下载Matrix Storage驱动,2000/xp和vista 64两个版本都要下
        (2) 把2000/xp那个版本中的PREPARE文件夹复制到vista 64那个版本中,执行PREPARE\Install.bat
        (3) 返回BIOS把硬盘的模式修改回SATA
     
        If you tried to install this driver failed before, you must delete C:\WINDOWS\system32\drivers\iaStor.sys first
        (1) download Matrix Storage driver from lenovo, both for 2000/xp and for vista x64 version
        (2) copy PREPARE folder (Matrix Storage driver for 2000/xp version) to Matrix Storage driver for vista x64 version, and run PREPARE\Install.bat
        (3) restart computer and change Harddisk mode to SATA in BIOS
     
    7. Power Management Driver
    从联想下载的驱动就支持了x64
    You can get this driver from Leono, it support x64 system
     
    8. UltraNav Driver
    从联想下载的驱动就支持了x64,但是好像运行不太正常
    You can get this driver from Lenovo, it support x64 system, but I feel it's not work fine.
     
    9. Infrared
    Win2003 Ent没有驱动。网上提供的只有提取自winxp x86的驱动,没有x64的
    Win2003 Ent not include this driver, but you can copy support files from winxp x64 system
     
    7. LCD Monitor
    未找到
    Not Support
     
    8. Amtel TPM
    下载Atmel TPM Driver Installer并安装, 下载地址:http://www-307.ibm.com/pc/support/site.wss/MIGR-66304.html
    这个是ThinkCentre的驱动,我们挪用了
    Download "Atmel TPM Driver Installer" then install it, You can get it from :  http://www-307.ibm.com/pc/support/site.wss/MIGR-66304.html
    This is ThinkCentre driver, it's difference from ThinkPad driver.
    ThinkPad driver not include "Tpmddl64.dll" and "AtmelTpm64.sys", But inf include x64 part
    ThinkCentre is fullversion
     
    9. Modem
    从联想下载的驱动就支持了vista x64
    You can get this driver from Leono, it support vista x64 system, but it work fine on Win2003 x64
     
    10. BlueTooth
    安装了,但是好像运行不太正常
    I install Leveno BlueTooth driver for winxp/2000, it support x64, but it's not work fine
     
    ***************配套软件部分  Software Part*********************
    1. Fingerprint Reader
    安装联想提供的vista x64版本的软件
    Install Fingerprint Reader for vista x64 version, you can get it from lenovo
     
    2. Power Management
    各个版本都提示不支持 -_-|||
    each version always show "Can not run at this system", fxxk levono
     
    3. Active Protection System
    安装联想提供的vista x64版本的软件
    Install APS for vista x64 version, you can get it from lenovo
     
    4. Access Connections
    不喜欢这个东西,没尝试
    I hate it... So....
     
    5. ThinkPad Configuration
    跟电源管理一样
    Same as Power Management
     
    6. Hotkey Feature
    有个版本提示this program is only for IBM/Lenovo System
    另一个提示缺少一个东西,但是下载说明中又写着包含了
    Can't install it
     
     

    07年之最

    随手写点

    与数字相关的
    最大笔支出                        购买T60
    最奢侈的支出                     购买Sony 888
    爬的最高高度                    3511米
    距家最远的距离                 1500公里左右
    交通开销最长时间              24小时
    游戏厅单次最高奖票数        5200张左右
    睡觉最长时间                    22小时
    单天内走路上楼最高总层数  110层左右

    与心情相关的
    最高兴的事情                    认识了茜
    最郁闷的事情                    2个能赚钱的路线泡汤
    最火大的事情                    小茜把Sony 888 弄丢了
    最烦恼的事情                    ¥
    最得意的事情                    比别人快5倍的速度完成一个事情
    最得意的事情(游戏)        DOTA  2V5 成功
    最成功的事情                    拿一个私单
    最遗憾的事情                    51沿长江逆行未能组织起来
    最遗憾的事情(游戏)        WOW的风景尚未看完