vulcan

          低頭做事,抬頭看路

             :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            41 Posts :: 7 Stories :: 28 Comments :: 0 Trackbacks

          搜索

          •  

          最新評論

          閱讀排行榜

          #

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

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

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

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

          /**
           * gettext支持類
           * 主要功能:可以自動獲取調(diào)用者信息,從而自動的根據(jù)local尋找resource
           * (1) 查找和類名相同的properties文件
           * (2) 如果(1)失敗,則默認(rèn)查找調(diào)用者包中的message.properties文件
           * 如果找不到相應(yīng)的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"));
          不過還欠缺一點功能:對于翻譯文本中數(shù)字參數(shù)等的支持,需要加強(qiáng)
          posted @ 2008-03-21 18:13 vulcan 閱讀(976) | 評論 (0)編輯 收藏

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

              @SuppressWarnings(
          "unchecked")
              
          public void setId(Serializable id) {
                  
          //如果范型ID的定義不是Array類型,但是卻取到了Array類型的值
                  
          //那么可以斷定這是由于頁面?zhèn)鬟f過來的被webwork認(rèn)成了Array類型了
                  
          //這個時候,需要把Array類型的參數(shù)值取出來
                  
          //這種情況僅僅在這個范型父類中存在,在具體類中不存在這種情況
                  
          //而是參數(shù)類型可以被webwork自動轉(zhuǎn)換到相應(yīng)的類型
                  
          //一般沒有ID取值為Array的情況
                  if(id instanceof String[]) {
                      String[] idArray 
          = (String[])id;
                      
          if (idArray.length > 0{
                          
          //從List類型的參數(shù)中取出具體類型的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了。
          當(dāng)然還可以這樣做:
          把springside3中struts支持類中prepare做的工作分散到幾個crud操作方法中。首先在:input方法中,根據(jù)id是否有值,新建或者從數(shù)據(jù)庫中l(wèi)oad一個entity,這是在插入或者更新一個entity之前的操作;而getModel方法中直接放了一個創(chuàng)建一個entity instance的方法,因為model-driven主要是拿來做表單參數(shù)接收的,所以是否從數(shù)據(jù)庫中l(wèi)oad一個entity其實是無所謂的,反正會被表單參數(shù)全部覆蓋。不過要是可以在getModel()方法之前知道是對哪個entity進(jìn)行的操作,然后load該對象,就可以在表單中只傳遞部分屬性值了。按照model-driven必須在param攔截器之前的原則,除非把要編輯的entityId放在session而不是頁面參數(shù)中,然后在getModel方法中預(yù)先判斷是否是該Action的編輯操作,而load該entity。
          posted @ 2008-03-18 10:40 vulcan 閱讀(367) | 評論 (0)編輯 收藏

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

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

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

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

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

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

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


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

          放在外網(wǎng)的機(jī)器,比較怕的是ssh的暴力破解,因此記錄登錄失敗日志,并且借用一些攻擊,比如sshguard等,或者寫個腳本自動的把日志中嘗試登錄次數(shù)過多的IP加入到hosts.deny中比較明智。不過新裝的Gentoo居然沒有發(fā)現(xiàn)/var/log/auth.log這個日志文件?用Ubuntu和Redhat的時候都發(fā)現(xiàn)有的。查了一下網(wǎng)絡(luò),才發(fā)現(xiàn)是syslog-ng的配置問題。Gentoo默認(rèn)的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很好,有空還要好好學(xué)一下詳細(xì)使用。
          對于配置了iptables的用戶,用sshguard的解決方案比較好,它自動的處理登錄失敗的嘗試,并且在iptables拒絕嘗試過多的IP,挺好的,不過他在gentoo上還是被hardened profile mask的。

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

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

          僅列出標(biāo)題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 阳原县| 平南县| 晋中市| 黄平县| 德兴市| 喜德县| 本溪市| 内黄县| 眉山市| 黄平县| 福泉市| 芒康县| 马边| 青铜峡市| 彩票| 和硕县| 通海县| 防城港市| 奉新县| 集安市| 延庆县| 日土县| 奉化市| 吉林省| 同仁县| 盱眙县| 新昌县| 石柱| 桃源县| 宜兰县| 阆中市| 台中县| 锡林浩特市| 囊谦县| 涿州市| 游戏| 木兰县| 调兵山市| 虎林市| 古交市| 中宁县|