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

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

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

    置頂隨筆

    自己寫的一個小程序,做個視頻冒充一下技術宅……


    程序經多次優化,終于能夠達到一個可以接受的性能了……莫言Java無效率,其實重要的還是要精雕細琢。至 少就繪制Julia Set而言,我這個程序比我見過的幾個cpp版本的要快的多。
    項目主頁地址:http://code.google.com/p/juliasetcreator/
    程序下載地址:http://code.google.com/p/juliasetcreator/downloads/list

    posted @ 2010-03-20 17:25 深夜兩點 閱讀(2625) | 評論 (2)編輯 收藏

    2010年5月17日

    例子下載在此

    最近搞了個小實驗,發現Eclipse 插件的類加載的一個問題。Eclipse使用Equinox實現OSGi的框架,可以在插件的配置中確定哪些類expose出去,哪些類不能為外部所見。我發現的問題是,可以通過ClassLoader繞過這個限制,在外部插件中加載到插件里那些不為外部所見的類,并且能夠創建類的實例,可以通過反射調用其方法(當然,如果被加載的類實現了某些接口,也可以通過接口的引用直接調用相應的方法)。

    為了演示這個問題,先在eclipse中創建一個插件UtilityLibrary

    其中utilitylibrary.expose包中的類會暴露給外部,而utilitylibrary.hide包中的類不會暴露給外部。在MANIFEST.MF中增加這個設置:


    VisiableClassVisiableClass類的內容很簡單:
    package utilitylibrary.expose;

    public class VisiableClass {
        
    public VisiableClass() {
            System.out.println(
    "This is VisiableClass");
        }

        
    public String getMessage() {
            
    return "From VisiableClass:\r\n"
                    
    + this.getClass().getClassLoader().toString() + "\t";
        }
    }

    package utilitylibrary.hide;

    public class InvisiableClass {
        
    public InvisiableClass() {
            System.out.println(
    "InvisiableClass");
        }

        
    public String getMessage() {
            
    return "From InvisiableClass:\r\n"
                    
    + this.getClass().getClassLoader().toString() + "\t";
        }
    }


    其實主要就是打印出相應的信息。類代碼幾乎是一樣的。

    下面創建另一個插件UsePlugin,依賴并使用UtilityLibrary中的類。插件其實就是Eclipse自帶的Hello World程序,它會在eclipse 的toolbar上增加一個按鈕,點擊后會彈出一個MessageBox。好,MessageBox上顯示的就是從UtilityLibrary中類的方法的返回值。首先增加插件依賴關系:


    在SampleAction中的Run方法里,如果直接使用InvisiableClass,插件完全找不到這個類,修改建議里面建議expose這個類:


    當然,使用VisiableClass是沒問題的。下面通過VisiableClass來將InvisiableClass拽出來,SampleAction類的源代碼如下,只要關心run方法就可以了:

    package useplugin.actions;

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;

    import org.eclipse.jface.action.IAction;
    import org.eclipse.jface.dialogs.MessageDialog;
    import org.eclipse.jface.viewers.ISelection;
    import org.eclipse.ui.IWorkbenchWindow;
    import org.eclipse.ui.IWorkbenchWindowActionDelegate;

    import utilitylibrary.expose.VisiableClass;

    /**
     * Our sample action implements workbench action delegate. The action proxy will
     * be created by the workbench and shown in the UI. When the user tries to use
     * the action, this delegate will be created and execution will be delegated to
     * it.
     * 
     * 
    @see IWorkbenchWindowActionDelegate
     
    */
    public class SampleAction implements IWorkbenchWindowActionDelegate {
        
    private IWorkbenchWindow window;

        
    /**
         * The constructor.
         
    */
        
    public SampleAction() {
        }

        
    /**
         * The action has been activated. The argument of the method represents the
         * 'real' action sitting in the workbench UI.
         * 
         * 
    @see IWorkbenchWindowActionDelegate#run
         
    */
        
    public void run(IAction action) {
            
    try {
                Class
    <?> clazz = VisiableClass.class.getClassLoader().loadClass(
                        
    "utilitylibrary.hide.InvisiableClass");
                Object obj 
    = clazz.newInstance();
                Method method 
    = clazz.getMethod("getMessage");
                Object ret 
    = method.invoke(obj, new Object[] {});
                System.out.println(ret);
                MessageDialog.openInformation(window.getShell(), 
    "UsePlugin", ret
                        .toString());
            } 
    catch (ClassNotFoundException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    catch (InstantiationException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    catch (IllegalAccessException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    catch (SecurityException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    catch (NoSuchMethodException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    catch (IllegalArgumentException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    catch (InvocationTargetException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        
    /**
         * Selection in the workbench has been changed. We can change the state of
         * the 'real' action here if we want, but this can only happen after the
         * delegate has been created.
         * 
         * 
    @see IWorkbenchWindowActionDelegate#selectionChanged
         
    */
        
    public void selectionChanged(IAction action, ISelection selection) {
        }

        
    /**
         * We can use this method to dispose of any system resources we previously
         * allocated.
         * 
         * 
    @see IWorkbenchWindowActionDelegate#dispose
         
    */
        
    public void dispose() {
        }

        
    /**
         * We will cache window object in order to be able to provide parent shell
         * for the message dialog.
         * 
         * 
    @see IWorkbenchWindowActionDelegate#init
         
    */
        
    public void init(IWorkbenchWindow window) {
            
    this.window = window;
        }
    }


    在run方法里面,直接使用VisiableClass.class.getClassLoader().loadClass("utilitylibrary.hide.InvisiableClass");來加載本不應該被外部所見的Invisiable類。因為在Eclipse中,每個插件使用一個ClassLoader,所以用來加載VisiableClass類的ClassLoader也同樣負責加載在同一個插件中的InvisiableClass類。這樣InvisiableClass就在插件外部被加載成功了。類加載成功后,剩下的事情就是順水推舟了,創建個實例然后使用反射調用相應的方法。
    程序運行的時候,點擊toolbar上那個button,會彈出如下對話框:


    程序運行也沒啥錯誤。


    問題分析:
    其實我覺得這個問題是很難繞過去的。對于同一個插件,因為內部的類需要互相引用和互相使用,所以必須使用同一個類加載器來加載。所以,這個插件只要expose出來一個包,那么外部的插件就可以通過包中的任何一個類來得到加載這個插件中的類的類加載器,然后就可以通過reflect愛做啥做啥了。

    換一個角度可能更好理解這個問題為什么難以繞過去。假設VisiableClass需要用到InvisiableClass,雖然InvisiableClass沒有暴露出來,但是在正常的使用VisiableClass的時候,需要先加載VisiableClass類,而加載VisiableClass的時候JVM就會隱式的加載InvisiableClass。這個過程和例子里現式的加載InvisiableClass沒啥本質不同。也就是說,從ClassLoader的角度,很難判斷一個類的加載是正常的代碼還是為了突破bundle的訪問限制——它們都是在執行run方法時發生的類加載行為。

    或者是我有什么地方沒設置好?求解答。例子下載在此。

    posted @ 2010-05-17 12:09 深夜兩點 閱讀(4806) | 評論 (8)編輯 收藏

    2010年4月27日

    宅能量終于爆發了,書終于出版了。China Pub有售http://www.china-pub.com/196571

    posted @ 2010-04-27 20:47 深夜兩點 閱讀(1667) | 評論 (1)編輯 收藏

    2010年4月26日

    在設計一個多線程程序的時候,首先要考慮好線程模型是怎樣的。設計線程模型的時候可以有多個考慮,比如使用線程池,使用多個線程處理任務,或者使用類似AWT/Swing中事件處理機制那樣,使用單個線程處理同一類的任務。

    posted @ 2010-04-26 16:33 深夜兩點 閱讀(244) | 評論 (0)編輯 收藏

    2010年4月11日

    rt

    posted @ 2010-04-11 11:21 深夜兩點 閱讀(238) | 評論 (0)編輯 收藏

    2010年3月20日

    自己寫的一個小程序,做個視頻冒充一下技術宅……


    程序經多次優化,終于能夠達到一個可以接受的性能了……莫言Java無效率,其實重要的還是要精雕細琢。至 少就繪制Julia Set而言,我這個程序比我見過的幾個cpp版本的要快的多。
    項目主頁地址:http://code.google.com/p/juliasetcreator/
    程序下載地址:http://code.google.com/p/juliasetcreator/downloads/list。

    posted @ 2010-03-20 17:25 深夜兩點 閱讀(2625) | 評論 (2)編輯 收藏

    2010年3月14日

    轉自http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm

    [譯文]程序員能力矩陣 Programmer Competency Matrix

    注意:每個層次的知識都是漸增的,位于層次n,也蘊涵了你需了解所有低于層次n的 知識。
    計算機科學 Computer Science
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    數據結構 不知道數組和鏈表的差異 能夠解釋和使用數組, 鏈表,字典等,并且能夠用于實際的編程任務。 了解基本數據結構時間和空間的折中,比如數組vs 鏈表,能夠解釋如何實現哈希表和處理沖突,了解優先隊列及其實現。 高等的數據結構的知識,比如B-樹、二項堆、斐波那契堆、AVL 樹、紅黑樹、伸展樹、跳躍表以及前綴樹等。
    算法 不能夠找出一個數組各數的平均值(這令人難以置信,但是我的確在應聘者 中遇到過) 基本的排序,搜索和數據的遍歷和檢索算法。 樹,圖,簡單的貪婪算法和分而治之算法,能夠適度了解矩陣該 層的含義。 能夠辨識和編寫動態規劃方案,良好的圖算法知識,良好的數值估算的知識,能夠辨別NP問題等。 Working with someone who has a good topcoder ranking would be an unbelievable piece of luck!
    編程體系 不知道何為編譯器、鏈接器和解釋器。 對編譯 器、鏈接器、解釋器有基本的了解。知道什么是匯編代碼以及在硬件層如何工作。有一些虛擬內存和分頁知識。 了解內核模式vs用戶模式, 多線程,同步原語以及它們如何實現,能夠閱讀匯編代碼。了解網絡如何工作,了解網絡協議和socket級別編程。 了解整個程序堆棧、 硬件(CPU+內存+中斷+微碼)、二進制代碼、匯編、靜態和動態鏈接、編碼、解釋、JIT(just-in-time)編譯、內存碎片回收、堆、棧、存 儲器編址…
    軟件工程 Software Engineering
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    源碼版本控制 通過日期備份文件夾 VSS和初級的 CVS/SVN用戶 熟練地使用CVS和SVN特性。知道如何分支和歸并,使用程序庫補丁安裝特性等 有分布式VCS 系統的知識。嘗試過Bzr/Mercurial/Darcs/Git
    自動化編譯 只知道在IDE下編譯 知道如何編譯在命令行 下編譯系統 能夠安裝一個腳本構建基本的系統 能夠安裝一個腳本來構建系統并且歸檔,安裝程序,生成發布記錄和給源 碼控制中的代碼分配標簽。
    自動化測試 認為所有的測試都是測試員的工作。 能夠編寫 自動化的單元測試,能夠為正在編寫的代碼提出良好的測試用例。 按照TDD (Test Driven Development)方式編寫代碼。 了解并且能夠有效自動化安裝,載入/性能和UI測試
    程序設計 Programming
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    問題分解 只有直線式的代碼,通過復制粘貼來復用 能夠把 問題分散到多個函數中 能夠想出可復用的函數/對象來解決大題的問題 使用適宜的數據結構和算法,寫出通用的/面向 對象的代碼來封裝問題的易改變的層面。
    系統分解 N想不出比單一的文件/類更好的層面 如果不在 同一平臺或沒采用相同的技術,能夠把問題空間和設計方案分解。 能夠設計跨技術/平臺的系統。 能夠在多個產品線和 與外部體系一體化中虛擬化和設計復制的系統。同時也能夠設計支持系統監視、報告、故障恢復等。
    交流 不能向同伴表達想法/主意。匱乏拼寫和語法的能力。 同 伴能了解你在說什么。有良好的拼寫和語法能力。 能夠和同伴進行高效的交流 能夠使用清晰的方式了解和交流想法/設計 /主意/細則,能適應每種環境的交流 This is an often under rated but very critical criteria for judging a programmer. With the increase in outsourcing of programming tasks to places where English is not the native tongue this issue has become more prominent. I know of several projects that failed because the programmers could not understand what the intent of the communication was.
    同一文件中代碼組織 同一文件中組織沒有依據 按照邏輯 性或者易接近的方法 代碼分塊和對于其他源文件來說是易于是釋,引用其他源文件時有良好的注釋 文檔頭部有許可聲 明,總結,良好的注釋,一致的空格縮進。文檔外觀美觀。
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    跨文件代碼組織 沒夠想過給代碼跨文件組織 相關文件按文件 夾分組 每個物理文件都有獨立的目的,比如一個類的定義,一個特性的實現等。 代碼在物理層組織緊密,在文件名上與 設計和外觀相匹配,可以通過文件分布方式洞察設計理念。
    源碼樹組織 一切都放在一個文件夾內 初步地將代碼分散進 對應邏輯的文件夾。 沒有循環依賴,二進制文件,庫,文檔,構建,第三方的代碼都組織進合適的文件夾內。 源碼樹的 物理布局與邏輯層次、組織方式相匹配??梢酝ㄟ^目錄名稱和組織方式洞察設計理念。 The difference between this and the previous item is in the scale of organization, source tree organization relates to the entire set of artifacts that define the system.
    代碼可讀性 單音節的名稱 (在國內應該是那些類似用漢語拼音命名的習慣) 對文件、變量、類、方法等,有良好的命名。 沒有長函數、注釋解釋不常規的代碼,bug修復,代碼假設。 代 碼假設驗證使用斷言,自然的代碼流,沒有深層嵌套的條件和方法
    防御性編碼 不知道這個概念 檢查代碼中所有的參數,對關鍵 的假設進行斷言 確保檢查了返回值和使代碼失敗的異常。 有自己的庫來幫助防御性編程、編寫單元測試模擬故障
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    錯誤處理 只給樂觀的情形編碼 基本的代碼錯誤處理,拋出 異常/生成錯誤 確保錯誤/異常留在程序中有良好的狀態,資源,連接,內存都有被合適的清理。 在編碼之前察覺可能 出現的異常,在代碼的所有層次中維持一致性的異常處理策略,提出整個系統的錯誤處理準則。
    IDE IDE大部分用來進行文本編輯 了解其周圍的接 口,能夠高效地通過菜單來使用IDE 了解最常操作的鍵盤快捷鍵 編寫自定義宏
    API 需要頻繁地查閱文檔 把最頻繁使用的API記在腦 子里 廣闊且深入的API知識。 為了使實際任務中常用API使用更加便捷,編寫過API的上層庫,填補API之間 的缺口。 E.g. of API can be Java library, .net framework or the custom API for the application
    框架 沒有使用過主平臺外的任何框架 聽過但沒用過平臺下 流行的可用框架 在專業的職位中使用過一個以上的框架,通曉各框架的特色。 某框架的作者
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    需求分析 接受給定的需求和代碼規格 能對規格的遺漏提出 疑問 了解全面情況,提出需要被規格化的整體范圍。 能夠提出更好的可選方案,根據經驗的浮現給出需求
    腳本 不具備腳本工具的知識 批處理文件/shell腳本 Perl/Python/Ruby/VBScript/Powershell 寫過并且發表過可重用的代碼
    數據庫 認為Excel就是數據庫 知道基本的數據庫概 念,規范化、ACID(原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durability)、事務化,能 夠寫簡單的select語句 能夠牢記在運行時必要查詢中設計良好的規范化數據庫模式, 精通用戶視圖,存儲過程,觸發器和用戶定義類型。知道聚集與非聚集索引之間的差異。精通使用ORM(Object Relational Mapping對象關系映射)工具 能做基本的數據庫管理,性能優化,索引優化,編寫高級的select查詢,能夠使用相關sql來替 換游標,理解數據內部的存儲,了解如何鏡像、復制數據庫。知道兩段數據提交如何工作
    經驗 Experience
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    專業語言經驗 命令式語言和面向對象語言 命令式語言,面向對象語言和說明型語言(SQL),如果了解靜態類型vs動態類型,弱類型vs強類型則有加分 函數式語言,如果了解延 緩求值,局部套用函數,延續則有加分 并發語言(Erlang, Oz) 邏輯語言(Prolog)
    專業平臺經驗 1 2-3 4-5 6+
    專業經驗年齡 1 2-5 6-9 10+
    領域知識 沒有該領域的知識 在該領域中曾經至少為一個 產品工作過 在同一領域中為多個產品工作過 領域專家。在該領域設計和實現數種產品/方案。精通該領域使用的標準條款 和協議
    學識 Knowledge
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    工具知識 僅限于主要的IDE(VS.Net, Eclipse等) 知 道一些流行和標準工具的備選方案 對編輯器、調試器、IDE、開源的備選方案有很好的了解。比如某人了解大多數Scott Hanselman的威力工具列表中的工具,使用過ORM工具。 實際地編寫過工具和腳本,如果這些被發布則有加分
    語言接觸 命令式語言和面向對象語言 命令式語言、面向對象 語言和說明型語言(SQL),如果了解靜態類型vs動態類型、弱類型vs強類型則有加分 函數式語言,如果了解延緩求值、局部套用函 數、continuations (源于scheme中的一種高級控制結構)則有加分 并發語言(Erlang, Oz) 邏輯語言(Prolog)
    代碼庫知識 從來沒有查詢過代碼庫 基本的代碼層知識,了 解如果構建系統 良好的代碼庫工作知識,實現過幾次bug修復或者完成了一些細小的特性 實現了代碼庫中多個大型特 性,能夠輕松地將多數特性的需求變更具體化,從容地處理bug修復。
    下一代技術知識 從來沒聽說過即將到來的技術 聽說過某領 域即將到來的技術 下載過alpha preview/CTP/beta版本,并且讀過一些文章和手冊 試用過預覽 版而且實際地構建過某物,如果共享給其他人的話則有加分
      2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
    平臺內部 對平臺內部毫無所知 有平臺基本的內部工作的 知識 深度的平臺內部知識,能夠設想平臺如何將程序轉換成可執行代碼。 編寫過增強平臺或者為其平臺內部提供信息的 工具。比如,反匯編工具,反編譯工具,調試工具等。
    書籍 菜鳥系列,21天系列,24小時系列,蠢貨系列... 《代 碼大全》,《別讓我思考》, 《精通正則表達式》 《設計模式》,《人件》,《代碼珠璣》,《算法設計手冊》,《程序員修煉之道》, 《人月神話》 《計算機程序設計與解釋》,《事務處理:概念與技術》,《計算機程序設計模型》,《計算機程序設計藝術》,《數據庫系統 導論》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(沒找到其中譯本)
    博客 聽過但是從來抽不出空去接觸 閱讀一些科技/編程 /軟件工程的博客,并且經常的收聽一些播客 維護一些博客的鏈接,收集博主分享的有用的文章和工具 維護一個在編程方 面,分享有個人見解和思考的博客
    Creative Commons License
    程序員能力矩陣 by XGuru is licensed under a Creative Commons 署名-非商業性使用-相同方式共享 2.5 中國大陸 License. 原文請看 這 里。
    Thanks to bearice for debugging.
    Thanks to John Haugeland for a reformatting of it that works much more nicely on the web.

    posted @ 2010-03-14 23:35 深夜兩點 閱讀(239) | 評論 (0)編輯 收藏

    2009年12月7日

    (轉自http://coolshell.cn/?p=1903

    問答

    Q:你是怎么區分一個內向的程序員和一個外向的程序員的?
    A:外向的程序員會看著你的鞋和你說話時。

    Q:為什么程序員不能區分萬圣節和圣誕節?
    A:這是因為Oct 31 == Dec 25!(八進制的31==十進制的25)

    剎車失靈

    有一個物理學家,工程師和一個程序員駕駛著一輛汽車行駛在阿爾卑斯山脈上,在下山的時候,忽然,汽車的剎車失靈了,汽車無法控制地向下沖去,眼看前 面就是一個懸崖峭壁,但是很幸運的是在這個懸崖的前面有一些小樹讓他們的汽車停了下來,而沒有掉下山去。三個驚魂未定地從車里爬了出來。

    物理學家說,“我覺得我們應該建立一個模型來模擬在下車過程中剎車片在高溫情況下失靈的情形”。

    工程師說,“我在車的后備廂來有個扳手,要不我們把車拆開看看到底是什么原因”。

    程序員說,“為什么我們不再找相同的車再來一次以重現這個問題呢?”

    關于編程語言

    如果C++是一把錘子的話,那么編程就會變成大手指頭。

    如果你找了一百萬只猴子來敲打一百萬個鍵盤,那么會有一只猴子會敲出一段Java程序,而其余的只會敲出Perl程序。

    一陣急促的敲門聲,“誰?。?#8221;,過了5分鐘,門外傳來“Java”。

    如果說Java很不錯是因為它可以運行在所有的操作系統上,那么就可以說肛交很不錯,因為其可以使用于所有的性別上。

    自行車

    一個程序員騎著一個很漂亮的自行車到了公司,另一個程序員看到了他,問到,“你是從哪搞到的這么漂亮的車的?”

    騎車的那個程序員說,“我剛從那邊過來,有一個漂亮的姑娘騎著這個車過來,并停在我跟前,把衣服全脫了,然后對我說,‘你想要什么都可以’”。

    另一個程序員馬上說到,“你絕對做了一個正確的選擇,因為那姑娘的衣服你并不一定穿得了”。

    火車

    一個年輕的程序員和一個項目經理登上了一列在山里行駛的火車,他們發現列車上幾乎都坐滿了,只有兩個在一起的空位,這個空位的對面是一個老奶奶和一 個年輕漂亮的姑娘。兩個上前坐了下來。程序員和那個姑娘他們比較曖昧地相互看對方。這時,火車進入山洞,車廂里一片漆黑。此時,只聽見一個親嘴的聲音,隨 后就聽到一個響亮的巴掌聲。很快火車出了山洞,他們四個人都不說話。

    那個老奶奶在喃喃道,“這個年輕小伙怎么這么無禮,不過我很高興我的孫女扇了一個巴掌”。

    項目經理在想,“沒想到這個程序員居然這么大膽,敢去親那姑娘,只可惜那姑娘打錯了人,居然給打了我。”

    漂亮的姑娘想,“他親了我真好,希望我的祖母沒有打疼他”。

    程序員坐在那里露出了笑容,“生活真好啊。這一輩子能有幾次機會可以在親一個美女的同時打項目經理一巴掌啊”

    問路

    有一個駕駛熱氣球的人發現他迷路了。他降低了飛行的高度,并認出了地面上的一個人。他繼續下降高度并對著那個人大叫,“打擾一下,你能告訴我我在哪嗎?”

    下面那個人說:“是的。你在熱氣球里啊,盤旋在30英尺的空中”。

    熱氣球上的人說:“你一定是在IT部門做技術工作”。

    “沒錯”,地面上的人說到,“你是怎么知道的?”

    “呵呵”,熱氣球上的人說,“你告訴我的每件事在技術上都是對的,但對都沒有用”。

    地面上的人說,“你一定是管理層的人”。

    “沒錯”,熱氣球上的人說,“可是你是怎么知道的?”

    “呵呵”,地面上的那人說到,“你不知道你在哪里,你也不知道你要去哪,你總希望我能幫你。你現在和我們剛見面時還在原來那個地方,但現在卻是我錯了”。

    警告

    有一個小伙子在一個辦公大樓的門口抽著煙,一個婦女路過他身邊,并對他說,“你知道不知道這個東西會危害你的健康?我是說,你有沒有注意到香煙盒上的那個警告(Warning)?”

    小伙子說,“沒事兒,我是一個程序員”。

    那婦女說,“這又怎樣?”

    程序員說,“我們從來不關心Warning,只關心Error”

    posted @ 2009-12-07 10:24 深夜兩點 閱讀(315) | 評論 (0)編輯 收藏

    2009年12月5日

    (http://www.yeeyan.com/articles/view/115732/71484)

    閱讀軟件開發相關書籍,是程序員在技能和職業上為自己投資的好辦法。但是,需要閱讀那些書?應該按照什么順序來進行?這份書單適合那些剛剛開始,一心想要提高自己的編程能力,想要以程序員為職業的人。

    我之前曾說,閱讀軟件開發有關的書籍,是在你技能和事業上投資的好辦法。 但是哪些應該閱讀呢?而且該按照什么順序閱讀呢? 我已經編制了一份書單,我認為它能真正大幅提高你的能力。 我已經安排好它們的順序,分為3個階段,我相信這種順序是最有成效的。這份書單主要是為那些剛剛起步的開發人員編寫的,當然專業的開發者也可參照,它對周圍那些想獲得提高的人來說都是相當有用的。

    首先,你應該關注的是提高書寫干凈,毫不含糊的,可維護代碼的能力。 下列書籍應該大大有助于您:

    1. 測試驅動開發(肯特·貝克)
    2. 重構(馬丁·福勒)
    3. 實現模式(肯特·貝克)
    4. 代碼大全:第二版(史蒂夫·麥康奈爾)
    5. Working Effectively With Legacy CodeMichael Feathers
    6. Clean Code (Robert C. Martin)

    上述的讀書順序可能使有些人感到驚訝,但我敢打賭,這是最有效的閱讀順序。

    當你學會了如何書寫偉大的代碼,你應該開始以簡潔的設計和架構為重點。 這并不是說,你應該只集中于設計和架構,但你越了解它,你會變得越好:

    1. 設計模式(Gang Of Four 
    2. 企業應用架構模式(馬丁·福勒)
    3. 領域驅動設計(埃里克·埃文斯)
    4. 企業集成模式(格里高·Hohpe,鮑比·沃爾夫)
    5. Release It! Design and deploy production-ready software(Michael T. Nygard)
    6. 97 Things Every Software Architect Should Know (edited by Richard Monson-Haefel)

    這一階段可能值得說明的是在這部分列出的一些圖書中可能是有點'爭議'的。 如果您已經閱讀了第一階段的書籍,那么你應該有能力用你自身的觀點看待第二階段的這些書籍。 你會了解到,你不應該僅僅仿照那些模式,但了解它們的存在肯定是一件好事。

    最后,您需要了解如何在團隊環境下工作并理解團隊的動力。 下面的書籍不是具體介紹團隊中的工作,但包含了眾多的智慧和洞察力,這一定會幫助您在專業的團隊環境中工作:

    1. 極限編程,第二版(肯特·貝克)
    2. The Art Of Agile Development (James Shore & Shane Warden)
    3. 人月神話,20周年紀念版(弗雷德里克·布魯克斯)

    這本書可能也需要一點說明。 我并不是說你應該做極限編程。 但你了解它肯定不會有害處,至少你應該在你認為有意義的時候去嘗試采用這種做法。 你并不會真的需要去采用所有的做法(雖然你這樣做會獲得額外的好處,或者至少假裝這樣做),但它們中的一些,每個人都應該至少了解一下。

    所以就是這樣了...嘗試用上述方式閱讀這些書,不要忘了以后感謝我 

    A Reading Guide To Becoming A Better Developer

    I’ve stated previously that reading software development books is a good way of investing in your skills and your career. But which ones should you read? And in what order should they be read? I’ve compiled a list of books that i think can truly increase your skills substantially. I’ve put them in the order in which i believe they will have the most effect, and grouped them in 3 ’stages’. I primarily have young developers who are just getting started as professional developers in mind with this list, but it should be just as useful to developers who’ve been around for a while and simply want to improve.

    The first thing that you should focus on is improving your ability to write clean, unambiguous, maintainable code. The following books should greatly help you with that:

    1. Test-Driven Development (Kent Beck)
    2. Refactoring (Martin Fowler)
    3. Implementation Patterns (Kent Beck)
    4. Code Complete: 2nd Edition (Steve McConnell)
    5. Working Effectively With Legacy Code (Michael Feathers)
    6. Clean Code (Robert C. Martin)

    The order of this stage might surprise some people, but i’m willing to bet that this is the most efficient order to reading those books.

    After you’ve learned how to write great code, you should really start focusing on clean design and architecture. That’s not to say that you should focus solely on design and architecture, but the more you know about it, the better off you will be:

    1. Design Patterns (Gang Of Four)
    2. Patterns Of Enterprise Application Architecture (Martin Fowler)
    3. Domain-Driven Design (Eric Evans)
    4. Enterprise Integration Patterns (Gregor Hohpe, Bobby Woolf)
    5. Release It! Design and deploy production-ready software (Michael T. Nygard)
    6. 97 Things Every Software Architect Should Know (edited by Richard Monson-Haefel)

    This stage probably deserves a bit of clarification as some of the books listed in this part might be somewhat ‘controversial’. If you read and learned from the books in the first stage, then you should be capable of putting everything you read in the second stage in perspective. You will have learned that you shouldn’t just apply as many patterns as possible, but it’s certainly a good thing to know about their existence.

    Finally, you need to learn about working in a team environment and understanding team dynamics. The following books aren’t about working in teams specifically, but contain a tremendous amount of wisdom and insight that will definitely help you when it comes to working in a professional team environment:

    1. Extreme Programming Explained, Second Edition (Kent Beck)
    2. The Art Of Agile Development (James Shore & Shane Warden)
    3. The Mythical Man-Month, 20th Anniversary Edition (Frederick P. Brooks)

    This one probably needs a bit of clarification as well. I’m not saying that you should do Extreme Programming. But it certainly won’t hurt you to learn about it, and at least try to apply the practices that you believe in when it makes sense to do so. You don’t really need to apply them all (though you will get bonus points from the cool kids if you do so, or at least pretend to), but there are a few of them that everyone really should do regardless of which agile variant you subscribe to.

    So there you have it… try those books out in that order, and don’t forget to thank me later



    posted @ 2009-12-05 21:48 深夜兩點 閱讀(277) | 評論 (0)編輯 收藏

    2009年12月3日

    (上一篇:計算機中的加密和認證http://www.tkk7.com/deepnighttwo/archive/2009/12/03 /304631.html
    A公司開發了一個軟件,打成了一個jar包,然后發布出去liao。作為一個用戶,如何來確認這個jar包確實是A公司發布的哪個?而且,如何確定這個jar包沒有被別有用心的一小撮篡改過?這就需要Java中的簽名來保證。

    Java中的可執行代碼就是class文件。直接使用class文件是很naive的。通常的做法是是對一個jar包中的所有class文件進行簽名。過程可以分為如下步驟。
    1. 首先使用JDK自帶的keytool工具生成一個keystore,命令如下: keytool -genkey -keystore keystore文件 -alias 別名。回車后還有一些信息需要填寫。keystore里面包含了很多信息,包括公鑰和私鑰信息。當然可以使用keytool命令從keystore文件里面導出公鑰和私鑰。keytool命令還有很多參數,比如你可以指定使用的摘要算法等。(具體用法可以Google之)。
    2. 然后,第二步當然是找個CA給公鑰簽名。自娛自樂的用途就可以不用這一步了。
    3. 第三步是給jar包簽名。JDK中提供了給jar包簽名的工具,叫做jarsinger。命令各式如下:jarsigner -keystore keystore文件 jar文件 別名(就是生成keystore時用的那個別名)。回車后要輸入密碼,也跟生成keystore時候的密碼一樣就行了。
    好,到這里就算簽名結束了。命令執行完畢后,jar包會陡然多出幾k來。這幾k就是簽名的內容。


    Java(或者說是Java Runtime)是支持簽名和認證的。也就是說一個jar包一旦被簽名了,Java Runtime會對這個jar包進行驗證。下面是驗證簽名的過程。
    首先需要知道簽名后jar包里面多出了什么。簽名并不會改變jar包中已經有的內容,而是添加了一個.DSA(說明使用的是DSA算法)文件和一個.SF(signed file)文件,然后在.MF文件里面增加一些內容。驗證的過程是這樣的(我猜的。。。覺得不對可以去http://java.sun.com/javase/6/docs/technotes/guides/jar /jar.html,Sun公司的jar包規范,自己看自己猜),首先是DSA文件,它里面存儲了公鑰內容和對SF文件摘要的加密內容,所以,首先驗證公鑰(跟https里面的那個驗證是一樣的過程),驗證完畢證書后,用公鑰解密加密的內容,然后得到SF文件的摘要值,把這個值和實際 SF文件的摘要值比較,這樣就可以保證SF文件沒問題了。SF文件里面的內容包含了很多條目的簽名值。首先是對MF文件的簽名值,這就是驗證MF文件了。而MF文件里面對每個class文件都有一段描述的內容,比如:
    Name: common/class2.class

    MD5-Digest: (base64 representation of MD5 digest)

    SHA-Digest: (base64 representation of SHA digest
    它代表這個class文件對應摘要算法的摘要值。這個條目在SF里面有一個對應的條目:
    Name: common/class2.class
    MD5-Digest: (base64 representation of MD5 digest)


    注意,SF文件中的這個摘要值不是class文件的,而是MF文件里面對應條目的。也就是說,SF里面的簽名值統統是用來驗證MF文件或者MF文件中的條目的,而MF文件中的摘要值才是用來驗證class文件的。真繞。。。

    總之,最后一層層的驗證后,整個jar包中的內容都被驗證了。過程:CA的證書->自己的公鑰->SF文件簽名 ->MF文件簽名和MF文件每個條目的簽名->jar包中的每個文件(當然主要是clas文件。別的文件應該也會被驗證的,至少properties文件會被簽名認證)

    驗證完了之后,就可以保證jar包確實出自某公司之手,也確實沒有被別有用心的一小撮人篡改過。如果你信任某公司,那就可以用這個jar包了。

    同樣,如果一個applet的jar包是簽名了的,而且在啟動applet的時候用戶選擇信任這個簽名,那么這個applet就擁有了訪問本機資源的權限,如果選擇不信任,那么applet就不會被啟動。如果一個applet沒有被簽名,那么applet可以啟動,但是不會被允許訪問本機資源(文件等)。

    如果一個證書沒有被CA的證書認證,比如說,對于我寫的這個applet,它就是用我自己搞出來的沒認證過的證書簽了名的:http://appletfarm.appspot.com/juliaappletsigned.html
    這時候Java會提示說:

    “該應用程序的數字簽名無法驗證”,因為我沒給過VeriSign年費。如果證書是驗證過的,對話框就會是詢問你是否信任“某公司”,這個意思就是說,此jar包確實是“某公司”搞出來的,信任那個公司就可以運行它了。

    posted @ 2009-12-03 23:17 深夜兩點 閱讀(1116) | 評論 (0)編輯 收藏

    大學時候學網絡安全,不知道是老師太脫離實際,還是當時我上課睡太多了,反正學了個糊里糊涂。上機實驗比著葫蘆畫瓢在JBoss上搞了個EJBCA的什么東西,就覺得已經混過去了。不過該學的還是得學,躲不過?,F在開始還大學睡覺的債。。。。前段時間看了一陣子的Java安全編程,回過頭來總結總結。

    首先是跟Java沒關系的,是加密和認證。加密的算法可以分為三類:
    • 摘要算法(指紋算法,哈希算法等):摘要算法其實不算加密。算法以數據為輸入,生成一串等長的輸出。這個輸出就是這段輸入的指紋,或者說是摘要。算法不管輸入有多長,1G或者一個byte,輸出都是一樣長的。指紋算法比較形象。我們可以認為,只要數據不同,生成的摘要就是不同的(或者說,想根據一個摘要來生成特定的數據是很難的,所以這個摘要可以唯一的確定數據的身份)。當然是無法從這個簡短的摘要還原原始數據的。比較常用的摘要算法有MD5,SHA-1,DSA之類的。摘要算法是公開的,任何人都可以通過摘要算法來計算一段數據的摘要。所以,如果一個文件傳輸給你,同時也給你一個這個文件的MD5摘要,那么你收到文件后,計算一下文件的MD5,然后和別人給你的MD5摘要比較一下,就知道文件在到你手上之前是不是被人改動過了。
    • 對稱加密算法:對稱加密算法是使用相同密鑰加密和解密數據的一種加密算法。密鑰可以認為就是一段數據。使用相同的密鑰這點很重要。對稱加密算法很多,加密解密也很快。最入門的對稱加密算法就使凱撒密碼。工業中使用的加密算法很多,比如用于流加密的RC4,還有AES,DES等。只有有密鑰,那么就可以對加密后的數據進行解密,得到原始的數據。從這里可以看出,密鑰是對稱加密的關鍵,如果密鑰的傳輸無法保證安全,對稱加密就是形同虛設的。
    • 非對稱加密算法:非對稱加密算法是計算機加密和認證中最關鍵的一環。非對稱加密的特點是,它有倆密鑰,用密鑰1加密的數據需要使用密鑰2解密,同樣,用密鑰2加密的數據需要用密鑰1解密。如果公開密鑰1,那么密鑰1就成為公鑰,即公開的密鑰,同時,密鑰2就使私鑰,必須好好保存不能讓別人得到。非對稱加密算法有數學證明來保證它幾乎不可能在一個有意義的時間段內被破解。但是非對稱加密也有致命的弱點——加密解密計算量大,不適合用來處理大量的數據。非對稱加密算法有RSA,DSA等。
    計算機加密體系需要保證——保密性、完整性、認證性和不可抵賴性。保密性就是說,數據是使用加密算法加密過的(一般是使用對稱加密算法加密)。完整性可以用摘要算法保證,因為一段數據一旦被人改動過了,那么摘要就肯定不同了。但是,這兩者如果沒有非對稱加密算法保護,一切就都是空談。因為,密鑰總歸要通過 internet傳輸的,如果被人竊取了咋辦?摘要?大不了黑客篡改了數據之后,生成一個新的摘要。好,非對稱加密上場了,認證性和不可抵賴性這兩點也是非對稱加密來保證的。它如何來保證前面這些呢?

    先看看什么是證書。有了這些算法之后,就有了證書這個概念。啥叫做證書呢?證書其實就是一個文件。文件內容挺多,需要關心的有:
    • 非對稱加密的公鑰。它可以用來解密那個秘密的私鑰加密過的數據。
    • 用別的私鑰加密過的非對稱加密的公鑰的簽名。上面說的非對稱加密的公鑰也是一段數據呀,用摘要算法計算一下它的摘要。然后用別的私鑰加密一下這個摘要。注意,這里說的是用別的私鑰加密。
    • 所謂的別的私鑰的標識。有了這個標識,才知道是誰加密了公鑰的簽名。
    問題越來越多了。什么叫做別的私鑰?哪兒來的私鑰?對于一個有效的證書來說,這里說的別的私鑰,就是那些專門來提供證書加密服務的公司(比如 VeriSign)的私鑰。這些公司會全副武裝的保護好自己的私鑰(公司的命根子呀)。下面來敘述一下這個過程:
    1. 首先,A公司想要一個證書,用來在internet上證明自己確確實實是A公司。于是公司通過工具生成了一對密鑰(這個很簡單,誰都可以輕松的生成一對密鑰)。
    2. 然后他拿著公鑰去找VeriSign,計算了公鑰的MD5值,請求VeriSign拿出自己的寶貝私鑰,來對這個公鑰的MD5值進行加密。
    3. VeriSign很專業,他們會要求A公司出具相應的證明,核實無誤后,VeriSign此才會拿出私鑰,把A公司公鑰的MD5值進行加密。這個就叫做簽發證書。
    4. 這不是一錘子買賣,A公司為了這個事兒,須要按年給VeriSign付錢。
    5. 好,A公司的公鑰的MD5值被VeriSign的私鑰加密過了,得到了一段加密后的數據,只有VeriSign的公鑰才能解密這段數據,得出正確的值。
    6. A公司屁顛屁顛的可以生成自己的證書了,證書的內容包括:
    • A公司的公鑰。
    • VeriSign的私鑰對A公司的公鑰的MD5值加密后,所得到的數據。再次提醒一下,這個密鑰只有VeriSign的公鑰才能解密。
    • 一段文字,說明證書是VeriSign驗證的,公鑰的指紋算法是MD5。這段文字不用加密,誰愛看誰看。
    終于A公司有了自己的證書,但是,VeriSign的私鑰加密過的東西,須要使用VeriSign的公鑰來解密,咋辦?不用急,VeriSign這種提供證書服務的公司早就和各種操作系統提供商協商好了,他們的公鑰早就一經包含在了每一個操作系統中,在我們安裝操作系統的時候,VeriSign這些公司的公鑰就已經包含在計算機里了。

    下面以https來解釋一下計算機中的安全體系(保密性、完整性、認證性和不可抵賴性)是如何工作的。
    A公司有了一個站點,瀏覽器使用https來訪問這個站點的時候,大概的過程就是這樣的(下面的過程基本是Https協議的運作過程):
    1. A公司站點首先給客戶端發送自己的寶貝證書。(數據傳輸的時候被人從中間截獲了?不怕,想聽就聽吧)
    2. 認證性:客戶端得到證書之后,開始驗證這個證書:
      • 首先,客戶端從證書中知道,這個證書是被VeriSign公司簽發的。所以客戶端從操作系統中拿出來VeriSign公司的公鑰,待用。
      • 客戶端還知道,A公司公鑰是使用MD5算法計算的簽名,OK,客戶端讀取出來證書中A公司的公鑰,使用MD5值,待用。
      • 下面是重要的一步了,客戶端從A公司的證書中抽取出那段加密后的數據(也就是A公司公鑰的MD5值VeriSign公司的私鑰加密過的那段數據),然后再拿過來第一步中找到的VeriSign公司的公鑰,非對稱加密的特點就是私鑰加密,公鑰解密之。所以,當當當當當,解密之,得到的值就應該是A公司的公鑰的MD5值。< /li>
      • 那到底是不是呢?跟第二步中客戶端自己計算出來的MD5值比對一下就知道了。
      • 如果通過比較,發現確實是,那么安全體系中的認證性就得到保證了,也就是說,客戶端可以完全相信對方就是A公司,訪問的站點也就是A公司的站點。(等等,A公司的公鑰不是公開的嗎?那豈不是任何站點都可以偽裝成A公司?不急,這不是個事兒,在下面不可抵賴性會說到)當然,如果驗證不通過,說明對方是個“李鬼”。瀏覽器會有提示,說這個站點提供的證書沒有通過驗證思密達(還有一種情況就是,證書過期了,還記得前面說的每年給VeriSign的年費嗎)。
    3. 好,客戶端驗證通過了,下面就是開始傳輸數據了。傳輸數據的過程有保密性、完整性和不可抵賴性三點需要保證。
    4. 首先,客戶端瀏覽器悄悄地生成一個隨機數。然后使用A公司的公鑰加密這個隨機數,發送給A公司的站點。因為是A公司公鑰加密的,所以不怕被人竊聽。為啥不怕被竊聽,因為竊聽了也沒用,因為竊聽者肯定沒有A公司的私鑰,沒有私鑰也就沒法對竊聽到的數據解密。
    5. A公司站點收到這個數據后,開始使用自己的私鑰解密數據。到了這個時候,肯定是只有客戶端和A公司的站點服務器知道這個隨機數的。
    6. 接下來,客戶端瀏覽器和A公司站點根據相同的算法,生成對稱加密使用的密鑰(實際上是一組密鑰,當然在這里不用深究這個)。以后的數據傳輸就全使用這個對稱加密密鑰進行了。這就是保密性。
    7. 保密性得到了保證,完整性如何保證呢?如果攻擊者雖然不能夠獲得數據,但是他想搗蛋,偷偷篡改數據來破壞數據的完整性。這個時候也沒啥問題,在https 協議中,每條消息在加密之前都包含了消息內容和消息的hash值(比如,消息的MD5值),這樣在消息的接收端,就可以對這條消息進行驗證了。通過驗證就可以知道消息是不是被篡改過。當然,如果被篡改過,也使沒辦法回復的,不過知道消息被篡改過,那么就可以要求對方重新發送消息了,總之攻擊者是沒法辦得逞的。這就是消息的完整性
    8. 好的,在這里我們來看一下不可抵賴性。因為只有A公司有私鑰,這也就是說,只有A公司可以把這個數據成功解密,來得到這個隨機數,從而來計算對稱加密使用的密鑰。所以,如果A公司想抵賴說那個站點不是自己,是不可能的事情。因為只有A公司有這個用于解密的私鑰,不是A公司是誰。同樣,就好像在前面說的,如果有人用A公司的公鑰冒充A公司,那么這個李鬼其實沒有A公司的公鑰,也就沒有辦法解密數據(注意,客戶端產生的隨機數是使用A公司的公鑰加密的,須要使用A公司的私鑰解密),所以這個是徒勞的。
    好,保密性、完整性、認證性和不可抵賴性都在上面的過程中都得到保證了。這個過程的核心就是非對稱加密的特性:公鑰加密私鑰解密,私鑰加密公鑰解密。本篇到此結束,下一篇中將涉及Java中的認證和加密。

    關于https的具體內容可以參考這篇文章:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser





    posted @ 2009-12-03 17:55 深夜兩點 閱讀(788) | 評論 (0)編輯 收藏

    僅列出標題  下一頁
    主站蜘蛛池模板: 免费国产黄网站在线观看视频| 国产自产拍精品视频免费看| 亚洲AV无码无限在线观看不卡| 免费在线观看一级毛片| 你是我的城池营垒免费观看完整版| 亚洲毛片免费视频| 亚洲国产成人精品女人久久久 | 国产极品粉嫩泬免费观看| 久久www免费人成精品香蕉| 亚洲毛片免费观看| 亚洲国产精品综合久久网络| 91福利视频免费观看| 精品成人一区二区三区免费视频 | 久久精品国产亚洲综合色| 在线观看视频免费完整版| 岛国岛国免费V片在线观看| 中文字幕亚洲精品无码| 亚洲乱码精品久久久久..| 成人免费男女视频网站慢动作| 99精品视频免费| 国产AV无码专区亚洲AV麻豆丫 | 国产在线观看免费av站| 亚洲欧洲无卡二区视頻| 4480yy私人影院亚洲| 亚洲视频在线免费| 国产精品四虎在线观看免费| 亚洲电影免费观看| a级毛片免费高清毛片视频| 看全免费的一级毛片| 亚洲中文字幕一二三四区苍井空| 精品久久香蕉国产线看观看亚洲| 在线观看91精品国产不卡免费| 亚洲视频免费在线看| 久久久久免费看黄a级试看 | 日本成人免费在线| 可以免费看黄的网站| 亚洲a一级免费视频| 国产一级高青免费| 无遮挡国产高潮视频免费观看| 亚洲精品中文字幕无码A片老| 亚洲国产精品无码久久久|