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

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

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

    憨厚生

    ----Java's Slave----
    ***Java's Host***

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      165 隨筆 :: 17 文章 :: 90 評論 :: 0 Trackbacks

    2009年10月27日 #

    【轉(zhuǎn)】http://www.cnblogs.com/myssh/archive/2009/12/18/1627368.html

    在《Pragmatic AJAX中文問題 A Web 2.0 Primer 》中偶然看到對readyStae狀態(tài)的介紹,感覺這個介紹很實在,摘譯如下:

     0: (Uninitialized) the send( ) method has not yet been invoked. 
     1: (Loading) the send( ) method has been invoked, request in progress. 
     2: (Loaded) the send( ) method has completed, entire response received.
     3: (Interactive) the response is being parsed. 
     4: (Completed) the response has been parsed, is ready for harvesting. 

     0 - (未初始化)還沒有調(diào)用send()方法
     1 - (載入)已調(diào)用send()方法,正在發(fā)送請求
     2 - (載入完成)send()方法執(zhí)行完成,已經(jīng)接收到全部響應(yīng)內(nèi)容
     3 - (交互)正在解析響應(yīng)內(nèi)容
     4 - (完成)響應(yīng)內(nèi)容解析完成,可以在客戶端調(diào)用了

    對于readyState的這五種狀態(tài),其他書中大都語焉不詳。像《Foundations of AJAX中文問題》中,只在書中的表2-2簡單地列舉了狀態(tài)的“名稱”--The state of the request. The five possible values are 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, and 4 = complete。而《Ajax in Action》中好像根本就沒有提到這5種狀態(tài)的細節(jié)?!禤rofessional AJAX中文問題》中雖不盡人意,但還是有可取之處:

    There are five possible values for readyState: 
    0 (Uninitialized): The object has been created but the open() method hasn’t been called. 
    1 (Loading): The open() method has been called but the request hasn’t been sent. 
    2 (Loaded): The request has been sent. 
    3 (Interactive). A partial response has been received. 
    4 (Complete): All data has been received and the connection has been closed. 

    readyState有五種可能的值:
    0 (未初始化): (XMLHttpRequest)對象已經(jīng)創(chuàng)建,但還沒有調(diào)用open()方法。
    1 (載入):已經(jīng)調(diào)用open() 方法,但尚未發(fā)送請求。
    2 (載入完成): 請求已經(jīng)發(fā)送完成。
    3 (交互):可以接收到部分響應(yīng)數(shù)據(jù)。
    4 (完成):已經(jīng)接收到了全部數(shù)據(jù),并且連接已經(jīng)關(guān)閉。

    在《Understanding AJAX中文問題: Using JavaScript to Create Rich Internet Applications》中,則用下表進行了說明:

    readyState Status Code

    Status of the XMLHttpRequest Object
    (0) UNINITIALIZED
    未初始化
    The object has been created but not initialized. (The open method has not been called.)
    (XMLHttpRequest)對象已經(jīng)創(chuàng)建,但尚未初始化(還沒有調(diào)用open方法)。
    (1) LOADING
    載入
    The object has been created, but the send method has not been called.
    (XMLHttpRequest)對象已經(jīng)創(chuàng)建,但尚未調(diào)用send方法。
    (2) LOADED
    載入完成
    The send method has been called, but the status and headers are not yet available.
    已經(jīng)調(diào)用send方法,(HTTP響應(yīng))狀態(tài)及頭部還不可用。
    (3) INTERACTIVE
    交互
    Some data has been received. Calling the responseBody and responseText properties at this state to obtain partial results will return an error, because status and response headers are not fully available.
    已經(jīng)接收部分?jǐn)?shù)據(jù)。但若在此時調(diào)用responseBody和responseText屬性獲取部分結(jié)果將會產(chǎn)生錯誤,因為狀態(tài)和響應(yīng)頭部還不完全可用。
    (4) COMPLETED
    完成
    All the data has been received, and the complete data is available in the responseBody and responseText properties.
    已經(jīng)接收到了全部數(shù)據(jù),并且在responseBody和responseText屬性中可以提取到完整的數(shù)據(jù)。

    根據(jù)以上幾本書中的關(guān)于readyState五種狀態(tài)的介紹,我認(rèn)為還是《Pragmatic AJAX中文問題 A Web 2.0 Primer 》比較到位,因為它提到了對接收到的數(shù)據(jù)的解析問題,其他書中都沒有提到這一點,而這一點正是“(3)交互”階段作為一個必要的轉(zhuǎn)換過程存在于“(2)載入完成”到“(4)完成”之間的理由,也就是其任務(wù)是什么。歸結(jié)起來,我覺得比較理想的解釋方法應(yīng)該以“狀態(tài):任務(wù)(目標(biāo))+過程+表現(xiàn)(或特征)”表達模式來對這幾個狀態(tài)進行定義比較準(zhǔn)確,而且讓人容易理解?,F(xiàn)試總結(jié)如下:

    readyState 狀態(tài)

    狀態(tài)說明

    (0)未初始化

    此階段確認(rèn)XMLHttpRequest對象是否創(chuàng)建,并為調(diào)用open()方法進行未初始化作好準(zhǔn)備。值為0表示對象已經(jīng)存在,否則瀏覽器會報錯--對象不存在。

    (1)載入

    此階段對XMLHttpRequest對象進行初始化,即調(diào)用open()方法,根據(jù)參數(shù)(method,url,true)完成對象狀態(tài)的設(shè)置。并調(diào)用send()方法開始向服務(wù)端發(fā)送請求。值為1表示正在向服務(wù)端發(fā)送請求。

    (2)載入完成

    此階段接收服務(wù)器端的響應(yīng)數(shù)據(jù)。但獲得的還只是服務(wù)端響應(yīng)的原始數(shù)據(jù),并不能直接在客戶端使用。值為2表示已經(jīng)接收完全部響應(yīng)數(shù)據(jù)。并為下一階段對數(shù)據(jù)解析作好準(zhǔn)備。

    (3)交互

    此階段解析接收到的服務(wù)器端響應(yīng)數(shù)據(jù)。即根據(jù)服務(wù)器端響應(yīng)頭部返回的MIME類型把數(shù)據(jù)轉(zhuǎn)換成能通過responseBody、responseText或responseXML屬性存取的格式,為在客戶端調(diào)用作好準(zhǔn)備。狀態(tài)3表示正在解析數(shù)據(jù)。

    (4)完成

    此階段確認(rèn)全部數(shù)據(jù)都已經(jīng)解析為客戶端可用的格式,解析已經(jīng)完成。值為4表示數(shù)據(jù)解析完畢,可以通過XMLHttpRequest對象的相應(yīng)屬性取得數(shù)據(jù)。

    概而括之,整個XMLHttpRequest對象的生命周期應(yīng)該包含如下階段:
    創(chuàng)建-初始化請求-發(fā)送請求-接收數(shù)據(jù)-解析數(shù)據(jù)-完成

    在具體應(yīng)用中,明確了readyState的五個狀態(tài)(XMLHttpRequest對象的生命周期各個階段)的含義,就可以消除對Ajax核心的神秘感(語焉不詳?shù)谋澈笠词枪逝?,制造神秘感;要么就?#8220;以其昏昏,使人昭昭”),迅速把握其實質(zhì),對減少學(xué)習(xí)中的挫折感和增強自信心都極其有益。

    比如,通過如下示例:

    //聲明數(shù)組 var states = [“正在初始化……”, “正在初始化請求……成功! 正在發(fā)送請求……”, “成功! 正在接收數(shù)據(jù)……”, “完成! 正在解析數(shù)據(jù)……”, “完成! ”]; //回調(diào)函數(shù)內(nèi)部代碼片段 if (xmlHttp.readyState==4) { var span = document.createElement(“span”); span.innerHTML = states[xmlHttp.readyState]; document.body.appendChild(span); if (xmlHttp.status == 200) { var xmldoc = xmlHttp.responseXML; //其他代碼 } //別忘記銷毀,防止內(nèi)存泄漏 xmlHttp = null; }else{ var span = document.createElement(“span”); span.innerHTML = states[xmlHttp.readyState]; document.body.appendChild(span); }

    結(jié)果如下:

    正在初始化請求……成功!
    正在發(fā)送請求……成功!
    正在接收數(shù)據(jù)……完成!
    正在解析數(shù)據(jù)……完成!

    我們很容易明白XMLHttpRequest對象在各個階段都在做什么。因此,也就很容易對Ajax的核心部分有一個真正簡單明了的理解。

    本博PS:readyState一般用在異步請求時程序響應(yīng)的判斷,Iframe, javaScript腳本同樣適用,參考另一篇文章:http://d-tune.javaeye.com/blog/506074

    文章出處:http://www.cn-cuckoo.com/2007/07/16/the-details-for-five-states-of-readystate-9.html

    posted @ 2010-06-07 09:19 二胡 閱讀(627) | 評論 (2)編輯 收藏

    歷史 
        CVS 誕生于 1986 年,當(dāng)時作為一組 shell 腳本而出現(xiàn);1989年3月,Brian Berlinor用C語言重新設(shè)計并編寫了CVS的代碼;1993年前后,Jim Kingdon最終將CVS設(shè)計成基于網(wǎng)絡(luò)的平臺,開發(fā)者們能從Internet任何地方獲得程序源代碼。截至目前最新版本是2004年12月13日發(fā)布的1.12.11。 

    功能介紹 
    一、 代碼統(tǒng)一管理,保存所有代碼文件更改的歷史記錄。對代碼進行集中統(tǒng)一管理,可以方便查看新增或刪除的文件,能夠跟蹤所有代碼改動痕跡??梢噪S意恢復(fù)到以前任意一個歷史版本。并避免了因為版本不同引入的深層BUG。 
    二、 完善的沖突解決方案,可以方便的解決文件沖突問題,而不需要借助其它的文件比較工具和手工的粘貼復(fù)制。 
    三、 代碼權(quán)限的管理??梢詾椴煌挠脩粼O(shè)置不同的權(quán)限。可以設(shè)置訪問用戶的密碼、只讀、修改等權(quán)限,而且通過CVS ROOT目錄下的腳本,提供了相應(yīng)功能擴充的接口,不但可以完成精細的權(quán)限控制,還能完成更加個性化的功能。 
    四、 支持方便的版本發(fā)布和分支功能。

    基本概念 
    資源庫(Repository)
     
    CVS的資源庫存儲全部的版本控制下的文件copy,通常不容許直接訪問,只能通過cvs命令,獲得一份本地copy,改動后再check in(commit)回資源庫。而資源庫通常為與工作目錄分離的。CVS通過多種方式訪問資源庫。每種方法有不同目錄表示形式。 
    版本(Revision) 
    每一個文件的各個版本都不相同,形如1.1, 1.2.1,一般1.1是該文件的第一個revision,后面的一個將自動增加最右面的一個整數(shù),比如1.2, 1.3, 1.4...有時候會出現(xiàn)1.3.2.2,原因見后。revision總是偶數(shù)個數(shù)字。一般情況下將revision看作時CVS自己內(nèi)部的一個編號,而tag則可以標(biāo)志用戶的特定信息。 
    標(biāo)簽(Tag) 
    用符號化的表示方法標(biāo)志文件特定revision的信息。通常不需要對某一個孤立的文件作tag,而是對所有文件同時作一個tag,以后用戶可以僅向特定tag的文件提交或者checkout。另外一個作用是在發(fā)布軟件的時候表示哪些文件及其哪個版本是可用的;各文件不同revision可以包括在一個tag中。如果命名一個已存在的tag默認(rèn)將不會覆蓋原來的; 
    分支(Branch) 
    當(dāng)用戶修改一個branch時不會對另外的branch產(chǎn)生任何影響??梢栽谶m當(dāng)?shù)臅r候通過合并的方法將兩個版本合起來;branch總是在當(dāng)前revision后面加上一個偶數(shù)整數(shù)(從2開始,到0結(jié)束),所以branch總是奇數(shù)個數(shù)字,比如1.2后面branch為1.2.2,該分支下revision可能為1.2.2.1,1.2.2.2,... 
    沖突(Conflct) 
    完全是純文本的沖突,不包含邏輯上的矛盾。一般是一份文件,A做了改動,B在A提交之前也做了改動,這樣最后誰commit就會出現(xiàn)沖突,需要手工解決沖突再提交。 

    CVS與eclipse集成開發(fā) 
      前面對CVS的歷史、功能、概論等理論知識做了介紹。下面我們將使用最流行的Java IDE Eclipse中內(nèi)置的CVS工具,以一個完整開發(fā)流程,介紹實際環(huán)境中CVS的正確使用。關(guān)于CVS系統(tǒng)的安裝,不是本文的內(nèi)容,您可以從附錄的鏈接中獲取安裝的介紹資料。 

    常用的CVS控制命令 
    Check Out(檢出) 
    把源文件從cvs源代碼倉庫中取出,缺省的版本是最新的版本,你也可以選擇指定的版本。在每次更改源代碼之前,需要Check Out最新的版本,再起基礎(chǔ)之上對源代碼進行修改。將代碼目錄checkout到指定目錄下,所有文件都是read-write。 
    Check In(檢入) 
    把源代碼加入到cvs源代碼倉庫中,每一個添加進代碼庫中的文件的版本是 1.1。以后每次修改文件重新ci以后,此文件的版本遞增為1.2 ,1.3.……。在每次對源代碼修改之后,需要Check In,提交最新版本的源代碼。 
    Synchronize with Repository(與資源庫同步,簡稱同步) 
    使本地更改與資源庫同步,它會列出本地和資源庫之間不同的所有文件。 
    Add to Version Control 
    將新的文件加入到版本控制之中。 
    Add to .cvsIgnore 
    將文件設(shè)置到版本控制之外,這樣該文件或目錄中的文件的更改在CVS中不可見,即使同步也無法發(fā)現(xiàn)。

    CVS正確使用步驟 
    一、 同步(Synchronize)
     
    就是將本地更改與服務(wù)器同步,同步之后可以清晰的看到上一撿出(Check Out)版本之后本地、服務(wù)器上的最新改動。這是非常有用的,特別是敏捷開發(fā),強調(diào)集體擁有代碼。有了同步功能,你可以全局把握項目的代碼,可以很方便的跟蹤公共模塊代碼的任何改動。 
    具體操作:在Eclipse的資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中,選中要同步的目錄,點擊右鍵選擇"Synchronize with Repository",之后它將顯示同步的視圖。如下圖: 

    (圖一、CVS同步視圖) 
    同步之后,它有四種Mode可以選擇,見上圖綠色框框里按鈕。從做到右分別為: 
    Incoming Mode:表示修改是來自服務(wù)器,對應(yīng)于更新(update)操作。 
    Outgoing Mode:表示修改是來自本地,對應(yīng)提交(commit)操作。 
    Incoming/ Outgoing Mode:本地和服務(wù)器修改都在該模式(Mode)中顯示。 
    Conflicts Mode:顯示本地和服務(wù)器修改的沖突文件。 
    二、 更新(update) 
    比較簡單,選擇Incoming Mode,再選中要更新的文件,右鍵選擇update操作。 
    三、 解決沖突并合并(solve conflct and merge) 
    如果有沖突文件,沖突文件不能更新。你必須先解決沖突再操作。選中沖突的文件,再點右鍵選擇"Open in Compare Editor",用比較工具打開該文件。如下圖: 

    (圖二、CVS比較器視圖)

    比較器(Compare)視圖,左邊版本底的是本地文件(Local File),右邊是遠程服務(wù)器文件(Remote File)。使用"Select Next Change"按鈕(綠框中的第一箭頭向下按鈕),逐一查看不同點。如果不同點標(biāo)識為黑色框框,則不用管它。如果是藍色框框,則需要手工調(diào)整。如上圖,不同點是藍色框框,將鼠標(biāo)放到兩個不同點的中間小方框中,則凸出一個向右的按鈕,并顯示提示信息"Copy Current Change from Right to Left",意思是將右邊服務(wù)器的不同點覆蓋到左邊的本地文件。點中此按鈕。重復(fù)這樣的操作,將所有服務(wù)器上的更改拷貝到本地。 
    如果有一行代碼,本地和服務(wù)器都同時做了修改。這時,修改點則顯示紅色框框。這時,你就必須手工做正確的修改。全部修改完成,保存本地文件。 
    此時,如果修改點沒有了藍色的框框,就可以開始做合并(merge)操作了。操作也很簡單,選擇該文件,點擊右鍵,選擇"Mark as merged"。 
    注意:必須確保沒有藍色框框,即完全拷貝了服務(wù)器的修改才可以做合并(merge)操作,否則會覆蓋服務(wù)器上的代碼。 
    四、 提交(commit) 
    更新服務(wù)器代碼,解決沖突之后,首先要查看本地文件修改之后是否有錯誤。如果有,當(dāng)然首先解決錯誤,再提交。 

    posted @ 2010-03-30 09:48 二胡 閱讀(516) | 評論 (0)編輯 收藏

    轉(zhuǎn)  http://blog.cnw.com.cn/index.php/20937/viewspace-3418

    HTTP頭字段包括4類:
           general-header ;
         request-header ;
           response-header ;
         entity-header .
     
    *******************************************************************************
     General Header Fields
    =============================
       general header是request、response都可用的, 但是不能用于entity.
     
     
           -- Cache-Control
           -- Connection
           -- Date
           -- Pragma
           -- Trailer
           -- Transfer-Encoding
           -- Upgrade
           -- Via
           -- Warning
     
    *******************************************************************************
     Request Header Fields
    ======================
     
       request-header fields 允許客戶端傳遞關(guān)于request和客戶端的附加信息到服務(wù)端,
     
           -- Accept
           -- Accept-Charset
           -- Accept-Encoding
           -- Accept-Language
           -- Authorization
           -- Expect
           -- From
           -- Host
           -- If-Match
           -- If-Modified-Since
           -- If-None-Match
           -- If-Range
           -- If-Unmodified-Since
           -- Max-Forwards
           -- Proxy-Authorization
           -- Range
           -- Referer
           -- TE
           -- User-Agent
     
    *******************************************************************************
      Response Header Fields
    ===============================
     
       response-header fields 允許服務(wù)端傳遞關(guān)于response的、不能放到Status-Line的附加信息。
       這些頭給出關(guān)于服務(wù)端的信息。 
     
          -- Accept-Ranges
          -- Age
          -- ETag
          -- Location
          -- Proxy-Authenticate
          -- Retry-After
          -- Server
          -- Vary
          -- WWW-Authenticate
     
    *******************************************************************************
     Entity Header Fields
    ========================
     
       Entity-header fields 定義關(guān)于entity-body的metainformation(標(biāo)題字段數(shù)據(jù)),
       如果當(dāng)前沒有body, 則定義被request確定的資源信息.
       一些metainformation是可選的; 一些是必須的。
     
           -- Allow
           -- Content-Encoding
           -- Content-Language
           -- Content-Length
           -- Content-Location
           -- Content-MD5
           -- Content-Range
           -- Content-Type
           -- Expires
           -- Last-Modified
           -- extension-header


    【轉(zhuǎn)自】http://www.x5dj.com/userforum/00100239/00305167.shtml


    一、基礎(chǔ)篇
    HTTP(HyperTextTransferProtocol)是超文本傳輸協(xié)議的縮寫,它用于傳送WWW方式的數(shù)據(jù),關(guān)于HTTP協(xié)議的詳細內(nèi)容請參考RFC2616。HTTP協(xié)議采用了請求/響應(yīng)模型。客戶端向服務(wù)器發(fā)送一個請求,請求頭包含請求的方法、URI、協(xié)議版本、以及包含請求修飾符、客戶信息和內(nèi)容的類似于MIME的消息結(jié)構(gòu)。服務(wù)器以一個狀態(tài)行作為響應(yīng),相應(yīng)的內(nèi)容包括消息協(xié)議的版本,成功或者錯誤編碼加上包含服務(wù)器信息、實體元信息以及可能的實體內(nèi)容。
    通常HTTP消息包括客戶機向服務(wù)器的請求消息和服務(wù)器向客戶機的響應(yīng)消息。這兩種類型的消息由一個起始行,一個或者多個頭域,一個只是頭域結(jié)束的空行和可選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應(yīng)頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關(guān)的,域值前可以添加任何數(shù)量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符。
    1、通用頭域
    通用頭域包含請求和響應(yīng)消息都支持的頭域,通用頭域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴展要求通訊雙方都支持此擴展,如果存在不支持的通用頭域,一般將會作為實體頭域處理。下面簡單介紹幾個在UPnP消息中使用的通用頭域。
    Cache-Control頭域
    Cache-Control指定請求和響應(yīng)遵循的緩存機制。在請求消息或響應(yīng)消息中設(shè)置Cache-Control并不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令包括no-cache、no- store、max-age、max-stale、min-fresh、only-if-cached,響應(yīng)消息中的指令包括public、 private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、 max-age。各個消息中的指令含義如下:
    Public指示響應(yīng)可被任何緩存區(qū)緩存。
    Private指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)用戶的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。
    no-cache指示請求或響應(yīng)消息不能緩存
    no-store用于防止重要的信息被無意的發(fā)布。在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存。
    max-age指示客戶機可以接收生存期不大于指定時間(以秒為單位)的響應(yīng)。
    min-fresh指示客戶機可以接收響應(yīng)時間小于當(dāng)前時間加上指定時間的響應(yīng)。
    max-stale指示客戶機可以接收超出超時期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內(nèi)的響應(yīng)消息。
    Date頭域
    Date頭域表示消息發(fā)送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標(biāo)準(zhǔn)時,換算成本地時間,需要知道用戶所在的時區(qū)。
    Pragma頭域
    Pragma頭域用來包含實現(xiàn)特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協(xié)議中,它的含義和Cache-Control:no-cache相同。
    2、請求消息
    請求消息的第一行為下面的格式:
    Method SP Request-URI SP HTTP-Version CRLF 
    Method表示對于Request-URI完成的方法,這個字段是大小寫敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD應(yīng)該被所有的通用WEB服務(wù)器支持,其他所有方法的實現(xiàn)是可選的。GET方法取回由Request-URI標(biāo)識的信息。HEAD方法也是取回由Request-URI標(biāo)識的信息,只是可以在響應(yīng)時,不返回消息體。POST方法可以請求服務(wù)器接收包含在請求中的實體信息,可以用于提交表單,向新聞組、BBS、郵件群組和數(shù)據(jù)庫發(fā)送消息。
    SP表示空格。
    Request-URI遵循URI格式,在此字段為星號(*)時,說明請求并不用于某個特定的資源地址,而是用于服務(wù)器本身。
    HTTP-Version表示支持的HTTP版本,例如為HTTP/1.1。
    CRLF表示換行回車符。
    請求頭域允許客戶端向服務(wù)器傳遞關(guān)于請求或者關(guān)于客戶機的附加信息。請求頭域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。對請求頭域的擴展要求通訊雙方都支持,如果存在不支持的請求頭域,一般將會作為實體頭域處理。
    典型的請求消息:
    GEThttp://class/download.microtool.de:80/somedata.exe
    Host:download.microtool.de
    Accept:*/*
    Pragma:no-cache
    Cache-Control:no-cache
    Referer:http://class/download.microtool.de/
    User-Agent:Mozilla/4.04[en](Win95;I;Nav)
    Range:bytes=554554-
    上例第一行表示HTTP客戶端(可能是瀏覽器、下載程序)通過GET方法獲得指定URL下的文件。棕色的部分表示請求頭域的信息,綠色的部分表示通用頭部分。
    Host頭域
    Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務(wù)器或網(wǎng)關(guān)的位置。HTTP/1.1請求必須包含主機頭域,否則系統(tǒng)會以400狀態(tài)碼返回。
    Referer頭域
    Referer頭域允許客戶端指定請求uri的源資源地址,這可以允許服務(wù)器生成回退鏈表,可用來登陸、優(yōu)化cache等。他也允許廢除的或錯誤的連接由于維護的目的被追蹤。如果請求的uri沒有自己的uri地址,Referer不能被發(fā)送。如果指定的是部分uri地址,則此地址應(yīng)該是一個相對地址。
    Range頭域
    Range頭域可以請求實體的一個或者多個子范圍。例如,
    表示頭500個字節(jié):bytes=0-499
    表示第二個500字節(jié):bytes=500-999
    表示最后500個字節(jié):bytes=-500
    表示500字節(jié)以后的范圍:bytes=500-
    第一個和最后一個字節(jié):bytes=0-0,-1
    同時指定幾個范圍:bytes=500-600,601-999
    但是服務(wù)器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應(yīng)會以狀態(tài)碼206(PartialContent)返回而不是以200(OK)。
    User-Agent頭域
    User-Agent頭域的內(nèi)容包含發(fā)出請求的用戶信息。

    3、響應(yīng)消息
    響應(yīng)消息的第一行為下面的格式:
    HTTP-Version SP Status-Code SP Reason-Phrase CRLF
    HTTP-Version表示支持的HTTP版本,例如為HTTP/1.1。
    Status-Code是一個三個數(shù)字的結(jié)果代碼。
    Reason-Phrase給Status-Code提供一個簡單的文本描述。Status-Code主要用于機器自動識別,Reason-Phrase主要用于幫助用戶理解。Status-Code的第一個數(shù)字定義響應(yīng)的類別,后兩個數(shù)字沒有分類的作用。第一個數(shù)字可能取5個不同的值:
    1xx:信息響應(yīng)類,表示接收到請求并且繼續(xù)處理
    2xx:處理成功響應(yīng)類,表示動作被成功接收、理解和接受
    3xx:重定向響應(yīng)類,為了完成指定的動作,必須接受進一步處理
    4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執(zhí)行
    5xx:服務(wù)端錯誤,服務(wù)器不能正確執(zhí)行一個正確的請求
    響應(yīng)頭域允許服務(wù)器傳遞不能放在狀態(tài)行的附加信息,這些域主要描述服務(wù)器的信息和Request-URI進一步的信息。響應(yīng)頭域包含Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。對響應(yīng)頭域的擴展要求通訊雙方都支持,如果存在不支持的響應(yīng)頭域,一般將會作為實體頭域處理。
    典型的響應(yīng)消息:
    HTTP/1.0200OK
    Date:Mon,31Dec200104:25:57GMT
    Server:Apache/1.3.14(Unix)
    Content-type:text/html
    Last-modified:Tue,17Apr200106:46:28GMT
    Etag:"a030f020ac7c01:1e9f"
    Content-length:39725426
    Content-range:bytes554554-40279979/40279980
    上例第一行表示HTTP服務(wù)端響應(yīng)一個GET方法。棕色的部分表示響應(yīng)頭域的信息,綠色的部分表示通用頭部分,紅色的部分表示實體頭域的信息。
    Location響應(yīng)頭
    Location響應(yīng)頭用于重定向接收者到一個新URI地址。
    Server響應(yīng)頭
    Server響應(yīng)頭包含處理請求的原始服務(wù)器的軟件信息。此域能包含多個產(chǎn)品標(biāo)識和注釋,產(chǎn)品標(biāo)識一般按照重要性排序。
    4、實體信息
    請求消息和響應(yīng)消息都可以包含實體信息,實體信息一般由實體頭域和實體組成。實體頭域包含關(guān)于實體的原信息,實體頭包括Allow、Content-Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實體頭,但是這些域可能無法未接受方識別。實體可以是一個經(jīng)過編碼的字節(jié)流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。
    Content-Type實體頭
    Content-Type實體頭用于向接收方指示實體的介質(zhì)類型,指定HEAD方法送到接收方的實體介質(zhì)類型,或GET方法發(fā)送的請求介質(zhì)類型Content-Range實體頭
    Content-Range實體頭
    用于指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務(wù)器向客戶返回一個部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個實體長度。一般格式:
    Content-Range:bytes-unit SP first-byte-pos - last-byte-pos/entity-legth
    例如,傳送頭500個字節(jié)次字段的形式:Content-Range:bytes0-499/1234如果一個http消息包含此節(jié)(例如,對范圍請求的響應(yīng)或?qū)σ幌盗蟹秶闹丿B請求),Content-Range表示傳送的范圍,Content-Length表示實際傳送的字節(jié)數(shù)。
    Last-modified實體頭
    Last-modified實體頭指定服務(wù)器上保存內(nèi)容的最后修訂時間。
    5、 HTTP 頭參考(microsoft)
    HTTP 請求和 HTTP 響應(yīng)都使用頭發(fā)送有關(guān) HTTP 消息的信息。頭由一系列行組成,每行都包含名稱,然后依次是冒號、空格、值。字段可按任何順序排列。某些頭字段既能用于請求頭也能用于響應(yīng)頭,而另一些頭字段只能用于其中之一。
    許多請求頭字段都允許客戶端在值部分指定多個可接受的選項,有時甚至可以對這些選項的首選項進行排名。多個項以逗號分隔。例如,客戶端可以發(fā)送包含 “Content-Encoding: gzip, compress,”的請求頭,表示可以接受各種壓縮類型。如果服務(wù)器的響應(yīng)正文使用 gzip 編碼,其響應(yīng)頭中將包含“Content-Encoding: gzip”。
    有些字段可以在單個頭中出現(xiàn)多次。例如,頭可以有多個“Warning”字段。
    下表列出了 HTTP 1.1 頭字段。注意:有些頭字段是 MIME 字段。MIME 字段在 Internet Engineering Task Force (IETF) 文檔 RFC 2045 中進行了定義,但也可用于 HTTP 1.1 協(xié)議。有關(guān) MIME 和 HTTP 1.1 規(guī)范的詳細信息,請參閱 IEIF 頁。
    一般頭字段
    一般頭字段可用于請求消息和響應(yīng)消息。
     名稱          示例值
    Cache-Control  "max-age=10"
    Connection    "close"
    Date          "Tue, 11 Jul 2000 18:23:51 GMT"
    Pragma        "no-cache"
    Trailer         "Date"
    Transfer-Encoding"chunked"
    Upgrade       "SHTTP/1.3"
    Via            "HTTP/1.1 Proxy1, HTTP/1.1 Proxy2"
    Warning       "112 Disconnected Operation"
    請求頭字段
    請求頭字段僅用于請求消息。
       名稱             示例值
    Accept           "text/html, image/*"
    Accept-Charset   "iso8859-5"
    Accept-Encoding "gzip, compress"
    Accept-Language "en, fr"
    Authorization     [credentials]
    Content-Encoding "gzip"
    Expect           "100-continue"
    From            "user@microsoft.com"
    Host            "www.microsoft.com"
    If-Match         "entity_tag001"
    If-Modified-Since"Tue, 11 Jul 2000 18:23:51 GMT"
    If-None-Match    "entity_tag001"
    If-Range         "entity_tag001" or "Tue, 11 Jul 2000 18:23:51 GMT"
    If-Unmodified-Since"Tue, 11 Jul 2000 18:23:51 GMT"
    Max-Forwards    "3"
    Proxy-Authorization[credentials]
    Range       "bytes=100-599"
    Referer      "http://www.microsoft.com/resources.asp"
    TE          "trailers"
    User-Agent   "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"
     
    >>請求頭字段的具體含義
    Accept:瀏覽器可接受的MIME類型。
    Accept-Charset:瀏覽器可接受的字符集。
    Accept-Encoding:瀏覽器能夠進行解碼的數(shù)據(jù)編碼方式,比如gzip。
    Accept-Language:瀏覽器所希望的語言種類,當(dāng)服務(wù)器能夠提供一種以上的語言版本時要用到。
    Authorization:授權(quán)信息,通常出現(xiàn)在對服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中。
    Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進行持久連接),它就可以利用持久連接的優(yōu)點,當(dāng)頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現(xiàn)這一點, Servlet需要在應(yīng)答中發(fā)送一個Content-Length頭,最簡單的實現(xiàn)方法是:先把內(nèi)容寫入ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計算它的大小。
    Content-Length:表示請求消息正文的長度。
    Cookie:設(shè)置cookie,這是最重要的請求頭信息之一
    From:請求發(fā)送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。
    Host:初始URL中的主機和端口。
    If-Modified-Since:只有當(dāng)所請求的內(nèi)容在指定的日期之后又經(jīng)過修改才返回它,否則返回304“Not Modified”應(yīng)答。
    Pragma:指定“no-cache”值表示服務(wù)器必須返回一個刷新后的文檔,即使它是代理服務(wù)器而且已經(jīng)有了頁面的本地拷貝。
    Referer:包含一個URL,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請求的頁面。
    User-Agent:瀏覽器類型,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用。
    UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請求頭,表示屏幕大小、顏色深度、操作系統(tǒng)和CPU類型。
    響應(yīng)頭字段
    響應(yīng)頭字段僅用于響應(yīng)消息。
      名稱          示例值
    Accept-Ranges  "none"
    Age            "2147483648(2^31)"
    ETag           "b38b9-17dd-367c5dcd"
    Last-Modified    "Tue, 11 Jul 2000 18:23:51 GMT"
    Location        "http://localhost/redirecttarget.asp"
    Proxy-Authenticate[challenge]
    Retry-After      "Tue, 11 Jul 2000 18:23:51 GMT" or "60"
    Server         "Microsoft-IIS/5.0"
    Vary            "Date"
    WWW-Authenticate[challenge]
    實體頭字段
    實體頭字段可以用于請求消息或響應(yīng)消息。實體頭字段中包含消息實體正文的有關(guān)信息,如使用的編碼格式。
       名稱            示例值
    Allow              "GET, HEAD"
    Content-Encoding   "gzip"
    Content-Language  "en"
    Content-Length     "8445"
    Content-Location   "http://localhost/page.asp"
    Content-MD5       [md5-digest]
    Content-Range     "bytes 2543-4532/7898"
    Content-Type      "text/html"
    Expires           "Tue, 11 Jul 2000 18:23:51 GMT"
    Last-Modified      "Tue, 11 Jul 2000 18:23:51 GMT"
    >>實體頭字段的具體含義
    Allow服務(wù)器支持哪些請求方法(如GET、POST等)。
    Content-Encoding文檔的編碼(Encode)方法。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。Java的GZIPOutputStream可以很方便地進行g(shù)zip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。
    Content-Length表示內(nèi)容長度。只有當(dāng)瀏覽器使用持久HTTP連接時才需要這個數(shù)據(jù)。
    Content-Type表示后面的文檔屬于什么MIME類型。Servlet默認(rèn)為text/plain,但通常需要顯式地指定為text/html。
    Date當(dāng)前的GMT時間。你可以用setDateHeader來設(shè)置這個頭以避免轉(zhuǎn)換時間格式的麻煩。
    Expires應(yīng)該在什么時候認(rèn)為文檔已經(jīng)過期,從而不再緩存它?
    Last-Modified文檔的最后改動時間??蛻艨梢酝ㄟ^If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲于指定時間的文檔才會返回,否則返回一個304(Not Modified)狀態(tài)。
    Location表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設(shè)置狀態(tài)代碼為302。
    Refresh表示瀏覽器應(yīng)該在多少時間之后刷新文檔,以秒計。除了刷新當(dāng)前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。
    注意這種功能通常是通過設(shè)置HTML頁面HEAD區(qū)的<META. HTTP-EQUIV="Refresh" C>實現(xiàn),這是因為,自動刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的HTML編寫者十分重要。但是,對于Servlet來說,直接設(shè)置 Refresh頭更加方便。
    注意Refresh的意義是“N秒之后刷新本頁面或訪問指定頁面”,而不是“每隔N秒刷新本頁面或訪問指定頁面 ”。因此,連續(xù)刷新要求每次都發(fā)送一個Refresh頭,而發(fā)送204狀態(tài)代碼則可以阻止瀏覽器繼續(xù)刷新,不管是使用Refresh頭還是<META. HTTP-EQUIV="Refresh" ...>。
    注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分,而是一個擴展,但Netscape和IE都支持它。
    請求頭示例
    以下是 HTTP 請求的簡單示例。
    GET /articles/news/today.asp HTTP/1.1
    Accept: */*
    Accept-Language: en-us
    Connection: Keep-Alive
    Host: localhost
    Referer:http://localhost/links.asp
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
    Accept-Encoding: gzip, deflate
    該請求具有請求行,其中包括方法 (GET)、資源路徑 (/articles/news/today.asp) 和 HTTP 版本 (HTTP/1.1)。由于該請求沒有正文,故所有請求行后面的內(nèi)容都是頭的一部分。緊接著頭之后是一個空行,表示頭已結(jié)束。
    響應(yīng)頭示例
    Web 服務(wù)器可以通過多種方式響應(yīng)前一個請求。假設(shè)文件是可以訪問的,并且用戶具有查看該文件的權(quán)限,則響應(yīng)類似于:
    HTTP/1.1 200 OK
    Server: Microsoft-IIS/5.0
    Date: Thu, 13 Jul 2000 05:46:53 GMT
    Content-Length: 2291
    Content-Type: text/html
    Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/
    Cache-control: private
    ...
    響應(yīng)的第一行稱為狀態(tài)行。它包含響應(yīng)所用的 HTTP 版本、狀態(tài)編碼 (200) 和原因短語。示例中包含一個頭,其中具有五個字段,接著是一個空行(回車和換行符),然后是響應(yīng)正文的頭兩行。
    有關(guān)HTTP頭完整、詳細的說明,請參見http://www.w3.org/Protocols/的HTTP規(guī)范。
     
    附錄:HTTP協(xié)議狀態(tài)碼的含義
      狀態(tài)代碼 狀態(tài)信息 含義
    100 Continue初始的請求已經(jīng)接受,客戶應(yīng)當(dāng)繼續(xù)發(fā)送請求的其余部分。(HTTP 1.1新)
    101 Switching Protocols服務(wù)器將遵從客戶的請求轉(zhuǎn)換到另外一種協(xié)議(HTTP 1.1新
    200 OK一切正常,對GET和POST請求的應(yīng)答文檔跟在后面。
    201 Created服務(wù)器已經(jīng)創(chuàng)建了文檔,Location頭給出了它的URL。
    202 Accepted已經(jīng)接受請求,但處理尚未完成。
    203 Non-Authoritative Information文檔已經(jīng)正常地返回,但一些應(yīng)答頭可能不正確,因為使用的是文檔的拷貝(HTTP 1.1新)。
    204 No Content沒有新文檔,瀏覽器應(yīng)該繼續(xù)顯示原來的文檔。
    205 Reset Content沒有新的內(nèi)容,但瀏覽器應(yīng)該重置它所顯示的內(nèi)容。用來強制瀏覽器清除表單輸入內(nèi)容(HTTP 1.1新)。
    206 Partial Content客戶發(fā)送了一個帶有Range頭的GET請求,服務(wù)器完成了它(HTTP 1.1新)。
    300 Multiple Choices客戶請求的文檔可以在多個位置找到,這些位置已經(jīng)在返回的文檔內(nèi)列出。如果服務(wù)器要提出優(yōu)先選擇,則應(yīng)該在Location應(yīng)答頭指明。
    301 Moved Permanently客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應(yīng)該自動地訪問新的URL。
    302 Found類似于301,但新的URL應(yīng)該被視為臨時性的替代,而不是永久性的。注意,在HTTP1.0中對應(yīng)的狀態(tài)信息是“Moved Temporatily”,出現(xiàn)該狀態(tài)代碼時,瀏覽器能夠自動訪問新的URL,因此它是一個很有用的狀態(tài)代碼。注意這個狀態(tài)代碼有時候可以和301替換使用。例如,如果瀏覽器錯誤地請求http://host/~user(缺少了后面的斜杠),有的服務(wù)器返回301,有的則返回302。嚴(yán)格地說,我們只能假定只有當(dāng)原來的請求是GET時瀏覽器才會自動重定向。請參見307。
    303 See Other類似于301/302,不同之處在于,如果原來的請求是POST,Location頭指定的重定向目標(biāo)文檔應(yīng)該通過GET提取(HTTP 1.1新)。
    304 Not Modified客戶端有緩沖的文檔并發(fā)出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務(wù)器告訴客戶,原來緩沖的文檔還可以繼續(xù)使用。
    305 Use Proxy客戶請求的文檔應(yīng)該通過Location頭所指明的代理服務(wù)器提?。℉TTP 1.1新)。
    307 Temporary Redirect和302(Found)相同。許多瀏覽器會錯誤地響應(yīng)302應(yīng)答進行重定向,即使原來的請求是POST,即使它實際上只能在POST請求的應(yīng)答是303時才能重定向。由于這個原因,HTTP 1.1新增了307,以便更加清除地區(qū)分幾個狀態(tài)代碼:當(dāng)出現(xiàn)303應(yīng)答時,瀏覽器可以跟隨重定向的GET和POST請求;如果是307應(yīng)答,則瀏覽器只能跟隨對GET請求的重定向。(HTTP 1.1新)
    400 Bad Request請求出現(xiàn)語法錯誤。
    401 Unauthorized客戶試圖未經(jīng)授權(quán)訪問受密碼保護的頁面。應(yīng)答中會包含一個WWW-Authenticate頭,瀏覽器據(jù)此顯示用戶名字/密碼對話框,然后在填寫合適的Authorization頭后再次發(fā)出請求。
    403 Forbidden資源不可用。服務(wù)器理解客戶的請求,但拒絕處理它。通常由于服務(wù)器上文件或目錄的權(quán)限設(shè)置導(dǎo)致。
    404 Not Found無法找到指定位置的資源。這也是一個常用的應(yīng)答,
    405 Method Not Allowed請求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)對指定的資源不適用。(HTTP 1.1新)
    406 Not Acceptable指定的資源已經(jīng)找到,但它的MIME類型和客戶在Accpet頭中所指定的不兼容(HTTP 1.1新)。
    407 Proxy Authentication Required類似于401,表示客戶必須先經(jīng)過代理服務(wù)器的授權(quán)。(HTTP 1.1新)
    408 Request Timeout在服務(wù)器許可的等待時間內(nèi),客戶一直沒有發(fā)出任何請求。客戶可以在以后重復(fù)同一請求。(HTTP 1.1新)
    409 Conflict通常和PUT請求有關(guān)。由于請求和資源的當(dāng)前狀態(tài)相沖突,因此請求不能成功。(HTTP 1.1新)
    410 Gone所請求的文檔已經(jīng)不再可用,而且服務(wù)器不知道應(yīng)該重定向到哪一個地址。它和404的不同在于,返回407表示文檔永久地離開了指定的位置,而404表示由于未知的原因文檔不可用。(HTTP 1.1新)
    411 Length Required服務(wù)器不能處理請求,除非客戶發(fā)送一個Content-Length頭。(HTTP 1.1新)
    412 Precondition Failed請求頭中指定的一些前提條件失敗(HTTP 1.1新)。
    413 Request Entity Too Large目標(biāo)文檔的大小超過服務(wù)器當(dāng)前愿意處理的大小。如果服務(wù)器認(rèn)為自己能夠稍后再處理該請求,則應(yīng)該提供一個Retry-After頭(HTTP 1.1新)。
    414 Request URI Too LongURI太長(HTTP 1.1新)。
    416 Requested Range Not Satisfiable服務(wù)器不能滿足客戶在請求中指定的Range頭。(HTTP 1.1新)
    500 Internal Server Error服務(wù)器遇到了意料不到的情況,不能完成客戶的請求。
    501 Not Implemented服務(wù)器不支持實現(xiàn)請求所需要的功能。例如,客戶發(fā)出了一個服務(wù)器不支持的PUT請求。
    502 Bad Gateway服務(wù)器作為網(wǎng)關(guān)或者代理時,為了完成請求訪問下一個服務(wù)器,但該服務(wù)器返回了非法的應(yīng)答。
    503 Service Unavailable服務(wù)器由于維護或者負載過重未能應(yīng)答。
    504 Gateway Timeout由作為代理或網(wǎng)關(guān)的服務(wù)器使用,表示不能及時地從遠程服務(wù)器獲得應(yīng)答。(HTTP 1.1新)
    505 HTTP Version Not Supported服務(wù)器不支持請求中所指明的HTTP版本

    posted @ 2010-01-08 09:15 二胡 閱讀(268) | 評論 (0)編輯 收藏

    JQuery作者John Resig的講座
    http://v.youku.com/v_show/id_XMjQzMDY4NDQ=.html

    posted @ 2009-12-23 15:04 二胡 閱讀(156) | 評論 (0)編輯 收藏

    轉(zhuǎn) http://blog.youmila.com/?p=513

    關(guān)于跨域名問題還是問題么,這方面的解決實踐非常多,今天我就舊話重提把我所知道的通過幾個應(yīng)用場景來分別總結(jié)一下

    先說明一點:我說的某某域名在您的控制下的意思是這個域名下的網(wǎng)頁由您來負責(zé)開發(fā)內(nèi)部的JavaScript
    場景一:將bbs.xxx.com的頁面用iframe嵌入到www.xxx.com的中,如何在iframe內(nèi)外使用js通信
    一級域名都是xxx.com 這個域名一定是在您的控制下,所以你只要在兩個頁面中同時升級域名即可
    在父窗口和iframe內(nèi)部分別加上js語句:document.domain=”xxx.com”;
    之后2個頁面就等于在同一域名下,通過window.parent oIframe.contentDocument就可以相互訪問,進行無障礙的JS通信
    在新浪、淘寶等很多頁面都能找到這樣的語句。不過document.domain不可以隨便指定,只能向上升級,從bbs.xxx.com升級到y(tǒng)yy.com肯定會出錯

    場景二:將www.yyy.com的頁面用iframe嵌入到www.xxx.com的中,兩個域名都在您的控制下,如何在iframe內(nèi)外進行一定的數(shù)據(jù)交流
    你可以通過相互改變hash值的方式來進行一些數(shù)據(jù)的通信

    這里的實現(xiàn)基于如下技術(shù)要點:
    1、父窗口通過改變子窗口的src中的hash值把一部分信息傳入,如果src只有hash部分改變,那么子窗口是不會重新載入的。
    2、子窗口可以重寫父窗口的location.href,但是注意這里子窗口無法讀取而只能重寫location.href所以要求前提是您控制兩個域名,知道當(dāng)前父窗口的location.href是什么并寫在子窗口內(nèi),這樣通過parent.location.href = “已知的父窗口的href”+”#”+hash。這樣父窗口只有hash改變也不會重載。
    3、上面兩步分別做到了兩個窗口之間的無刷新數(shù)據(jù)通知,那么下面的來說如何感知數(shù)據(jù)變化。標(biāo)準(zhǔn)中沒有相關(guān)規(guī)定,所以當(dāng)前的任意瀏覽器遇到location.hash變化都不會觸發(fā)任何javaScript事件,也就是說您要自己寫監(jiān)聽函數(shù)來監(jiān)視loaction.hash的值的變化。做法是通過setTimeout或者setInterval來寫一個監(jiān)聽函數(shù)每20-100ms查看一下hash是否變化,如果變化了驅(qū)動js根據(jù)新的數(shù)據(jù)做想做的事情。

    這種實現(xiàn)的一些分析:
    1、信息通道是雙向的,當(dāng)然會兼容單向,如果只是父窗口向子窗口通知數(shù)據(jù),只需要子窗口寫hash監(jiān)聽,反之亦然。
    2、局限性也是頗大,因為這種通信的前提是雙方知道對方的location.href。如果父窗口帶有動態(tài)的location.search也就是查詢參數(shù),那么子窗口的處理上就比較困難,需要把父窗口的location.search作為傳遞信息的一部分告知子窗口。
    3、另外的困擾會有瀏覽器帶給你,IE之外的瀏覽器遇到hash的改變會記錄歷史,這樣你在處理前進后退的時候會非常頭疼

    場景三:將www.yyy.com的頁面用iframe嵌入到www.xxx.com的中,只有被嵌入的yyy.com在您的控制下,如何在iframe內(nèi)外進行一定的交流
    真實場景:google adsence的一個需求,你希望google發(fā)現(xiàn)您的頁面不能匹配出相關(guān)性非常好的按點擊付費廣告時,你希望google的廣告iframe能夠隱藏。
    google的廣告iframe在google域下顯然不能把自己隱藏掉,那么怎么辦呢?
    1、google會提供給你一個html頁面
    2、您將這個頁面放置在您的域名下,并告訴google它的位置
    3、當(dāng)google發(fā)現(xiàn)沒有很好的廣告時,會將子窗口的loaction重定向到您的那個頁面下,這樣您的頁面因為同域名就可以訪問父頁面來隱藏自己了
    是不是很巧的方法?

    場景四:您是內(nèi)容發(fā)布商,如何改造接口,讓其他域名下的頁面可以從瀏覽器端出發(fā)獲得您的數(shù)據(jù)
    我們知道ajax的xmlHttpRequest()說到底是一個無刷新請求服務(wù)器數(shù)據(jù)的輔助工具,但是xmlHttpRequest并不能跨域名請求數(shù)據(jù),在某些情況下成了極大的限制。
    但是我們?nèi)绻ㄟ^其他方式完成無刷新請求數(shù)據(jù)不也可以么,我們用Dom方法操作動態(tài)JS腳本請求來做這件事。
        //創(chuàng)建一個腳本節(jié)點
        var oScript = document.createElement(’script’);
        //指定腳本src src可以指向任意域名
        //注意src不再指向靜態(tài)js,而是帶著查詢參數(shù)指向一個動態(tài)腳本廣播服務(wù)。
        oScript.src = “http://yyy.com/query.php?”+yourQueryString;   
        //如果指定了charset 同時還可以解決xmlHttpRequest另一大困擾 亂碼問題                                                                                                                           
        //oScript.charset = “utf-8″;
        //通過Dom操作把這個新的節(jié)點加入到文檔當(dāng)中                                 
        document.getElementsByTagName(”head”)[0].appendChild(oScript);

    這樣只要query.php的輸出是可執(zhí)行的javaScript腳本,比如:djsCallBack({jsondata});
    當(dāng)他從服務(wù)器返回后就會自動執(zhí)行,你可以方便的用json方式來做數(shù)據(jù)傳遞了。
    要注意,您的腳本請求最好帶上時間戳,避免瀏覽器緩存造成取回數(shù)據(jù)實時性下降。

    如果您是數(shù)據(jù)提供者,您可以要求數(shù)據(jù)索取者在查詢參數(shù)中提供回調(diào)函數(shù)名,比如query.php?callback=myDataHandler&key=…?
    這樣您就可以根據(jù)參數(shù)來提供給他myDataHandler({jsondata}),這樣不同的數(shù)據(jù)索取者都會得到自定義的正確的異步回調(diào)。

    場景五:通過后端程序語言,為了跨域名而做各自的后臺數(shù)據(jù)抓取轉(zhuǎn)化服務(wù),比如php curl,YAHOO  CHINA NCP就是用這種方案。

    場景六:通過flash proxy,因為flash的跨域調(diào)用可以通過crossdomain.xml和security.allowdomain(’*')文件實現(xiàn),而js又可以和flash進行通信,所以js完全可以借用flash

                   實現(xiàn)js跨域通信。

     
    總結(jié)總結(jié)
    第一種場景,相應(yīng)的處理辦法有這非常好的效果,可以說完全解決了問題。
    第二種場景,相應(yīng)的處理辦法具有一定的跨域數(shù)據(jù)交流功效,具有相當(dāng)大的局限,并不適合在復(fù)雜業(yè)務(wù)流程中應(yīng)用,實際上我也確實也沒看到過基于此的大規(guī)模應(yīng)用。
    第三種場景,相應(yīng)的處理辦法比較巧妙,雖然redirect之后就不干你什么事了,但如果你是google一樣面向眾多域名的內(nèi)容提供商,也是個不錯的解決思路。
    第四種場景,相應(yīng)的處理辦法非常強大,對比Ajax可以看到,跨域名沒問題,無刷新沒問題,本身又是異步的,JSON比xml快的多,同時解決亂碼問題,只是請求都是Get方式的,不能做Post方式的請求。多一種武器自然可以從容選擇了。

    第五種場景,處理很方便,也很實用。

    第六種場景,需要一定的flash基礎(chǔ)哈,作用當(dāng)然非常強大。

    posted @ 2009-12-16 17:51 二胡 閱讀(1095) | 評論 (0)編輯 收藏


    The Java Community Process(SM) Program

    轉(zhuǎn) http://blog.csdn.net/sergeycao/archive/2009/02/04/3861560.aspx

    J2ME 配置規(guī)范
    =========
    JSR 30 --- Connected Limited Device Configuration 1.0
    http://jcp.org/en/jsr/detail?id=30

    JSR 139 --- Connected Limited Device Configuration 1.1
    http://jcp.org/en/jsr/detail?id=139

    JSR 36 --- Connected Device Configuration 1.0
    http://jcp.org/en/jsr/detail?id=36

    JSR 218 --- Connected Device Configuration 1.1
    http://jcp.org/en/jsr/detail?id=218

    ========================================
    1、JSR 30、JSR139 簡介 及它們之間的關(guān)系
    CLDC全稱為Connected Limited Device Configuration(有限連接設(shè)備配置),
    分別對應(yīng)了JSR 30和JSR 139兩個JSR。

    CLDC專門針對移動電話、閱讀器和主流的PDA(個人數(shù)字助理)定義了一組基礎(chǔ)的應(yīng)用程序編程接口和虛擬機標(biāo)準(zhǔn),
    和簡表文件一起配合,就構(gòu)成了一套實用的Java平臺,可以為內(nèi)存不多、處理器性能有限、圖形能力一般的設(shè)備開發(fā)應(yīng)用程序。

    JSR 30 CLDC 1.0 提供了基本的語言類庫,主要是定義了JAVA編程語言的一套子集,包括虛擬機的功能上,網(wǎng)絡(luò)支持,安全安裝以及其他核心API上都是子集和全集的關(guān)系,主要目標(biāo)是某類嵌入式的消費類產(chǎn)品。由于不支持浮點運算,可以用CLDC1.1替代CLDC1.0;

    JSR 139 CLDC 1.1是CLDC 1.0技術(shù)標(biāo)準(zhǔn)的修訂版本,包含了一些新的特性比如浮點運算和弱引用等方面的支持,和CLDC-1.0是完全向后兼容的;

    2、JSR 36、JSR218 簡介 及 它們之間的關(guān)系
    JSR 36 CDC (Connected Device Configuration,連接設(shè)備配置)。CDC的目標(biāo)設(shè)備較CLDC具有更大的內(nèi)存、更快速的處理器、更穩(wěn)定的電源,以及更出色的網(wǎng)絡(luò)連接能力。
    CDC主要應(yīng)用在工業(yè)控制器、高端PDA、電視機頂盒及車載娛樂與導(dǎo)航系統(tǒng)上。

    JSR 218 是在JSR 36基礎(chǔ)上進行補充,并兼容JSR 36.

    J2ME 簡表規(guī)范
    =========
    CDC 簡表規(guī)范
    ------------------
    JSR 46 --- Foundation Profile
    http://jcp.org/en/jsr/detail?id=46

    JSR 129 --- Personal Basis Profile Specification
    http://jcp.org/en/jsr/detail?id=129

    JSR 62 --- Personal Profile Specification
    http://jcp.org/en/jsr/detail?id=62

    JSR 219 --- Foundation Profile 1.1
    http://jcp.org/en/jsr/detail?id=219

    JSR 217 --- Personal Basis Profile 1.1
    http://jcp.org/en/jsr/detail?id=217

    JSR 216 --- Personal Profile 1.1
    http://jcp.org/en/jsr/detail?id=216

    CLDC 簡表規(guī)范
    --------------------
    JSR 37 --- Mobile Information Device Profile 1.0
    http://jcp.org/en/jsr/detail?id=37

    JSR 118 --- Mobile Information Device Profile 2.0
    http://jcp.org/en/jsr/detail?id=118

    JSR 195 --- Information Module Profile
    http://jcp.org/en/jsr/detail?id=195

    JSR 228 --- Information Module Profile 2.0)
    http://jcp.org/en/jsr/detail?id=228


    廠商可選包(Optional Packages)
    -----------------------------------------

    CDC設(shè)備廠商可選包
    ...........................
    JSR 66 --- RMI Optional Package Specification Version 1.0
    http://jcp.org/en/jsr/detail?id=66

    JSR 80 --- Java USB API
    http://jcp.org/en/jsr/detail?id=80

    JSR 113 --- Java Speech API 2.0
    http://jcp.org/en/jsr/detail?id=113

    JSR 169 --- JDBC Optional Package for CDC/Foundation Profile
    http://jcp.org/en/jsr/detail?id=169

    JSR 209 --- Advanced Graphics and User Interface Optional Package for the J2ME Platform
    http://jcp.org/en/jsr/detail?id=209

    CLDC設(shè)備廠商可選包
    ...........................
    JSR 75 --- PDA Optional Packages for the J2ME Platform
    http://jcp.org/en/jsr/detail?id=75

    JSR 82 --- Java APIs for Bluetooth
    http://jcp.org/en/jsr/detail?id=82

    JSR 120 --- Wireless Messaging API
    http://jcp.org/en/jsr/detail?id=120

    JSR 135 --- Mobile Media API
    http://jcp.org/en/jsr/detail?id=135

    JSR 172 --- J2ME Web Services Specification
    http://jcp.org/en/jsr/detail?id=172

    JSR 177 --- Security and Trust Services API for J2ME
    http://jcp.org/en/jsr/detail?id=177

    JSR 179 --- Location API for J2ME
    http://jcp.org/en/jsr/detail?id=179

    JSR 180 --- SIP API for J2ME
    http://jcp.org/en/jsr/detail?id=180

    JSR 184 --- Mobile 3D Graphics API for J2ME
    http://jcp.org/en/jsr/detail?id=184

    JSR 190 --- Event Tracking API for J2ME
    http://jcp.org/en/jsr/detail?id=190

    JSR 205 --- Wireless Messaging API 2.0
    http://jcp.org/en/jsr/detail?id=205

    JSR 211 --- Content Handler API
    http://jcp.org/en/jsr/detail?id=211

    JSR 226 --- Scalable 2D Vector Graphics API for J2ME
    http://jcp.org/en/jsr/detail?id=226

    JSR 229 --- Payment API
    http://jcp.org/en/jsr/detail?id=229

    JSR 230 --- Data Sync API
    http://jcp.org/en/jsr/detail?id=230

    運行環(huán)境規(guī)范
    ..................
    JSR 185 --- JavaTM Technology for the Wireless Industry
    http://jcp.org/en/jsr/detail?id=185

     

    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/sergeycao/archive/2009/02/04/3861560.aspx

    posted @ 2009-12-15 09:32 二胡 閱讀(1215) | 評論 (0)編輯 收藏

         摘要: 我google一下,已有人翻譯了此文.比我翻譯的要好!是譯言站翻譯的 見url: http://www.yeeyan.com/articles/view/92135/47626/dz 原文見:http://code.google.com/intl/zh-CN/speed/articles/optimizing-javascript.html 不合適的地方,請大家指出來!希望對你有用! ...  閱讀全文
    posted @ 2009-12-14 21:43 二胡 閱讀(1924) | 評論 (0)編輯 收藏

    轉(zhuǎn) http://war.news.163.com/09/1211/18/5Q98H5TU00011232.html

    國家戰(zhàn)略是一個范軍事話題,并非只有軍事家才能成為戰(zhàn)略精英。在這一點上,美國培養(yǎng)未來的國家決策人才的經(jīng)驗就值得中國反思。

    前美國國防部長拉姆斯菲爾德

    原文作者:于鐵軍(北京大學(xué)國際關(guān)系學(xué)院副教授)

    美國的精英比較有活力,給人一種生機勃勃的感覺,因為他們更注重全面發(fā)展,更注重訓(xùn)練。反觀國內(nèi)精英,大多比較文弱,缺乏朝氣,口號、程式,大話、空話很多,行動力、執(zhí)行力卻比較差。各種原因當(dāng)然很多,其中重要之一是國內(nèi)的精英培養(yǎng)機制有問題。在這方面,我們應(yīng)該好好地研究一下美國培養(yǎng)精英的做法。如果我們對精英培養(yǎng)機制和培養(yǎng)內(nèi)容不重視,中國要實現(xiàn)真正的崛起,難度是很大的。

    什么是精英

    精英,或者稱戰(zhàn)略性人才,是個很值得討論的題目。這里首先需要回答一個問題,什么是精英?精英,一定是有所擔(dān)當(dāng)?shù)娜?,有社會?zé)任感的人,而絕不能是蠅營狗茍之輩。真正的精英,他身上一定帶有一些利他的東西,不是完全為了自己。這是精英的一個必備條件。

    以美國外交和國家安全領(lǐng)域的情況為例來做具體的說明,哈爾伯斯坦的《出類拔萃之輩》、艾薩克森和托馬斯的《美國智囊六人傳》,以及詹姆斯·曼的《布什戰(zhàn)爭內(nèi)閣史》等傳記作品。這些書中對艾奇遜、哈里曼、凱南、麥克羅伊、洛維特、邦迪兄弟、麥克納馬拉、羅斯托、拉姆斯菲爾德、鮑威爾、賴斯、沃爾福威茨、阿米蒂奇等美國外交和國家安全界精英的成長及活動,有惟妙惟肖的描寫,有助于增加我們對美國精英養(yǎng)成方式的感性認(rèn)識。掩卷之余,你可以對書中人物做出或褒或貶的評價,但你一般不會否認(rèn),這是一批有理想、有追求、有能力并且關(guān)心公共事務(wù)的精英,美國這個國家的大政方針為他們所引領(lǐng)。

    叱咤風(fēng)云的美國前國務(wù)卿賴斯

    美國培養(yǎng)精英的一個重要理念:尚武精神與體育運動

    具體到精英的培養(yǎng),大學(xué)里面的培養(yǎng)機制還是比較關(guān)鍵的。當(dāng)然我們不否認(rèn)有草根出身的英雄,而且國人還經(jīng)常說,英雄莫問來路。但社會發(fā)展到現(xiàn)在這個階段,應(yīng)該說大部分人才還是經(jīng)過大學(xué)的正規(guī)教育訓(xùn)練出來的。美國的高等教育制度十分復(fù)雜,不像我們那樣有一個統(tǒng)一的體制。從精英大學(xué)到普通大學(xué),從研究性大學(xué)到小型的文理學(xué)院,從州立大學(xué)到私立大學(xué),各種類型,應(yīng)有盡有。不管是什么樣的大學(xué),從學(xué)生錄取方面來看,美國比我們更重視學(xué)生的綜合素質(zhì)和發(fā)展?jié)摿Α3薙AT、GRE和GMAT這樣的標(biāo)準(zhǔn)化考試之外,推薦信、研究計劃、習(xí)作、課外活動等也都是很重要的指標(biāo),這無疑有助于引導(dǎo)和鼓勵學(xué)生全面發(fā)展。

    騎自行車的小布什,體育運動愛好在美國高官中相當(dāng)普及

    中國從小學(xué)就開始教育要德、智、體全面發(fā)展,但遺憾的是沒有落到實處。就拿體育來說,正如中國留美學(xué)者薛涌所觀察到的,美國精英層中運動員出身或者喜愛體育運動的人高得不成比例。他們在大學(xué)時代往往喜歡參加各種體育項目,如橄欖球、棒球、籃球、皮劃艇等。參加體育運動,在激烈的競爭中使你的體力達到極限,這有助于一系列優(yōu)秀品質(zhì)的培養(yǎng),如全力以赴、堅忍不拔、公平競爭、團隊精神、尊重規(guī)則、強身健體,等等,而且還能找到一些志同道合者,為未來的事業(yè)編制人脈。在美國大學(xué)里,學(xué)生的領(lǐng)導(dǎo)能力常常是通過參加某某運動隊和某某社團的活動來體現(xiàn)的。光是悶頭學(xué)習(xí),即使成績再好,可能也不為人看重。

    小布什的身體強壯,當(dāng)總統(tǒng)時公務(wù)再繁忙,也要擠時間騎山地車和跑3英里。還有拉姆斯菲爾德,上大學(xué)時是普林斯頓摔跤隊的,要不是因為肩傷,本來可以入選美國的奧運代表隊。前總統(tǒng)福特,原來是密歇根大學(xué)橄欖球隊的,水平之高幾乎可以當(dāng)職業(yè)運動員,但后來他選擇去了耶魯,畢業(yè)后開始從政。賴斯年輕的時候練花樣滑冰,據(jù)說具備專業(yè)水準(zhǔn)。其他例子還有許多,美國精英對體育的重視由此可見一斑。

    傳說中賴斯年輕時學(xué)習(xí)花樣滑冰的照片

    體育運動、強健的體魄與尚武精神是密切聯(lián)系的。西方自古希臘以來便有一種尚武的傳統(tǒng),當(dāng)代美國也繼承了這一傳統(tǒng),并成為其培養(yǎng)精英的一個重要理念。尚武精神在當(dāng)代的一個重要表現(xiàn)就是重視體育。而在中國方面,長期以來則是尚文輕武的傳統(tǒng)占上風(fēng)。歷史學(xué)家雷海宗先生早就提出過一種觀點,認(rèn)為中國是“無兵的文化”。春秋戰(zhàn)國的時候,還是貴族在打仗。從那以后,兵的文化就日漸弱化,好男不當(dāng)兵的觀念流傳甚廣,這與西方的情況大相徑庭。

    美國戰(zhàn)略精英的培養(yǎng)機制

    1.耶魯大學(xué)的大戰(zhàn)略研究:閱讀經(jīng)典、海外游歷與現(xiàn)實關(guān)懷

    耶魯大學(xué)的大戰(zhàn)略研究以歷史路徑為主。冷戰(zhàn)史名家約翰·加迪斯教授和曾撰寫過《大國的興衰》的名教授保羅·肯尼迪,都非常重視通過研究歷史來探究戰(zhàn)略。他們在耶魯大學(xué)設(shè)立的大戰(zhàn)略研究項目,大致分為閱讀經(jīng)典、海外旅行和當(dāng)代重大問題討論三個板塊。學(xué)生進入到這個項目后,春季學(xué)期被用來大量閱讀經(jīng)典著作,讀修昔底德,讀孫子,讀馬基雅維利、伊麗莎白二世、美國的開國元勛、康德、梅特涅、克勞塞維茨、林肯、俾斯麥、威爾遜、丘吉爾、兩個羅斯福(西奧多·羅斯福和富蘭克林·羅斯福)、列寧、斯大林、毛澤東、凱南、基辛格等人的著作。培養(yǎng)戰(zhàn)略精英,不了解過去偉大的思想怎么行?不研究戰(zhàn)略思想發(fā)展史怎么行?

    耶魯大戰(zhàn)略研究班的一次集體討論,未來的國家決策者們通過辯論與他人交流知識

    夏季小學(xué)期學(xué)生們被安排到海外旅行。耶魯特別鼓勵學(xué)生到世界各地去游歷,主要不是看那些名勝古跡,而是到那些普通觀光者不怎么去的地方,比如說,你可以沿著古代的絲綢之路去看看今日的輸油管道;你可以先到圣彼得堡學(xué)一個月俄語,然后花兩個月時間途經(jīng)西伯利亞回國;你可以到敘利亞、埃及去學(xué)阿拉伯語;你可以去中國那些外國人平常不怎么去的地方,了解一下中國的風(fēng)土人情。這有點像田野調(diào)查。他們希望通過這種海外經(jīng)歷,一方面使學(xué)生增加對不同文化、不同國家的了解,另一方面把他們置于一種自己不熟悉的、帶有挑戰(zhàn)性的環(huán)境中去磨練他們的意志,增加他們的自信心。

    回來之后,在秋季學(xué)期開始時討論美國所面臨的當(dāng)代重大問題。這時候?qū)W生要讀亨廷頓、福山、扎卡里亞這些人的著作,然后讓他們分組進行辯論,假定自己擔(dān)任國家公職,肩負著重要的職責(zé),你要指出現(xiàn)在美國所面臨的主要問題是什么?美國的國家利益是什么?美國到底要維護什么?美國的最大威脅是什么?然后盡自己最大的努力去說服同學(xué)、說服教師來接受你的觀點??梢韵胍?,這一年的讀萬卷書、行萬里路的訓(xùn)練,對培育學(xué)生的戰(zhàn)略素養(yǎng)將是很有幫助的。

    2.斯坦福大學(xué)國際安全與合作中心:走科學(xué)技術(shù)與跨學(xué)科研究之路

     

    美國海軍預(yù)備役軍官團的一次課程,相當(dāng)于中國的國防生制度,但是歷史更悠久,制度更健全

    斯坦福大學(xué)集中搞戰(zhàn)略研究的地方,是國際安全與合作中心。該中心的突出特點是重視科技與戰(zhàn)略研究的關(guān)系,開展真正的跨學(xué)科研究。中心的研究人員分成兩大撥兒,一撥兒人是科學(xué)家和工程師,包括核物理學(xué)家、化學(xué)家、生物學(xué)家、研究導(dǎo)彈的等等;另一撥兒人則是搞人文社會科學(xué)的,包括政治學(xué)家、歷史學(xué)家、法學(xué)家、經(jīng)濟學(xué)家、社會學(xué)家等。這兩撥兒人整天在一個屋檐下搞研究。在國家安全問題上,如果要提出一項政策,那么該政策在技術(shù)上的可行性如何,將是非常重要的一個問題。而對科學(xué)家和工程師們來說,他們在人文社科方面的知識、在政策的敏感性等方面可能就稍微欠缺一些。一項政策的歷史變遷、在法律上如何操作、如何將技術(shù)上的可能性轉(zhuǎn)化成政策,這些問題,他們不太擅長,因此也就需要由一些搞人文社科的來幫助,來協(xié)調(diào)。兩邊一搭伙兒就形成了一個良性循環(huán)。

    中心的跨學(xué)科研究取向也體現(xiàn)在中心的教育功能上。中心為斯坦福大學(xué)的本科生開設(shè)的課程有“軍事技術(shù)與國家安全”、“核武器國際史”,以及通過模擬來解決國際危機的課程,走的都是技術(shù)與戰(zhàn)略研究的結(jié)合之路。中心還設(shè)立了一個本科生國際安全輔修項目,從斯坦福不同專業(yè)但都對國際安全問題感興趣的本科生中選拔優(yōu)秀者參加,集中學(xué)習(xí)一年課程,包括實習(xí)和撰寫有政策意義的研究論文。另外,中心還設(shè)立獎學(xué)金,將全美名校中從事國際安全問題研究的有前途的年輕人吸收到中心的博士后和博士前項目中,讓他們與中心的研究人員密切互動,從而將研究和教學(xué)很好地結(jié)合起來。

    斯坦福的這套做法,對國內(nèi)的戰(zhàn)略研究來說很有借鑒意義。北大在國內(nèi)也算是頂尖大學(xué),但在國際問題研究領(lǐng)域幾乎看不到類似斯坦福那樣真正的跨自然和人文社會科學(xué)的研究機構(gòu)。不同領(lǐng)域的專家很少有機會能坐下來一塊兒交流、討論、合作攻關(guān)。北大國際關(guān)系學(xué)院兩年多前成立了一個國際戰(zhàn)略研究中心,打算在這個方面做一點努力,但未來的路很長。無論是在觀念意識方面還是組織架構(gòu)方面,中國的跨學(xué)科戰(zhàn)略研究與美國相比,都還有很大差距。

    3.哈佛的戰(zhàn)略研究:重決策過程與案例研究

    哈佛大學(xué)的國際事務(wù)研究中心

    哈佛的戰(zhàn)略研究分好幾個單位,一個單位是哈佛國際事務(wù)研究中心,“文明沖突論”的提出者亨廷頓曾長期擔(dān)任這個中心的主任;基辛格出道之前也在這兒。后來在該中心下又成立一個奧林戰(zhàn)略研究所。在過去近20年中,奧林國家安全項目通過為美國國家安全領(lǐng)域優(yōu)秀的年輕學(xué)者(包括博士待位人、博士后和高等院校的年輕教員,每年10人左右)提供獎學(xué)金的方式,為美國的國際戰(zhàn)略研究界培養(yǎng)了很多人才。這些人實際上形成了一個圈子。

    哈佛的肯尼迪學(xué)院在戰(zhàn)略研究領(lǐng)域是后起之秀

    目前來看,在哈佛的戰(zhàn)略研究中,更為活躍的是設(shè)立較晚的肯尼迪政府學(xué)院。從1960年代起,在政治學(xué)家諾伊斯塔特,外交史學(xué)家歐內(nèi)斯特·梅,以及他們的學(xué)生、現(xiàn)任肯尼迪政府學(xué)院名譽院長格雷厄姆·艾利森的持續(xù)努力下,發(fā)展了一條從案例和決策過程入手來研究國際戰(zhàn)略的路徑。艾利森以古巴導(dǎo)彈危機為例所歸納出的三種決策模式,便是其中最為突出的一個范例。在長期關(guān)注決策和案例的基礎(chǔ)上,肯尼迪學(xué)院開設(shè)了各種高級別的戰(zhàn)略培訓(xùn)班,與政府部門合作,培養(yǎng)各類戰(zhàn)略研究人才。

    4.麻省理工學(xué)院的安全研究項目:與軍方密切合作

    麻省理工學(xué)院(MIT)的安全研究項目(Security Studies Program,簡稱SSP項目)在美國大學(xué)的安全研究領(lǐng)域中是名列前茅的。該項目的前身是麻省理工學(xué)院國際問題研究所,在冷戰(zhàn)時期主要做宣傳戰(zhàn)、心理戰(zhàn)和第三世界的政治和經(jīng)濟發(fā)展研究,后來研究重點轉(zhuǎn)向軍控和蘇聯(lián)軍事等領(lǐng)域。MIT是一個以工科為主的學(xué)校。給人印象特別深刻的是它跟軍方的關(guān)系特別密切,好多大實驗室的研發(fā)依靠的都是軍工項目。MIT安全項目的規(guī)模在美國大學(xué)中大概是數(shù)一數(shù)二的,為美國培養(yǎng)了不少高水平的戰(zhàn)略研究人才。在這里只簡單介紹一下它獨特的“軍事研究員”(military fellow)制度。

    所謂軍事研究員制度,就是MIT跟美國軍方簽訂協(xié)議,接受來自美國陸軍、空軍、海軍和海軍陸戰(zhàn)隊的現(xiàn)役校級軍官到SSP項目做一年訪問學(xué)者。他們可以參加SSP項目的所有課程與活動,一年訪問結(jié)束后,從其所在軍種的院校取得學(xué)分。我們知道,軍事人員有自己的專業(yè)知識,他們到MIT來,可以給這里從事戰(zhàn)略問題研究的師生傳授很多軍事知識,彌補他們知識結(jié)構(gòu)上的欠缺。另一方面,軍事研究員們也可以充分利用大學(xué)的智力資源,在開闊自己視野的同時,把那些他們在實際工作中遇到的難題提供給專家學(xué)者們研究討論,尋找答案。這對雙方都大有好處。搞戰(zhàn)略研究的,軍事是很重要的一個方面。如果對戰(zhàn)役、戰(zhàn)術(shù)這類東西完全不了解,上來就談戰(zhàn)略,其實是相當(dāng)困難的。

    5.哥倫比亞大學(xué)的軍事行動與戰(zhàn)略分析研討班

    哥倫比亞大學(xué)的戰(zhàn)略研究與教學(xué)也非常重視軍事。哥倫比亞大學(xué)有個戰(zhàn)爭與和平研究所,它主辦的一個名為“軍事行動與戰(zhàn)略分析”的暑期研討班(Summer Workshopon Analysis of Military Operations and Strategy,簡稱SWAMOS)每年夏季開班,主要講授和討論軍事及戰(zhàn)略問題。暑期班的學(xué)員,一部分是研究安全問題的博士生,另一部分是在大學(xué)中從事國際安全教學(xué)與研究的年輕教員,每期學(xué)員大約有20人,時間大概是三個星期左右。研討班的講師基本上是全美這個領(lǐng)域中最好的專家,有大學(xué)教授,有智庫中的研究人員,還有政府部門中的相關(guān)人士。講授的內(nèi)容包括戰(zhàn)略思想、陸??哲姷幕局R、軍事預(yù)算、常規(guī)戰(zhàn)爭、反叛亂戰(zhàn)爭、核戰(zhàn)略等。每天上午上三個小時的課,中間休息15分鐘,下午分組討論兩小時,然后是師生自由交流和體育活動,晚上再安排看戰(zhàn)爭片,看完之后還要討論各種戰(zhàn)略戰(zhàn)術(shù)和戰(zhàn)爭倫理問題。去參加研究班之前,已經(jīng)被要求先完成1000頁左右的閱讀量,材料寄到家。研討班開班后,每天要看個七八十頁材料。這樣三個星期下來,等于上了一門本科生、一門研究生的課程。

    哥倫比亞大學(xué)的“軍事行動與戰(zhàn)略分析”暑期研討班課堂

    通過考察上述這幾所大學(xué)的戰(zhàn)略精英培養(yǎng)機制,可以使我們認(rèn)識到美國在培養(yǎng)自己的戰(zhàn)略精英方面是多么地不遺余力而又行之有道。相比之下,中國的精英培養(yǎng)機制卻存在著種種不足。許多口號都飄在空中,落不到實處,形不成真正的生產(chǎn)力。最重要的是,人的精氣神,無論是在精英層次還是民眾層次,都做得遠遠不如歐美。 (本文來源:網(wǎng)易軍事 )

    posted @ 2009-12-13 11:10 二胡 閱讀(258) | 評論 (0)編輯 收藏

    說起Google,可謂無人不知無人不曉。作為世界第一的搜索引擎,其強大的搜索功能,可以讓你在瞬間找到你想要的一切。不過對于普通的計算機用戶而言,Google是一個強大的搜索引擎;而對于黑客而言,則可能是一款絕佳的黑客工具。正因為google的檢索能力強大,黑客可以構(gòu)造特殊的關(guān)鍵字,使用Google搜索互聯(lián)網(wǎng)上的相關(guān)隱私信息。通過Google,黑客甚至可以在幾秒種內(nèi)黑掉一個網(wǎng)站。這種利用Google搜索相關(guān)信息并進行入侵的過程就叫做Google Hack。

    搜索也是一門藝術(shù)

             在我們平時使用搜索引擎的過程中,通常是將需要搜索的關(guān)鍵字輸入搜索引擎,然后就開始了漫長的信息提取過程。其實Google對于搜索的關(guān)鍵字提供了多種語法,合理使用這些語法,將使我們得到的搜索結(jié)果更加精確。當(dāng)然,Google允許用戶使用這些語法的目的是為了獲得更加精確的結(jié)果,但是黑客卻可以利用這些語法構(gòu)造出特殊的關(guān)鍵字,使搜索的結(jié)果中絕大部分都是存在漏洞的網(wǎng)站。
    下面我們先來看看Google的部分語法:
             intitle:搜索網(wǎng)頁標(biāo)題中包含有特定字符的網(wǎng)頁。例如輸入“intitle: cbi”,這樣網(wǎng)頁標(biāo)題中帶有cbi的網(wǎng)頁都會被搜索出來。
             inurl:搜索包含有特定字符的URL。例如輸入“inurl:cbi”,則可以找到帶有cbi字符的URL。
             intext:搜索網(wǎng)頁正文內(nèi)容中的指定字符,例如輸入“intext:cbi”。這個語法類似我們平時在某些網(wǎng)站中使用的“文章內(nèi)容搜索”功能。
             Filetype:搜索指定類型的文件。例如輸入“filetype:cbi”,將返回所有以cbi結(jié)尾的文件URL。
             Site:找到與指定網(wǎng)站有聯(lián)系的URL。例如輸入“Site:family.chinaok.com”。所有和這個網(wǎng)站有聯(lián)系的URL都會被顯示。
             這些就是Google的常用語法,也是Google Hack的必用語法。雖然這只是Google語法中很小的部分,但是合理使用這些語法將產(chǎn)生意想不到的效果。

    語法在Google Hack中的作用

             了解了Google的基本語法后,我們來看一下黑客是如何使用這些語法進行Google Hack的,這些語法在入侵的過程中又會起到怎樣的作用呢?
             intitle
             intitle語法通常被用來搜索網(wǎng)站的后臺、特殊頁面和文件,通過在Google中搜索“intitle:登錄”、“intitle:管理”就可以找到很多網(wǎng)站的后臺登錄頁面。此外,intitle語法還可以被用在搜索文件上,例如搜索“intitle:"indexof"etc/shadow”就可以找到Linux中因為配置不合理而泄露出來的用戶密碼文件。
             inurl
             Google Hack中,inurl發(fā)揮的作用的最大,主要可以分為以下兩個方面:尋找網(wǎng)站后臺登錄地址,搜索特殊URL。
             尋找網(wǎng)站后臺登錄地址:和intitle不同的是,inurl可以指定URL中的關(guān)鍵字,我們都知道網(wǎng)站的后臺URL都是類似login.asp、admin.asp為結(jié)尾的,那么我們只要以“inurl:login.asp”、“inurl:admin.asp”為關(guān)鍵字進行搜索,同樣可以找到很多網(wǎng)站的后臺。此外,我們還可以搜索一下網(wǎng)站的數(shù)據(jù)庫地址,以“inurl:data”、“inurl:db”為關(guān)鍵字進行搜索即可。


    1.尋找網(wǎng)站的后臺登錄頁面
             搜索特殊URL:通過inurl語法搜索特殊URL,我們可以找到很多網(wǎng)站程序的漏洞,例如最早IIS中的Uncode目錄遍歷漏洞,我們可以構(gòu)造“inurl:/winnt/system32/cmd exe?/c+dir”這樣的關(guān)鍵字進行搜索,不過目前要搜索到存在這種古董漏洞的網(wǎng)站是比較困難的。再比如前段日子很火的上傳漏洞,我們使用““inurl:upload.asp”或“inurl:upload_soft.asp”即可找到很多上傳頁面,此時再用工具進行木馬上傳就可以完成入侵。


             intext
             intext的作用是搜索網(wǎng)頁中的指定字符,這貌似在Google Hack中沒有什么作用,不過在以“intext:to parent directory”為關(guān)鍵字進行搜索后,我們會很驚奇的發(fā)現(xiàn),無數(shù)網(wǎng)站的目錄暴露在我們眼前。我們可以在其中隨意切換目錄,瀏覽文件,就像擁有了一個簡單的Webshell。形成這種現(xiàn)象的原因是由于IIS的配置疏忽。同樣,中文IIS配置疏忽也可能出現(xiàn)類似的漏洞,我們用“intext:轉(zhuǎn)到父目錄”就可以找到很多有漏洞的中文網(wǎng)站。


    2.隨意瀏覽網(wǎng)站中的文件
             Filetype
             Filetype的作用是搜索指定文件。假如我們要搜索網(wǎng)站的數(shù)據(jù)庫文件,那么可以以“filetype:mdb”為關(guān)鍵字進行搜索,很快就可以下載到不少網(wǎng)站的數(shù)據(jù)庫文件。當(dāng)然,F(xiàn)iletype語法的作用不僅于此,在和其他語法配合使用的時候更能顯示出其強大作用。
             Site
             黑客使用Site,通常都是做入侵前的信息刺探。Site語法可以顯示所有和目標(biāo)網(wǎng)站有聯(lián)系的頁面,從中或多或少存在一些關(guān)于目標(biāo)網(wǎng)站的資料,這對于黑客而言就是入侵的突破口,是關(guān)于目標(biāo)網(wǎng)站的一份詳盡的報告。

    語法組合,威力加倍

             雖然上文中介紹的這幾個語法能各自完成入侵中的一些步驟,但是只使用一個語法進行入侵,其效率是很低下的。Google Hack的威力在于能將多個語法組合起來,這樣就可以快速地找到我們需要的東西。下面我們來模擬黑客是如何使用Google語法組合來入侵一個網(wǎng)站的。


        信息刺探
             黑客想入侵一個網(wǎng)站,通常第一步都是對目標(biāo)網(wǎng)站進行信息刺探。這時可以使用“Site:目標(biāo)網(wǎng)站”來獲取相關(guān)網(wǎng)頁,從中提取有用的資料。


    3.搜索相關(guān)頁面
             下載網(wǎng)站的數(shù)據(jù)庫
             搜索“Site:目標(biāo)網(wǎng)站 Filetype:mdb”就可以尋找目標(biāo)網(wǎng)站的數(shù)據(jù)庫,其中的Site語法限定搜索范圍,F(xiàn)iletype決定搜索目標(biāo)。用這種方法有一個缺點,就是下載到數(shù)據(jù)庫的成功率較低。在這里我們還可以采用另一種語法組合,前提是目標(biāo)網(wǎng)站存在IIS配置缺陷,即可以隨意瀏覽站點文件夾,我們搜索“Site:目標(biāo)網(wǎng)站 intext:to parent directory”來確定其是否存在此漏洞。在確定漏洞存在后,可以使用“Site:目標(biāo)網(wǎng)站 intext:to parent directory+intext.mdb”進行數(shù)據(jù)庫的搜索。


    4.找到網(wǎng)站數(shù)據(jù)庫


        登錄后臺管理
             下載到數(shù)據(jù)庫后,我們就可以從中找到網(wǎng)站的管理員帳戶和密碼,并登錄網(wǎng)站的后臺。對于網(wǎng)站后臺的查找,可以使用語法組合“Site:目標(biāo)網(wǎng)站 intitle:管理”或者“Site:目標(biāo)網(wǎng)站 inurl:login.asp”進行搜索,當(dāng)然我們可以在這里進行聯(lián)想,以不同的字符進行搜索,這樣就有很大的概率可以找到網(wǎng)站的后臺管理地址。接下去黑客就可以在后臺上傳Webshll,進一步提升權(quán)限,在此不再闡述。


        利用其他漏洞
             如果下載數(shù)據(jù)庫不成功,我們還可以嘗試其他的入侵方法。例如尋找上傳漏洞,搜索“Site:目標(biāo)網(wǎng)站 inurl:upload.asp”。此外,我們還可以根據(jù)一些程序漏洞的特征,定制出Google Hack的語句。
             Google Hack可以靈活地組合法語,合理的語法組合將使入侵顯得易如反掌,再加入自己的搜索字符,Google完全可以成為你獨一無二的黑客工具。

    合理設(shè)置,防范Google Hack
       
    5. 合理設(shè)置網(wǎng)站
             Google Hack貌似無孔不入,實則無非是利用了我們配置網(wǎng)站時的疏忽。例如上文中搜索“intext:to parent directory”即可找到很多可以瀏覽目錄文件的網(wǎng)站,這都是由于沒有設(shè)置好網(wǎng)站權(quán)限所造成的。在IIS中,設(shè)置用戶訪問網(wǎng)站權(quán)限時有一個選項,叫做“目錄瀏覽”,如果你不小心選中了該項,那么其結(jié)果就如上文所述,可以讓黑客肆意瀏覽你網(wǎng)站中的文件。
             這種漏洞的防范方法十分簡單,在設(shè)置用戶權(quán)限時不要選中“目錄瀏覽”選項即可。


    6.不要選中該項
             編寫robots.txt文件
             robot.txt是專門針對搜索引擎機器人robot編寫的一個純文本文件。我們可以在這個文件中說明網(wǎng)站中不想被robot訪問的部分,這樣,我們網(wǎng)站的部分或全部內(nèi)容就可以不被搜索引擎收錄了,或者讓搜索引擎只收錄指定的內(nèi)容。因此我們可以利用robots.txt讓Google的機器人訪問不了我們網(wǎng)站上的重要文件,Google Hack的威脅也就不存在了。


             編寫的robots.txt文件內(nèi)容如下:
    User-agent: *
    Disallow: /data/
    Disallow: /db/


             其中“Disallow”參數(shù)后面的是禁止robot收錄部分的路徑,例如我們要讓robot禁止收錄網(wǎng)站目錄下的“data”文件夾,只需要在Disallow參數(shù)后面加上“/data/”即可。如果想增加其他目錄,只需按此格式繼續(xù)添加。文件編寫完成后將其上傳到網(wǎng)站的根目錄,就可以讓網(wǎng)站遠離Google Hack了

     

    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/chaosa/archive/2007/10/16/1828301.aspx

    posted @ 2009-12-11 09:41 二胡 閱讀(1134) | 評論 (6)編輯 收藏

      這樣的錯誤以前我也犯過,也見過不少人這樣的寫法!下面我也舉個例子:
      

     public void writeFile(File f) {
      String content 
    = null;
      
    try {
       
    byte[] b = new byte[1024];
       FileInputStream in 
    = new FileInputStream(f);
       in.read(b);
       content 
    = new String(b);
      }
     catch (Exception e) {
       System.out.println(e.getMessage());
      }


      
    if (content.indexOf("hello"> -1{
       System.out.println(
    "yes");
      }
     else {
       System.out.println(
    "no");
      }

     }


     上面是個簡單的方法,代碼中有個隱藏的bug。我在維護一個系統(tǒng)的時候就遇到類似的代碼,實際中類似的BUG隱藏
    的更深!在對系統(tǒng)業(yè)務(wù)和代碼不是很很熟悉的情況下,我推薦如下寫法:

     1 public void writeFile(File f) {
     2  String content = null;
     3  try {
     4   byte[] b = new byte[1024];
     5   FileInputStream in = new FileInputStream(f);
     6   in.read(b);
     7   content = new String(b);
     8  }
     catch (Exception e) {
     9   content="";
    10   //如果異常發(fā)生的話,content可能為空
    11   //下面對content的操作就有可能發(fā)生NullPointerException異常
    12   System.out.println(e.getMessage());
    13  }

    14  //下面操作有可能發(fā)生NullPointerException異常
    15  if (content.indexOf("hello"> -1{
    16   System.out.println("yes");
    17  }
     else {
    18   System.out.println("no");
    19  }

    20 }


     一般來說異常處理不推薦直接system.out.println打印出來!
     幾條建議:
     如果無法處理某個異常,那就不要捕獲它。
      ☆ 如果捕獲了一個異常,請不要胡亂處理它。
      ☆ 盡量在靠近異常被拋出的地方捕獲異常。
      ☆ 在捕獲異常的地方將它記錄到日志中,除非您打算將它重新拋出。
      ☆ 按照您的異常處理必須多精細來構(gòu)造您的方法。
      ☆ 需要用幾種類型的異常就用幾種,尤其是對于應(yīng)用程序異常。
      ☆ 把低層次的異常封裝成層次較高程序員較容易理解的異常。
      ☆ 盡量輸出造成異常的完整數(shù)據(jù)
      ☆ 盡量捕獲具有特定含義的異常:比如SqlException,而不是簡單地捕獲一個Exception


      希望對大家有幫助!

    參考:
    http://www.tkk7.com/usherlight/archive/2006/10/23/76782.html

    posted @ 2009-12-09 16:59 二胡 閱讀(394) | 評論 (0)編輯 收藏

            cookie在web開發(fā)中應(yīng)用的比較多!瀏覽器默認(rèn)的接受cookie的,但是如果瀏覽器禁止了cookie,會出現(xiàn)什么情況了?
            在此我測試了如下系統(tǒng):gmail,163郵箱,126郵箱,tom郵箱
            我在瀏覽器禁用cookie的情況下,登陸上述4郵箱!
            Gmail:
            正確輸入用戶名密碼后,系統(tǒng)給出如下提示:
            

        163郵箱:

     正確輸入用戶名密碼后,系統(tǒng)給出如下提示:讓我搞不清楚是用戶名密碼錯誤還是其它錯誤!



        126郵箱
        
        正確輸入用戶名密碼后,系統(tǒng)給出如下提示:讓我搞不清楚是用戶名密碼錯誤還是其它錯誤!

        
        tom郵箱

        正確輸入用戶名密碼后,系統(tǒng)給出如下提示:居然提示我是"非法請求"

     

            從上面測試中感受到不同的用戶體驗.對大多數(shù)做web開發(fā)的人來說,判斷瀏覽器是否支持Cookie并不是什么難事!難的是對細節(jié)的處理!
            也許我們與優(yōu)秀的產(chǎn)品差距最大的是對細節(jié)的處理!
            
            附: 我測試用的是IE6.0

    posted @ 2009-12-08 15:03 二胡 閱讀(1766) | 評論 (4)編輯 收藏

     關(guān)于溝通,大家都知道其重要性!但是,在實際工作中有不少人做的不夠好,也包括我自己!
     客戶提出的問題,原因大概有一下幾種!
     一、客戶對軟件系統(tǒng)不熟悉,把屬正常情況的現(xiàn)象誤以為是問題
         這時候就需要我們聽清楚客戶的描述,然后根據(jù)客戶的描述一步步的確認(rèn)其操作等!
         確保用戶的操作的正確性。
     二、系統(tǒng)的bug
       一般要了解如下情況!
       2.1 who:誰操作系統(tǒng)的時候出問題了!一般記錄系統(tǒng)的登陸名
       2.2 when:在什么時候操作出問題了!
       2.3 how:怎么操作的!這個比較重要,一般記錄的是操作步驟!
       2.4 contact:客戶的聯(lián)系方式,郵件還是電話等。
       2.4 feedback:給客戶的反饋,答復(fù)什么時候解決此問題!
       2.5 follow:既跟蹤,確??蛻粢呀?jīng)解決此問題!而不能簡單告訴用戶怎么做,在此之后最后跟用戶確認(rèn)一下此問題是否解決!
       
       我的感受:聽客戶的意見,然后確認(rèn)!反復(fù)之!
       
    posted @ 2009-12-08 11:01 二胡 閱讀(163) | 評論 (0)編輯 收藏

            在Web開發(fā)中常用到Cookie,所以有時需要判斷客戶端瀏覽器是否禁用Cookie!我看了一個gmail的頁面原碼!它是這樣寫的,如下:

    var c="jscookietest=valid";
    document.cookie=c;
    if(document.cookie.indexOf(c)==-1)
    location="html/zh-CN/nocookies.html";
    //不支持Cookie

    原理是:先對Cookie賦值,然后再讀取
    希望對大家有用!
    posted @ 2009-12-07 09:17 二胡 閱讀(2253) | 評論 (1)編輯 收藏

         JavaScript中的null和undefined,感覺有點易混淆!把Ecma-262下載下來看了看!摘要如下:

         Undefined Value
    The undefined value is a primitive value used when a variable has not been assigned a value.
    4.3.10 Undefined Type
    The type Undefined has exactly one value, called undefined.
    4.3.11 Null Value
    The null value is a primitive value that represents the null, empty, or non-existent reference.
    4.3.12 Null Type
    The type Null has exactly one value, called null.

    感興趣的可以看看如下文章:
    http://www.tkk7.com/hulizhong/archive/2009/10/22/299430.html
    posted @ 2009-12-05 13:45 二胡 閱讀(228) | 評論 (0)編輯 收藏

    使用聚集索引  
      聚集索引確定表中數(shù)據(jù)的物理順序。聚集索引類似于電話簿,后者按姓氏排列數(shù)據(jù)。由于聚集索引規(guī)定數(shù)據(jù)在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。  
       
      聚集索引對于那些經(jīng)常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。例如,如果應(yīng)用程序執(zhí)行的一個查詢經(jīng)常檢索某一日期范圍內(nèi)的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然后檢索表中所有相鄰的行,直到到達結(jié)束日期。這樣有助于提高此類查詢的性能。同樣,如果對從表中檢索的數(shù)據(jù)進行排序時經(jīng)常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節(jié)省成本。  
       
      當(dāng)索引值唯一時,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇員   ID   列   emp_id   查找特定雇員的最快速的方法,是在   emp_id   列上創(chuàng)建聚集索引或   PRIMARY   KEY   約束  
       
       
      使用非聚集索引  
      非聚集索引與課本中的索引類似。數(shù)據(jù)存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數(shù)據(jù)的存儲位置。索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規(guī)定)。如果在表中未創(chuàng)建聚集索引,則無法保證這些行具有任何特定的順序。  
       
      與使用書中索引的方式相似,Microsoft&reg;   SQL   Server™   2000   在搜索數(shù)據(jù)值時,先對非聚集索引進行搜索,找到數(shù)據(jù)值在表中的位置,然后從該位置直接檢索數(shù)據(jù)。這使非聚集索引成為精確匹配查詢的最佳方法,因為索引包含描述查詢所搜索的數(shù)據(jù)值在表中的精確位置的條目。如果基礎(chǔ)表使用聚集索引排序,則該位置為聚集鍵值;否則,該位置為包含行的文件號、頁號和槽號的行   ID   (RID)。例如,對于在   emp_id   列上有非聚集索引的表,如要搜索其雇員   ID   (emp_id),SQL   Server   會在索引中查找這樣一個條目,該條目精確列出匹配的   emp_id   列在表中的頁和行,然后直接轉(zhuǎn)到該頁該行。  

    -------------------------------------------------------分割線-------------------------------------------------------
            在工作中遇見了SQL性能問題,最后在同事的幫助下解決了此問題:就是通過建聚集索引的方式解決的!
             原來的SQL中有如下的where語句:
             and  datediff(day, date1,'2009-1-01')<=

         and  datediff(day, date1,'2009-2-03')>=

            在date1建了聚集索引,SQL修改如下:
              and   date1>='2009-1-01'

         and  date1<='2009-2-03' 

             去掉了datediff函數(shù),因為用函數(shù)的話就不會用到date1的聚集索引! 在此記錄一下,以備后查!
        
    posted @ 2009-12-04 15:19 二胡 閱讀(162) | 評論 (0)編輯 收藏

         在一些框架中看到了類似這樣的寫法:+new Date();感覺有些怪,查閱了相關(guān)資料和一些網(wǎng)友的幫助.對此用法解釋如下,希望對大家有所幫助,不合適的地方請大家指正!
    一,對于引用類型對象(我指的是String,Date,Object,Array,Function,Boolean)的+運算符運算過程如下!
        1,首先調(diào)用此對象的valueOf方法,得到返回數(shù)值A(chǔ)
        2,然后把此數(shù)值A(chǔ)轉(zhuǎn)換成數(shù)字,得到的是最終數(shù)值 

        我的測試如下:
       
    function w(s){
          document.writeln("<br/>");
          document.writeln(s);
          document.writeln("<br/>-----------------------------");
          }
       String.prototype.valueOf=function(){return 1;};
       w(+new String("sss"));//輸出1
       String.prototype.valueOf=function(){return "a";};
        w(+new String("sss"));//輸出NaN
      
      
       Date.prototype.valueOf=function(){return 1;};
       w(+new Date());//輸出1
       Date.prototype.valueOf=function(){return "a";};
        w(+new Date());//輸出NaN
      
       Object.prototype.valueOf=function(){return 1;};
       w(+{});//輸出1
       Object.prototype.valueOf=function(){return "a";};
        w(+{});//輸出NaN
      
       Array.prototype.valueOf=function(){return 1;};
       w(+[]);//輸出1
       Array.prototype.valueOf=function(){return "a";};
        w(+[]);//輸出NaN
      
       var s=function(){};
       Function.prototype.valueOf=function(){return 1;};
       w(+s);//輸出1
       Function.prototype.valueOf=function(){return "a";};
        w(+s);//輸出NaN
      
       Boolean.prototype.valueOf=function(){return 1;};
       w(+new Boolean());//輸出1
       Boolean.prototype.valueOf=function(){return "a";};
       w(+new Boolean());//輸出NaN
    二,對于基本數(shù)據(jù)數(shù)據(jù)類型,其值轉(zhuǎn)換成數(shù)字
        w(+5);//輸出5
        w(+true);//輸出1
        w(+false);//輸出0
        w(+"ss");//輸出NaN
        w(+"111");//輸出111

    posted @ 2009-12-04 10:00 二胡 閱讀(1142) | 評論 (0)編輯 收藏

        在看gmail頁面原碼的時候,有類似(new Date).getTime()/(new Image).src的寫法.這樣的寫法與new Date().getTime()有什么不同?這樣寫有什么好處呢?
    不明白,那位知道給說一下!
    posted @ 2009-12-03 13:34 二胡 閱讀(1141) | 評論 (1)編輯 收藏

          最近領(lǐng)導(dǎo)安排我做手機軟件開發(fā)(j2me),領(lǐng)一手機專做測試!今天不經(jīng)意見看了手機的短信收件箱,
    短信主要有如下:
      1.1     周立波的"我為財狂"手機視頻免費看(可惜俺聽不懂上海話)
      1.2     移動的短信回執(zhí)服務(wù)推薦
      1.3     基金推薦(既然你提醒投資有風(fēng)險了,還買它干啥)
      1.4     航班、機票推薦(哥們一直坐火車)
      1.5     某星級酒店招聘(哥們不是帥哥,不符條件)
      1.6     放高利貸的(聽說是驢打滾利)
      1.7     <風(fēng)聲>經(jīng)典鏡頭免費看
      1.8     給個卡號讓匯錢的(你呀誰啊,我不認(rèn)識,而且發(fā)了2條)

          呵呵,列舉一下!博你一笑!
    posted @ 2009-12-03 10:56 二胡 閱讀(172) | 評論 (0)編輯 收藏

    SQL Server 中對已經(jīng)定義的變量賦值的方式用兩種,分別是 SET 和 SELECT。
    對于這兩種方式的區(qū)別,SQL Server 聯(lián)機叢書中已經(jīng)有詳細的說明,但很多時候我們
    并沒有注意,其實這兩種方式還是有很多差別的。

    SQL Server推薦使用 SET 而不是 SELECT 對變量進行賦值。
    當(dāng)表達式返回一個值并對一個變量進行賦值時,推薦使用 SET 方法。

    下表列出 SET 與 SELECT 的區(qū)別。請?zhí)貏e注意紅色部分。

    set select
    同時對多個變量同時賦值 不支持 支持
    表達式返回多個值時 出錯 將返回的最后一個值賦給變量
    表達式未返回值 變量被賦null值 變量保持原值

    下面以具體示例來說明問題:

    create table chinadba1(
    userid int ,
    addr varchar(128)
    )
    go
    insert into chinadba1(userid,addr) values(1,'addr1')
    insert into chinadba1(userid,addr) values(2,'addr2')
    insert into chinadba1(userid,addr) values(3,'addr3')
    go

    表達式返回多個值時,使用 SET 賦值


    declare @addr varchar(128)
    set @addr = (select addr from chinadba1)
    /*
    --出錯信息為
    服務(wù)器: 消息 512,級別 16,狀態(tài) 1,行 2
    子查詢返回的值多于一個。當(dāng)子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達式時,這種情況是不允許的。
    */
    go

    表達式返回多個值時,使用 SELECT 賦值

    declare @addr varchar(128)
    select @addr = addr from chinadba1
    print @addr --結(jié)果集中最后一個 addr 列的值
    --結(jié)果: addr3
    go

    表達式未返回值時,使用 SET 賦值

    declare @addr varchar(128)
    set @addr = '初始值'
    set @addr = (select addr from chinadba1 where userid = 4 )
    print @addr --null值
    go

    表達式未返回值時,使用 SELECT 賦值

    declare @addr varchar(128)
    set @addr = '初始值'
    select @addr = addr from chinadba1 where userid = 4
    print @addr --保持原值
    go

    需要注意的是,SELECT 也可以將標(biāo)量子查詢的值賦給變量,如果標(biāo)量子查詢不返回值,則變量被置為 null 值。
    此時與 使用 SET 賦值是完全相同的
    對標(biāo)量子查詢的概念大家應(yīng)該都覺得陌生,舉個例子就能說明

    declare @addr varchar(128)
    set @addr = '初始值'
    --select addr from chinadba1 where userid = 4 為標(biāo)量子查詢語句
    select @addr = (select addr from chinadba1 where userid = 4)
    print @addr --null值
    go

    轉(zhuǎn)自:http://blog.csdn.net/shouyenet1/archive/2008/12/13/3511818.aspx

    posted @ 2009-12-02 17:10 二胡 閱讀(206) | 評論 (0)編輯 收藏

         十字路口過多了,發(fā)現(xiàn)一個小現(xiàn)象!就是在黃燈亮起后,綠燈亮起之前!不少人蜂擁而過,大家都想著快一點到馬路對面!就是過馬路的過程中,有不少插曲:被自行車碰到了,因馬路不平而崴腳了,等等!在人生的道路上也有類似的現(xiàn)象!為了更好的奔向目標(biāo),請大家毋忘腳下!
    posted @ 2009-12-02 08:54 二胡 閱讀(169) | 評論 (0)編輯 收藏

    轉(zhuǎn) http://blog.csdn.net/rjchen/archive/2009/11/19/4835865.aspx

    管理下屬方面有三個人對我影響比較大。

    第一個人是金山前任CEO的雷軍先生,他說過一句話我印象很深,他說”什么是執(zhí)行力,執(zhí)行力就是Double Check!”

    第二個人是阿里巴巴的前COO李琪先生,他有個著名的‘16字真言’,一直被我奉為與下屬共同成長的寶典。

     

    第三個人是臺灣的星云大師,他說過“最高明的管理,就是不管理”,他在《包容的智慧》一書中講過這樣一個故事。

    “有一年,臺灣陷入經(jīng)濟恐慌,大家為了年終獎金、加薪,游行示威,社會動蕩不安。我們佛光山也有退伍老兵在這里服務(wù),我跟他們開玩笑說,你們也拿個小旗子,到我們的門口搖旗,要求加薪。一位老兵說,我們不要。我問為什么?他說:比金錢更寶貴的東西,就是尊重。我們在這里服務(wù),法師們每天見到我們,合掌、點頭,跟我們講老伯早、老伯好,我們在精神上就很富有了。我們不要加薪,我們要人尊重。”

    最后,星云大師說這個世界上人與人相處,最好的管理就是尊重他,愛護他,善用他。

     

    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/rjchen/archive/2009/11/19/4835865.aspx

    posted @ 2009-12-01 17:39 二胡 閱讀(178) | 評論 (0)編輯 收藏

         在工作中,有如下需求.通過case的嵌套解決了此問題!特此記錄一下!(我用的是sql server 2005)
        
        

    在查詢的時候,有這樣的一個需求
    數(shù)據(jù)庫內(nèi)容如下:
    iD  description

    1     TableClassA.getName()
    2     TableClassB.getName(),exception
    3     TableClassC,getName()
    4     TableClassD,getName().null

    我想查詢輸入以下結(jié)果:
    iD  description

    1     TableClassA
    2     TableClassB
    3     TableClassC
    4     TableClassD
    及查詢的結(jié)果是.號或,前的內(nèi)容
    SQL如下

    select id,
         case
        when (CHARINDEX(',',description)>0) and (CHARINDEX('.',description)>0)
         then --在這個做了判斷,如同時包含.和,則判斷.和,那個在前
          case 
           when CHARINDEX(',',description)>CHARINDEX('.',description) then left(description,CHARINDEX('.',description)-1)
           when CHARINDEX(',',description)<CHARINDEX('.',description) then left(description,CHARINDEX(',',description)-1)
          end
        when (CHARINDEX(',',description)>0) then left(description,CHARINDEX(',',description)-1)
        when (CHARINDEX('.',description)>0) then left(description,CHARINDEX('.',description)-1)
        else description
       end
       as description
      from  tablename

    posted @ 2009-12-01 16:28 二胡 閱讀(899) | 評論 (0)編輯 收藏

    轉(zhuǎn) http://blog.csdn.net/g9yuayon/archive/2007/02/23/1512851.aspx

    從Jao的Programming Musing 看到的:Babar Kazar 整理了一堆經(jīng)典論文。Jao強烈建議每個嚴(yán)肅的程序員讀每篇論文,說它們都或多或少有意思。粗粗掃了一下,很多論文都沒讀過。挑了些俺多少知道一點的介紹。


    · An axiomatic basis for computer programming C. A. R. Hoare
    Tony Hoare名下的公理化語義(Axiomatic Semantics)。著名的Hoare Triples, P{C}Q, 就是從這里來的。論文不長,雙列6頁。前輩們就是這樣的,6頁紙就能開宗立派。不像俺,6頁紙連介紹部分都寫不周全。哪位老大想知道怎么證明程序正確。前置條件,不變條件,后置條件的妙用,可以用這篇論文開牙。
    · Communicating Sequential Processes (CSP) C. A. R. Hoare
    Hoare, 又見Hoare。其實也正常。牛人之牛,就在于成就深廣。鏈接的文檔應(yīng)該不算論文,而算專著。260頁。從1985年推出到現(xiàn)在20多年過去,這本書的引用率在CS歷史上排名第三,可見其影響之深。對并發(fā)編程有強烈興趣的老大可以去鉆研一把。我沒讀過。
    · Call-by-name, call-by-value, and the lambda calculus Gordon Plotkin
    沒讀過。只見LtU介紹過。Gordon老大這篇論文的要點之一是要想順利地對程序進行推導(dǎo),就需要有合適的lambda理論。想深入理解call-by-name,call-by-value,和lambda算子的老大們可以上了。
    · Towards a theory of type structure John C. Reynolds
    號稱經(jīng)典中的經(jīng)典。不過也沒讀過。類型系統(tǒng)一直是編程語言研發(fā)的熱點,也是非常有趣的方向――類型系統(tǒng)的編程好比讓機器證明一系列定理。Reynolds在論文里討論了什么才是正確的類型結(jié)構(gòu),和句法正確必須獨立于任何具體的類型表達形式,并且給出了帶類型的lambda算子的一種擴展,允許他描述用戶自定義類型和多態(tài)函數(shù)。滿篇公式,有勇氣去讀的老大要有心理準(zhǔn)備。
    · Structured Programming with go to Statements Donald E. Knuth
    這篇論文詳細結(jié)構(gòu)化編程時討論了什么時候用goto,什么時候不用goto。高爺爺精細務(wù)實的態(tài)度非常值得學(xué)習(xí)。高老太爺用了一輩子goto(MIX和MMIX程序里沒了Goto怎么玩兒得轉(zhuǎn)囁?),豈能輕易被Dijkstra對goto的批評嚇退?他仔細探討了幾種不同的程序,考察goto用在那些程序里的利弊。最后得出結(jié)論,goto在某些程序里仍然高效實用。雖然論文是30年前的,但里面的分析手法和利用goto的優(yōu)化技術(shù)至今可用。
    · Definitional interpreters for higher-order programming languages John C. Reynolds
    這篇文章俺喜歡。”Metacircular”這個性感的概念就是在這篇論文里首次提出的。想深入了解用一門語言寫出的解釋器定義這門語言自身的神奇理念,這篇論文是必讀材料。有興趣的老大可以先讀SICP的第四章。
    · An APL Machine 1970 Philip S. Abrams
    只知道APL是門有歷史意義的語言。順便說一句,APL這個名字太土了。A Programming Language ==APL。象什么話嘛。


    · The Anatomy of a Large-Scale Hypertextual Web Search Engine Sergey Brin and Lawrence Page
    網(wǎng)絡(luò)是個大的矩陣(transition probability matrix of Markov Chain)。網(wǎng)頁的聲譽(page rank)就是這個巨大矩陣的principle eigenvector的某個元素。嗯,反正我只有佩服的份兒。
    · No Silver Bullet: Essence and Accidents of Software Engineering Frederic P. Brooks, Jr.
    地球銀都知道。不用俺多嘴了。
    · A Mathematical Theory of Communication Claude Shannon
    Bell實驗室當(dāng)年輝煌一時。出了名的叫人做A,結(jié)果發(fā)明了B。香農(nóng)老大就是其中杰出代表。香農(nóng)進了Bell實驗室后,居然沒人吩咐他干嘛。香農(nóng)老大轉(zhuǎn)念一想,自己喜歡數(shù)學(xué),Bell的生意盡在通訊,干嘛不看看把數(shù)學(xué)應(yīng)用到通訊上有什么結(jié)果呢?于是1948年這篇論文問世樂。搞通訊的人崩潰樂?,F(xiàn)代信息理論就誕生樂。
    · Bayesian Networks without Tears
    貝葉斯理論熱了好幾年了。估計還會繼續(xù)熱下去?,F(xiàn)在信息越來越多,我們已經(jīng)審美疲勞。大家渴望的不是信息,而是知識??總€人的力量把信息提煉成知識太慢,我們需要機器的幫忙。機器學(xué)習(xí)不熱都難,而貝葉斯理論在機器學(xué)習(xí)里有很好的應(yīng)用。這篇文章行為淺顯,可以輕松讀完。對了,那個人人喝罵的微軟回形針的智能引擎就是用貝葉斯網(wǎng)絡(luò)實現(xiàn)的。
    · A Universal Algorithm for Sequential Data Compression
    沒讀過。無恥地找個借口:我們系開信息理論課的時候,俺剛好畢業(yè)。
    · A Relational Model of Data for Large Shared Data Banks 1970 Edgar F. Codd
    沒有關(guān)系代數(shù),人類將會怎樣?Codd劃時代的論文奠定了現(xiàn)代數(shù)據(jù)庫的基礎(chǔ)。嘿嘿,其實俺也沒有讀過這篇論文。順便說一句,現(xiàn)在的ORM試圖把data schema和對象系統(tǒng)映射起來。問題是,data schema只是對關(guān)系的一種表達方式而已,還和具體的系統(tǒng)實現(xiàn)有關(guān)。也許把對象間的結(jié)構(gòu)和關(guān)系映射起來才是正道。
    · Let's Build a Compiler 1988-1995
    教你一步一步寫出一坨編譯器。不算論文吧。一篇相當(dāng)不錯的指南。
    · Gauging Similarity via N-Grams: Language-Independent Sorting... Marc Damashek
    第一次聽說
    · Worse Is Better Richard P. Gabriel
    網(wǎng)上膾炙人口的文章。很有教育意義。簡單說,worse is better包括下面幾點:
    -- 簡單:設(shè)計要簡單。但如果接口和實現(xiàn)不能兩全,追求實現(xiàn)的簡單。文章里給出的Unix vs Multics的例子非常有意思。
    -- 正確:程序必須在所有可見的方面正確。其它地方,如果簡單和正確不能兩全,追求簡單。
    -- 一致性:程序不能太不一致。但為了簡單,可以在少數(shù)地方不一致。
    -- 完備性:程序應(yīng)該盡可能照顧到重要的地方,但是不能犧牲簡潔。
    強烈推薦。
    · Hints on Programming Language Design C.A.R. Hoare
    Hoare對設(shè)計語言的經(jīng)驗總結(jié)。這些經(jīng)驗至今有效。文章很容易讀,讀后絕對增長程序設(shè)計的功力。
    · Why Functional Programming Matters John Hughes
    為普通程序員準(zhǔn)備的大餐,所以寫得通俗。沒有公式,也沒有拗口的術(shù)語。著重展示了Fold和Map的強大抽象能力。不由想到我在大學(xué)里修的一門課,編程語言。課是好課,老師是一流老師。課上我們學(xué)習(xí)了淺顯的程序語言理論,重點學(xué)習(xí)了函數(shù)編程(用Common Lisp)和邏輯編程(用Prolog)。這門課徹底改變我對編程的理解,明白了imperative programming和OO programming外還有精彩世界。至今想來都覺得幸運。那門課的作業(yè)也很有意思,實現(xiàn)一個駐留內(nèi)存的數(shù)據(jù)庫,支持關(guān)系代數(shù)里的常見操作。
    · On the Expressive Power of Programming Languages Matthias Felleisen
    沒讀過。待讀。
    · The Early History Of Smalltalk Alan Kay
    還有什么好說的呢?Alan Kay這個名字說明一切。30年前Alan Kay就做出來Smalltalk,現(xiàn)在想來仍然讓人驚嘆。引一段文章Alan Kay評述Smalltalk的話:In computer terms, Smalltalk is a recursion on the notion of computer itself. Instead of dividing "computer stuff" into things each less strong than the whole--like data structures, procedures, and functions which are the usual paraphernalia of programming languages--each Smalltalk object is a recursion on the entire possibilities of the computer. Thus its semantics are a bit like having thousands and thousands of computer all hooked together by a very fast network. Questions of concrete representation can thus be postponed almost indefinitely because we are mainly concerned that the computers behave appropriately, and are interested in particular strategies only if the results are off or come back too slowly.
    · Computer Programming as an Art Donald E. Knuth
    高老太爺在1974年圖靈獎儀式上的致詞。真是頂尖geek的風(fēng)范啊。高太爺在文章里解釋了問什么他的書取名為《編程的藝術(shù)》。明顯他對人們談到編程時把科學(xué)置于藝術(shù)之上很不了然。高爺爺追溯“藝術(shù)”的詞源,說藝術(shù)的本意就是技能,也是技術(shù)和技巧兩次的起源。從這里開始,他開始討論藝術(shù)和科學(xué)的關(guān)聯(lián),討論藝術(shù)在編程里的表現(xiàn)形式和意義。用他的話說,他作為教育者和作者的畢生目標(biāo)就是叫人寫美妙的程序。讀起來讓人心潮彭湃的說。
    · The next 700 programming languages Peter J. Landin
    42年前的論文,影響深遠。Peter在論文里描述的函數(shù)語言ISWIM(If You See What I Mean)現(xiàn)在沒有幾個人知道了。但他對lambda算子的推崇和對函數(shù)語言的論述影響了后來的函數(shù)語言設(shè)計。
    · Recursive Functions of Symbolic Expressions and their Computation by Machine (Part I) 1960 John McCarthy
    47年前提出LISP的那篇著名論文。沒讀過。動態(tài)類型檢查,Garbage Collection, 遞歸函數(shù),S-expression, 程序及數(shù)據(jù)。。??芍^貢獻輝煌。


    · FORTH - A Language for Interactive Computing Charles H.Moore
    只知道Forth是一門stack oriented的編程語言,影響了后來的一些語言,比如CAT。其它的就不知道了。
    · Teach Yourself Programming in Ten Years 2001 Peter Norvig
    大牛之所以為大牛,原因之一就是目光深遠。這篇文章批評那些《24秒學(xué)會C++》之類教材的無稽,討論了學(xué)習(xí)編程,從菜鳥變成鯤鵬的方法。中文版已經(jīng)傳得滿世界都是,趕快找來看吧。Peter Norvig的網(wǎng)站上還有很多高質(zhì)量的文章。強烈推薦一讀。
    · The Definition and Implementation of a Computer Language based on constraints Guy Lewis Steele Jr.
    好像是Guy Steels的碩士論文。沒讀過。
    · Growing a Language Guy Lewis Steele Jr.
    好文!G老大在OOPSLA 98上的主題演講。G老大主張應(yīng)該采取漸進的方式設(shè)計一門可以被自由擴展的語言(LISP圈子里的牛人們多半都持這種觀點吧?)。這篇演講稿針對該觀點做了精練地論述。說起進化的觀點,可以參看另外一篇好文章,SICP作者之一,Jay Sussman的近作。
    · Epigrams on Programming Alan J. Perlis
    A老大發(fā)表的一系列關(guān)于編程的格言。幽默而深刻。每讀必笑。笑后必哭。嗯嗯嗯,夸張一下。不要當(dāng)真。
    · The Complexity of Theorem Proving Procedures Stephen A. Cook
    仙風(fēng)道骨的庫克爺爺?shù)某擅?。這篇文章一出,好比有人在加州荒漠里發(fā)現(xiàn)第一塊狗頭金,立刻掀起開發(fā)加州的狂潮。計算復(fù)雜性理論迅速遍地開花。相比這篇論文開創(chuàng)性的貢獻,庫克因此得到圖靈獎不過小小點綴。NP-Complete在這篇論文里被嚴(yán)格定義。更重要的是,庫克證明了第一個NP-Complete的問題,SAT(Boolean Satisfiability Problem)。有了SAT,再加上折磨了無數(shù)學(xué)生的Polynomial Reducibility,無數(shù)的NPC問題就出現(xiàn)樂。。。別看俺在這里唾沫橫飛,當(dāng)年做有關(guān)計算理論的證明題還是相當(dāng)吃力的,沒有少熬夜。奇怪的是,某一天我給同學(xué)講解我的解法,NPC的相關(guān)定義突然變得清晰起來。當(dāng)初讓我絞盡腦汁的證明竟然變得相當(dāng)機械。后來知道,給人講解(包括寫作)是非常有效地學(xué)習(xí)方法。懷著備課的目標(biāo)讀文章,假設(shè)自己給別人講解正在讀的文章,有助快速理解所讀內(nèi)容。SAT的證明相當(dāng)復(fù)雜,我反正沒有耐心讀完。
    · Steps Toward Artificial Intelligence Marvin Minsky
    AI的奠基論文。不過我沒讀過。
    · The Original 'Lambda Papers' Guy Steele and Gerald Sussman
    一系列講解lambda算子和scheme設(shè)計的經(jīng)典論文。學(xué)scheme時讀過,對理解scheme的設(shè)計理念很有幫助。


    · The UNIX Time-Sharing System Dennis Ritchie and Ken Thompson
    作者不用介紹了吧?這篇文章里介紹的Unix特性早為人熟知。不過第八部分(VIII Perspective)討論了作者的設(shè)計理念,仍然值得一讀。


    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/g9yuayon/archive/2007/02/23/1512851.aspx

    posted @ 2009-11-25 14:53 二胡 閱讀(276) | 評論 (0)編輯 收藏

    轉(zhuǎn) http://xiaofengtoo.javaeye.com/blog/149129
    利用Eclipse進行重構(gòu)

    重構(gòu)和單元測試是程序員的兩大法寶,他們的作用就像空氣和水對于人一樣,平凡,不起眼,但是意義深重。預(yù)善事,必先利器,本文就介紹怎樣在Eclipse中進行重構(gòu)。

    本文介紹了Eclipse支持的重構(gòu)種類,它們的含義,以及怎樣重構(gòu)。本文同時也可以作為學(xué)習(xí)重構(gòu)知識的快速手冊。

    什么是重構(gòu)
    重構(gòu)是指在保持程序的全部功能的基礎(chǔ)上改變程序結(jié)構(gòu)的過程。重構(gòu)的類型有很多,如更改類名,改變方法名,或者提取代碼到方法中。每一次重構(gòu),都要執(zhí)行一系列的步驟,這些步驟要保證代碼和原代碼相一致。

    為什么重構(gòu)很重要   
             手工重構(gòu)時,很容易在代碼中引入錯誤,例如拼寫錯誤或者漏掉了重構(gòu)的某一步。為了防止引入錯誤,在每次重構(gòu)前后,都要執(zhí)行充分的測試。你可能會好奇重構(gòu)是否是值得的。
    重構(gòu)的理由很多。你可能想要更新一段代碼很爛的程序?;蛘咦畛醯脑O(shè)計隊伍都不在了,現(xiàn)在隊伍中每人了解這些程序。為了更新,你必須要重新設(shè)計構(gòu)建程序來滿足你的需求。另一個原因是原來的設(shè)計無法使你將新的特性添加進去。為了添加進去,你要重構(gòu)這些代碼。第三個原因是一個自動重構(gòu)的工具可以為你自動生成代碼,例如Eclipse中的重構(gòu)功能。使用重構(gòu),你可以在重寫盡量少的代碼和仍保持軟件功能的同時,使代碼的邏輯性更好。


    測試
    在重構(gòu)時,測試是十分重要的。應(yīng)為重構(gòu)改變了代碼的結(jié)構(gòu),你要保證重構(gòu)后代碼的功能沒有被改變。手工重構(gòu)時,一個好的測試套是必須的。使用自動重構(gòu)工具是,測試也是必要的,但不需要很頻繁,應(yīng)為自動重構(gòu)工具不會產(chǎn)生手工重構(gòu)時的那些錯誤,如拼寫錯誤。
    Eclipse中可以使用JUnit方便的為程序創(chuàng)建測試代碼,具體方法不在本文描述。


    Eclipse中的重構(gòu)
    JDT,Eclipse中的Java插件,能夠?qū)ava項目,類,或成員進行多種類型的自動重構(gòu)??梢圆扇《喾N方法快速的為Java項目中的某個元素進行重構(gòu)。
    為某些元素進行重構(gòu)的前提是你必須選中他們。你可以在多個視圖中選擇這些元素,像大綱視圖或包瀏覽視圖??梢园醋trl或Shift鍵,在視圖中選擇多個元素。另外一種選擇的方法是使該元素的編輯區(qū)高亮顯示,或者把鼠標(biāo)定位到源程序文件。在選中希望重構(gòu)的元素后,可以從重構(gòu)菜單的下拉項選擇重構(gòu),也可以從右鍵單擊后彈出菜單中選擇重構(gòu)子菜單。同時,Eclipse還提供了重構(gòu)的快捷鍵操作。
    某些重構(gòu)可以應(yīng)用在任意元素上,有些則只能用在特定類型的元素上,如類或方法。在本文的最后的表格中,列出了重構(gòu)能夠應(yīng)用的元素類型,以及重構(gòu)的快捷鍵。
    Eclipse中,所有的重構(gòu)都能夠在正式執(zhí)行之前預(yù)覽一下。在重構(gòu)對話框中點擊“預(yù)覽”按鈕,可以查看所有將要被改變的地方。唯一沒有預(yù)覽按鈕的的重構(gòu)是Pull Up,在它的重構(gòu)向?qū)е?,到最后,預(yù)覽面板總會出現(xiàn)。可以將其中的個別變化反選掉,這樣這些改變就不會生效。


    撤銷和重做
           在重構(gòu)菜單中有撤銷和重做項。他們和編輯菜單中的撤銷重做不同。即使重構(gòu)改變了很多文件,編輯菜單中的撤銷重做只會更改當(dāng)前文件。重構(gòu)菜單中的撤銷和重做則會對一次重構(gòu)的所有文件進行撤銷和重做操作。但是在使用時,它們有一定的限制。
    重構(gòu)后,無論重構(gòu)改變了文件與否,如果任一個文件被另外改變而且保存了,你就無法撤銷或重做這個重構(gòu)。假如一個文件在重構(gòu)中被修改了,然后又被編輯了,但是還沒有保存,這時就會有錯誤信息提示,如果你想要撤銷或重做該重構(gòu),必須撤銷未保存的文件。
    只要注意到以上的限制條件,你就可以隨心所欲的對重構(gòu)進行撤銷或重做。你甚至能夠編譯,運行你的程序測試一下,然后再撤銷該重構(gòu),只要你沒有改變并保存任何文件。

    Eclipse中的重構(gòu)類型
           如果你看一下Eclipse的重構(gòu)菜單,可以看到四部分。第一部分是撤銷和重做。其他的三部分包含Eclipse提供的三種類型的重構(gòu)。

           第一種類型的重構(gòu)改變代碼的物理結(jié)構(gòu),像Rename和Move。第二種是在類層次上改變代碼結(jié)構(gòu),例如Pull Up和Push Down。第三種是改變類內(nèi)部的代碼,像Extract Method和Encapsulate Field。這三部分的重構(gòu)列表如下。

    類型1 物理結(jié)構(gòu)
    l         Rename
    l         Move
    l         Change Method signature
    l         Convert Anonymous Class to Nested
    l         Convert Member Type to New File

    類型2 類層次結(jié)構(gòu)
    l         Push Down
    l         Push Up
    l         Extract Interface
    l         Generalize Type (Eclipse 3)
    l         User Supertype Where Possible
    類型3 類內(nèi)部結(jié)構(gòu)
    l         Inline
    l         Extract Method
    l         Extract Local Variable
    l         Extract Constant
    l         Introduce Parameter
    l         Introduce Factory
    l         Encapsulate Field



    Rename:
           Rename用來改變一個Java元素的名字。雖然你可以手工改變Java文件Java元素的名字,但是這樣不能自動更新所有引用它們的文件或Java元素。你必須在項目中搜索文件然后手工替換這些引用。很可能你就會漏掉一個或者改錯一個。Rename重構(gòu)會智能的更新所有有此引用的地方。
           有時候,Java元素的名字不是很明了,或者它的功能已經(jīng)改變了。為了保持代碼的可讀性,該元素的名字也要更新。使用Rename重構(gòu),能夠十分快捷的更新元素的名字和所有引用它的地方。
           要為一個Java元素改名,在包瀏覽視圖或大綱視圖選中該元素,從重構(gòu)菜單中選擇Rename項,或者使用快捷鍵Alt+Shift+R。Rename對話框會出現(xiàn)。在這里添入新的名字,選擇是否更新該元素的引用。點擊預(yù)覽按鈕,會打開預(yù)覽窗口,在這里,你可以看到那些內(nèi)容會被改變。點擊OK按鈕,重構(gòu)結(jié)束。

    Move
           Move和Rename很相似。它用來把元素從一個位置移動到另一個位置。它主要用來將類從一個包移動到另一個包。選中要移動的元素,從重構(gòu)菜單中選擇Move,或者使用快捷鍵,Alt+Shift+V,在彈出窗口中選擇要移動的目的地。你仍然可以用預(yù)覽功能檢查一下有什么改變,也可以按OK按鈕直接讓其生效。


    Change Method Signature
           更改方法簽名能夠改變參數(shù)名,參數(shù)類型,參數(shù)順序,返回類型,以及方法的可見性。也可以添加,刪除參數(shù)。
           要執(zhí)行此重構(gòu),選擇要重構(gòu)的方法,選中重構(gòu)菜單的更改方法簽名項,會出現(xiàn)更改方法簽名對話框。

    在此對話框中選擇方法的修飾詞,返回類型,參數(shù)。參數(shù)的添加,修改,移動,刪除可以通過右邊的按鈕控制。當(dāng)添加新的參數(shù)時,會自動賦予默認(rèn)值。凡是調(diào)用此方法的地方都會用此默認(rèn)值作為參數(shù)輸入。
           改變方法簽名可能在方法中導(dǎo)致問題,如果有問題,當(dāng)你點擊預(yù)覽或OK時,會被標(biāo)記出來。
          

    Move Members Type to New File
           此重構(gòu)將嵌套類轉(zhuǎn)為一個單獨類。將會創(chuàng)建一個新的Java文件包含此嵌套類。選中要重構(gòu)的類,在重構(gòu)菜單上選擇Move Member Type to New File項,在彈出的對話框中添入要創(chuàng)建的實例的名字。

          

    Push Down
           此重構(gòu)將算中的方法和成員從父類中移動到它的直接子類中,所有下推的方法都可選作為一個抽象方法留在父類中。下推重構(gòu)對于重新構(gòu)建項目設(shè)計十分有用。
             選擇若干方法或成員,從重構(gòu)菜單中選擇下推項,彈出下推對話框。
            
           在此對話框中,可以分別選擇方法或成員,所有選中元素都會移動到當(dāng)前類的子類中。當(dāng)點擊Add Required按鈕時,所有已選擇元素所必需的元素也會自動選上,此行為并不能保證所有必須的元素都能自動選中,還是需要人工確認(rèn)。當(dāng)有方法被選中時,編輯按鈕就會可用,點擊編輯按鈕,彈出編輯對話框。在其中可以選擇為選中方法在當(dāng)前類中遺留抽象方法,還是在當(dāng)前類中刪除這些方法。雙擊一天選中的方法,也可以打開編輯對話框。在方法的Action列點擊,會出現(xiàn)一個下拉列表,可以在其中選擇遺留抽象方法還是在當(dāng)前類中刪除方法。按回車鍵確認(rèn)編輯結(jié)果。


    Pull Up
           上移與下推類似,也是在類之間移動方法和成員。上移將方法或成員從一個類移動到它的一個父類中。選中若干個方法或成員,在重構(gòu)菜單中選擇上移項,上移向?qū)яR上會出現(xiàn)。
           在選擇目標(biāo)類多選框中,列出了當(dāng)前類繼承的所有父類。你只能將方法或成員移動到它們其中的一個里面。
           如果在選中方法的Action列,被設(shè)置成在目標(biāo)類中聲明抽象方法,那么在目標(biāo)類的非抽象子類中創(chuàng)建必須的方法選項變?yōu)榭蛇x。當(dāng)它選中時,目標(biāo)類的所有子類,如果它們中沒有選中的方法,則會為它們創(chuàng)建選中的方法。
           和在下推中一樣,選擇多個方法,點擊編輯按鈕,或者雙擊一個方法,都會打開編輯成員對話框。其中有兩個選項,上移和在目標(biāo)類中聲明抽象方法。上移只是簡單的復(fù)制方法到到父類中,并提供選擇是否在當(dāng)前類中刪除該方法。在目標(biāo)類中聲明抽象方法會在父類中創(chuàng)建一個選中方法的抽象方法,如果父類不是抽象類則置為抽象類,最后選中方法留在當(dāng)前類中。和在下推中一樣,也可以點擊Action列,可以在出現(xiàn)的下拉列表中選擇。
           如果方法的Action列選為上移,在下一步的向?qū)е?,將會要求你選擇是否在當(dāng)前類中刪除這些方法,選中的方法會在當(dāng)前類中被刪除。
           在向?qū)У娜我庖徊蕉伎梢园赐瓿砂粹o,結(jié)束重構(gòu)操作,此時按照默認(rèn)規(guī)則進行重構(gòu)。


    Extract Interface
           提煉接口可以從一個存在的類中創(chuàng)建一個接口。你可以選擇在接口中包含著個類的那些方法。選中一個類,從重構(gòu)菜單選擇提煉接口項,就可以打開提煉接口對話框。
           這此對話框中添入接口的名字,選擇希望包含的方法,在這個列表里面只列出了公共方法。選中改變對類[當(dāng)前類名]的應(yīng)用為對接口的引用選擇框,將把所有對當(dāng)前類的引用更新為對此接口的引用。


    Generalize Type
           泛化類型重構(gòu)可以將一個聲明對象的類型改變?yōu)樗某?,選擇變量,參數(shù),對象成員,方法返回類型,然后選擇重構(gòu)菜單的泛化類型項。在打開的泛化類型對話框,選擇希望的新類型,然后點擊完成按鈕,結(jié)束重構(gòu)。


    Use Supertype Where Possible
           使用超類會將對一個特定類型的引用改變?yōu)閷λ某惖囊谩_x擇一個類,選中重構(gòu)菜單的使用超類項,會打開使用超類對話框。選中希望的超類類型,點擊完成按鈕完成重構(gòu)。重構(gòu)后,instanceof 表達式也會做相應(yīng)的替換。



    Inline
           內(nèi)聯(lián)是用代碼或值來取代調(diào)用方法的地方,靜態(tài)final對象成員,或局部變量。比如說,如果你內(nèi)聯(lián)一個方法調(diào)用,這個調(diào)用的地方就會被替換為該方法體。要內(nèi)聯(lián)一個方法,靜態(tài)final對象成員,局部變量,選中這些元素,在重構(gòu)菜單中選擇內(nèi)聯(lián)項,或者使用快捷鍵Alt + Ctrl + I。在隨后打開的內(nèi)聯(lián)對話框,你可以選擇是否要內(nèi)聯(lián)所有的調(diào)用,或者是選擇的調(diào)用。如果選擇所有調(diào)用,你還可以選擇是否刪除聲明本身。

    Extract Method
           如果方法中含有過多特定的操作,方法太長,或者其中的某段代碼被多次使用,這時,可以用提煉方法重構(gòu)將這部分代碼提取到單獨的方法中。在Eclipse中應(yīng)用此重構(gòu)方便快捷。
           選中要提煉的代碼段,從重構(gòu)菜單中選擇提煉方法項,或者使用快捷鍵Alt + Shift + M。
           在提煉方法對話框中,輸入新方法的名字,選擇修飾詞,選擇是否讓新方法拋出運行時異常。在底部提供了新方法的預(yù)覽。


    Extract Local Variable
           使用一個變量來代替一個表達式有很多好處。如果表達式在多處被使用,這樣能夠提高性能,而且也提高了代碼的可讀性。要把一個表達式提煉為局部變量,選擇要提煉的表達式,從重構(gòu)菜單中選擇提煉局部變量項,或者使用快捷鍵Alt + Shift + L。
           在提煉局部變量對話框中輸入新變量的名字,選擇是否要替換所有的表達式,是否使此變量為final。在對話框的底部提供變量的預(yù)覽。
          
    Extract Constant
           提煉常量與提煉局部變量很相似,唯一的區(qū)別是提煉常量重構(gòu)可以選擇提煉出的常量的修飾詞,而且此常量將作為類的成員變量。

    Introduce Parameter
           介紹參數(shù)重構(gòu)在方法中創(chuàng)建新的參數(shù),然后用此新參數(shù)取代局部變量或者成員變量的實例。要是用此重構(gòu),選中方法中一個成員變量或局部變量的引用,然后從重構(gòu)菜單中選擇介紹參數(shù)項。


    Introduce Factory
           工廠是用來創(chuàng)建新對象,返回新創(chuàng)建對象的方法。你可以選擇一個類的構(gòu)造方法,從重構(gòu)菜單中選擇介紹工廠項,應(yīng)用此重構(gòu),為此類創(chuàng)建工廠方法。
          
    在介紹工廠對話框,輸入工廠方法的名字和需要工廠方法創(chuàng)建的對象的名字。選擇構(gòu)造方法的修飾詞是否為私有。
           點擊OK按鈕后,在指定的類中會出現(xiàn)此指定工廠方法。此方法創(chuàng)建一個當(dāng)前類的實例,然后返回此實例。

    Convert Local Variable to Field
           轉(zhuǎn)換局部變量為成員變量重構(gòu),將方法內(nèi)的變量聲明移動到方法所在類中,使該變量對整個類可見。選擇一個局部變量,從重構(gòu)菜單中選擇轉(zhuǎn)換局部變量為成員變量項,隨后打開配置的對話框。
          
           在此對話框中,添入成員變量的名字,選擇修飾詞,選擇在哪里實例化此成員變量。隨后的聲明為靜態(tài),聲明為final 選擇項是否可以使用,取決于實例化位置的選擇情況。

    Encapsulate Field
           要正確的實踐面向?qū)ο缶幊蹋瑧?yīng)該將成員變量的修飾詞置為私有,提供相應(yīng)的訪問器來訪問這些成員變量。但是這些操作很煩瑣。如果使用了封裝成員變量重構(gòu),則十分方便。選擇一個成員變量,從重構(gòu)菜單中選擇封裝成員變量項。

           在封裝局部變量對話框中,添入Getter, Setter方法的名字,選擇新方法在哪個方法后出現(xiàn)。選擇合適的修飾詞。應(yīng)用了此重構(gòu)會創(chuàng)建兩個新方法,將此成員變量的修飾詞置為私有,將對此成員變量的引用改變?yōu)閷π路椒ǖ囊谩?

    重構(gòu)項列表:
           下表從Eclipse幫助中提取,列出了各種重構(gòu)支持的Java資源類型,對應(yīng)的快捷鍵。

    名字 可應(yīng)用的Java元素 快捷鍵
    Undo 在一次重構(gòu)后可執(zhí)行 Alt + Shift + Z
    Redo 在一次撤銷重構(gòu)后可執(zhí)行 Alt + Shift + Y
    Rename 對方法,成員變量,局部變量,方法參數(shù),對象,類,包,源代碼目錄,工程可用。 Alt + Shift + R
    Move 對方法,成員變量,局部變量,方法參數(shù),對象,類,包,源代碼目錄,工程可用。 Alt + Shift + V
    Change Method Signature 對方法可用。 Alt + Shift + C
    Convert Anonymous Class to Nested 對匿名內(nèi)部類可用。  
    Move Member Type to New File 對嵌套類可用。  
    Push Down 對同一個類中成員變量和方法可用。  
    Pull Up 對同一個類中成員變量和方法,嵌套類可用。  
    Extract Interface 對類可用。  
    Generalize Type 對對象的聲明可用。  
    Use Supertype Where Possible 對類可用。  
    Inline 對方法,靜態(tài)final類,局部變量可用。 Alt + Shift + I
     
    Extract Method 對方法中的一段代碼可用。 Alt + Shift + M
     
    Extract Local Variable 對選中的與局部變量相關(guān)的代碼可用。 Alt + Shift + L
     
    Extract Constant 對靜態(tài)final類變量,選中的與靜態(tài)final類變量相關(guān)的代碼可用。  
    Introduce Parameter 對方法中對成員變量和局部變量的引用可用。  
    Introduce Factory 對構(gòu)造方法可用。  
    Convert Local Variable to Field 對局部變量可用。 Alt + Shift + F
    Encapsulate Field 對成員變量可用。  


           本文介紹了Eclipse提供的各種重構(gòu)。這些重構(gòu)易于使用,可以確保代碼重構(gòu)更加方便安全。而且可以自動生成代碼以提高生產(chǎn)率。
           某些重構(gòu)改變了某些類的結(jié)構(gòu),但沒有改變項目中其他類的結(jié)構(gòu),如下推,上移重構(gòu)。這時,就要確保項目中所有對改變元素的引用都要被更新。這也是為什么要有一個好的測試套。同時,你也要更新測試套中的對改變元素的引用。所以說,重構(gòu)和單元測試的有機結(jié)合對于軟件開發(fā)是多么的重要。
    posted @ 2009-11-25 10:49 二胡 閱讀(991) | 評論 (0)編輯 收藏

     在jquery-1.3.1.js中發(fā)現(xiàn)了如下寫法:
     var
     // Will speed up references to window, and allows munging its name.
     window = this,
     // Will speed up references to undefined, and allows munging its name.
     undefined
     
     從上面的注釋可以得知:這些寫是為了提高性能
     
     查了一下資料,得知這些寫為什么能提高性能。
     首先,jquery-1.3.1.js的代碼都寫在一個匿名函數(shù)中,上面的代碼就定義2個局部變量:window和undefined;
     window變量被賦值為this(既window對象,感覺有點迷惑人,只不過2個變量名一樣而已);局部變量undefined沒有
     賦值,但是在js代碼預(yù)編譯的時候會被賦值為window.undefined;這樣在匿名函數(shù)內(nèi)部引用window,undefined時候
     直接引用局部變量window,undefined就可以了!不用再向上引用全局變量的window,undefined;

     從本質(zhì)上說,這里利用了函數(shù)的作用域效果;當(dāng)在函數(shù)內(nèi)部調(diào)用window,undefined對象時候,系統(tǒng)會先在本地作用域
     查找,找到就調(diào)用;找不到,就到上一級的作用域查找;如此類推;
     
     不合適的地方,請大家指出!
    posted @ 2009-11-05 18:19 二胡 閱讀(1647) | 評論 (1)編輯 收藏

    轉(zhuǎn) http://www.cnblogs.com/yslow/archive/2009/04/29/1446236.html

    耦合異步腳本

    英文原文地址

     

    最近我的工作都是圍繞異步加載外部腳本(loading external scripts asynchronously) 展開。當(dāng)外部腳本以普通方式加載時(<script src="...">) 會阻塞頁面內(nèi)所有其它資源的下載和腳本下方元素的渲染.你可以查看將腳本放在底部(Put Scripts at the Bottom)的樣例的效果. 異步加載腳本會避免阻塞行為進而更快的加載頁面.

    異步加載腳本產(chǎn)生的問題是內(nèi)嵌腳本使用外部腳本中定義的符號的問題. 如果內(nèi)嵌腳本使用了異步加載的外部腳本符號,競爭條件下可能會導(dǎo)致未定義的符號錯誤。因此有必要保證異步腳本和內(nèi)嵌腳本以下面方式進行耦合:在異步腳本下載完畢之前內(nèi)嵌腳本不能被執(zhí)行。

    下面有幾種方式耦合異步腳本.

    • window’s onload - 內(nèi)嵌腳本可以嘗試使用窗口的onload事件. 實現(xiàn)起來非常簡單,但是內(nèi)嵌腳本不會盡可能早的執(zhí)行.
    • script’s onreadystatechange - 內(nèi)嵌腳本可以嘗試使用腳本的onreadystatechangeonload 事件(在所有流行的瀏覽器里面均需要你自己來實現(xiàn)) 代碼比較長而復(fù)雜,但是可以確保在腳本下載完畢之后馬上執(zhí)行內(nèi)嵌腳本.
    • hardcoded callback - 外部腳本可以修改為通過一個回調(diào)函數(shù)(callback function)來明確的調(diào)用內(nèi)嵌腳本,如果外部腳本和內(nèi)嵌腳本是一個團隊開發(fā)的話,這樣是沒有問題的,但如果使用第3方的腳本,這就提供不了必要的靈活性。

    在這個博客帖子里我討論兩個問題: 如何使用異步腳本加快頁面,如何通過Degrading Script Tags模式耦合外部腳本和內(nèi)嵌腳本. 我通過我最近剛剛完成的一個項目UA Profiler results sortable圖表來演示. 我還使用了Stuart Langridge的 sorttable排序腳本. 把他的腳本增加到我的頁面并排序結(jié)果耗費了我大約5分鐘.通過增加一點使用異步腳本和耦合腳本的工作量我可以使這個頁面提高30%的加載速度

    普通Script標(biāo)記

    最初我使用普通的方法(<script src="...">)將Stuart Langridge的sorttable排序腳本加入到UA Profiler, 例子見Normal Script Tag. HTTP瀑布圖見圖1.

    普通Script標(biāo)記
    圖1: 普通Script標(biāo)記的瀑布圖

    表格排序工作正常,但由于它使頁面慢了許多,我并不滿意. 圖1中我們可以看到腳本(sorttable-async.js)阻塞了頁面內(nèi)唯一的后繼HTTP請求(arrow-right- 20X9.gif), 造成頁面加載變慢. 瀑布圖是使用Firebug 1.3 beta來產(chǎn)生的(你也可以使用httpwatch基調(diào)網(wǎng)絡(luò)webwatch工具來查看效果)。 新版本的Firebug在onload事件發(fā)生的地方標(biāo)記了一條紅豎線. (藍豎線是DOMContentLoaded事件.) 對于普通Script標(biāo)記 來說, onload 事件在第487毫秒產(chǎn)生.

    異步加載腳本

    對初始頁面渲染來說,腳本sorttable-async.js是沒有必要的 - 表格被渲染之后才會排序. 這種情況(外部腳本不會被初始頁面使用)是可以使用異步腳本加載的主要特征 . 例子異步加載腳本 使用DOM方式異步加載:

    var script = document.createElement('script');
    script.src = "sorttable-async.js";
    script.text = "sorttable.init()"; // 這會在下面解釋
    document.getElementsByTagName('head')[0].appendChild(script);

    異步加載腳本的HTTP瀑布圖見圖2。注意我是如何使用異步加載技術(shù)來避免阻塞行為的 - sorttable-async.js和arrow-right-20×9.gif 被同時下載. onload時間為429毫秒.

    異步加載腳本
    圖2: 異步加載腳本的HTTP瀑布圖

    John Resig介紹的 Degrading Script Tags 模式

    例子異步加載腳本使頁面加載更快了,但仍舊有進一步提高的空間. 默認(rèn)sorttable排序是通過在onload事件中增加sorttable.init()來觸發(fā)。當(dāng)外部腳本被加載完畢后內(nèi)嵌腳本立即調(diào)用sorttable.init()能進一步提升性能. 在這種情況下,我使用的API僅僅是一個函數(shù),但是我將嘗試一個足夠靈活的模式來支持更復(fù)雜的情況。

    前面我列出了各種內(nèi)嵌腳本和外部異步腳本耦合的方法: window’s onload, script’s onreadystatechange, 和 hardcoded callback. 這里,我使用了來自John Resig的被稱為Degrading Script Tags模式的技術(shù)。 John描述了如何耦合一個內(nèi)嵌腳本和外部腳本,例如:

    <script src="jquery.js">
    jQuery("p").addClass("pretty");
    </script>

    他提到的這個方法是使內(nèi)聯(lián)腳本在外部腳本下載完畢之后才開始執(zhí)行。使用這種方式耦合內(nèi)嵌腳本和外部腳本有幾個好處:

    • 更簡單 - 將2個script標(biāo)記替換為1個script標(biāo)記
    • 更清晰 - 內(nèi)嵌代碼依賴于外部腳本的關(guān)系更為明顯
    • 更安全 - 如果外部腳本下載失敗,內(nèi)嵌腳本就不會執(zhí)行,避免拋出未定義的符號錯誤

    當(dāng)使用異步加載外部腳本時這也是一個很棒的模式。為了使用這個技術(shù),我必須修改我的內(nèi)嵌代碼和外部腳本. 對于內(nèi)嵌代碼, 我增加了第3行來設(shè)置 script.text的屬性. 為了耦合代碼, 我在sorttable-async.js末尾增加了如下代碼:

    var scripts = document.getElementsByTagName("script");
    var cntr = scripts.length;
    while ( cntr ) {
    var curScript = scripts[cntr-1];
    if ( -1 != curScript.src.indexOf('sorttable-async.js') ) {
    eval( curScript.innerHTML );
    break;
    }
    cntr--;
    }

    此代碼遍歷網(wǎng)頁的所有腳本,直到它找到腳本塊本身 (此時腳本的src屬性包含sorttable-async.js),然后利用eval將代碼(sorttable.init ())增加到腳本觸發(fā)運行. (備注:雖然內(nèi)嵌代碼使用text屬性增加代碼內(nèi)容,但是需要使用innerHTML獲取代碼. 這是代碼跨瀏覽器工作的必要保證) 經(jīng)過這樣的優(yōu)化,外部腳本不會阻塞其它資源的下載,同時,內(nèi)嵌代碼也會盡可能早的執(zhí)行.

    延遲加載

    通過延遲加載能更快的加載頁面 (通過onload事件動態(tài)加載). 例如 Lazyload 是在onload 事件中包含如下代碼:

    window.onload = function() {
    var script = document.createElement('script');
    script.src = "sorttable-async.js";
    script.text = "sorttable.init()";
    document.getElementsByTagName('head')[0].appendChild(script);
    }

    這種情況絕對需要腳本耦合技術(shù),在onload事件里面的代碼sorttable.init()不會被執(zhí)行,因為此時onload事件已經(jīng)發(fā)生,而sorttable-async.js還沒被下載。延遲加載的好處是使onload事件更快的發(fā)生,見圖3。紅豎線表明onload事件發(fā)生在第320毫秒.

    延遲加載
    圖3: 延遲加載的HTTP瀑布圖

    結(jié)論

    通過避免通常的阻塞行為,異步加載腳本和延遲加載腳本可以提高網(wǎng)頁的加載時間. 下面是增加不同版本的sorttable排序例子代碼:

    以上時間指的是onload事件發(fā)生的時間。



    posted @ 2009-11-04 15:25 二胡 閱讀(232) | 評論 (0)編輯 收藏

    posted @ 2009-11-03 09:40 二胡 閱讀(211) | 評論 (0)編輯 收藏

            在JAVA原代碼中可以看到ArrayList類的實現(xiàn).其中定義ArrayList類的時候,如下

            public class ArrayList<E> extends AbstractList<E>
                implements List<E>, RandomAccess, Cloneable, java.io.Serializable
            
            在這里我有個疑惑,ArrayList繼承了AbstractList,而AbstractList實現(xiàn)了List接口.為什么不直接這樣寫呢,如下:

            public class ArrayList<E> extends AbstractList<E>
                implements RandomAccess, Cloneable, java.io.Serializable

            那個能解釋一下!謝謝先!
    posted @ 2009-10-27 08:53 二胡 閱讀(1888) | 評論 (10)編輯 收藏

    主站蜘蛛池模板: 亚洲中文字幕乱码一区| 黄桃AV无码免费一区二区三区 | 91大神免费观看| 又爽又高潮的BB视频免费看| av大片在线无码免费| 日韩高清在线免费观看| 亚洲午夜无码久久久久| 亚洲成a人片在线不卡一二三区 | 久久亚洲私人国产精品| 亚洲性色AV日韩在线观看| 日韩免费的视频在线观看香蕉| 亚洲XX00视频| 亚洲av乱码一区二区三区按摩| 最好看最新的中文字幕免费| 区久久AAA片69亚洲| 亚洲xxxxxx| 国产精品免费αv视频| 免费精品一区二区三区在线观看| 亚洲精品电影天堂网| 美女一级毛片免费观看| 女性无套免费网站在线看| 亚洲人成在久久综合网站| 一级毛片全部免费播放| 国产精品亚洲成在人线| 特级一级毛片免费看| 国产精品麻豆免费版| 久久亚洲sm情趣捆绑调教 | 久久国产精品成人片免费| 亚洲精品99久久久久中文字幕| 亚洲AV无码AV吞精久久| 成人超污免费网站在线看| 亚洲人成网站日本片| 91精品成人免费国产片| 国产精品亚洲综合专区片高清久久久 | 亚洲日本VA午夜在线电影| 99爱在线精品免费观看| 亚洲第一香蕉视频| 久久青草精品38国产免费| 国产精品亚洲精品日韩已满| 国产一区二区三区免费观在线| 国产亚洲精品精品国产亚洲综合|