31 12月 2008

Eclipse Templates

routine 的工作到處都是,Coding中也常有重覆的工作,利用IDE可以有效減少這些問題。 例如經常宣告slf4j/commons Logger,或是新增UnitTest TestCase後要加上annotations,Eclipse中的Templates可以快速的完成。 在Eeclipse->Java->Editor->Templates中加入像下列兩項templates
${:import(org.slf4j.Logger, org.slf4j.LoggerFactory)}
private static final Logger logger = LoggerFactory.getLogger(${primary_type_name}${cursor}.class);
${:import(org.junit.runner.RunWith, org.springframework.test.context.ContextConfiguration, org.springframework.test.context.junit4.SpringJUnit4ClassRunner)}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:application*.xml" })
這樣只要經由code assist就能快速將這些宣告完成。

10 12月 2008

Apache 2.2 + Subversion 1.5 安裝

每次接觸到新的案子或新的公司,很習慣的會以開發環境的建制來評估這個案子的風險及公司專案管理的成熟度,特別是SCM的部份,如果遇到多人開發卻沒有SCM的,心理不禁就會開始擔心了起來...隨身碟裡放的文件跟程式是最新的嗎?Mail裡互相e來e去的文件為什麼名字都一樣但是size竟然會不同呢? 為了以防萬一,想想口袋裡還是要有個備案,以便在需要時快速地將我預想的團隊開發環境建制完成,預想的團隊開發環境應該要有下列 SCM (Souce Code Management) Issue and Bug Tracking System (驚..沒有縮寫?) CI (Continue Integration) 0.OS的考量 這不是開玩笑的,單單桌上通常就擺著MBP、PC、Mac mini(PPC)三台,一開就是OSX、Ubuntu、Windows三種出現在面前...以往是以Mac mini做為主力,灌個VNC+Subversion,到哪裡就帶著他,只要接上網路線,就能快速的開工,不過我的Mac mini上的OSX與Apache不合(小弟無能,compile出來的東西總是有問題...),在intranet裡使用還沒什麼問題,遇到團隊分隔兩地時就比較使不上力,所以只好將目標設定在Linux與Windows上都能使用一樣的軟體,而安裝設定的筆記會在Windows與Linux上分別測試,這樣對一個忘性大於記性的老狗而言應該能有一定程度的幫助。 1.SCM 曾經正式在專案裡使用過的SCM有CVS、StarTeam、Subversion、ClearCase這幾種,基本的概念上並無太大的差異,如果已經在用CVS了,那也不太需改變,如果現行公司是採用了需要付費的StarTeam或ClearCase之類的,想要改變也不容易被接受。但是如果從零開始,從費用及資源取得上來考量,Subversion應該是目前的不二選擇,與Apache結合後,可以透過HTTP+SSL來操作,這樣即使人不在公司,只要能上網就能使用,畢竟80與443這兩個Port要被鎖的機會不高,而且也可以直接使用Windows AD內的帳號來配合公司在安全管理上的機制。不過相反的,如果要臨時加入一個人來存取Subversion裡的資料相對也會比較麻煩,要建一個Windows AD的帳號可不是非相關人員要建就能建的,所以在使用人數少時比較建議採用手動建立帳號並將密碼以MD5編碼的方式來管理。 1.1 Apache 2.2的安裝 Apache 下載位置 http://httpd.apache.org/download.cgi Windows下還是以msi格式比較方便,選擇有OpenSSL的版本,即使當下不用SSL,若有天要改變也不用再額外下載處理。 http://apache.ntu.edu.tw/httpd/binaries/win32/apache_2.2.10-win32-x86-openssl-0.9.8i.msi 安裝後 (1)測試Apache是否正常 以Browser測試http://your_host_ip,應該可以看到"it works"這回應 (2)PATH設定 將$APACHE_INST_ROOT/bin加入path中,其中的htpasswd可以用來產生Subversion可讀的MD5密碼。 1.2 Subverson 1.5.4的安裝 Subversion配合不同版本的Apache是有不同檔案的,所以下載前要確認版本是否能供Apache 2.2使用,雖然有提供具windows installer的版本,不過為了不想裝不需要的東西所以還是採用zip的版本。 Subversion下載位置 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100 解壓縮在希望的安裝目錄下後 (1)PATH設定 將$SVN_INST_ROOT/bin加入path中 (2)測試Subversion是否正常 在console下輸入svn --help,如果顯示"Subversion command-line client, version 1.5.4."等字樣就應該沒問題了。 1.3 設定 (1)開啟Apache的DAV module 編輯httpd.conf,找到
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
將#去除,使Apache載入mod_dav.so與mod_dav_fs.so。 可以藉由按下Apache的Test Configuration看看是否正常 (2)複製Subverison的so到Apache modules 將$SVN_INST_ROOT/bin下的mod_dav_svn.so及mod_authz_svn.so複製到$APACHE_INST_ROOT/modules 編輯httpd.conf,加入
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
這時如果按下Apache的Test Configuration可能會出錯,主要是Apache找不到$SVN_INST_ROOT/bin下的DLL,只要Restart windows就可以了,如果反過來先安裝Subverson再安裝Apache也許就不會這樣... (3)建立Subversion的repository 比較建議的方式是先建一個svnroot,再將repository建在svnroot之下,這樣可以簡單將一個repository視為一個專案以供區分。當然要把所有專案全塞到一個repository也是可以的啦,開心就好嘛....
$> mkdir svnroot
$> cd svnroot
$> svnadmin create project1
這樣就會產生一個名為project1的repository了 (4)設定Apache中的Subversion DAV 先不考慮帳號權限設定,編輯httpd.conf,加入
<Location /svn>
	DAV svn
	SVNParentPath "$SVN_ROOT" #$SVN_ROOT請輸入上一步才建立的svnroot完整路徑
</Location>
重起apache,再以browser連連看http://your_host_ip/svn/project1,應該就能看到一個空的project1目錄了,如果輸入http://your_host_ip/svn/,出現"You don't have permission to access /svn on this server."這是正常的。 如果你真的想要把所有東西全部放在一個repository下,那就改用
<Location /svn>
	DAV svn
	SVNPath "$REPO_ABSOLUTE_PATH" #$REPO_ABSOLUTE_PATH代表Repository的絕對路徑
</Location>
(5)建立Apache中可用Subverion的帳號及權限 雖然Subversion中各個repository下的conf目錄中,都有passwd及authz來管理這個repository的帳號及權限,但是如果與Apache結合後透過HTTP來操作Subversion repository時,各個repository下的passwd及authz是沒有作用的,必需單獨產生供Apache使用的passwd及authz,我也建議這兩個檔就放在$SVN_ROOT下;用touch先產生passwd及authz這兩個檔案,這樣等會htpasswd就不用記第一次要加入"-c"這個參數... 要產生帳號密碼,只要在console下輸入
htpasswd -m $SVN_ROOT/passwd username
再依提示輸入2次密碼就可以,"-m"這參數是代表要對user的密碼進行MD5編碼 權限控管的部份,建議將人員分組,並且建立一個admin帳號以供遠端產生新的repository。 下面是簡單範例
[aliases]

[groups] #建立2個group,將人員分成Developer及SA兩類
developers=dev1
sateam=sa

[/] #設定根目錄權限,除admin可以寫入外,其餘人員預設僅能讀取。
* = r
admin = rw

[project1:/document] #有@的代表是一個group,針對project1的document目錄設定僅有SA可以寫入
@sateam = rw

[project1:/development] #project1的development目錄設定僅有developers這group的成員可以寫入
@developers = rw
(6)修改Apache中的DAV設定 編輯httpd.conf,將
<Location /svn>
	DAV svn
	SVNParentPath "$SVN_ROOT"
</Location>
改為下列的樣子
<Location /svn>
	DAV svn
	SVNParentPath "$SVN_ROOT"
	AuthType Basic
	AuthName "Subversion Repository"
	AuthUserFile "$SVN_ROOT/passwd"
	AuthzSVNAccessFile "$SVN_ROOT/authz"
	Require valid-user
</Location>
重起Apache後再連到http://your_host_ip/svn/project1就可以發現要求輸入帳號密碼的視窗出現了。

Technorati Tags: ,

03 12月 2008

Tomcat 6 DataSource Configuration

很久沒用Tomcat當Server(?),主要是因為Tomcat都只拿來當Prototype用,而且其他的設定幾乎都在Spring裡就設完,突然要手動設個DataSource都要看參考文件看半天。DataSource的設定大約分為2類,第一種是僅供單一Context使用旳,另一種是可以供所有Context使用的全域DataSource,其它Ap Server幾乎都是僅有第二種,我也比較傾向採用第二種類型的設定,不過Tomcat 6在設定全域的DataSource後,shutdown時都會hold住無法直接結束,老要用kill process的方式清除… DataSource會用到的設定只有3個 (1)<Resource>:設定DataSource用的Connection Pool相關參數
<Resource auth="Container" 
    name="jdbc/TestDB" 
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3306/test?autoReconnect=true" 
    username="root" 
    password="abcd" 
    logAbandoned="true" 
    maxActive="10" 
    maxIdle="3" 
    maxWait="1000" 
    poolPreparedStatements="true" 
    removeAbandoned="true" 
    removeAbandonedTimeout="60" 
    testOnBorrow="true" 
    validationQuery="SELECT 1"/>
(2)<ResourceLink>:如果採用全域式的設定,在要使用DataSource的Context中加入ResourceLink的設定才能正確取得該DataSource。
<ResourceLink 
    global="jdbc/TestDB" 
    name="jdbc/TestDB" 
    type="javax.sql.DataSource"/>
(3)<resource-ref>:正常而言要在web.xml中加這個設定,不過tomcat中實測可以不用。。。
<resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
</resource-ref>
一、單一Context設定 只要在server.xml或單獨的context.xml中的<Context>加入<Resource 。。。>即可 二、全域Context設定 在server.xml中的&lt;GlobalNamingResources>中加入<Resource 。。。>再針對要使用該DataSource的Context中加入<ResourceLink 。。。> Tomcat6的設定是較之前其他版本要容易些,但是為何shutdown時會hang住?Log中也沒看到什麼特別奇怪的訊息。。。難不成又是mac惹的禍?

20 5月 2008

Ubuntu amd64 安裝 Acrobat Reader

手上MBP用的cpu是C2D, 所以這次回鍋安裝Ubuntu就想說安裝amd64的版本, 本來就有心理準備,有些軟體可能會有些不相容或難以安裝, 最近遇到比較不方便的, 大概要算是Acrobat Reader了, 雖然Ubuntu內建有Evince, 但還是很習慣Acrobat.... 先用sudo apt-get install acroread, 結果沒有for amd64的.. 好吧, 換個方式, 至少Adobe有提供下載頁面, http://www.adobe.com/products/acrobat/readstep2_allversions.html,暗...沒有x86_64的....只好選了Linux-x86(.deb),下載完後要用dpkg安裝.暗....安裝不能 查了一下, 發現ubuntu forums 中有這篇:HOWTO: Acrobat 8.1 on AMD64 all features/no hacks 照著執行
sudo dpkg -i --force-architecture AdobeReader_cht-8.1.2-1.i386.deb
結果...當然是快樂結局囉!!!

12 5月 2008

Ubuntu apache 及 tomcat簡易安裝

因為有人想裝,就把之前筆記拿出來,再依Ubuntu8.04小改一下 0)準備工作--jdk 沒有JDK當然就直接收工吃便當囉,還不會裝的麻煩直接執行一下
sudo apt-get install sun-java6-jdk sun-java6-plugin sun-java6-fonts;
sudo update-java-alternatives -s java-6-sun;
再設定一下JAVA_HOME,很多人會把export JAVA_HOME=XXXX的設定加在~/.profile或~/.bashrc中,但是我個人比較習慣加在/etc/environment, 因為在environment中不用加export...正常安裝的話請加
JAVA_HOME=/usr/lib/jvm/java-6-sun
PATH就不用說了吧... 1)安裝Apache 最簡單當然是用Ubuntu內定的版本
sudo apt-get install apache2
請注意以下錄及檔案,將來要修改時比較容易
/etc/apache2/  #--apache2.conf, httpd.conf
/usr/lib/apache2/modules #--*.so

/etc/init.d/apache2
/usr/sbin/apachectl 
/usr/bin/htpasswd

/var/www/ #--webroot
其中/etc/init.d/apache2與/usr/sbin/apachectl 作用是相同的, 只是在/etc/init.d會自動執行 而有任何要改動的設定, 請加在/etc/apache2/httpd.conf中 請以/etc/init.d/apache2 start/stop/restart來控制 2)安裝tomcat6 由於ubuntu內綁的版本只有tomcat5.5, 所以一定要到Tomcat官網下載新的版本, 也可以用wget來抓
wget http://apache.stu.edu.tw/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz
tar xvzf apache-tomcat-6.0.16.tar.gz
然後再搬到你呷意的位置就好, 我是習慣將跟java有關的集中管理, 畢竟我是Java Engineer, 而不是一個System Engineer, 所以就全部放到/java下, 目錄中也會多個版本標記, 所以會放到/java/tomcat6 請愛用.tar.gz的版本, 如果下載.zip也ok, 但是請記得要將${tomcat}/bin的.sh加上可執行的屬性
chmod 755 /java/tomcat6/bin/*.sh
如果不想每次進系統還需要手動啟動tomcat可以在/etc/init.d/加個tomcat來用
sudo vim /etc/init.d/tomcat
# Tomcat auto-start
#
# description: Auto-starts tomcat
# processname: tomcat
# pidfile: /var/run/tomcat.pid

export JAVA_HOME=/usr/lib/jvm/java-6-sun

case $1 in
start)
        sh /java/tomcat6/bin/startup.sh
        ;;
stop)  
        sh /java/tomcat6/bin/shutdown.sh
        ;;
restart)
        sh /java/tomcat6/bin/shutdown.sh
        sh /java/tomcat6/bin/startup.sh
        ;;
esac   
exit 0
別忘了要改權限
sudo chmod 755 /etc/init.d/tomcat
再加上
sudo ln -s /etc/init.d/tomcat /etc/rc1.d/K99tomcat;
sudo ln -s /etc/init.d/tomcat /etc/rc2.d/S99tomcat;
這樣就可以透過 /etc/init.d/tomcat start/stop/restart來控制了 3)mod_jk的安裝 經過1,2步驟後,apache跟tomcat應該都可以正常執行了,只是兩造互不認識,所以要把他們連在一起還要個mod_jk. 最簡單的方法也是用Ubuntu綁定版本
sudo apt-get install libapache2-mod-jk
請注意以下錄及檔案,將來要修改時比較清楚要改哪
/usr/lib/apache2/modules/mod_jk.so #--link module
/usr/share/doc/libapache2-mod-jk/httpd_example_apache2.con #-- sample config
/etc/libapache2-mod-jk/worker.properties 
/usr/lib/apache2/modules/mod_jk.so就是讓負責apache將request交給tomcat處理的module. 如果想手動更新, 可以到http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/下載合適版本. 然後將/usr/share/doc/libapache2-mod-jk/httpd_example_apache2.con內容直接copy到/etc/apache2/httpd.conf,基本上除了JkMount要改的外,應該沒什麼要更動的 /etc/libapache2-mod-jk/worker.properties就是mod_jk的設定檔, 注意workers.tomcat_home跟workers.java_home要改到你系統使用的目錄,其他也不需要更動 都完成後就restart tomcat跟apache2, 將任意jsp丟到/var/www/下看看, 應該用http://localhost/xxx.jsp就可以顯示結果 至於apache的設定我實在不是很善長, 通常設定一個VirtualHost就ok了, 但是我實在沒有把握, 因為這些工作通常是交給System Engineer來處理... 4)補完 想想還是加個驗証用的設定 先確定在httpd.conf中有加掛了這兩樣
JkMount /*.jsp ajp13_worker
JkMount /*/servlet/* ajp13_worker
然後將Tomcat內建的examples拿來當驗証用的例子, 在httpd.conf的最後加上
Alias /examples "/java/tomcat6/webapps/examples"
<Directory "/java/tomcat6/webapps/examples">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
重起apache2後用http://localhost/examples看看就知道是不是整合成功了

09 5月 2008

計劃

最近因為某些因素不再玩WOW了,反正25RAID似乎無望了,不玩也是好事,只是突然發現真的空出很多時間,所以想說擬些計劃來做 第一個想要先考個LPIC-1,再來想就Eclipse上常用的Plugin上多試著寫些說明,像是m2eclipse, myln, sublipse如何與其他系統像BugTrace、Integration Build之類的軟體結合來配合開發管理,這都跟目前工作沒有特別旳關係,但是這都是興趣,工作久了,還是有興趣跟能取得高成就感的事比較能持久。TOEIC也應該來去考個分數,預定計劃是6月初先考完LPIC,然後7月來考個TOEIC,中間再寫個3篇說明文件,稍為給自已些壓力,看能不能壓出些什麼來。。。

Ubuntu 8.04再使用

前段時間,Apple release了JDK6 for OSX,興沖沖地更新後,真的覺得失望,將CurrentJDK換成1.6,可是連Eclipse都不能執行,查查原因,這個release還不能支援OSX上的Cocoa,這也代表有相當比例的程式是不能使用這個release的JDK來執行... 想了想, 還是在MBP上安裝了Ubuntu, 順得很, 先裝了rEFit後, 其他就跟在一般PC上安裝沒什麼差別, 可以參考這篇Installing Ubuntu on a MacBook Pro, 再裝jdk, eclipse, stardict, filezilla, amarok. 一般工作跟娛樂就差不多夠用了, 只是用apt-get裝的eclipse是3.2版, 所以還是到www.eclipse.org 裝了新的, 而且這個版本的Ubuntu可以直接讀取Mac OSX上HFS+格式的檔案, 所以其他eclipse要用的plugin就直接Copy過來就好, 真是無痛移植. 但是使用一段時間後, 發現MBP比較熱, 風扇也轉個不停, 看看了top顯示的process, 有個npviewer.bin一直佔著2X%的cpu使用率, google後才知道因為在x86_64的系統下, firefox中的flash viewer要借由adapter才能順利運作, 才會有這個情形發生, 其他就沒什麼大問題. 而且eclipse跑得也比較快, 同樣的程式, 在mac osx下, 通常要花比較長一點的時間才能執行完成, 這點算是意外的收獲, 本想應該沒什麼差的, 但有些部份會差到30%以上, 也許有機會應該再去檢視看看是什麼原因造成. 這幾天用起來心情還蠻好的, 工作上也沒遇到特別的不便, 只是有些軟體不能用還是覺得可惜, 像mindmanager pro, ecto 這些, 雖然不是沒有可以替代的軟體, 但就是感覺差了一些. 也許再裝個wine或virtual box來用用, 看看是可否可以順利接上.

30 4月 2008

Java for Mac OS X 10.5 Release 1

Finally, apple released this update to software update for us. You can download this update by "Software update" or here. By release note Java for Mac OS X 10.5 Update 1 adds support for Java SE 6, this release is for Mac OS X v10.5.2 later and 64-bit intel-based Macs only...

10 3月 2008

Spring And JUnit4

嗯,先自首,活了這麼久,在今天之前,我從沒用JUnit4寫過任何一個Spring 有關的Unit Test 反正AbstractDependencyInjectionSpringContextTests跟AbstractTransactionalSpringContextTests也夠用。。。 但是為了說明自已不是老狗,只好學學這個,看看可不可以不要當老狗… 準備工作 JDK一定要是JDK5以上(沒的話就收工), 而pom.xml 要加入的Dependency:
<dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.4</version>
 <scope>test</scope>
</dependency>
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-test</artifactId>
 <version>2.5.2</version>
</dependency>
然後在要測試的Class上加入幾個Annotation
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"/applicationContext.xml"})
public class YourTest {
 @Autowired
 private MasterDAO masterDAO;
 
 @Before
 public void init() {
  
 }

 @After
 public void destroy() {
  
 }

 @Test
 public void testList() {
  this.masterDAO.findAll();
 }
}
@RunWith(SpringJUnit4ClassRunner.class)一定要加,讓Spring能正確執行準備工作 @ContextConfiguration指定要讀入的Spring XML Configurations @Autowired 利用名稱將Spring XML Configurations相同名稱的Bean inject到這個Property, @Resource功能類似,但可以指定Bean的名字 @Before and @After就同於之前的setup and teardown, @Test 就代表是要執行的Test Method 前後不到30分鐘,就算搞定可以收工了 其他跟Transaction相關的也都很易懂。不懂的就翻書,哈哈 再次說明了,我不是老狗,充其量也不過是隻懶狗。

29 2月 2008

slf4j and logback

commons-logging(JCL) 跟 log4j用的好好的,也沒什麼特別不合的需求,居然還是想用用slf4j 跟 logback,嗯,純粹是無聊…

slf4j跟commons-logging相同,提供一個簡單的facade,讓我們可以彈性的更改不同的logging實做。而logback就同於log4j,籍由configuration可以設定不同的log level,並輸出至System.out、檔案、DB或是其他Target.

其實slf4j/logback的配對,跟commons-logging/log4j佷像,slf4j提供統一的介面再加上adapter,就可以使用其他log的實作。預設是採用logback,如果要用jdk內建的log或是log4j都需要加上對應的adapter,
如果要用slf4j/logback,應該需要下列檔案
slf4j-api.jar
logback-core.jar
logback-classic.jar
logback.xml

如果是想採用slf4j/log4j,就需要下列檔案
slf4j-api.jar
log4j.jar
slf4j-log4j12.jar
log4j.properties or log4j.xml

如果是已經採用了commons-logging/log4j想嚐鮮用用slf4j/logback,那也容易,用下列檔案
slf4j-api.jar
logback-core.jar
logback-classic.jar
jcl104-over-slf4j.jar
log4j-over-slf4j.jar
再到http://logback.qos.ch/translator/Welcome.do,將你原來的log4j.properties轉成logback.xml
就可以將commons-logging.jar 跟 log4j.jar自你系統中移除了


其實logback與log4j所提供的appender也相差不多,如果沒遇到特別的問題(commons-logging 的classloader可能造成memory leak,log4j在loop時效能可能較低。。。),其實不太需要改變現有的logging機制,但如果是新起的project,那改用這個所需的學習曲線很低,應該值得一試,當然,試出有什麼特別優點時可要快點說出來

2009/07/20補:如果系統中確定沒有直接使用到log4j,而都是透過commons-logging的話可以不用include log4j-over-slf4j.jar