2007年12月18日 星期二

[Python][Ubuntu]安裝qPyProfiler

qPyProfiler具有易懂的介面,對分析你的Python程式效率非常有幫助。

下載處: http://www.digitalfox.org/projets/qPyProfiler/

下載後解壓縮(假設在./qPyProfiler)

需要的程式及套件
apt-get install pyqt4-dev-tools (會幫你安裝需要套件,其中包含python-qt4)
apt-get install python-profiler

接著執行./qPyProfiler/uic.sh
再執行./qPyProfiler/qPyProfiler.py即可

關鍵字: python profiler ubuntu qt4 uic ui_mainWindow

2007年11月18日 星期日

[svn] 我屈服了

之前在Windows上開發程式時,都有習慣利用Subversion及TortoiseSVN備份我的程式,也讓我在不同工作場所可以取得最新的程式。現在轉戰Linux,當然也想遵循此法,找找適合的軟體,試用了許多軟體,包括與nautilus整合的軟體及獨立的程式(rapidsvn, subcommander,kdesvn, esvn,...),都找不到與TortoiseSVN同樣好用的,最後,選了一個最"正常"的 kdesvn,一用就用了三個月。
但kdesvn經常出現不知為何的"當機"狀況,搞得我也快起孝了。最後,我屈服了,決定回歸基本,使用svn命令。原先尋找軟體就是希望不要學svn,畢竟這只是工具,但在相關軟體成熟度不夠的情形下,只好花些時間學學。

基本功能:

取得svn server上的檔案
svn checkout    [Remote URL]  [Local Path]

將檔案或目錄加入svn版本控制 // 這個很不方便,還在找看看有沒有比較容易的作法
svn add [LocalPath or File]

查詢本地端檔案的新增狀況,本地端及伺服器端的檔案修改狀況
svn status -u [Local Path]

將本地端檔案更新至伺服器
svn commit [LocalPath] -m "[Message]"

更新本地端檔案
svn update [LocalPath]

2007年11月13日 星期二

[Ubuntu] Ubuntu7.10+Firefox+Google Toolbar = Google Bookmark(書籤)不能用?

如果剛裝好ubuntu 7.10 + firefox + google toolbar,Google 書籤的功能是無法作用滴。
加裝 libstdc++5(用synaptic找找libstdc)就可以了。
安裝好後記得利用工具>附加工具停用Google toolbar,重新啟動Firefox後再啟用toolbar。

2007年11月8日 星期四

[Ubuntu]安裝proftpd之前

找了很多網路文章都沒提到這件重要的事:

在安裝需要inetd或xinetd的服務前,請先安裝inetd或xinetd,預設ubuntu是沒安裝地。

2007年11月1日 星期四

Zend Studio for linux中文顯示問題

由於Zend Studio(Zend Development Enviroment or ZDE)需利用Java Runtime Enviroment(JRE)來執行,而安裝ZDE時會安裝JRE,內建的JRE並不支援中文字型,所以我們需要幫它安裝一個。JRE中的字型是安裝在jre/lib/fonts/目錄下,可以在ZDE的安裝目錄下找到,JRE對字碼的處理大致採用以下步驟:(1)如果字碼可以在jre/lib/fonts/目錄下的字型檔找到,則展示此字型檔的內容(2)如果找不到,怎看看jre/lib/fonts/是否有一目錄名為fallback,並利用此目錄中的字型檔(3)如果上述都失敗,則秀出???? 或□□□□。
在ZDE中,為了可以編輯中文及看到正確的中文提示(如是,否),我們必須在建立一目錄jre/lib/fonts/fallback,並加入一中文字型檔,在ubnutu之下可以安裝ttf-arphic-uming(如果你的ubuntu中文顯示沒問題,通常已經安裝了),並在/usr/share/fonts/arphic下將uming.ttf複製到fallback目錄中。重新開啟ZDE,應該顯示及編輯就都沒問題了。

2007年10月20日 星期六

[Python][Ubuntu]在Ubuntu下開發PyXPCOM所需安裝的套件

firefox-dev: 才有xpidl
python-xpcom

2007年10月18日 星期四

執行Virtualbox卻出現"初始化COM服務失敗"

原本安裝了數十次都沒有這個問題,直到遇到了 Windows Tablet PC才遇到,找找網路發現有這問題的還不少,解決方案如下:

進入控制台>地區及時間選項>語言>詳細資料>進階>取消延伸對所有程式的進階文字服務支援

這樣就OK了

2007年10月5日 星期五

[Ubuntu]如何致能.htaccess

在Ubuntu7.04中,Apache2的Directory設定在/etc/apache2/sites-enabled目錄下的000-default,Directory的設定中有一項叫做AllowOverride,預設值是None,意思就是不能用.htaccess設定。最簡單Enable .htaccess的方法就是將其改為 All,如果要細部設定,請參考這裡

在XP下用VirtuaBox 1.5安裝Ubuntu 7.04心得

在XP下用VirtuaBox 1.5安裝Ubuntu 7.04
請注意以下兩點:
1. 請用alternate CD,不要用Live CD (gparted不太正常)
2. 分割磁區時請用手動,自動分割會失敗

2007年9月25日 星期二

安裝nltk前記得安裝python-tk

只是個小提醒

2007年9月23日 星期日

Ubuntu + A6Q + ATI X700的解析度設定

在我的筆電Asus A6Q 安裝 Ubuntu 7.04,安裝好後螢幕解析度為1024x768,在偏好設定中螢幕解析度有出現1280x800的選項(A6Q的螢幕解析度),但設定後顯示有問題,畫面殘破不堪。
解決的方法:將/etc/X11/xorg.conf檔中的 Section "Screen" 下的所有Subsection "Display"中的Modes,都加上"1280x800",如下範例:

SubSection "Display"
Depth 1
Modes "1280x800" "1024x768" "800x600" "640x480"

再重新起動xwindow並選擇1280x800的解析度,就不會有畫面破損的問題了

2007年9月9日 星期日

[Python] Pyhton + MySQL + Unicode

正確寫法如下
conn1 = MySQLdb.connect(host="localhost",user="root",passwd="xxxxxxx",db="myDB",init_command="set names utf8")
重點就在init_command參數要下,同時use_unicode不要設定為true (我也不懂為什麼),總之這樣就可以正確存取charset設為utf8的MySQL資料庫了。

2007年9月8日 星期六

MySQL的檔案複製到Linux檔案系統的注意事項

MySQL的MyISAM格式非常方便,例如我有一個資料庫名稱是myDatabase,當我要將此資料庫移至其他電腦時,只需將data目錄下的myDatabase目錄複製到另一台電腦的data目錄下即可,但如果是移至Linux檔案系統,記得要將目錄及其下的檔案作權限(chmod 660) 及 使用者群組的設定 ( chown mysql:mysql ),不然在做SQL指令的操作時,就會發生 Permission denied的問題 (例如 errno : 13)。

2007年9月7日 星期五

修改Ubuntu選單 ( menu ) 內容

Ubuntu選單內容放在/usr/share/applications目錄下,我以mysql-admin這個套件為例,安裝好mysql-admin後,雖然可於應用程式/軟體開發下看到 MySQL Administrator的選項,但由於執行的權限不夠,並不能用mysql-admin修改任何設定(因為設定檔在/etc/mysql下),想要修改此選項做到像Synaptic一樣,執行前先取得足夠權限 (su) ,可以修改/usr/share/applications下的MySQLAdministrator.desktop檔,將其中的Exec改為 /usr/bin/gksu /usr/bin/mysql-admin,就是在執行mysql-admin前,先執行gksu (gnome下的su),如此一來,就可以直接用選單執行mysql-admin,不用在終端機下執行sudo mysql-admin了。

2007年9月5日 星期三

FTP Server using non-standard port and behind NAT

我的環境如下
NAT: D-Link DI-707
FTP Server: vsftpd
port: 9999

在NAT的設定中,除了需開啟port 9999外,也需要開啟 port 20以供傳輸資料(vsftpd的設定),另外也需要設定non-standard port給9999(具我所知,大部分的NAT都有此設定),最後,你如果需要使用PASV mode聯至ftp server,還需開啟額外的port供PASV使用,例如我就設定了兩個port:9001及9002,除了NAT的設定外,也需要修改vsftpd.conf,加入下列兩行

pasv_min_port=9001
pasv_max_port=9002

這樣就只會使用9001及9002 port 了。

2007年8月30日 星期四

[Ubuntu] Linux 下查Kernel 版本

uname -a

2007年8月7日 星期二

用KSnapshot擷取畫面(Screen Capture)

預設Xubuntu中似乎沒有擷取螢幕畫面的程式,用Synaptic套件管理程式搜尋,找到一套名為KSnapshot的程式,安裝好執行的畫面如下(就是用Ksnapshot抓的):


非常簡單易用的畫面擷取工具,比較值得注意的是下方Snapshot delay的功能,它讓你能夠在限定時間內找尋你要擷取的畫面,特別是在擷取特定視窗及KSnapshot本身時最有用,上面那張就是這樣擷取到的。

2007年7月16日 星期一

虛擬主機(Web hosting)使用心得:Lunarpages.com

簡介:
Lunarpages是我第一個申請的美國虛擬主機公司,美國的虛擬主機通常有空間大,頻寬足,且費用低廉的特性,Lunarpages其實已經是當中費用算中上的了,但一個月也只要10美元,不到台幣400元,一次繳兩年甚至可以低到每月美金6.95元。申請的手續非常簡單,填一些表格後就完成了,只要不是在美國的假日時刻申請,通常回覆都很快(這是我的親身體驗,因為我總共申請了兩個,一個在假日,一個不是)。
美國的虛擬主機公司通常必需用電話聯絡確認你的身分,以確定你所填的資料不是造假的,甚至有些還必須傳真或Email你的信用卡及護照以作確定。原本Lunarpages也要和我連絡確定資料,但因為時差一直沒連絡上,後來因為信用卡扣款順利,加上我寫了一封Email告訴她們我的英文實在很濫,打給我確認實在沒什麼意義,既然錢收到了,就省了這段吧!沒想到這樣也過關了。
Lunarpages使用cpanel作為控制管理介面,使用起來非常簡單,只要你懂得幾個關鍵字,如Domain,Email,FTP,管理起來應該都沒問題。

Lunarpages提供多達六種虛擬主機方案,我申請的兩個都是最便宜的Basic hosting方案,對其他的方案內容就比較不清楚,比較值得一提的是Lunarpages有提供Windows的方案(Windows hosting),大部分的美國虛擬主機公司都只提供Linux主機方案,最大的差別應該是Windows方案可讓你放ASP及ASP.NET程式,並且有MS SQL Server可選擇(我查詢過Lunarpages內的說明文件,她們似乎不提供存取Access的功能),附帶一提,我申請的Basic hosting方案使用Linux主機。

以下列出一些Lunarpages Basic Hosting方案的特性
1. 一個方案可以管理10個Domain (如001.com, 002.org, 003.com, 004.tw,....)
2. 無限制的Subdomain (如 www1.001.com, www2.001.com)
3. 350GB的空間
4. 3500GB的每月流量
5. 無限制數量的資料庫(MySQL or Postgre)、Email帳號、FTP帳號
6. 提供PHP4/5(很多公司不提供PHP5),Perl,Python及Ruby on Rails
7. 客服方式:Email或電話

最後,要認清一個事實是,這些虛擬空間便宜的原因是因為眾多的客戶使用相同一台主機,如果跟你同住在一起的客戶銷耗的頻寬及主機資源多時,你的網頁傳輸或執行可能就會比較差,完全取決於運氣。好在這些公司都有提供30天不滿意退費,你可以嘗試看看再作決定,當然,如果後來的同居人擾亂一池春水,那就只能怪你運氣不好了。

我到目前為止總共向五間公司申請了7個空間,雖各有利弊,但目前的使用狀況良好,我非常滿意。

參考資料:
1. Lunarpages
2. My-Life 國外虛擬主機介紹
3. 五大虛擬主機比較

打工

偶然的機會,接到一個撰寫網站的CASE;因為這個機會,學會了PHP。
這個CASE(其實是好幾個CASE)花了我三個星期的時間,每天都沒日沒夜的趕工。花了一個星期的時間學習PHP及如何利用國外的虛擬空間架設網站,剩下兩個星期Coding。很多東西都是第一次,但終於不負眾望的完成這個CASE。老實說,報酬並不是太好(30K),但學習到的東西卻是無價。當然,也讓我這三星期的日記成了空白。

真的不容易

寫日記真的不是件容易的事。
首先,要能克服忙碌一整天後,再將今日所見所學所得的東西寫成自己看得懂的文章,需要的是毅力及智慧,克服一直不斷侵襲的睡魔,堅持一定要完成這項任務,需要的是體力及耐心,最後,要在不被別人察覺的情形下寫下日記,需要的是掌握時間的能力。
這樣看起來,我完全沒有這些特質。儘管如雪片般飄來的案子(其實是打工,根本不是正職工作),讓我差點沒過勞死,但我想比我更忙,更沒時間的應該大有人在,然而他們還是完成了這個任務。但我不想放棄,不為名,不為利,只是想替自己留下些可以回憶的東西,如此而已。

每天都寫日記,真的不是件容易的事。

2007年6月24日 星期日

記得裝im-switch

太忙了,原本預計端午連假安裝xubuntu卻搞到今天。一如往常,安裝非常容易,然而安裝後希望在此寫下"我成功了"四個字都不行。原因是無法切換輸入法,趕緊看看SCIM有沒有安裝,有。調整了一下裡面的參數,按OK跳出時秀出警示,大概是說修改的設定不一定會馬上套用,要我去執行SCIM,馬上照作,在終端機提示符號下輸入scim,看似沒問題,系統匣出現了SCIM的圖示,卻要一直處於執行狀態,無法將終端機關掉,再輸入scim --help看看黑優補,原來有daemon模式,輸入scim -d後就可以將終端機關了。

正當我滿心歡喜想在"我成功了"四個字後面再加個"原來我搞錯了",卻發現系統匣上的SCIM圖示只是個幌子,除了可以進入設定外啥都不能作。在網路上爬文看看有甚麼解決方案,發現還不少,但要再加上自訂的設定檔(如/etc/X11/Xsession.d/74scim)不是我的風格,總覺得這樣太看不起ubuntu團隊了。再繼續爬,發現一種東西叫input method switch framework(im-switch),用意就是切換這些輸入管理平台(如gcim、scim),馬上安裝看看,果然在登出後(不一定要登出)就可以正常使用了,這篇文章也是用新的 xubuntu + firefox + im-switch + scim完成的。

下次安裝xubuntu時,記得裝im-switch!

2007年6月17日 星期日

利用Java切割XML

XML檔案很方便。一方面易讀,不需要特殊軟體就可得知內容;一方面支援性佳,大部分的程式語言都有解析XML檔的程式庫。但它也有缺點,當檔案太大時,不容易找出特定的資訊。這裡的不容易有兩個解釋:一個是特定資訊的比對,一個是速度。資料的比對我門可以用XPath或XQuery找尋特定節點及內容,但還是有速度太慢的問題。我最近所遇到的 XML檔大小都介於1M至5M之間,一次都要搜尋兩三百個這種檔案,如果每個都要用XPath去找尋特定節點,是節點數量而定,大概都要花上數分鐘至數十分鐘。所以在處理這種狀況時,我運用了兩種方法,一種是建立索引,將所要找的內容與XML檔案之間的連結儲存,就類似Java中的Map;另外為了減輕XPath計算的負擔,將XML切割成許多小檔案,當然,Map之間的連結也都連結至這些小檔案。

彷間的Java書籍及網路好像甚少提及此部分,大多是用DOM及SAX讀取XML檔,並利用這些model來讀取節點。以下面這個例子來看,


<books>
<book id="1">
<author>Mike</author>
<title>Guess who</title>
<description>
This is a book about a man who never ......
</description>
</book>
<book id="2">
<author>John</author>
<title>Guess where</title>
<description>
This is a book about a place where no ......
</description>
</book>
</books>


如果我要將兩個book節點分別存成檔案該如何做呢?一般用DOM來取得book節點後,由於其下無內容,就只能讀取到它的屬性,至於author、title及description都只能再利用getChildNodes去取得,如此就只能自己去拼湊這個XML檔了,當XML結構更複雜時,這任務就更艱難了。

感謝w3c.org提供的XML Serializer可將DOM序列化成XML字串。 下面的範例程式可將上述檔案切出兩個book節點及其內容:


import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.w3c.dom.ls.*; // 就是它
import java.io.*;

public class TestXMLSerializer {
public static void main(String[] args) {
try {
File f = new File("test.xml");

// ------ 取得XML Document ----------
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(f);

// -------- 建立DOM Serializer ---------
DOMImplementationLS lsimpl = (DOMImplementationLS) doc.getImplementation();
org.w3c.dom.ls.LSSerializer ls = lsimpl.createLSSerializer();
ls.getDomConfig().setParameter("xml-declaration", false);

//---------選擇欲擷取內容的節點----------
NodeList bookNodeList = doc.getElementsByTagName("book");
if (bookNodeList.getLength()>0) {
for (int i=0;i<bookNodeList.getLength();i++) {
Node bookNode = bookNodeList.item(i);

// ------這樣就可以擷取book節點下的所有內容了-------------
String bookContent = ls.writeToString(bookNode);
System.out.println(bookContent + "\n");
}
} else {
System.out.println("There is no tag named 'book'");
}
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}
}


當然,切割完的部分如果不符合XML規則,例如沒有單一root,就要自行加上,如此就可以將XML切割成好幾個小XML檔了。

2007年6月16日 星期六

我的電腦

身為一個系統開發人員,有兩台以上的電腦是很正常的事。 我在家中及辦公室都有兩台電腦,其中ㄧ台是Windows XP環境,另外一台則是Xubuntu7.04(之前是Ubuntu6.10)。其實主要都還是在XP上運作,寫程式看影片都靠它;Ubuntu6.10剛安裝還挺新鮮的,但想試試燒錄,失敗;想看看DVD,失敗;最後就只能上上網了。(當然後來也花了一些時間尋找燒錄及看DVD的解決方案,看DVD是成功了,燒錄還是怪怪地)。
現在我想開始建立一個輕量級的開發環境,現在想到的就是Xubuntu+JDK+NetBeans,既然現在都用Java在開發程式,我想這樣應該就足夠了吧。這個連續假期就來試試看。

我的青春,我的假期都將奉獻給我的電腦(們)T^T

2007年6月15日 星期五

Google 是否快變成下一個微軟?

我喜歡Google,搜尋引擎用Google,Email用Gmail,Blog用Blogger(Google的子公司),Browser toolbar,用Google toolbar,瀏覽器首頁用iGoogle。我覺得很理所當然,透過大型企業的收益來服務小市民,相信Google必是許多'貧'民的偶像,稱她為神也不為過。然而,是否神也會起凡心?Google意圖在eBay贊助的大型聚會活動上,用'免費的食物、免費飲料、免費現場音樂,還有免費的按摩'來吸引客戶使用Google Checkout。當Google將收費的腦筋移到小市民身上時,是否就意味著Google已經意識到它的廣大支持群眾已少不了它,與當年微軟的IE瀏覽器策略如初一澈。
當然,我想很多人會說,微軟的邪惡帝國一開始就是建立在收括民膏民脂上。我不反對,但Google何嘗不是,表面上雖然一般小市民只是用著Google提供的免費服務,但背後Google也利用了這些機會來向第三方收取可觀的費用。更像極微軟的是:它們都利用了背後龐大的資金,利用免費的手段,企圖擊敗對手,以獲得更高的利益。

Google 是否快變成下一個微軟了呢?

2007年6月14日 星期四

我還在等

用NetBeans 6.0 Preview有一段時間了,大大小小問題的確不少,但都沒有我現在碰到的奇怪。在專案進行中,突然想試試Javadoc generation,沒想到它看不懂NetBean自動加在檔案上方的建立時間,由於時間格式中有中文,立刻就想到需要加上-encoding參數,讓javadoc能了解我的source code是哪種編碼,利用專案屬性頁看看可否加上這個參數,結果在Source頁的最下方就已經預設是利用UTF-8作編碼了,卻還是要我在Documenting頁加上-encoding "UTF-8" 才能過關,我想NetBean是不是應該更"貼心"一點,預設就將javadoc 的 encoding參數設成跟Source編碼相同呢?
其實上面的還是小問題,順利產生文件後,看到文件就昏倒了,每一個class都列出兩次,調整了各種參數都沒用,最後火大自己用javadoc指令產生看看(花了我不少時間),結果竟是正常,當場在昏倒,看來在正式版出來之前,還有不少鳥氣要受!(但它還是所有Java IDE中最棒的)

(正常的)NetBeans 6.0,我還在等..........

2007年6月12日 星期二

平凡

我加入了Google AdSense。

加入的原因有三:

  1. 99.999999%是為了能利用它來吸收其他網站的資訊,例如現在就會列出一個Free UML Design Tool的網站,滿足我的求知慾。
  2. 0.0000009%是為了能知道有多少人到我的blog參觀。
  3. 剩下那接近0的理由是為了賺一點零用錢。
以上是我很久沒流露出的虛偽談話,


我只是個平凡人啊!!!!!!!!!!!

2007年6月10日 星期日

我愛Profiler

三四年前用C#開發程式時,有下載過一套名為Ants Profiler的試用軟體,當時主要是希望找出專案中的效能瓶頸,試用後非常喜歡,但無奈預算不足,之後都還是用土法煉鋼慢慢Trace。現在開始使用Java,選定NetBeans 5.5作為開發工具,ㄧ旦專案規模變大了,效能問題也隨之產生。搜尋了一下Java Profiling的相關資料,發現NetBean也有進行相關的開發,但由於必須另外安裝,馬上就被我否決了(這也是我不選擇Eclipse及DIY電腦的原因)。這時候救星出現了,NetBeans.org推出NetBeans 6.0 Preview (M9),雖然還不是正式版,但發現內含Profiling及UML Modeling的功能,馬上就決定把NetBeans 5.5丟了。現在,他(Profiler in NetBeans 6.0 Preview (M9))已經幫我發現了無數次的程式效能瓶頸,替我的工作(Trace)節省的不少時間。 我愛你。

2007年6月9日 星期六

用C#及Interop取出Office同義字資訊

感謝Interop,讓我們能再利用ms office中的超炫功能,在開發研究專案時需要能取得同義字,以往都是使用Wordnet,但我發現Wordnet中的同義字分的太細了,例如good及nice在wordnet就不算同義字。而手邊也沒有現成可供程式讀取的字典,所以就開始打MS office 中同義字功能的腦筋。在搜尋網路上相關的文章後,發現也很少人在研究這個問題,以下是一篇不錯的討論,
Unable to cast object of type 'System.String[*]' to type 'System.String[]'.
我也以這篇為基礎用C#寫了以下測試程式,列出hard這個字的同義字:


using System;
using System.Collections;
using System.Text;

//記得先在Visual Studio的方案總管中加入參考,
//這個參考位於COM標籤中
//的Microsoft Word 11.0 Object Library (Office 2003的狀況)
using Microsoft.Office.Interop.Word;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
ApplicationClass AC = new ApplicationClass();

object LangID = WdLanguageID.wdEnglishUS;
// 沒試過其他語言,將來有機會再試試

SynonymInfo SI = AC.get_SynonymInfo("hard",ref LangID);

IEnumerable PartOfSpeechList = (IEnumerable)SI.PartOfSpeechList;
// 不可以直接轉換為int[],原因請參考上述的討論連結
// 取出hard這個字的詞性代號,如形容詞是0,副詞是2
// 因為hard的形容詞同義字有四種意思,副詞有一種
// 所以列出來是 0 0 0 0 2

foreach (int p in PartOfSpeechList)
Console.Out.WriteLine(p);

// 試了幾個字,大部分都沒有相關字
IEnumerable RelatedWordList = (IEnumerable)SI.RelatedWordList;
foreach (string r in RelatedWordList)
Console.Out.WriteLine(r);

// 如前述,有五個意義
IEnumerable MeaningList = (IEnumerable)SI.MeaningList;
foreach (string m in MeaningList)
{
// 在MeaningList裡的是同義字的第一個字
Console.Out.WriteLine("-----" + m + "-----");
// 要利用這個字去取出所有同義字
object m1 = m;
IEnumerable SynonymList = (IEnumerable)SI.get_SynonymList(ref m1);
foreach (string s in SynonymList)
Console.Out.WriteLine(s);
}
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
Console.Out.WriteLine("Done");
}
}
}


利用以上程式,在配合上詞性判斷程式,應該就可以取出較為一般人所接受的同義字了。

2007年6月6日 星期三

以陣列作為Hashtable的Key值

這星期在開發專案時,遇上了需要以陣列作為Hashtable的Key值的狀況,但直接以陣列當Key值加入Hashtable卻會發生get或containsKey無法正常運作的狀況,瀏覽了一下網路,發現只有少數在討論的網頁,下面是最接近的一篇討論:
http://www.velocityreviews.com/forums/t150335-arrays-as-key-in-a-hashmap.html
但實際測試後卻發現有以下問題

1. 利用Wrapper的例子只能先將陣列先轉換成Object陣列後才能使用
2. List(利用Arrays.asList做轉換)只有在物件陣列有效,如果是基礎型別(primitive type)的陣列,例如int[]及double[]就不適用

根據上述問題,如果將Wrapper加入泛型,也一樣無法解決基礎型別的問題,最後找到的通用解決方案如下:

1. 如果是Java基礎型別陣列或內建類別陣列(應該都已實作hashCode()及equals(Object obj)),則可利用下列Wrapper


class ArrayWrapper
{
Object[] m_array;

public ArrayWrapper(Object array) {

m_array = new Object[Array.getLength(array)];
for (int i=0;i<array.getlength(array);i++)
m_array[i] = Array.get(array, i);
}

public int hashCode() {
return Arrays.hashCode(m_array);
}

public boolean equals(Object o) {
ArrayWrapper aw = (ArrayWrapper)o;
return Arrays.equals(aw.m_array, this.m_array);
}
}

由於無論是基礎型別陣列或Java內建類別陣列皆可以Object當參數,所以不須轉換成Object陣列。當然在當參數傳入前或後,必須先確定(或檢查)是否為陣列。

2. 如果是自訂類別陣列,ㄧ定要實作hashCode()及equals(Object obj),再使用ArrayWrapper,例如下面的例子,

public class ObjectKey{

private String m_String;
private double m_Double;
private int m_Int;

public ObjectKey(String str, double dou, int i) {
this.m_String = str;
this.m_Double = dou;
this.m_Int = i;
}

public int hashCode(){
return this.m_String.hashCode();
}

public boolean equals(Object o) {
ObjectKey ok = (ObjectKey)o;

return ((this.m_String.equals(ok.m_String))
&& (this.m_Int == this.m_Int)
&& (this.m_Double == this.m_Double));
}
}

基本上hashCode的設計可以簡化,差別只會影響效能,但一定要有;equals就要看設計時如何定義兩物件相等,如上例子,如果認定m_String及m_Double相等即可,那就只要寫成
return ((this.m_String.equals(o.m_String)) && (this.m_Double == o.m_Double));

Java的壓縮

當處理資料量大時,而記憶體或硬碟不夠大時,壓縮是ㄧ個很好的解決方案,最近開始接觸Web網頁資料處理,所面對的都是至少10GB以上的資料量,所以希望能藉助Java中內建的壓縮機制,一個簡單的範例如下:


import java.io.*;

import java.util.zip.*;
import java.util.*;

public class TestGZipString {

public TestGZipString() {
}

public static void main(String[] args){
try {

String str1 = "Test compressing string";

//壓縮,將壓縮結果存成byte陣列
ByteArrayOutputStream baout = new ByteArrayOutputStream();

GZIPOutputStream gzipout = new GZIPOutputStream(baout);
OutputStreamWriter writer = new OutputStreamWriter(gzipout);
writer.write(str1);
writer.close();

byte[] source1=baout.toByteArray(); //壓縮的結果

//解壓縮
ByteArrayInputStream bain = new ByteArrayInputStream(source1);
GZIPInputStream gzipin = new GZIPInputStream(bain);
BufferedReader reader= new BufferedReader(new InputStreamReader(gzipin));

StringBuilder sb = new StringBuilder();
String s = reader.readLine();

while (s!=null) {
sb.append(s);
s = reader.readLine();
}

System.out.println(sb.toString());
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}

初步使用以上觀念試著將所壓縮的內容(byte陣列)儲存在MySQL中(Blob欄位)發現約有50%的壓縮率,雖然不如預期,但沒魚蝦也好。

另外,最初的程式用DataOutputStream而不是OutputStreamWriter,原以為只DataOutputStream有writeUTF可以處理Unicode,但實際運作時卻發現writeUTF有64k的大小限制,不得已改用OutputStreamWriter,發現處理Unicode也沒問題。

Java中的foreach及Hashtable存取

C#中許多語法及用法令我懷念但我發現Java也可以寫的一樣簡潔,只是我還不習慣罷了下面的程式示範了如何使用如C#中的foreach及Hashtable的內容存取,


import java.util.*;

public class Main {

public Main() {}

public static void main(String[] args){

String str1 = "Test 1";
String str2 = "Test 2";

Hashtable hashtable = new Hashtable();

hashtable.put(1,str1);
hashtable.put(2, str2);
hashtable.put(3, str1 + str2);
hashtable.put(4, str2 + str1);

// Java中的foreach用法, 只要:後面是Collection(例如Array)就可以了
for (int i: hashtable.keySet())
System.out.println(hashtable.get(i));
}
}

搬家

雖然才寫了5篇文章,但對Yahoo部落的設計有點感冒,所以在今天搬了家,希望這是個好地方。

不要再忘了帶自備餐具

自從看了 推廣環保筷 日辣妹女社長率隊遊街 這篇報導後,就馬上去多購買了一副餐具放在辦公室,準備好好響應一下,哪知道知難行易,每次都是等到點完菜之後,才發現沒帶自備餐具,就這樣過了三個星期。在寫這篇的同時,我也準備要出發去吃中餐了,將自備餐具緊緊握在手上,不要再忘了!

前言

以前從未想過發表自己,,進入過一些討論區,但僅限於在旁觀看。人老了,不想讓自己研究很久的東西,在離開它們幾天就連名字都忘了,強迫自己寫日記,除了幫助自己,也許有機會幫到別人,也許這就是數位記憶的好處,讓人有機會窺視他人的大腦。