#
上個星期升級了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是我覺得最好的.
需要這個功能,但是卻發現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"));
不過還欠缺一點功能:對于翻譯文本中數字參數等的支持,需要加強
替 多背一公斤網做個宣傳,其實很早就有種想去支邊教育的想法,但是學生時代有假卻沒錢去邊區;工作了,能供自己出行了,卻沒有了時間.好好利用假期吧,公司組織的旅游一年一次,公休假也有七天,如果能看到那些天真的笑臉該是多么快樂的事情啊.去年去了鳳凰古城,但是商業化的味道太濃,下次讓朋友帶我到一些沒有開發的湘西苗寨去.
由于項目中需要把漢字轉成拼音,并且是涉及到姓名的轉換,因此不能排除有生僻字的可能.我先是查了一下漢字編碼的知識,漢字編碼知識如下:
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) 單字多音碼表
要刪掉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命令的一些特性,那么這個組合簡直是無所不能了。
今天進入系統,發現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登錄不了哦,按鈕不響應。
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版本了。
放在外網的機器,比較怕的是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的。
今天更新完成之后,機器忽然非常慢。意識到有點不對,遂重啟。啟動之后,強制檢查磁盤,并且失敗,再重啟兩次之后,還是自動檢查磁盤通不過。第三次重啟之后,進入到shell, fsck居然通過,自動修復完成,重啟,好了。真的很擔心,擔心又要裝機器。不知道為什么,用了聯想的這個啟天M6800之后(Intel Pentium D 945, sata硬盤)之后,不管系統是用windows還是Linux程序出問題的頻率很高,特別是在windows下,不過重啟之后問題又消失了。而且集中體現在Java程序如Eclipse,Netbeans,還有DotNet的程序,比如VS,SQL Server 2005 Studio Express等等阿,有時會出現無法啟動的情況。或者是我基本只用這幾個程序,所以問題顯得多一點?
|