<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    WEB開(kāi)發(fā) de 點(diǎn)滴

    by sanwish

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      38 隨筆 :: 0 文章 :: 4 評(píng)論 :: 0 Trackbacks

    2008年6月14日 #

    有一個(gè)問(wèn)題先提出來(lái),安裝oracle必須直接在系統(tǒng)上安裝,不能通過(guò)遠(yuǎn)程桌面或者終端服務(wù)安裝,否則會(huì)報(bào)“ORA-12560: TNS: 協(xié)議適配器錯(cuò)誤”。還有一點(diǎn),oracle8.1.7有一個(gè)補(bǔ)丁程序PATCH_SET_FOR_ORACEL_DATA_8174_WINNT.zip,以前從來(lái)沒(méi)有見(jiàn)過(guò),這次是從教育網(wǎng)里花了一天時(shí)間下載下來(lái)的,不知道是不是在win2003上安裝必須的(下周即可見(jiàn)分校曉)。

    1、如果你的oracle8.1.7是原始版的,檢查
    /stage/Components/oracle.swd.jre/
    1.1.7.30/1/DataFiles/Expanded/jre/win32/bin下的symcjit.dll文件,改名或者直接刪除。
    /stage/Components/oracle.omb.jdk/1.1.8/1/DataFiles/Expanded/jdk118_nt/bin路徑下的symcjit.dll文件做同樣處理。

    2、如果遇到點(diǎn)擊setup.exe無(wú)反應(yīng),在install目錄下打開(kāi)文件’oraparam.ini’把參數(shù) JRE_MEMORY_OPTIONS改為

    RE_MEMORY_OPTIONS = -nojit -ms16m -mx32m 即可。

    3、執(zhí)行本地硬盤install\win32\setup.exe目錄下的Setup.exe文件。此時(shí)調(diào)用的是修改過(guò)的參數(shù)文件oraparam.ini。?
    ?
    4、安裝時(shí)選擇自定義模式,并且不創(chuàng)建數(shù)據(jù)庫(kù)。
    ?? 具體參照<windows+oracle8 install manual>

    posted @ 2009-02-10 15:00 sanwish 閱讀(1521) | 評(píng)論 (0)編輯 收藏

    sql1:select?? column_name?? from?? all_tab_columns?? where?? table_name='table1';
    sql2:select?? column_name?? from?? user_tab_columns?? where?? table_name='table1';


    我在運(yùn)行sql1的時(shí)候碰到,如果數(shù)據(jù)庫(kù)中有相同用戶的話,會(huì)檢索出重復(fù)的字段名。
    后來(lái)把用戶的dba權(quán)限去掉了就好了。
    revoke dba from user1;

    運(yùn)行sql2,雖然不出現(xiàn)重復(fù)的,但是客戶說(shuō)最終工程所用的DB用戶和表的所有者不是一個(gè),所以不能用user_table_columns。
    oracle知識(shí)太缺乏,不明白客戶說(shuō)的意思

    關(guān)于sql1重復(fù)的問(wèn)題,還是不清楚,具體的參照權(quán)限應(yīng)該怎么取消?取消dba太大了吧。
    posted @ 2008-12-03 09:48 sanwish 閱讀(2930) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-10 10:02 sanwish 閱讀(225) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-10 10:00 sanwish 閱讀(1469) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-10 09:56 sanwish 閱讀(260) | 評(píng)論 (0)編輯 收藏

    對(duì)于 Oracle 的 rownum 問(wèn)題,很多資料都說(shuō)不支持>,>=,=,between...and,只能用以上符號(hào)(<、<=、!=),并非說(shuō)用>,>=,=,between..and 時(shí)會(huì)提示SQL語(yǔ)法錯(cuò)誤,而是經(jīng)常是查不出一條記錄來(lái),還會(huì)出現(xiàn)似乎是莫名其妙的結(jié)果來(lái),其實(shí)您只要理解好了這個(gè) rownum 偽列的意義就不應(yīng)該感到驚奇,同樣是偽列,rownum 與 rowid 可有些不一樣,下面以例子說(shuō)明

    假設(shè)某個(gè)表 t1(c1) 有 20 條記錄

    如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于號(hào),查出來(lái)的結(jié)果很容易地與一般理解在概念上能達(dá)成一致,應(yīng)該不會(huì)有任何疑問(wèn)的。

    可如果用 select rownum,c1 from t1 where rownum > 10 (如果寫下這樣的查詢語(yǔ)句,這時(shí)候在您的頭腦中應(yīng)該是想得到表中后面10條記錄),你就會(huì)發(fā)現(xiàn),顯示出來(lái)的結(jié)果要讓您失望了,也許您還會(huì)懷疑是不誰(shuí)刪了一些記錄,然后查看記錄數(shù),仍然是 20 條啊?那問(wèn)題是出在哪呢?

    先好好理解 rownum 的意義吧。因?yàn)镽OWNUM是對(duì)結(jié)果集加的一個(gè)偽列,即先查到結(jié)果集之后再加上去的一個(gè)列 (強(qiáng)調(diào):先要有結(jié)果集)。簡(jiǎn)單的說(shuō) rownum 是對(duì)符合條件結(jié)果的序列號(hào)。它總是從1開(kāi)始排起的。所以你選出的結(jié)果不可能沒(méi)有1,而有其他大于1的值。所以您沒(méi)辦法期望得到下面的結(jié)果集:

    11 aaaaaaaa
    12 bbbbbbb
    13 ccccccc
    .................

    rownum >10 沒(méi)有記錄,因?yàn)榈谝粭l不滿足去掉的話,第二條的ROWNUM又成了1,所以永遠(yuǎn)沒(méi)有滿足條件的記錄。或者可以這樣理解:

    ROWNUM 是一個(gè)序列,是oracle數(shù)據(jù)庫(kù)從數(shù)據(jù)文件或緩沖區(qū)中讀取數(shù)據(jù)的順序。它取得第一條記錄則rownum值為1,第二條為2,依次類推。如果你用>,>=,=,between...and這些條件,因?yàn)閺木彌_區(qū)或數(shù)據(jù)文件中得到的第一條記錄的rownum為1,則被刪除,接著取下條,可是它的rownum還是1,又被刪除,依次類推,便沒(méi)有了數(shù)據(jù)。

    有了以上從不同方面建立起來(lái)的對(duì) rownum 的概念,那我們可以來(lái)認(rèn)識(shí)使用 rownum 的幾種現(xiàn)像

    1. select rownum,c1 from t1 where rownum != 10 為何是返回前9條數(shù)據(jù)呢?它與 select rownum,c1 from tablename where rownum < 10 返回的結(jié)果集是一樣的呢?
    因?yàn)槭窃诓樵兊浇Y(jié)果集后,顯示完第 9 條記錄后,之后的記錄也都是 != 10,或者 >=10,所以只顯示前面9條記錄。也可以這樣理解,rownum 為9后的記錄的 rownum為10,因條件為 !=10,所以去掉,其后記錄補(bǔ)上,rownum又是10,也去掉,如果下去也就只會(huì)顯示前面9條記錄了

    2. 為什么 rownum >1 時(shí)查不到一條記錄,而 rownum >0 或 rownum >=1 卻總顯示所以的記錄
    因?yàn)?rownum 是在查詢到的結(jié)果集后加上去的,它總是從1開(kāi)始

    3. 為什么 between 1 and 10 或者 between 0 and 10 能查到結(jié)果,而用 between 2 and 10 卻得不到結(jié)果
    原因同上一樣,因?yàn)?rownum 總是從 1 開(kāi)始

    從上可以看出,任何時(shí)候想把 rownum = 1 這條記錄拋棄是不對(duì)的,它在結(jié)果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,所以你的 rownum 條件要包含到 1

    但如果就是想要用 rownum > 10 這種條件的話話就要用嵌套語(yǔ)句,把 rownum 先生成,然后對(duì)他進(jìn)行查詢。
    select *
    from (selet rownum as rn,t1.* from a where ...)
    where rn >10

    一般代碼中對(duì)結(jié)果集進(jìn)行分頁(yè)就是這么干的。

    另外:rowid 與 rownum 雖都被稱為偽列,但它們的存在方式是不一樣的,rowid 可以說(shuō)是物理存在的,表示記錄在表空間中的唯一位置ID,在DB中唯一。只要記錄沒(méi)被搬動(dòng)過(guò),rowid是不變的。rowid 相對(duì)于表來(lái)說(shuō)又像表中的一般列,所以以 rowid 為條件就不會(huì)有 rownum那些情況發(fā)生。
    另外還要注意:rownum不能以任何基表的名稱作為前綴。
    posted @ 2008-11-10 09:55 sanwish 閱讀(173) | 評(píng)論 (0)編輯 收藏

    半角數(shù)字
    unicode0123456789abcdef
    0x300123456789:;<=>?


    全角數(shù)字
    unicode0123456789abcdef
    0xff10


    半角英字
    unicode0123456789abcdef
    0x40@ABCDEFGHIJKLMNO
    0x50PQRSTUVWXYZ[\]^_
    0x60`abcdefghijklmno
    0x70pqrstuvwxyz{|}~


    全角英字
    unicode0123456789abcdef
    0xff20
    0xff30_
    0xff40
    0xff50?


    ひらがな
    unicode0123456789abcdef
    0x3050?
    0x3050
    0x3060
    0x3070
    0x3080
    0x3090???????


    全角カタカナ
    unicode0123456789abcdef
    0x3050?
    0x30b0
    0x30c0
    0x30d0
    0x30e0
    0x30f0??????


    半角カタカナ
    unicode0123456789abcdef
    0xff60??
    0xff70
    0xff80
    0xff90


    半角記號(hào)
    unicode0123456789abcdef
    0x20?!"#$%&'()*+,-./
    0x300123456789:;<=>?
    0x40@ABCDEFGHIJKLMNO
    0x50PQRSTUVWXYZ[\]^_
    0x60`abcdefghijklmno
    0x70pqrstuvwxyz{|}~
    0xff60??


    全角記號(hào)
    unicode0123456789abcdef
    0x2010??????????
    0x3000 ?
    0x30f0??????
    0xff00? ??
    0xff10
    0xff20
    0xff30_
    0xff40
    0xff50?
    0xffe0???????????

    posted @ 2008-11-07 13:29 sanwish 閱讀(1017) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 13:27 sanwish 閱讀(364) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 13:20 sanwish 閱讀(557) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:37 sanwish 閱讀(2009) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:35 sanwish 閱讀(422) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:31 sanwish 閱讀(677) | 評(píng)論 (1)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:24 sanwish 閱讀(290) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:21 sanwish 閱讀(265) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:14 sanwish 閱讀(189) | 評(píng)論 (0)編輯 收藏

    構(gòu)造方法的繼承
    子類可以繼承父類的構(gòu)造方法,原則如下:
    ??? 1. 子類無(wú)條件繼承父類的默認(rèn)構(gòu)造函數(shù)。
    ??? 2. 若子類有構(gòu)造函數(shù),則創(chuàng)建對(duì)象時(shí)先調(diào)用繼承自父類的默認(rèn)構(gòu) 造函數(shù),再執(zhí)行自己的構(gòu)造函數(shù)。
    ??? 3. 對(duì)于父類有參數(shù)的構(gòu)造函數(shù),子類可以通過(guò)在自己的構(gòu)造函數(shù) 中使用 super 關(guān)鍵字來(lái)調(diào)用它,但這個(gè)語(yǔ)句必須是子類構(gòu)造函數(shù) 的第一個(gè)可執(zhí)行語(yǔ)句。
    posted @ 2008-11-07 11:10 sanwish 閱讀(149) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:07 sanwish 閱讀(131) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:05 sanwish 閱讀(151) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:00 sanwish 閱讀(186) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:59 sanwish 閱讀(317) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:56 sanwish 閱讀(680) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:54 sanwish 閱讀(158) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:52 sanwish 閱讀(1250) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:48 sanwish 閱讀(657) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:47 sanwish 閱讀(288) | 評(píng)論 (0)編輯 收藏

    ■ 常用特殊字符

      只要你認(rèn)識(shí)了 HTML 標(biāo)記,你便會(huì)知道特殊字符的用處。

    HTML 原代碼 顯示結(jié)果 描述
    &lt; < 小于號(hào)或顯示標(biāo)記
    &gt; > 大于號(hào)或顯示標(biāo)記
    &amp; & 可用于顯示其它特殊字符
    &quot; " 引號(hào)
    &reg; ? 已注冊(cè)
    &copy; ? 版權(quán)
    &trade; ? 商標(biāo)
    &ensp; 半個(gè)空白位
    &emsp; 一個(gè)空白位
    &nbsp; 不斷行的空白
    ■ ISO Latin-1 特殊字符
    HTML 原代碼 顯示結(jié)果 描述
    &AElig; ? Uppercase AE diphthing
    &Aacute; á Uppercase A, acute accent
    &Acirc; ? Uppercase A, circumflex accent
    &Agrave; à Uppercase A, grave accent
    &Aring; ? Uppercase A, ring
    &Atilde; ? Uppercase A, tilde
    &Auml; ? Uppercase A, dieresis or umlaut mark
    &Ccedil; ? Uppercase C, cedilla
    &ETH; D Uppercase Eth, Icelandic
    &Eacute; é Uppercase E, acute accent
    &Ecirc; ê Uppercase E, circumflex accent
    &Egrave; è Uppercase E, grave accent
    &Euml; ? Uppercase E, dieresis or umlaut mark
    &Iacute; í Uppercase I, acute accent
    &Icirc; ? Uppercase I, circumflex accent
    &Igrave; ì Uppercase I, grave accent
    &Iuml; ? Uppercase I, dieresis or umlaut mark
    &Ntilde; ? Uppercase N, tilde
    &Oacute; ó Uppercase O, acute accent
    &Ocirc; ? Uppercase O, circumflex accent
    &Ograve; ò Uppercase O, grave accent
    &Oslash; ? Uppercase O, slash
    &Otilde; ? Uppercase O, tilde
    &Ouml; ? Uppercase O, dieresis or umlaut mark
    &THORN; T Uppercase THORN, Icelandic
    &Uacute; ú Uppercase U, acute accent
    &Ucirc; ? Uppercase U, circumflex accent
    &Ugrave; ù Uppercase u, grave accent
    &Uuml; ü Uppercase U, dieresis or umlaut mark
    &Yacute; Y Uppercase Y, acute accent
    &aelig; ? Lowercase ae diphthing
    &aacute; á Lowercase a, acute accent
    &acirc; a Lowercase a, circumflex accent
    &agrave; à Lowercase a, grave accent
    &aring; ? Lowercase a, ring
    &atilde; ? Lowercase a, tilde
    &auml; ? Lowercase a, dieresis or umlaut mark
    &ccedil; ? Lowercase c, cedilla
    &eth; e Lowercase eth, Icelandic
    &eacute; é Lowercase e, acute accent
    &ecirc; ê Lowercase e, circumflex accent
    &egrave; è Lowercase e, grave accent
    &euml; ? Lowercase e, dieresis or umlaut mark
    &iacute; í Lowercase i, acute accent
    &icirc; ? Lowercase i, circumflex accent
    &igrave; ì Lowercase i, grave accent
    &iuml; ? Lowercase i, dieresis or umlaut mark
    &ntilde; ? Lowercase n, tilde
    &oacute; ó Lowercase o, acute accent
    &ocirc; ? Lowercase o, circumflex accent
    &ograve; ò Lowercase o, grave accent
    &oslash; ? Lowercase o, slash
    &otilde; ? Lowercase o, tilde
    &ouml; ? Lowercase o, dieresis or umlaut mark
    &szlig; ? Lowercase sharp s, German (sz ligature)
    &thorn; t Lowercase thorn, Icelandic
    &uacute; ú Lowercase u, acute accent
    &ucirc; ? Lowercase u, circumflex accent
    &ugrave; ù Lowercase u, grave accent
    &uuml; ü Lowercase u, dieresis or umlaut mark
    &yacute; y Lowercase y, acute accent
    &yuml; ? Lowercase y, dieresis or umlaut mark
    posted @ 2008-11-07 10:33 sanwish 閱讀(350) | 評(píng)論 (0)編輯 收藏

    CMMI(Capability Maturity Model Integration,能力成熟度模式整合)

    CMMI( Capability Maturity Model Integration)的本質(zhì)是軟件管理工程的一個(gè)部分。軟件過(guò)程改善是當(dāng)前軟件管理工程的核心問(wèn)題, 50多年來(lái)計(jì)算的發(fā)展使人們認(rèn)識(shí)到要高效率、高質(zhì)量和低成本地開(kāi)發(fā)軟件,必須改善軟件生產(chǎn)過(guò)程。基於模型的過(guò)程改進(jìn)是指用採(cǎi)用能力模型來(lái)指導(dǎo)組織的過(guò)程改進(jìn),使之過(guò)程能力穩(wěn)定的進(jìn)行改善,該組織也能變得更加成熟。

    然而,軟件組織形成一套完整而成熟的軟件過(guò)程不是一蹴而就的事情,需要經(jīng)歷一系列的成熟度。軟件組織首先要進(jìn)行差異分析,評(píng)定自己比較接近哪一個(gè)成熟度,然後再根據(jù)自身的情況來(lái)決定要採(cǎi)取哪些改進(jìn)活動(dòng),來(lái)更有效地改進(jìn)自己的軟件過(guò)程。這就對(duì)軟件過(guò)程的評(píng)定提出了一個(gè)客觀的標(biāo)準(zhǔn)。美國(guó)卡內(nèi)基梅隆大學(xué)軟件工程學(xué)院於1987年研究成功的SW-CMM(Capability Maturity Model for Software)就是這樣的一個(gè)理論模型,其目的在於幫助軟件組織改善軟件生產(chǎn)流程,以探索一個(gè)保證軟件產(chǎn)品質(zhì)量、縮短開(kāi)發(fā)週期、提高工作效率的軟件工程模式與標(biāo)準(zhǔn)規(guī)範(fàn)。

    CMMI是一個(gè)可以改進(jìn)系統(tǒng)工程和軟件工程的整合模式。1997年10月SEI停止對(duì)CMM的研究,改而致力於CMMI,以解決使用多個(gè)過(guò)程改進(jìn)模型的問(wèn)題。SEI同時(shí)宣佈CMMI將取代CMM,與2000年8月11日頒布了CMMI-SE/SW 1.0版本,2001年12月頒布了1.1版本,這次發(fā)佈標(biāo)誌著CMMI正式啟用,並準(zhǔn)備今年內(nèi)完成CMM到CMMI的過(guò)渡。

    posted @ 2008-11-07 10:26 sanwish 閱讀(145) | 評(píng)論 (0)編輯 收藏

    CMM是由美國(guó)軟件工程學(xué)會(huì)(Software engineering inStitute)制定的一套專門針對(duì)軟件產(chǎn)品的質(zhì)量管理和質(zhì)量保證標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)最初是為美國(guó)軍方選擇軟件產(chǎn)品提供商時(shí)評(píng)價(jià)軟件企業(yè)的軟件開(kāi)發(fā)質(zhì)量保證能力而制定,所以稱為軟件企業(yè)能力成熟度模型(Capability Maturity Model,簡(jiǎn)稱CMM)。該標(biāo)準(zhǔn)將軟件企業(yè)的能力成熟度劃分為5個(gè)等級(jí),級(jí)別越高表明該企業(yè)在提供合格軟件產(chǎn)品方面的能力越強(qiáng)。

    CMMCapability Maturity Model  是能力,成熟度模型的縮寫。CMM的工作最早開(kāi)始于 1986年11月,當(dāng)時(shí)為了滿足美國(guó)聯(lián)邦政府評(píng)估軟件供應(yīng)商能力的要求,美國(guó)卡內(nèi)基·梅隆大學(xué)的軟件工程研究院Sei 牽頭,在Mitre公司的協(xié)助下,于1987年9月發(fā)布了一份能力成熟度框架Capability Maturity fraMework 以及一套成熟度問(wèn)卷 Maturity QueStionnaire .很多人認(rèn)為這套問(wèn)卷就代表了CMM模型,其實(shí)它只是用于探索軟件過(guò)程成熟度的一個(gè)工具,真正的模型出現(xiàn)在四年以后。Sei總結(jié)了自1987年以來(lái)對(duì)成熟度框架和初版成熟度問(wèn)卷的實(shí)戰(zhàn)經(jīng)驗(yàn),并以此為基礎(chǔ),推出了CMM1.0 版。這個(gè)推出于 1991年的 CMM1.0 集中了四年來(lái)對(duì)軟件公司評(píng)估的經(jīng)驗(yàn)以及廣泛的用戶反饋,在成熟度框架的基礎(chǔ)上建立了一個(gè)可用的模型,這個(gè)模型可以更加有效地幫助軟件企業(yè)建立和實(shí)施過(guò)程改進(jìn)計(jì)劃。

    CMM1.0 版使用兩年之后,于1992年四月進(jìn)行了一個(gè)研討會(huì),參加研討會(huì)的有約兩百名富有經(jīng)驗(yàn)的軟件專業(yè)人員。在廣泛聽(tīng)取了他們的反饋意見(jiàn)之后,Sei于 1993 年推出了CMM1.1 版。近幾年來(lái),CMM又推出了2.0 版本,同時(shí)進(jìn)入了iSo 體系,稱為 iSo/ieC15504 或 SpiCe. SpiCe從1995年起進(jìn)入實(shí)地測(cè)試階段,可能于2001年發(fā)布 。

    CMM 致力于軟件開(kāi)發(fā)過(guò)程的管理及工程能力的提高與評(píng)估。該模型在美國(guó)和北美地區(qū)已得到廣泛應(yīng)用同時(shí)正在被越來(lái)越多的歐洲和亞洲等國(guó)家的大型信息技術(shù)企業(yè)所采納,實(shí)際上已成為軟件開(kāi)發(fā)過(guò)程改進(jìn)與評(píng)估的事實(shí)上的工業(yè)標(biāo)準(zhǔn)。

    印度是軟件大國(guó),十分重視軟件開(kāi)發(fā)過(guò)程的管理及與其相關(guān)的理論與標(biāo)準(zhǔn)的發(fā)展。據(jù)統(tǒng)計(jì),在印度的2000多家軟件公司中有75家軟件公司通過(guò)了iSo9000認(rèn)證,60多家軟件公司通過(guò)了CMM認(rèn)證,其中達(dá)到CMM5級(jí)一家,4級(jí)三家,3級(jí)4家。

    CMM與iSo9000的區(qū)別主要有以下幾點(diǎn):CMM是專門針對(duì)軟件產(chǎn)品開(kāi)發(fā)及服務(wù)的,而iSo9000則有寬得多的范圍;CMM強(qiáng)調(diào)軟件開(kāi)發(fā)過(guò)程的成熟度,即過(guò)程的不斷改進(jìn)和提高,而iSo9000則僅描述可接收的質(zhì)量體系的最低標(biāo)準(zhǔn);CMM3級(jí)的覆蓋范圍要大于iSo9000的覆蓋范圍。

    引進(jìn)CMM的意義有兩個(gè)方面

    1.對(duì)軟件企業(yè):

    提高軟件開(kāi)發(fā)的管理能力:CMM提供了軟件企業(yè)自我評(píng)估的方法和自我提高的手段;提高軟件生產(chǎn)率;加強(qiáng)軟件生產(chǎn)的國(guó)際競(jìng)爭(zhēng)力。

    2.對(duì)軟件項(xiàng)目發(fā)包單位和軟件用戶:

    提供了對(duì)軟件開(kāi)發(fā)商開(kāi)發(fā)管理水平的評(píng)估手段,有助于軟件開(kāi)發(fā)項(xiàng)目的風(fēng)險(xiǎn)識(shí)別。

    posted @ 2008-11-07 10:26 sanwish 閱讀(169) | 評(píng)論 (0)編輯 收藏

    CMM與CMMI對(duì)比
    來(lái)源:Worthy Tech
    CMMI:

    CMMI 全稱是Capability Maturity Model Integration, 即軟件能力成熟度模型集成模型,是由美國(guó)國(guó)防部與卡內(nèi)基-梅隆大學(xué)和美國(guó)國(guó)防工業(yè)協(xié)會(huì)共同開(kāi)發(fā)和研制的。CMMI是一套融合多學(xué)科的、可擴(kuò)充的產(chǎn)品集合,其研制的初步動(dòng)機(jī)是為了利用兩個(gè)或多個(gè)單一學(xué)科的模型實(shí)現(xiàn)一個(gè)組織的集成化過(guò)程改進(jìn)。CMMI可以解決現(xiàn)有不同CMM模型的重復(fù)性、復(fù)雜性,并減少由此引起的成本、縮短改進(jìn)過(guò)程,它將軟件CMM2.0版草案(SW-CWW)、EIA過(guò)渡標(biāo)準(zhǔn)731(系統(tǒng)工程CMM)及IPD-CMM集成為一體,同時(shí)還與 ISO15504相兼容。 CMMI是有效過(guò)程元素的集合,目前有如下模型:?
    CMMI是有效過(guò)程元素的集合,目前有如下模型:
    CMMI-SE/SW/IPPD/SS,V1.1
    CMMI-SE/SW/IPPD V1.1
    CMMI-SE/SW V1.1
    CMMI-SW V1.1?


    CMMI自推出以來(lái),在世界各地得到了廣泛的推廣與接受。在日本、歐洲、臺(tái)灣、印度等地都有很多企業(yè)在推廣與應(yīng)用CMMI模型。尤其在印度CMMI的應(yīng)用甚至超過(guò)了美國(guó)。

    CMMI階段式的基本結(jié)構(gòu)從CMM演變而來(lái),但是CMMI的結(jié)構(gòu)更加的形式化和精致,也更加的復(fù)雜,尤其為了保證連續(xù)式和階段式的同一性,更加增加了結(jié)構(gòu)的理解難度。

    CMMI強(qiáng)調(diào)了對(duì)需求的管理,有兩個(gè)過(guò)程域說(shuō)明對(duì)需求的控制:需求管理REQM、需求開(kāi)發(fā)RD。而在CMM中只有一個(gè)關(guān)鍵過(guò)程域需求管理RM以及軟件產(chǎn)品工程SPE中的一個(gè)實(shí)踐來(lái)說(shuō)明對(duì)需求的管理和控制。

    CMMI加強(qiáng)了對(duì)工程過(guò)程的重視,提供了更加細(xì)致的要求和指導(dǎo),而CMM中卻只有一個(gè)SPE關(guān)鍵過(guò)程來(lái)進(jìn)行要求和指導(dǎo)CMMI強(qiáng)調(diào)了度量,并且從項(xiàng)目的早期就已經(jīng)進(jìn)行了度量,在階段式中CMMI二級(jí)由一個(gè)過(guò)程域度量和分析;而在CMM中沒(méi)有專門的要求和指導(dǎo)。

    CMMI對(duì)比CMM更加強(qiáng)調(diào)了對(duì)風(fēng)險(xiǎn)的管理,在CMM中風(fēng)險(xiǎn)只“是項(xiàng)目策劃”SPP中的一個(gè)活動(dòng),而在CMMI中風(fēng)險(xiǎn)管理作為一個(gè)單獨(dú)的過(guò)程域。 

    CMM:
    CMM作為較早推出的軟件過(guò)程改進(jìn)標(biāo)準(zhǔn),目前已在世界范圍被廣泛地推廣和應(yīng)用。不可否認(rèn),CMM在建立有效的開(kāi)發(fā)系統(tǒng)、控制軟件產(chǎn)品開(kāi)發(fā)過(guò)程式、降低軟件企業(yè)內(nèi)外部故障成本、提高企業(yè)的經(jīng)濟(jì)效益和社會(huì)效益等方面,取得了巨大成功。

    但CMM也存在著一些不足,如CMM中的一個(gè)關(guān)鍵過(guò)程域“組間協(xié)調(diào)”IC在CMMI中地位下降,只是作為“集成化項(xiàng)目管理”IPM中的一個(gè)目標(biāo)。


    CMM中的關(guān)鍵過(guò)程域“同行評(píng)審”PR,在CMMI中得到了更高的抽象;對(duì)應(yīng)CMMI的“驗(yàn)證”VER,說(shuō)明了對(duì)產(chǎn)品進(jìn)行相應(yīng)的QC活動(dòng)。(同行評(píng)審本身就是一種QC活動(dòng))。

    CMMI的公共特性中,沒(méi)有了測(cè)量(ME),這些度量?jī)?nèi)容被組織起來(lái)形成了一個(gè)支持過(guò)程“度量和分析”。具體理由如下:
    度量和分析本身應(yīng)用的復(fù)雜性和它執(zhí)行的高成本在原來(lái)的CMM中每個(gè)KPA均有單獨(dú)的測(cè)量要求,容易造成“過(guò)度測(cè)量”,也沒(méi)有形成對(duì)組織級(jí)的、統(tǒng)一的度量體系的指導(dǎo)和要求,造成實(shí)施中的困難。例如在CMM中如果一個(gè)組織達(dá)到了CMM三級(jí),由于各個(gè)KPA均要求了測(cè)量(ME),實(shí)際上已經(jīng)建立了全組織過(guò)程的測(cè)量,這和CMM的等級(jí)劃分思想是有著沖突的。

    總結(jié):
    CMMI改進(jìn)了這個(gè)方面,要求組織從組織級(jí)的統(tǒng)一要求出發(fā)建立度量體系。這樣的想法也符合過(guò)程改進(jìn)理論的思想;這樣組織在實(shí)施過(guò)程中可以選擇必要的過(guò)程進(jìn)行測(cè)量,而不是全部過(guò)程的測(cè)量,從這個(gè)意義上,CMMI對(duì)比CMM降低了對(duì)度量的要求和實(shí)施難度,但是更加具有全局性和可實(shí)施性。

    CMM是作為評(píng)估標(biāo)準(zhǔn)出現(xiàn)的,所以是“必要”的才能保證評(píng)估的標(biāo)準(zhǔn)。

    CMMI是作為改進(jìn)模型出現(xiàn)的,羅列了較多的最佳實(shí)踐,利于過(guò)程的改進(jìn)。

    posted @ 2008-11-07 10:25 sanwish 閱讀(149) | 評(píng)論 (0)編輯 收藏

    背景:
    EasyMock 2 版本必須要 JDK5 才能使用 EasyMock 1.2 可以在 JDK 1.4 使用
    也可以使用 Retrotranslator 將 EasyMock 2 版本改為 JDK 1.4 也可以使用的。
    目前使用的是 EasyMock 2.2

    準(zhǔn)備:
    先弄個(gè)接口 Haha 用來(lái) Mock 的,兩個(gè)方法
    void haha(String s);
    String hehe(String s);

    開(kāi)始 Mock:

    靜態(tài)導(dǎo)入 EasyMock
    import static org.easymock.EasyMock.*;

    然后
    Haha haha=createMock(Haha.class);

    無(wú)返回值的調(diào)用可以直接調(diào)用 Mock 方法

    haha.haha("haha");

    有返回值的可以

    expect(haha.hehe("hehe")).andReturn("ok");

    這樣做完后

    你要 replay(haha); 一下,表示錄完 mock ,準(zhǔn)備重放了。

    就可以調(diào)用 haha.haha("haha") 了,同樣的,調(diào)用 haha.hehe("hehe") 的返回值是 "ok"

    全部調(diào)用完了,使用 verify(haha); 查看一下預(yù)期的調(diào)用是不是都調(diào)了,如果預(yù)期要調(diào)用一次,卻沒(méi)調(diào),那就會(huì) AssertionError 哦。

    調(diào)用次數(shù)

    上面這些都是默認(rèn)調(diào)用一次,就相當(dāng)于 expect(haha.hehe("hehe")).andReturn("ok").times(1); 或 expect(haha.hehe("hehe")).andReturn("ok").once();

    如果想調(diào)用任意次,就 expect(haha.hehe("hehe")).andReturn("ok").anyTimes();

    如果想最少調(diào)用一次,就 expect(haha.hehe("hehe")).andReturn("ok").atLeastOnce();

    如果想調(diào)用 1 至 3 次,就 expect(haha.hehe("hehe")).andReturn("ok").times(1,3);

    預(yù)期的結(jié)果

    還可以 expect(haha.hehe("hehe")).andReturn("ok").andReturn("ok too").andThrow(new RuntimeException());

    這樣,第一次調(diào)用 haha.hehe("hehe") 時(shí)返回 "ok" ,第二次返回 "ok too",第三次調(diào)用就比較慘了,會(huì)拋出一個(gè) RuntimeException,需要注意
    的是,如果拋出的異常是 unchecked 的,就是 Runtime 的,就隨便拋,如果是 checked 的,那就一定要拋這個(gè)方法定義的,否則會(huì)在 andThrow 這行出 IllegalArgumentException 。

    終極解決辦法還可以使用 andAnswer(IAnswer<T> answer) 傳一個(gè)實(shí)現(xiàn) IAnswer 接口的實(shí)例,這個(gè)接口只有一個(gè)方法
    T answer() throws Throwable;
    隨便你返回什么,或是拋出什么異常。

    調(diào)用順序

    不 過(guò)如上面所說(shuō),haha.haha("haha") 與 haha.hehe("hehe") 是沒(méi)有順序的,將 createMock 改成 createStrictMock 或在 createMock 后面加一行 checkOrder(haha,true) 就可以了,這時(shí),就一定要按照定義的順序來(lái)調(diào)用了。

    如果多個(gè)不同的 mock 也要保證順序呢?那就不能使用 createMock 來(lái)創(chuàng)建這些 mock 了,因?yàn)槊看?createMock 都會(huì)使用一個(gè)新的 IMocksControl 實(shí)例來(lái)單獨(dú)控制這個(gè) mock ,我們希望將多個(gè) mock 用同一個(gè) IMocksControl 控制,只需要

    IMocksControl ctrl = createStrictControl();
    Haha haha1= ctrl.createMock(Haha .class);
    Haha haha2 = ctrl.createMock(Haha .class);

    haha1.haha("haha1");
    haha2.haha("haha2");

    ctrl.replay();

    就可以了

    預(yù)期的參數(shù)

    剛才 haha.haha("haha") 中的 "haha" 就是預(yù)期的參數(shù),EasyMock 提供了很多預(yù)期參數(shù)的方法,比如 haha.haha(eq("haha")),與前面的方法功能完全一樣
    haha.haha((String)anyObject) 隨便你傳什么參數(shù)都沒(méi)問(wèn)題。
    haha.haha(not(eq("haha"))) 這個(gè)只要不傳 haha ,其它什么都成

    同 樣可以自定義,只要調(diào)用 ??? public static void reportMatcher(IArgumentMatcher matcher) 方法,將自定義的 IArgumentMatcher 傳進(jìn)去就可以了,這個(gè)接口有兩個(gè)方法 boolean matches(Object argument)?? 和 void appendTo(StringBuffer buffer) 第一個(gè)方法的參數(shù)是調(diào)用實(shí)際傳入的值,返回是否匹配,第二個(gè)方法是錯(cuò)誤時(shí)向 buffer 中 append 錯(cuò)誤信息。

    將方法弄成 Stub

    Stub 方法,我想應(yīng)該就是隨便調(diào),愛(ài)怎么調(diào)就怎么調(diào),返回的都是那個(gè)值,最后也不會(huì)驗(yàn)證到底調(diào)用了多少次。
    如果想把一個(gè)方法弄成 Stub,無(wú)返回值的只要 asStub() 就是 expect(haha.haha("haha")).asStub() ,有返回值的就 andStubReturn() , andStubAnswer() 這樣就可以了。

    友好的Mock

    我們使用 createMock 創(chuàng)建出來(lái)的 mock 對(duì)象,如果沒(méi)有錄過(guò),調(diào)用這個(gè)方法都會(huì)出 AssertionError ,但如果使用 createNiceMock 就不會(huì)了,會(huì)返回 0 , null , false 這樣的。
    posted @ 2008-11-07 09:56 sanwish 閱讀(451) | 評(píng)論 (0)編輯 收藏

    1 Ant是什么?
    Apache Ant 是一個(gè)基于 Java的生成工具。
    簡(jiǎn)單點(diǎn)說(shuō)就是:java中的MAKEFILE,它根據(jù)build.xml的內(nèi)容自動(dòng)編譯java
    2 下載、安裝Ant
    安裝Ant
    下載.zip文件,解壓縮到c:\ant1.3(后面引用為%ANT_HOME%)

    2.1 在你運(yùn)行Ant之前需要做一些配置工作。
    ? 將bin目錄加入PATH環(huán)境變量。
    ? 設(shè)定ANT_HOME環(huán)境變量,指向你安裝Ant的目錄。在一些OS上,Ant的腳本可以猜測(cè)ANT_HOME(Unix和Windos NT/2000)-但最好不要依賴這一特性。
    ? 可選地,設(shè)定JAVA_HOME環(huán)境變量(參考下面的高級(jí)小節(jié)),該變量應(yīng)該指向你安裝JDK的目錄。
    注意:不要將Ant的ant.jar文件放到JDK/JRE的lib/ext目錄下。Ant是個(gè)應(yīng)用程序,而lib/ext目錄是為JDK擴(kuò)展使用的(如JCE,JSSE擴(kuò)展)。而且通過(guò)擴(kuò)展裝入的類會(huì)有安全方面的限制。
    2.2 運(yùn)行Ant

    運(yùn)行Ant非常簡(jiǎn)單,當(dāng)你正確地安裝Ant后,只要輸入ant就可以了。

    一般以:ant 打頭 加一個(gè)build.xml中target 中的name屬性的值...下一篇我講介紹build.xml各個(gè)任務(wù)的作用

    ? 沒(méi)有指定任何參數(shù)時(shí),Ant會(huì)在當(dāng)前目錄下查詢build.xml文件。如果找到了就用該文件作為buildfile。如果你用 -find 選項(xiàng)。Ant就會(huì)在上級(jí)目錄中尋找buildfile,直至到達(dá)文件系統(tǒng)的根。要想讓Ant使用其他的buildfile,可以用參數(shù) -buildfile file,這里file指定了你想使用的buildfile。

    ? 可以指定執(zhí)行一個(gè)或多個(gè)target。當(dāng)省略target時(shí),Ant使用標(biāo)簽<project>的default屬性所指定的target。


    命令行選項(xiàng)總結(jié):
    ant [options] [target [target2 [target3] ...]]
    Options:
    -help print this message
    -projecthelp print project help information
    -version print the version information and exit
    -quiet be extra quiet
    -verbose be extra verbose
    -debug print debugging information
    -emacs produce logging information without adornments
    -logfile file use given file for log output
    -logger classname the class that is to perform logging
    -listener classname add an instance of class as a project listener
    -buildfile file use specified buildfile
    -find file search for buildfile towards the root of the filesystem and use the first one found
    -Dproperty=value set property to value
    例子
    ant
    使用當(dāng)前目錄下的build.xml運(yùn)行Ant,執(zhí)行缺省的target。
    ant -buildfile test.xml
    使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行缺省的target。
    ant -buildfile test.xml dist
    使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行一個(gè)叫做dist的target。
    ant -buildfile test.xml -Dbuild=build/classes dist
    使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行一個(gè)叫做dist的target,并設(shè)定build屬性的值為build/classes。

    3 編寫build.xml

    Ant的buildfile是用XML寫的。每個(gè)buildfile含有一個(gè)project。

    buildfile中每個(gè)task元素可以有一個(gè)id屬性,可以用這個(gè)id值引用指定的任務(wù)。這個(gè)值必須是唯一的。(詳情請(qǐng)參考下面的Task小節(jié))

    3.1 Projects

    project有下面的屬性:
    Attribute Description Required
    name 項(xiàng)目名稱. No
    default 當(dāng)沒(méi)有指定target時(shí)使用的缺省target Yes
    basedir 用于計(jì)算所有其他路徑的基路徑。該屬性可以被basedir property覆蓋。當(dāng)覆蓋時(shí),該屬性被忽略。如果屬性和basedir property都沒(méi)有設(shè)定,就使用buildfile文件的父目錄。 No
    項(xiàng)目的描述以一個(gè)頂級(jí)的<description>元素的形式出現(xiàn)(參看description小節(jié))。

    一個(gè)項(xiàng)目可以定義一個(gè)或多個(gè)target。一個(gè)target是一系列你想要執(zhí)行的。執(zhí)行Ant時(shí),你可以選擇執(zhí)行那個(gè)target。當(dāng)沒(méi)有給定target時(shí),使用project的default屬性所確定的target。

    3.2 Targets

    一個(gè)target可以依賴于其他的target。例如,你可能會(huì)有一個(gè)target用于編譯程序,一個(gè)target用于生成可執(zhí)行文件。你在生成可執(zhí)行文件之前必須先編譯通過(guò),所以生成可執(zhí)行文件的target依賴于編譯target。Ant會(huì)處理這種依賴關(guān)系。

    然而,應(yīng)當(dāng)注意到,Ant的depends屬性只指定了target應(yīng)該被執(zhí)行的順序-如果被依賴的target無(wú)法運(yùn)行,這種depends對(duì)于指定了依賴關(guān)系的target就沒(méi)有影響。

    Ant會(huì)依照depends屬性中target出現(xiàn)的順序(從左到右)依次執(zhí)行每個(gè)target。然而,要記住的是只要某個(gè)target依賴于一個(gè)target,后者就會(huì)被先執(zhí)行。
    <target name="A"/>
    <target name="B" depends="A"/>
    <target name="C" depends="B"/>
    <target name="D" depends="C,B,A"/>
    假定我們要執(zhí)行target D。從它的依賴屬性來(lái)看,你可能認(rèn)為先執(zhí)行C,然后B,最后A被執(zhí)行。錯(cuò)了,C依賴于B,B依賴于A,所以先執(zhí)行A,然后B,然后C,最后D被執(zhí)行。

    一個(gè)target只能被執(zhí)行一次,即時(shí)有多個(gè)target依賴于它(看上面的例子)。

    如果(或如果不)某些屬性被設(shè)定,才執(zhí)行某個(gè)target。這樣,允許根據(jù)系統(tǒng)的狀態(tài)(java version, OS, 命令行屬性定義等等)來(lái)更好地控制build的過(guò)程。要想讓一個(gè)target這樣做,你就應(yīng)該在target元素中,加入if(或unless)屬性,帶上target因該有所判斷的屬性。例如:
    <target name="build-module-A" if="module-A-present"/>
    <target name="build-own-fake-module-A" unless="module-A-present"/>
    如果沒(méi)有if或unless屬性,target總會(huì)被執(zhí)行。

    可選的description屬性可用來(lái)提供關(guān)于target的一行描述,這些描述可由-projecthelp命令行選項(xiàng)輸出。

    將你的tstamp task在一個(gè)所謂的初始化target是很好的做法,其他的target依賴這個(gè)初始化target。要確保初始化target是出現(xiàn)在其他target依賴表中的第一個(gè)target。在本手冊(cè)中大多數(shù)的初始化target的名字是"init"。

    target有下面的屬性:
    Attribute Description Required
    name target的名字 Yes
    depends 用逗號(hào)分隔的target的名字列表,也就是依賴表。 No
    if 執(zhí)行target所需要設(shè)定的屬性名。 No
    unless 執(zhí)行target需要清除設(shè)定的屬性名。 No
    description 關(guān)于target功能的簡(jiǎn)短描述。 No

    3.3 Tasks

    一個(gè)task是一段可執(zhí)行的代碼。

    一個(gè)task可以有多個(gè)屬性(如果你愿意的話,可以將其稱之為變量)。屬性只可能包含對(duì)property的引用。這些引用會(huì)在task執(zhí)行前被解析。

    下面是Task的一般構(gòu)造形式:
    <name attribute1="value1" attribute2="value2" ... />
    這里name是task的名字,attributeN是屬性名,valueN是屬性值。

    有一套內(nèi)置的(built-in)task,以及一些可選task,但你也可以編寫自己的task。

    所有的task都有一個(gè)task名字屬性。Ant用屬性值來(lái)產(chǎn)生日志信息。

    可以給task賦一個(gè)id屬性:
    <taskname id="taskID" ... />
    這里taskname是task的名字,而taskID是這個(gè)task的唯一標(biāo)識(shí)符。通過(guò)這個(gè)標(biāo)識(shí)符,你可以在腳本中引用相應(yīng)的task。例如,在腳本中你可以這樣:
    <script ... >
    task1.setFoo("bar");
    </script>
    設(shè)定某個(gè)task實(shí)例的foo屬性。在另一個(gè)task中(用java編寫),你可以利用下面的語(yǔ)句存取相應(yīng)的實(shí)例。
    project.getReference("task1").
    注意1:如果task1還沒(méi)有運(yùn)行,就不會(huì)被生效(例如:不設(shè)定屬性),如果你在隨后配置它,你所作的一切都會(huì)被覆蓋。

    注意2:未來(lái)的Ant版本可能不會(huì)兼容這里所提的屬性,因?yàn)楹苡锌赡芨緵](méi)有task實(shí)例,只有proxies。

    3.4 Properties

    一個(gè)project可以有很多的properties。可以在buildfile中用property task來(lái)設(shè)定,或在Ant之外設(shè)定。一個(gè)property有一個(gè)名字和一個(gè)值。property可用于task的屬性值。這是通過(guò)將屬性名放在"${"和"}"之間并放在屬性值的位置來(lái)實(shí)現(xiàn)的。例如如果有一個(gè)property builddir的值是"build",這個(gè)property就可用于屬性值:${builddir}/classes。這個(gè)值就可被解析為build/classes。

    內(nèi)置屬性

    如果你使用了<property> task 定義了所有的系統(tǒng)屬性,Ant允許你使用這些屬性。例如,${os.name}對(duì)應(yīng)操作系統(tǒng)的名字。

    要想得到系統(tǒng)屬性的列表可參考the Javadoc of System.getProperties。

    除了Java的系統(tǒng)屬性,Ant還定義了一些自己的內(nèi)置屬性:
    basedir project基目錄的絕對(duì)路徑 (與<project>的basedir屬性一樣)。
    ant.file buildfile的絕對(duì)路徑。
    ant.version Ant的版本。
    ant.project.name 當(dāng)前執(zhí)行的project的名字;由<project>的name屬性設(shè)定.
    ant.java.version Ant檢測(cè)到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

    例子
    <project name="MyProject" default="dist" basedir=".">

    <!-- set global properties for this build -->
    <property name="src" value="."/>
    <property name="build" value="build"/>
    <property name="dist" value="dist"/>

    <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
    </target>

    <target name="compile" depends="init">
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
    </target>

    <target name="dist" depends="compile">
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>
    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
    </target>

    <target name="clean">
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
    </target>

    </project>
    3.5 Path-like Structures
    你可以用":"和";"作為分隔符,指定類似PATH和CLASSPATH的引用。Ant會(huì)把分隔符轉(zhuǎn)換為當(dāng)前系統(tǒng)所用的分隔符。

    當(dāng)需要指定類似路徑的值時(shí),可以使用嵌套元素。一般的形式是
    <classpath>
    <pathelement path="${classpath}"/>
    <pathelement location="lib/helper.jar"/>
    </classpath>
    location屬性指定了相對(duì)于project基目錄的一個(gè)文件和目錄,而path屬性接受逗號(hào)或分號(hào)分隔的一個(gè)位置列表。path屬性一般用作預(yù)定義的路徑--其他情況下,應(yīng)該用多個(gè)location屬性。

    為簡(jiǎn)潔起見(jiàn),classpath標(biāo)簽支持自己的path和location屬性。所以:
    <classpath>
    <pathelement path="${classpath}"/>
    </classpath>
    可以被簡(jiǎn)寫作:
    <classpath path="${classpath}"/>
    也可通過(guò)<fileset>元素指定路徑。構(gòu)成一個(gè)fileset的多個(gè)文件加入path-like structure的順序是未定的。
    <classpath>
    <pathelement path="${classpath}"/>
    <fileset dir="lib">
    <include name="**/*.jar"/>
    </fileset>
    <pathelement location="classes"/>
    </classpath>
    上面的例子構(gòu)造了一個(gè)路徑值包括:${classpath}的路徑,跟著lib目錄下的所有jar文件,接著是classes目錄。

    如果你想在多個(gè)task中使用相同的path-like structure,你可以用<path>元素定義他們(與target同級(jí)),然后通過(guò)id屬性引用--參考Referencs例子。

    path-like structure可能包括對(duì)另一個(gè)path-like structurede的引用(通過(guò)嵌套<path>元素):
    <path id="base.path">
    <pathelement path="${classpath}"/>
    <fileset dir="lib">
    <include name="**/*.jar"/>
    </fileset>
    <pathelement location="classes"/>
    </path>
    <path id="tests.path">
    <path refid="base.path"/>
    <pathelement location="testclasses"/>
    </path>
    前面所提的關(guān)于<classpath>的簡(jiǎn)潔寫法對(duì)于<path>也是有效的,如:
    <path id="tests.path">
    <path refid="base.path"/>
    <pathelement location="testclasses"/>
    </path>
    可寫成:
    <path id="base.path" path="${classpath}"/>
    命令行變量

    有些task可接受參數(shù),并將其傳遞給另一個(gè)進(jìn)程。為了能在變量中包含空格字符,可使用嵌套的arg元素。
    Attribute Description Required
    value 一個(gè)命令行變量;可包含空格字符。 只能用一個(gè)
    line 空格分隔的命令行變量列表。
    file 作為命令行變量的文件名;會(huì)被文件的絕對(duì)名替代。
    path 一個(gè)作為單個(gè)命令行變量的path-like的字符串;或作為分隔符,Ant會(huì)將其轉(zhuǎn)變?yōu)樘囟ㄆ脚_(tái)的分隔符。

    例子
    <arg value="-l -a"/>
    是一個(gè)含有空格的單個(gè)的命令行變量。
    <arg line="-l -a"/>
    是兩個(gè)空格分隔的命令行變量。
    <arg path="/dir;/dir2:\dir3"/>
    是一個(gè)命令行變量,其值在DOS系統(tǒng)上為\dir;\dir2;\dir3;在Unix系統(tǒng)上為/dir:/dir2:/dir3 。

    References

    buildfile元素的id屬性可用來(lái)引用這些元素。如果你需要一遍遍的復(fù)制相同的XML代碼塊,這一屬性就很有用--如多次使用<classpath>結(jié)構(gòu)。

    下面的例子:
    <project ... >
    <target ... >
    <rmic ...>
    <classpath>
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </classpath>
    </rmic>
    </target>
    <target ... >
    <javac ...>
    <classpath>
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </classpath>
    </javac>
    </target>
    </project>
    可以寫成如下形式:
    <project ... >
    <path id="project.class.path">
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </path>
    <target ... >
    <rmic ...>
    <classpath refid="project.class.path"/>
    </rmic>
    </target>
    <target ... >
    <javac ...>
    <classpath refid="project.class.path"/>
    </javac>
    </target>
    </project>
    所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受這種類型的引用。

    ?

    4.1 File(Directory)類
    4.1.1 Mkdir
    ? 創(chuàng)建一個(gè)目錄,如果他的父目錄不存在,也會(huì)被同時(shí)創(chuàng)建。
    ? 例子:
    <mkdir dir="build/classes"/>
    ? 說(shuō)明: 如果build不存在,也會(huì)被同時(shí)創(chuàng)建
    4.1.2 Copy
    ? 拷貝一個(gè)(組)文件、目錄
    ? 例子:
    1. 拷貝單個(gè)的文件:
    <copy file="myfile.txt" tofile="mycopy.txt"/>
    2. 拷貝單個(gè)的文件到指定目錄下
    <copy file="myfile.txt" todir="../some/other/dir"/>
    3. 拷貝一個(gè)目錄到另外一個(gè)目錄下
    <copy todir="../new/dir">
    <fileset dir="src_dir"/>
    </copy>
    4. 拷貝一批文件到指定目錄下
    <copy todir="../dest/dir">
    <fileset dir="src_dir">
    <exclude name="**/*.java"/>
    </fileset>
    </copy>

    <copy todir="../dest/dir">
    <fileset dir="src_dir" excludes="**/*.java"/>
    </copy>
    5. 拷貝一批文件到指定目錄下,將文件名后增加。Bak后綴
    <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <mapper type="glob" from="*" to="*.bak"/>
    </copy>
    6. 拷貝一組文件到指定目錄下,替換其中的@標(biāo)簽@內(nèi)容
    <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <filterset>
    <filter token="TITLE" value="Foo Bar"/>
    </filterset>
    </copy>
    4.1.3 Delete
    ? 刪除一個(gè)(組)文件或者目錄
    ? 例子
    1. 刪除一個(gè)文件
    <delete file="/lib/ant.jar"/>
    2. 刪除指定目錄及其子目錄
    <delete dir="lib"/>
    3. 刪除指定的一組文件
    <delete>
    <fileset dir="." includes="**/*.bak"/>
    </delete>
    4. 刪除指定目錄及其子目錄,包括他自己
    <delete includeEmptyDirs="true">
    <fileset dir="build"/>
    </delete>
    4.1.4 Move
    ? 移動(dòng)或重命名一個(gè)(組)文件、目錄
    ? 例子:
    1. 移動(dòng)或重命名一個(gè)文件
    <move file="file.orig" tofile="file.moved"/>
    2. 移動(dòng)或重命名一個(gè)文件到另一個(gè)文件夾下面
    <move file="file.orig" todir="dir/to/move/to"/>
    3. 將一個(gè)目錄移到另外一個(gè)目錄下
    <move todir="new/dir/to/move/to">
    <fileset dir="src/dir"/>
    </move>
    4. 將一組文件移動(dòng)到另外的目錄下
    <move todir="some/new/dir">
    <fileset dir="my/src/dir">
    <include name="**/*.jar"/>
    <exclude name="**/ant.jar"/>
    </fileset>
    </move>
    5. 移動(dòng)文件過(guò)程中增加。Bak后綴
    <move todir="my/src/dir">
    <fileset dir="my/src/dir">
    <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
    </move>

    ?


    4.2 Java相關(guān)
    4.2.1 Javac
    ? 編譯java原代碼
    ? 例子
    1. <javac srcdir="${src}"
    destdir="${build}"
    classpath="xyz.jar"
    debug="on"
    />
    編譯${src}目錄及其子目錄下的所有。Java文件,。Class文件將放在${build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設(shè)置為on表示輸出debug信息
    2. <javac srcdir="${src}:${src2}"
    destdir="${build}"
    includes="mypackage/p1/**,mypackage/p2/**"
    excludes="mypackage/p1/testpackage/**"
    classpath="xyz.jar"
    debug="on"
    />
    編譯${src}和${src2}目錄及其子目錄下的所有。Java文件,但是package/p1/**,mypackage/p2/**將被編譯,而mypackage/p1/testpackage/**將不會(huì)被編譯。Class文件將放在${build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設(shè)置為on表示輸出debug信息
    3. <property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>

    <javac srcdir="${src}"
    destdir="${src}"
    classpath="${classpath}"
    debug="on"
    />
    路徑是在property中定義的
    4.2.2 java
    ? 執(zhí)行指定的java類


    ? 例子:
    1. <java classname="test.Main">
    <classpath>
    <pathelement location="dist/test.jar"/>
    <pathelement path="${java.class.path}"/>
    </classpath>
    </java>
    classname中指定要執(zhí)行的類,classpath設(shè)定要使用的環(huán)境變量
    2. <path id="project.class.path">
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </path>

    <target ... >
    <rmic ...>
    <classpath refid="project.class.path"/>
    </rmic>
    </target>

    ?

    ?

    4.3 打包相關(guān)
    4.3.1 jar
    ? 將一組文件打包
    ? 例子:
    1. <jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
    將${build}/classes下面的所有文件打包到${dist}/lib/app.jar中
    2. <jar destfile="${dist}/lib/app.jar"
    basedir="${build}/classes"
    includes="mypackage/test/**"
    excludes="**/Test.class"
    />
    將${build}/classes下面的所有文件打包到${dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class
    3. <jar destfile="${dist}/lib/app.jar"
    basedir="${build}/classes"
    includes="mypackage/test/**"
    excludes="**/Test.class"
    manifest=”my.mf”
    />
    manifest屬性指定自己的META-INF/MANIFEST.MF文件,而不是由系統(tǒng)生成
    4.3.2 war
    ? 對(duì)Jar的擴(kuò)展,用于打包Web應(yīng)用
    ? 例子:
    ? 假設(shè)我們的文件目錄如下:
    thirdparty/libs/jdbc1.jar
    thirdparty/libs/jdbc2.jar
    build/main/com/myco/myapp/Servlet.class
    src/metadata/myapp.xml
    src/html/myapp/index.html
    src/jsp/myapp/front.jsp
    src/graphics/images/gifs/small/logo.gif
    src/graphics/images/gifs/large/logo.gif
    ? 下面是我們的任務(wù)的內(nèi)容:
    <war destfile="myapp.war" webxml="src/metadata/myapp.xml">
    <fileset dir="src/html/myapp"/>
    <fileset dir="src/jsp/myapp"/>
    <lib dir="thirdparty/libs">
    <exclude name="jdbc1.jar"/>
    </lib>
    <classes dir="build/main"/>
    <zipfileset dir="src/graphics/images/gifs"
    prefix="images"/>
    </war>
    ? 完成后的結(jié)果:
    WEB-INF/web.xml
    WEB-INF/lib/jdbc2.jar
    WEB-INF/classes/com/myco/myapp/Servlet.class
    META-INF/MANIFEST.MF
    index.html
    front.jsp
    images/small/logo.gif
    images/large/logo.gif
    4.3.3 ear
    ? 用于打包企業(yè)應(yīng)用
    ? 例子
    <ear destfile="${build.dir}/myapp.ear" appxml="${src.dir}/metadata/application.xml">
    <fileset dir="${build.dir}" includes="*.jar,*.war"/>
    </ear>

    ?

    4.4 時(shí)間戳
    在生成環(huán)境中使用當(dāng)前時(shí)間和日期,以某種方式標(biāo)記某個(gè)生成任務(wù)的輸出,以便記錄它是何時(shí)生成的,這經(jīng)常是可取的。這可能涉及編輯一個(gè)文件,以便插入一個(gè)字符串來(lái)指定日期和時(shí)間,或?qū)⑦@個(gè)信息合并到 JAR 或 zip 文件的文件名中。
    這種需要是通過(guò)簡(jiǎn)單但是非常有用的 tstamp 任務(wù)來(lái)解決的。這個(gè)任務(wù)通常在某次生成過(guò)程開(kāi)始時(shí)調(diào)用,比如在一個(gè) init 目標(biāo)中。這個(gè)任務(wù)不需要屬性,許多情況下只需 <tstamp/> 就足夠了。
    tstamp 不產(chǎn)生任何輸出;相反,它根據(jù)當(dāng)前系統(tǒng)時(shí)間和日期設(shè)置 Ant 屬性。下面是 tstamp 設(shè)置的一些屬性、對(duì)每個(gè)屬性的說(shuō)明,以及這些屬性可被設(shè)置到的值的例子:
    屬性 說(shuō)明 例子
    DSTAMP 設(shè)置為當(dāng)前日期,默認(rèn)格式為yyyymmdd 20031217
    TSTAMP 設(shè)置為當(dāng)前時(shí)間,默認(rèn)格式為 hhmm 1603
    TODAY 設(shè)置為當(dāng)前日期,帶完整的月份 2003 年 12 月 17 日
    例如,在前一小節(jié)中,我們按如下方式創(chuàng)建了一個(gè) JAR 文件:

    <jar destfile="package.jar" basedir="classes"/>

    在調(diào)用 tstamp 任務(wù)之后,我們能夠根據(jù)日期命名該 JAR 文件,如下所示:

    <jar destfile="package-${DSTAMP}.jar" basedir="classes"/>

    因此,如果這個(gè)任務(wù)在 2003 年 12 月 17 日調(diào)用,該 JAR 文件將被命名為 package-20031217.jar。
    還可以配置 tstamp 任務(wù)來(lái)設(shè)置不同的屬性,應(yīng)用一個(gè)當(dāng)前時(shí)間之前或之后的時(shí)間偏移,或以不同的方式格式化該字符串。所有這些都是使用一個(gè)嵌套的 format 元素來(lái)完成的,如下所示:

    <tstamp>
    <format property="OFFSET_TIME"
    pattern="HH:mm:ss"
    offset="10" unit="minute"/>
    </tstamp>

    上面的清單將 OFFSET_TIME 屬性設(shè)置為距離當(dāng)前時(shí)間 10 分鐘之后的小時(shí)數(shù)、分鐘數(shù)和秒數(shù)。
    用于定義格式字符串的字符與 java.text.SimpleDateFormat 類所定義的那些格式字符相同

    ?

    4.5 執(zhí)行SQL語(yǔ)句
    ? 通過(guò)jdbc執(zhí)行SQL語(yǔ)句
    ? 例子:
    1. <sql
    driver="org.gjt.mm.mysql.Driver"
    url="jdbc:mysql://localhost:3306/mydb"
    userid="root"
    password="root"
    src="data.sql"
    />
    2. <sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass"
    src="data.sql"
    rdbms="oracle"
    version="8.1."
    >
    </sql>
    只有在oracle、版本是8.1的時(shí)候才執(zhí)行

    ?

    4.6 發(fā)送郵件
    ? 使用SMTP服務(wù)器發(fā)送郵件
    ? 例子:
    <mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
    <from address="me@myisp.com"/>
    <to address="all@xyz.com"/>
    <message>The ${buildname} nightly build has completed</message>
    <fileset dir="dist">
    <includes name="**/*.zip"/>
    </fileset>
    </mail>
    ? mailhost: SMTP服務(wù)器地址
    ? mailport: 服務(wù)器端口
    ? subject: 主題
    ? from: 發(fā)送人地址
    ? to: 接受人地址
    ? message: 發(fā)送的消息
    ? fileset: 設(shè)置附件?


    posted @ 2008-11-07 09:22 sanwish 閱讀(169) | 評(píng)論 (0)編輯 收藏

    システムエンジニア(SE)とは、情報(bào)システムの職域をあらわす和製英語(yǔ)である。要求定義、設(shè)計(jì)、構(gòu)築、運(yùn)用に従事する職を指す。より狹い意味では、情報(bào)システムの開(kāi)発に攜わる者、とりわけ情報(bào)システムの設(shè)計(jì)開(kāi)発者のうち上級(jí)の者を指して言うこともある。単體の製品として販売されるソフトウェアを設(shè)計(jì)開(kāi)発する者は、一般的にシステムエンジニアとは呼ばれない。アメリカ合衆(zhòng)國(guó)など英語(yǔ)圏では、システム?エンジニアリング (Systems engineering)という言葉はあるが、技術(shù)者にたいしての「システムエンジニア」という呼び名は存在せず、SEはソフトウェアエンジニア(Software Engineer)の事を指す。アメリカ合衆(zhòng)國(guó)のソフトウェアエンジニアは、日本で言われるプログラマだけでなくシステムエンジニアの仕事も兼ねているのが一般的である。

    http://ja.wikipedia.org/wiki/システムエンジニア
    posted @ 2008-11-06 16:08 sanwish 閱讀(171) | 評(píng)論 (0)編輯 收藏

    OJT(On-the-Job Trainingの略)とは企業(yè)內(nèi)で行われる職業(yè)指導(dǎo)手法のひとつで、職場(chǎng)の上司や先輩が部下や後輩に対し、具體的な仕事を通じて、仕事に必要な知識(shí)?技術(shù)?技能?態(tài)度などを、意図的?計(jì)畫的?継続的に指導(dǎo)し、修得させることによって、全體的な業(yè)務(wù)処理能力や力量を育成するすべての活動(dòng)である。

    OJTという言葉は1935 - 1940年頃辭書(Webster)に採(cǎi)録されたが、アメリカで第一次世界大戦中(1914 - 1918)にできた手法とされる。これに対し、職場(chǎng)を離れての訓(xùn)練といった意味でOffJTという言葉があるが、こちらは日本の教育サービス関係企業(yè)がつくった?和製英語(yǔ)である。

    http://ja.wikipedia.org/wiki/OJT

    posted @ 2008-11-06 15:56 sanwish 閱讀(175) | 評(píng)論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-06 15:05 sanwish 閱讀(801) | 評(píng)論 (0)編輯 收藏

    1.啟動(dòng)一個(gè)WEB項(xiàng)目的時(shí)候,容器(如:Tomcat)會(huì)去讀它的配置文件web.xml.讀兩個(gè)節(jié)點(diǎn): <listener></listener> 和 <context-param></context-param>?

    2.緊接著,容器創(chuàng)建一個(gè)ServletContext(上下文),這個(gè)WEB項(xiàng)目所有部分都將共享這個(gè)上下文.?

    3.容器將<context-param></context-param>轉(zhuǎn)化為鍵值對(duì),并交給ServletContext.?

    4.容器創(chuàng)建<listener></listener>中的類實(shí)例,即創(chuàng)建監(jiān)聽(tīng).?

    5.在監(jiān)聽(tīng)中會(huì)有contextInitialized(ServletContextEvent args)初始化方法,在這個(gè)方法中獲得?
    ServletContext = ServletContextEvent.getServletContext();?
    context-param的值 = ServletContext.getInitParameter("context-param的鍵");?

    6.得到這個(gè)context-param的值之后,你就可以做一些操作了.注意,這個(gè)時(shí)候你的WEB項(xiàng)目還沒(méi)有完全啟動(dòng)完成.這個(gè)動(dòng)作會(huì)比所有的Servlet都要早.?
    換句話說(shuō),這個(gè)時(shí)候,你對(duì)<context-param>中的鍵值做的操作,將在你的WEB項(xiàng)目完全啟動(dòng)之前被執(zhí)行.?

    7.舉例.你可能想在項(xiàng)目啟動(dòng)之前就打開(kāi)數(shù)據(jù)庫(kù).?
    那么這里就可以在<context-param>中設(shè)置數(shù)據(jù)庫(kù)的連接方式,在監(jiān)聽(tīng)類中初始化數(shù)據(jù)庫(kù)的連接.?

    8.這個(gè)監(jiān)聽(tīng)是自己寫的一個(gè)類,除了初始化方法,它還有銷毀方法.用于關(guān)閉應(yīng)用前釋放資源.比如說(shuō)數(shù)據(jù)庫(kù)連接的關(guān)閉.?

    9.... 以上資料來(lái)自<<Head First Servlet&JSP>>
    posted @ 2008-11-06 13:51 sanwish 閱讀(870) | 評(píng)論 (0)編輯 收藏

    兩種方案
    1,第一種,當(dāng)參數(shù)是workbook時(shí)

    Function?WorksheetExists(wb?As?Workbook,?sName?As?String)?As?Boolean
    ??Dim?s?As?String
    ??On?Error?GoTo?ErrHandle
    ?????s?=?wb.Worksheets(sName).Name
    ?????WorksheetExists?=?True
    ?????Exit?Function
    ??ErrHandle:
    ?????WorksheetExists?=?False
    End?Function


    或者當(dāng)?shù)谝粋€(gè)參數(shù)是文件名的時(shí)候
    Function WorksheetExists(wb As String, sName As String) As Boolean
    ? Dim s As String
    ? On Error GoTo ErrHandle
    ???? Windows(GetNoPathFile(wb)).Activate
    ???? ActiveWorkbook.Sheets(sName).Select
    ???? WorksheetExists = True
    ???? Exit Function
    ? ErrHandle:
    ???? WorksheetExists = False
    End Function
    posted @ 2008-06-14 16:05 sanwish 閱讀(641) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 青青草国产免费久久久下载| 国产老女人精品免费视频| 午夜一区二区免费视频| 久久久久亚洲精品天堂久久久久久 | 久久精品7亚洲午夜a| 亚洲中文无码亚洲人成影院| 有色视频在线观看免费高清在线直播| 久久国产高潮流白浆免费观看| 四虎永久免费网站免费观看| 亚洲福利在线视频| 美女被羞羞网站免费下载| 91人人区免费区人人| 亚洲av无码成人精品区| 亚洲最大黄色网站| 一级毛片aaaaaa视频免费看| 永久免费毛片在线播放| 亚洲线精品一区二区三区影音先锋 | 自怕偷自怕亚洲精品| 黄页网站在线视频免费| 日日麻批免费40分钟日本的| 国产成人精品久久亚洲| 亚洲国产成人久久精品大牛影视 | 亚洲女人影院想要爱| 亚洲国产免费综合| 在线观看免费毛片| 亚洲色图综合网站| 三级毛片在线免费观看| 国产免费131美女视频| 亚洲一区电影在线观看| 特级做A爰片毛片免费看无码| 国产特级淫片免费看| 亚洲国产成人无码av在线播放| 中文字幕无线码免费人妻| 国产福利免费观看| 性xxxx黑人与亚洲| 9277手机在线视频观看免费| 亚洲午夜久久久影院| 视频免费1区二区三区| 香蕉高清免费永久在线视频| 亚洲春色在线观看| 国产99视频精品免费专区|