小心勿觸 BEA WLS 8.1 sp3 OOM 地雷

經過一段時間的壓力測試以及實驗證明,前端 AP 透過 Bea WebLogic 8.1 sp3 的 Connection Pool 取得 JDBC Connection,這種方式來存取 DB 時,會有 Memory Leak 的現象。這種情形發生在 javax.sql.DataSource.getConnection 之後,取得之 Connection 結束連線後,卻無法將佔用之記憶體全部釋放,於是時間一久,JVM Heap Memory 被吃光,便產生了 java.lang.OutOfMemoryError。

為了證明是 Bea 的問題,我特地改寫程式,透過 Jakarta Commons DBCP 元件來取得 JDBC Connection,以便與原先程式透過 Bea ConnPool 取得連線的方式作為對照組。

下面是使用 Quest JProbe Memory Debugger 分別取得的 DBCP 與 WLS ConnPool 的 Heap Memory 曲線圖:

測試個案為持續發送 Online 簡訊,經過一個小時後觀察 Heap Memory 曲線。
OnlineService 使用 WLS Connection Pool
OnlineService with WLS Connection Pool

可以看得出來 Heap memory 耗用量逐漸的上升

再來看看 OnlineService 使用 Jakarta DBCP 的情形
OnlineService with Jakarta DBCP

看得出來 Heap Memory 經過 JVM GC 皆可以正確的釋放出來

再來看看 BatchService 的情形,測試個案是兩個批次 Job 各同時處理 10 萬筆簡訊
BatchService 使用 WLS Connection Pool
BatchService with WLS Connection Pool

Heap 耗用量一下子就飆到 80MB,之後持續上升,直到 12x MB 後,JVM 做了一次 Full GC,耗用量下降至 50MB,但馬上又飆到 12x MB 後,OOM 就發生了,兩個 Job 都無法完成。

BatchService 換成使用 Jakarta DBCP 的情形又如何呢?
BatchService with Jakarta DBCP

跟 OnlineService 一樣平穩,至此我就確定 WLS 8.1 sp3 內部應該有 Memory Leak 的問題存在,於是求助 BEA。BEA Consultant 才給了一帖大補丸,要求上 Patch 後再觀察看看。

上了 Patch 之後,果然曲線就變得大不相同
OnlineService 使用 WLS Connection Pool + WLS8.1 sp3 patch
OnlineService with WLS Connection Pool + WLS 8.1 sp3 patch

BatchService 使用 WLS Connection Pool + WLS8.1 sp3 patch
BatchService with WLS Connection Pool + WLS 8.1 sp3 patch

BatchService 換上 Patch 後,兩個批次 Job 各同時處理 10 萬筆簡訊已可正確處理完畢沒問題。

所以如果使用 WLS 8.1 sp3 的人,請小心勿觸 OOM 的地雷

Memory allocation and garbage collection in JVM

前陣子工作上我所負責的系統一直出現 OOM Error (java.lang.OutOfMemoryError),經過一陣子的壓力測試及 JVM 參數調整才漸趨穩定。於是最近針對 JVM 的記憶體管理稍微搜尋了一下,下面這兩篇文章對 JVM 如何配置 heap memory 以及如何對已經不再使用的記憶體進行 Garbage Collection 有非常詳盡的說明。

Tuning Garbage Collection with the 1.3.1 Java Virtual Machine

Tuning Java Virtual Machines (JVMs)

Wine – Windows executable running on Linux box.

從以前就想在 Linux 上來執行 Windows 的應用程式,那時候想到的辦法是利用 Linux + VMWare,透過 VMWare 在 Linux 上再啟動一個 Windows based OS,於是就可以在這個 windows OS 來執行 Windows AP。但這種方法的缺點是資源耗用的比較多,PC 等級不強大概跑起來效率很差,像現在 Broso Linux 只是一台 Pentium 3 650 等級的 PC,如果想在上面多跑一個 VMWare 就很吃力了。

最近找到了另一個解決的辦法。Wine 是一個利用 Linux 各式 libraries 來實做 Windows API 的一個套件。Wine 就有點類似一個轉譯器,將 Windows API 轉為 Linux API,使其可以在 Linux 上來執行。聽起來很神奇,但我實際安裝後,
還真的可以執行 Windows AP,效能也還不差。

下圖是利用 Wine 在 Linux 上執行 NeatImage Pro 處理照片的畫面。
NeatImage Pro

有些人還利用 Wine 在 Linux 上來玩 魔獸世界 這套遊戲,看起來 Wine Windows API 轉譯的相當的好,才會連 Game 都可以執行。
原文刊載於此

魔獸世界

想在 Linux 執行 Windows AP 的話,VMWare 是要付費的軟體,但 Wine 卻完全是 Open Source,無須付費,支援程度也夠,有興趣的人真的可以試試!!

台鐵自動訂票程式

一個將程式應用在生活上的好例子,利用標準 HTTP 協定來達成台鐵自動訂票的需求!!
記得以前也寫過類似的程式,去 CNN 網站狂投公投綁大選的反對票,呵呵!!
已經很久沒坐火車了,這個程式雖然沒有 GUI 介面,不過應該不難使用,推薦給大家使用!!

原文刊載處

—————————————————————-

研究了一下台鐵訂票的html, 裡面用到一個JavaScript檔

不過是用*.js的方式與html分開, 有興趣的人可以另存網頁

再打開來研究裡面的語法…

不過就我個人使用而言, 直接指定車次去訂票比較符合我的需求

所以我修改了Yoshi兄的code,並且做了一些精簡,

另外,把訂票需要的資訊(身分證字號,起站代碼,到站代碼…)與程式分開

寫在文字檔中, 當需要訂不同的票時只要修改此文字檔, 不需重新compile

第一次post程式 請指教

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.net.*;
import java.io.*;
 
public class OrderTicket {
  private static String url="http://railway.hinet.net/trw/ctno11.jsp?";
  public static void add(String attribute, String value) {
    if(url.endsWith("&") || url.endsWith("?")) {
      url+= attribute + "=" + value;
    }
    else {
      url+= "&" + attribute + "=" + value;
    }
  }
  public static void order() throws IOException {
    URL website = new URL(url);
    int count=1;
    while(true) {
      System.out.println("開始第" + count + "次嚐試訂票...");
      count++;
      URLConnection connection = website.openConnection();
      BufferedReader in = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));
       String line=null;
       String content="";
       
       
       while( (line=in.readLine())!=null) {
         content+=line;
         System.out.print(".");
       }
       in.close();
       if(content.indexOf("您的車票已訂到")!=-1) {
         BufferedWriter bw = new BufferedWriter(new FileWriter("result.html"));
         bw.write(content);
         bw.close();
         System.out.println("票己成功訂到,請讀取result.html檔。");
         System.exit(0);
       }
 
       else {
         System.out.println("票尚未訂到,一分鐘之後將會再次嚐試...");
         try {
           Thread.sleep(6000); //sleep 1 minute, and try it again later.
           }catch(InterruptedException e) {
             e.printStackTrace();
           }
         }
 
      }//end while
    }
    public static void main(String[] args)  throws Exception{
 
            if (args.length != 1)
            {
                 // Print message, pause, then exit
                 System.err.println ("Invalid command parameters");
                 System.in.read();
                 System.exit(0);
            }
      BufferedReader filein = new BufferedReader(new FileReader(args[0] ));
      //BufferedReader filein = new BufferedReader(new FileReader("data.txt"));
      int i=0;
      String[] value = new String[10];
      String[] attribute = {"personId",//身分證字號
                  "fromStation",//_站代碼
                  "toStation",//到站代碼
                  "getinDate",//乘車日期
                  "orderQty",//訂票張數
                  "trainNo",//車次代碼
                  "returnTicket"//是否訂來回票
                  };
      while ((value[i] = filein.readLine()) != null) {
        add(attribute[i],value[i] );
        i++;
      }
      
      System.out.println(url);
      /*
      try {
        order();
      }
      catch(IOException e) {
        System.out.println("連線失敗,請檢查你的網路連線。");
      }
      */
      
    }
}
 

編譯完 需要另外新增一個文字檔案儲存訂票資訊

執行時的第一個參數為此文字檔案檔名

巴里島之行!! 倒數 3 天!!

只剩三天就要出國了。不過還沒刷團費,機票護照還沒拿到,SPA 還沒訂到,行程都還不確定,唯一確定的就是星期四是出發日,期待了很久的旅行,該不會突然被旅行社告知無法成行吧@@

今天把 Reyna 的 iRiver H300 拿來練習了一下,準備帶去巴里島當成儲存照片的隨身硬碟。這個 MP3 隨身聽好用歸好用,有 Copy/Paste 的功能,不過美中不足的發現沒辦法手動建立目錄。不過也別太奢求了!!哈..根本沒有鍵盤,即使能手動建立目錄,又如何給定目錄名稱呢?最後只好預先用電腦在 H300 裡面預先將每天的日期都建好目錄,以便每天拍完後相機照片可以直接摳進去。至少有大 LCD 可以直接瀏覽照片..呵 :D。

今天在 OA 系統請假以後,突然開始有點期待旅遊的心情了,也許是手邊的工作暫時告一段落,有些更大的東西如果現在開始做,恐怕事情做到一半就又得放下休假去,想想還是把一些更瑣碎的東西趁這出國前的空檔全部搞定,度假回來要加班再說吧。

倒數三天!! 時間快點過去吧!!

水中數位攝影

上次去帛琉玩的時候,看著其他的團員人手一台防水相機,浮潛的時候盡情的將帛琉美麗的海底拍回來留念,心裡真是嘔啊! 雖然我也帶了我的 Minolta DiMAGE7 去帛琉,無奈那時候的數位相機可脆弱得很,別說下水拍攝了,恐怕雨下大一點就得趕快把相機收進包包了,所以帶去也只能在陸地上拍拍照,而帛琉五日遊五天都在水裡玩(好像應該改為 “帛琉五日游” 才對哦),所以帛琉的海底美景就只能靜靜的留在我的回憶中而已 >_<

這次要去巴里島玩,雖然沒跟團,但我們自己也安排了一趟泛舟,所以這次我就早早就想到得帶個防水相機同行,才能將泛舟時的歡樂情景也留影下來。研究了一會兒,當然最簡單就是買個 KODAK 水精靈立可拍防水相機

Kodak 水精靈

這種立可拍防水相機大約兩百元左右,不過這個可是傳統底片相機,拍回來沖洗後還需拿底掃再掃一次,才能得到數位影像,而且這種相機大概也別想要求影像品質了,主要訴求就是能夠讓你在水裡拍攝而已。

不過科技日新月異,漸漸的數位相機也被設計成可以在水裡攝影。方式分成兩種:

1.潛水盒,顧名思義就是類似一個盒子套在數位相機外面,而潛水深度可達 30 米 ~ 40 米。由於潛水深度夠深,所以潛水盒的防水性絕佳,操作得宜的話,幾乎不可能進水。但是缺點就是,必須針對所使用的數位相機型號來購買,而且價位很貴,大約八九千元,幾乎都可以再買一台 DC 了。

Nicon CoolPix 7900 Canon 300D

不過由於 DSLR 可替換鏡頭的特性,DSLR 的潛水盒設計困難,所以相對的單價也貴的嚇人,像這個 300D 的潛水盒竟然要價台幣 58K,竟然比 300D 機身還貴了@@

2.防水數位相機,又分為生活防水與水中防水。生活防水以 Olympus μ 系列為代表,生活防水以符合日本 JIS4 防水標準(或稱為 IEC standard publication 529 IPX4),這種防水規格僅能防止從各角度濺來的水花,並不足以達到在水中攝影的要求。
而 Pentax 先前設計了 Optio 33WR/43WR 系列,符合 JIS7 的防水標準,可在水深一公尺處浸泡達 30 分鐘而不會進水。最近更新發表 Optio WP 系列數位相機,符合 JIS8 防水標準,不但可在水深一公尺處浸泡達 30 分鐘,更可同時在水中操作數位相機而不會進水。Pextax 原廠還為了 WP 系列相機設計了一個 H2OCamera 專屬網站,可以看得出 Pentax 在這個領域的企圖心。
在 Mobile01 有篇 Optio 43WR 的測試報告,看起來 43WR 不但水中浸泡不會進水,似乎在水中操作相機也不是問題。
對岸也有一篇 Optio 33WR 的測試報告,介紹也頗為詳盡,非常值得參考。

而日本人也很有趣,為了怕在浮潛或是泛舟時,Optio WP 不慎掉到深水處而損壞相機,還特別設計了浮球綁在相機本體上,如此一來即使不慎相機脫手而落,浮球也會自動浮起相機,真是個體貼的設計。原文刊載處

Optio WP 浮球

防 水 等 級 一 覽 表
0級
無防水功能
1級
能防垂直落下的水滴
2級
能防從15度角落下的水滴
3級
能防從60度角內濺來的水花
4級
能防各角度濺來的水花
5級
能防噴來的水柱
6級
能防強力水柱
7級
能短暫浸泡在水中
8級
能持續浸泡在水中
資料來源/IS國際標準

邪惡度測試!!

今天在網路上閒晃時逛來逛去又不小心看到這個 測試邪惡度 的網站,可以輸入任何一個網址或是一段文字來測試邪惡的程度,測試的演算法乃依據 Mr. Ivan Panin 演繹出來的 Gematria 演算法,宣稱絕對正確。不過我也沒仔細去研究,好玩比較重要,所以小的我馬上就大義滅親地馬上將小弟的 Broso 個人網站拿去測試啦。測試結果如下

This site is certified 50% EVIL by the GematriculatorThis site is certified 50% GOOD by the Gematriculator

呼..真是好險,還好測試結果不是 100% EVIL,不然可真是令人監介啊。
小的順便拿了其他人的部落格來測試,結果大同小異,粒粒的邪惡度為51%,愛德華的竟然只有34%,小黑的部落格最無趣,邪惡度最低只有28%。

最後我又很無聊的拿了國內各大政黨的首頁來做測試,邪惡程度差異挺大的。測試結果如下(政黨順序依亂數排列
):
(各政黨的捍衛者對測試結果不爽的請勿來找我,請直接洽詢原網站)

政黨 測試網址 邪惡度  
民主進步黨 http://www.dpp.org.tw/index2.asp This site is certified 44% EVIL by the GematriculatorThis site is certified 56% GOOD by the Gematriculator 看測試結果
中國國民黨 http://www.kmt.org.tw/ This site is certified 1% EVIL by the GematriculatorThis site is certified 99% GOOD by the Gematriculator 看測試結果
親民黨 http://www.pfp.org.tw/ This site is certified 56% EVIL by the GematriculatorThis site is certified 44% GOOD by the Gematriculator 看測試結果
新黨 http://www.np.org.tw/ This site is certified 35% EVIL by the GematriculatorThis site is certified 65% GOOD by the Gematriculator 看測試結果
台灣團結聯盟 http://www.tsu.org.tw/ This site is certified 44% EVIL by the GematriculatorThis site is certified 56% GOOD by the Gematriculator 看測試結果
無黨團結聯盟 http://www.npsu.org.tw/ This site is certified 16% EVIL by the GematriculatorThis site is certified 84% GOOD by the Gematriculator 看測試結果
建國黨 http://www.taip.org/index.htm This site is certified 23% EVIL by the GematriculatorThis site is certified 77% GOOD by the Gematriculator 看測試結果
泛紫聯盟 http://www.justice.org.tw/index.htm This site is certified 16% EVIL by the GematriculatorThis site is certified 84% GOOD by the Gematriculator 看測試結果

測試結果大家笑笑就好, 不代表任何意義!!

Orz = 失意體前屈

上禮拜金鼎錢櫃 KTV 大會師時,小呆點到 五月天 – 戀愛ing 這條歌,裡面的歌詞有句提到說

“超感謝你讓我重生整個Orz”

那時不懂這個 Orz 是啥意思?於是就問了粒粒,沒想到竟然被粒粒這個山頂洞人恥笑,連 Orz 也不知道是什麼?? 後來粒粒解釋說這個 Orz 從三個字母的外觀看起來很像一個人跪著趴在地上失意的樣子,用聽的很難意會,於是回家後又用了孤狗大神找了一下,沒想到 Orz 還真是滿地都是@@。

有一篇介紹的還蠻仔細的
何謂失意體前屈?

Orz 還有一些變形,例如:
OTL
Or2 (表示屁股特別翹)
Orv (後腳翹起來)

Orz 來到台灣後,也加入了一些中文字的象形,例如:
囧rz (加上了眉毛和嘴巴)

還有人為此特別做了首 Orz 之歌(原文刊載於 Orz)
歌詞如下

小姐啊小姐,妳真是美麗。
烏溜溜的秀髮,水汪汪的眼睛。
只要一想到妳,我滿心都XD。
今天啊今天,我鼓起勇氣。
到底心歸何處,我想要問問妳。
但妳的答案,真讓我 >_< 。
(好人∼)說我是好人,妳說真是對不起。
(好人∼)說我是好人,就宣判我的命運。
(好人∼)說我是好人,我挫折俯跪不起。
(好人∼)說我是好人,我只能Orz…。

點此可以下載試聽,尤其是那個 >_< 的念法真是太經典啦,強烈建議試聽一下。
這兒也有 MP3 的版本,有興趣的可以下載回去聽看看。