星期五, 6月 13, 2008

網頁開發必備工具 -- IETester


對於網頁開放人員而言,不論使用的是asp/java/php,甚至是python或ruby,最令人頭痛的問題,除了各語言本身的限制、使用者不斷改變的需求之外,大家共同的痛應該就是同時支援多種瀏覽器時的測試問題。



不同的瀏覽器對javascript/css甚至是html語法,都有不同的支援,可能是對w3c標準的遵循程度,也可能是顯示方面的細節,這些不同,成為網頁開發人員最頭痛的問題。
IETester是一個可以同時以XP或Vista的IE 5.5, 6.0,7, 8 beta 1的方式,顯示相同網的測試工具,雖然在java applet跟flash上還有些問題,但還是能大大減輕開發網頁時的負擔。



IETester 說明網頁: http://www.my-debugbar.com/wiki/IETester/HomePage

星期一, 4月 07, 2008

Install QtRuby4 on Windows

最近想把一些之前用ruby/python寫的小工具加上GUI,找了一下GUI的函式,決定用Qt+Ruby/Qt+Python 來做,不過,QtRuby在windows下一直不是很好裝,還好最新版的QtRuby有了gem包裝,雖然沒辦法用gem 直接remote install,不過,總是方便一點了。

在Windows XP下安裝ruby 的Qt4 binding方法如下:

  1. 下載qt4-qtruby,url=http://rubyforge.org/projects/korundum/
  2. 安裝mingw
  3. 確定系統裡有nmake(安裝rubyqt4時會用到)
  4. 執行gem install qtruby4-1.4.9-win32.gem

可以開始用ruby + qt寫GUI程式了

Install Python 2.5.2 and PyQt on Windows

安裝Python 2.5.2 與PyQt binding方式如下

  1. 下載Python 2.5.2
  2. 下載PyQt-Py2.5-gpl-4.3.3-2.exe
  3. 安裝python
  4. 安裝PyQt

大功告成

星期二, 1月 29, 2008

Install Pluto 1.1.4 on Geronimo 2.0.2

剛把pluto 1.1.4安裝到geronimo 2.0.2上,花掉一天以上的時間,在這裡作個記錄。

安裝環境
OS: Windows XP sp2 中文版
JDK: Sun jdk 5.0 update 12
Geronimo: 2.0.2
Pluto: 1.1.4

在安裝之前需要由pluto網站上下載pluto-current-bin.zip檔。

安裝share library
將以下檔案安裝為geronimo 的common library:

  • castor-1.1.1.jar

  • commons-logging-1.1.jar

  • pluto-container-1.1.4.jar

  • pluto-descriptor-api-1.1.4.jar

  • pluto-descriptor-impl-1.1.4.jar

  • pluto-taglib-1.1.4.jar



安裝pluto-portal
建立pluto-portal用的deployment plan,dependency中加入上述的common library以及xercesImpl 2.8.1版。正常狀況下,應該就能夠順利的安裝到geronimo中,能夠在http://localhost/pluto中看到pluto的登入畫面。

如果在安裝過程中發生Portlet init NullPointException,log中發現register 0 portlet的訊息,有可能是castor parse portlet.xml時發生問題,只需要把pluto-portal.war解開,將portlet.xml裡 tag的namespace拿掉,應該就能夠順利的部署上去。

安裝pluto-testsuite
pluto testsuite並不需要安裝額外的library,只需要在dependency中以classes的方式import pluto.pluto 的class以及pluto-taglib就行了,如果遇到register 0 portlet,和pluto-portal一樣,修改portlet.xml就能夠解決。

security config
在pluto-portal的deployement plan也需要註記security 的定義,定義如下

/pluto

geronimo-admin


class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"/>




class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"/>






pluto-testsuite的deployement plan中需包含下列片段:

/testsuite

geronimo-admin



class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"/>




class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"/>






如此應該就能夠順利把pluto 1.1.4安裝到geronimo上了。

星期五, 1月 25, 2008

Java 專案環境設定 -- maven 篇 (簡介)

maven 是一個比較新近的java 專案開發工具,能夠簡化開發人員設置專案開發環境的程序與步驟,快速的進入專案的開發階段。透過Convention over Configuration 的概念以及設定檔的繼承機制,maven能夠讓團隊中所進行的各個開發專案有相同的檔案結構,同時也讓個別專案所需要進行的設定減到最低。

檔案結構

maven 預設的檔案結構如下



/src
/main
/java
/resources
/configuration
/webapp
/test
/java
/resources
/configuration
/target


以 main子目錄下放置專案的production code,test下則放置專案的testing code以及configuration,專案建置(build)的結果與過程中的中間產物則會產生在target子目錄之下。/src/main/webapp則是進行網頁專案開發時的特別目錄,放置如web.xml等等的網頁相關資訊。



專案設定檔


maven的設定檔(如同ant的 build.xml)稱作pom.xml(project object model),設定了如建置環境(java 版本,application server),相依性(使用到的其他library及版本)。



設定檔的設定方式都是定義式的,如在相依性的設定中,僅需定義使用的library的名稱與版本,在建置過程中,maven會依據所設定的相依性,由repository中取得所需要的函式。定義式的設定檔另外一個好處就是與系統維持最低的相依性,同樣的設定檔,不過是在 *nix或是Windows系統下,都能夠正常的使用。



專案設定檔的繼承


專案設定檔間的繼承提供了一個能夠設定團隊中跨專案的共通性設定的地方。在一般的團隊中有許多跨專案的共通規範,如coding convention, coding style, test rule等等,團隊能夠建立一個團隊的pom設定檔,而個別的專案,只需要繼承這個團隊設定檔即可擁有相同的設定,不需要在個別的專案設定檔中重複的進行這些共通的設定。

星期五, 11月 02, 2007

Install trac on ubuntu with multi-project

晚上在Ubuntu上把trac 裝好了,因為clearsilver的so link 會遇到一些問題,所以,把過程記錄下來。

安裝軟體套件

sudo apt-get install trac apache2 libapache2-svn

建立trac環境

sudo mkdir /var/lib/trac

sudo chown www-data:www-data /var/lib/trac

設定apache (enable sites)

ScriptAlias /trac "/usr/share/trac/cgi-bin/trac.cgi"

<Location "/trac">

SetEnv TRAC_ENV_PARENT_DIR "/var/lib/trac"

</Location>

Alias /trac/chrome/common "/usr/share/trac/htdocs"

<Directory "/usr/share/trac/htdocs">

Order allow,deny

Allow from all

</Directory>

做到這邊,trac 環境應該可以正常的運作了,如果需要使用者認證的話,則需要在apache的設定中加上以下設定 (Multiple project 環境)

<LocationMatch "trac/[^/]+/login">

AuthType Basic

AuthName "Trac"

AuthUserFile /somewhere/trac.passwd

require valid-user

</LocationMatch>

重新啟動apache,trac環境就可以正常運作了。

接下來,只需要在新增專案的時候,在/var/lib/trac下用trac-admin 的initenv command建新的trac repository了。

星期日, 10月 28, 2007

Access java servlet request from rails

看起來,在JRuby 的Rails 中,能夠透過$java_servlet_request來取得HttpRequest,這樣的話,應該能夠利用這種方式將rails和AppServer的JAAS整在一起來了。

Code from RailsServlet
runtime.defineReadonlyVariable("$stdin", stdin);
runtime.defineReadonlyVariable("$java_servlet_request", JavaEmbedUtils.javaToRuby(runtime, request));
runtime.defineReadonlyVariable("$java_servlet_response", JavaEmbedUtils.javaToRuby(runtime, response));

星期六, 9月 22, 2007

CXF REST transport notes


搞了一整天,總算試出CXF的REST介面可以運作的設定模式,雖然wrapped mode一直搞不定,不過,總算搞定unwrapped mode的設定方式。主要必需注意的事情是:


  • interface上一定要有@WebService annotation

  • 在需要傳遞的參數上必需要使用 @HttpResource 指定對應的uri pattern

  • 因為是unwrapped mode, 接受的參數都必需要用VTO (value transfer object)包起來,如同CXF 文件Java REST annotation中的範例一樣

  • CXF 會根據 URI template中的參數名稱{param}將參數對於到VTO中的property。



範例 (interface), spring 設定中的 serviceFactory必需設定unwrapped = false


@WebService(targetNamespace="http://employee.some.company.com")
public interface EmployeeService {
@Get
@HttpResource(location="/employees/{serial}")
@WebResult(name="Employee")
Employee getEmployee(GetEmployee getEmployee);
}

星期二, 7月 17, 2007

struts 2: field validation and type conversion

一般web 應用中,很基本的一個功能是參數的驗證(validation),而在struts 2中,這個功能是透過validation來達成的。但是,在驗證之前,struts 2會先做type conversion 的動作,以確定輸入的參數能夠滿足action 中各個properties的需求。所以,interceptor的執行順序是
  1. 型別轉換 (type conversion)
  2. 參數驗證 (validation)
如果在型別轉換時就發生錯誤的話,相同的欄位就不會進行參數驗證。我就是忽略了這個順序,才搞了二天。

舉例來說,如果有個property 是 setDate(Date theDate),在zh_TW的locale中,預設的日期格式是mm/dd/yyyy,我想在為這個欄位加上validation, 於是,在我的Action-validation.xml中有下列的一段程式碼:


<field name="date">
<field-validator type="regex">
<param name="expression"> ...</param>
<message>wrong format for field date</message>
</field-validator>
</field>


但是,當格式錯誤時,regex卻不會抓到錯誤,問題就是出在type conversion 的interceptor 先運作了,所以總是會出現type conversion 的錯誤訊息 : "Invalid field value for field "date"",所以,對於非String 型態的property,比較有意義的validator只剩下required、date、int這幾個有意義,其他的意義都不大。

那接下來的問題就在於,怎麼把"Invalid field value for vield ..." 這段訊息換成我們想顯示的訊息。這必需透過struts 2的I18N機制來達成,根據AnnotationXWorkConverter文件中提到的,可以在ClassName.properties中設定 invalid.fieldvalue.欄位名稱,來設定特定欄位的conversion error錯誤訊息,如果要改變預設的訊息的話,則可以透過設定global的I18N屬性xwork.default.invalid.fieldvalue 來達成效果。

星期一, 7月 16, 2007

sturts 2 validation and action property

今天又犯了個豬頭錯誤,我有兩個Struts Action,程式碼類似這樣:
public class ParentAction {
protected long property;
...
public long getProperty(){
return property;
}
}

public class ChildAction extends ParentAction{
public void setProperty(int property ){
this.property = property;
}
}

當我對ChildAction 加上required validation時,問題就來了,不論我輸入的是什麼值,validation interceptor總是告訴會回報property is null,找了半天,一路trace到Ognl層,才發現問題出在,透過reflection API取得property 的method descriptor時,因為setProperty的參數型態和getProperty的參數型態不符,而getProperty又在parent,所以會只認getProperty,而把setProperty(int) 當作是一個overloading method,以致於無法設值進去,只要把setProperty 由setProperty(int)改成setProperty(long),就又能夠正常運作了。

這樣的錯誤,只能說是自己不小心造成的,但是,這種錯,應該會常常發生吧,下次,得把這類的檢查也加到test case中。

WebLogic workshop 10.1 release

這幾天的事吧,剛開始用,有幾點還不錯的改善。

  1. server console 總算可以不用另外開個console window,而能夠直接顯示在eclipse的console view了。
  2. deployee時如果發現context已經有application,會自動問你要不要把原來的application delte,換成目前的proect。
  3. compile/build/deployee的速度變快了,看起來AppXRay總算有點正面效益了。
  4. 新的 jsp editor還不錯,一個畫面切上下兩部份,下半source,上半部是jsp輸出的結果,對我這種喜歡直接寫code的人還蠻方便的。

不過,有優點當然也會有缺點囉:
  1. 還不支援portal development,幾個portal facet 會丟warning
  2. 還不支援struts 2 ....
一些有加強,但對我而言可有可無的功能,但是這些功能可能對其他人蠻有幫助的吧:
  1. spring ide support,不過,只支援到spring 2.0
  2. hibernate/bea kudo support,不過,我習慣手動寫mapping,或是利用annotation,所以對我而言效益也不大

其他一些pageflow(beehive)之類的相關功能,因為沒在用,就沒特別去試了。

星期五, 6月 01, 2007

在Struts2 中取得JAAS相關資訊

在WebWork/Struts 2的應用框架中,可以讓系統開發者在寫程式時,專注在應用系統的邏輯,透過IoC的注入(injection)方式,程式碼中可以完全看不到與JavaEE相關的程式碼。但是這種美好的世界,在遇到一些需要根據使用者傳回不同的結果的action時,就不是那麼美好,除非你所開發的應用系統自行處理使用者權限與授權相關的功能。如果是使用JAAS,那程式中不免會需要透過HttpRequest來取得remoteUser等資訊。在Struts2/WebWork中,提供了兩個介面可以做到這樣的功能 HttpRequestAwarePrincipalAware。


HttpRequestAware 是第一個會想到的介面,既然remoteUser的資料是從request來的,那就叫struts幫我們注入個request object不就成了?但是一但在action中引入HttpRequest,使用Struts2/Webwork的最大好處,與平台低相依性,易測試的優點就當場被破壞了。當引入HttpRequest之後,為了測試action,必需透過如spring-mock等等的JavaEE mock 套件,無法簡單的透過如jmock, 或是自行打造stub的方式來進行測試,而且,只是需要getRemoteUser, isUserInRole等function,卻把整個HttpRequest 都暴露在action中,怎麼看味道也不對。


PrincipalAware 就是為了解決上述的問題產生的,如果你只是很單存的需要getRemoteUser, isSecured, getPrincipal, isUserInRole等功能,那action只需要實作PrincipalAware,Struts2/WebWork會為action注入一個PrincipalProxy,提供getRemoteUser等需要的方法,又不需要將整個HttpRequest都暴露在action中,造成與平台過度的相依。更好的是,PrincipalProxy是一個interface,可以利用jmock, dynaMock等mock framework簡單的產生測試時需要的替代品,對自動測試可是一大利多。


使用WebWork到現在,也好幾年了,居然到現在才發現有這個interface,該說是後知後覺,還是太不認真了,不過,這個介面可是解決了以往為了測試這些需要principal 的action,而搞了幾乎整套的JavaEE stack的問題,又能夠滿足整個應用系統的味道能夠一致,真該認真點的。

星期五, 5月 25, 2007

下車再上車?


以前的同事pj曾經說過一個笑話,一群人開車到郊外踏青,在差不多算是荒郊野外的地方車子故障了,一群人急得想各種辦法要把車子修好,但是都徒勞無功,最後,一位在微軟工作的軟體工程師說話了:「我們把車子熄火,全部的人下車,再上車試看看,可能就沒問題了。」凡是用過電腦的人,多多少少會遇到類似下車再上車的狀況,對像可能是特定的應用程式,也可能是整個作業系統,怎麼找就是找不出問題,但是,把程式重開或是重開機之後,問題就不見了。而開發人員遇到這種狀況的機會又比一般的使用者來得高。



這種狀況,常常是因為系統在開發過程中沒有考慮到一些特定的狀況所造成的。但是隨著作業系統愈來愈複雜,今天,除了特殊的應用之外,單工的作業環境已經愈來愈少見了,導致要在開發階段就考慮到所有的狀況已經是愈來愈不可能了。為了因應這種狀況,近代的程式語言大都包含了例外處理的機制,這個機制最主要的目的就是讓程式在遇到開發時期未考慮到的狀況時,能夠死得漂亮一點,死得優雅一點,最低限度,要讓使用者知道,程式已經死了,而不是讓使用者去和一個不穩定狀態的系統打交道。



例外處理,是程式設計的一個很重要的課題,雖然有些人認為例外處理讓部份程式流程更不容易被追蹤(trace),但是不可否認的,在支援例外處理的程式中,程式碼可以以更容易被人類讀懂的方式來表示,而不是一長串的if/else if /else。畢竟,程式碼除了建立系統之外,也是程式設計師之間最主要的溝通工具。如果說,少男漫畫中的主角是用拳頭交心,那程式設計師就是用程式碼交心了。

需要wiki嗎? 自己挑一個吧!!

這幾年,wiki (維基)愈來愈紅,不管是公司、社群,甚至個人常常都會有個wiki。但是愈來愈紅代表的也就是選擇可能會愈來愈多,在wiki的領域,可選擇的軟體也愈來愈多,甚至也可以偷懶直接使用別人的wiki 主機服務。這麼多的wiki怎麼選呢? 當然,就是要靠比較多,這次介紹的網站,就是可以幫你比較常見的wiki間的差異、支援等等,讓你更方便的選擇一個自己的wiki。


這個網站收錄了87個Wiki軟體及服務(主機服務),可以讓你對各個wiki之間的功能作詳細的比較,更提供了一個Wiki Choice Wizard,透過幾個問題,先幫你作篩選,讓你不用在87個軟體間漫無目的的尋找,需要wiki嗎? 挑個自己合用的吧!!


WikiMatrix - Compare them all

星期三, 4月 04, 2007

WebLogic 10 正式發佈

中心的server才剛啟動由WebLogic 8到WebLogic 9的轉移程序,10居然就發表了,雖然以中心的理境而言,用這麼大的AppServer或是Portal Server真的是很明顯的殺雞用牛刀的狀況,但是,買都買了,預算也編了,暫時也只能維持在目前的平台,再儘可能的以符合標準的方式來作系統開發,減少日後萬一需要轉移時需要的工夫吧。



不過,這次的Workshop 10總算能以個別plugin的方式安裝在原有的Eclipse環境下,這點對我可是有很大的吸引力呢,至少不用在去處理ClearCase plugin 與 Workshop 9之間偶爾會發生的怪異狀況,再加上很多Eclipse的plugin 也都轉移到3.2的版本了,看來,可以認真考慮是不是要跳過9, 一次攻頂上到10版了。



星期一, 3月 12, 2007

Install ClearCase 7.0.0.1 fixpack

因為ClearCase 7.0.0.0 沒辦法跟ClearQuest 7.0.0.1 作協同運作,再加上Eclipse clearcase adapter 又要求安裝到7.0.0.1,於是,早上打算把fixpack裝起來,再開始下個版本的開發作業,沒想到,這次的fixpack安裝,怎麼裝怎麼不順,就是裝不起來,而不裝,後續又做不下去。

這一搞又是搞了一整天才找到問題,以往安裝fixpack都還蠻簡單的,確認完系統符合安裝的規範之後,就可以一路下一步安裝到底了,沒想到,今天在安裝的時候,就是有問題,找了半天,也找不出來,log也蠻正常的,到了下班前,才看到一篇說明,原來是需要DCOM service, 而我機器上的DCOM service不知道什麼時候被我給停下來了,把service啟動,就可以正常的安裝fixpack了,真是想不到的錯。

星期五, 3月 02, 2007

Cheet Sheet 大全

黑米看到的, Cheet Sheet 大全網頁, 幾乎可以說,只要是有在用電腦的使用者,難免就會需要,一堆用得到,用不到,想得到的全都有,真的蠻方便的。

Cheet Sheet, 簡單的說,就是小抄啦。

Cheet Sheet 大全

星期一, 2月 26, 2007

struts test with remote user

最近遇到一個閃不掉的struts系統開發,慘的是,只能用struts 1.x這個我一直很努力避免使用的framework。不過,既然遇到了,還是得用,利用StrutsTestCase來作單元測試(unit test),一開始倒也還相安無事,一直到遇到一些需要用到HttpRequest.getRemoteUser的action,一時之間,還真不知道該從何著手,只有個概念該從mock object的方向做。
不過,幸運的讓我找到一篇Testing Struts的文章,其中提到了利用MockStrutsTestCase來作security的unit test,再追了一下StrutsTestCase的原始碼,果然,在MockStrutsTestCased中使用的HttpServletRequestSimulator 這個mock object可以由程式碼給定RemoteUser等request的相關資料,總算解決了我的問題。
Struts 1.x算是個很成熟的framework,相關的討論,隨便找找也都是2004年,甚至更早的文件,很多文件,還真的跟不太上目前的狀況,還好這篇的東西還可以用,不然,就真的很麻煩了。

星期一, 2月 05, 2007

weblogic + sitemesh + spring 中文亂碼解法

看到了篇可能是解決weblogic + sitemesh + spring下中文發生問題的解法,不過,我還沒機會測試就是了。

http://www.blogjava.net/rocky/archive/2005/12/18/24467.html

星期二, 1月 16, 2007

Patch ActiveRecord-JDBC

花了一個早上的時間在找ActiveRecord-JDBC連結Oracle 9的問題,利用jruby使用ActiveRecord-JDBC來連結Oracle會出現java.sql.SQLException 數值溢位的例外,一路追下去,發現是ActiveRecord在讀取database metadata時,發生overflow的問題。

把jdbc_adapter.rb 的 convert_jdbc_type_to_reply中的 resultset.getInt改成 resultset.getLong就行了,不過,這是蠻暴力的改法就是了 。