Tuesday, December 30, 2008

如何手動殺 USB 病毒

最近有一位朋友,硬碟及USB 都是病毒,至於是何種毒,我就不便多說,用 Ad-Aware 及 Norton 掃了都沒用,於是就手動解毒

1. 以 "開始" > "執行" > 打入 "regedit" > "確定" ,這時候會彈出 registry 的視窗

2. 到以下兩個位置
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run] 及
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run]
看看裡面是否有 xxxxx.exe 檔但 xxxxx 的命名方式是不規則,不是你唸的出來的
假如有,就殺掉這個 registry,然後重開機

3. 開機完再以 "開始" > "執行" > 打入 "regedit" > "確定",這時候會出現 Dos 的命令列,請用下列方式執行命令

C:\> cd \
C:\>dir *.* /a/p

若此時可以看到 autorun.inf 檔,表示可能已經中毒了。若還有看到 xxxxx.exe 檔,那就真的中毒了。這時候要手動刪除病毒,必須執行下列命令

C:\> attrib -s -h -r autorun.inf
C:\> del autorun.inf
C:\> attrib -s -h -r xxxxx.exe (可能不只一個檔案)
C:\> del xxxxx.exe

若你有 C: D: E: ,必須用相同步驟刪除 D: 與 E: 上的 USB 病毒

4. 若你有 USB 碟,按住 "Shift" 然後插入 USB 碟,等 5 秒後再放開。假設 USB 碟為 F:,用以下命令偵測病毒
C:\> F:
F:\> dir /a/p

要刪除病毒,用以下命令刪除
F:\> attrib -s -h -r autorun.inf
F:\> del autorun.inf
F:\> attrib -s -h -r xxxxx.exe (可能不只一個檔案)
F:\> del xxxxx.exe

5. 刪除完後重開機,再用 step 2,3 去偵測是否有 USB 病毒,若沒有,表示 USB 病毒已刪除。若還有,則需要找專家幫忙了,因為有可能是變種 USB 病毒了

Monday, December 22, 2008

Change DHCP IP to static IP in Ubuntu 8.10

若要將 Ubuntu 8.10 中的 DHCP IP 改成 static IP,必須手動用以下步驟改,因為 Ubuntu 8.10 的 NetworkManager 有 bug

$ sudo update-rc.d –f NetworkManager remove
$ sudo reboot


編輯 /etc/network/interfaces
$ sudo nano /etc/network/interfaces

auto lo eth0
iface lo inet loopback
iface eth0 inet static
address xxx.xxx.xxx.xxx(enter your ip here)
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx(enter gateway ip here)

編輯 /etc/resolv.conf
$ sudo nano /etc/resolv.conf

# Generated by NetworkManager
nameserver xxx.xxx.xxx.xxx(enter your dns server ip)
nameserver xxx.xxx.xxx.xxx(enter your alt dns server ip)

$ sudo /etc/init.d/networking restart

Wednesday, December 17, 2008

Load balance and clustering with Apache HTTP Server 2.2.x and Tomcat 6.0.x

HA 在網路的世界不可或缺,尤其客戶是屬於 C 端 (customer,個人) 時,更要在 AP 端配置 HA 的架構,讓系統不斷線,客戶可以持續的交易不造成中斷。

HA 涉及的議題包含了軟體端的 Load Balance, Clustering 建置,硬體端的網路連線,磁碟空間配置。就硬體端而言,除了至少要有兩條網路線互相備援外,磁碟空間也必須做 replication 與備援才能有效的支援因外在因素而產生的影響。硬體端的 HA 可以有很多架構,但需要 $$ 去建置,這裡就不多講。

在軟體端方面,因為熟悉 J2EE 的架構,所以就選了非常 light weight 的 Apache HTTP Server 2.2.x 與 Tomcat 6.0.x 作為 load balance and clustering 的 instance.


Load Balance 設定
此部份用 Apache HTTP Server 就可做的到,這裡舉一個範例

Apache HTTP Server (HTTPs)
       |
      /  \
     /     \
    /       \
Tomcat 6.0.x(T1)  Tomcat 6.0.x(T2)

這是最簡單的架構,透過 Apache HTTP Server ,便可以存取 T1 與 T2,然後可以在 T1 與 T2 的相同 JSP 放入不同的內容,以測試 Load Balance 的正確性

1. 下載 Apache HTTP Server 與 Tomcat 6.0.x (Windows version)
1.1 下載 Apache HTTP Server 2.2.x 並裝至 d:\Program Files。此版本含有 openssl ,用來產生 key 與 certificate for HTTPS 用
1.2 下載 Tomcat 6.0.x 並解壓縮到 d:\java 中。解壓縮時需解到兩個目錄,一個是
d:\java\apache-tomcat-6.0.16-t1,另一個是 d:\java\apache-tomcat-6.0.16-t2


2. 安裝 SSL
這個部份對大部分的人應該都滿陌生的,因為 SSL 有點小 tricky,除非你正式做過需 HTTPS 的案子,不然可能會搞糊塗。 這邊的 SSL 是針對 Apache HTTP Server 上的 SSL,不是 Tomcat 上的 SSL。Tomcat 的作法與 Apche HTTP Server 不同,用的工具也不同,但其 Certificate 是可以共用的,會在後面 Tomcat with SSL 時說明

2.1 去除 D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 中有關 SSL 的 #
#LoadModule ssl_module modules/mod_ssl.so
#Include conf/extra/httpd-ssl.conf

2.2 建立 CA Root Certificate 及 Server Certificate
什麼是 CA Root Certificate ,基本上就是老大發的通行證,若網站是經由此老大認證過,IE 或 Firefox 就會認得此憑證是老大發的,就不用懷疑其效力。這些老大通常都會審核申請憑證的公司的合法性,一般 User 也比較能放心去這些網站使用或消費。

但為何要建立 CA Root Certificate 呢,因為若要公司每台 Server 都需要 Certificate ,則每個 Certificate 都需要跟老大申請認證,這些都需要費用。若這些 Server 只是內部用,則可以自己當老大做一個 CA Root Certificate 然後認證自己發的 Server Certificate,這樣可以減少許多成本,也比較方便。用的時候只需要將老大的 CA Root Certificate 安裝到公司內部的 IE 或 Fixfox 就行了,凡經由 CA Root Certificate 認證過的 Server Certificate 都不會被詢問其 SSL的安全性問題,因為老大說了算 (不知道是否已經有人昏倒了)


建立 CA Root Certificate
d:\>cd D:\Program Files\Apache Software Foundation\Apache2.2\bin
d:>openssl genrsa -des3 -out ..\conf\caroot.key 2048
Loading 'screen' into random state - done Generating RSA private key, 2048 bit long modulus ...........+++ .+++ e is 65537 (0x10001) Enter pass phrase for ..\conf\caroot.key: Verifying - Enter pass phrase for ..\conf\caroot.key:

用 RSA 演算法+Triple Des Encryption (des3) 建立 CA root 的 key,強度為 2048bit。密碼請輸入 暫時輸入 changeit

d:>openssl req -config ..\conf\openssl.cnf -new -key ..\conf\caroot.key -out ..\conf\caroot.csr
Enter pass phrase for ..\conf\caroot.key: Loading 'screen' into random state - done You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank.
----- Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan

Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Inc.
Organizational Unit Name (eg, section) []:My Company Dept
Service Provider
Common Name (eg, YOUR name) []:My Company Trust
Email Address []:

Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:
An optional company name []:


這裡是產生 CSR (Certificate Service Request),用以讓別的 CA 簽發憑證。因為是自己要用的 Root,所以等一下會自己簽自己。基本上所以有 CA Root 都是自己簽自己。

d:>openssl x509 -req -days 7305 -sha1 -extensions v3_ca -signkey ..\conf\caroot.key -in ..\conf\caroot.csr -out ..\conf\caroot.crt
Loading 'screen' into random state - done Signature ok subject=/C=TW/ST=Taiwan/L=Taipei/O=My Company/OU=My Company Dept/CN=My Company Trust/emailAddress=
Getting Private key
Enter pass phrase for ..\conf\caroot.key:

這裡就是自己簽自己的簽發憑證。若 double click ..\conf\caroot.crt 並安裝此憑證,可以打開 IE > 網際網路選項 > 內容 > 憑證 看到此憑證被放到根憑證的目錄中





















PS : caroot.key 一定要保存好並記住密碼,不然掉了,所以憑證全部要重新簽發,很費時間。

建立 Server Certificate
當建立完 CA Root Certificate 後,再來就是要建立 Server Certificate 再用 CA Root Certificate 對 Server Certitificate 做簽發 (Sign)
d:>openssl genrsa -out ..\conf\server.key 2048

建立 Server 用的 key
d:>openssl req -config ..\conf\openssl.cnf -new -key ..\conf\server.key -out ..\conf\server.csr
Loading 'screen' into random state - done You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. -----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan

Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Ltd

Organizational Unit Name (eg, section) []:RD Dept

Common Name (eg, YOUR name) []:www.mycompnay.com
Email Address []:


Please enter the following 'extra' attributes
to be sent with your certificate request A challenge password []:
An optional company name []:


以上會建立申請簽章的檔案 server.csr,這裡需記得 Common Name 必須與 server 的 url domain name 一樣如 www.mycompany.com,這樣才能通過 IE 或 Firefox 的認證,否則會出現 warning。

d:>openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ..\conf\caroot.crt -CAkey ..\conf\caroot.key -CAcreateserial -in ..\conf\server.csr -out ..\conf\server.crt

Loading 'screen' into random state - done

Signature ok

subject=/C=TW/ST=Taiwan/L=Taipei/O=My Company Ltd/OU=RD Dept/CN=www.mycompnay.co
m
Getting CA Private Key
Enter pass phrase for ..\conf\caroot.key:

這裡會用 caroot 簽發 server.csr 並產生 server.crt。double click server.crt 可得畫面如下
























這裡可以發現,沒有 warning, 發行者是 CA Root ,有效是 10 年

2.3 重新啟動 Apache HTTP Server
因為產生 Server 的 certificate 檔名已經同步 conf/extra/httpd-ssl.conf 裡面所定義的命名方式,所以直接啟動 Apache HTTP Server 便可以使用 HTTPS (SSL)
























3. 設定 load balance

3.1 下載 mod_jk (Tomcat 6.0.x for win32 版)
下載完 mod_jk 後 請將檔名改為 mod_jk.so 並放到 D:\Program Files\Apache Software Foundation\Apache2.2\modules 中

3.2 在 D:\Program Files\Apache Software Foundation\Apache2.2\conf\extra 中新增一個檔案 httpd-load-balance.conf
內容如下
================================
#(httpd.conf)
#載入 mod_jk 模組
LoadModule jk_module modules/mod_jk.so

#
# Configure mod_jk
#
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel info


JkMount jkstatus
Order deny,allow
Deny from all
Allow from 127.0.0.1

===============================

3.3 在 D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 的最後新增一行
內容為
Include conf/extra/httpd-load-balance.conf

如此重新啟動 Apache HTTP Server 時才會把 load balance 的 module 放到 kernel 中執行

3.4 在 D:\Program Files\Apache Software Foundation\Apache2.2\conf 中新增一個檔案 workers.properties
內容為
=====================================
# The advanced router LB worker
worker.list=router,jkstatus

# Define a worker using ajp13
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
# Define prefered failover node for worker1
#worker.worker1.redirect=worker2

# Define another worker using ajp13
worker.worker2.port=9009
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
# Disable worker2 for all requests except failover
#worker.worker2.activation=disabled

# Define the LB worker
worker.router.type=lb
worker.router.balance_workers=worker1,worker2

# Define a 'jkstatus' worker using status
worker.jkstatus.type=status
====================================

這裡指定 worker1 為 T1, 用的 port 為 8009,worker2 為 T2,用的 port 為 9009

3.5 在 D:\Program Files\Apache Software Foundation\Apache2.2\conf 中新增一個檔案 uriworkermap.properties
內容為
===============================
/*=router
===============================

這裡會將 URI 為 /* 的 mapping 全部轉向 T1 或 T2

3.6 更改 T2 的設定檔
因為 T2 用的 port 還是 8009,需改為 9009 以配合 workers.properties 中的設定
修改 D:\java\apache-tomcat-6.0.16-t2\conf\server.xml 中的

line 22 port="8005" 改為 port="9005"
line 67 port="8080" 改為 port="9090"
line 89 port="8009" 改為 port="9009"

port 改成如此是因為要避免與 T1 衝突。
3.7 重新啟動 Apache HTTP Server 與 T1, T2
重新啟動 Apache HTTP Server 後再啟動 T1, T2,接下來打開 IE 將 URL 指向 http://localhost 可以得到

















這裡可以看到跑的是 Apache Tomcat T2 (webapps\ROOT\index.html 有修改過),證明 Load Balance 已經開始作用中

3.8 啟動 SSL 的 Load Balance
這時候當 URL 指向 https://localhost 時,Tomcat 的畫面並不會跑出來,需要在
D:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\httpd-ssl.conf
的 VirtualHost 裡面加上這一行

JkMountFile conf/uriworkermap.properties

然後重新啟動 Apache HTTP Server ,SSL 便可以做到 Load Balance 了
以下畫面是把 T2 Shutdown 後,Refresh IE 則會 Forward 到 T1 上

















4. 設定 Tomcat 的 Clustering
若有人要OOXX,現在是一個好時機,因為在 Windows XP 上無法做 Clustering。花了幾乎快一個下午的時間試,也無法試出來用 2 個 Tomcat instance 跑在同一台機器,後來用 VMWare 跑 Ubuntu 8.10 然後在上面跑 2 個 Tomcat ,一切搞定。所以,Linux 實在非常適合做 Server。

話不多說,把 Ubuntu 8.10 跑起來後,利用 SSH 將兩個 tomcat 複製到 /opt 下
/$ cd /
/$ sudo mkdir /opt
/$ sudo chmod o+w opt
這樣才能在非 root 的使用者下將 tomcat 複製到 /opt
/opt$ ls -l
apache-tomcat-6.0.16-t1
apache-tomcat-6.0.16-t2
/opt$ chmod +x apache-tomcat-6.0.16-t1/bin/*.sh
/opt$ chmod +x apache-tomcat-6.0.16-t2/bin/*.sh

4.1 設定 Tomcat Cluster in server.xml
更改 /opt/apache-tomcat-6.0.16-t1/conf/server.xml
在 line 100 的 Engine 中加入 jvmRoute="worker1"
在 line 106 將 Cluster 的上下 comment !-- -- 拿掉

更改 /opt/apache-tomcat-6.0.16-t2/conf/server.xml
在 line 100 的 Engine 中加入 jvmRoute="worker2"
在 line 106 將 Cluster 的上下 comment !-- -- 拿掉

4.2 設定 web application
因之前有發表過 appfuse 2.0.2 for JPA ,所以就直接把 war 檔放到 t1 與 t2 的 webapps 下,也修改了 WEB-INF/classes/jdbc.properties 中的 localhost 為原本的 XP 上

4.3 啟動 Tomcat t1, t2
打開一個 xterm (應用程式 > 附屬應用程式 > 終端機 )
$ cd /opt/apache-tomat-6.0.16-t1/bin
/bin$ export JAVA_HOME=/usr/lib/jvm/java-6-sun
/bin$ ./catalina.sh run

打開另一個 xterm (應用程式 > 附屬應用程式 > 終端機 )
$ cd /opt/apache-tomat-6.0.16-t2/bin
/bin$ export JAVA_HOME=/usr/lib/jvm/java-6-sun
/bin$ ./catalina.sh run

這時候應該可以看到 t1, t2 會互相 talk 如下畫面

















4.4 修改 Apache HTTP Server
因之前的 load balance 設定用的 tomcat 是 localhost ,但因 XP 無法支援,所以要將 D:\Program Files\Apache Software Foundation\Apache2.2\conf\workers.properties 中的
worker.worker1.host=localhost
worker.worker2.host=localhost
改為
worker.worker1.host=svn
worker.worker2.host=svn

PS : 此 svn 是 Ubuntu VM 上的 hostname

然後重新啟動 Apache HTTP Server

4.5 測試 Cluster
打開一個 IE 網址為 https://localhost/myprojectjpa-1.0-SNAPSHOT/然後用 admin/admin login,再進入 系統管理 > 訪問紀錄 可以看到用的是 worker1 的 tomat t1








再打開另一個 IE 網址為 https://localhost/myprojectjpa-1.0-SNAPSHOT/ 然後用 admin/admin login,再進入 系統管理 > 訪問紀錄 可以看到有兩個 Stream ,點進去看可以看到分別是 worker1 與 worker2









經由此測試可以發現 Cluster 試驗成功,因為 worker1 上或 worker2 上的 tomcat 都有兩個 session 在

接下來將 t1 shutdown ,然後在按 worker1 上的 IE 的訪問紀錄,可發現 session 已轉到 worker2 了。因為此 session 是由 worker1 複製過來的,所以 Name 被改為 127.0.0.1 了













後記 :
1. 經由此測試發現在 Windows XP 上無法模擬 Cluster (也許要改設定),有興趣的人可以試試在 Windows 2003 server 上試,但建議用 VMware 跑 Ubuntu,因為省錢又方便
2. Tomcat 6 的設定比 Tomcat 5 簡單多了,因為預設值都被 Tomcat container 處理掉了
3. Load Balance 除了用 mod_jk 外,好像也可以用 ProxyPass 的方式,改天再來試試看

Saturday, December 13, 2008

讓 HP CQ20 的聲音重現在 Ubuntu 8.10 上

裝了 Ubuntu 8.10 後, CQ20 上得喇叭聲音就不見了, 但經過以下步驟, 終於讓聲音恢復

1. 先用 sudo apt-get install build-essential 將 kernel 模組下載到本機
2. 到 http://www.alsa-project.org/main/index.php/Main_Page 下載最新的驅動程式. 我下載的是 alsa-driver-1.0.18a

3. ./configure --with-cards=hda-intel
4. make
5. sudo make install
6. sudo gedit /etc/modprobe.d/alsa-base,最後一行加入:options snd-hda-intel model=laptop
7. reboot


看來 linux driver 總是會比 Windows 慢半拍

Tuesday, December 9, 2008

Bug in appfuse 2.0.2 DaoTest

今天試著照著 appfuse 的 tutorial 上走一次,以了解 2.0 與 1.9 版的差異,當用 JPA 做完 PersonDaoTest 後,發現了兩個 bug

1. 若測試 PersonDaoTest 時假資料是用

person = (Person) populate(person);

的方式且是用 PersonDaoTest.properties 做假資料,因 test-compile 會漏掉將 PersonDaoTest.properties 複製到 classpath 中,以致於測試 PersonDaoTest 會失敗,因為無法取得假資料。

解法 : 在 pom.xml 上補上複製 properties 的敘述
line 293
<testResources>
<!-- copy test property file in test class path -->
<testResource>
<directory>src/test/java</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</testResource>

這樣就可以將 PersonDaoTest.properties 複製到 test-classes 中了

2. 這個 bug 較嚴重
在 BaseDaoTestCase 中,line 74

BeanUtils.copyProperties(map, obj);

跑測試的時候發現假資料無法複製到 obj (person instance) 中,後來查 API 才發現應該是

BeanUtils.copyProperties(obj, map);

才對,因為 API 為
copyProperties(Object dest, Object orig)
Copy property values from the origin bean to the destination bean for all cases where the property names are the same.

這個 bug 對於使用 populate 的人而言算滿嚴重的,可能會讓試用 appfuse 的人卻步,所以在此提供大家做參考

Appfuse 2.0.2 的 displaytag 繁體中文檔

最近在試 Appfuse 2.0.2 發現沒有 displaytag 繁體中文檔,於是把簡體檔轉成繁體中文再改語意,可以從 這邊 下載,記得放到 src/main/resources 下就可以了

Run appfuse 2.0.2 with JPA

最近發現一件事,似乎越來越多的軟體公司,若是用 J2EE + MVC 架構,以 JPA 取代 Hibernate 的情況越來越多。說實在的,看了一下 JPA 的 spec,跟以往 EJB 一樣,他是一個空殼子,真正的 implementation 可以是任何 framework。

目前看到的 JPA implementation 有 Hibernate 、TopLink 及 OpenJPA,在 appfuse 2.0.2 中用的是 Hibernate 最新版 3.3.0 GA 版,但在試 appfuse 2.0.2 with JPA 中發現一些問題,讓我摸索好久才試出來,提供那些卡住的人一些解法。試之前請先參考
Appfuse 2.0.2 安裝步驟(steps for appfuse 2.0.2 installation) 中的
1. 安裝 maven-2.0.9 及設定環境變數


1. 建立 appfuse 2.0.2 的 archetype 到 d:\projects 中
d:\projects> mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myprojectjpa

PS : 有別於之前的範例,這裡用 struts 2.0 作為 MVC 的 framework,artifactId 也改為 myprojectjpa,避免與之前的範例衝到

2. 安裝 mysql (若尚未安裝)
mysql 的網站下載 mysql for Windows 並安裝 (此時裝的是 v5.0.x )。root 的密碼暫定為 root

3. 修改 root 的密碼及更改 dao framework 為 jpa

3.1 因 預設在 myproject 中的 pom.xml 的 mysql 密碼為 "空白",所以必須將此部份的空白填入真正的 root 密碼,在做 install 時才能將 table 及 測試資料放到 mysql 的資料庫中。編輯 pom.xml 並在 line 975 修改
<jdbc.password>
</jdbc.password> 為
<jdbc.password>root</jdbc.password> (假設 mysql root 的密碼為 root)

3.2 修改 line 938 將 hibernate 改成 jpa

3.3 修改 line 142 將 annotationconfiguration 改成 jpaconfiguration

3.4 這時候別急著跑 mvn jetty:run-war ,因為你一跑,會出現
javax.persistence.PersistenceException: No name provided and several persistence
units found
我因為這個 error 卡了 2,3 個小時,後來 google 後才知道要

3.4.1 remove D:\projects\myprojectjpa\src\main\resources\hibernate.cfg.xml
3.4.2 remove D:\projects\myprojectjpa\src\test\resources\hibernate.cfg.xml
3.4.3 remove D:\projects\myprojectjpa\src\main\resources\META-INF\persistence.xml

4. 取得 appfuse 的 source code 以便日後 debug 用
d:\projects> cd myproject
d:\projects\myproject> mvn appfuse:full-source

5. 利用 command line 啟動 appfuse
d:\projects\myproject> mvn clean jetty:run-war
執行 clean 的目的是要把 war 中的 hibernate.cfg.xml 清除掉,不然會造成 error

org.hibernate.DuplicateMappingException: Duplicate collection role mapping com.m
ycompany.app.model.User.roles

一旦執行此 mvn jetty:run-war,appfuse 就會直接啟動在 port 8080。此時可以用 firefox 檢測 appfuse 是否啟動成功。將 url 指向 http://localhost:8080 可以得到此畫面

Saturday, December 6, 2008

Run appfuse 2.0.2 in NetBeans 6.5

在 NetBeans 6.1 跑 appfuse 2.0.2 幾乎是不可能,試了半天總是碰壁,但到了 NetBeans 6.5,就像變魔術一般,跑的特別順,尤其是改 jsp 時,不用像 eclipse 需要改 snapshot 裡面的 jsp。在 NetBeans 6.5 可以直接修改 jsp 後在 firefox 中按 F5 就會立即反應改過的結果,對於開發者而言,實在助益不少。以下就 NetBeans 6.5 跑 appfuse 2.0.2 的步驟做一說明

使用 NetBeans 6.5 前,必須先把 appfuse 2.0.2 先安裝好。安裝的步驟可參考
Appfuse 2.0.2 安裝步驟(steps for appfuse 2.0.2 installation)

1. 安裝 NetBeans 6.5
下載 NetBeans 6.5 後安裝到 d:\Java\NetBeans 6.5 下。安裝時須確認裝的元件含 Java Web and EE,及 Run time server Tomcat 6.0.x ,如此跑 appfuse 2.0.2 時才能指定 Tomcat server 為其 Rune time server。

PS : 若你是用 JDK 6.0 Update 10 以上的版本,可以更改 d:\Java\NetBeans 6.5\etc\netbeans.conf 中的 netbeans_default_options (line 6) 在最後加上
--laf com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
可以將 NetBeans 的外觀換成新的介面如下




















此介面比舊的 Windows 好看多了

2. 安裝 maven plugin
安裝完 NetBeans 6.5 後,可透過 Tools > Plugins > Available Plugins 安裝 maven plugin。安裝完可得以下畫面
















3. 匯入 myproject 到 NetBeans 6.5 中
基本上這也不是匯入,因為已經裝了 maven plugin 的關係,可以透過 File > Open Project 的方式就可以直接打開 myproject 了














4. 設定 Rumtime Server
把 myproject 匯入到 NetBeans 後,預設並不會指定 Runtime Server ,這時候需透過 右鍵按Appfuse JSF Application > Properties > Run 去指定 Server。這邊請先設定為 Tomcat 6.0











5. 啟動 Appfuse web application
當 1-4 設定完成後,可以按 F6 ,Appfuse 就會立即 compile 並 deploy 到 Tomcat 6.0 上且直接帶出 Firefox (或 IE) 顯示 Appfuse 的完整功能















Tips
1. 每次按 F6 時,maven 都會先跑 testcase 後再 deploy 到 tomcat 上,若要跳過 testcase ,可以透過 右鍵按Appfuse JSF Application > Properties > Action > Run project > Set Properties 加入 maven.test.skip=true 即可以跳過 testcase

















2. 當修改 java code 後按 F6 重新 deploy appfuse 到 tomcat ,會發現 2 次後便會發生
java.lang.OutOfMemoryError: PermGen space
的錯誤訊息,此時便無法重新 deploy appfuse ,必須透過 Task Manager 將手動 Tomcat 除掉後再重新 deploy 一次,造成很大的不便。這個問題可以透過 Tools > Servers > Apache Tomcat 6.0.18 > Platform(tab) > VM options 加入 -XX:MaxPermSize=256m 便可以至少 redeploy appfuse 至少 10 次以上,減少除掉 Tomcat 所需花費的時間。




















運用這兩個 Tips ,應該可以減少一下開發時的麻煩,把時間花在功能的開發上。

Appfuse 2.0.2 安裝步驟(steps for appfuse 2.0.2 installation)

Appfuse 2.0.2 理論上不是一個 framework,而是一個已經 ready to go 的 project prototype。它集合了最穩定與先進的 framework 再加上最基本的 ACL,Menu ,讓 developer 不用從頭開始建構一個 project 的基礎架構。它的 build tool 用的是 Maven,所以無論在做 demo、test、ContinuousIntegration 都不用在額外撰寫新的,直接使用或就現有的架構再做擴充便可以上手。

以下為安裝 appfuse 2.0.2 的簡單步驟,不用十分鐘(除了喝 coffee 的時間),你就有一個可以 login 、manage user 、 upload file 基本功能的 web application 出現在你的電腦上。

1. 安裝 maven-2.0.9 及設定環境變數
下載 maven-2.0.9 到 d:\Java (目錄為 d:\Java\apache-maven-2.0.9)
set M2=D:\Java\apache-maven-2.0.9\bin
set M2_HOME=D:\Java\apache-maven-2.0.9
set MAVEN_OPTS=-Xms256m -Xmx512m
set PATH=%M2%;%PATH%

編輯 d:\Java\apache-maven-2.0.9\conf\settting.xml
line 49 將 localrepository 的內容改成 D:\Java\apache-maven-2.0.9\repository

PS:因 maven 預設值會將 repository 放到 c:\Document2 and Settings\.m2 中,這樣用不同的人 login ,其 repository 就需要跟著異動。放到 d:\Java\apache2-maven-2.0.9\repository 的好處在於將來 team 可以用同樣的設定作業,避免因環境的不同而需要花額外的時間做環境設定

2. 建立 appfuse 2.0.2 的 archetype 到 d:\projects 中
d:\projects> mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject

PS : 此時可以去喝一杯咖啡了,因為要很久。若要節省時間,可以下載 dependency 並解壓縮到 d:\Java\apache-maven-2.0.9\repository

3. 取得 appfuse 的 source code 以便日後 debug 用
d:\projects> cd myproject
d:\projects\myproject> mvn appfuse:full-source

4. 安裝 mysql
mysql 的網站下載 mysql for Windows 並安裝 (此時裝的是 v5.0.x )。root 的密碼暫定為 root

5. 修改 root 的密碼
因 預設在 myproject 中的 pom.xml 的 mysql 密碼為 "空白",所以必須將此部份的空白填入真正的 root 密碼,在做 install 時才能將 table 及 測試資料放到 mysql 的資料庫中。編輯 pom.xml 並在 line 982 修改 <jdbc.password>
</jdbc.password> 為 <jdbc.password>root</jdbc.password> (假設 mysql root 的密碼為 root)

6. 利用 command line 啟動 appfuse
d:\projects\myproject> mvn jetty:run-war
一旦執行此 mvn jetty:run-war,appfuse 就會直接啟動在 port 8080。此時可以用 firefox 檢測 appfuse 是否啟動成功。將 url 指向 http://localhost:8080 可以得到此畫面



















簡單的 6 個步驟,你就有一個功能陽春的 prototype 可以使用,但是若要真的用在 project 上,建議需要有至少 1 年以上的 web 開發功力再使用這一套,因為裡面用的是 MVC + ACEGI + AJAX ,光摸熟這一套就需要花約 2 星期的工夫,但一旦摸熟,則無往不利,因為要加新的功能,除了 domain 的 knowledge 以外,用套的就可以了。

Tuesday, December 2, 2008

如何在 eclipse 3.4 下跑 appfuse 2.0.2

因為工作性質的關係(一堆同時進行的專案),在系統的開發上需要有效率的執行,不能每次都從頭來,但已做過的專案又會因其特性的不同而造成 reuse 的機會降低,所以當時找了一個不是 framework 的 framework 當作開發的 initial startup ,裡面含有當下最新的技術,不用在自行組裝要用的 package,以降低開發時所需的時間與精力

Appfuse 目前最新版的是 2.0.2 ,用的整合工具是 maven 2.0.x ,但只能用 command line 做 build 及 run ,無法直接用在 IDE 的環境上。說實在的,借由 IDE 的輔助,可以省掉一些 coding 的時間,尤其是在 gen getxx 與 setxx 的 java code 時,助益不少

經我測試過,Appfuse 2.0.2 在 Netbeans 6.5 下完全沒有問題,可見 Netbeans 越來越成熟了,但在 eclipse 3.4 下則必須還要做些微修正才能符合 eclipse 的環境,做到 hot deployment 及減少修改 code 後還要重新 deployment 所浪費的時間

以下為修改步驟以便讓 appfuse 2.0.2 適用於 eclipse 3.4
PS : 請先安裝 JDK1.6, eclipse 3.4 JEE, maven 2.0.9, m2eclipse, mysql

1. 安裝 eclipse 3.4
下載 eclipse 3.4 並解壓縮到 d:\Java (目錄為 d:\Java\eclipse)
利用 eclipse 的 Help > Software Update > Available Software > Add site 安裝 m2eclipse plugin。
此 plugin 的 url 為 http://m2eclipse.sonatype.org/update/

2. 安裝 maven-2.0.9 及設定環境變數
下載 maven-2.0.9 到 d:\Java (目錄為 d:\Java\apache-maven-2.0.9)
set M2=D:\Java\apache-maven-2.0.9\bin
set M2_HOME=D:\Java\apache-maven-2.0.9
set MAVEN_OPTS=-Xms256m -Xmx512m
set PATH=%M2%;%PATH%

編輯 d:\Java\apache-maven-2.0.9\conf\settting.xml
line 49 將 localrepository 的內容改成 D:\Java\apache-maven-2.0.9\repository

PS:因 maven 預設值會將 repository 放到 c:\Document2 and Settings\.m2 中,這樣用不同的人 login ,其 repository 就需要跟著異動。放到 d:\Java\apache2-maven-2.0.9\repository 的好處在於將來 team 可以用同樣的設定作業,避免因環境的不同而需要花額外的時間做環境設定

3. 建立 appfuse 2.0.2 的 archetype
d:\projects> mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject

PS : 此時可以去喝一杯咖啡了,因為要很久。若要節省時間,可以下載 dependency 並解壓縮到 d:\Java\apache-maven-2.0.9\repository

4. 取得 appfuse 的 source code 以便日後 debug 用
d:\projects> cd myproject
d:\projects\myproject> mvn appfuse:full-source

5. 修改 root 的密碼
因 預設在 myproject 中的 pom.xml 的 mysql 密碼為 "空白",所以必須將此部份的空白填入真正的 root 密碼,在做 install 時才能將 table 及 測試資料放到 mysql 的資料庫中。編輯 pom.xml 並在 line 982 修改 <jdbc.password>
</jdbc.password> 為 <jdbc.password>root</jdbc.password> (假設 mysql root 的密碼為 root)


6. 利用 command line 啟動 appfuse
d:\projects\myproject> mvn jetty:run-war
一旦執行此 mvn jetty:run,appfuse 就會直接啟動在 port 8080。此時可以用 firefox 檢測 appfuse 是否啟動成功。將 url 指向 http://localhost:8080 可以得到此畫面



















7. 匯入 myproject 到 eclipse 中
確認 appfuse 執行無誤後, 請執行
d:\projects\myproject> mvn eclipse:eclipse
這時候會在 d:\projects\myproject 目錄下產生 .settings 目錄及 .project, .classpath 檔

然後打開 eclipse ,利用 File > Import > General > Maven Projects 再將 Root Directory 指到 d:\projects\myproject 再按 Finish





























這裡可看到 myproject 已經被匯入到 eclipse 中了


8. 修改 eclipse WTP 專用的設定檔

若要讓 appfuse 可以在 eclipse WTP 上執行,必須做稍微的修正,才能直接在 eclipse 上啟動 tomcat 並 deploy appfuse

修改 .setting\org.eclipse.wst.common.component
刪除 <wb-resource deploy-path="/" source-path="src/main/webapp"/>
刪除 <wb-resource deploy-path="/" source-path="src/main/resource"/>
增加
<wb-resource deploy-path="/" source-path="target/myproject-1.0-SNAPSHOT"/>

修改 .classpath
刪 除 <classpathentry kind="src" path="src/main/resources" excluding="ApplicationResources_de.properties|ApplicationResources_fr.properties|ApplicationResources_ko.properties|ApplicationResources_nl.properties|ApplicationResources_no.properties|ApplicationResources_pt*.properties|ApplicationResources_tr.properties|ApplicationResources_zh*.properties|applicationContext- resources.xml|**/*.java"/>
增 加 <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v6.0"/>
增加 <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>

然 後按 F5 做 refresh 後,接著在 myproject 按右鍵 > Run As > Run on Server > 選 Tomcat v6.0 > Finish 。在畫面可以看到 myproject 直接執行在 eclipse 上




















9. 注意事項
9.1 若要改 jsp ,必須改 target/myproject-1.0-SNAPSHOT 下面的 jsp 檔,測試完後再 copy 回 src\main\webapp 下,因為修改後的 WTP 只吃 target/myproject-1.0-SNAPSHOT 下的 jsp。
9.2 若改 jsp 後 refresh browser 無法立即呈現修改後的狀態,需要 close myproject 在 open myrpoejct。這是因為手動改 wtp 設定檔,需 reopen myproject 才行