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

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

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

    數據加載中……

    2007年9月12日

    俄文網站出現亂碼解決方法

    有access數據庫的俄文網站出現亂碼的解決方法
    2008年12月12日 星期五 18:34

    最近站長解決了此問題,做俄文網站,后臺添加數據的時候,必須做俄文版的后臺,中文版的后臺寫數據,時候前臺顯示肯定會出現亂碼,俄文版后臺最前面必須加<%@ codepage=866%> 866代表俄文的,下面還有幾種代表方式

    < %@ codepage=65001%>UTF-8
    <%@ codepage=936 %>簡體中文
    <%@ codepage=950%>繁體中文
    <%@ codepage=437 %>美國/加拿大英語
    <%@ codepage=932 %>日文
    <%@ codepage=949 %>韓文

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

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

    這一句,不然部分代碼會出現亂碼.

    本站站長解決了此問題供大家參考.

    posted @ 2010-07-15 17:16 flyleer 閱讀(1635) | 評論 (2)編輯 收藏
    軟件項目管理實踐之日計劃(轉載)

    軟件項目管理實踐之日計劃

     袁光東 原創

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

    案例

        程序員J:四年開發經驗

        程序員L:三年開發經驗

        程序員Y:五年開發經驗

        技術能力:Y > J > L

        J,L,Y同時進入一個項目組,開發時間為30個工作日,即6周,包括需求分析、設計、編碼和集成。其中編碼和單元測試時間為10個工作日(2周)。產生的工作績效為:

     

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

        可見,當程序員的技能達到一定水平后,技能與生產率并不成正比,并不是技術水平越高的程序的生產率越高。

    一、最后期限

        很多程序員都會有類似的經歷:

        1月1日,項目經理說:“小張,在1月5日之前把這項工作做完,詳細的需求文檔我已經發到你的郵箱中。”

        1月1日,小張對需求文檔瞥了幾眼,估計2天就可以完成,嘀咕:“現在才是1月1日嘛。這項任務要1月5日才提交。我還有時間,不用管它,還是先看我的小說吧。”

        1月2日,小張繼續看他那心愛的小說......

        1月3日,小張繼續看他那心愛的小說......

        1月4日 9:00,小張開始看需求文檔,2小時后中斷,因為他需要修復系統的一個Bug。

        1月4日 18:00,小張正在埋頭苦干,因為明天就要提交工作,可是一個代碼還沒有寫呢。

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

        1月5日 9:00,項目經理問:“小張,那個功能做完了吧?”小張答道:“就快了,今天提交沒有問題。”

        1月5日 14:00,小張發現有一部份代碼需要重寫。用戶的要求是需要一個可配置的功能,而小張卻寫成了硬代碼。

        1月5日 17:00,項目經理來到小張面前:“小張,你中午不是說今天提交沒有問題嗎?怎么現在還沒有看你提交代碼?”小張委屈地答道:“經理,遇到一點小麻煩。不過相信我,下班之前一定完成。”

        1月5日 18:00,項目經理急匆匆趕到小張的座位旁:“小張,請馬上提交代碼,不然就來不及了。”小張這時也急了:“你不要催我。這個功能麻煩大了,沒有想象得那么簡單。我今天晚上得加班。”項目經理無可奈何地走了。小張加班到凌晨1點。但程序還是有一些問題。

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

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

        1月8日,總算是修改完成。已經拖了三天,來不及測試,只能匆匆把代碼提交。

        后來,又經過5次修改,直到1月20日,這個功能總算是徹底完成。

        小張向項目經理請了一周假。因為這兩周來幾乎每天晚上都是加班解決問題。

        許多的程序員還會有這樣的經歷:

        4月1日,項目經理:“小王,這個功能交給你,需求你看了嗎?你看需要多長時間完成?”

        小王:“哦,經理,這個功能我剛看過,大約需要1周時間。”

        項目經理:“那就是4月5日可以提交啦?”

        小王:“是的,經理。這個功能內容很多,還要實現一個郵件功能,4月5日能提交已經是我的極限了。”

        項目經理:“那就4月5日吧。”

        4月2日,小王發現:系統中已經有一個類似的郵件功能,直接使用就可以。

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

        4月3日 9:00,小王把功能都測試通過,并且還私下請用戶幫他進行測試通過。

        4月3日 11:30,項目經理:“小王,那個功能做完了嗎?”

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

        4月4日,小王專注的看著一本電子書,名字叫《The Deadline》。

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

        4月6日 9:00,項目組開會,項目經理表揚了小王,要求大家向小王學習。因為這次發布只有小王按時完成了工作。

        簡直不可思議,我們的程序員就是這樣工作的。是的,我也認為不可思議!可是哪個程序員敢保證自己沒有這么干過呢?這就是所謂的最后期限:人們總是在最后期限才開始工作

    二、熱衷于加班

        在所有的軟件項目組中,加班已經成了天經地義的事。甚至有些管理層認為,如果一個項目組不加班,說明項目組沒有盡全力的去做事。我至今不明白這是什么道理,工作是否盡力與加班到底有何關系?工作的績效又與加班有何種關系?

        在筆者的項目組中,筆者的客戶方也曾對筆者要求項目組必須加班,遭到了筆者的拒絕。在保證每個階段在不加班的情況下按期完成,客戶方才勉強同意。事實證明,不加班也是可以把項目做完的,而且可以做得更好。

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

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

    三、工作成熟度與團隊成熟度

        因此,我一直致力于研究提高個人工作績效的方法和提高項目組工作績效的方法。

        在長期的學習、摸索、實踐中,我發現全心的投入工作,干好4個小時就足以把工作做好。這種全心投入產生的績效要比以前一周所干的還要多。如果每天努力干好8個小時,你會比周圍的人產生2倍以上的績效,當然也會非常疲憊。

        在管理一個40人規模的團隊時,我每天投入僅僅4個小時就足夠。為什么會有這么高的工作效率?主要是長期堅持下面的方法:

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

        2.為任務劃優先級(標出當天必須完成的事情)

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

        4.絕不拖延,計劃當天必須完成的事情就一定要做完才走。

        筆者長期以來在思考,這個方法能否幫助團隊提高工作績效?能否讓項目組提高生產率?能否使項目按期交付和提前交付?能否幫助程序員在不加班的情況下把項目做好?

        在筆者帶項目和監控項目的過程中發現,程序員工作效率不高的原因除了技能因素外,還有幾個重要的因素在影響著程序員的工作績效:

        1.工作無計劃:很多程序員根本不知道每天要做哪些事情,每天必須做完哪些事情。很少有程序員對當天的工作進行計劃,

        2.工作無重點:很多程序員通常按事情發生的先后順序來做事。有時,有些程序員忙碌了一天下來卻發現當天其實沒有做什么有用的事情。

        3.工作無目的:程序員不知道當天要把事情做到什么程度,完全是憑心情做事,憑良心做事。事情沒有做完,別人下班自己也跟著下班,認為反正明天還有時間,還沒有到最后期限。

        4.工作不到位:工作起來總是覺得差不多就行。把代碼寫完和功能能夠運行當作兩回事情。工作到位就是一次就把工作做好,達到可交付。

        5.工作無積極性:被動式工作,就算工作做完也不提交,一定要等到最后期限才提交。如果比承諾時間提前提交工作,馬上就會帶來新的工作,多干和少干一個樣,誰愿意多干呢?

        我們可以提出一個概念叫做“工作成熟度”。工作成熟度高的程序員通常會有計劃性、工作有重點、有目的性、工作做到位。而成熟度低的程序員通常是無計劃的,工作不分輕重,很容易被突發事件打斷當前工作,工作要通過多次修改才能夠完成。所以,我發現,工作成熟度對程序員生產率造成最直接的影響。

        筆者在監控項目的過程中也發現造成項目組效率低下、進度落后的一些因素:

        1.項目經理不了解項目當日狀態。是的,有些項目經理根本不知道今天每個程序員會干些什么?該干些什么?

        2.項目經理不了解項目實情。沒錯,項目經理根本就不知道每個程序員當天干了多少活,干到什么程度,還要干多久?也就不知道項目到了什么程序,還有多少工作量要做?

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

        4.項目經理不知道工作的重點是什么?哪些工作是本階段必須要完成的?哪些是可以拖后的?

        5.不良溝通。項目組的溝通不良,產生大量重復代碼。甚至會有兩個程序同時開發一個功能,但是彼此間卻不知道。

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

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

        這就是我們可以提出的另一個概念——“團隊成熟度”。

        “噢,伙計,我已經聽煩了。好像是有那么回事!可是又能怎么樣呢?所有的項目不都是這樣過來的嗎?”

    四、日計劃做什么?

        程序員的工作成熟度直接影響了程序員的生產率;項目的團隊成熟度直接影響了項目的生產率。如果我們能夠提高程序員工作成熟度和團隊成熟度,就一定可以提高項目的生產率。

        而程序員工作成熟度和項目團隊成熟度的共同核心點就是計劃。在筆者的研究和實踐過程中,可以通過在項目中實施日計劃來提高程序員的工作成熟度和項目的團隊成熟度,從而提高程序員的生產率和項目的生產率。

        實施日計劃的流程:

        1.每天8:30-8:35,項目組召開晨會。由項目經理列出每個開發人員的工作清單,并對每個工作任務標注優先級別,設定任務完成的標準,指明當日必須要完成的任務,并得到責任人的承諾。

        2.每天下班前20分鐘,由項目經理依次檢查開發人員的工作。評定工作是否完成。如果有開發人員未能完成任務,一起分析任務未能完成的原因。然后召開一個簡單的會議,介紹當天工作的完成情況及當前階段的項目狀態,未完成任務的開發人員需要加班完成。

        每天早晨的會議我們稱之為晨會,下午的會議稱之為夕會。

        日計劃的實施環節:設定目標,制定計劃,檢查,反饋。

        日計劃的特點:

        1.開發人員每天在晨會承諾完成的任務必須當天完成,提倡日清日結。

        2.提交可交付的成果。(事先制定任務完成的標準,并由項目經理進行檢查,評定任務是否完成。)

        3.做最重要的事情

        4.保證把工作做完

    五、我們是怎么實施日計劃的?

        日計劃看起來非常簡單,下面我們將對日計劃的實踐進行討論。

        1.實施日計劃對項目有什么作用?

        · 實施日計劃,使項目有良好的溝通機制。每個開發人員都非常清楚項目的當前情況:項目已經完成了多少?還有多少工作沒有完成?

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

        · 日計劃提倡只做最重要的事情,使項目抓住了重點。

        · 項目經理通過實施日計劃,非常清楚每個開發人員每天需要完成哪些任務,每天必須完成哪些任務,以及每個人的完成情況怎么樣?項目經理充分地掌握了項目的情況,可以及時調整計劃,應對各種變化。

        · 日計劃實現了項目的良好溝通,每項任務都由開發人員和項目經理達成一致。

        · 日計劃通過晨會和夕會實現了項目組的信息共享。

        2.實施日計劃對程序員的作用

        · 日計劃列出了程序員每天要做的任務清單,并且對任務確定優先級。

        · 對程序員的工作指明方向,并且要求程序員優先做最重要的任務,使程序員抓住了工作重點。

        · 日計劃要求提交可交付的成果,要求程序員把工作一步要做到位,養成良好的習慣。

        · 日計劃提高了程序員的工作績效,程序員可以回到正常的工作時間,減少無謂的加班。

        · 程序員比以前完成更多的工作而獲得獎勵。

    3.在實施日計劃時,與傳統項目管理的工作分配有什么不同?如何進行工作分配?

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

     

    傳統項目管理任務分配表
    模塊 功能  當前狀態 計劃開始 計劃結束 實際開始 實際結束 責任人
    訂單管理  訂單信息查詢 已開始 2009-3-1  2009-3-7 2009-3-1    L
    新增訂單 已開始 2009-3-1  2009-3-7 2009-3-1    L
    訂單管理 修改訂單 未開始 2009-3-1  2009-3-7     L
    刪除訂單 未開始 2009-3-1  2009-3-7     L

        實施日計劃的工作分配中,“工作項”的粒度更小。如果按照XP和Scrum的說法,功能就是指一個“故事”,完成“功能”的步驟或事件叫“任務”。

        傳統項目管理的任務分配是以“故事”為最小粒度。日計劃的任務分配是以“任務”為最小粒度。“任務”是指完成某一個“功能”的步驟或事件。每個人當天的任務工時總合為1人天。

        故事和任務的區別:

     

    故事
    任務
    訂單信息查詢
    DAO編碼
    DAO單元測試
    業務層編碼
    JSP表示層編碼
    集成測試

        要實現訂單信息查詢就由右邊的那些任務組成。

        開始,我不知道怎樣來描述一個“功能”和實現一個功能細化的“任務”。后來,當我看到Scrum的書籍后,看到Sprint和任務板時,才知道自己的實踐與Scrum的某些實踐竟有如此相似之處。我困惑很久,想不到用什么詞來表示一個“功能”和實現一個功能所需要的“步驟”。Scrum使用“故事”和“任務”來定義它們,我認為非常的準確到位。

        但是日計劃的工作分配與Scrum的工作分配是不同的。實施日計劃是由項目經理主導的;而Scrum強調由程序員主導。至于這兩種方式,哪一種更好。我覺得可以結合具體的情況進行不同的實踐。

        如果是程序員成熟度比較高的項目,可以由程序員來主導。程序員成熟度較低和工期很緊的項目,可以由項目經理來主導。總之,這都需要程序員和項目經理達成一致。程序員需要向項目經理承諾。

        Scrum會對每個任務進行事先估算,而日計劃分配工作任務前才會進行估算,并且只為每個人分配工作量為1人天的任務總和。

     

    日計劃樣例:2009-3-22程序員L工作計劃
    開發人員  今日計劃工作及完成情況
    序號 工作任務 優先級 完成標準 是否完成 完成百分比 完成情況 未完成原因 檢查人
    L 1 訂單管理模塊DAO實現 50 單元測試通過          
    2 與用戶確認頁面原型 10 用戶確認郵件          

        程序員L任務1的優先級為50,任務2的優先級為10。這并不表示兩個任務的重要程度相差40,而是表示L當天應該先做任務1,再做任務2。

        筆者認為這種日計劃更加靈活。因為項目經理可以靈活的設置任務。Scrum的任務都是依據故事。日計劃甚至可以把與開發根本不相干的事情包括進來。

        當天要完成哪些任務是由項目經理先計劃的,但是程序員可以提出不同的意見。雙方達成一致。并且任務是可以量化和檢查的。因此,事先還要設置完成標準。一旦程序員與項目經理達成一致,就相當于程序員向項目經理承諾,今天可以完成這些任務。

        對于成熟度比較高的程序員,完全可以由程序員先提出計劃。然后,由項目經理進行評估和檢查。雙方達成一致后,就把任務放入日計劃的工作任務表中。

    4.為什么要檢查?怎么進行檢查?

        如果沒有檢查,計劃就是無效的。

        日計劃強調提交可交付的成果。雖然事先制定了標準,但是程序員和項目經理可能會對可交付成果的理解不同。項目經理如果要清楚地了解到項目狀況就必須要親自進行檢查。

        如何進行檢查?項目經理一定要在現場工作,最好的辦法就是讓他演示給你看。對于不能演示的任務就進行抽查。因為事先已經制定完成標準,大家只需要按規矩辦事即可。

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

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

        程序員不能完成日計劃時,也就是進度出現了偏差。項目經理一定要與程序員一起分析偏差的原因,并記錄下來。進度發生偏差最有可能的兩個原因:計劃不合理和計劃執行不力。

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

        如果是對任務估算發生失誤,就需要重新進行估算。這正是日計劃和檢查帶來的好處。項目經理需要重新調整計劃。

        如果是對程序員能力估計失誤,項目經理也需要重新進行調整,如換人,或延長時間。

        如果是程序員工作方法存在問題,就一定要進行指導,或者安排其它人員進行協助。

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

        在我的團隊中,績效考核的幾個核心指標:工作效率*工作效果*工作量

        不能完成日計劃,會直接影響到月底的績效和獎金。

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

        六、沒有銀彈

        是的,沒有銀彈。沒有任何一種方法可以保證項目一定能夠成功。日計劃也一樣。目標、計劃、執行、控制構成管理的核心。所謂工作成熟度和團隊成熟度其實都可以歸納為“執行力”。日計劃只是一種管理實踐,在不同的環境可能會有不同的實踐方法,并不是一層不變的。

    posted @ 2010-03-24 17:29 flyleer| 編輯 收藏
    Oracle創建數據表空間,用戶,授權,表,索引,簇(2008-07-26 22:38:59)

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

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

    //創建用戶并指定表空間
    create user 用戶名 identified by 密碼
    default tablespace test_data
    temporary tablespace test_temp;

    //給用戶授予權限

    grant connect,resource to 用戶名

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

    create cluster s_t_cluster(tid number(8));--創建索引簇
    ----------------------------------------------------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
    --插入數據
    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);
    --查詢
    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條數據往表stu
    declare
    x number;
    begin
      for x in 1..100000 loop
        insert into stu values(stu_seq.nextval,'名字'||x,'地址'||x);
      end loop;
    end;
    ---------------------------------------------
    --用命令插入N條數據往表sc
    declare
    x number;
    begin
      for x in 1..10000 loop
        insert into sc values(sc_seq.nextval,x+50);
      end loop;
    end;
    ---------------------------------------------
    --查詢
    select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid--未加索引時的普通查詢太慢了
    --使用索引簇查詢
    select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid

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

    //創建表,序列號(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           --每次加幾個,即遞增的間隔
    start with 1             --從1開始計數
    nomaxvalue               --不設置最大值
    nocycle                  --一直累加,不循環
    cache 10;
    ==============================================================
    insert into test1(tid,tname,tbd)values(test1Seq.Nextval,'ccc',sysdate);

    posted @ 2009-03-19 20:13 flyleer| 編輯 收藏
    sybase的問題

          近來在做sybase的性能調試,發現我啟動多線程的時候,線程會處于lock sleeping。 剛開始還以為是數據庫不支持并發訪問,后來想想真幼稚。。原來是我在做并發插入數據的時候,該表的鎖設置為全頁加鎖了。 后來設置為數據行鎖,這樣才可以執行并發操作的測試。 但是后面又遇到一個問題,就是out of lock的問題,也就是ASE設置的鎖不夠用。如果是在windows下的話,可以用ASE的補助工具修改number of locks來增加更多的鎖,因為設置的是數據行鎖,所以,在執行Insert的時候,如果不提交事物的話,就會每一條數據加一個鎖。。在增加鎖的時候,必須要增加內存,也就是增加max memory。。大概一個鎖占據的內存是120byte。 如果是在Linux系統的話,就修改“服務名.cfg“文件。 
         1、全頁鎖(allpages lock) 對查詢的表及索引頁加鎖,也就是table lock 
           2、頁鎖  (data lock)     對所查詢的結果所在頁加鎖,對索引不加鎖 
        3、行鎖  (row lock)      對某行數據加鎖

      sybase除非對配置參數加以特定,對所有的表都予置了隱含的全頁面加鎖機制。

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

      當數據庫從原先版本的服務器中轉儲出來重新加載時,所有的表都被定義為全頁面加鎖的表。當建立一個新表時,可以不使用這個缺省值,可采用如下的句法格式:

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

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

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

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

    1、 修改Oracle系統配置文件/etc/oratab

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

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

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

     

    #!/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、建立服務連接:

    系統啟動時啟動數據庫,我們需要以下連結∶

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

    $ 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

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

    要在重新啟動時停止數據庫,我們需要以下連結∶

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

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

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

    轉貼于:Oracle認證考試_考試大    

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

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

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

    虛擬機加載類的途徑:

    1、Dog dog = new Dog();
    這個動作會導致常量池的解析,Dog類被隱式裝載。
    如果當前ClassLoader無法找到Dog,則拋出NoClassDefFoundError。

    2、Class clazz = Class.forName(“Dog”);
       Object dog =clazz.newInstance();
    通過反射加載類型,并創建對象實例
    如果無法找到Dog,則拋出ClassNotFoundException。

    3、Class clazz = classLoader.loadClass(“Dog”);
       Object dog =clazz.newInstance();
    通過反射加載類型,并創建對象實例
    如果無法找到Dog,則拋出ClassNotFoundException。

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

    1和2使用的類加載器是相同的,都是當前類加載器。(即:this.getClass.getClassLoader)。
    3由用戶指定類加載器。

    如果需要在當前類路徑以外尋找類,則只能采用第3種方式。第3種方式加載的類與當前類分屬不同的命名空間。
    當前類加載器命名空間對其不可見。當然,如果被加載類的超類對于當前類命名空間可見的話,則可以進行強制轉型。

    第1和第2種情況區別不大。如果,Dog類在編譯時無法得到,則使用第2種方式。

    另外,第1種和第2種都會導致類被初始化,即:執行類的靜態初始化語句,而第3種情況不會。
    另外注意,第1種拋出Error,第2、3種拋出Exception,它們分屬于不同的異常/錯誤分支。

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

    對象實例化方式:
    1、new Dog();
    2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...);
    3、Object.clone();//通過本地方法進行復制
    4、反序列化 

    posted @ 2008-11-25 14:38 flyleer| 編輯 收藏
    linux問題

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

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

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

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

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

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

    第一種:

    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方法的區別。。前一陣還記得,現在忘記。。 都不知道現在還記得些什么東西了。
    (1)load方法,hibernate認為該id對應的對象(數據庫記錄)在數據庫中是一定存在的,在用到對象中的

    其他屬性數據時才查詢數據庫,但是萬一數據庫中不存在該記錄,只能拋ObjectNotFoundEcception異常

    ,所說的load方法拋異常是指在使用該對象的數據時,數據庫中不存在該數據時拋異常,而不是在創建這

    個對象時。由于session中的緩存對于hibernate來說是個相當廉價的資源,所以在load時會先查一下

    session緩存看看該id對應的對象是否存在,不存在則創建代理。所以如果你知道該id在數據庫中一定有

    對應記錄存在就可以使用load方法來實現延遲加載。

    (2)get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然后在二級緩

    存中查找,還沒有就查數據庫,數據庫中沒有就返回null。

    3.spring AOP中對pointcut,advice的概念的理解。。 這個我是根本就不知道啥玩意,只知道AOP的點點意思。。
    4.hibernate的繼承映射包含了哪幾種不同的策略,并說出各自的特點。。HOHO。。這個問題,還是不知道。。以前讀書的時候看過點點相關的內容,現在早就忘記的一干二凈了。

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

       1.JDBC有幾種驅動類型:  

         type   1:jdbc-odbc橋    
      type   2:本地api驅動    
      type   3:網絡協議驅動    
      type   4:本地協議驅動    

    Type   1:   jdbc-odbc橋    
         Jdbc-odbc橋是sun公司提供的,是jdk提供的的標準api.   這種類型的驅動實際是把所有jdbc的調用傳遞給odbc   ,再由odbc調用本地數據庫驅動代碼.(   本地數據庫驅動代碼是指由數據庫廠商提供的數據庫操作二進制代碼庫,例如在oracle for windows中就是oci   dll  文件)   

          jdbc-odbc橋 ---- odbc---- 廠商DB代碼 ----- 數據庫Server     
                                              (圖一)    

            只要本地機裝有相關的odbc驅動那么采用jdbc-odbc橋幾乎可以訪問所有的數據庫,jdbc-odbc方法對于客戶端已經具備odbc   driver的應用還是可行的.但是,由于jdbc-odbc先調用odbc再由odbc去調用本地數據庫接口訪問數據庫.所以,執行效率比較低,對于那些大數據量存取的應用是不適合的.而且,這種方法要求客戶端必須安裝odbc   驅動,所以對于基于internet   ,intranet的應用也是不合適的.因為,你不可能要求所有客戶都能找到odbc   driver.     

     Type   2:   本地Api驅動    
          本地api驅動直接把jdbc調用轉變為數據庫的標準調用再去訪問數據庫.這種方法需要本地數據庫驅動代碼.    
       
      本地api驅動----廠商DB代碼-----數據庫Server     

                                           (圖二)     
             這種驅動比起jdbc-odbc橋執行效率大大提高了.但是,它仍然需要在客戶端加載數據庫廠商提供的代碼庫.這樣就不適合基于internet的應用.并且,他的執行效率比起3,4型的jdbc驅動還是不夠高.    
       
      Type3:網絡協議驅動    
              這種驅動實際上是根據我們熟悉的三層結構建立的.   jdbc先把對數局庫的訪問請求傳遞給網絡上的中間件服務器.   中間件服務器再把請求翻譯為符合數據庫規范的調用,再把這種調用傳給數據庫服務器.如果中間件服務器也是用java開發的,那么在在中間層也可以使用1,2型 jdbc驅動程序作為訪問數據庫的方法.    
       
      網絡協議驅動---------中間件服務器------------數據庫Server    
                                    (   圖三)    
       
             由于這種驅動是基于server的.所以,它不需要在客戶端加載數據庫廠商提供的代碼庫.而且他在執行效率和可升級性方面是比較好的.因為大部分功能實現都在server端,所以這種驅動可以設計的很小,可以非常快速的加載到內存中.   但是,這種驅動在中間件層仍然需要有配置其它數據庫驅動程序,并且由于多了一個中間層傳遞數據,它的執行效率還不是最好.     

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

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

                今天項目中碰到一個科學計算法的問題,我保存到數據庫的是數字,但是從數據庫中取出來在頁面展現的時候確變成了科學計算法的形式了。最后查了下,發現<bean:write/>里有個屬性format="##.00"這樣可以就正確顯示保存的數字。因為我的涉及到小數點的問題,所以我保留了兩位有效數字。

    posted @ 2007-11-28 16:15 flyleer| 編輯 收藏
    【轉】js日期時間函數

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

    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 時間  
    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. //| 求兩個時間的天數差 日期格式為 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. //| 日期計算  
    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' )//如果是字符串轉換為日期型  
    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. //| 日期輸出字符串,重載了系統的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. //| 日期合法性驗證  
    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.     //如果格式滿足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替換為''   
    125.     //數據庫中,合法日期可以是:YYYY-MM/DD(2003-3/21),數據庫會自動轉換為YYYY-MM-DD格式   
    126.     var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');   
    127.     if (s==''//說明格式滿足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('錯誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');   
    134.             return false;   
    135.         }   
    136.     }   
    137.     else   
    138.     {   
    139.         //alert('錯誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');   
    140.         return false;   
    141.     }   
    142.     return true;   
    143. }   
    144.   
    145. //+---------------------------------------------------  
    146. //| 日期時間檢查  
    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. //| 把日期分割成數組  
    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. //| 取得日期數據信息  
    183. //| 參數 interval 表示數據類型  
    184. //| y 年 m月 d日 w星期 ww周 h時 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. //| 取得當前日期所在月的最大天數  
    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. //| 取得當前日期所在周是一年中的第幾周  
    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. //| 字符串轉成日期類型   
    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| 編輯 收藏
    生成隨機數(轉貼)

    有時候在我們的網絡應用中,防止程序自動登錄搞破壞,我們一般都會加上驗證碼,這些驗證碼一般來說都是由人來識別的,當然,如果驗證碼很有規律,或者說很清楚,漂亮,那么也是可能被程序識別的,我以前就識別過某網站的驗證碼,因為比較有規律,所以被識別了,并且識別率達到99%左右,其實我們可以制作很復雜一點的驗證碼,添加一些干擾的線條或者字體變形,使程序識別的難度加大,這樣,我們的目的也就達到了.

    下面是生成的圖片:


    代碼如下,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(轉貼)

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

    posted @ 2007-10-05 17:32 flyleer| 編輯 收藏
    跟隨鼠標移動的層,用于顯示某些由于標題太長的內容

    function remove(){
       document.body.removeChild(document.getElementById("showDive"));
      }
      
      function insert(hid,showid){
      
       var elment=document.getElementById(showid);
       var elmentid=document.getElementById(hid).value;
       if(document.getElementById("showDive")!=null){
        remove();
       }
       var div=window.document.createElement("div");
             div.innerHTML = "<font color='red'>"+elmentid+"</font>";
             div.setAttribute("id","showDive");
       div.className ="css2";
       div.style.height="100px";
             div.style.height = "30px";
             div.style.top=document.body.scrollLeft+event.clientY;
       div.style.left=document.body.scrollLeft+event.clientX;
             window.document.body.appendChild(div); 
      }

    posted @ 2007-09-12 22:23 flyleer 閱讀(433) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲国模精品一区| 另类图片亚洲校园小说区| 亚洲精品无码久久不卡| 久草视频免费在线观看| 最近2019中文免费字幕在线观看| 日韩国产精品亚洲а∨天堂免| 亚洲香蕉免费有线视频| 国产成人亚洲精品青草天美| 亚洲?V无码成人精品区日韩| 午夜精品在线免费观看| 18国产精品白浆在线观看免费| 无码国产精品一区二区免费vr| 国产精品成人啪精品视频免费| 亚洲精品亚洲人成在线| 亚洲av一本岛在线播放| 亚洲电影在线免费观看| 亚洲AV无码AV男人的天堂| 亚洲欧洲成人精品香蕉网| 亚洲人成网站色在线入口| 免费萌白酱国产一区二区| 日本免费电影一区| 免费视频淫片aa毛片| 希望影院高清免费观看视频| **毛片免费观看久久精品| 99久久99热精品免费观看国产| 毛片免费在线观看| 美女被cao网站免费看在线看| 国产免费网站看v片在线| 一个人免费视频观看在线www| 久久久久久毛片免费看| 一级黄色免费大片| 国产精品福利片免费看| 国内精品99亚洲免费高清| 中文在线观看永久免费| 在线看片免费人成视频久网下载 | 日本免费在线中文字幕| 毛片在线全部免费观看| 精品无码无人网站免费视频| 91精品国产免费网站| 美女被免费喷白浆视频| 好男人看视频免费2019中文 |