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

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

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

    數(shù)據(jù)加載中……

    2007年10月5日

    俄文網(wǎng)站出現(xiàn)亂碼解決方法

    有access數(shù)據(jù)庫(kù)的俄文網(wǎng)站出現(xiàn)亂碼的解決方法
    2008年12月12日 星期五 18:34

    最近站長(zhǎng)解決了此問(wèn)題,做俄文網(wǎng)站,后臺(tái)添加數(shù)據(jù)的時(shí)候,必須做俄文版的后臺(tái),中文版的后臺(tái)寫(xiě)數(shù)據(jù),時(shí)候前臺(tái)顯示肯定會(huì)出現(xiàn)亂碼,俄文版后臺(tái)最前面必須加<%@ codepage=866%> 866代表俄文的,下面還有幾種代表方式

    < %@ codepage=65001%>UTF-8
    <%@ codepage=936 %>簡(jiǎn)體中文
    <%@ codepage=950%>繁體中文
    <%@ codepage=437 %>美國(guó)/加拿大英語(yǔ)
    <%@ codepage=932 %>日文
    <%@ codepage=949 %>韓文

    codepage指定了IIS按什么編碼讀取。
    例如采用UTF-8編碼,就在文件的最上面加上 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
    例如采用GBK編碼,就在文件的最上面加上 <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

    管理后臺(tái)還要加上<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>

    這一句,不然部分代碼會(huì)出現(xiàn)亂碼.

    本站站長(zhǎng)解決了此問(wèn)題供大家參考.

    posted @ 2010-07-15 17:16 flyleer 閱讀(1635) | 評(píng)論 (2)編輯 收藏
    軟件項(xiàng)目管理實(shí)踐之日計(jì)劃(轉(zhuǎn)載)

    軟件項(xiàng)目管理實(shí)踐之日計(jì)劃

     袁光東 原創(chuàng)

    如何提高項(xiàng)目的生產(chǎn)率,保證項(xiàng)目按期交付是每個(gè)軟件開(kāi)發(fā)項(xiàng)目經(jīng)理都需要面對(duì)的難題。關(guān)于這方面的研究,在《人月神話(huà)》、《人件》等書(shū)籍都有很詳細(xì)的論述。研究表明,不同程序員之間的生產(chǎn)率最高差別在40倍以上。雖然筆者沒(méi)有親睹這種樣例,但是筆者的開(kāi)發(fā)和管理生涯中所發(fā)現(xiàn)的相同技術(shù)水平程序員之間的生產(chǎn)率最大差距可達(dá)4倍。這個(gè)數(shù)據(jù)就發(fā)生在筆者的一個(gè)項(xiàng)目中,這讓筆者感到非常的震驚。如果說(shuō)40倍的生產(chǎn)率差距可能會(huì)有技術(shù)能力、工作經(jīng)驗(yàn)、熟悉程度諸多因素的影響。那么,筆者所發(fā)現(xiàn)的4倍生產(chǎn)率差距卻更讓筆者感到不可思議。

    案例

        程序員J:四年開(kāi)發(fā)經(jīng)驗(yàn)

        程序員L:三年開(kāi)發(fā)經(jīng)驗(yàn)

        程序員Y:五年開(kāi)發(fā)經(jīng)驗(yàn)

        技術(shù)能力:Y > J > L

        J,L,Y同時(shí)進(jìn)入一個(gè)項(xiàng)目組,開(kāi)發(fā)時(shí)間為30個(gè)工作日,即6周,包括需求分析、設(shè)計(jì)、編碼和集成。其中編碼和單元測(cè)試時(shí)間為10個(gè)工作日(2周)。產(chǎn)生的工作績(jī)效為:

     

    程序員 規(guī)模(代碼行)
    J 1500
    L 3600
    Y 6000

        可見(jiàn),當(dāng)程序員的技能達(dá)到一定水平后,技能與生產(chǎn)率并不成正比,并不是技術(shù)水平越高的程序的生產(chǎn)率越高。

    一、最后期限

        很多程序員都會(huì)有類(lèi)似的經(jīng)歷:

        1月1日,項(xiàng)目經(jīng)理說(shuō):“小張,在1月5日之前把這項(xiàng)工作做完,詳細(xì)的需求文檔我已經(jīng)發(fā)到你的郵箱中。”

        1月1日,小張對(duì)需求文檔瞥了幾眼,估計(jì)2天就可以完成,嘀咕:“現(xiàn)在才是1月1日嘛。這項(xiàng)任務(wù)要1月5日才提交。我還有時(shí)間,不用管它,還是先看我的小說(shuō)吧。”

        1月2日,小張繼續(xù)看他那心愛(ài)的小說(shuō)......

        1月3日,小張繼續(xù)看他那心愛(ài)的小說(shuō)......

        1月4日 9:00,小張開(kāi)始看需求文檔,2小時(shí)后中斷,因?yàn)樗枰迯?fù)系統(tǒng)的一個(gè)Bug。

        1月4日 18:00,小張正在埋頭苦干,因?yàn)槊魈炀鸵峤还ぷ鳎墒且粋€(gè)代碼還沒(méi)有寫(xiě)呢。

        1月4日 23:00,小張完成大部分工作,下班走人。

        1月5日 9:00,項(xiàng)目經(jīng)理問(wèn):“小張,那個(gè)功能做完了吧?”小張答道:“就快了,今天提交沒(méi)有問(wèn)題。”

        1月5日 14:00,小張發(fā)現(xiàn)有一部份代碼需要重寫(xiě)。用戶(hù)的要求是需要一個(gè)可配置的功能,而小張卻寫(xiě)成了硬代碼。

        1月5日 17:00,項(xiàng)目經(jīng)理來(lái)到小張面前:“小張,你中午不是說(shuō)今天提交沒(méi)有問(wèn)題嗎?怎么現(xiàn)在還沒(méi)有看你提交代碼?”小張委屈地答道:“經(jīng)理,遇到一點(diǎn)小麻煩。不過(guò)相信我,下班之前一定完成。”

        1月5日 18:00,項(xiàng)目經(jīng)理急匆匆趕到小張的座位旁:“小張,請(qǐng)馬上提交代碼,不然就來(lái)不及了。”小張這時(shí)也急了:“你不要催我。這個(gè)功能麻煩大了,沒(méi)有想象得那么簡(jiǎn)單。我今天晚上得加班。”項(xiàng)目經(jīng)理無(wú)可奈何地走了。小張加班到凌晨1點(diǎn)。但程序還是有一些問(wèn)題。

        1月6日,小張仍然在修改程序......

        1月7日,小張仍然在修改程序......

        1月8日,總算是修改完成。已經(jīng)拖了三天,來(lái)不及測(cè)試,只能匆匆把代碼提交。

        后來(lái),又經(jīng)過(guò)5次修改,直到1月20日,這個(gè)功能總算是徹底完成。

        小張向項(xiàng)目經(jīng)理請(qǐng)了一周假。因?yàn)檫@兩周來(lái)幾乎每天晚上都是加班解決問(wèn)題。

        許多的程序員還會(huì)有這樣的經(jīng)歷:

        4月1日,項(xiàng)目經(jīng)理:“小王,這個(gè)功能交給你,需求你看了嗎?你看需要多長(zhǎng)時(shí)間完成?”

        小王:“哦,經(jīng)理,這個(gè)功能我剛看過(guò),大約需要1周時(shí)間。”

        項(xiàng)目經(jīng)理:“那就是4月5日可以提交啦?”

        小王:“是的,經(jīng)理。這個(gè)功能內(nèi)容很多,還要實(shí)現(xiàn)一個(gè)郵件功能,4月5日能提交已經(jīng)是我的極限了。”

        項(xiàng)目經(jīng)理:“那就4月5日吧。”

        4月2日,小王發(fā)現(xiàn):系統(tǒng)中已經(jīng)有一個(gè)類(lèi)似的郵件功能,直接使用就可以。

        4月2日 18:00,小王已經(jīng)把功能都完成了。

        4月3日 9:00,小王把功能都測(cè)試通過(guò),并且還私下請(qǐng)用戶(hù)幫他進(jìn)行測(cè)試通過(guò)。

        4月3日 11:30,項(xiàng)目經(jīng)理:“小王,那個(gè)功能做完了嗎?”

        小王:“經(jīng)理,正在做呢。你看,昨天你又叫我修改另外一個(gè)Bug。不過(guò),經(jīng)理你放心吧,4月5日一定可以提交。”(小王已經(jīng)做完工作,但聲稱(chēng)沒(méi)有做完。)

        4月4日,小王專(zhuān)注的看著一本電子書(shū),名字叫《The Deadline》。

        4月5日 15:00,小王把代碼提交,并向經(jīng)理發(fā)郵件,主題是:XXX功能已經(jīng)完成。

        4月6日 9:00,項(xiàng)目組開(kāi)會(huì),項(xiàng)目經(jīng)理表?yè)P(yáng)了小王,要求大家向小王學(xué)習(xí)。因?yàn)檫@次發(fā)布只有小王按時(shí)完成了工作。

        簡(jiǎn)直不可思議,我們的程序員就是這樣工作的。是的,我也認(rèn)為不可思議!可是哪個(gè)程序員敢保證自己沒(méi)有這么干過(guò)呢?這就是所謂的最后期限:人們總是在最后期限才開(kāi)始工作

    二、熱衷于加班

        在所有的軟件項(xiàng)目組中,加班已經(jīng)成了天經(jīng)地義的事。甚至有些管理層認(rèn)為,如果一個(gè)項(xiàng)目組不加班,說(shuō)明項(xiàng)目組沒(méi)有盡全力的去做事。我至今不明白這是什么道理,工作是否盡力與加班到底有何關(guān)系?工作的績(jī)效又與加班有何種關(guān)系?

        在筆者的項(xiàng)目組中,筆者的客戶(hù)方也曾對(duì)筆者要求項(xiàng)目組必須加班,遭到了筆者的拒絕。在保證每個(gè)階段在不加班的情況下按期完成,客戶(hù)方才勉強(qiáng)同意。事實(shí)證明,不加班也是可以把項(xiàng)目做完的,而且可以做得更好。

        在我的程序員生涯中,曾經(jīng)兩次長(zhǎng)達(dá)4個(gè)月的封閉開(kāi)發(fā)期,被要求每天從19:00-22:00集體加班。但實(shí)際情況是,每天都可能要在23:00之后才可以下班。因?yàn)轫?xiàng)目經(jīng)理沒(méi)有走,所以其它開(kāi)發(fā)人員也只能留下。痛苦的是,我在那段加班時(shí)間里除了看技術(shù)電子書(shū)外,找不到任何可做的事情。我相信,當(dāng)時(shí)項(xiàng)目組有太多的人跟我一樣。當(dāng)我每天23:00回到賓館時(shí),已經(jīng)完全麻木了。我無(wú)時(shí)不想那該死的項(xiàng)目早一天結(jié)束。在那段時(shí)間里,我最大的收獲時(shí)進(jìn)行了大量技術(shù)積累。項(xiàng)目結(jié)束時(shí),我的加班記錄累計(jì)長(zhǎng)達(dá)30人天。

        甚至有些程序員在正常的工作時(shí)間里也是不做事的,下班前開(kāi)始忙碌,加班干活。想想這樣的加班又有什么效果呢?

    三、工作成熟度與團(tuán)隊(duì)成熟度

        因此,我一直致力于研究提高個(gè)人工作績(jī)效的方法和提高項(xiàng)目組工作績(jī)效的方法。

        在長(zhǎng)期的學(xué)習(xí)、摸索、實(shí)踐中,我發(fā)現(xiàn)全心的投入工作,干好4個(gè)小時(shí)就足以把工作做好。這種全心投入產(chǎn)生的績(jī)效要比以前一周所干的還要多。如果每天努力干好8個(gè)小時(shí),你會(huì)比周?chē)娜水a(chǎn)生2倍以上的績(jī)效,當(dāng)然也會(huì)非常疲憊。

        在管理一個(gè)40人規(guī)模的團(tuán)隊(duì)時(shí),我每天投入僅僅4個(gè)小時(shí)就足夠。為什么會(huì)有這么高的工作效率?主要是長(zhǎng)期堅(jiān)持下面的方法:

        1.日計(jì)劃,列出工作清單(列出當(dāng)天需要做的事情)

        2.為任務(wù)劃優(yōu)先級(jí)(標(biāo)出當(dāng)天必須完成的事情)

        3.只做最重要的事情,而不是最緊急的事情

        4.絕不拖延,計(jì)劃當(dāng)天必須完成的事情就一定要做完才走。

        筆者長(zhǎng)期以來(lái)在思考,這個(gè)方法能否幫助團(tuán)隊(duì)提高工作績(jī)效?能否讓項(xiàng)目組提高生產(chǎn)率?能否使項(xiàng)目按期交付和提前交付?能否幫助程序員在不加班的情況下把項(xiàng)目做好?

        在筆者帶項(xiàng)目和監(jiān)控項(xiàng)目的過(guò)程中發(fā)現(xiàn),程序員工作效率不高的原因除了技能因素外,還有幾個(gè)重要的因素在影響著程序員的工作績(jī)效:

        1.工作無(wú)計(jì)劃:很多程序員根本不知道每天要做哪些事情,每天必須做完哪些事情。很少有程序員對(duì)當(dāng)天的工作進(jìn)行計(jì)劃,

        2.工作無(wú)重點(diǎn):很多程序員通常按事情發(fā)生的先后順序來(lái)做事。有時(shí),有些程序員忙碌了一天下來(lái)卻發(fā)現(xiàn)當(dāng)天其實(shí)沒(méi)有做什么有用的事情。

        3.工作無(wú)目的:程序員不知道當(dāng)天要把事情做到什么程度,完全是憑心情做事,憑良心做事。事情沒(méi)有做完,別人下班自己也跟著下班,認(rèn)為反正明天還有時(shí)間,還沒(méi)有到最后期限。

        4.工作不到位:工作起來(lái)總是覺(jué)得差不多就行。把代碼寫(xiě)完和功能能夠運(yùn)行當(dāng)作兩回事情。工作到位就是一次就把工作做好,達(dá)到可交付。

        5.工作無(wú)積極性:被動(dòng)式工作,就算工作做完也不提交,一定要等到最后期限才提交。如果比承諾時(shí)間提前提交工作,馬上就會(huì)帶來(lái)新的工作,多干和少干一個(gè)樣,誰(shuí)愿意多干呢?

        我們可以提出一個(gè)概念叫做“工作成熟度”。工作成熟度高的程序員通常會(huì)有計(jì)劃性、工作有重點(diǎn)、有目的性、工作做到位。而成熟度低的程序員通常是無(wú)計(jì)劃的,工作不分輕重,很容易被突發(fā)事件打斷當(dāng)前工作,工作要通過(guò)多次修改才能夠完成。所以,我發(fā)現(xiàn),工作成熟度對(duì)程序員生產(chǎn)率造成最直接的影響。

        筆者在監(jiān)控項(xiàng)目的過(guò)程中也發(fā)現(xiàn)造成項(xiàng)目組效率低下、進(jìn)度落后的一些因素:

        1.項(xiàng)目經(jīng)理不了解項(xiàng)目當(dāng)日狀態(tài)。是的,有些項(xiàng)目經(jīng)理根本不知道今天每個(gè)程序員會(huì)干些什么?該干些什么?

        2.項(xiàng)目經(jīng)理不了解項(xiàng)目實(shí)情。沒(méi)錯(cuò),項(xiàng)目經(jīng)理根本就不知道每個(gè)程序員當(dāng)天干了多少活,干到什么程度,還要干多久?也就不知道項(xiàng)目到了什么程序,還有多少工作量要做?

        3.項(xiàng)目經(jīng)理不知道每個(gè)人是否能夠按期交貨。項(xiàng)目經(jīng)理只能是望天收成,期望程序員憑良心、憑職業(yè)道德做事。但是,至于程序是否能夠按期交貨,只有鬼才知道。

        4.項(xiàng)目經(jīng)理不知道工作的重點(diǎn)是什么?哪些工作是本階段必須要完成的?哪些是可以拖后的?

        5.不良溝通。項(xiàng)目組的溝通不良,產(chǎn)生大量重復(fù)代碼。甚至?xí)袃蓚€(gè)程序同時(shí)開(kāi)發(fā)一個(gè)功能,但是彼此間卻不知道。

        6.信息不能共享。程序員彼此之間不知道別人干得怎么樣?也不知道項(xiàng)目整體情況到底怎么樣?這也難為程序員了,因?yàn)轫?xiàng)目經(jīng)理也不知道。

        糟糕的項(xiàng)目都存在著一個(gè)黑洞。通常會(huì)是在編碼階段,整個(gè)項(xiàng)目組就像在黑洞中穿行一樣,誰(shuí)也看不清對(duì)方,不知道黑洞的盡頭在哪里,誰(shuí)也不知道走過(guò)多少地方,還要多久才能走出黑洞。總之,項(xiàng)目經(jīng)理只能拼命的喊:“快點(diǎn),快點(diǎn),兄弟們,我們的時(shí)間不多了。”所以,項(xiàng)目經(jīng)理只能讓所有的人每天加班,星期六不能休息,到最后,星期天也不能休息。

        這就是我們可以提出的另一個(gè)概念——“團(tuán)隊(duì)成熟度”。

        “噢,伙計(jì),我已經(jīng)聽(tīng)煩了。好像是有那么回事!可是又能怎么樣呢?所有的項(xiàng)目不都是這樣過(guò)來(lái)的嗎?”

    四、日計(jì)劃做什么?

        程序員的工作成熟度直接影響了程序員的生產(chǎn)率;項(xiàng)目的團(tuán)隊(duì)成熟度直接影響了項(xiàng)目的生產(chǎn)率。如果我們能夠提高程序員工作成熟度和團(tuán)隊(duì)成熟度,就一定可以提高項(xiàng)目的生產(chǎn)率。

        而程序員工作成熟度和項(xiàng)目團(tuán)隊(duì)成熟度的共同核心點(diǎn)就是計(jì)劃。在筆者的研究和實(shí)踐過(guò)程中,可以通過(guò)在項(xiàng)目中實(shí)施日計(jì)劃來(lái)提高程序員的工作成熟度和項(xiàng)目的團(tuán)隊(duì)成熟度,從而提高程序員的生產(chǎn)率和項(xiàng)目的生產(chǎn)率。

        實(shí)施日計(jì)劃的流程:

        1.每天8:30-8:35,項(xiàng)目組召開(kāi)晨會(huì)。由項(xiàng)目經(jīng)理列出每個(gè)開(kāi)發(fā)人員的工作清單,并對(duì)每個(gè)工作任務(wù)標(biāo)注優(yōu)先級(jí)別,設(shè)定任務(wù)完成的標(biāo)準(zhǔn),指明當(dāng)日必須要完成的任務(wù),并得到責(zé)任人的承諾。

        2.每天下班前20分鐘,由項(xiàng)目經(jīng)理依次檢查開(kāi)發(fā)人員的工作。評(píng)定工作是否完成。如果有開(kāi)發(fā)人員未能完成任務(wù),一起分析任務(wù)未能完成的原因。然后召開(kāi)一個(gè)簡(jiǎn)單的會(huì)議,介紹當(dāng)天工作的完成情況及當(dāng)前階段的項(xiàng)目狀態(tài),未完成任務(wù)的開(kāi)發(fā)人員需要加班完成。

        每天早晨的會(huì)議我們稱(chēng)之為晨會(huì),下午的會(huì)議稱(chēng)之為夕會(huì)。

        日計(jì)劃的實(shí)施環(huán)節(jié):設(shè)定目標(biāo),制定計(jì)劃,檢查,反饋。

        日計(jì)劃的特點(diǎn):

        1.開(kāi)發(fā)人員每天在晨會(huì)承諾完成的任務(wù)必須當(dāng)天完成,提倡日清日結(jié)。

        2.提交可交付的成果。(事先制定任務(wù)完成的標(biāo)準(zhǔn),并由項(xiàng)目經(jīng)理進(jìn)行檢查,評(píng)定任務(wù)是否完成。)

        3.做最重要的事情

        4.保證把工作做完

    五、我們是怎么實(shí)施日計(jì)劃的?

        日計(jì)劃看起來(lái)非常簡(jiǎn)單,下面我們將對(duì)日計(jì)劃的實(shí)踐進(jìn)行討論。

        1.實(shí)施日計(jì)劃對(duì)項(xiàng)目有什么作用?

        · 實(shí)施日計(jì)劃,使項(xiàng)目有良好的溝通機(jī)制。每個(gè)開(kāi)發(fā)人員都非常清楚項(xiàng)目的當(dāng)前情況:項(xiàng)目已經(jīng)完成了多少?還有多少工作沒(méi)有完成?

        · 日計(jì)劃提倡可交付的成果,也就是每天完成的工作都一定是可交付的。

        · 日計(jì)劃提倡只做最重要的事情,使項(xiàng)目抓住了重點(diǎn)。

        · 項(xiàng)目經(jīng)理通過(guò)實(shí)施日計(jì)劃,非常清楚每個(gè)開(kāi)發(fā)人員每天需要完成哪些任務(wù),每天必須完成哪些任務(wù),以及每個(gè)人的完成情況怎么樣?項(xiàng)目經(jīng)理充分地掌握了項(xiàng)目的情況,可以及時(shí)調(diào)整計(jì)劃,應(yīng)對(duì)各種變化。

        · 日計(jì)劃實(shí)現(xiàn)了項(xiàng)目的良好溝通,每項(xiàng)任務(wù)都由開(kāi)發(fā)人員和項(xiàng)目經(jīng)理達(dá)成一致。

        · 日計(jì)劃通過(guò)晨會(huì)和夕會(huì)實(shí)現(xiàn)了項(xiàng)目組的信息共享。

        2.實(shí)施日計(jì)劃對(duì)程序員的作用

        · 日計(jì)劃列出了程序員每天要做的任務(wù)清單,并且對(duì)任務(wù)確定優(yōu)先級(jí)。

        · 對(duì)程序員的工作指明方向,并且要求程序員優(yōu)先做最重要的任務(wù),使程序員抓住了工作重點(diǎn)。

        · 日計(jì)劃要求提交可交付的成果,要求程序員把工作一步要做到位,養(yǎng)成良好的習(xí)慣。

        · 日計(jì)劃提高了程序員的工作績(jī)效,程序員可以回到正常的工作時(shí)間,減少無(wú)謂的加班。

        · 程序員比以前完成更多的工作而獲得獎(jiǎng)勵(lì)。

    3.在實(shí)施日計(jì)劃時(shí),與傳統(tǒng)項(xiàng)目管理的工作分配有什么不同?如何進(jìn)行工作分配?

        傳統(tǒng)項(xiàng)目管理的工作分配中,工作項(xiàng)的粒度比較粗。每一個(gè)工作項(xiàng)通常指一個(gè)功能。通常是把一個(gè)功能分給某程序員,甚至把一個(gè)模塊分派給某個(gè)程序員。工作項(xiàng)的工時(shí)以周為單位,通常是一周或者兩周。

     

    傳統(tǒng)項(xiàng)目管理任務(wù)分配表
    模塊 功能  當(dāng)前狀態(tài) 計(jì)劃開(kāi)始 計(jì)劃結(jié)束 實(shí)際開(kāi)始 實(shí)際結(jié)束 責(zé)任人
    訂單管理  訂單信息查詢(xún) 已開(kāi)始 2009-3-1  2009-3-7 2009-3-1    L
    新增訂單 已開(kāi)始 2009-3-1  2009-3-7 2009-3-1    L
    訂單管理 修改訂單 未開(kāi)始 2009-3-1  2009-3-7     L
    刪除訂單 未開(kāi)始 2009-3-1  2009-3-7     L

        實(shí)施日計(jì)劃的工作分配中,“工作項(xiàng)”的粒度更小。如果按照XP和Scrum的說(shuō)法,功能就是指一個(gè)“故事”,完成“功能”的步驟或事件叫“任務(wù)”。

        傳統(tǒng)項(xiàng)目管理的任務(wù)分配是以“故事”為最小粒度。日計(jì)劃的任務(wù)分配是以“任務(wù)”為最小粒度。“任務(wù)”是指完成某一個(gè)“功能”的步驟或事件。每個(gè)人當(dāng)天的任務(wù)工時(shí)總合為1人天。

        故事和任務(wù)的區(qū)別:

     

    故事
    任務(wù)
    訂單信息查詢(xún)
    DAO編碼
    DAO單元測(cè)試
    業(yè)務(wù)層編碼
    JSP表示層編碼
    集成測(cè)試

        要實(shí)現(xiàn)訂單信息查詢(xún)就由右邊的那些任務(wù)組成。

        開(kāi)始,我不知道怎樣來(lái)描述一個(gè)“功能”和實(shí)現(xiàn)一個(gè)功能細(xì)化的“任務(wù)”。后來(lái),當(dāng)我看到Scrum的書(shū)籍后,看到Sprint和任務(wù)板時(shí),才知道自己的實(shí)踐與Scrum的某些實(shí)踐竟有如此相似之處。我困惑很久,想不到用什么詞來(lái)表示一個(gè)“功能”和實(shí)現(xiàn)一個(gè)功能所需要的“步驟”。Scrum使用“故事”和“任務(wù)”來(lái)定義它們,我認(rèn)為非常的準(zhǔn)確到位。

        但是日計(jì)劃的工作分配與Scrum的工作分配是不同的。實(shí)施日計(jì)劃是由項(xiàng)目經(jīng)理主導(dǎo)的;而Scrum強(qiáng)調(diào)由程序員主導(dǎo)。至于這兩種方式,哪一種更好。我覺(jué)得可以結(jié)合具體的情況進(jìn)行不同的實(shí)踐。

        如果是程序員成熟度比較高的項(xiàng)目,可以由程序員來(lái)主導(dǎo)。程序員成熟度較低和工期很緊的項(xiàng)目,可以由項(xiàng)目經(jīng)理來(lái)主導(dǎo)。總之,這都需要程序員和項(xiàng)目經(jīng)理達(dá)成一致。程序員需要向項(xiàng)目經(jīng)理承諾。

        Scrum會(huì)對(duì)每個(gè)任務(wù)進(jìn)行事先估算,而日計(jì)劃分配工作任務(wù)前才會(huì)進(jìn)行估算,并且只為每個(gè)人分配工作量為1人天的任務(wù)總和。

     

    日計(jì)劃樣例:2009-3-22程序員L工作計(jì)劃
    開(kāi)發(fā)人員  今日計(jì)劃工作及完成情況
    序號(hào) 工作任務(wù) 優(yōu)先級(jí) 完成標(biāo)準(zhǔn) 是否完成 完成百分比 完成情況 未完成原因 檢查人
    L 1 訂單管理模塊DAO實(shí)現(xiàn) 50 單元測(cè)試通過(guò)          
    2 與用戶(hù)確認(rèn)頁(yè)面原型 10 用戶(hù)確認(rèn)郵件          

        程序員L任務(wù)1的優(yōu)先級(jí)為50,任務(wù)2的優(yōu)先級(jí)為10。這并不表示兩個(gè)任務(wù)的重要程度相差40,而是表示L當(dāng)天應(yīng)該先做任務(wù)1,再做任務(wù)2。

        筆者認(rèn)為這種日計(jì)劃更加靈活。因?yàn)轫?xiàng)目經(jīng)理可以靈活的設(shè)置任務(wù)。Scrum的任務(wù)都是依據(jù)故事。日計(jì)劃甚至可以把與開(kāi)發(fā)根本不相干的事情包括進(jìn)來(lái)。

        當(dāng)天要完成哪些任務(wù)是由項(xiàng)目經(jīng)理先計(jì)劃的,但是程序員可以提出不同的意見(jiàn)。雙方達(dá)成一致。并且任務(wù)是可以量化和檢查的。因此,事先還要設(shè)置完成標(biāo)準(zhǔn)。一旦程序員與項(xiàng)目經(jīng)理達(dá)成一致,就相當(dāng)于程序員向項(xiàng)目經(jīng)理承諾,今天可以完成這些任務(wù)。

        對(duì)于成熟度比較高的程序員,完全可以由程序員先提出計(jì)劃。然后,由項(xiàng)目經(jīng)理進(jìn)行評(píng)估和檢查。雙方達(dá)成一致后,就把任務(wù)放入日計(jì)劃的工作任務(wù)表中。

    4.為什么要檢查?怎么進(jìn)行檢查?

        如果沒(méi)有檢查,計(jì)劃就是無(wú)效的。

        日計(jì)劃強(qiáng)調(diào)提交可交付的成果。雖然事先制定了標(biāo)準(zhǔn),但是程序員和項(xiàng)目經(jīng)理可能會(huì)對(duì)可交付成果的理解不同。項(xiàng)目經(jīng)理如果要清楚地了解到項(xiàng)目狀況就必須要親自進(jìn)行檢查。

        如何進(jìn)行檢查?項(xiàng)目經(jīng)理一定要在現(xiàn)場(chǎng)工作,最好的辦法就是讓他演示給你看。對(duì)于不能演示的任務(wù)就進(jìn)行抽查。因?yàn)槭孪纫呀?jīng)制定完成標(biāo)準(zhǔn),大家只需要按規(guī)矩辦事即可。

        并且一定要填寫(xiě)完成情況,以便后期的跟蹤。

        5.如果程序員不能完成日計(jì)劃怎么辦?如何才能夠使程序員能夠完成日計(jì)劃?

        程序員不能完成日計(jì)劃時(shí),也就是進(jìn)度出現(xiàn)了偏差。項(xiàng)目經(jīng)理一定要與程序員一起分析偏差的原因,并記錄下來(lái)。進(jìn)度發(fā)生偏差最有可能的兩個(gè)原因:計(jì)劃不合理和計(jì)劃執(zhí)行不力。

        計(jì)劃不合理包括:對(duì)任務(wù)的難度和工作量估算失誤,對(duì)程序員能力的估算失誤,或者程序員的工作方法存在問(wèn)題,需要支持和協(xié)助等。

        如果是對(duì)任務(wù)估算發(fā)生失誤,就需要重新進(jìn)行估算。這正是日計(jì)劃和檢查帶來(lái)的好處。項(xiàng)目經(jīng)理需要重新調(diào)整計(jì)劃。

        如果是對(duì)程序員能力估計(jì)失誤,項(xiàng)目經(jīng)理也需要重新進(jìn)行調(diào)整,如換人,或延長(zhǎng)時(shí)間。

        如果是程序員工作方法存在問(wèn)題,就一定要進(jìn)行指導(dǎo),或者安排其它人員進(jìn)行協(xié)助。

        如果是計(jì)劃執(zhí)行不力,也要找到最核心的原因是什么?是意愿不高?中間去做其它事情?工作習(xí)慣如此?都需要找到核心原因,方可對(duì)癥下藥。

        在我的團(tuán)隊(duì)中,績(jī)效考核的幾個(gè)核心指標(biāo):工作效率*工作效果*工作量

        不能完成日計(jì)劃,會(huì)直接影響到月底的績(jī)效和獎(jiǎng)金。

        如何才能夠使程序員完成日計(jì)劃?首先是計(jì)劃一定要合理,要考慮到個(gè)體差異,分配任務(wù)在其能力范圍之內(nèi)。日計(jì)劃一定要獲得當(dāng)事人的承諾。檢查和跟蹤一定要到位。要與考核掛勾,做到會(huì)得到什么?做不到會(huì)有什么后果?

        六、沒(méi)有銀彈

        是的,沒(méi)有銀彈。沒(méi)有任何一種方法可以保證項(xiàng)目一定能夠成功。日計(jì)劃也一樣。目標(biāo)、計(jì)劃、執(zhí)行、控制構(gòu)成管理的核心。所謂工作成熟度和團(tuán)隊(duì)成熟度其實(shí)都可以歸納為“執(zhí)行力”。日計(jì)劃只是一種管理實(shí)踐,在不同的環(huán)境可能會(huì)有不同的實(shí)踐方法,并不是一層不變的。

    posted @ 2010-03-24 17:29 flyleer| 編輯 收藏
    Oracle創(chuàng)建數(shù)據(jù)表空間,用戶(hù),授權(quán),表,索引,簇(2008-07-26 22:38:59)

    //創(chuàng)建臨時(shí)表空間(日志文件)
    create temporary tablespace test_temp
    tempfile 'E:\oracle\test_temp01.dbf'
    size 32m
    autoextend on
    next 32m maxsize 2048m
    extent management local;

    //創(chuàng)建數(shù)據(jù)表空間
    create tablespace test_data
    logging
    datafile 'E:\oracle\test_data01.dbf'
    size 32m
    autoextend on
    next 32m maxsize 2048m
    extent management local;

    //創(chuàng)建用戶(hù)并指定表空間
    create user 用戶(hù)名 identified by 密碼
    default tablespace test_data
    temporary tablespace test_temp;

    //給用戶(hù)授予權(quán)限

    grant connect,resource to 用戶(hù)名

    ————————————————————————————————————

    create cluster s_t_cluster(tid number(8));--創(chuàng)建索引簇
    ----------------------------------------------------1
    --建立簇表stu
    create table stu(
           tid number(8),
           sname varchar2(50),
           sinfo varchar2(50),
           constraint pk_tid primary key(tid)
    )cluster s_t_cluster(tid)
    --建立簇表sc
    create table sc(
           tid number(8),
           score number(8),
           constraint fk_tid foreign key(tid) references stu(tid)
    )cluster s_t_cluster(tid)
    ------------------------------------------------------2
    --建立簇索引
    create index s_t_idx on cluster s_t_cluster;
    ------------------------------------------------------3
    --插入數(shù)據(jù)
    insert into stu(tid,sname,sinfo)values(1,'haha','usa');
    insert into stu(tid,sname,sinfo)values(2,'gaga','Japan');
    insert into sc values(1,90);
    insert into sc values(2,85);
    --查詢(xún)
    select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid
    --建立序列
    create sequence stu_SEQ
    minvalue 1
    maxvalue 99999999
    start with 3
    increment by 1
    cache 20;

    --用命令插入N條數(shù)據(jù)往表stu
    declare
    x number;
    begin
      for x in 1..100000 loop
        insert into stu values(stu_seq.nextval,'名字'||x,'地址'||x);
      end loop;
    end;
    ---------------------------------------------
    --用命令插入N條數(shù)據(jù)往表sc
    declare
    x number;
    begin
      for x in 1..10000 loop
        insert into sc values(sc_seq.nextval,x+50);
      end loop;
    end;
    ---------------------------------------------
    --查詢(xún)
    select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid--未加索引時(shí)的普通查詢(xún)太慢了
    --使用索引簇查詢(xún)
    select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid

    ————————————————————————————————————————

    //創(chuàng)建表,序列號(hào)(sequence)

    create table test1(
           tid number(8),
           tname varchar2(50),
           tbd date,
           constraint pk_tid primary key(tid)
    )
    select * from test1
    ==============================================================
    create sequence test1Seq --自定義的序列名
    increment by 1           --每次加幾個(gè),即遞增的間隔
    start with 1             --從1開(kāi)始計(jì)數(shù)
    nomaxvalue               --不設(shè)置最大值
    nocycle                  --一直累加,不循環(huán)
    cache 10;
    ==============================================================
    insert into test1(tid,tname,tbd)values(test1Seq.Nextval,'ccc',sysdate);

    posted @ 2009-03-19 20:13 flyleer| 編輯 收藏
    sybase的問(wèn)題

          近來(lái)在做sybase的性能調(diào)試,發(fā)現(xiàn)我啟動(dòng)多線(xiàn)程的時(shí)候,線(xiàn)程會(huì)處于lock sleeping。 剛開(kāi)始還以為是數(shù)據(jù)庫(kù)不支持并發(fā)訪(fǎng)問(wèn),后來(lái)想想真幼稚。。原來(lái)是我在做并發(fā)插入數(shù)據(jù)的時(shí)候,該表的鎖設(shè)置為全頁(yè)加鎖了。 后來(lái)設(shè)置為數(shù)據(jù)行鎖,這樣才可以執(zhí)行并發(fā)操作的測(cè)試。 但是后面又遇到一個(gè)問(wèn)題,就是out of lock的問(wèn)題,也就是ASE設(shè)置的鎖不夠用。如果是在windows下的話(huà),可以用ASE的補(bǔ)助工具修改number of locks來(lái)增加更多的鎖,因?yàn)樵O(shè)置的是數(shù)據(jù)行鎖,所以,在執(zhí)行Insert的時(shí)候,如果不提交事物的話(huà),就會(huì)每一條數(shù)據(jù)加一個(gè)鎖。。在增加鎖的時(shí)候,必須要增加內(nèi)存,也就是增加max memory。。大概一個(gè)鎖占據(jù)的內(nèi)存是120byte。 如果是在Linux系統(tǒng)的話(huà),就修改“服務(wù)名.cfg“文件。 
         1、全頁(yè)鎖(allpages lock) 對(duì)查詢(xún)的表及索引頁(yè)加鎖,也就是table lock 
           2、頁(yè)鎖  (data lock)     對(duì)所查詢(xún)的結(jié)果所在頁(yè)加鎖,對(duì)索引不加鎖 
        3、行鎖  (row lock)      對(duì)某行數(shù)據(jù)加鎖

      sybase除非對(duì)配置參數(shù)加以特定,對(duì)所有的表都予置了隱含的全頁(yè)面加鎖機(jī)制。

    sp_configure ‘lock scheme’, [allpages | datapages | datarows]

      當(dāng)數(shù)據(jù)庫(kù)從原先版本的服務(wù)器中轉(zhuǎn)儲(chǔ)出來(lái)重新加載時(shí),所有的表都被定義為全頁(yè)面加鎖的表。當(dāng)建立一個(gè)新表時(shí),可以不使用這個(gè)缺省值,可采用如下的句法格式:

    create table <tablename>;… lock [allpages | datapages | datarows]

      為了在使用的一個(gè)表中改變加鎖類(lèi)型,可以采用如下的句法格式:

    alter table <tablename>; lock [allpages | datapages | datarows]

    posted @ 2009-03-07 15:27 flyleer| 編輯 收藏
    oracle 在Linux 自啟動(dòng)方法

    1、 修改Oracle系統(tǒng)配置文件/etc/oratab

    /etc/oratab 格式為: SID:ORACLE_HOME:AUTO

    把AUTO域設(shè)置為Y(大寫(xiě)),只有這樣,oracle 自帶的dbstart和dbshut才能夠發(fā)揮作用。我的為:

    TestDB:/home/oracle/product/10.2.0:Y(以oracle 10為例子)
            2、 編寫(xiě)服務(wù)腳本:
            如下:

     

    #!/bin/bash

    #

    #################FUNCTION#############

    #

    # AutoStart Oracle and listener

    # AutoStop Oracle and listener

    #

    #####################################

    #

    # Created by ZhouYS 2003-11-26

    #

    case "$1" in

    start)

    echo "Starting Oracle Databases ... "

    echo "-------------------------------------------------" >> /var/log/oracle

    date +" %T %a %D : Starting Oracle Databasee as part of system up." >> /var/log/oracle

    echo "-------------------------------------------------" >> /var/log/oracle

    su - oracle -c "dbstart" >> /var/log/oracle

    echo "Done."

    echo "Starting Oracle Listeners ... "

    echo "-------------------------------------------------" >> /var/log/oracle

    date +" %T %a %D : Starting Oracle Listeners as part of system up." >> /var/log/oracle

    echo "-------------------------------------------------" >> /var/log/oracle

    su - oracle -c "lsnrctl start" >> /var/log/oracle

    echo "Done."

    echo ""

    echo "-------------------------------------------------" >> /var/log/oracle

    date +" %T %a %D : Finished." >> /var/log/oracle

    echo "-------------------------------------------------" >> /var/log/oracle

    touch /var/lock/subsys/oracle

    ;;

    stop)

    echo "Stoping Oracle Listeners ... "

    echo "-------------------------------------------------" >> /var/log/oracle

    date +" %T %a %D : Stoping Oracle Listener as part of system down." >> /var/log/oracle

    echo "-------------------------------------------------" >> /var/log/oracle

    su - oracle -c "lsnrctl stop" >> /var/log/oracle

    echo "Done."

    rm -f /var/lock/subsys/oracle

    echo "Stoping Oracle Databases ... "

    echo "-------------------------------------------------" >> /var/log/oracle

    date +" %T %a %D : Stoping Oracle Databases as part of system down." >> /var/log/oracle

    echo "-------------------------------------------------" >> /var/log/oracle

    su - oracle -c "dbshut" >>/var/log/oracle

    echo "Done."

    echo ""

    echo "-------------------------------------------------" >> /var/log/oracle

    date +" %T %a %D : Finished." >> /var/log/oracle

    echo "-------------------------------------------------" >> /var/log/oracle

    ;;

    restart)

    $0 stop

    $0 start

    ;;

    *)

    echo "Usage: oracle {start|stop|restart}"

    exit 1

    esac


           將腳本命名為oracle,保存在/etc/rc.d/init.d下。
           
            3、建立服務(wù)連接:

    系統(tǒng)啟動(dòng)時(shí)啟動(dòng)數(shù)據(jù)庫(kù),我們需要以下連結(jié)∶

    --------------------------------------------------------------------------------

    $ ln -s ../init.d/oracle /etc/rc.d/rc2.d/S99oracle

    $ ln -s ../init.d/oracle /etc/rc.d/rc3.d/S99oracle

    $ ln -s ../init.d/oracle /etc/rc.d/rc5.d/S99oracle #rc4.d unused

    --------------------------------------------------------------------------------

    要在重新啟動(dòng)時(shí)停止數(shù)據(jù)庫(kù),我們需要以下連結(jié)∶

    --------------------------------------------------------------------------------

    $ ln -s ../init.d/oracle /etc/rc.d/rc0.d/K01oracle # 停止

    $ ln -s ../init.d/oracle /etc/rc.d/rc6.d/K01oracle # 重新啟動(dòng)

    轉(zhuǎn)貼于:Oracle認(rèn)證考試_考試大    

    posted @ 2008-12-26 11:54 flyleer| 編輯 收藏
    井底之蛙

            最近閑來(lái)無(wú)聊,搬來(lái)同事的講JDK6.0的書(shū)翻翻。。 感觸很多,一直都聽(tīng)到什么JDK的一些新特性,自己也用過(guò)。但是一直不知道到底引入了哪些新特性,直到今天看了書(shū),才知道。。唉,得鄙視下自己。。 不過(guò)看書(shū),實(shí)在無(wú)聊,好想瞌睡。HOHO。
            還是把新特性列下,免得自己以后又不記得了。。
            1.診斷能力:這個(gè)到底有啥用,搞不很懂。。 大概是當(dāng)我們的程序要生成堆棧追蹤信息的時(shí)候,如果沒(méi)有控制臺(tái)窗口的時(shí)候,可以自己聲明試采用程序來(lái)編輯而獲得這些信息。。
            2.Annotation:這個(gè)到是用到過(guò),知道是注釋。它的作用是:提供了一個(gè)連接附加數(shù)據(jù)到Class,Interface,Method和Field中的能力。使用它的目的是使我們的開(kāi)發(fā)和運(yùn)行工具得到一個(gè)基礎(chǔ)框架,以減少編碼和發(fā)布程序時(shí)所需的額外的工作。
            3.泛型:這個(gè)用的比較多。在集合框架中經(jīng)常用到。主要是使代碼看上去更舒服。呵呵,節(jié)省不必要的類(lèi)型轉(zhuǎn)換。。
            4.自動(dòng)裝/拆箱:這個(gè)就是用在JAVA中的基本類(lèi)型和封閉類(lèi)之間的轉(zhuǎn)換。。也是使代碼看上面簡(jiǎn)潔。減少類(lèi)型的轉(zhuǎn)換。。
            5.靜態(tài)引入:這個(gè)好像頭一次看。。呵呵,試了一下。真的可以。。HOHO,看來(lái)我真的孤陋寡聞啊。  看來(lái)以后的代碼中如果很多地方用到了靜態(tài)類(lèi)的屬性的話(huà),可以直接導(dǎo)入這個(gè)類(lèi)了。。也可以減少一點(diǎn)代碼。。不過(guò)想想其實(shí)也差不多。。
            6.格式化輸入/輸出:現(xiàn)在JAVA也可以像C語(yǔ)言一樣使用printf打印輸出信息了。其輸出格式基本相同。這個(gè)我還沒(méi)用過(guò), 不過(guò)知道是比如:
       System.out.printf("%d和%f",m,n);這里告訴m,n必須是整型和浮點(diǎn)數(shù)。。
            7.參數(shù)數(shù)量的可變:這個(gè)是說(shuō)可以向一個(gè)方法傳入多個(gè)不定數(shù)量的參數(shù),可以簡(jiǎn)單的使用...來(lái)表示一個(gè)方法接受不定數(shù)量的參數(shù)。
            8.并行工具包:這個(gè)是指提供了一個(gè)功能強(qiáng)大的、高層次的線(xiàn)程構(gòu)造器。例如:線(xiàn)程任務(wù)框架,線(xiàn)程安全的隊(duì)列,計(jì)時(shí)器,鎖和其他的一些同步的基本類(lèi)型。

    posted @ 2008-12-08 16:01 flyleer 閱讀(77) | 評(píng)論 (0)編輯 收藏
    幾種類(lèi)加載方式的區(qū)別

    虛擬機(jī)加載類(lèi)的途徑:

    1、Dog dog = new Dog();
    這個(gè)動(dòng)作會(huì)導(dǎo)致常量池的解析,Dog類(lèi)被隱式裝載。
    如果當(dāng)前ClassLoader無(wú)法找到Dog,則拋出NoClassDefFoundError。

    2、Class clazz = Class.forName(“Dog”);
       Object dog =clazz.newInstance();
    通過(guò)反射加載類(lèi)型,并創(chuàng)建對(duì)象實(shí)例
    如果無(wú)法找到Dog,則拋出ClassNotFoundException。

    3、Class clazz = classLoader.loadClass(“Dog”);
       Object dog =clazz.newInstance();
    通過(guò)反射加載類(lèi)型,并創(chuàng)建對(duì)象實(shí)例
    如果無(wú)法找到Dog,則拋出ClassNotFoundException。

    那么,1和2和3究竟有什么區(qū)別呢?分別用于什么情況呢?

    1和2使用的類(lèi)加載器是相同的,都是當(dāng)前類(lèi)加載器。(即:this.getClass.getClassLoader)。
    3由用戶(hù)指定類(lèi)加載器。

    如果需要在當(dāng)前類(lèi)路徑以外尋找類(lèi),則只能采用第3種方式。第3種方式加載的類(lèi)與當(dāng)前類(lèi)分屬不同的命名空間。
    當(dāng)前類(lèi)加載器命名空間對(duì)其不可見(jiàn)。當(dāng)然,如果被加載類(lèi)的超類(lèi)對(duì)于當(dāng)前類(lèi)命名空間可見(jiàn)的話(huà),則可以進(jìn)行強(qiáng)制轉(zhuǎn)型。

    第1和第2種情況區(qū)別不大。如果,Dog類(lèi)在編譯時(shí)無(wú)法得到,則使用第2種方式。

    另外,第1種和第2種都會(huì)導(dǎo)致類(lèi)被初始化,即:執(zhí)行類(lèi)的靜態(tài)初始化語(yǔ)句,而第3種情況不會(huì)。
    另外注意,第1種拋出Error,第2、3種拋出Exception,它們分屬于不同的異常/錯(cuò)誤分支。

    -----------------------------

    對(duì)象實(shí)例化方式:
    1、new Dog();
    2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...);
    3、Object.clone();//通過(guò)本地方法進(jìn)行復(fù)制
    4、反序列化 

    posted @ 2008-11-25 14:38 flyleer| 編輯 收藏
    linux問(wèn)題

         最近在忙于在linux上面部署和發(fā)布項(xiàng)目。以前從來(lái)沒(méi)有做過(guò)類(lèi)似的工作,linux也是小白一個(gè)。。所以這次碰到的問(wèn)題也很多。 不過(guò)還是學(xué)習(xí)了,一些比較簡(jiǎn)單的命令。。比如知道了怎么去解壓.GZ文件。。tar zxvf %% ,mv 移動(dòng)文件,rm 刪除。。。強(qiáng)制刪除:rm -rf 。。比如這些簡(jiǎn)單的東西。不過(guò)碰到一個(gè)問(wèn)題,就是linux下面的定時(shí)任務(wù)。。在etc下面的crontab文件操作,怎么也不成功。。也調(diào)用了網(wǎng)上找的比如殺掉進(jìn)程也不行:
    [root@CHINASVRVM ~]# pkill crond
    [root@CHINASVRVM ~]# pgrep crond
    [root@CHINASVRVM ~]# /etc/rc.d/init.d/crond restart

    這樣做也不行,最后總算解決了。是使用crontab -e 這個(gè)命令是在里面定義任務(wù)。。這樣才能正確執(zhí)行。。HOHO.。

    posted @ 2008-11-25 14:13 flyleer| 編輯 收藏
    平淡

        前一段時(shí)間忙于找工作。總算那樣的日子過(guò)了。。現(xiàn)在一切又趨于平淡。來(lái)到一家小公司,做的事,以前的公司也接觸過(guò)。。也算是個(gè)金融行業(yè)吧。做的是IC卡。貌似很先進(jìn)的東東。。雖然是個(gè)小公司,但是還是能夠?qū)W到一點(diǎn)東西。。不過(guò)有時(shí)候還是很很納悶,,不知道前進(jìn)的路該如何去走,也不是特別喜歡技術(shù),管理視乎也不行。。人生感覺(jué)很茫然。。 工資也這么低,出來(lái)也快2年了。一起出來(lái)的,很多都是5K多,多的甚至快上萬(wàn)了。可我還是4K多。。差距越來(lái)越大。唉。。有時(shí)候想起來(lái)真的要瘋了。。 不知道明年自己可以拿多少。。

    posted @ 2008-11-25 14:05 flyleer| 編輯 收藏
    7.8面試

    今天又去面試了。哎,現(xiàn)在都開(kāi)始害怕面試 。自己技術(shù)太差了。。碰的問(wèn)題,都回答不了。。
    1.今天問(wèn)了個(gè)對(duì)象實(shí)例化的幾種方法,左想右想只知道new關(guān)鍵字。。。 后面問(wèn)了別人才知道通過(guò)反射也可以。。。反射這個(gè)東西,倒是知道,但是在這個(gè)問(wèn)題上,我確怎么也想不到。。還有種是類(lèi)加載。實(shí)在是看不懂。。

    第一種:

    Test test=new Test();

    第二種:

    test=Class.forName(Test).newInstance();

    第三種

    String interceptorName="org.aaa.Test";
    Class interceptorClass=Current.class.getClassLoader().loadClass(interceptorName);
    Interceptor inerceptor=(Interceptor)interceptorClass.newInstance(); 


    2.hibernate中session的get與Load方法的區(qū)別。。前一陣還記得,現(xiàn)在忘記。。 都不知道現(xiàn)在還記得些什么東西了。
    (1)load方法,hibernate認(rèn)為該id對(duì)應(yīng)的對(duì)象(數(shù)據(jù)庫(kù)記錄)在數(shù)據(jù)庫(kù)中是一定存在的,在用到對(duì)象中的

    其他屬性數(shù)據(jù)時(shí)才查詢(xún)數(shù)據(jù)庫(kù),但是萬(wàn)一數(shù)據(jù)庫(kù)中不存在該記錄,只能拋ObjectNotFoundEcception異常

    ,所說(shuō)的load方法拋異常是指在使用該對(duì)象的數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)中不存在該數(shù)據(jù)時(shí)拋異常,而不是在創(chuàng)建這

    個(gè)對(duì)象時(shí)。由于session中的緩存對(duì)于hibernate來(lái)說(shuō)是個(gè)相當(dāng)廉價(jià)的資源,所以在load時(shí)會(huì)先查一下

    session緩存看看該id對(duì)應(yīng)的對(duì)象是否存在,不存在則創(chuàng)建代理。所以如果你知道該id在數(shù)據(jù)庫(kù)中一定有

    對(duì)應(yīng)記錄存在就可以使用load方法來(lái)實(shí)現(xiàn)延遲加載。

    (2)get方法,hibernate會(huì)確認(rèn)一下該id對(duì)應(yīng)的數(shù)據(jù)是否存在,首先在session緩存中查找,然后在二級(jí)緩

    存中查找,還沒(méi)有就查數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中沒(méi)有就返回null。

    3.spring AOP中對(duì)pointcut,advice的概念的理解。。 這個(gè)我是根本就不知道啥玩意,只知道AOP的點(diǎn)點(diǎn)意思。。
    4.hibernate的繼承映射包含了哪幾種不同的策略,并說(shuō)出各自的特點(diǎn)。。HOHO。。這個(gè)問(wèn)題,還是不知道。。以前讀書(shū)的時(shí)候看過(guò)點(diǎn)點(diǎn)相關(guān)的內(nèi)容,現(xiàn)在早就忘記的一干二凈了。

    posted @ 2008-07-08 16:51 flyleer 閱讀(174) | 評(píng)論 (0)編輯 收藏
    3.14 面試遇到的問(wèn)題

       1.JDBC有幾種驅(qū)動(dòng)類(lèi)型:  

         type   1:jdbc-odbc橋    
      type   2:本地api驅(qū)動(dòng)    
      type   3:網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)    
      type   4:本地協(xié)議驅(qū)動(dòng)    

    Type   1:   jdbc-odbc橋    
         Jdbc-odbc橋是sun公司提供的,是jdk提供的的標(biāo)準(zhǔn)api.   這種類(lèi)型的驅(qū)動(dòng)實(shí)際是把所有jdbc的調(diào)用傳遞給odbc   ,再由odbc調(diào)用本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)代碼.(   本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)代碼是指由數(shù)據(jù)庫(kù)廠(chǎng)商提供的數(shù)據(jù)庫(kù)操作二進(jìn)制代碼庫(kù),例如在oracle for windows中就是oci   dll  文件)   

          jdbc-odbc橋 ---- odbc---- 廠(chǎng)商DB代碼 ----- 數(shù)據(jù)庫(kù)Server     
                                              (圖一)    

            只要本地機(jī)裝有相關(guān)的odbc驅(qū)動(dòng)那么采用jdbc-odbc橋幾乎可以訪(fǎng)問(wèn)所有的數(shù)據(jù)庫(kù),jdbc-odbc方法對(duì)于客戶(hù)端已經(jīng)具備odbc   driver的應(yīng)用還是可行的.但是,由于jdbc-odbc先調(diào)用odbc再由odbc去調(diào)用本地?cái)?shù)據(jù)庫(kù)接口訪(fǎng)問(wèn)數(shù)據(jù)庫(kù).所以,執(zhí)行效率比較低,對(duì)于那些大數(shù)據(jù)量存取的應(yīng)用是不適合的.而且,這種方法要求客戶(hù)端必須安裝odbc   驅(qū)動(dòng),所以對(duì)于基于internet   ,intranet的應(yīng)用也是不合適的.因?yàn)?你不可能要求所有客戶(hù)都能找到odbc   driver.     

     Type   2:   本地Api驅(qū)動(dòng)    
          本地api驅(qū)動(dòng)直接把jdbc調(diào)用轉(zhuǎn)變?yōu)閿?shù)據(jù)庫(kù)的標(biāo)準(zhǔn)調(diào)用再去訪(fǎng)問(wèn)數(shù)據(jù)庫(kù).這種方法需要本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)代碼.    
       
      本地api驅(qū)動(dòng)----廠(chǎng)商DB代碼-----數(shù)據(jù)庫(kù)Server     

                                           (圖二)     
             這種驅(qū)動(dòng)比起jdbc-odbc橋執(zhí)行效率大大提高了.但是,它仍然需要在客戶(hù)端加載數(shù)據(jù)庫(kù)廠(chǎng)商提供的代碼庫(kù).這樣就不適合基于internet的應(yīng)用.并且,他的執(zhí)行效率比起3,4型的jdbc驅(qū)動(dòng)還是不夠高.    
       
      Type3:網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)    
              這種驅(qū)動(dòng)實(shí)際上是根據(jù)我們熟悉的三層結(jié)構(gòu)建立的.   jdbc先把對(duì)數(shù)局庫(kù)的訪(fǎng)問(wèn)請(qǐng)求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器.   中間件服務(wù)器再把請(qǐng)求翻譯為符合數(shù)據(jù)庫(kù)規(guī)范的調(diào)用,再把這種調(diào)用傳給數(shù)據(jù)庫(kù)服務(wù)器.如果中間件服務(wù)器也是用java開(kāi)發(fā)的,那么在在中間層也可以使用1,2型 jdbc驅(qū)動(dòng)程序作為訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的方法.    
       
      網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)---------中間件服務(wù)器------------數(shù)據(jù)庫(kù)Server    
                                    (   圖三)    
       
             由于這種驅(qū)動(dòng)是基于server的.所以,它不需要在客戶(hù)端加載數(shù)據(jù)庫(kù)廠(chǎng)商提供的代碼庫(kù).而且他在執(zhí)行效率和可升級(jí)性方面是比較好的.因?yàn)榇蟛糠止δ軐?shí)現(xiàn)都在server端,所以這種驅(qū)動(dòng)可以設(shè)計(jì)的很小,可以非常快速的加載到內(nèi)存中.   但是,這種驅(qū)動(dòng)在中間件層仍然需要有配置其它數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,并且由于多了一個(gè)中間層傳遞數(shù)據(jù),它的執(zhí)行效率還不是最好.     

        
      Type4   本地協(xié)議驅(qū)動(dòng)    
              這種驅(qū)動(dòng)直接把jdbc調(diào)用轉(zhuǎn)換為符合相關(guān)數(shù)據(jù)庫(kù)系統(tǒng)規(guī)范的請(qǐng)求.由于4型驅(qū)動(dòng)寫(xiě)的應(yīng)用可以直接和數(shù)據(jù)庫(kù)服務(wù)器通訊.這種類(lèi)型的驅(qū)動(dòng)完全由java實(shí)現(xiàn),因此實(shí)現(xiàn)了平臺(tái)獨(dú)立性.    
       
      本地協(xié)議驅(qū)動(dòng)---------數(shù)據(jù)庫(kù)Server    
                         (   圖四)    
       
             由于這種驅(qū)動(dòng)不需要先把jdbc的調(diào)用傳給odbc或本地?cái)?shù)據(jù)庫(kù)接口或者是中間層服務(wù)器.所以它的執(zhí)行效率是非常高的.而且,它根本不需要在客戶(hù)端或服務(wù)器端裝載任何的軟件或驅(qū)動(dòng). 這種驅(qū)動(dòng)程序可以動(dòng)態(tài)的被下載.但是對(duì)于不同的數(shù)據(jù)庫(kù)需要下載不同的驅(qū)動(dòng)程序.    
       
       
      以上對(duì)四種類(lèi)型的jdbc驅(qū)動(dòng)做了一個(gè)說(shuō)明.那么它們適合那種類(lèi)型的應(yīng)用開(kāi)發(fā)呢?Jdbc-odbc橋由于它的執(zhí)行效率不高,更適合做為開(kāi)發(fā)應(yīng)用時(shí)的一種過(guò)度方案,或著對(duì)于初學(xué)者了解jdbc編程也較適用.  對(duì)于那些需要大數(shù)據(jù)量操作的應(yīng)用程序則應(yīng)該考慮2,3,4型驅(qū)動(dòng).在intranet方面的應(yīng)用可以考慮2型驅(qū)動(dòng),但是由于3,4型驅(qū)動(dòng)在執(zhí)行效率上比2型驅(qū)動(dòng)有著明顯的優(yōu)勢(shì),而且目前開(kāi)發(fā)的趨勢(shì)是使用純java.所以3,4型驅(qū)動(dòng)也可以作為考慮對(duì)象. 至于基于internet方面的應(yīng)用就只有考慮3,4型驅(qū)動(dòng)了.   因?yàn)?型驅(qū)動(dòng)可以把多種數(shù)據(jù)庫(kù)驅(qū)動(dòng)都配置在中間層服務(wù)器.所以3型驅(qū)動(dòng)最適合那種需要同時(shí)連接多個(gè)不同種類(lèi)的數(shù)據(jù)庫(kù), 并且對(duì)并發(fā)連接要求高的應(yīng)用.   4型驅(qū)動(dòng)則適合那些連接單一數(shù)據(jù)庫(kù)的工作組應(yīng)用.

    posted @ 2008-03-14 23:41 flyleer| 編輯 收藏
    format

                今天項(xiàng)目中碰到一個(gè)科學(xué)計(jì)算法的問(wèn)題,我保存到數(shù)據(jù)庫(kù)的是數(shù)字,但是從數(shù)據(jù)庫(kù)中取出來(lái)在頁(yè)面展現(xiàn)的時(shí)候確變成了科學(xué)計(jì)算法的形式了。最后查了下,發(fā)現(xiàn)<bean:write/>里有個(gè)屬性format="##.00"這樣可以就正確顯示保存的數(shù)字。因?yàn)槲业纳婕暗叫?shù)點(diǎn)的問(wèn)題,所以我保留了兩位有效數(shù)字。

    posted @ 2007-11-28 16:15 flyleer| 編輯 收藏
    【轉(zhuǎn)】js日期時(shí)間函數(shù)

    Date.prototype.isLeapYear 判斷閏年
    Date.prototype.Format 日期格式化
    Date.prototype.DateAdd 日期計(jì)算
    Date.prototype.DateDiff 比較日期差
    Date.prototype.toString 日期轉(zhuǎn)字符串
    Date.prototype.toArray 日期分割為數(shù)組
    Date.prototype.DatePart 取日期的部分信息
    Date.prototype.MaxDayOfDate 取日期所在月的最大天數(shù)
    Date.prototype.WeekNumOfYear 判斷日期所在年的第幾周
    StringToDate 字符串轉(zhuǎn)日期型
    IsValidDate 驗(yàn)證日期有效性
    CheckDateTime 完整日期時(shí)間檢查
    daysBetween 日期天數(shù)差

    js 代碼
     
    1. //---------------------------------------------------  
    2. // 判斷閏年  
    3. //---------------------------------------------------  
    4. Date.prototype.isLeapYear = function()   
    5. {   
    6.     return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));   
    7. }   
    8.   
    9. //---------------------------------------------------  
    10. // 日期格式化  
    11. // 格式 YYYY/yyyy/YY/yy 表示年份  
    12. // MM/M 月份  
    13. // W/w 星期  
    14. // dd/DD/d/D 日期  
    15. // hh/HH/h/H 時(shí)間  
    16. // mm/m 分鐘  
    17. // ss/SS/s/S 秒  
    18. //---------------------------------------------------  
    19. Date.prototype.Format = function(formatStr)   
    20. {   
    21.     var str = formatStr;   
    22.     var Week = ['日','一','二','三','四','五','六'];  
    23.   
    24.     str=str.replace(/yyyy|YYYY/,this.getFullYear());   
    25.     str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));   
    26.   
    27.     str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0' + this.getMonth());   
    28.     str=str.replace(/M/g,this.getMonth());   
    29.   
    30.     str=str.replace(/w|W/g,Week[this.getDay()]);   
    31.   
    32.     str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());   
    33.     str=str.replace(/d|D/g,this.getDate());   
    34.   
    35.     str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());   
    36.     str=str.replace(/h|H/g,this.getHours());   
    37.     str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());   
    38.     str=str.replace(/m/g,this.getMinutes());   
    39.   
    40.     str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());   
    41.     str=str.replace(/s|S/g,this.getSeconds());   
    42.   
    43.     return str;   
    44. }   
    45.   
    46. //+---------------------------------------------------  
    47. //| 求兩個(gè)時(shí)間的天數(shù)差 日期格式為 YYYY-MM-dd   
    48. //+---------------------------------------------------  
    49. function daysBetween(DateOne,DateTwo)  
    50. {   
    51.     var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-'));  
    52.     var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);  
    53.     var OneYear = DateOne.substring(0,DateOne.indexOf ('-'));  
    54.   
    55.     var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-'));  
    56.     var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);  
    57.     var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-'));  
    58.   
    59.     var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);   
    60.     return Math.abs(cha);  
    61. }  
    62.   
    63.   
    64. //+---------------------------------------------------  
    65. //| 日期計(jì)算  
    66. //+---------------------------------------------------  
    67. Date.prototype.DateAdd = function(strInterval, Number) {   
    68.     var dtTmp = this;  
    69.     switch (strInterval) {   
    70.         case 's' :return new Date(Date.parse(dtTmp) + (1000 * Number));  
    71.         case 'n' :return new Date(Date.parse(dtTmp) + (60000 * Number));  
    72.         case 'h' :return new Date(Date.parse(dtTmp) + (3600000 * Number));  
    73.         case 'd' :return new Date(Date.parse(dtTmp) + (86400000 * Number));  
    74.         case 'w' :return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));  
    75.         case 'q' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
    76.         case 'm' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
    77.         case 'y' :return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
    78.     }  
    79. }  
    80.   
    81. //+---------------------------------------------------  
    82. //| 比較日期差 dtEnd 格式為日期型或者 有效日期格式字符串  
    83. //+---------------------------------------------------  
    84. Date.prototype.DateDiff = function(strInterval, dtEnd) {   
    85.     var dtStart = this;  
    86.     if (typeof dtEnd == 'string' )//如果是字符串轉(zhuǎn)換為日期型  
    87.     {   
    88.         dtEnd = StringToDate(dtEnd);  
    89.     }  
    90.     switch (strInterval) {   
    91.         case 's' :return parseInt((dtEnd - dtStart) / 1000);  
    92.         case 'n' :return parseInt((dtEnd - dtStart) / 60000);  
    93.         case 'h' :return parseInt((dtEnd - dtStart) / 3600000);  
    94.         case 'd' :return parseInt((dtEnd - dtStart) / 86400000);  
    95.         case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7));  
    96.         case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);  
    97.         case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear();  
    98.     }  
    99. }  
    100.   
    101. //+---------------------------------------------------  
    102. //| 日期輸出字符串,重載了系統(tǒng)的toString方法  
    103. //+---------------------------------------------------  
    104. Date.prototype.toString = function(showWeek)  
    105. {   
    106.     var myDate= this;  
    107.     var str = myDate.toLocaleDateString();  
    108.     if (showWeek)  
    109.     {   
    110.         var Week = ['日','一','二','三','四','五','六'];  
    111.         str += ' 星期' + Week[myDate.getDay()];  
    112.     }  
    113.     return str;  
    114. }  
    115.   
    116. //+---------------------------------------------------  
    117. //| 日期合法性驗(yàn)證  
    118. //| 格式為:YYYY-MM-DD或YYYY/MM/DD  
    119. //+---------------------------------------------------  
    120. function IsValidDate(DateStr)   
    121. {   
    122.     var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去兩邊空格;   
    123.     if(sDate==''return true;   
    124.     //如果格式滿(mǎn)足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替換為''   
    125.     //數(shù)據(jù)庫(kù)中,合法日期可以是:YYYY-MM/DD(2003-3/21),數(shù)據(jù)庫(kù)會(huì)自動(dòng)轉(zhuǎn)換為YYYY-MM-DD格式   
    126.     var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');   
    127.     if (s==''//說(shuō)明格式滿(mǎn)足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D   
    128.     {   
    129.         var t=new Date(sDate.replace(/\-/g,'/'));   
    130.         var ar = sDate.split(/[-/:]/);   
    131.         if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate())   
    132.         {   
    133.             //alert('錯(cuò)誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');   
    134.             return false;   
    135.         }   
    136.     }   
    137.     else   
    138.     {   
    139.         //alert('錯(cuò)誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');   
    140.         return false;   
    141.     }   
    142.     return true;   
    143. }   
    144.   
    145. //+---------------------------------------------------  
    146. //| 日期時(shí)間檢查  
    147. //| 格式為:YYYY-MM-DD HH:MM:SS  
    148. //+---------------------------------------------------  
    149. function CheckDateTime(str)  
    150. {   
    151.     var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/;   
    152.     var r = str.match(reg);   
    153.     if(r==null)return false;   
    154.     r[2]=r[2]-1;   
    155.     var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);   
    156.     if(d.getFullYear()!=r[1])return false;   
    157.     if(d.getMonth()!=r[2])return false;   
    158.     if(d.getDate()!=r[3])return false;   
    159.     if(d.getHours()!=r[4])return false;   
    160.     if(d.getMinutes()!=r[5])return false;   
    161.     if(d.getSeconds()!=r[6])return false;   
    162.     return true;   
    163. }   
    164.   
    165. //+---------------------------------------------------  
    166. //| 把日期分割成數(shù)組  
    167. //+---------------------------------------------------  
    168. Date.prototype.toArray = function()  
    169. {   
    170.     var myDate = this;  
    171.     var myArray = Array();  
    172.     myArray[0] = myDate.getFullYear();  
    173.     myArray[1] = myDate.getMonth();  
    174.     myArray[2] = myDate.getDate();  
    175.     myArray[3] = myDate.getHours();  
    176.     myArray[4] = myDate.getMinutes();  
    177.     myArray[5] = myDate.getSeconds();  
    178.     return myArray;  
    179. }  
    180.   
    181. //+---------------------------------------------------  
    182. //| 取得日期數(shù)據(jù)信息  
    183. //| 參數(shù) interval 表示數(shù)據(jù)類(lèi)型  
    184. //| y 年 m月 d日 w星期 ww周 h時(shí) n分 s秒  
    185. //+---------------------------------------------------  
    186. Date.prototype.DatePart = function(interval)  
    187. {   
    188.     var myDate = this;  
    189.     var partStr='';  
    190.     var Week = ['日','一','二','三','四','五','六'];  
    191.     switch (interval)  
    192.     {   
    193.         case 'y' :partStr = myDate.getFullYear();break;  
    194.         case 'm' :partStr = myDate.getMonth()+1;break;  
    195.         case 'd' :partStr = myDate.getDate();break;  
    196.         case 'w' :partStr = Week[myDate.getDay()];break;  
    197.         case 'ww' :partStr = myDate.WeekNumOfYear();break;  
    198.         case 'h' :partStr = myDate.getHours();break;  
    199.         case 'n' :partStr = myDate.getMinutes();break;  
    200.         case 's' :partStr = myDate.getSeconds();break;  
    201.     }  
    202.     return partStr;  
    203. }  
    204.   
    205. //+---------------------------------------------------  
    206. //| 取得當(dāng)前日期所在月的最大天數(shù)  
    207. //+---------------------------------------------------  
    208. Date.prototype.MaxDayOfDate = function()  
    209. {   
    210.     var myDate = this;  
    211.     var ary = myDate.toArray();  
    212.     var date1 = (new Date(ary[0],ary[1]+1,1));  
    213.     var date2 = date1.dateAdd(1,'m',1);  
    214.     var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));  
    215.     return result;  
    216. }  
    217.   
    218. //+---------------------------------------------------  
    219. //| 取得當(dāng)前日期所在周是一年中的第幾周  
    220. //+---------------------------------------------------  
    221. Date.prototype.WeekNumOfYear = function()  
    222. {   
    223.     var myDate = this;  
    224.     var ary = myDate.toArray();  
    225.     var year = ary[0];  
    226.     var month = ary[1]+1;  
    227.     var day = ary[2];  
    228.     document.write('< script language=VBScript\> \n');  
    229.     document.write('myDate = DateValue(''+month+'-'+day+'-'+year+'') \n');  
    230.     document.write('result = DatePart('ww', myDate) \n');  
    231.     document.write(' \n');  
    232.     return result;  
    233. }  
    234.   
    235. //+---------------------------------------------------  
    236. //| 字符串轉(zhuǎn)成日期類(lèi)型   
    237. //| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd  
    238. //+---------------------------------------------------  
    239. function StringToDate(DateStr)  
    240. {   
    241.   
    242.     var converted = Date.parse(DateStr);  
    243.     var myDate = new Date(converted);  
    244.     if (isNaN(myDate))  
    245.     {   
    246.         //var delimCahar = DateStr.indexOf('/')!=-1?'/':'-';  
    247.         var arys= DateStr.split('-');  
    248.         myDate = new Date(arys[0],--arys[1],arys[2]);  
    249.     }  
    250.     return myDate;  
    251. }  

    posted @ 2007-10-05 17:43 flyleer| 編輯 收藏
    生成隨機(jī)數(shù)(轉(zhuǎn)貼)

    有時(shí)候在我們的網(wǎng)絡(luò)應(yīng)用中,防止程序自動(dòng)登錄搞破壞,我們一般都會(huì)加上驗(yàn)證碼,這些驗(yàn)證碼一般來(lái)說(shuō)都是由人來(lái)識(shí)別的,當(dāng)然,如果驗(yàn)證碼很有規(guī)律,或者說(shuō)很清楚,漂亮,那么也是可能被程序識(shí)別的,我以前就識(shí)別過(guò)某網(wǎng)站的驗(yàn)證碼,因?yàn)楸容^有規(guī)律,所以被識(shí)別了,并且識(shí)別率達(dá)到99%左右,其實(shí)我們可以制作很復(fù)雜一點(diǎn)的驗(yàn)證碼,添加一些干擾的線(xiàn)條或者字體變形,使程序識(shí)別的難度加大,這樣,我們的目的也就達(dá)到了.

    下面是生成的圖片:


    代碼如下,JSP代碼

    <%@page contentType="image/jpeg"%>
    <%@page pageEncoding="UTF-8"%>
    <%@ page import="java.awt.*,javax.imageio.*,java.io.*,java.util.*,java.awt.image.*" %>
    <%--
    The taglib directive below imports the JSTL library. If you uncomment it,
    you must also add the JSTL library to the project. The Add Library action
    on Libraries node in Projects view can be used to add the JSTL 
    1.1 library.
    --%>
    <%--
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
    --%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <%!String s="";%>
    <%
    java.util.List
    <String> fonts=new ArrayList<String>();
    GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
    String[] names
    =GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
    for(String s:names){
        
    char c=s.charAt(0);
        
    if(Character.isLowerCase(c)||Character.isUpperCase(c)){
            
        }
    else{
            fonts.add(s);
        }
    }
    BufferedImage bi
    =new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
    Graphics2D g
    =bi.createGraphics();
    char[] cs={'0','1','2','3','4','5','6','7','8','9'};
    char[] use=new char[4];
    g.setColor(
    new Color(240,240,240));
    g.fillRect(
    0,0,200,50);
    for(int i=0;i<4;i++){
        Point p
    =new Point(5+(i*((int)(Math.random()*10)+40)),40);
        
    int size=0;
        
    int[] sizes=new int[20];
        
    for(int j=0;j<20;j++){
            sizes[j]
    =30+j;
        }
        size
    =sizes[(int)(Math.random()*sizes.length)];
        
    int face=0;
        
    if(Math.random()*10>5){
            face
    =Font.BOLD;
        }
    else{
            face
    =Font.ITALIC;
        }
        use[i]
    =cs[(int)(Math.random()*cs.length)];
        g.setPaint(
    new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                p.x,p.y
    -size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256))));
        g.setFont(
    new Font(fonts.get((int)(Math.random()*fonts.size())),face,size));
        g.drawString(
    ""+use[i],p.x,p.y);
    }
    s
    =new String(use);
    session.setAttribute(
    "code", s);
    g.setPaint(
    null);
    for(int i=0;i<4;i++){
        g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
        g.drawLine((
    int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
    }
    Random random 
    = new Random();
    for (int i=0;i<88;i++) {
        
    int x = random.nextInt(200);
        
    int y = random.nextInt(50);
        g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
        g.setStroke(
    new BasicStroke((float)(Math.random()*3)));
        g.drawLine(x,y,x,y);
    }
    OutputStream ot
    =response.getOutputStream();
    ImageIO.write(bi,
    "JPEG",ot);
    g.dispose();
    ot.close();
    %>

    以下是Servlet代碼
    /*
     * Code.java
     *
     * Created on 2007年9月21日, 下午12:08
     
    */

    package com.hadeslee;

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GradientPaint;
    import java.awt.Graphics2D;
    import java.awt.GraphicsEnvironment;
    import java.awt.Paint;
    import java.awt.Point;
    import java.awt.Stroke;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    import java.util.Random;
    import javax.imageio.ImageIO;

    import javax.servlet.*;
    import javax.servlet.http.*;

    /**
     *
     * 
    @author lbf
     * 
    @version
     
    */
    public class Code extends HttpServlet {
        
        
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
         * 
    @param request servlet request
         * 
    @param response servlet response
         
    */
        
    private List<String> fonts=new ArrayList<String>();
        
    public Code(){
            initFonts();
        }
        
    private void initFonts(){
            GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
            String[] names
    =GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
            
    for(String s:names){
                
    char c=s.charAt(0);
                
    if(Character.isLowerCase(c)||Character.isUpperCase(c)){
                    
                }
    else{
                    fonts.add(s);
                }
            }
        }
        
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        
    throws ServletException, IOException {
            response.setContentType(
    "image/jpeg;charset=UTF-8");
            OutputStream out
    =response.getOutputStream();
            BufferedImage bi
    =new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
            Graphics2D g
    =bi.createGraphics();
            
    char[] cs={'0','1','2','3','4','5','6','7','8','9'};
            
    char[] use=new char[4];
            g.setColor(
    new Color(240,240,240));
            g.fillRect(
    0,0,200,50);
            
    for(int i=0;i<4;i++){
                Point p
    =getPoint(i);
                
    int size=getSize();
                use[i]
    =cs[(int)(Math.random()*cs.length)];
               
    // g.setColor(new Color((int)(Math.random()*256),0,(int)(Math.random()*256)));
                g.setPaint(getPaint(p,size));
                g.setFont(
    new Font(fonts.get((int)(Math.random()*fonts.size())),getFace(),size));
                g.drawString(
    ""+use[i],p.x,p.y);
            }
            g.setStroke(
    new BasicStroke(1.0f));
            g.setPaint(
    null);
            
    for(int i=0;i<4;i++){
                g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
                g.drawLine((
    int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
            }
            Random random 
    = new Random();
            
    for (int i=0;i<88;i++) {
                
    int x = random.nextInt(200);
                
    int y = random.nextInt(50);
                g.setColor(
    new Color((int)(Math.random()*0x00FFFFFFF)));
                g.setStroke(getStroke());
                g.drawLine(x,y,x,y);
            }
            ImageIO.write(bi,
    "JPEG",out);
            out.close();
            g.dispose();
        }
        
    private Stroke getStroke(){
          BasicStroke bs
    =new BasicStroke((float)(Math.random()*3));
          
    return bs;
        }
        
    private Point getPoint(int index){
            
    return new Point(5+(index*((int)(Math.random()*10)+40)),40);
        }
        
    private Paint getPaint(Point p,int size){
            GradientPaint gp
    =new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                    p.x,p.y
    -size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
            
    return gp;
        }
        
    private int getFace(){
            
    if(Math.random()*10>5){
                
    return Font.BOLD;
            }
    else{
                
    return Font.ITALIC;
            }
        }
        
    private int getSize(){
            
    int[] sizes=new int[20];
            
    for(int i=0;i<20;i++){
                sizes[i]
    =30+i;
            }
            
    return sizes[(int)(Math.random()*sizes.length)];
        }
        
        
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
        /** Handles the HTTP <code>GET</code> method.
         * 
    @param request servlet request
         * 
    @param response servlet response
         
    */
        
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        
    throws ServletException, IOException {
            processRequest(request, response);
        }
        
        
    /** Handles the HTTP <code>POST</code> method.
         * 
    @param request servlet request
         * 
    @param response servlet response
         
    */
        
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        
    throws ServletException, IOException {
            processRequest(request, response);
        }
        
        
    /** Returns a short description of the servlet.
         
    */
        
    public String getServletInfo() {
            
    return "Short description";
        }
        
    // </editor-fold>
    }

    posted @ 2007-10-05 17:41 flyleer| 編輯 收藏
    oracle sql(轉(zhuǎn)貼)

         摘要: 一 常用的SQL語(yǔ)句 select name,count(*) from table where .. group by ... 中能查詢(xún)的字段只能為group by的字段. select * from table where rownum < 5 order by id 中查詢(xún)出來(lái)的結(jié)果不是按數(shù)據(jù)中的ID排序的,而只是將select * from t...  閱讀全文

    posted @ 2007-10-05 17:32 flyleer| 編輯 收藏
    主站蜘蛛池模板: 国产精品视频全国免费观看| www国产亚洲精品久久久| 亚洲伊人久久大香线蕉影院| 久久亚洲美女精品国产精品| 三年片在线观看免费西瓜视频| 在线观看特色大片免费视频 | 亚洲精品女同中文字幕| 在线观看视频免费完整版| 国产成人精品日本亚洲11| 67194成是人免费无码| 亚洲综合久久一本伊伊区| 青青草免费在线视频| 亚洲精品亚洲人成在线播放| 无码国产精品一区二区免费I6| 在线a亚洲老鸭窝天堂av高清| 在线免费视频一区二区| 亚洲天堂中文资源| 3344免费播放观看视频| 日韩亚洲欧洲在线com91tv| 国产亚洲男人的天堂在线观看| 四虎永久免费网站免费观看| 黄页网址在线免费观看| 最近最新MV在线观看免费高清| 色偷偷亚洲女人天堂观看欧| 大学生一级特黄的免费大片视频| 亚洲成a人片在线不卡一二三区| 免费国产高清视频| 亚洲综合精品伊人久久| 日本人护士免费xxxx视频| 特级av毛片免费观看| 国产美女亚洲精品久久久综合| 黄色片免费在线观看| 亚洲最大黄色网站| 妞干网免费视频在线观看| 看Aⅴ免费毛片手机播放| 亚洲综合无码精品一区二区三区| 男人j进入女人j内部免费网站| 亚洲国产高清视频在线观看| 在线精品免费视频| 一级中文字幕乱码免费| 亚洲电影国产一区|