Working with PHPUnit, part 1 - 安裝備忘錄

近來的軟體開發流程強調「測試驅動開發 (Test-Driven Develope)」,對於單元測試 (unit test) 發展出了一些系統化的作法和工具,這類單元測試工具俗稱 xUnit ,例如 C 語言的 CUnit , Java 的 JUnit , .NetFramework 的 NUnit 。 PHP 也有 PHPUnit

安裝 PHPUnit 其實很簡單,基本上按 PHPUnit 的《Installation》的步驟即可完成安裝。只是我在 Windows 平台上做了一些修改。

初版: 2006-12-25。
最近更新: 2012-01-18。修正參考連結,補充安裝方式。

Synergy - 軟體KVM 使用說明

我的辦公桌上有兩台電腦螢幕以及兩台電腦。這兩台電腦各接一台電腦螢幕。但我不想要在桌上放兩組鍵盤與滑鼠,所以我需要一個工具,可以讓這兩組電腦共用同一組鍵盤與滑鼠。這種工具叫「KVM」。本文說明的是一套基於軟體實作的 KVM 工具,它就是 Synergy

Synergy 是一套自由軟體,且支援多種平台,計有 Windows, Mac OS 和 Linux。它可以讓許多組電腦共用一組鍵盤與滑鼠。切換方式也很聰明,使用者只要設定好各個螢幕的位置後,當你的滑鼠指標碰到螢幕的邊緣時,Synergy 就會將你的鍵盤與滑鼠的連接對象切換到另一台電腦。

企業內 P2P 網路架構設計要點簡易分析

目前常見的 BT (BitTorrent), eMule (EDLink) ,都是屬於公開匿名式 P2P 網路。它們的檔案分享關係網路是公開的,任何人都可以加入,並不適合企業內部的檔案散佈需求。

但也存在私有 P2P 網路架構(Private P2P)。有發展時間長久、支援軟體眾多的 Direct Connect,以及從匿名式 P2P 網路擴充過來的 Freenet 等。

PHP 自訂注記與屬性注入功能

我前天想要修改我寫的一個精簡型 PHP RESTful 框架 (「CommonGateway」),將它由外部設定(注入)控制項屬性內容的動作,改的更有使用彈性。最好像 Java Spring framework 那樣,可以透過注記(annotation)方式,讓使用者指定要注入的項目。

雖然 PHP 的語法並不支援注記符號,但是我可以變通一下,把注記內容寫在 doc 區,然後再自己解析 doc 的內容。 PHP 的 phpDocumentorPHPUnit 工具就是這麼做的。這個工作倒也不難,只需要用到 PHP Reflection 功能的 getDocComment() 就可以了。

GJS - D-Bbus 自動內觀(Introspect)與配置代理個體

我之前在「JavaScript 與 Desktop - DBus」說明 gjs 如何調用 D-Bus 服務時,提到 gjs 提供的 D-Bus 實作內容相當低階,以致於我們必須要自己定義我們想要調用的 D-Bus 代理個體的介面原型。在該文中我也提到,大部份的 D-Bus 服務都會實作 org.freedesktop.DBus.Introspectable 介面,提供 Introspect 方法(D-Bus 的 introspect 在 Java/C# 中採用的說法就是 reflect),讓其他人可以藉由這個方法查看介面規格。我們查詢的結果會是一份 XML 文件,若我們進一步分析該文件,就可以直接將分析結果交給 DBus.proxifyPrototype() 注入指定的代理類別。

本文就是想要利用 gjs 實作的 E4X 能力,去解析遠端個體傳回的內觀資訊(introspection),由程式自行產生 gjs dbus 模組所需的介面原型敘述,再注入成為新的類別。免除由程序員自己手寫介面原型敘述的不便。

粗略看過 CoffeeScript 的語法特徵

今天我來說個新的程式語言,CoffeeScript 。 CoffeeScript 的編譯器會將它的程式碼轉譯成 JavaScript 程式碼。它產生的 JavaScript 程式碼基本上可以在任何 JavaScript 環境中運行。

我沒有用過這玩意,只是它的語法令我覺得有點意思。CoffeeScript 的設計目的,在為 JavaScript 環境提供一個「更整潔的語法」。我大致看了一下它的程式碼範例,它大部份的語法混合了 Python 與 Ruby 的風格,但程式碼區塊(匿名函數)這部份則是採用 C# 語法。 我們來看看「Your first cup of CoffeeScript, Part 1: Getting started」這篇文章中的範例程式碼,初步認識 CoffeeScript 的語法。

自動查驗系統的圈內消息

更新:我說的太多,你知道的也太多了。所以這篇文章要河蟹。

昨天看報紙,看到「Permission deny!」這篇消息。 自動查驗系統是在 Linux 平台上建構的,所以我知道一些圈內消息。

產生新類別的類別

介紹 JavaScript 關於函數與建構者的基礎知識。理解此一基礎,將建構者內容參數化。 透過參數化的技巧,實作一個產生新類別的類別。

JavaScript 定義類別的基本方式

JavaScript 沒有類別定義的關鍵字。"定義類別"這句話在 JavaScript 中的意義, 等於是定義一個新的建構者(Constructor)。

參觀繪師100人展

週日閒來無事,得知高雄駁二藝術特區有一場「繪師100人展」,展示日本100人著名繪師的畫作。 展示內容正好是我感興趣的 ACG 萌系畫作,所以我就跑去參觀了。單人票價250元。

以庶民的娛樂「浮世繪」為題,抓住現代人心靈的寄託,並集合介紹100位現代「繪師」的新作,從人氣繪師所描繪的獨特世界觀,展現高超的繪畫技巧、質感、與潛力,不斷地帶給世界最新的日本價值觀。

繪師100人展 - 「椋本夏夜」作品
引用自寬宏藝術網頁圖像。 © 椋本夏夜

畫展活動資訊:

OpenSSL - SOD 與 ASN1 解讀

在上一篇《SOD 安全文件概論》中,我直接使用工具 openssl 解讀 SOD 的內容。但它只是按照各項資料的結構順序,用粗略的格式顯示資料內容。本文則是直接用 OpenSSL C 函數庫解讀 SOD 內容。

由於本文案例中的 SOD 採用 ASN.1 格式儲存,所以解讀 SOD 的工作實際上就是 ASN.1 文件的解讀工作,需要利用 OpenSSL C 函數庫中與 ASN.1 相關的函數。不幸的是,在已經很貧乏的 OpenSSL C 函數庫文件中, ASN.1 函數更是連份說明文件都沒有。如果不直接去讀 OpenSSL 的 C 源碼,可能根本寫不出 ASN.1 解讀程式。在此提供大家一個指引方向,想要進行這項挑戰的人,只需要去讀 OpenSSL C 源碼的 crypto/asn1/asn1_par.c 這份源碼文件。本文也沒有足夠的資訊仔細說明那些 C 函數的用法。

Android 臉部辨識解鎖的兩件事

Google Android 4.0 (Ice Cream Sandwich) 上月發佈,其中被當作主要賣點的「臉部辨識解鎖」(Face Unlock)功能,在我們公司中,基本上是當作笑話在看的。我的 twitter 中,也推了4則訊息提到 Android 4.0 的臉部辨識解鎖。

我九月份在部落格上發了一篇《因為影像左右相反,導致識別系統軟體專案失敗的例子》。臉部辨識就是該案例的軟體系統中的主要軟體項目。我們公司身為該專案眾多協力廠商的其中一員,對臉部辨識功能於實際佈署運用時會碰到的諸多狀況,也累積了不少經驗。而 Android 4.0 臉部辨識被發現的兩個狀況,不過是我先前就知道的其中兩件事罷了。

OpenSSL - SOD 安全文件概論

在 RFID 或其他微型儲存媒體的應用情境中,我們會將使用者的相關資訊儲存在 RFID 內。再透過讀取 RFID 的內容,快速判讀使用者的識別資訊,完成所需的工作。例如我們將員工的識別資訊存入 RFID 。員工持卡刷過門禁系統上的讀卡區後,門禁系統就可取得持卡人的身份,判斷是否允許進入。

但是我們要如何確認這張卡的內容是由我們發出的呢?再者,RFID 是可重覆寫入的儲存媒體,亦即他人可以自行修改裡面的內容。我們又要如何保證 RFID 的內容沒有被使用者自行竄改呢? 這些議題,可以藉由 OpenSSL 滿足其安全需求。

AXIMCom MR-105NL 接在網路分享器後方的用法

我今天買了台 AXIMCom MR-105NL 的無線網路分享器,主要是看在價格便宜還支援 3G 網路分享。只是我的用法有點特別,不是它原來預設的方式,所以我調整了一些它的設定。

AXIMCom MR-105NL 的預設工作模式是網路分享器暨 AP 。但我原先已經有一台 MikroTik RouterBoard RB750G 網路分享器,它的功能更穩更好。所以我不需要使用 MR-105NL 的網路分享器功能。我只需要 MR-105NL 接在 RB750G 上,做一台單純的乙太網路集線器暨 AP 。各網路設備的連接情形如下所示。

手機、筆電 -> Wi-Fi 訊號 -> MR-105NL -> 網路線 -> (DHCP) RB750G -> ADSL Modem -> Internet

schema-database - 查詢結果與 PDO~~FETCH_CLASS

我上週整理我幾年前開發的一個具備簡單 Active record 與 ORM 功能的 PHP 資料庫函數庫 schema-database 。我想要為查詢函數加上一個參數,讓編程人員選擇查詢結果的型態為陣列或個體。因為 schema-database 的底層是 PDO ,所以要調整 PDO 汲取方法(fetch)的選項。

在改寫動作中,我注意到 PDO 有一個選項叫 PDO::FETCH_CLASS 。它與 PDO::FETCH_OBJ 的差別在於 PDO::FETCH_OBJ 汲取出的資料型態是標準類別的個體(stdClass),也就是單純的屬性集合體。而 PDO::FETCH_CLASS 汲取出的資料型態則是指定的類別的個體;這個類別可由使用者自己定義。 PDO::FETCH_CLASS 的用途,很明顯可以搭配 ORM 類,讓 PDO 直接幫使用者配置 ORM 實體。

因為影像左右相反,導致識別系統軟體專案失敗的例子

我最近聽到一件失敗的軟體專案例子。內政部某單位,建了一套基於生物特徵辨識的身份識別與出入管制系統。這個系統會收集一般人的臉部與指紋特徵,建立特徵資料庫。並結合門禁與監視器設備,管制人員出入。聽說還會與走道的監視鏡頭結合,隨時識別進出人員的身份。簡單地說,從你進入該單位管轄區域之後,你都一直處於被識別的狀態,直到你離開為止。一但區域內監視器中的人員影像,被識別為黑名單人員,或是沒有進入記錄,都會通報管理人員。

這種系統,可以說是小型的天眼系統,或說是人肉搜索系統。不但錄影,還會識別身份。多少都會觸及人民隱私權的議題。不過這不是本文重點,就不多談。

Innovate 2011 IBM 開發者大會記事

9月1日到台北參加了每年慣例的 IBM 開發者大會,活動主頁見此「Innovate 2011 IBM開發者大會」。今年的活動主題是「Software, Everyware」,台灣則取為「創意無所不能╳軟體無所不在」。我個人覺得英文主題寓意較佳。中文實在翻得太長了,「創意無所不能」這句話甚至沒有點到會議的另一項主題:「Software driven innovation」。現場的口譯人員好像譯為「軟體驅動創新」。今年的議程主題,圍繞在軟體開發的生命週期(Lifecycle)之上。切入點是從「Everyware」開始,再延伸到生命週期管理,進一步追求創新的可能性。

Debian 6 and Realtek RTL8192SE WiFi device

我前陣子打算把我的 ThinkPad X200s 的系統從 Ubuntu 10.04 轉移到 Debian 6。 安裝 Debian 6 之後的使用過程中,大部份的硬體裝置都沒有什麼問題,就是 WiFi 網卡未驅動,以至於無法使用 WiFi 連接網路。我這款 ThinkPad X200s 配的 WiFi 網卡是 Realtek 8192SE。上網查了一下,原因出在 Realtek 提供的 Linux 驅動程式碼是專屬授權,故 Debian 預設不使用。在 Debian wiki 有一份關於「rtl819x」的條目提到 Realtek WiFi 網卡的支援內容,使用者必須勾選 non-free (受版權限制的項目)才會看到相關套件。根據那項條目,RTL8192SE 的支援套件被收錄在 Wheezy (testing) 套件庫。不過我曾試過混用 Squeze 與 Wheezy 套件庫的套件,但衝突太多,搞得系統不太穩定。所以我不想用 testing 的內容,故我選擇了自行下載源碼編譯安裝的方式。

感謝亞卓市信箱,我會懷念它的

我個人有幾個 e-mail 信箱,一直以來都按照用途來區分。 就像有些人的手機總是要用雙卡雙待,一卡公事,一卡私事。 我在個人部落格以及參與自由軟體社群討論時,以往使用的 e-mail 信箱是 shirock@educities.edu.tw。 這是我在大學時期申請的亞卓市服務項目之一。 然而就在這個月底,這個陪了我超過十年的信箱,隨著亞卓市關閉電子郵件系統相關的所有主機之後,正式走入歷史。 因此我今天將部落格上的個人聯絡信箱,改為 gmail 信箱。

在幾個月前,亞卓市服務中心就開始通知用戶在今年7月底前,就要停止電子郵件服務了。 不過我先前疏忽了,一直到上週發現亞卓市的郵件系統主機的網域名稱整個消失了,我才注意到這件事。 所幸我在上面的郵件都有整理,重要的都有備份。 不過八月份以後,寄送給這個信箱的自由軟體電子報及部落格上的讀者回應等內容,我就漏收了。

網際網路早期,e-mail 地址也代表著一個人在網路上的識別記號。 雖然近幾年隨著社群網站的興趣,晚近的網路使用者更常用的網路識別記號可能是 Twitter, Facebook 等帳號。 但對我這不用 Facebook 的人而言, e-mail 仍有其識別意義。 在瞬息萬變的網路環境中,十年是相當長的時間。 我由衷感謝 shirock@educities.edu.tw 信箱伴我走過這麼長的日子。

江湖傳言,國內某大廠把 Android 的 Dalvik 移植到 Linux 作業系統

某日,我與強者我朋友閒話時,強者我朋友說他某日和梅友仁閒話時,梅友仁告訴他一則我一定感興趣的江湖傳言。江湖傳言道:國內某系統大廠把 Android 的 Dalvik 移植到 Linux 作業系統,並且運行在x86平台。

我說,該不會是 Android-x86 吧?那不是什麼新聞了。強者我朋友說「非也」。傳言所說是無修無改的 Linux 核心配上 Dalvik ,不是用 Google 修補過再被其他人移植的 Android-x86 。