JDK源碼分析之Set類詳解

               摘要: JDK源碼分析Set類,因為Set類是經常要用到的,那我們知道JDK源碼中Set類在其中不可以有相同的元素,那么判斷這個元素是否相同是如何實現的呢,我們看下下面這張圖:    對JDK源碼分析之Set類在這張類圖上,首先我們看見一個經典模式的應用,那就是適配器模式,我們把map接口的對象,包裝成為了Set的接口;在代碼中,我們來分析一下; 首先,我...  閱讀全文

          posted @ 2010-02-05 14:28 鍵盤動物 閱讀(288) | 評論 (0)編輯 收藏

          java 命名規范

          標識符類型 命名規則 例子 
          包 
          (Packages) 一個唯一包名的前綴總是全部小寫的ASCII字母并且是一個頂級域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166標準所指定的標識國家的英文雙字符代碼。包名的后續部分根據不同機構各自內部的命名規范而不盡相同。這類命名規范可能以特定目錄名的組成來區分部門(department),項目(project),機器(machine),或注冊名(login names)。 com.sun.eng 
          com.apple.quicktime.v2 
          edu.cmu.cs.bovik.cheese 
          類 
          (Classes) 命名規則:類名是個一名詞,采用大小寫混合的方式,每個單詞的首字母大寫。盡量使你的類名簡潔而富于描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用,像URL,HTML) class Raster; 
          class ImageSprite; 
          接口(Interfaces) 命名規則:大小寫規則與類名相似 interface RasterDelegate; 
          interface Storing; 
          方法 
          (Methods) 方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。 run(); 
          runFast(); 
          getBackground(); 
          變量(Variables) 除了變量名外,所有實例,包括類,類常量,均采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。變量名不應以下劃線或美元符號開頭,盡管這在語法上是允許的。 
          變量名應簡短且富于描述。變量名的選用應該易于記憶,即,能夠指出其用途。盡量避免單個字符的變量名,除非是一次性的臨時變量。臨時變量通常被取名為i,j,k,m和n,它們一般用于整型;c,d,e,它們一般用于字符型。 char c; 
          int i; 
          float myWidth; 
          實例變量(Instance Variables) 大小寫規則和變量名相似,除了前面需要一個下劃線 int _employeeId; 
          String _name; 
          Customer _customer; 
          常量(Constants) 類常量和ANSI常量的聲明,應該全部大寫,單詞間用下劃線隔開。(盡量避免ANSI常量,容易引起錯誤) static final int MIN_WIDTH = 4; 
          static final int MAX_WIDTH = 999; 
          static final int GET_THE_CPU = 1; 

          posted @ 2010-02-04 14:07 鍵盤動物 閱讀(296) | 評論 (0)編輯 收藏

          重構,改善既有代碼的設計 第二章(1)

          @關于間接層的概念。

          間接層就是我們所提煉出來的小函數。本來事情是可以交給一個大函數一次性去執行完的,可是我們為什么還要把他分割成小函數,再委托小函數這個間接層去完成事情呢。以下是作者總結出來的三點間接層的好處。

          1、 允許邏輯共享。也就是說小函數做的這些小事情,子類也同樣可以做,而且跟其他事情互不干擾。

          2、間接層給了我們一個解釋自己意圖的機會。間接層允許我們選擇最適合表達我們意圖的名字來命名,那在調用這些函數的時候,我一看他們的名字就知道他們可能會做些什么事情。就像Justin昨天寫的那個 A()

                                      {

                                               …

                                               ….

                                               ….   200 

          }

          改成

          A()

          {

                   A1();

                   A2();

                   A3();

          }

          A1()

          {

                   …….

          }

          A2(){….}

          A3(){….}

          這樣你在整理邏輯的時候,頭腦會很清醒。(因為名字是我們賦予他們的意義)

          3、將變化加以隔離,當我需要修改一些邏輯的時候,我可以把我在整個項目中掀起的波瀾降低很多。

          @在有些開源的框架內,我的接口名字已經公布了,可是現在我在重構的時候需要改變這些接口名字,改怎么辦呢?

          這時候可以保留舊的接口,然后在舊的接口中用新接口來實現邏輯。一直持續到所有用戶都開始使用新接口的時候,再把這個舊接口去掉。

          @這個世界不存在一條萬能的定律能解決一切問題(我曾經想象要是有這么一條定律就好了,這也是很多哲學家,科學家所追求過的),所以不要試圖用重構來拯救整個世界。有以下幾種情況重構不適用。

          當代碼已經腐朽到連正常功能都不能運行的時候,也許重寫(從頭再來一遍)比重構要來的簡單。

          有的時候臨近發布,我們要趕眼前的時間,就不應重構了。重構其實是一劑中藥,雖然藥效很好,但是效果卻也來的慢一些。如果是趕時間發布,那就不要寄希望于重構了。重構是我們欠的債,很多時候我們都是舉債來發布的,但是債都是有利息的,“過于復雜的代碼所造成的【維護和擴展的額外開銷】就是利息。一定的利息我們可以承受,但是利息過高就會被拖垮。“出來混總是要還的”。最近幾次發布都通宵,這也許就是我們的重構債欠的有點過多的信號。是時候來償還一些債了。


          posted @ 2010-02-04 11:36 鍵盤動物 閱讀(260) | 評論 (1)編輯 收藏

          日志級別的選擇:Debug、Info、Warn、Error還是Fatal?

          在此描述您的新便箋。軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
              × Debug
              × Info
              × Warn
              × Error
              × Fatal
          一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

          === Debug ===
          這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。

          因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。

          當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

          === Info ===
          這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。

          從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

          === Warn、Error、Fatal ===
          警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:

          所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。

          所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

          所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。

          也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

          === 一些疑惑 ===
          不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?

          例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?

          個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。
          軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
              × Debug
              × Info
              × Warn
              × Error
              × Fatal
          一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

          === Debug ===
          這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。

          因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。

          當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

          === Info ===
          這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。

          從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。
          軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
              × Debug
              × Info
              × Warn
              × Error
              × Fatal
          一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

          === Debug ===
          這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。

          因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。

          當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

          === Info ===
          這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。

          從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

          === Warn、Error、Fatal ===
          警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:

          所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。

          所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

          所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。

          也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

          === 一些疑惑 ===
          不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?

          例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?

          個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。

          目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。
          {{{
          log.Warn("message");
          System.Diagnostics.Debug.Fail("警告", "message");
          }}}
          Debug.Fail 將導致編譯為 Debug 輸出時,會彈出一個消息警告窗口,這可保證在測試、調試階段不漏過任何一個潛在的錯誤。而在發布時,Release 編譯的輸出不會包括 Debug 語句,這就不會打擾最終用戶,而錯誤信息仍然能通過 log 記錄到日志中
          === Warn、Error、Fatal ===
          警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:

          所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。

          所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

          所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。

          也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

          === 一些疑惑 ===
          不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?

          例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?
          軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
              × Debug
              × Info
              × Warn
              × Error
              × Fatal
          一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

          === Debug ===
          這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。

          因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。

          當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

          === Info ===
          這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。

          從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

          === Warn、Error、Fatal ===
          警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:

          所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。

          所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

          所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。

          也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

          === 一些疑惑 ===
          不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?

          例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?

          個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。

          目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。
          {{{
          log.Warn("message");
          System.Diagnostics.Debug.Fail("警告", "message");
          }}}
          Debug.Fail 將導致編譯為 Debug 輸出時,會彈出一個消息警告窗口,這可保證在測試、調試階段不漏過任何一個潛在的錯誤。而在發布時,Release 編譯的輸出不會包括 Debug 語句,這就不會打擾最終用戶,而錯誤信息仍然能通過 log 記錄到日志中
          個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。

          目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。
          {{{
          log.Warn("message");
          System.Diagnostics.Debug.Fail("警告", "message");
          }}}
          Debug.Fail 將導致編譯為 Debug 輸出時,會彈出一個消息警告窗口,這可保證在測試、調試階段不漏過任何一個潛在的軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
              × Debug
              × Info
              × Warn
              × Error
              × Fatal
          一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

          === Debug ===
          這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。

          因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。

          當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

          === Info ===
          這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。

          從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

          === Warn、Error、Fatal ===
          警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:

          所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。

          所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

          所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。
          軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
              × Debug
              × Info
              × Warn
              × Error
              × Fatal
          一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

          === Debug ===
          這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。

          因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。

          當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

          === Info ===
          這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。

          從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

          === Warn、Error、Fatal ===
          警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:

          所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。

          所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

          所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是http://www.cnblogs.com/shwen99/rss盡可能地保留系統有效數據并停止運行。

          也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

          === 一些疑惑 ===
          不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?

          例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?

          個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。

          目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。
          {{{
          log.Warn("message");
          System.Diagnostics.Debug.Fail("警告", "message");
          }}}
          Debug.Fail 將導致編譯為 Debug 輸出時,會彈出一個消息警告窗口,這可保證在測試、調試階段不漏過任何一個潛在的錯誤。而在發布時,Release 編譯的輸出不會包括 Debug 語句,這就不會打擾最終用戶,而錯誤信息仍然能通過 log 記錄到日志中
          也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

          === 一些疑惑 ===
          不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?

          例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?

          個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。

          目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。
          {{{
          log.Warn("message");
          System.Diagnostics.Debug.Fail("警告", "message");
          }}}
          Debug.Fail 將導致編譯為 Debug 輸出時,會彈出一個消息警告窗口,這可保證在測試、調試階段不漏過任何一個潛在的錯誤。而在發布時,Release 編譯的輸出不會包括 Debug 語句,這就不會打擾最終用戶,而錯誤信息仍然能通過 log 記錄到日志中錯誤。而在發布時,Release 編譯的輸出不會包括 Debug 語句,這就不會打擾最終用戶,而錯誤信息仍然能通過 log 記錄到日志中
          目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。
          {{{
          log.Warn("message");
          System.Diagnostics.Debug.Fail("警告", "message");
          }}}
          Debug.Fail 將導致編譯為 Debug 輸出時,會彈出一個消息警告窗口,這可保證在測試、調試階段不漏過任何一個潛在的錯誤。而在發布時,Release 編譯的輸出不會包括 Debug 語句,這就不會打擾最終用戶,而錯誤信息仍然能通過 log 記錄到日志中

          posted @ 2010-01-25 10:10 鍵盤動物 閱讀(11693) | 評論 (1)編輯 收藏

          ubuntu下 漂亮的 桌面日歷 (linux下通用)

          http://www.rainlendar.net/cms/index.php?option=com_rny_download&Itemid=32

          posted @ 2010-01-22 11:23 鍵盤動物 閱讀(713) | 評論 (0)編輯 收藏

          tnsnames.ora配置小結

          listener.ora、 tnsnames.ora和sqlnet.ora這3個文件是關系oracle網絡配置的3個主要文件,其中listener.ora是和數據庫服務器端 相關,而tnsnames.ora和sqlnet.ora這2個文件不僅僅關系到服務器端,主要的還是和客戶端關系緊密。
          檢查客戶端oracle網絡的時候可以先檢查sqlnet.ora文件:

          # SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora
          # Generated by Oracle configuration tools.

          SQLNET.AUTHENTICATION_SERVICES= (NTS)

          NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)

          ##NAMES.DEFAULT_DOMAIN = us.oracle.com

          上面的sqlnet.ora文件說明:
          SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示采用os認證,在數據庫服務器上,可以利用sqlplus “/ as sysdba”。一般這個配置在windows上是ok的,在unix環境下可能會有問題,一般在unix下可以去掉這個配置。

          NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;如果tnsnames解析不到,將使用hostname解析;如果hostname解析不 到,將采用onames進行解析。

          被注釋掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示采用默認的domain name為us.oracle.com,在tnsnames.ora中如果配置對應的解析,如果原來的別名oralocal,那么,當啟用這個參數后,在 tnsnames中的配置要改成oralocal.us.oracle.com。在使用tnsping時或者sqlplus登錄時,只需寫前面的別名,系 統會自動加上后面的domain name來進行解析。

          檢查完畢sqlnet.ora,一般都會發現是使用tnsname來解析別名的,那么,tnsnames.ora中可以有哪些配置種類呢?

          # TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
          # Generated by Oracle configuration tools.


          ###### 一般的配置 ##################################
          ORALOCAL =
            
          (DESCRIPTION =
              
          (ADDRESS_LIST =
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
              
          )
              
          (CONNECT_DATA =
                
          (SERVER = DEDICATED)
                
          (SERVICE_NAME = oralocal)
              
          )
            
          )


          ###### 這樣也行,用SID=oralocal ###########################
          ORALOCAL_2 =
            
          (DESCRIPTION =
              
          (ADDRESS_LIST =
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
              
          )
              
          (CONNECT_DATA =
                
          (SERVER = DEDICATED)
                
          (SID = oralocal)
              
          )

          ###### RAC的配置(3節點rac) ###############################
          ORALOCAL =
            
          (DESCRIPTION =
            
          (load_balance = yes)
            
          (failover = on)
              
          (ADDRESS_LIST =
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))   
              
          )
              
          (CONNECT_DATA =
                  
          (SERVICE_NAME = oralocal)
                  
          (SERVER = DEDICATED)
                  
          (failover_mode=(type=select)(method=basic)(retries=20)(delay=20))
              
          )
            
          )
            
          ORALOCAL_NODE1 =
             
          (DESCRIPTION =
               
          (ADDRESS_LIST =
                 
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
                 
          )
                 
          (CONNECT_DATA =
                   
          (SERVICE_NAME = oralocal)
                   
          (INSTANCE_NAME = oralocal_node1)
                 
          )
             
          )


          ORALOCAL_NODE2=
             
          (DESCRIPTION =
               
          (ADDRESS_LIST =
                 
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
                 
          )
                 
          (CONNECT_DATA =
                   
          (SERVICE_NAME = oralocal)
                   
          (INSTANCE_NAME = oralocal_node2)
                 
          )
             
          )
             

          ORALOCAL_NODE3 =
             
          (DESCRIPTION =
               
          (ADDRESS_LIST =
                 
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
                 
          )
                 
          (CONNECT_DATA =
                   
          (SERVICE_NAME = oralocal)
                   
          (INSTANCE_NAME = oralocal_node3)
                 
          )
             
          )


            
          )


          ###### DATA GUARD配置(primary庫和standby庫都需要配置)##############
          standby =
            
          (DESCRIPTION =
              
          (ADDRESS_LIST =
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
                  
          )
              
          (CONNECT_DATA =
                    
          (SERVER=DEDICATED)
                    
          (SERVICE_NAME = oralocal)
                
          )
            
          )

          primary =
            
          (DESCRIPTION =
              
          (ADDRESS_LIST =
                
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521))
                  
          )
              
          (CONNECT_DATA =
                    
          (SERVER=DEDICATED)
                    
          (SERVICE_NAME = oralocal)
                
          )
            
          )

          另外需要注意的2點情況:
          (1)如果tnsnames中的service_name配置錯誤,配置成了instance_name了,這個時候會發生tnsping能通,但是 sqlplus連接不上的奇怪情況。報錯ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。這個時候查錯的時候,需要檢查對應的service_name。
          (2)如果遠程數據庫是rac,而且本地客戶端端遠程數據庫處于不同的網段,通過公網鏈接,rac對外的ip映射只有一個,即只映射到一個節點。請注意在 客戶端配置tnsnames的時候按照單機的情況來配置。呵呵,dba不僅僅要學習oracle,了解一些網絡的知識,特別是自己系統的網絡架構,也是需 要的。

          posted @ 2010-01-21 13:48 鍵盤動物 閱讀(266) | 評論 (0)編輯 收藏

          類的設計原則

          1. 開-閉原則(對擴展開放,對修改關閉)
          2. 里氏替換原則(父類的方法都要在子類中實現或者重寫)
          3. 依賴倒轉原則(要針對接口編程,不要針對實現編程)
          4. 接口隔離原則
          5. 合成/聚合復用原則(盡量使用合成/聚合,而不是使用繼承)
          6. 迪米特法則(talk only to your immediate friends)

          posted @ 2009-12-21 10:22 鍵盤動物 閱讀(286) | 評論 (0)編輯 收藏

          ubuntu9.10下面使用google音樂亂碼問題

          用下面命令:sudo rm /etc/fonts/conf.d/49-sansserif.conf 在應用程序->附件->終端 中執行就可以了.已經測試

          posted @ 2009-12-02 11:14 鍵盤動物 閱讀(168) | 評論 (0)編輯 收藏

          Ubuntu安裝apache

          準備工作:下載httpd.2.2.9.tar.gz
          安裝apache2.2
          tar zxvf httpd.2.2.9.tar.gz
          cd httpd.2.2.9
          ./configure --enable-dav --enable-so --prefix=/opt/apache2.2

          說明:--enable-dav允許Apache提供DAV協議支持;--enable-so允許運行時加載DSO模塊, --prefix指定apache的安裝目錄

          make
          make install

          說明:在configure與make很可能會出現一些fail,而往往是因為缺少一些必要的庫,就直接安裝一下apt-get install *****,即可,我安裝出現過三個,反正這個比較直觀

          這樣,apache 應該安裝好了,測試一下,/opt/apache2/bin/apachectl -k start, 在瀏覽器里輸入:http://locahost

          正常情況下應該出現It works!

          posted @ 2009-11-29 22:39 鍵盤動物 閱讀(175) | 評論 (0)編輯 收藏

          windows下安裝grub安裝ubuntu

          1.首先下載ubuntu-9.10-desktop-i386.iso(http://www.ubuntu.com/getubuntu/download)文件
          存放在C盤(ntfx/fat32)的根目錄下;
          2.下載Grub4rDos(http://sourceforge.net/projects/grub4dos),將grldr和grub.exe放入C盤根目錄;
          3.從ubuntu-9.10-desktop-i386.iso文件中復制menu.lst文件到c盤根目錄,在最后加入如下內容:
          title Install ubuntu
          find --set-root /ubuntu-9.10-desktop-i386.iso
          kernel /vmlinuz boot=casper find_iso=/ubuntu-9.10-desktop-i386.iso
          initrd /initrd.gz
          4.復制ubuntu-9.10-desktop-i386.iso里 Casper和 .disk兩個目錄到C盤根目錄;
          5.復制ubuntu-9.10-desktop-i386.iso里Casper目錄中的vmlinuz和initrd.lz文件到C盤根目錄,將initrd.lz文件修改為initrd.gz
          6.修改C盤根目錄下的boot.ini文件,在文件末尾加入下面代碼:
          C:\grldr="GRUB"
          7.重新啟動,在啟動菜單處,選擇Grub,然后再選擇Install Ubuntu就可以開始安裝了
          8.安裝時選擇手動分區,可以保留原來的windows系統
          9.可能會無法卸載isodevice分區(我遇到了)到掛載的時候,同時按下Ctrl+Alt+F2,然后在:后輸入sudo umount -l /isodevice 輸好后,然后回車,再同時按下 Ctrl+Alt+F7,回到安裝界面
          基本上就ok了

          posted @ 2009-11-29 20:34 鍵盤動物 閱讀(622) | 評論 (0)編輯 收藏

          僅列出標題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          新聞分類

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巴林右旗| 绍兴市| 宜良县| 夏河县| 包头市| 唐海县| 千阳县| 黄大仙区| 荆州市| 略阳县| 武威市| 太原市| 九台市| 梅河口市| 长沙县| 洪江市| 光泽县| 樟树市| 平潭县| 锡林郭勒盟| 莎车县| 正宁县| 雅安市| 绍兴县| 城固县| 漯河市| 彰化县| 昌吉市| 丰顺县| 秀山| 吉安市| 临洮县| 井陉县| 荆州市| 马关县| 洪洞县| 绥棱县| 上栗县| 临海市| 宝应县| 庆安县|