PHPUnit 自定 TestSuite 輸出樣式,輸出為 HTML 網頁

PHPUnit 預置了一個純文字型式的 TextUI Runner,在大多數情形下,它足夠應付我們的需求。不過,當我想要把 TestSuite 放到專案網頁上,讓小組成員 - 特別是 PM - 可以上網查看立即的測試結果時,那個文字型式的 TextUI Runner 就顯得太簡略了。至少要把測試工作及結果輸出成 HTML 的條列式清單,最好還加上顏色區別成功或失敗。

所幸 PHPUnit 提供了良好的擴充性,要自定一個可以將測試內容輸出為 HTML 網頁的 HTML Runner 相當簡單。

[P]: Pass; [F]: Failure; [I]: Incomplete; [S]: Skipped; [E]: Error.

BIT and CHAR

BIT 與 CHAR 使用筆記。以 SQL92 為基準。

BIT很少用,前一陣子為了使用這種資料型態,google了不少資料,不過大部份網路資料都沒有提供什麼有用的資訊 (市面上的 SQL 書籍更是不提)。最後還是在各家資料庫系統本身的 Manual 中找到資訊。留下筆記,以供日後查閱。

關於分割程式功能以及 mix-in 和 include

最近碰到一個分割程式功能的問題,不得已必須用到反映的功能,寫了一個簡單的抽象插件類別 http://blog.pixnet.net/HACGIS/post/15612808。 不知道你有沒有更好的解法? tokimeki

關於這個問題,我是用所謂「混成(mix-in)」的概念實踐。先前我寫過2篇: PHP 實踐 mix-in 概念PHP 實踐 mix-in 概念 part 2

另外一位網友是用 include ,參考: mix-in?。嚴格來說那不是 mix-n ,稍後說明。這有3個缺點。

如何替使用 CodeIgniter framework 開發的程式進行 PHPUnit3 的單元測試

先說一下 PHP framework 的事,我個人很想用 Zend Framework 。但我服務的公司的軟體是用 PHP4 開發的,所以主機也是跑 PHP4。由於遲遲不見有更新到 PHP5 的計劃,所以我現階是用 CodeIgniter framework 在寫新功能。

另一方面,我又習慣用 PHPUnit 進行測試工作。為此,我必須要弄一個簡單的測試框架出來,才能以 PHPUnit 去測試我用 CodeIgniter framework 寫的功能單元。

Making Document~ Make a Database Schema SQL from StarUML's Class Diagrams

日前我在公司和同事討論一個案子的 database schema,PM初期丟下來的 database schema 是寫在 Excel .xls 檔中。我拿到手後看了一會,覺得有些怪怪的,好像有些重覆。自然要討論內容。不過,用 Excel .xls 實在不方便討論,不時地切換試算表頁,常常中斷思考與討論節奏。所以,我乾脆打開 StarUML,建立一個類別圖 (Class diagram),把 database schema 畫了出來。在類別圖中清楚地呈現了表格與關聯性。一畫之下果然討論起來就順暢多了,也重新修正了不少地方。那接下來呢?再打開程式碼編輯器,把剛剛畫出來的 database schema 類別圖的內容,重新用 SQL 語法編寫一次嗎?

喔,不,老兄,那樣太不專業了。我們可是專業的資訊人員,重複輸入同樣的資訊,不是我們該做的事。身為專業資訊人員,就應該重複利用輸入過的資訊才對。不然我們做什麼資訊管理,搞什麼資料庫?

REST and RESTfull web service

過去,我提到 REST 這個字眼時,多半指的是一種常用的 Web-based 應用軟體設計慣例或樣式 (我個人偏好用"慣例"一詞,不過用"樣式/pattern"好像比較專業)。既然是慣例,那在設計和使用上就比較隨興。不過隨著 REST 樣式的大量應用,有愈來愈多案例開始使用更制式化的設計樣式,這些高度制式化的 REST 服務,就稱之為 "RESTful web service"。 "-ful" 這個字尾正是在強調它們的設計方式完全符合 REST 文獻的建議內容。

相對於 RESTful ,以往那種基於慣例與相容性的實作方式,有人就稱為 RPC 。不過說到 RPC ,我第一時間想到的是 Unix 系統的 RPC (Remote Procedure Call),而且它的歷史更為悠久。為了避免混淆,所以我傾向於用 "REST-like" 這個稱呼。

Regex~~look-ahead assertion

有一字串,其格式為以逗號 (,) 分隔的記錄,例如 "a","b","c"。當某些欄位之值為空白時,會有逗號相連的情形,例如 "a",,"c"

現在要用字樣規則式(Regular Expression, Regex)修改空白欄位的表達方式,改成一個空字串 (""),一般我們會寫成 s/,,/,"",/g (by Perl)。不過這種寫法碰到連續多個空白欄位時,例如 "a",,,"c",會變成 "a","",,"c",得不到我們要的結果。因為 Regex 解析器在找到第一組 ,, 後,會把處理指標放在第3個逗號的位置上。當 Regex 解析器進行下一個比對動作時,它將從第3個逗號開始尋找,此時它看到的只有一個逗號,故判定不符合樣式,也就不會進行替換動作。

碰到這種情形,我們要用 look-ahead assertion (前瞻斷言) 處理。 Look-ahead assertion 的語法為 (?=pattern)。See also perlre::Look-Around Assertions

換台新螢幕,同時抱怨平價好貨的 LCD 都跑哪去了

上禮拜在 P購物網訂了一台 Lenovo ThinkVision L220x 22吋 LCD,要價 NT$189xx。週末宅配到家,我使用了兩天後,感覺非常滿意。比公司用的 22吋 LCD 要好太多了,果然是一份錢一份貨啊。

話說為什麼一台 22吋 LCD 跌破萬元關卡之際,我花了 NT$189xx 買一台 22吋 LCD 還覺得有賺呢?原因就在於面板不同啊。

以 Apache proxy 與 rewrite modules 解決 Selenium Core 的運行限制

在 Web 應用系統的開發工具中, Selenium Core 是一套相當著名的測試工具。它的特點是 "直接在真實的瀏覽器中測試各項動作" 。由於現行各家瀏覽器的實作狀況各有所異,所以這項特點可以真實反應 Web 應用系統對各家瀏覽器的相容性。也正由於它是直接在真實的瀏覽器上進行測試,所以它也不可避免地受瀏覽器的功能限制,其中最主要的限制就是 "Same origin policy"(相同來源政策)。

凡是 Ajax 的開發人員,對於 "Same origin policy" 一定不陌生。這是瀏覽器保護使用者資料的重要安全措施。而 Selenium Core 是一套以 JavaScript 實作的測試工具,所以也受 Same origin policy 限制。這就使得開發人員在使用 Selenium Core 測試 Web 應用系統時,必須要把 Selenium Core 安裝在 Web 應用系統的目錄之下,以符合瀏覽器的相同來源政策。如果 Selenium Core 和 Web 應用系統的來源不相同,瀏覽器就會回應 Selenium Core 沒有權限載入 Web 應用系統的頁面。如此一來也就無法進行測試工作了。

IBM Jazz 專案開放申請使用

今天看 iThome 的報導,知道 Jazz 開放申請使用。我也是這時才知道, Jazz 原來是一個軟體協作平台。

去年10月底,我參加 2007 IBM開發者大會時,雖然知道大會主題是 "Jazz" ,不過一直以為那是一個形容詞。在當天的議程中,完全沒有看到所謂 "Jazz" 軟體的影子,那天談的是 Web 2.0 和 SOA 。今天才知道原來那還是一個軟體協作平台。IBM 的宣傳也差了點吧...

Extend core libraries of CodeIgniter to detect the request file type and load applicable view

I extend core libraries of CodeIgniter to detect the request file type and load applicable view. The other way is use URI Route, see '文件格式之 URI Route Rule 與 CodeIgniter 之實作示範'.

What I want to do is that if user request 'http://localhost/ci/blogs/index.xml', it will try to load a view for XML. In other cases:

  • If request 'blogs/index', load 'views/index.php' to render HTML document (default type).
  • If request 'blogs/index.xml', load 'views/index.xml.php' to render XML document.
  • If request 'blogs/index.pdf', load 'views/index.pdf.php' to render PDF document.
  • and so on.

文件格式之 URI Route Rule 與 CodeIgniter 之實作示範

我習慣將控制元件行為的最後一個參數,設為文件(呈現內容)的"格式",如使用者想要 XML 格式的回傳內容,則傳入 'xml'。例如:

程式定義:
  class Controller {
    function method( docType ) {
      // return result as a XML document.
    }
  }
  var controller = new Controller;

調用控制項時的 URI:
  controller/method/xml
  # invoke  controller->method('xml');

不過,我更喜歡將"文件格式"這個參數放在 URI 的副檔名部份。這部份我放在文章後段。

PHP如何取得虛擬主機名稱及瀏覽器適用的地區語文資訊

在 HTTP 協定(RFC2612) 中提到, Host 可用於得知使用者存取主機資源時會使用的主機名稱,供 HTTP Server 判斷虛擬主機設置。Accept-Language 可用於得知使用者的地區語文清單。服務者可根據此清單內容,呈現最適用於使用者的地區語文內容。

在 PHP 中,可藉由全域變數 $_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME'] 取得 Host 內容。$_SERVER['HTTP_ACCEPT_LANGUAGE'] 取得瀏覽器適用的語文清單。

HTTP_HOST, SERVER_NAME should be the same. However, SERVER_NAME looks like only available in Apache2.

步驟引導與頁籤結合的資料輸入表單

結合下一步、上一步, Step by step 的步驟引導方式與頁籤UI (Tab UI),設計使用者的資料輸入表單。

本文使用 jQuery 的 UI library。

Update: 2008/02/22
jQuery UI 1.5 移除了 tabsClick() 方法,將它改為 tabs() 方法的 'select' 功能。

How do you write template? XSLT, PHP or RoR?

Using XSLT, PHP, or Ruby on Rails to transform XML documents into XHTML documents. 展示 XSLT, PHP 與 Ruby on Rails 的樣版撰寫風格。

在使用樣版引擎之前,我們需要先將資料自外觀中分離,因此 A Note of HTML Form and XForm 算是本文的前置文章。當我們將資料和外觀分離時,我們將更進一步考慮如何將外觀樣版化。

A Note of HTML Form and XForm

如何分割 "資料"(Data)與 "表單外觀"(呈現層,Presentation)。

HTML Form 之中,資料與表單元件的陣述混雜在一起,增加文件編寫與閱讀複雜度。此複雜度不僅是針對人工輸入與閱讀,對應用軟體亦然,例如網頁編輯工具、Famework 工具等等。混雜的陣述方式,增加了前述工具的開發者之工作 - 編程難,除錯難 。

使用 CodeIgniter 作為開發框架並預期以 GPL 散佈應用軟體的作法

CodeIgniter 使用自定的授權書, CodeIgniter License Agreement。基於授權內容, CodeIgniter 不能被 GPL 傳染 copyleft 特性。(因為 GPL 的授權方式使其他使用 GPL 源碼的軟體也必須採 GPL 散佈,故人們戲稱這是一種病毒傳染行為)。基於此種限制,我個人認為不能將 CodeIgniter 包裝為我們應用軟體的一部份。CodeIgniter 和我們的應用軟體應該分開散佈。亦即,使用者必須另外下載取得 CodeIgniter 源碼。

故我寫下這份記錄,以說明如何將採用 GPL 授權書的源碼與 CodeIgniter 的源碼隔離散佈。

有些人認為不必如此做。 CodeIgniter 的作者就認為沒有問題。不過我還是傾向於將兩者分開散佈,不將 CodeIgniter 包裝在一起。

wxJavaScript - 以 JavaScript 開發視窗與 Web 應用程式的工具

雖然 Microsoft 的 .Net Framework 就提供了一個 JScript.Net comipler (jsc.exe),透過 JScript.Net 就可以開發 .Net 平台下的視窗與 Web 應用程式。不過知道的人應該不多,而且對 .Net Framework 架構感冒的人也不少。所以在 OpenSource 界中,就有人做了 wxJavaScript ,一樣可以寫視窗與 Web 應用程式。

熟悉 OpenSource 軟體的開發者,在看到 "wx" 這個字首後,應該就會聯想到 wxWidgets 這個老牌的跨平台 GUI 應用軟體開發工具了。 wxJavaScript 正是以 wxWidgets 為核心,並使用 Mozilla SpiderMonkey 為 JavaScript 引擎的 JavaScript 開發工具。