關於 Excel DDE Tick 資料變更事件的處理

透過看盤軟體來接收即時性的報價資料,最便利的工具莫過於 Excel 了。 諸多交易人幾乎是利用 Excel 透過 DDE 連結方式來取得報價資料並自行撰寫程式 (如 VBA) 來分析處理。而事實上, DDE 是一種老舊的傳輸規格 (Microsoft 已制定了 RTD 規格, Real Time Data, 用來取代並不穩定的 DDE 傳輸,但國內看盤軟體似乎並未支援),不僅 .NET Framework 沒有直接支援,要處理即時性的 DDE 接收,有些實做的地方還挺麻煩的。

舉個例,在 Excel 的工作表內,設定某一個 CELL 的公式 (formula)欄為:

CATDDE|'STOCK2330  '!CurPrice

代表的就是會接受來自看盤軟體 (本身即為 DDE Server)所傳送過來的資料,並且每次會即時更新跳動 (Tick)的資料。

稍微懂一些程式撰寫的交易人都知道,當某個 CELL 的資料發生變動時,只要寫好所對應的事件處理 (Event Handle)方法,就可以處理變動欄位的資料了。 Excel 預設所提供關於 CELL 資料變動處理的事件程序為 "WorkSheet_Change()",如下:

Private Sub Worksheet_Change(ByVal Target As  Range)
         'do something
End Sub

理想上很簡單,不是嗎? 問題是,如果 CELL 的欄位是屬於公式 (formula)型態的 (DDE 連結即為其中之一),那麼就無法利用上述的事件程序來處理。 因公式計算後所變動的資料,並不算在資料變動的事件內;屬於公式計算後所變動的資料,是需要利用 "Work_Calculate()" 程序,如下:

Private Sub Worksheet_Calculate()
         'do something
End Sub

老實說,我搞不懂 MS 幹嘛這樣分,我也不想搞懂,只要能達成我所想要的功能即可。 但真正的問題來了… 比較上述的程序,哪裡不一樣? _Change Event 有參數,反之 _Calculate Event 則沒有!

這可是相當相當的麻煩了! 因為透過第一個程序內的參數 (Range Object),可以很方便地得知是哪一個 CELL 的資料變動,但第二個程式則否。 所以若要知道在某一個工作表是哪一個 CELL 的資料變動,就必須寫 FOR LOOP 迴圈,一個一個來判斷是哪一個 CELL 欄位的資料變動。 我幾乎看到許多寫判斷 Tick 資料變動的程式,都是以該事件程序 (Worksheet_Calculate) 來處理。 當然,欄位不多還 OK,但是若是像我這樣,一個工作表是撈約 100 檔的權值成份股、約有 500 ~ 800 個 DDE 欄位的話,那肯定效能會大出問題,連動當然會影響到 Tick 資料的正確性了。 整整爬文了一整個早上,總算才找到真正正確處理 DDE CELL 型態的事件程序了。 不應該使用 "WorkSheet_Calculate()"、而是採用 "SetLinkOnData()" 程序才是。

參考 MSDN 對該程序 (SetLinkOnData Method) 的說明:
"Sets the name of a procedure that runs whenever a DDE link is updated."

繼續閱讀 »

Java SOA 基本觀、架構與實做 <4>

設定 SCA 以及 SDO 的開發環境

安裝步驟 Overview

    o 安裝 STP/SCA Tools
    ※ Prerequisition – 請確定已安裝 Eclipse Modeling Tool。
    安裝步驟:

  1. 打開 Eclipse Software Update,並選擇「Available Software」。
  2. 選擇 Ganymede Update Site > SOA Development > SCA Composite Tools Feature 1.0.0
  3. 鍵入 Install 按鍵
  4. 安裝 SCA 執行環境(使用Apache Tuscany):請至 http://tuscany.apache.org/sca-java-releases.html 下載最新版本的 Tuscany 以及其Source。
  5. 將Apache Tuscany解壓縮至適當路徑。
    o 安裝 SDO Runtime 以及 Eclipse Link
    安裝步驟:

  1. 設定 JAVA_HOME 環境變數以及 PATH。
  2. 下載 EclipseLink,並解壓縮。
  3. 設定 ECLIPSELINK_HOME 環境變數:
    ECLIPSELINK_HOME = <INSTALL_DIR>/eclipselink。
  4. 下載 EclipseLink for OSGi,並解壓縮至 ECLIPSELINK_HOME 目錄下。

繼續閱讀 »

笨賊掉落在我家大廈旁的防火巷內

今天一大早還沒起床時,被我老婆給叫起來,說我們家旁邊比較舊的民宅闖入了小偷,而且竟然掉落在我們家大廈後面的防火巷內出不去,現在警察已經過來在抓這個笨小偷。

我趕緊起床,拿著相機到我們頂樓 (7F)拍照。 沒看到小偷本尊,只有看到三個警察爬到屋頂上察看,旁邊還圍觀著好多民眾。 其中有個警察走上屋頂另一邊,好像是要去救這個笨賊,但是又下不去,所以只好又下樓,然後到隔壁棟的大樓,再打開通到防火巷的門。

那個笨賊好像是從底下這個民宅的鐵窗爬出來,然後應該是蹬著這些鐵皮屋頂想要逃跑時,掉落到這個巷子裡面。
笨賊跳到旁邊的防火巷

繼續閱讀 »

98年度「育才國小」的校慶

上上個星期六、母親節的前一天,固定都是「育才國小」每年度的校慶。 今年也是第一次我們家蓁妮不用參加 (她說她也不想參加)的國小校慶,因為,她現在是國一生啦。 只有我們家小隻的 采潔 (Annie),現在是就讀五年級,當然是需要,而且她可是超愛校慶的,因為活動結束後有園遊會。 ^^

這一次只有我與我們家姥姥一同過去參加而已,因為那天我老婆要陪蓁妮去台北師範學院那參加「英語檢定」鑑定的口試部份 (筆試部份蓁妮可是考了近滿分,開心~)。 前兩天啊,兩隻女兒為了爭取媽媽要陪誰的問題,還大吵一架,而蓁妮甚至還哭得很難過,使得小女兒 Annie 心軟,才告訴媽媽陪姊姊去好了;至於我呢,相當沒行情,可去可不去,她們也不太理我,唉,難過! :(

那一天快 10 點才過去,是我們 Annie 告訴我說的,太早去聽什麼董事長、校長、家長代表等的致詞,太沉悶了。 也對,每年太早去,真的很無聊,看到小朋友們站在操場那麼久曬太陽,真有些覺得辛苦。

這一次有改進一些了,並不需要每年級、每一個班級都要表演才藝活動。點綴一下,或者每個年級或聯合起來一起表演,意思到了又不會花太多時間,這樣反而更有意義。
2009年「育才國小」校慶

2009年「育才國小」校慶

繼續閱讀 »

奧客的應對? ─ 輕鬆來看待!<2>

與所謂的奧客應對時,真的可以這麼順利? 這麼輕鬆以對嗎? 不可能啦,現實上的不愉快必然是會碰到的。 會不會影響到心情? 會的! 但是久而久之,這種不愉快碰多了,除了很快就會淡忘外,甚至有時候還能拿來自娛娛人,當成玩笑還挺有趣的呢。

我印象真正最為深刻的是,也是在三、四年前,中部彰化某家上市輪胎公司的資訊部門,某位承辦人員希望能請我們過去,面談關於軟體設計教育訓練的課程規劃。 當時真的沒啥經驗,也比較有 "熱忱",再加上 Ringle 是認為過去一趟談談是很有機會的,好吧,就約在某一天開車下去 ……。

竟然喔,開車開了四個多小時才到,很是誇張! 除了真的是位於彰化很裡面的裡面、相當偏僻的地點外,我真的是路痴,前一晚特別印了地圖出來,看了圖形與圖標,天真的以為就是從草屯還是西螺交流道下來,然後開車橫著一路過去就到了。 哇勒,沒想到,橫著穿叉的那個圖標不是道路,而是河流啦! 根本沒有道路可以穿過去。 所以不得已我又再繞回到彰化市區,再慢慢看路標、還有電話問那位承辦人,才總算開到那個輪胎公司所在的資訊處。

到了資訊處裡面,最最最讓人當下火大的是,直到現在我還記憶猶新。 他們有位資訊中心的副理、是戴著眼鏡、撲克臉,在我們還沒坐好位置,也沒送杯水來的時候,竟然用很不客氣的語氣、劈頭就問: 你們會寫什麼程式?

我還真有些愣住! 連 Ringle 這種超級好脾氣的,事後還跟我說,真要問這種問題,電話問問就好了,還要我們這樣舟車勞頓,然後直接問這種極度無聊的問題? 多虧我當時忍住脾氣,還勉強虛心地回應說我們會寫 Java 程式,喔,C#,VB.NET 也是會一些的啦。 甚至也還主動釋出善意,送了一本我們影印製作的 UML 教材。 沒想到喔,這個二楞子副理,竟然還直接說,不要給我,我看不懂也不會去看它。 吼! 我的火氣真的來了,臉色都已經變了,好心給你參考,不要就算了。 還好是那位年輕的承辦資訊人員與他的另一位經理溫和多了,打打圓場,也希望能索取我們那本講義,整個氣氛才沒那麼僵。

嗯嗯,等我沉住氣後,開始就言語 "虧" 那個二楞子副理了。 而且同時我觀察了他們資訊人員使用的系統,呼,好像是回到二、三十年前的 DOS 年代一樣,甚至還比那個 Windows-Form 的 Client-Server 差了一個世代的感覺。 這我就更放心了,因為當下我就知道他們是不可能上這個什麼 UML 軟體設計的課程的啦,所以我就更可以用力地、毫不留情面的 "損" 那個二楞子副理了。

承辦人與他們經理的問題,我們都算是很和緩誠懇地回應,而至於那個副理問的問題勒,我當然就是很用力地反虧回去。 甚至喔,他還想拿個技術性問題考我們,我乾脆回說,這麼簡單的問題,還要問喔。 這樣好了,打個賭,我們當場寫出來的話,你請我們吃那個路口蠻大一家西餐廳的牛排全餐,反之寫不出來就是我們請 (真要寫不出來,那是 Ringle 的問題啦,當然是他請,哈)。 呵呵,那個副理竟然說,他還有些事要先離開了。 也沒做任何表示,真的算是 "小孬孬" 呢。

其實我知道那個副理是在地的草根性格,個性是那種直率耿直的,也並不是有什麼惡意,只是單純那種更為典型、不會做人的技術人罷了。 所以我是把這則經歷當作是很有趣的笑話,有時會講出來給朋友們哈哈一笑、自我解嘲罷了。 :)

結束這無聊的鬧劇,也算是上個當、學個乖。 不過既然都來中部了,所以我堅持要開車到台中後火車站的「台中肉圓」吃肉圓消消氣。 吼! 開到「南屯」那邊又迷路了,從彰化那邊開到「台中肉圓」竟然開了一個半小時。 :(

回程還順帶買了一大盒冷凍的肉圓回家吃。 然後又路過一家「冷凍芋頭店」,我又堅持下來吃吃冰涼的消消氣。 但是芋頭硬又不脆,真是難吃 (我還記得小時候在台中的五洲戲院旁有家冷凍芋頭的攤位,入口即化,好吃極了) ~ 然後要上高速公路前,看到「麥當勞」,我堅持要再喝杯熱咖啡消消氣,同時又可以提神上路去。 喔喔,上高速公路沒多久,肚子就開始不舒服了,勉強開車到了「西湖休息站」,趕緊到了公廁,拉了一大肚子,這個時候啊,才總算消了氣啦。 事後 Ringle 還取笑我,哪有人吃冰的馬上又喝咖啡,這不拉才怪!

其實,所謂的事業,原始的商業行為就是 "買賣" 二字! 在買賣的過程當中,買方出低於一般行情的價錢,賣方當然不開心;反之,賣方賣太高價錢,買方又得不到期望的滿足,相對也會不高興。 而軟體啊,前述提及,入門門檻並不高,學個 PHP 可能兩個星期不到,就能開始撰寫 Web 應用程式了。 相對來說,競爭者多,基本品質要求不高,當然比較容易遇到所謂的 "奧客" 來砍價;但反之,要往所謂的高品質之路來走,就必須要辦法讓買家能對賣家建立信賴感。 "價值" 二字,是包括有形與無形的一種觀感。

我覺得,無論是軟體人員自身,最好是能擴至團隊、公司的集合體,要能期往提昇價值之路的方向邁進 (所以為何是需要凝聚理念相近的事業夥伴,團隊力量才真的更大)。 可惜,價值的提昇,需要長時間的累積,需要長時間的學習,更需要的是熱情二字!! 尤以後者,諸多軟體人員,似乎只是把程式開發當成工作,餬口罷了,熱情? 等公司懂得照顧員工再來談吧! 問題是,該期待的難道是公司,抑或是對自己應該有的期許與成長呢?

 o 奧客的應對? ─ 輕鬆來看待!<1>

Java SOA 基本觀、架構與實做 <3>

SDO的規格

SDO (Service Data Objects) 是 Java 世界中對於 SOA 資料存取的一個架構。

在這個架構中,其主要的元素包括三個,分別是:Data Object、data graph 以及 Data Access Services (DAS)。

  • Data Object 主要是屬於資料面的呈現,在 Data Object 中,保存了一組的屬性 (Property),其實非常類似傳統的Java Bean。
  • data graph 包裝 了 Data Object,並且保存了 Data Object 操作的相關屬性(如是否有被更改…等),一般來說,data graph 的來源可以是 Data Source(XML file, EJB或是RDB)或是Service(Web Service、JCA或是JMS)。
  • DAS 則是實際操作 data graph 的操作,如將 data graph 的修改註記直接 Commit 到 Data Source 中。
  • 這三者的關係,其實非常類似 .NET Framework 的 ADO.NET 的 Dataset 結構。

    Data Object可以類比為 Data Row;data graph 則類似 Dataset;而 DAS 則是 Dataset 的 Data Adapter。
    我們可以利用下圖來說明者三者的關係:

    圖 5. SDO的存取結構
    (點擊圖片鏈接看原圖)圖 5. SDO的存取結構

    在圖 5中表達了這個存取的結構關係。
    首先 Client 要求 DAS 進行存取,DAS 到 Data Source 存取 Data Object,並將其包裝為 data graph 後回傳給 Client,此時,data graph 已經和 Data Source 分離,呈現一個 off line 的 data;當 Client 對 data graph 進行操作後,再請 DAS 將該 data graph 更改的情形 Commit 回 Data Source。

    根據上圖 5的原理,SDO的API則如下圖所示:

    圖 6. SDO API
    (點擊圖片鏈接看原圖)圖 6. SDO API

    在這個 API 中,其實可以更進一步看出整體 SDO 的相關重要的結構關係。

     o Java SOA 基本觀、架構與實做 ─ {01}
     o Java SOA 基本觀、架構與實做 ─ {02}