#設定 Logger(s),格式 logger_name = message_level, appender1, appender2, ...
log4j.rootCategory=error, stdout
#以下是給fileftp.java使用的專屬Category
log4j.category.doftp.name=info, X
#以下設定false時,訊息不會往rootCategory送,只會在doftp.name的自訂Categoey中
log4j.additivity.doftp.name=false
#設定 Appenders
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
### 設定doftp.name是RollingFile的方式
log4j.appender.X=org.apache.log4j.RollingFileAppender
log4j.appender.X.File=doftp.log
log4j.appender.X.MaxFileSize=300KB
log4j.appender.X.MaxBackupIndex=2
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %m%n
2006年12月26日 星期二
Loging 實務:log4j 設定檔範例
2006年12月25日 星期一
測試預期的 Exception 行為
可利用 fail 這個述詞來測試。
如以下的 JUnit 語法:
public void testGetUserException() {
User u = null;
try {
u = UserFetcher.getUser("ThisUserIdDoesNotExist");
fail("Should have gotten NoSuchUserException - used a bad user ID");
} catch (NoSuchUserException expected) {
; // Expected - intentional
}
}
2006年11月16日 星期四
JDBC 實務:使用 JDBC 時,一定要放在 try 區塊中,並於 finally 區塊釋放 Connection
所以若程式有使用 JDBC 時,一定要包在 try 區塊中,並在 finally 中關閉 connection 釋放資源,才不會耗盡資源。
一般實務作法如下例:
Connection con=null;
try{
con=new Connection();
...
...
...
}finally{
try{
con.close();
}catch(Throwable e) {
String errmsg="close connection failed! errmsg is "+e.getMessage();
log.error(errmsg);
}
}
Java 實務:發生例外事件時,log 所有的錯誤訊息
因此系統應導入 log 機制 Ex.log4j,來幫助我們 trace 產生例外的程式。建議所有的程式,全部應放鄉 try/catch(throwable) 區塊,除了顯現「發生系統錯誤,請連絡資訊室!」外,並將所有例外訊息傳給 log 以利除錯。
建議在程式加入以下源碼:
try {
;
}catch(Throwable e){
String errmsg = "系統例外:"+e.getMessage();
log.error(errmsg);
throw new RuntimeException(errmsg, e);
}
2006年9月5日 星期二
ANT 的 depnedent 工具
若 file 的 directory 不存在,
就自動建立,若 file uptodate? 則不動作。
copy
2006年8月4日 星期五
T:描述結構性資料
較佳的結構至少是類 xml 的階層結構。
階層結構由 "{}"來區分,
而 sequence 結構由 "," 及出現的前後區分。
一個 order 有很多 entry 可這樣描述
order ={
light={amt=2},
bulb={amt=2}
}
取出 order 第一個物件就是
order.light.amt==2
用"." 點來區分物件。
2006年7月31日 星期一
T:一個新語言的設計
這個語言的中心哲學是,
"簡單直覺的描述一件事"
語言暫且稱為 T 意思為譯者,
能讓我們用簡單的命令告訴它,讓電腦作事情。
當然這是交談式的,
我告訴 T 一件事,
T 會給我回應,溝通圖如下:
I <-> T
T 給我的回應是在下一行,
我給 T 的稱作"指令",
T 的回應是用字串報告的結果,
並列印於螢幕上。
首先這個語言的 hello world 是如此
I: print("hello world!");
T:hello world!
2006年7月18日 星期二
SVN 基本用法
功能 | SVN | CVS |
---|---|---|
版本編號 | 每次 commit 專案編號加一,版編=專案被 commit 的次數 | 每個檔案一個編號,編號=這個檔案的commit 數 |
異動功能 | add delete copy move | add delete |
指定儲存庫 | 標準 URL 語法,語法較自然 | 類 URL |
SVN 的版本編號
SVN 一次都是給整個專案都同一個 revision number,
而 CVS 是一個檔案一個 revision number。
這樣的好處是可以很簡單的找出穩定的版本。
因為穩定和整個專案有關,而非個別的檔案。
所以一個穩定的專案版在 SVN 可用一個 revision number 表示,
而在 CVS 需指定每個檔案的 revision number 比較麻煩。
安裝SVN
1.先下載 bin 檔案
2.解壓安裝
3.設定環境變數 lang=en_us 以去除中文亂碼
常用指令
以下指令以主機[192.168.0.188]及專案[RPMS]為範例:
察看目前儲存庫的目錄
svn list svn://192.168.0.188/
取得最新的工作烤貝
svn co svn://192.168.0.188/RPMS
更新工作烤貝
#進入工作目錄
cd RPMS
#更新
svn up
加檔入確認排程
#進入工作目錄
cd RPMS
svn add FILE
刪檔入確認排程
#進入工作目錄
cd RPMS
svn delete FILE
建立子目錄加入排程
#進入工作目錄
cd RPMS
svn mkdir DIR
確認上傳
#進入工作目錄
cd RPMS
svn ci
連接密碼控管的文件庫
若要連上有加上密碼控管的文件庫則在命令前加上使用者及密碼資訊如下:
svn co --username ggyy --password ggyy svn://gyboy.blogspot.org/fhope
2006年7月3日 星期一
ANT 簡介
- 檔案管理- copy, move, mkdir, rename等
- ANT 能從不同來源取得檔案的方法,像是 ftp, cvs, svn, http get 等
- 也能用 ftp 來幫妳佈署檔案到遠端主機
- 壓縮檔案
- 支援 zip, unzip, jar, war, 幫妳生成包裝檔案
- 利用 JDBC 設定資料庫
- 利用 Telnet 幫妳設定遠端的 Server,ex.重開 weblogic
- 支援 CVS, SVN 幫妳作版本控管
- 利用 JUnit 自動幫妳作測試,並產生測試報告
- XSLT 幫妳轉換 XML 的文件
- XDOCLET 幫妳自動生成程式碼
- 把 JSP 轉成 JAVA 可指定 tomcat 或 weblogic
- 幫妳從檔案取代字串,通常用在 html sign 上最後修改日期的自動化
例:把 JSP 上傳測試機
- 傳統上我們得用 ftp GUI client 貼上去,但每次改一段要測試就得重覆這個動作,在程式間跳來跳去,相當不方便。
- 聰明一點的,會把利用 ftp 的 command 指令寫成巨集執行這個重覆的動作ftp 命令檔如下:
#deploy.ftp然後要上傳時輸入
root
rootpassword
cd /deploy/webapp
put /local/file1.jsp
put /local/file2.jsp
cd /deploy/classes
put /local/file1.class
put /local/file2.class
ftp -s deploy.ftp批次執行上述的 ftp 命令
看看 ANT 怎麼作?
可以把description="deploy files to pcstest machine" >
remotedir="${pcstest.operation.dir}"
userid="${pcstest.ftp.userid}"
password="${pcstest.ftp.password}" depends="yes" binary="no">
ant deploy.pcstest就可以執行
description="create a temp dir for make ncqmda release file" >
再看看 ANT 的 ZIP 指令
description="create a nckmqa release zip" >
有沒有發現指定檔案集的方式都是用
ANT 可統一設定所有的資源,包括 SQL, Telnet, CVS, http GET, mail
可遠端操作 Telnet 不用在使用其它的 cliet 去作這件事, 以下看看如何重開 weblogic。當然透過 JDBC 也可用 SQL 設定資料庫
userid="${pcstest.telnet.userid}"
password="${pcstest.telnet.password}">
cd ${pcstest.nckmdomain.dir}
stopWebLogic.sh
nohup startWebLogic.sh &
cvs 或 svn 也通用,用來作版控。
driver="${db.pcs.driver}"
url="${db.pcs.url}"
userid="${db.pcs.userid}"
password="${db.pcs.password}">
CREATE TABLE oproom_material_record_detail2
(
oprmrd2_hospital_no char(1),
oprmrd2_operation_date char(8),
oprmrd2_room_no char(2),
oprmrd2_seq_no int,
oprmrd2_material_date char(8),
oprmrd2_material_time char(9),
oprmrd2_r1 char(4),
oprmrd2_r2 char(4),
oprmrd2_r3 char(4),
oprmrd2_material_no char(9),
v1f char(1),
v2f char(2),
v3f char(3),
r1f char(1),
r2f char(2),
r3f char(3)
);
自動寄 e-mail。
從 http 抓檔案
The ${buildname} nightly build has completed
dest="statement.html"
username="1214";
password="secret"/>
ANT 能自動比較檔案的新舊,來作動作
ANT 能從不同來源取得檔案的方法, 像是 ftp, unzip, copy, cvs 等, 其中一個重點是當目的檔案比來源檔案舊時, 應該不可覆蓋來源檔案,相關的屬性如下[v1|v2] 第一個表預設值
ftp.depends=[no|yes] yes 表不覆蓋
ftp.newer=[no|yes] yes 表不覆蓋
unzip.overwrite=[true|false] false 表不覆蓋
copy.overwrite=[false|true]false 表不覆蓋
直接看我的範例檔吧!
operation
location="${build.test.dir}/report"/>
value="jdbc:mysql://localhost/pss?useUnicode=true&characterEncoding=big5"/>
value="jdbc:informix-sqli://192.168.11.112:1526/pcs:authority:INFORMIXSERVER=nckmdb_tcp"/>
value="${pcstest.nckmdomain.dir}/applications/hospitalization"/>
value="${pcstest.ap.dir}/DefaultWebApp"/>
value="${pcstest.web.dir}/hospitalization3/operation"/>
value="${pcstest.web.dir}/WEB-INF/classes/"/>
location="d:\nckm\DefaultWebApp\hospitalization3"/>
value=":pserver:nckmcvs:nckmcvs@ftp-proxy.syscom.com.tw:/cvshome/nckm"/>
value="nckm_s"/>
description="setup a environment for this project" >
description="put file to test machine" >
debug="on"
source="1.4"
target="1.4">
description="unit test" >
name="edu.ncku.hosp.OPRMaterialRecordTXTest"/>
description="deploy files to pcstest machine" >
remotedir="${pcstest.operation.dir}"
userid="${pcstest.ftp.userid}"
password="${pcstest.ftp.password}" depends="yes" binary="no">
remotedir="${pcstest.web.classes.dir}"
userid="${pcstest.ftp.userid}"
password="${pcstest.ftp.password}" depends="yes" binary="no">
remotedir="${test.server.operation}"
userid="root" password="wyj0806" depends="no" binary="no">
description="backup" >
value="${backup}/${ant.project.name}_${DSTAMP}${TSTAMP}.zip"/>
description="create a temp dir for make ncqmda release file" >
description="create a nckmqa release zip" >
description="clear release dir">
description="put release into nckmqa" >
remotedir="nckmqa"
userid="root"
password="wyj0806"
depends="yes"
binary="no">
description="restore src to initialize state" >
message="import procject files: ${scm}"/>
test.server.operation.dir=${test.server.operation}
userid="${pcstest.telnet.userid}"
password="${pcstest.telnet.password}">
cd ${pcstest.nckmdomain.dir}
stopWebLogic.sh
nohup startWebLogic.sh &
driver="${db.pcs.driver}"
url="${db.pcs.url}"
userid="${db.pcs.userid}"
password="${db.pcs.password}">
CREATE TABLE oproom_material_record_detail2
(
oprmrd2_hospital_no char(1),
oprmrd2_operation_date char(8),
oprmrd2_room_no char(2),
oprmrd2_seq_no int,
oprmrd2_material_date char(8),
oprmrd2_material_time char(9),
oprmrd2_r1 char(4),
oprmrd2_r2 char(4),
oprmrd2_r3 char(4),
oprmrd2_material_no char(9),
v1f char(1),
v2f char(2),
v3f char(3),
r1f char(1),
r2f char(2),
r3f char(3)
);
無廢話ANT 安裝
- 下載ANT
- 解壓縮至 c:\ant
- 設定環境變數 JAVA_HOME=C:\jdk
- 設定環境變數 ANT_HOME=C:\ant
- 設定環境變數 PATH=%ANT%\bin
使用 FTP task
安裝以下的庫至 %ant_home%/lib 下- jakarta-oro-2.0.8.jar
- commons-net-1.4.0.jar
classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/>
Ant vs Maven
Maven 是 ANT 的主要對手,其差異如下: Ant 有三個階層,project target task,但彼此互不關聯 Maven 在 project 層則隱涵target。2006年6月23日 星期五
開發程式活動及工具
開發程式包含了下面幾個活動:
- 撰寫說明文件,設計文件,需求文件,專案文件
- 編輯程式碼文件
- 文件版本控管
- 程式測試
- 程式除錯
- 程式建立
- 程式佈署
- 臭蟲需求追縱記錄
一篇介紹程式發展工具的好文
用Open Source工具開發軟體: 新軟體開發觀念
我用的程式發展輔助工具
----------------
文字編輯器:vim
程式語言:Java
編譯器:javac
除錯器:jdb, 尚未有深入研究,見:java debug, O'Reilly sleepless 專欄
程式碼結構 index 產生器:
jtags,對 java 結構產生一 tags 的 index 檔,使編輯器可很快走到 java 的某項結構
ctags,支援多個語言
程式建立輔助工具:ant, maven 好像也不錯
安裝程式產生器:目前還用 ant 模擬
log 系統: log4j + chainsaw ,links:log4j 簡明手冊
版控系統:SVN 和 CVS 都有用,目前希望專注在 SVN 上
目前想要的功能:
bug tracker:無,想要找一套,或自已寫
測試軟體:JUnit, htmlUnit,dbunit
vim 能有 code completion
vim 有更好的 xml 編輯功能
CASE Tools
UML 塑模器:ArgoUML 似乎進步了,不過比不上 Rose UML 吧
StartUML 也不錯
RDBMS Exploerer: Squirrel
上面覺得不好用是因為沒跟 vim 整合在一起吧!
2006年6月22日 星期四
值得注意的未來技術:WiMAX
George Ou‧郭文興譯 2005/08/01
WiMAX(全球微波存取互通介面)是IEEE 802.16乙太網路的介面標準,就像Wi-Fi是802.11乙太網路的標準一樣。這兩年來,WiMax已經成為無線網路界最流行的專用字彙。同時它也可能是近年來最被誇大誤解的技術之一。
對WiMAX常見的誤解有:
WiMAX的傳輸範圍一定比Wi-Fi大
WiMAX的速度比Wi-Fi快
WiMAX會跟Wi-Fi競爭,進而取代Wi-Fi
WiMAX比Wi-Fi更安全。
WiMAX的傳輸範圍一定比Wi-Fi大
WiMAX的設計可以在需要執照的無線頻段,或是公用的無線頻段運作。只要系統業者擁有該無線頻段的執照,而讓WiMAX在授權頻段運作時,WiMAX便 可以用更多頻寬、更多時段與更強的功率進行傳送。一般來說,只有無線ISP業者才會使用授權頻寬的WiMAX技術。至於Wi-Fi的設計則只在公用頻段中 的2.4GHz到5GHZ之間工作。美國的聯邦通訊委員會(FCC )規定Wi-Fi一般的傳輸功率要在1毫瓦到100毫瓦之間。一般的WiMAX的傳輸功率大約100千瓦,所以Wi-Fi的功率大約是WiMAX的一百萬 分之一。使用WiFi基地台一百萬倍傳輸功率的WiMAX基地台,會有較大的傳輸距離,自然毫無疑問。
雖然有授權頻段的WiMAX顯然有較長的傳輸範圍,也不代表只要有錢就要趕著去買個WiMAX基地台。你必須要有一個授權的無線電頻段,就像一個音樂電台 也必須要有頻段執照,才能在空中發射無線電波。而如果WiMAX跟Wi-Fi一樣放在未授權的頻段,則它的傳輸優勢就馬上消失了。Wimax跟Wi-Fi 都是基於無線頻段傳輸的技術,所以受同樣的物理定律限制。反之,如果在同樣的條件下,讓Wi-Fi使用授權頻寬,Wi-Fi也可以跟WiMAX一樣快。另 外,雖然WiMAX可以利用較新的多路徑技術。目前新推出的pre-N MIMO(多天線雙向傳輸)技術Wi-Fi產品也使用了該技術。
WiMax的速度比Wi-Fi快
WiMAX的擁護者常常在大肆宣揚該技術的速度優勢。雖然WiMAX聲稱最高速度每秒70mbyte,然而最新的Wi-Fi MIMO理論上也有每秒108mbyte的最高速度,而實際環境下也有45mbps的速度。我可以去商場買一個Wi-Fi MIMO的基地台回家組裝,自行確認其速度約為45mbps,然而WiMAX的產品至今卻尚未出現。WiMAX技術同樣受技術問題與物理定律所限制,要談 論WiMAX的實際頻寬還是太早。
無線ISP業者在建置WiMAX的時候,同樣會遇到現今其他無線業者會遇到的頻寬競爭難題。授權頻段的WiMAX系統涵蓋範圍極大,約數十公里,其建置的 困難可說是一把兩刃之劍。這是因為無線覆蓋範圍非常之大,裡面會有極多的使用者同時競爭同樣的頻寬。就算無線ISP業者使用多個獨立的頻道來運作,在同一 個頻道中,還是會有數倍於Wi-Fi的使用人數。我所認識的每一家無線ISP業者,不管是無線微波業者、3G行動業者,到衛星電話業者,同樣都會遇到頻寬 競爭與QoS(服務品質)管控的問題。
如果網路的延遲在200到2000毫秒間遊移,這種網路根本不可能使用VoIP、視訊會議、網路遊戲,或任何其他的即時應用。雖然已經有人談論將 WiMAX加上QoS機制,以供VoIP使用,然而實作方法與實作效益仍舊有待觀察。而在Wi-Fi方面,Spectralink上的QoS實作成效已被 證實,同時802.11e的無線QoS標準也將要推出。無線ISP業者的WiMAX建置一定會比非授權的WiMAX或Wi-Fi基地台建置來得慢,因為對 無線ISP業者不可能會去讓少數用戶使用整個頻段。
私人而使用公用頻段的WiMAX基地台,與Wi-Fi基地台的設置到底何者為快,將取決於產品的推出。由於理論上他們的傳輸功率與頻段大致相同,而市面上 已經有大量而且成熟的Wi-Fi產品,我個人會賭Wi-Fi這一邊贏。Wi-Fi在非授權頻段這一邊已經領先一大步,很難想像WiMAX在這個領域有辦法 成功。這是為什麼WiMAX多是往無線ISP業者的方向來推動。
WiMAX將與Wi-Fi競爭,進而取代Wi-Fi
最狂熱的WiMAX支持者甚至辯稱WiMAX將會完完全全的取代Wi-Fi,讓Wi-Fi成為歷史。這種想法說好聽一點是過度樂觀,過難聽一點則是荒謬無 比。WiMAX在整合與標準化無線微波ISP市場的過程中,將會有一席之地,但它並不會直接的與大多數的Wi-Fi建置競爭。WiMAX將會聚焦於授權頻 段的無線ISP市場,而Wi-Fi將會繼續主導私用的無照無線市場,如公司或家用的無線網路。WiMAX與Wi-Fi唯一會重疊的地方,大概就是收費的 Wi-Fi存取點了。
由於WiMAX連線的涵蓋面積較大,以數十公里計,而Wi-Fi存取點是由數十米的小片面積所組成,所以WiMAX在全球涵蓋上會有佔有優勢。但是因為目 前的市場佔有率較高,以及因為小範圍、同時競爭的用戶人數較少,造成Wi-Fi較快、延遲較小的特性,Wi-Fi的收費存取點仍可能持續流行。至於 WiMAX是否能擊敗Wi-Fi的收費存取點,關鍵因素將是WiMAX的QoS機制是否良好實作,以及如何解決過多使用者的問題。如果WiMAX技術跟現 今的無線ISP一樣,具有過多使用者與高延遲的問題,它絕對不可能讓Wi-Fi收費存取點的需求消失。
WiMAX較Wi-Fi來得安全
WiMAX比Wi-Fi更安全是另一個盛傳的錯誤觀點。事實上WiMAX使用的是與Wi-Fi 的WPA2標準相似的認証與加密方法。其中的微小區別在於WiMAX的安全機制使用3DES或AES加密,然後再加上EAP,這種方法叫PKM-EAP。 而另一方面Wi-Fi的WPA2則是用典型的PEAP認証與AES加密。沒人可以說其中一個一定絕對比另一個安全,因為好的安全性往往取決於實際建置方式 的正確與否。
讓社會大眾知道WiMAX的正反兩面十分重要。WiMAX技術與802.16標準是十分重要的,因為他是無線ISP業者未來合理的演進方向。但是它絕非無 線網路技術萬能而且終極的解決方案。WiMAX或其他的無線網路技術將會互補,同時這些無線技術也不可能取代有線技術的需求。無線的連線方式必定更有行動 力、更方便。至於有線的連線方式,只要能牽上線,則一定更快,更可靠。我們必須揚棄所有關於WiMAX的不實謠言,務實看待這個技術的真實面貌。
2006年6月20日 星期二
ANT 的角色
shell script 是幫助自動化發展應用程式的非核心工作,
像是檔案管理、源碼管理、程式庫 dependency 分析、
程式師合作的溝通。
讓程式師專注於解決他的問題。
Ant vs Maven
2006年6月15日 星期四
2006年6月5日 星期一
解決 IE 無法顯示 blogger 的問題
[設定]-[格式]-[日期語言]-[中文台灣]
就可了
把 IE 的編碼改成 UTF-8
[檢視]-[編碼]-[Unicode(UTF-8)]
一片空白的UTF-8網頁
裡有更多解法
2006年5月31日 星期三
2006年5月20日 星期六
2006年5月18日 星期四
2006年5月14日 星期日
JavaScript 的 url
javascript:alert("Hello World!")
便會在 browser 把 url 後的 javacript code 直接送到 javascrip 直譯器。
像是 area tag 不支援 onclick 等事件,所以可將 javascript 用 url 表示,並放在 href 屬性中來模擬事件。
阿布達: JavaScript
2006年5月11日 星期四
2006年4月19日 星期三
Javascript 實務
- 若預設值是由 SeverPage 寫到網頁,不要 js array 儲值,而用 hidden input 來儲值
- 在網頁字串實字的 quoting 使用 ',而 server page 使用 "
- 若使用 AJAX 呼叫某網頁而無回應時,請看呼叫的網頁是否有錯
- JavaScript 是區分大小寫,請注意名稱大小寫
- 若在寫 function(para),記得第一行是 if(!para) return null;
分類:
JavaScript