關於 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 目錄下。

繼續閱讀 »

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}

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

SCA的規格

SCA (Service Component Architecture) 是由 OSOA (Open Service Oriented Architecture) 的組織所訂定的 SOA 元件的標準規格。

SCA 的主要目的在於訂定一個統一的程式標準,讓想要採用 SOA 的組織,可以透過該標準獲得一致性的程式寫作的方式。原則上 OSOA 的組織是由幾個支援 SOA 軟體的大廠(IBM、TIBCO、Oracle(with Bea)、Red Hat、Sun…等)所組成 (OSOA 的網址),也因此,在理論上,學會SCA的標準規格,應該可以對不同的SOA產品有一致性地程式寫作策略。

在SCA規格中,其中最重要的一個部分就是一個標準的組合模型 (Assembly Model),下圖即為該組合模型的基本示意圖:

圖2.SCA 的元件圖 (Component Diagram)
(點擊圖片鏈接看原圖)圖 2. SCA 的元件圖 (Component Diagram)
ref: SCA Service Component Architecture Assembly Model Specification, 2007, p. 3

上圖表達了一個SCA所定義的Component的幾個重要特性以及相關的Domain名詞,包括:

  • Component:代表Service的群組集合體,一般來說,Component通常指的是一個Function Group;通常來說,Component的實際實現的方式,有可能是各式各樣不同的方法(可以是一般的Java Code,或是BPEL,甚至是其他Component組合而成)。
  • services:代表Component所提供的服務,一個Service意指一段不可分割的操作,通常來說,一個Service就代表了單一個Function。
  • properties:代表Component中所必要的一些屬性,定義出來的Property在Component中會被共用,一般來說,我們很有可能在Property中設定一些會共用的複雜資料型態。
  • references:若是Component會用到外部的服務時,你可以利用reference直接設定參考的service。

繼續閱讀 »

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

*** 本系列文章與程式碼範例 均為 賴信仁 (Ringle Lai) 所撰寫 ***

在之前的課程中,我們曾經說明過SOA的設計來源其實是從架構面的 使用案例 (Use Case) 模型分析而來。本次課程我們將進一步地說明,如何利用標準化的設計準則來設計一個公司的SOA架構。

以下是屬於 SOA (Service Oriented Architeture) 的定義:

A service-oriented architecture is a framework for integrating business processes and supporting IT infrastructure as secure, standardized components—services—that can be reused and combined to address changing business priorities.
Ref: Service-Oriented Architecture (SOA) Compass, by Bieberstein et al. (2006)

A paradigm for organizing and utilizing distributed capabilities that may be under the control of different ownership domains. It provides a uniform means to offer, discover, interact with and use capabilities to produce desired effects consistent with measurable preconditions and expectations.

Ref: http://en.wikipedia.org/wiki/Service-oriented_architecture#cite_note-9

從上述的定義來看,所謂 SOA 的目的,其實只是在分散處理的環境,提供了一個「分散但可預期的」整體環境。

從這個定義來看,其實在數年前由產業界的力量所推出的「RosettaNet」,就是這一波 SOA 的濫觴;只是目前的SOA的觀念,從產業間的合作關係,逐漸地往企業內部的整體流程整合邁進。但從其基本觀念觀之,其實正是「Design to Interface」觀念的衍生。

那麼,SOA 究竟是怎樣的觀念呢,其基本的結構又會是如何?我們以下圖來呈現一般 SOA 所建議的架構(由於 SOA 畢竟並非一個標準化的架構,因此,各個不同的廠商或是學者,各自有其對 SOA 架構的看法,以下筆者所採取的,是筆者比較認同的SOA架構圖):

圖1. SOA的參考架構
(點擊圖片鏈接看原圖)圖 1 、SOA的參考架構
(Ref: SOA Practitioners’Guide Part 2: SOA Reference Architecture, 2006, p.19)

從這個架構圖,可以看出 SOA 架構的立體性。

在 SOA 架構中,對於企業 (Business)有意義的部分,在於整體企業服務層次的提供,這是上圖中最上方的三角形的部分,也因此,一般在實現 SOA 時,我們必須先從 Business 著手;至於下方的三個 Tier,則是從 IT 的架構層面出發,其主要的目的,在於提供 Business Service 一個穩定性的地基。 以上圖來看,其實 Service Tier 所代表的意義,在於將企業的 應用程式 (Application) 做適當的包裝,好讓其可以簡單地 Mapping 到 Business 的 Service。

也因此,所謂的 SOA 並非是一個固定的產品或是規則,相反地,先讓我們確認 SOA 的主要目的(Business Service <-> Information Service),再從這個主要目的去找尋適合的開發方式 (Development Process)與適用的技術,如此一來,對於 SOA 的整體規劃才不至於見樹而忘林,甚至在不知不覺間,被特定的廠商牽著鼻子走,反而忘掉了 SOA 的最根本的目的!

報名系統分析課程(06/27)免費送 Linux 軟體開發平台 DVD 光碟

HSDc. 團隊近日費心製作了「Linux 軟體開發平台」DVD 光碟。 目的是為了讓學員可以擁有與講師相同的軟體開發環境,只要帶回家啟動光碟後,不需作任何設定,就可以方便對講師所提供的實做案例自行練習 (當然,也可以開發所屬於自己的應用程式)。

即日起,只要報名【系統分析課程】系統分析設計與實作—活用 UML 塑模 與 Java (06/27, 54 Hrs),即免費贈送學員 DVD 光碟乙片 (不要忘了,線上報名還有免費贈送 Ringle 的親筆簽名新書喔)。 光碟內容相當豐富,包括課程所使用的教材電子檔、完整的實做案例 (包括 UML Model 檔與可執行的應用程式碼); 當然,還包括了如下完整的 J2EE 開發環境 (爾後 HSDc. 會對其系統與應用平台版本的更新而持續 Update):

  • OS: Fedora 10.0 Traditional Chinese
  • XWindows: GNome
  • VMWareTool
  • Java SDK 1.6.0_0b12
  • JBoss Application Server 5.0.1
    (Install in /usr/jboss-5.0.1.GA)
  • MySQL Server 5.0.77 (Fedora Default)
    MySQL GUI Tools 5.0r12
    MySQL JDBC Connector 5.0.8
    (Install in /usr/mysql-connector-java-5.1.7
  • Eclipse 3.3 with J2EE
  • Spring Framework 2.5.5
  • Hibernate 3.3.1 Code and Library

安裝的Server以及Java Library

底下同時列出幾幅開發環境的 Screenshot 圖片:
UML Development Tool (EA, Enterprise Architect) under Fedora Linux:
利用Wine執行EA

繼續閱讀 »