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 閱讀(682) | 評論 (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 閱讀(976) | 評論 (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 閱讀(366) | 評論 (0)編輯 收藏

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

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 阿拉善盟| 禹城市| 开原市| 吉安市| 萍乡市| 开封县| 泾川县| 藁城市| 台前县| 漾濞| 香港 | 澜沧| 镇原县| 长宁区| 通许县| 徐水县| 二手房| 正蓝旗| 封丘县| 长宁区| 延边| 湾仔区| 洞头县| 新晃| 蕉岭县| 象山县| 察哈| 乳源| 望奎县| 雷山县| 如皋市| 密云县| 革吉县| 安吉县| 梁平县| 新绛县| 九江县| 资源县| 甘谷县| 张家川| 井陉县|