星期二, 8月 20, 2013

web service 壓縮回傳大量資料





1.流程
因為web service是以XML傳輸,要傳至client端的內容需先轉String後再傳,但大量資料往往傳沒幾筆就停了,解決方式除了限制傳輸筆數外,尚可在傳輸前將資料壓縮,但壓縮過的資料要能透過HTTP傳輸,就得先以base64編碼再傳。
client端收到之後反向處理,先解base64,解壓縮,再轉成物件。

2.Server端資料壓縮
直接看code吧

public String doZipQuery(String iStr) throws Exception {

//取得多筆的資料或物件
//物件轉XML
String strObj=objToStr(objs);
//壓縮
byte[] bCompress=compress(strObj);
//base64編碼
        String en64= new BASE64Encoder().encode(bCompress);        
        return en64;        
}

// 壓縮
public static byte[] compress(String str) throws IOException {
if (str == null || str.length() == 0) {
     return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
return out.toByteArray();
}


3.client端解壓縮

建立呼叫web service的Proxy

新增web service client

填入web service wsdl的路徑

記得勾選「Define custom mapping for namespace to package」


建立Proxy時class名稱的對照改一下,不然很長會有點困擾。
Proxy建好之後,就可以直接拿來呼叫,簡單吧!

        public static void main(String[] args) {
try{
WebService01Proxy proxy=new WebService01Proxy();
                        //取得server端資料
String en64=proxy.doZipQuery("select * from testTable ");

                        //解base64  
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(en64);

                        //解壓縮
String rtn=StringUtil.uncompress(b);
System.out.println(rtn);
}catch(Exception e){
e.printStackTrace();
}finally{
}
}

/**
* 解壓縮
* @param str
* @return
* @throws IOException
*/
public static String uncompress(byte[] str) throws IOException {
if (str == null || str.length == 0) {
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(str);
GZIPInputStream gunzip = new GZIPInputStream(in);
byte[] buffer = new byte[256];
int n;
while ((n = gunzip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
return out.toString();
}  

星期二, 7月 23, 2013

微軟iSCSI Initiator 指定存取路徑

攝影機該是屬於弱電,合理來講應是電控或是廠務的案子,但是這次因裝設的位置分佈太廣,在經費有限無法佈置專屬的攝影機網路的情況下,老闆把腦筋動到資訊網路上來,於是這個案子就到IT部門來了,而這個案子傳輸、儲存的量都對這個廠近20年的老網路架構帶來了極大的挑戰...




  • 多重路徑的困擾
在伺服器與iSCSI間並非只有對接的實體線路,而是透過共用Switch來存取時,封包的流向就比較難追蹤(尤其是在VM環境下)

iSCSI通常會有多個Ethernet埠,部份機型會把管理埠獨立出來,但這個管理埠往往也會支援LUN資料的傳輸,如上圖,原本期望的是用172.21.100.x的網段對存儲進行管理,而用192.168.1.x進行資料傳輸,但在iSCSI Initiator的預設中,會有1個0.0.0.0的默認來源入口,而這個入口的網段(卡)可能不是我們規劃的那個。

  • 設定方式
1.輸入目標IP
執行「快速連線」,就會把所有可用的路徑列出來,如下,選擇所要的目標,按「連線」即可。

2.刪除(中斷)預設識別元

如前所述,它會自動用默認的0,0,0,0去連目標,但這個默認的似乎無法被刪除,而我的作法是:把整個識別元刪掉,再建一個新的。


「中斷連線」即是刪除識別元

3.新增工作階段,指定想要的網卡

「新增工作階段」後「MCS(M)」設定多重連絡工作階段

預設是以Round Robin(循環配置資源)的方式來配置的,在這種模式運作下作用中的來源入口是無法更改的,將之切換至「僅限容錯移轉」,並編輯類型為「待命」,則可將不想要用的來源入口移除,替換為想要的來源入口。
經由上述設定步驟,即可直接從工作管理員中看到流量是否從你想要的網卡進行Storage存取。

  • Round Robin(循環配置資源)的方式不是可以更穩定、快速?
這個案子是網路攝影機,20支,每支都是以300萬像素HD的格式錄影,1天下來檔案的量約1T,在以Round Robin的方式進行錄影資料儲存時發現錄影紀錄會有漏秒的狀況,無從得知在以這樣multi path方式寫入iSCSI,因封包到達順序的差異會否是造成漏秒的主因,但在強制指定以對接的網卡進行傳輸後即無漏秒的狀況。

星期四, 7月 11, 2013

Firstrade VISA debit card 北海道提領實測


  • 持有這張卡的原由可追溯到好幾年前,在此就不多作說明,如果有興趣的,搜尋一下應是可以找的到資料,但是網路上對於它在國外提領的說法該是有些問題。

  • 那這張卡的作用是什麼?

簡單講,它跟信用卡差不多,但是必需在帳戶裏頭有對應的現金才可以消費,也可以提領現金,因為是直接從帳戶裏提領,所以,跟預借現金不同,匯率也是以VISA官網的匯率,這個匯率與現金匯率不同,它是即期匯率,比較下來跟在國內換現金具有匯率上的優勢。

綜合上述,它實在是出國旅行的必備良品啊!

  • 北海道提領的實際經驗如何? 
該說是慘痛的經驗吧! 在出發往北海道之前,查詢了7 Bank的網站,確定VISA卡可以在北海道提領無誤,網路上也說這張卡可以,在台灣也直接用Fistrade VISA debit card從台灣的ATM領過台幣,再加上去日本前,日幣對美金狂貶,於是就決定到北海道千歲機場再由7 Bank的提款機提領日幣現金。

但事與願違...
「Invalid card」,ATM已吐出十幾張交易表,日幣還是沒領出來,千歲機場的溫度控制得相當不錯,但額頭上的汗已滴下來,沒辦法,只好硬著頭皮,拿起ATM上電話跟那端英語聽起來也不大輪轉的客服展開交涉。

仍然是...Invalid card! 大概有30幾張交易表,連7 Bank的客服都放棄了,心想,完蛋了,一家四口規劃半年多,沒有現金整個假期泡湯,我想,現在只剩最後一條路了!

信用卡預借現金,打電話回台灣,中國信託、永豐及台灣銀行,最後,還好中國信託在兼顧交易安全的情況下,讓我開通了信用卡海外現金提領的功能。

ATM吐出現金的那一剎那,那大概是我這一輩子最感動的領錢了,連第一份工作所得領出來的現金都沒有如此的感動。


  • 與Firstrade VISA debit card發卡銀行的交涉
一開始是以為7 Bank沒有支援PNC Bank在北海道提領現金,因為同樣是VISA的卡有部份是無法在7 Bank提領,於是就去找了最近的一間Citi Bank試著提領,但仍然是Invalid card!

人在逆境中,總是會激發潛能,打電話給PNC Bank的客服吧! 雖說PNC Bank的客服只會講英語。

第一次,對方要我提供name, checking account no及broker no,回頭去找Firstrade的客服,要到一個4碼的broker no;第二次,與第一次不同,對方要我提供的是name, checking account no, account no(10 digitals);第三次,對方要我提供的是name, checking account no, address。
在第三次時PNC Bank客服確認我的身份後,終於這張卡的通海外提領功能開通,我另外向他確認以下兩件事:

1.何以用美國銀行發行的Firstrade VISA debit card可以在台灣ATM提領現金,但確無法在日本北海道提領?

因為當初申請帳號時的國別是台灣,所以,銀行方預設在台灣可以直接以帳戶中的美金提領台幣,台灣以外的地方,需另外通知PNC Bank進行設定可提領的地區及日期區間。

2.除了用電話設定海外提領外,有沒有其他方式可設定? 像是Email或線上客服之類的?

沒有,只能用電話,且每次要進行海外提領,都得再設定一次。


  • 同場加映,金融機構交涉過程
帶出去的幾張卡,台灣銀行金融卡、中國信託信用卡、永豐信用卡及Firstrade VISA debit card,交涉的狀況如下:

1.Firstrade VISA debit card, 服務不錯,得先準備好充足的資料,如Firstrade 10碼的帳號、支票帳號、地址…以進行security審查,國際電話很貴,如果飯店有WiFi,是可以先買Skype的點數打客服電話(卡片背面),電話費會省很多。

2.中國信託,服務不錯,客服人員還會主動幫忙尋求較便宜的解決方案,security上也有兼顧(用干擾音的方式),可在電話中直接開通及設定國外提領密碼,雖然被加了一堆額加的手續費(約是6~7%吧),但因是應急,也只能接受。

我在中信的刷卡額度不大,以前覺得中國信託不是很親民,但經過這次事件之後完全改觀,很想給它按個讚。

3.永豐信用卡,就普通,無法在海外緊急開啟提領現金服務。

4.台灣銀行,只能說它真的只能在台灣了,在北海道雖有提供ATM提領的服務但只能臨櫃,或透過網路刷卡申請(只能用特殊的讀卡機,在國外找到的機率幾乎是零)。

接洽的過程中,那位存款部的經理其實是認識我的,她說:「你是那位xx公司的xx課長...但是很抱歉,還是得書面申請,再加上三個工作天」,後來我從公司財務課人員口中得知,台灣銀行的人是有打電話到公司確認的,只是最後還是決定不幫我開通海外提領,我也認同Security很重要,但在確認是本人後,何以無法做出救急的動作? 那為何中國信託可以?


ja → zh
国际

星期六, 7月 06, 2013

這一生是無數的機緣

一個清潔工改變總裁的一生?
光看書名,直覺上以為又是一本制式的心靈書,就像那些教人理財的書一樣,講了一堆的理財方法,卻績效卻遠不如單純的ETF來的好,不過,這本書倒是令人意外,本來想說翻翻看就好,沒想到看了幾頁卻讓人有欲罷不能的感覺,以致於一口氣把它讀完。












  • 格言一,用充電取代耗電
一顆燃料用盡的頭腦是轉不動的。
如果你把車子的汽油用光了,你一定不認為車子還能跑。
那麼,為什麼你認為你的身體可以做得到呢?

  • 格言二,家人是禮物,不是責任
如果你能把家人看成是上帝的禮物而不是一種應盡的責任,
你就能和家人相處愉快,
同時也能以全新的眼光看待你的工作。

  • 格言三,用祈禱取代氣惱
當我們必須做出抉擇時,最棒的莫過於能將生命中真正重要的事,
與那些看起來很緊急,但其實沒有意義的事區隔開來。
這一切都從祈禱開始。

  • 格言四,與人分享
記住,還有許多人可以從我們的經驗中獲益。
時光飛逝,應該趕快與別人分享我們所學到的智慧。
當我們能暫時放下自己的煩惱,伸出手幫助別人,會發現自己的煩惱也將迎刃而解。

  • 格言五,用投資取代消耗
當我們投注心力在日常瑣事,就是在消耗。
當我們投注心力在人生的目標,就是在投資。
我們誰也不知道自己何時會離開這個世界,所以要盡可能將時間投資在有價值的事情上。

  • 格言六,留下建樹給後人
不要只享受前人努力的成果。
人活多久並不重要,重要的是,這段時間你做了什麼。
不管你是活了兩千年,還是二十年,
重要的是,你要填滿你出生和死亡之間的空白。