2013年8月31日 星期六

[筆記]用Canvas畫陽春版人口金字塔圖

若要用Canvas來畫出人口金字塔的圖,還滿簡單的,在<body></body>
之間插入以下的程式碼,,但只是個很陽春,沒動畫特效,若有其他需要,還需其他工夫,或使用相關的函式庫,如D3



你的瀏覽器不支援Canvas



請注意,要在支援HTML5的瀏覽器上跑,才看得到效果哦。

2013年8月28日 星期三

[筆記]Message Listenner Method Exception的處理

下圖說明Message Listener Methods如何處理exception,圖一敘述「Exception Type」為「System」的部份,圖二敘述「Exception Type」為「Application」的部份。
圖一


圖二

節錄自:http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes,p.150

[解決]Errors occurred during the build. Errors running builder 'JavaScript Validator' on project

有時在專案中放入一個javascript的JS檔案,這時Eclipse三不五時就跳出一個視窗,提醒「Errors occurred during the build.Errors running builder 'JavaScript Validator' on project」的錯誤:


這是Eclipse中「JavaScript Validation」功能偵測到JS檔錯誤提醒的,若JS檔內容又不需要更改,若不要再被提醒,可以手動把這個功能關閉,點按專案再點滑鼠右鍵選【Properties】出現對話窗後,再點選【Builder】,把【JavaScript Validator】的功能取消勾選,如下圖:

在取消時,會提醒取消勾選後會有些其他影響,若不影響到開發,就勇敢地點按「OK」吧!


2013年8月27日 星期二

【筆記】使用Canvas畫簡單圓形

HTML原始碼如下,最主要搭配Javascript來對Canvas做操作。
html>
<html>
<head>
<meta charset="utf-8">
<title>Canvas Circle</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #000;">
若你的瀏覽器不支援HTML5,就看到到這行字</canvas>

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();
/*
第一個參數是距畫布左邊界的距離
第二個參數是距畫布上邊界的距離
第三個參數圓的半徑
第四個參數是定義圓開始的起點,如全圓傳0、半圓就傳Math.PI
第四個參數是定義圓結束的終點
*/
ctx.arc(95, 50, 50, 0, 2*Math.PI);
ctx.stroke(); //畫出你定義的圖形,若忘了這行,圈圈就不會出現
</script>
</body>

</html>

執行結果如下:
參考文件:http://www.w3schools.com/html/html5_canvas.asp

2013年8月24日 星期六

[筆記]在GlassFish中建立JMS Physical Destination

為了可以讓一個在Glassfish伺服器上應用程式內執行的message-driven EJB接收訊息,必須對伺服器上的JMS設定做一些調整,第一步就是建立一個JMS Physical Destination。

打開【命令提示字元】切換到Glassfish安裝目錄下的「bin」目錄中,執行「create-jmsdest --desttype queue PSQueueDest」,其中,「--desttype queue」是指要建立的類型為「javax.jms.Queue」,若要建立類型為「javax.jms.Topic」,可以使用指令如:「create-jmsdest --desttype topic MyTopicPhysicalDestination

執行成功後,執行「list-jmsdest」,應可看到剛建立的Physical Destination,如下圖:

2013/08/27發現在GlassFish的Admin Console找到相關設定的地方,如下圖:

請注意版本差別,之前版本好像是在左側選單中【Configuration】下。

參考文件:http://docs.oracle.com/cd/E18930_01/html/821-2416/ablkj.html

2013年8月23日 星期五

[筆記]Business Method Interceptor的一些特性

下表列出Business Method Interceptor的一些特性:
QuestionAnswer
May be defined on which EJB type(s)Session bean and message driven beans.
Intercept which method types.Session bean business methods and message driven bean's message listener methods.
Location of interceptor methods.In special interceptor class, interceptor superclass, or in the target class.
Restrinctions on interceptor methods.At most one per class.
Annotation(s) use to define interceptor method(s)@AroundLinvoke

在「javax.interceptor」套件中
Interceptor method security context.Same security context as intercepted business method.
Interceptor method transaction context.Same transaction context as intercepted business method.
Exceptions interceptor methods may throw.Exceptions declared in the throws-clause of the intercepted business method and system exceptions.
Interceptor method signature.Object someMethodName(InvocationContext) throws Exception

其中,「someMethodName」為開發者自取的方法名稱;
「InvocationContext」類別在,「javax.interceptor」套件中。
Interceptor method visibilityPublic, protected, private or package visibility

節錄自:http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes,p.109

2013年8月22日 星期四

[分享]好用的小工具-TCPView--找出程式佔用的port

自從拜歐記下了[小技巧]找出那個程式執行時佔用的port後,朋友跟我講有一個更好用的工具:TCPView,可到這邊下載


下載後解壓縮,直接開啟資料夾中的「Tcpview.exe」,就會看到上列的畫面,列出的清單內容和在命令提示字元中使用netstat指令列出的內容看起來很相像,但他的UI提供一些方便的設定。

如他畫面更新的時間預設為一秒,若要更改,可以到【View】→【Update Speed】去更改,不過,它也只有預設的四種選項;如果你覺得某一個程序(Process)很可疑,想要把它停止掉,可以在清單中,直接選擇到要處理的那個程序後,點按滑鼠右鍵,選【Close Connection】或【End Process...】。

2013年8月21日 星期三

[小技巧]找出那個程式執行時佔用的port

有時在開發過程中,啟動了本機的Tomcat或Glassfish,會因為某些程式佔用的Port位和伺服器設定的Port衝到,造成啟動伺服器失敗,如何查詢哪個程式佔用了Port,這時可以開啟「命令提示字元」,打入:

> netstat -a -o -b

就可以看到那些程式使用的Port是多少,還有該程式的PID。

有個朋友告訴拜歐,有個好記的方式是:「netstat -nba」,請試看看。

其中在「netstat」後面的參數,可以在「命令提示字元視窗」中打「netstat -h」,就會列出下列說明:

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]

  -a            顯示所有連線和接聽連接埠。
  -b            顯示涉及建立每個連線或接聽連接埠的可執行檔。在某些情況下,
                已知可執行檔可主控多個獨立元件,在這些情況下,會顯示涉及
                建立連線或接聽連接埠的元件順序。在此案例中,可執行檔名稱
                位於底部的 [] 中,上方便是它呼叫的元件,直到已達 TCP/IP。
                請注意,此選項相當耗時,而且如果您沒有足夠的權限,便會失敗。
  -e            顯示乙太網路統計資料。此選項可搭配 -s 選項合併使用。
  -f            顯示外部地址的完整網域名稱 (FQDN)。
  -n            以數字格式顯示位址和連接埠號碼。
  -o            顯示與每個連線相關聯的擁有處理程序識別碼。
  -p proto      顯示由 proto 指定的通訊協定連線; proto 可以是下列任一個:
                TCP、UDP、TCPv6 或 UDPv6。如果與 -s 選項搭配使用來顯示每個
                通訊協定的統計資料,proto 可以是下列任一個:
                IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
  -r            顯示路由表。
  -s            顯示每個通訊協定的統計資料。依預設,將會顯示 IP、IPv6、
                ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的統計資料; 可以使用
                -p 選項來指定預設的子集。
  -t            顯示目前的連線卸載狀態。
  -x            顯示 NetworkDirect 連線、接聽程式與共用端點。
  -y            顯示所有連線的 TCP 連線範本。不能合併使用其他選項。
  interval      重新顯示選取的統計資料,每次顯示之間會暫停您在 interval 選項
                指定的秒數。按 CTRL+C 鍵可以停止重新顯示統計資料。如果省略,
                netstat 將會列印一次目前的設定資訊。

[筆記]EJB - Common system exception

ExceptionTransaction StatusNotes
The following exceptions are the basic exceptions
EJBExceptionMay or may not have been marked for rollback.Not possible to determine whether EJB method has executed or not.
Error may have occurred during communication with, or processing in, the EJB.
RemoteExceptionMay or may not have been marked for rollback.See EJBException.
The following exceptions indicate that the transaction has been marked for rollback and will never commit.
EJBTransactionRolledback-ExceptionRolled back or marked for rollbackSubclass of EJBException.
EJB invoked using EJB 3.1 view and EJB executing in client's transaction.
TransactionRolledbackLocal-ExceptionRolled back or marked for rollbackSubclass of EJBException.
EJB invoked using EJB 2.1 local client view.
TransactionRolledback-ExceptionRolled back or marked for rollbackSubclass of RemoteException. JTA standard exception. EJB invoked using EJB 2.1 remote view or web service view.
The following exceptions indicate that an attempt was made to invoke a method that require a client transaction without the client having a transaction context.
These exceptions usually indicate an error in method transaction requirement declaration(s).
EJBTransactionRequired-ExceptionNo transactionSubclass of EJBException.
EJB invoked using EJB 3.1 view.
TransactionRequiredLocal-ExceptionNo transactionSubclass of EJBException.
EJB invoked using EJB 2.1 local client view.
TransactionRequiredExceptionNo transactionSubclass of RemoteException. JTA standard exception.
EJB invoked using EJB 2.1 remote view or web service view.
The following exceptions indicate that an attempt was made to invoke a method on an EJB object that does not exist.
NoSuchEJBExceptionRolled back or marked for rollback.Subclass of EJBException.
EJB invoked using EJB 3.1 view.
NoSuchObjectLocal-ExceptionRolled back or marked for rollback.Subclass of EJBException.
EJB invoked using EJB 2.1 local client view.
NoSuchObjectExceptionRolled back or marked for rollback.Subclass of RemoteException.
EJB invoked using EJB 2.1 remote client view.


摘錄自:http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes,96頁。

2013年8月19日 星期一

【筆記】使用wsimport建立Java Web Service的用戶端程式

當你有一個WSDL的URL時,使用JAX-WS API來建立他的用戶端程式,是相對簡單的。如我們有一個WSDL如下:



它的URL如下:http://localhost:1234/cal?wsdl,若要撰寫一個用戶端程式去使用這個Web Service,我們要先產生它的代理程式(artifact),很方便地,在JDK 6中的「bin」目錄下,就有一個「wsimport」程式,可以讓我們用來產生用戶端程式所需的代理程式。

若在安裝Java時,有在「Path」中設定好Java的執行目錄(bin),則開啟「命令提示字元」,在「命令提示字元」輸入「wsimport」,應該會出現下列畫面中的結果,他會提示一些這個指令使時的說明。


接著把上列WSDL的URL代入到這個指令的參數中,為了方便,在「命令提示字元」先切換資料夾到事先建立好的Java專案目錄下的「src」中,然後輸入如下指令:「wsimport -keep -p idv.bio.ws.artifact http://localhost:1234/cal?wsdl」後按下「Enter」,執行結果如下:


其中,「-keep」是表示要產生原始碼,也就是Java檔,「-p」表示產生出來的Java檔中所屬套件設定。

在Eclipse中,重新整理之後,在「src」下,應該可以看到下列程式已經產生出來:



接著,先建立一個「idv.bio.ws.client」的套件,在之中新增一支「CalculatorClient.java」,其內容如下:

package idv.bio.ws.client;

import idv.bio.ws.artifact.Calculator;
import idv.bio.ws.artifact.CalculatorService;

public class CalculatorClient {

public static void main(String[] args) {
    CalculatorService service = new CalculatorService();
    Calculator port = service.getCalculatorPort();
    System.out.println("2 + 6 = " + port.add(2, 6));
  }
}

執行結果印出:2 + 6 = 8

說明:

  1. 程式的第一步,找出WSDL中, name="CalculatorService">對應的類別,它應該會繼承「javax.xml.ws.Service」這個類別,使用它產生一個物件。
  2. 然後使用上列物件,使用「getPort」的方法,得到一個對應到 name="Calculator">名字的介面的實作物件。
  3. 使用這個實作物件,就可以使用WSDL中,「portType」元素(element)內定義的「operation」了。

[分享]改變Eclipse中選取文字時的顏色設定

在換了Eclipse的主題之後,有時會遇到一個比較煩人的問題,那就是用滑鼠選了一段文字後,看起來像沒選一樣,就是不那麼明顯,如下面程式中,其實拜歐已用滑鼠選取了紅框中的「abc」,但畫面看起來就沒那麼明顯,常會造成一些小困擾:

要改變選取文字的顏色設定很簡單,請到「Window」、「Preferences」,找到紅框所示位置:
上列圖中,「Selection foreground color」是表示所選取文字的前景顏色,就是字的顏色,而「Selection background color」表示選取文字的背景顏色。

設定完成後,再選取「abc」,這時前、背景色就好認許多。



2013年8月16日 星期五

【筆記】超輕量的Web Service

記得拜歐還在Java的入門等級時,有嘗試過去用Java寫一個Web Service出來,那時在網路上找Sample Code照著作,有時還跑不出來,就深深地覺得Java Web Service是個怪獸級的東東,後來工作上沒碰到,也就沒在注意它了。

最近在工作上有使用到,加上要考證照,就每天都會碰到,就發現以為要寫一堆程式才能實現的,現在幾行程式就可以弄出一個可以跑的Web Service,這多虧了JAX-WS API,很多複雜的運作,都幫我們準備好了,底下使用一個範例,只要兩支程式,就可以執行為Web Service。

package idv.bio.ws;
import javax.jws.WebService;
@WebService
public class Calculator {
public int add(int a, int b){
return a + b;
}
}
上列中,值得一提的是「@WebService」這個annotation,只要加上這個,就表示這支Java就是一個Web Service的實作類別。

再來,使用「Endpoint」這個類別來發佈:

package idv.bio.ws;
import javax.xml.ws.Endpoint;
public class CalculatorPublisher {
public static void main(String[] args){
String url = "http://localhost:1234/cal";
Endpoint.publish(url, new Calculator());
System.out.println("Calculator Service published, url: " + url);
}
}
執行「CalculatorPublisher.class」之後,在Console應該可以看到下列訊息:

2013/8/16 下午 11:24:57 com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
資訊: Dynamically creating request wrapper Class idv.bio.ws.jaxws.Add
2013/8/16 下午 11:24:57 com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
資訊: Dynamically creating response wrapper bean Class idv.bio.ws.jaxws.AddResponse
Calculator Service published, url: http://localhost:1234/cal
把「http://localhost:1234/cal?wsdl」貼到你的瀏覽器上,可以看到WSDL,它是描述Web Service相關資訊的一個XML文件,如:


使用Soup UI去驗證,結果如下:

[筆記]EJB 3.1 Lite和Full EJB 3.1 API的比較

EJB Lite是Full EJB 3.1 API的一個子集,讓開發者可以去實現較小、較不複雜的EJB容器,並且能(部份)符合EJB 3.1的規範。
特徵
Full EJB 3.1 APIEJB 3.1 Lite API
Java Persistence 2.0可用可用
Session beans local/no interface client view可用可用
Session beans 3.0 remote client
view
可用不可用
Session beans 2.x remote client
view
可用不可用
Session beans exposed as JAXWS web service endpoints可用不可用
Session beans exposed as JAXRPC web service endpoints可用不可用
EJB timer service可用不可用
Asynchronous invocation of
session beans
可用不可用
Interceptors可用可用
RMI-IIOP interoperability可用不可用
Bean and container managed
transactions
可用可用
Declarative and programmatic
security
可用可用
Embeddable API可用,但embeddable
container只需支援EJB 3.1 Lite
可用
Message driven beans可用不可用

節錄自:http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes

2013年8月14日 星期三

[筆記]EJB程式設計的限制

為了遵守EJB3.1的標準,確認在不同的容器(container)的可攜性(portability),有些程式設計原則是開發者需要遵守的:

  1. 為了確保在分散式環境中的一致性,EJB不會使用可寫的靜態變數(writable static fields)。
  2. 在一個應用程式中,Server通常不允許去使用鍵盤或螢幕,所以EJB不可使用AWT相關功能去產生「輸出(output)」,或從鍵盤去取得「輸入(input)」。
  3. 為了確保安全性,EJB不可嘗試直接去讀、寫一個file description。
  4. 為了確保安全性,EJB不可嘗試去載入一個native library。
  5. 為了確保安全性,EJB不可去定義套件中的類別。
參考來源:

2013年8月13日 星期二

[筆記]JAXP API的比較

JAXP API的比較
StAXSAXDOM
API類型Pull, streamingPush, streamingIn memory, tree
易用性中等
XPath Capable
CPU與記憶體效率視使用方式而定
只能往前(Forward Only)
讀取XML
寫入XML
Create, Read, Update, Delete
參考來源:http://www.slideshare.net/krizsan/scdjws-5-study-notes-3085287

2013年8月10日 星期六

[小技巧]改變Eclipse行數的顏色

日前拜歐下載一個喜歡的Eclipse主題回來,卻發現他「行數」的顯示的地方太淺,看得有點吃力。


這時可以到「Preference」中自己去修改,可以直接在行數的地方按「右鍵」,再點按「Preference...」,如下:


會開啟如下的對話窗,再點按「Text Editor」:

這時會開啟「Text Editors」的對話窗。

在上列的對話窗中的下方區塊中,選到「Line number foreground」,再點按「Color」旁的顏色按鈕,就會出現下面的「色彩」對話窗給你自己定義,很方便吧!

在Eclipse中其實有很多地方的顯示,你可以調整成你喜歡的「Style」,換個自己喜歡的顏色,就像人換穿自己喜歡的方服一樣,寫程式的時候,心情也許會好一點,哈!

註:拜歐的版本為:

依Eclipse的版本不同,設定方式可能有稍微不同。

2013年8月8日 星期四

[分享] Oracle Certified Expert, Java Platform, Enterprise Edition 6 Enterprise JavaBeans Developer (OCEEJBD6,1Z0-895)的EJB認證準備

拜歐實在不知道這個認證的縮寫,應該是OCEEJBD吧!它的考試代號為:1Z0-895,要考這項的話,考試券其實就跟考之前SCJP、SCWCD的一樣。

在Oracle的官網,有相關的說明

一樣在Coderanch的認證討論區中,有介紹的專區

另外就是有賣相關教材(模擬考題)的EPractize Labs,還有,國外論壇考過的人都比較建議這一套Enthuware

考試準備參考資料:

  1. EJB 3.1 Specification document,可以從這裡下載。(天啊!六百多頁)
  2. OReilly出版的Enterprise JavaBeans 3.1
  3. Frits WalravenIvan Krizsan提供的筆記(這兩位真是佛心來的) 
  4. Coding練習
以下是一些考過的人經驗分享:


參考來源:
http://www.coderanch.com/t/614320/sr/certification/Passed-OCE-EJBD

2013年8月1日 星期四

[分享]Java包Exception

假設:
package idv.jk.exception;

public class ExceptionWrapper {
    public static void main(String[] args){
        try {
            new ExceptionWrapper().div(1, 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    public int div(int a, int b) throws Exception{
        return a/b;
    }
}
當這段程式執行後,因為1/0的關係,一定會造成Exception
java.lang.ArithmeticException: / by zero
     at idv.jk.exception.ExceptionWrapper.div(ExceptionWrapper.java:14)
     at idv.jk.exception.ExceptionWrapper.main(ExceptionWrapper.java:6)

若循著error stack去找,通常可以很快找到是那行程式出錯。

但這時你又會想,靠!使用者是傳了那個白癡參數進來!
一定會想在第一時間拿起電話,打給使用你API的人說,你不可以這樣用(一邊心裡os:傻蛋),但這年代是講證據的,你總要有一份證據,才能說一段話。但通常你的語氣是:「不好意思,造成了你的困擾,可以請問一下你傳的參數是?」

所以在這樣的需求下,你應該介入去控制你的Exception若被丟出來時,你要讓你的Exception盡量去提供你要知道的事,讓他可以幫助你在第一時間去解決你的問題。

上面的除法method我就會改成:

    public int div(int a, int b) throws Exception{
        try {
            return a/b;
        } catch (Exception e) {
            throw new Exception("a: " + a + ", b:" + b, e);
        }
    }

加入一些客製化的內容在Exception中,再次執行程式後,
java.lang.Exception: a: 1, b:0
     at idv.jk.exception.ExceptionWrapper.div(ExceptionWrapper.java:16)
     at idv.jk.exception.ExceptionWrapper.main(ExceptionWrapper.java:6)
Caused by: java.lang.ArithmeticException: / by zero
     at idv.jk.exception.ExceptionWrapper.div(ExceptionWrapper.java:14)
     ... 1 more

那個e的參數,就還是一個會顯示在Cause這一段訊息裡,但最上面那一行可以看到使用者傳入的參數。

所以你可以第一時間拿起電話,打給那個使用的豬頭,說:「那個參數不能傳0啦!(傻呆)」,不過若對方資歷比你老,應該會回你一句:「你不會做防呆啊!」

咦!若在new Exception中沒有傳入e這個參數會變成如何呢?程式都貼在上面了,自己試試吧!

所以,如何丟出一個Exception,也是一種藝術地!