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

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

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

    vulcan

    低頭做事,抬頭看路

       :: 首頁 :: 聯系 :: 聚合  :: 管理
      41 Posts :: 7 Stories :: 28 Comments :: 0 Trackbacks

    #

    上個星期升級了Eclipse,升級之后,使用了幾天,發現報錯和crash的幾率很小了,它的error log view里面也清靜了不少.
    前一段時間,Netbeans6的正式版出來,使用了一下,感覺不錯,而當時Eclipse Europa老是出錯崩潰掉,讓我非常的惱火,所以很想轉用Netbeans,有一個項目,是Java GUI程序,在初始階段,用Netbeans構建Java Swing界面,那叫一個爽啊.不過后面程序,出現了一些問題,比如內存泄漏,莫名奇妙的CPU占用100%啊.用Netbeans做profile也挺不錯的.但是到了追蹤問題的時候,用Netbeans的debug老是感覺不爽.哪個調試器沒有Eclipse好用,Eclipse可以實時的看每個活躍線程的變量,并且變量的輸出看起來很舒服,而netbeans卻感覺怪怪的,所以后來這個已經構建好GUI的項目又轉成了Eclipse的工程.還有就是Netbeans不能運行庫中的classes,而給library綁定源代碼的方式也怪怪的,沒有像Eclipse那么方便,直接給一個jar包指定源碼就可以了.另外代碼編輯器,Eclipse比Netbeans還是舒服些.也許是對Netbeans不熟悉吧,也不想花時間去仔細學一個新的IDE,所以呢,以后還是堅持用Eclipse好了.對于Netbeans,就用用它的GUI Builder好了.要是Eclipse也有那么好的GUIbuilder該多好啊.可是那個VE的項目總是進度不怎么樣,并且以前用過,感覺太慢.從網上知道MyEclipse移植了Netbeans的GUI Builder,不過MyEclipse是要賣錢的啊.另外還有一個好用點的Designer,也是商業的.說真的,我感覺做純粹的Swing GUI,而不是RCP,SWT, netbeans的GUI Builder是我覺得最好的.

    posted @ 2008-03-31 14:34 vulcan 閱讀(681) | 評論 (2)編輯 收藏

    需要這個功能,但是卻發現gnu提供的,還是sun的ResourceBundle都不是怎么好用,所以根據需要在resourceBundle的基礎上封裝了一下。
    package com.csair.hunan.common;

    import java.util.MissingResourceException;
    import java.util.ResourceBundle;

    /**
     * gettext支持類
     * 主要功能:可以自動獲取調用者信息,從而自動的根據local尋找resource
     * (1) 查找和類名相同的properties文件
     * (2) 如果(1)失敗,則默認查找調用者包中的message.properties文件
     * 如果找不到相應的key,不拋出異常,而是返回msgId
     * 另外它支持msgId帶空格,但是在properties文件中,必須把空格全部替換成下劃線
     * 
    @author Alva
     * 
     
    */
    public class I18NUtils {
        
    /* A static instance holding the message */
        
    //multi-thread safety?
        public static final ThreadLocal resPool = new ThreadLocal();
        
    public static final ThreadLocal callerPool = new ThreadLocal();

        @SuppressWarnings(
    "unchecked")
        
    public static String _(String s) {
            
    //get the direct caller class - FIXME how to deal with extend?
            Class caller = sun.reflect.Reflection.getCallerClass(2);
            ResourceBundle resourceBundle 
    = (ResourceBundle)resPool.get();
            
    //if no resourcebundle or the caller changed
            
    //initial a new resource bundle
            if(resourceBundle == null || !caller.equals(callerPool.get())) {
                
    try {
                    
    // first try the property file who with the same name with the caller class
                    resourceBundle = ResourceBundle.getBundle(caller.getCanonicalName());
                } 
    catch(MissingResourceException missingresourceexception) {
                    
    try {
                        
    //find the default: package
                        resourceBundle = ResourceBundle.getBundle(caller.getPackage().getName() + ".message");
                    } 
    catch (MissingResourceException e) {
                        
    //do nothing, just suppress the exception, omit the missed resource
                    }

                }
                resPool.set(resourceBundle);
                
    //record the new caller
                callerPool.set(caller);
            }
            
    try
            {
                
    // replace key's blank
                String s1 = (String)resourceBundle.getObject(s.trim().replaceAll("\\p{Blank}+""_"));
                
    if(s1 != null)
                    
    return s1;
            }
            
    catch(MissingResourceException missingresourceexception) { }
            
    return s;
        }
    }
    使用起來很方便,在需要使用的類中
    import static com.csair.hunan.common.I18NUtils._;
    //
    System.out.println(_("msgId"));
    不過還欠缺一點功能:對于翻譯文本中數字參數等的支持,需要加強
    posted @ 2008-03-21 18:13 vulcan 閱讀(973) | 評論 (0)編輯 收藏

    去年的一個問題,后來項目時間緊就擱下了,采用了替代方案,但是總覺得不那么完美,今年升級開發,想解決了,然后才有了這個想法。之前也知道SpringSide,但是沒有想過取看,今天因為一個問題搜google,居然發現我之前對于java web開發的一些想法居然和SpringSide一樣!又多了解了一下,發現這個項目的貢獻者都是國內jee開發領域的高手,所以呢,肯定比我的那些實現完美得多。暫時放下自己的代碼,好好看看SpringSide源代碼,因為想法有些一致,那么看起來肯定會很愉快的,如果全部和我的胃口,那么就轉到SpringSide了,如果不完全合我胃口,那么就把我關心的一些代碼搞明白后,選擇性吸收進項目了。
    下面是讀代碼的一些感受:
    (1) DAO的實現挺對我胃口的,比較喜歡。我的范型DAO是從Hibernate網站上取下來改進的。主要增加了一個可以接收List<Criterion>的重載方法還有分頁的功能。List類型的Criterion,方便了在上層靈活的利用添加條件,而不用每次都去轉成數組,傳給原本只接受可變參數的方法;分頁和Order的支持操作比我的實現優雅得多。不過卻希望可以給范型DAO的主鍵也增加一個范型參數,因為對于復合主鍵的參數傳入,如果有一個類型安全檢查可能要好一些。
    (2) 先有雞還是先有蛋的問題,這個問題可能是我理解得不清楚還是Struts2的機制變了。看到SpringSide2中core.web包中有一個Struts的支持類,支持了基本的CRUD操作,這個問題,我卻之前沒有想過,導致有好多很簡單的,但是又不得不寫代碼和配置的webwork Action。于是我就想著給webwork也寫了這樣一個支持類。正好springside3中有對Struts2的一個支持類,參考了一下,struts2和webwork的關系想必大家都知道。應該有可以借鑒的東西。不過借鑒過來之后,發現行不通有問題,后來居然是一個先有蛋還是先有雞的問題:因為攔截器的配置順序。在springside3的struts2支持類中,實體的根據id從數據庫載入或者新建放在了prepare方法中,而這個prepare是使用了一個要求子類重載的getId方法,毫無疑問,在我們通常的使用中,getId肯定是從表單參數中獲取的,所以也就意味著webwork的param攔截器必須在prepare攔截器之前,由于使用了prepare來準備entity,那么model-driven攔截器必須在prepare攔截器之后,不過webwork model driven要能正常工作,實際上,model-driven又必須是在param攔截器之前,在使用ognl進行參數注入之前,必須先通過model-driven攔截器把實體準備好!這就形成了一個先有蛋還是先有雞的問題了。不知道是不是我理解webwork還不夠深入,這個問題如果是采用prepare來做這個工作,那么這個問題是無解的。最終,我還是按照自己的理解做了一個,提供一個getId()默認實現,并且在getId()方法中,不依賴于param攔截器,而是直接從ActionContext中獲取提交的表單Id參數,如下的代碼:
        /**
         * for the webwork ognl injection of parameter
         * 默認情況下,將把傳遞過來的參數轉換成Integer類型,
         * 如果不是這種情況,則需要在子類中重載該方法
         * 
    @param id
         
    */

        @SuppressWarnings(
    "unchecked")
        
    public void setId(Serializable id) {
            
    //如果范型ID的定義不是Array類型,但是卻取到了Array類型的值
            
    //那么可以斷定這是由于頁面傳遞過來的被webwork認成了Array類型了
            
    //這個時候,需要把Array類型的參數值取出來
            
    //這種情況僅僅在這個范型父類中存在,在具體類中不存在這種情況
            
    //而是參數類型可以被webwork自動轉換到相應的類型
            
    //一般沒有ID取值為Array的情況
            if(id instanceof String[]) {
                String[] idArray 
    = (String[])id;
                
    if (idArray.length > 0{
                    
    //從List類型的參數中取出具體類型的Id
                    id = Integer.valueOf(idArray[0]);
                }

            }

            
    //ID should never be ZERO - 
            
    //cope with default value of the primitive types
            if(id instanceof Integer && !new Integer(0).equals(id)) {
                
    this.id = id;
            }

        }

        
    /**
         * getId of the entity, if this.id is null, try get from
         * action context first
         * 
    @return
         
    */

        
    protected Serializable getId() {
            
    if(this.id == null{
                
    //try to get parameter from the actioncontext
                ActionContext context = ActionContext.getContext();
                Map params 
    = context.getParameters();
                Object id 
    = params.get(this.idParamName);
                
    if(id != null{
                    
    //if the parameter is not null,
                    
    //set Id parameter
                    setId((Serializable)id);
                }

            }

            
    return this.id;
        }


    并且還需要提供一個setIdParamName()方法,這樣就可以在webwork配置中注入idParamName了。
    當然還可以這樣做:
    把springside3中struts支持類中prepare做的工作分散到幾個crud操作方法中。首先在:input方法中,根據id是否有值,新建或者從數據庫中load一個entity,這是在插入或者更新一個entity之前的操作;而getModel方法中直接放了一個創建一個entity instance的方法,因為model-driven主要是拿來做表單參數接收的,所以是否從數據庫中load一個entity其實是無所謂的,反正會被表單參數全部覆蓋。不過要是可以在getModel()方法之前知道是對哪個entity進行的操作,然后load該對象,就可以在表單中只傳遞部分屬性值了。按照model-driven必須在param攔截器之前的原則,除非把要編輯的entityId放在session而不是頁面參數中,然后在getModel方法中預先判斷是否是該Action的編輯操作,而load該entity。
    posted @ 2008-03-18 10:40 vulcan 閱讀(365) | 評論 (0)編輯 收藏

    多背一公斤網做個宣傳,其實很早就有種想去支邊教育的想法,但是學生時代有假卻沒錢去邊區;工作了,能供自己出行了,卻沒有了時間.好好利用假期吧,公司組織的旅游一年一次,公休假也有七天,如果能看到那些天真的笑臉該是多么快樂的事情啊.去年去了鳳凰古城,但是商業化的味道太濃,下次讓朋友帶我到一些沒有開發的湘西苗寨去.
    posted @ 2008-02-04 13:00 vulcan 閱讀(208) | 評論 (0)編輯 收藏

    由于項目中需要把漢字轉成拼音,并且是涉及到姓名的轉換,因此不能排除有生僻字的可能.我先是查了一下漢字編碼的知識,漢字編碼知識如下:
    http://www.knowsky.com/resource/gb2312tbm.htm;這里說的是區位碼,實際上區位碼和漢字GBK碼就是同一個東西,在區位碼的區號和位號上分別加上0xA0就得到了GB2312編碼了,但是一看編碼規律,只有第一次漢字和讀音掛鉤,第二級漢字是按照部首進行編排的,所以應該是沒有什么絕對的關系的。于是又在網上找其他的資料,用java實現的,網上流傳廣泛的有兩種方法:但是就我來看都不怎么的,第一種是把漢字讀音和相應區的漢字對照;但是只是涉及了常用的漢字,遇到生僻字是不能轉換的;第二種號稱完整版的方法,居然把漢字碼表的基本對應關系放到了java類中,并且還說什么為了防止函數字符超過65535長度的限制,用了100多個init函數.我實在是不能理解.其實我想得很簡單:找一個漢字拼音對照表,然后初始化時讀入到HashMap中,用漢字為Key,用拼音作為value,然后就可以獲取了.不過也考慮過,GBK碼表的長度有27954個漢字,從來沒有用HashMap處理過如此長度得東西,不知道會不會有什么限制,不過隨便想了一下應該不可能:第一java HashMap的長度不受此限制;第而,查找漢字時,在HashMap中肯定時用二分法或者更好得算法來取Value,那么最壞的情況也不過時lg2(27954),這是很快的.很快實現了,試了一下性能還不錯,在我的機器上:init的時間200ms,查找一個漢字的平均時間為8ms.其實之前我還想過加快速度的更好的方法:把這個漢字編碼表自己先處理一遍,先利用冒泡排序法,把編碼對應在數據文件里排好,給每個讀音漢字對照分配固定的足夠長的字符寬度,對于編碼中沒有漢字的區域,用空白代替;這樣漢字的拼音編碼關系就和漢字本身的編碼建立了聯系,減去第一個漢字的編碼值,就可以得到漢字拼音在數據文件中絕對位置了,然后就可以根據漢字本身的編碼然后用文件隨機讀取的方法,取到拼音值,不知道這樣是不是會比用hashMap的方法要快一點?不過既然HashMap的方案可行了.那么就暫時不取測試了.
    相關的資料:
    (1) GBK漢字全拼音單字源碼表
    (2) 單字多音碼表

    posted @ 2008-01-24 10:50 vulcan 閱讀(2193) | 評論 (6)編輯 收藏

    要刪掉n個目錄里面的小文件,如果用手刪,肯定要刪掉手軟,突然想到用find結合rm來刪,順手就用unix管道來做,居然不行,google了一下發現要這么寫:
    find ./ -iname '_xxxx' | xargs rm -rf
    以前沒有看過xargs,于是man了一下:
    xargs - build and execute command lines from standard input
    man里面有用find刪除的例子。并且通過google得到的只是,對于刪除大量文件,還非得用這種方法不行,因為rm有一個最大刪除數量<20000,
    結合find命令的一些特性,那么這個組合簡直是無所不能了。
    posted @ 2008-01-15 10:51 vulcan 閱讀(148) | 評論 (0)編輯 收藏

    今天進入系統,發現KDE提示升級了,仔細看了一下,以為KDE4在ubuntu發布了。于是想進去看看新的KDE是什么樣子的:)。前段時間感受了一下KDE,感覺還不錯,但是存在一個問題,一直都沒有花時間去解決。就是在KDE,QT程序下面的中文輸入問題。原來是想在KDE下qt程序就用Fcitx程序算了,但是在KDE下用gtk程序時,scim還是自動被調入了。于是想在網上查一下解決辦法。看了許多帖子,問題都集中在使用scim-bridge上,需要安裝scim-bridge還要改動一些xinput的設置到使用scim-bridge取代scim.我看了一下新立得里面的軟件介紹,發現那個scrim-bridge是一個transition package for the scim-bridge-client-qt,再往下看,發現一個帶了ubuntu標識的軟件包,scim-qtimm,它的介紹如下:

    This package brings functionality similar to the immodule for
    GTK+ to the Qt library. The main goal is to extend and enhance
    the input method support in the Qt library, in order to provide
    a modern and powerful multi-language input system.

    看了一下它的依賴關系,并不依賴于scim-bridge等軟件包,而且通常我都更愿意使用有ubuntu標識的軟件包。簡單安裝了scim-qtimm,不用改任何配置,重新啟動x-windows,在qt程序就可以正常輸入中文了。在我這里,我覺得KDE程序比Gnome要快一些,我的ubuntu版本7.10,并且華麗而穩定,完全不是傳言的慢,華而不實。不過blogjava用konqueror登錄不了哦,按鈕不響應。
    posted @ 2008-01-15 09:50 vulcan 閱讀(319) | 評論 (0)編輯 收藏

    Ubuntu7.10軟件庫里默認的Eclipse是3.2版本的。沒有WTP。在windows上的Eclipse都升級到了Europa了,并且是直接下載的JEE版本,也就省去了配置插件的麻煩(其實也不麻煩,并且可以自己通過plugins目錄管理插件,還好些),今天嘗試在Ubuntu上使用新的Eclipse3.3 Europa。
    首先用錯了版本,我的Ubuntu是AMD64的,但是卻用了之前機器上有的Europa for Linux x86的版本,嘗試n次之后,發現還是不能啟動。到了Eclipse官方下載點上,提示我下x86_64版本的,才意識到可能用錯版本了。于是下了64位的版本,版本號是3.3.1.1,終于可以啟動了。不過都打不開Java源文件,總是莫名其妙的Crash掉,log報PermGen Space, google搜索之后,發現3.3.1有memory leak的問題,但是在3.3.1.1修正了,但是我明明是下載的3.3.1.1版本,還是總是莫名其妙的報PermGen錯誤,貌似對于x86_64的Linux版本,該問題沒有被修正。
    看到3.4的MileStone出來了,想嘗試一下,隨著別人的鏈接下載了M1版本,啟動沒有問題,但是發現居然還是Europa,一看版本號,發現是個3.3.0版本!到Eclipse站點上一看,原來已經出到M4了,下載下來看看,這個才是對的3.4版本。試用了一下,還不錯。而下載了幾個Europa的jee版本都總是出現Permgen space的錯誤。看來逼得我要用testing版本了。


    posted @ 2008-01-08 17:05 vulcan 閱讀(526) | 評論 (2)編輯 收藏

    放在外網的機器,比較怕的是ssh的暴力破解,因此記錄登錄失敗日志,并且借用一些攻擊,比如sshguard等,或者寫個腳本自動的把日志中嘗試登錄次數過多的IP加入到hosts.deny中比較明智。不過新裝的Gentoo居然沒有發現/var/log/auth.log這個日志文件?用Ubuntu和Redhat的時候都發現有的。查了一下網絡,才發現是syslog-ng的配置問題。Gentoo默認的syslog-ng的配置中并沒有配置些auth log的項,可以加上一下三行:
    filter f_authpriv { facility(auth, authpriv); };
    destination authlog { file(
    "/var/log/auth.log"); };
    log { source(src); filter(f_authpriv); destination(authlog); };
    這樣登錄失敗的嘗試就可以被記錄了。syslog-ng很好,有空還要好好學一下詳細使用。
    對于配置了iptables的用戶,用sshguard的解決方案比較好,它自動的處理登錄失敗的嘗試,并且在iptables拒絕嘗試過多的IP,挺好的,不過他在gentoo上還是被hardened profile mask的。

    posted @ 2007-12-29 12:40 vulcan 閱讀(404) | 評論 (0)編輯 收藏

    今天更新完成之后,機器忽然非常慢。意識到有點不對,遂重啟。啟動之后,強制檢查磁盤,并且失敗,再重啟兩次之后,還是自動檢查磁盤通不過。第三次重啟之后,進入到shell, fsck居然通過,自動修復完成,重啟,好了。真的很擔心,擔心又要裝機器。不知道為什么,用了聯想的這個啟天M6800之后(Intel Pentium D 945, sata硬盤)之后,不管系統是用windows還是Linux程序出問題的頻率很高,特別是在windows下,不過重啟之后問題又消失了。而且集中體現在Java程序如Eclipse,Netbeans,還有DotNet的程序,比如VS,SQL Server 2005 Studio Express等等阿,有時會出現無法啟動的情況。或者是我基本只用這幾個程序,所以問題顯得多一點?
    posted @ 2007-12-29 09:50 vulcan 閱讀(110) | 評論 (0)編輯 收藏

    僅列出標題
    共5頁: 上一頁 1 2 3 4 5 下一頁 
    主站蜘蛛池模板: a在线观看免费视频| 国外亚洲成AV人片在线观看| 中文字字幕在线高清免费电影| 亚洲va成无码人在线观看| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 夜夜春亚洲嫩草影院| 日韩免费观看的一级毛片| 亚洲精品免费在线| 国产午夜精品免费一区二区三区| 国产成人亚洲精品电影| 亚洲偷偷自拍高清| 亚洲一级大黄大色毛片| 久久精品国产亚洲77777| 国产∨亚洲V天堂无码久久久| 四虎永久免费地址在线观看| 毛片大全免费观看| 国产妇乱子伦视频免费| 久久久久久AV无码免费网站| 好猛好深好爽好硬免费视频| 瑟瑟网站免费网站入口| 色欲色欲天天天www亚洲伊| 在线观看亚洲AV每日更新无码| 亚洲福利一区二区| 亚洲影院在线观看| 亚洲欧洲日韩不卡| 人人狠狠综合久久亚洲88| 精品国产亚洲男女在线线电影 | 337P日本欧洲亚洲大胆艺术图| 亚洲av无码久久忘忧草| 亚洲黄色免费观看| 亚洲综合激情六月婷婷在线观看| 亚洲AV无码专区国产乱码4SE | 国产亚洲精品免费视频播放| caoporm碰最新免费公开视频| 一级毛片大全免费播放| 国产VA免费精品高清在线| 久久九九免费高清视频| a毛片久久免费观看| 中文在线观看免费网站| 久草福利资源网站免费| 亚洲毛片免费视频|