Google
 
顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

星期三, 10月 01, 2008

Adobe RIA 大師講座

很久沒有出去外面吸收新知,今天剛好有機會可以聆聽 Adobe RIA 大師,Mike Chambers 及 Ryan Stewart 的講座,主要圍繞在新版的 Flash 10 和 Flex 4。

會場在臺北遠企 B1,地方很小,不過參加的人十分踴躍,晚到的就沒有好位子,也吃不到點心啦!

待過 Hsulab 的人都知道,別的沒有,賽氣特別重。參加什麼抽獎的一定都不會中 =.=
離開 Hsulab 的芷瑩,運氣果然旺,抽到會場的第一特獎,第一本還沒有上市的 Flex 中文書。

參加座談、研討會,大部分的人聽聽就趕快去換獎品走人。這麼難得的機會,當然要做做國民外交,認識新朋友囉!
綠色上衣的是 Mike Chambers,光頭的 Ryan Stewart,各個都是厲害的角色,特徵是他們的 MacBook Pro,上面貼滿了形形色色的貼紙 ...

雖然今天的座談僅只於簡介,不過已經讓人對於 Flash 10、Flex 4 和 Adobe CS4 的新功能嘆為觀止,也難怪 Adobe 在多媒體界依然屹立不搖,穩坐龍頭寶座!

今天印象比較深刻的,是支援 3D 的 Flash 10 還有支援 FXG 的 Flex 4。
現場 Mike 示範將 Illustrator 的圖存成 FXG 格式,基本上 FXG 裡面就是一堆 MXML,直接貼到 Flex 程式裡面就搞定了。比直接用 image component 的好處是,可以在 Flex 程式裡面,直接對圖形做處理。現場的範例是加了一個 HSlider,可以動態控制圖形(Flex Logo)四個角的圓弧程度,看了口水都流出來了 =.=

另外還有一個新玩意是 Thermo,設計使用者介面新的幫手,跟 CS4 產品整合地不錯,且可以跟 Flex Builder 共用同一個 Project。現場的示範是將一個 Photoshop 的 PSD 檔,在 Thermo 裡面設定哪些部份是按鈕,哪些是文字輸入框,最後再產生 MXML,直接套用到 Flex 裡面。
可以想像的是,以後美編設計師和程式設計師之間的整合,更加方便與容易,真是令人期待阿!

每次出來都有新的刺激,真是不錯,可是時間就是這麼少,舊的都學不完了,還有新的,結論是:持續爆肝中 =.=



星期五, 9月 19, 2008

Using SSL for Secure MySQL Connection

資訊安全的重要,在現代這個網路發達,更顯得重要。
為了不讓不相干的人,偷取到私密重要的資料,加密技術便成為目前最廣為普遍應用的。
Secure Sockets Layer (SSL) protocol 和 X.509 標準,是目前網路上,最常用的加密方式。
這一篇紀錄如何讓 MySQL 擁有 SSL 的功能,以及如何用 Java 使用 SSL 連結到 MySQL。

測試環境:
Ubuntu Linux 8.04
MyQL 5.0.51
JDK 1.6.0_03

首先檢查 MySQL 有沒有支援 SSL:

mysql> SHOW VARIABLES LIKE 'have_ssl';



have_ssl = DISABLED,表示 MySQL 有支援 SSL,但功能沒有打開。Ubuntu 的 MySQL 套件預設有支援 SSL,如果是自己 Compile 的 MySQL 而沒有支援 SSL 的話,要加上 SSL 的參數重新 Compile。

再來是建立 SSL 憑證:

建立 CA 憑證:
shell> openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

建立 MySQL Server 憑證
shell> openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
shell> openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

建立 MySQL Client 憑證
shell> openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
shell> openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

修改 MySQL 設定檔 my.cnf,加上:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

重新啟動 MySQL,再檢查一次是否已經打開 SSL 功能:



have_ssl = YES,MySQL 的設定就告一段落了。用 MySQL Client 測試一下:

shell> mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -u root -p



測試無誤後,接下來要寫個 Java 程式,用 SSL 的方式連 MySQL。撰寫程式前,要先用 Java 的 keytool 建立 truststore 和 keystore:

建立 truststore:

shell> keytool -import -alias mysqlServerCACert -file ca-cert.pem -keystore truststore

建立 keystore:
匯入之前建立的 MySQL Client 憑證,首先要先轉成 DER 格式:

shell> openssl x509 -outform DER -in client-cert.pem -out client.cert

產生 keystore:

shell> keytool -import -file client.cert -keystore keystore -alias mysqlClientCertificate



將建立好的 truststore 和 keystore,放到一個安全的地方,接下來是 Java 的 Code:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class MySQL_SSL_TEST {

static private String db_user = "username";
static private String db_password = "password";

public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
System.setProperty("javax.net.ssl.keyStore","/your_path/keystore");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","/your_path/truststore");
System.setProperty("javax.net.ssl.trustStorePassword","password");
Connection con = DriverManager.getConnection("jdbc:mysql://your_host:3306/DATABASE?user="+ db_user + "&password=" + db_password + "&useUnicode=true&characterEncoding=utf8&useSSL=true");
String query = "SELECT * FROM TABLE";
Statement stm = con.createStatement();
ResultSet res = stm.executeQuery(query);
while(res.next()){
System.out.println(res.getString(1));
}
res.close();
stm.close();
con.close();
} catch (Exception e) {
System.out.println("Caught Exception : " + e.toString());
}
}
}

如果可以順利 Query 出資料,就大功告成啦!

多一層防護,的確安全些,不過就跟防毒軟體一樣,即使常常 Update,也不能保證 100% 的安全,凡事多留意,真的無敵重要的資料,還是不要放在網路上,比較安全囉!




星期一, 9月 15, 2008

Flex 開放課程教學

新學期的程式設計與資料庫,Marian 讓我在學校推廣 Flex。
加上學校要推 Open Course Ware,於是上課所有的教材(包括我的聲音 =.= ),統統都要放在網路上:TMU OpenCourseWare


對象是沒有寫過程式的大學生,所以一切從頭教起,希望上課的同學,學期結束後都能夠學到東西哩!



星期日, 2月 24, 2008

Last Lecture of Flex Tutorial

Flex 程式設計最一堂課,跟大家分享,如何運用分散式運算的方法,處理龐大資料的健保資料庫。
並利用 Flex 設計 RIA 的前端分析介面,讓原本繁雜的 query 只要用滑鼠拉一拉、點一點;喝杯咖啡、吃塊辣妹巧克力,結果就跑完了 ^^

Download PDF slides

星期三, 2月 13, 2008

BlazeDS - the solution of Flash Remoting for Java

用過 Flash Remoting 後,大概再也不會回頭用 HTTP Serivce,畢竟手工打造 XML 是一件很累人的事情。PHP 有 amfphp 的 open source Flash remoting,Java 的話,古早前有 openamf,不過這玩意很久沒有更新,不知道還有沒有再維護?
想喝咖啡,沒有 Flash remoting,又不想寫 Webservice,怎麼辦呢?救星來了!Adobe 的 BlazeDS 可以解決大家的麻煩!BlazeDS 是 server-based Java remoting,骨子裡是 tomcat 加上 Adobe 的 library,熟悉 tomcat 的話,BlazeDS 應該不會難上手。
今天早上六點,十分努力地離開溫暖的被窩,總算能靜下來,好好看 Document,把昨天上課的程式,加上 Java Remoting 的範例:http://ir.tmu.edu.tw:8400/samples/FlexDataServiceTutorial/

建議先讀讀 30 Minute Test Drive,如果 Flex 夠熟,看完後應該就可以自己寫寫練習,感覺還不賴 ^^



星期二, 2月 12, 2008

Tutorial of Flex Data Service

Flex 程式設計課程第二彈,內容是如何用 HTTP Service 和 AMF 及 Flash Remoting 連結資料庫。
後端程式以 PHP 連接 MySQL,將同學的各科成績從資料庫讀取出來後,放到 DataGrid 中,並繪製 Line Chart。

範例程式以及全部的 Source Code:http://ir.tmu.edu.tw/FlexDataServiceExample/



星期日, 2月 03, 2008

Flex My Weekend

應學弟的邀請,幫忙上 Flex 的程式設計課程,記得古早前在 CBI 開過一次 Flex 的教學課程,「事隔多年」,想要好好把 Slide 整理整理,也許以後會常常用到吧?
雖然製作投影片,用 Keynote 的效果,比 Powerpoint 好上太多,不過套用現成的樣本,還是跳脫不出古板的窠臼,於是這週末,又當了兩天阿宅 @@
我花了很多功夫,先設計自己的樣板,然後組合圖片跟文字。製作的過程中,突然有一種衝動,好想去念藝術啊 XD
如何,有我的風格嗎 ^^

PDF 版本

星期一, 1月 28, 2008

除了星座,別忘了還有生肖

星座和疾病的關係(http://astro.ecozer.com),告一個段落後,別忘了還有 12 生肖可以玩,
於是我又弄了一個,介面差不多的 Flex App: http://zodiac.ecozer.com

與星座不一樣的地方,這次我多加了性別和年齡層兩個控制項,畢竟性別和年齡,本來就是一個重要的因素,應該要考慮進去的。

此外,還有一個「生肖比較」的按鈕,可以把同一個疾病,不同生肖的患病率,以 Bar Chart 呈現。

與星座相比,以生肖的觀點來看,差異似乎比星座來得明顯。在不做任何深入探討前,生肖本來就與年齡有關,也許是其中一個因素吧?

一般人不知道醫學專門的詞彙,使用上可能會有困難,這我也沒辦法,頂多就是找幾個常見疾病當範例,不過這可能要先做 ICD9 Grouping,因為常見的疾病俗稱可能包括了好幾個 ICD9,如:中風的 ICD9 code 前三碼為 430-438;心血管疾病 ICD9 code 前三碼為 401-444,這麼複雜,也只有專科醫生才比較熟練。

先挑個簡單的感冒吧,感冒看醫生,醫生大多會用 465.9 (急性上呼吸道感染),或 460 (急性鼻咽炎),至於用那個 code,看醫生心情吧,不過從資料庫的內容來看,465.9 比較多,就以這個當例子吧。

先跑個星座的,乍看之下,每個星座的患病率都差不多。


來看看生肖的,患病率的差異就比星座的明顯,不過這個沒有做統計檢定,參考看看就好。


屬牛的人,得感冒的機率為 18.75%,是所有生肖最高的,來看看卡方檢定的結果。不是屬牛的人,得感冒的機率是 16.65%,Chi-square 暴高,六萬多 XD,兩者差異有統計上得顯著意義,這應該是肥大的 Sample Size 造成的結果。相不相信看個人囉!


其他的,控制性別和年齡也可以玩看看,我覺得還蠻有趣的 ^^

生肖的判斷比星座來得複雜,且這次多加了性別和年齡兩個變數進去,資料還沒有完全跑完,我設定每一個小時,會自動更新一次資料庫,就讓它慢慢跑吧,機器們,辛苦啦!!

跑出來的結果,僅供參考喔!

星期四, 1月 24, 2008

星座與疾病,到底有沒有關係?

這個月初,健保局公佈了星座與死亡相關的分析,我看到的第一個反應是,堂堂一個健保局,擁有這麼多資源,竟然做這種小兒科的事情,新聞上,只告訴大眾什麼星座最長壽;什麼星座最短命,沒有統計數據,一點都不科學。
類似的題目,我給學生當作業,也比這些有學問多了。最近一次的題目,是分析星座和疾病的關係,自醫學占星術出發,從住院資料中,嘗試去分析出些有趣的結果,主要的目的,是讓學生練習資料處理、以及分析工具的使用,拿星座當題目,是為了提高做作業的興趣啦!
不過,看到健保局閒閒沒事炒新聞,我也按耐不住,趁著這兩天比較沒有很忙,拿 2002年健保資料庫的門診處方及治療明細檔,大約有 2.6 億門診人次,分析四千多個 ICD9 和 12 個星座的關係,然後用 Flex 寫了一個簡單查詢介面: http://astro.ecozer.com

挑一個有興趣的星座,點進去後(這個例子是選巨蟹座),中間的 DataGrid 依照患病人次,降冪排序。最多人次的,是急性上呼吸道感染(ICD9 465.9)。

點選這筆紀錄,會顯示巨蟹座和不是巨蟹座的人,得急性上呼吸道感染的機率。

只有這樣,當然不行,我做了最簡單卡方檢定,有傳統的統計假設,2X2 的列聯表,alpha、Chi Sqaure 還有 p-value。
如果想要用疾病查星座,可以按「疾病導向」的按鈕。

依照 Chi Square 的大小,降冪排序。

最後一樣可以點選其中的資料,顯示卡方檢定的結果。

搞了半天,星座和疾病,到底有沒有關係?
即使有統計上得顯著差異,也只能當作參考,且樣本數很大,只要有一點點差異,就很容易造成統計的顯著差異,況且,我的樣本就是母群體。以上面例子來說,巨蟹座的人得急性上呼吸道感染的機率是 16.3%;而不是巨蟹座的 15.87%,兩者只差 0.43%,可是 Chi Square 卻超大,有 2590.684,究竟要不要相信統計的結果?看個人囉!
廢話了這麼多,只是想要用數字來說話;現在的官員、記者等,肚子裡有料,有擔當的不多了,就連聯合國的總部,也可以搞錯!資訊爆炸的時代,不僅要努力吸收,還是要思考過濾,不要完全相信囉!

星期五, 12月 14, 2007

Solution: FileReference 的 complete 事件無法在 Mac 版本的 Flash Player 被觸發

Flex 裡用來處理檔案上下載的 FileReference,
在上傳檔案的狀況下,檔案上傳完畢後,Server 端會回傳 HTTP 220 的 code 給 Flash Player,
收到這個 code 才會觸發 complete 事件,表示檔案上傳這件事情已經完成。

不過事情似乎總是沒有辦法 100% 完美: Mac 版的 Flash Player 竟然對 HTTP 220 沒有什麼反應,因此即使檔案確實已經上傳完畢,卻沒有辦法觸發 complete 事件。

解決的辦法,其實很簡單,根據 Google 的小道消息,只要回傳一個空的 response 給 Flash Player 就可以了,在 PHP 裡面,就是用:

echo "";

有些人反應,這真是太神奇了,不過還是有部份的人搞不出來,我就是其中一個 @@

於是有人在裡面塞了些字串亂試,如:

echo "X";

這下子,原本悶爆的呆呆 Programmer,終於可以含笑而睡了 ^^

星期二, 12月 04, 2007

你會用 Excel 嗎?

雖然不是很喜歡用 Excel,不過那是一般人最容易接觸到,比小算盤更強一點的「大算盤」,為了準備教大學部的學生,一點點簡單的資料處理與敘述性統計,想想還是用 Excel 比較簡單一點(至少不用寫程式)。
大家都用 Excel 作些什麼事情?畫畫表格?資料排序、加減乘除、平均?這些應該是最常用的功能。不過為了能達到我上課的需求,一時之間我還真不知道該怎麼用 Excel 來處理 XD
我想要做的事情很簡單,計算某個星座的人,罹患某疾病的人次。
邏輯其實很簡單:
1. 用生日篩選出符合某星座的人。
2. 看看這些人的 ICD9 是不是某疾病?
3. 計算符合上述兩個條件的人次。

會寫程式的話,馬上就可以算完了吧?!但用 Excel 要怎麼作?

原本直覺地想到用 COUNTIF 這個 Function,不過它只能有一個 Criteria,不適用。
後來想到用 SUMPRODUCT,不過問題出在日期的判斷。Excel 很雞婆,即使我把生日用 MONTH 和 DAY 這兩個 Function 把月、日切出來再合併, Excel 會自動把目前的年份加上去 @@

最後我先把月、日分別放到兩個 Column,再用 AND 這個 Function,把星座和 ICD9 的判斷放進去,符合條件的會回傳 TRUE,最後再用 COUNTIF 計算 TRUE 的出現次數。

應該有更簡單的方法吧,不過 ...... 懶得想了,給學生當作業吧 @@

星期五, 11月 16, 2007

Dr. Bear is Ready for Evaluation

花了幾個小時的時間,完成了 Tutorial 和 Evaluation 的 Questionnaire Form,很久沒打 ABC,有點生疏了。完成 Evaluation 後,這才算是一個完整的研究,該好好寫 Paper 了。

這會是我的博士論文嗎?我想不是,頂多也只是一部份。

回想起這一年的學業,真是夠悶了,不僅產出不多,也沒有什麼目標,可是每天還是有很多事情要忙,且沒有人可以給我什麼有建設性的方向。

從小,我是屬於那種心中有主義、有目標、有思想,偶後才會發揮 100% 能量去實現夢想的人。即使需要燃燒生命,我也樂此不疲,如此才能深刻地感覺到,自己真實的存在。

然而,數了一萬多個饅頭後,才慢慢發現,明確的目標其實不一定都顯而易見,
處處充滿了變數,也處處充滿了抉擇。

很多事情,不一定可以用自己熟悉的方式去處理;也不一定都能符合自己的風格。
那麼,需要為此而改變嗎?我不知道?!

我只知道,現在做的每一件事情,都是在拼湊一塊塊拼圖的片段。
也許,以後可以完成一幅曠世巨作;
也許,它永遠只是個片段。
即使如此,我還是希望能夠認真地用這些片段,完成我心中的夢想!

星期六, 11月 03, 2007

超好用的 AdvancedDataGrid

自從 Flex 3 beta1 出來後,就注意到 AdvancedDataGrid,這個進階版的 DataGrid,當時只大略知道可以用多組 column 來排序,並沒有詳細地研究。
今天上午玩了一下,發現 AdvancedDataGrid 還真厲害,不僅可以表示階層性的資料,還可以應用在群組性的資料。這個對我來說就很好用了,我可以把同成份的藥物 group 起來,且不需要多寫什麼程式,只要套用 AdvancedDataGrid 的 GroupingField 就可以搞定!
另外,AdvancedDataGrid 還可以對裡面的資料做簡單加總、平均、計數、最大、最小值的運算,因此我可以統計每種成份的藥物,究竟包含多少種不同的商品名,以及總共被開立了多少次,完全不用自己寫,AdvancedDataGrid 都幫我做好了,真是方便極了 ^^
Drbear-Adg-Group


星期二, 10月 30, 2007

Dr. Bear Now is Ready for Beta Test

除了線上投稿審稿系統外,Dr. Bear (http://drbear.ecozer.com) 算是我花最多心力寫的一個程式。
不過閉門造車,總是不會進步的,為了能讓它變得更好,今天特地加了 Guest 模式。
為什麼要這麼麻煩?為何不乾脆全開放給每個人都可以使用呢?
原因是我後端的分散處理的排程還沒寫好,萬一人一多,馬上就操爆了!所以在 Guest 模式裡,僅能觀看資料分析的結果,而不能送出資料分析的需求。
Drbear2-1
我不能在公開場合,講我葫蘆裡到底賣什麼藥,如果有任何建議、批評、指教等等,請給我一個 Feedback 吧!
大家的建議是我進步的原動力囉 ^^
Drbear2-2


星期一, 10月 22, 2007

New Medication Ranking Function of Dr. Bear

清晨起來寫程式,果然效果非凡,花了三個清晨就完成了 Dr. Bear 的新功能:讓我們來排序吧!
Drbear.Ranking
簡單的說,我可以輸入病人的一些基本資料,如:生過什麼病?性別?年齡等等,根據這些資料找出符合這些條件的病人,醫生所開的處方簽,依照開立的次數將用藥排序,就可以很清楚地知道,這樣的病人,醫生多半都是開啥藥!
如果做到 CPOE 裡面,應該是個不錯的 Decision Support 吧 ^^


星期二, 9月 25, 2007

Dr. Bear 2.0

去年八月底 Dr. Bear 1.0 完成後,一直想要把後端的程式改寫成 Webservice,不過因為自己對 Webservice 不是很了解,且光是看到要編輯那些 WSDL 就頭昏 @@
自從 Java 6 簡化了 Webservice 的開發流程後,終於讓我的夢想實現了,加上應用了去年十月新學的 Flex,讓前端 UI 比 AJAX 更好用!
Drbear2-01
我習慣先做最簡單事情,當然就是算門診人次和人數囉!條件目前只放了三個:國際疾病分類代碼、性別和科別。
Drbear2-02
我在 DataGrid 裡面放了 ItemEditor,性別用 List 完成,而國際疾病分類代碼和科別我設計了兩個 VBox,在 TextInput 裡面輸入任何字元,帶出可能的選項,點選後再回傳到 DataGrid。
Drbear2-03
每按一次 Submit,就是一個 Task,可以看到先前自己已經完成的查詢有那些、正在進行的有那些,還可以看到別人的查詢。
Drbear2-04
點選完成的 Task 檢視結果,目前每一個 Task,我都自動做月份和年齡層的分類,且一次跑三年的資料。
Drbear2-05
用 Webservice 的好處,讓我可以把 Database 和程式的 loading 全部分散開來,目前我只開了五台機器做分散處理,速度還不錯,查個糖尿病的門診人次,不到 15 分鐘就跑完了。
剩下的除了開發其他的模組外,最難的、也是最頭痛的,還是 Queuing 和 Scheduling 的問題,在還沒有解決之前,只能先假設,每臺機器隨時都可以正常運作啦!


星期日, 9月 16, 2007

Timeout and Retry Problems of JAVA 6 Webservice

昨天寫 Webservice 遇到的問題 ......
由於我的 Webservice 程式需要花比較多的時間,才能跑完,這牽涉到了 Connection Timeout 的問題。
Timeout 也就算了,不過因為我的程式是去 Query Database,Timeout 之後,我發現那支程式又被執行了一次;應該這樣說,似乎每次 Timeout 後,Client 端的 Webservice 程式會再去 call Server 端的 Webservice 程式。
這樣造成我的 database loading 增加,且也浪費了不少資源。
怎麼辦呢? Java 應該有那種控制 Timeout 或 Retry 的 API 之類的東西吧?!不過我都沒有找到哩 @@

後來發現有一個 Annotation - @Oneway (javax.jws.Oneway):
Indicates that the given @WebMethod has only an input message and no output. Typically, a oneway method returns the thread of control to the calling application prior to executing the actual business method.

本來我的程式就沒有 return value,運算的結果都存到 Databse 裡面,在原本的 @WebMethod 後面再加上 @Oneway,就解決了我的問題,呵呵!

附帶一提,Flex 的 Webservice 有一個 logout() 的 Function,也可以應用在這裡 ^^

星期五, 6月 29, 2007

JAVA 6 讓 Webservice 變簡單

以前的經驗,開發 Webservice 的程式是一件相當麻煩的事情,環境設定、編輯 WSDL、程式佈署等等,即使用 IDE 的工具,都不是三言兩語就可以搞定。

JAVA 6 的出現,拯救了像我這種怕麻煩的人 ...

關鍵在於兩個 annotation: @WebService 和 @WebMethod

我參考了 Vivek Pandey's Blog学习Java6(一) WebServices(3)在tomcat中发布,簡單地整理開發 Webservice 的 Server 端和 Client 端程式的過程,以及如何部屬到 Tomcat:

參考 Vivek 的範例,寫一個加法的 Webservice
  • Server Side
WebServiceStarter.java

public class WebServiceStarter extends HttpServlet{

private static final long serialVersionUID = 5870534239093709659L;

public WebServiceStarter() {
super();
}

public void destroy() {
super.destroy();
}

public void init() throws ServletException{
System.out.println("\nStarting Calculator Service ......\n");
try{
Endpoint.publish("http://localhost:8088/calculator", new Calculator());
}catch (Exception e){
System.out.println("Caught Exception: " + e.toString());
}
System.out.println("\nCalculator Service is OK!\n");
}
}

在 Endpoint.publish 的部份,原本以為 Port 的設定應該與 Tomcat 的預設值 8080 一樣,但是在啟動 Tomcat 的時候發現會跟 Tomcat 搶 8080 Port,所以我改成 8088。

加法的 Service:Calculator.java

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(targetNamespace = "http://localhost/sample")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Calculator {

@WebMethod
public int add(int a, int b) {
return a+b;
}
}

  • Deploy
程式編譯好後,在 Tomcat 的 webapps 目錄下建立一個 Service 的目錄,如: sample,其內在建立 WEB-INF 目錄,在此目錄裡建立 web.xml:

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><servlet>
<servlet-name>WebServiceStarter</servlet-name>
<servlet-class>WebServiceStarter</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>


在 WEB-INF 裡面在建立 classes 的目錄,把編譯好的 Calculator.class 和 WebServiceStarter.class 複製到裡面,重新啟動 Tomcat。檢視 Tomcat 的 log :

catalina.out

Jun 29, 2007 5:16:16 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/i386/client:/usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.00/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
Jun 29, 2007 5:16:16 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Jun 29, 2007 5:16:16 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 875 ms
Jun 29, 2007 5:16:16 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Jun 29, 2007 5:16:16 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.13

Starting Calculator Service ......


Calculator Service is OK!

Jun 29, 2007 5:16:18 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Jun 29, 2007 5:16:18 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Jun 29, 2007 5:16:18 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/43 config=null
Jun 29, 2007 5:16:18 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2077 ms

這樣 Server 端就 OK 了!

  • Java Client
先產生需要的 class: wsimport -keep http://localhost:8088/calculator?wsdl

CalculatorApp.java

class CalculatorApp {
public static void main(String args[]){
/**
* Instantiate the generated Service
*/
CalculatorService service = new CalculatorService();

/**
* Get the port using port getter method generated in CaculatorService
*/
Calculator calculatorProxy = service.getCalculatorPort();

/**
* Invoke the remote method
*/
int result = calculatorProxy.add(10, 20);
System.out.println("Sum of 10+20 = "+result);
}
}

編譯,執行,結果應該是:Sum of 10+20 = 30

  • Flex Client
用 Flex 做一個比較好用的 GUI:

測試網址:http://ir.tmu.edu.tw/calc/

有沒有很簡單呢,呵呵!




星期二, 5月 22, 2007

Flex 教學影片

最近有學弟對 Flex 有興趣,剛好上學期在中心有開過一堂課 ......



那次恰巧有錄影,可以忍受聒噪熊的,點下面的連結觀賞吧!
PowerCam Video (IE Only)
投影片在此:Download file

兩個範例程式教大家 Flex 如何透過 PHP 存取資料庫:
(1) http://blog.tmu.edu.tw/tedyeng/Flex_PHP_Sample/
(2) http://blog.tmu.edu.tw/tedyeng/Flex_AMFPHP_Sample/

附件一:MySQL SQL Script
附件二:PHP Script