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惹的禍?