入手小紅點鍵盤, IBM Space Saver II

前幾天在網拍上買了一隻 IBM Space Saver II 鍵盤。 雖然它似乎已經有10年歷史了,但功能仍然很正常,最重要的小紅點(TrackPoint)依然可以使用。 我現在把它放在公司使用,寫程式時雙手完全不必離開鍵盤,真的很方便。 滑鼠已經被我扔到一邊去了。

全照圖與 TrackPoint 特寫。

全照圖 TrackPoint特寫

PHP 網頁訊息國際化與 gettext 使用經驗

PHP 很早就已經支援 GNU gettext 的國際化模組。在線上手冊與網路上也可以找到許多相關的討論文章。 但是部份內容沒有完善地理解區碼的設定方式,以至於程序員在 LANGsetlocale() 的問題之中糾纏不休。

本文首先將說明區碼的設定問題,再示範 gettext 的使用方式。

Vala with GNU gettext

Vala 作為 GNOME 開發環境下新興的開發語言,帶入了許多新的功能,其中亦包含國際化(i18n)的支援項目。 儘管 Vala 的線上教學文件沒有隻字片語提到 i18n/l10n,但事實上 Vala 已經將 GNU gettext 作為內建的語言功能,使用它實現 i18n/l10n 能力。 Vala 提供了名為 _ 的函數,只要我們的 vala 程式碼使用了 _() 函數,就會使用 GNU gettext 取得本地訊息。

但是現階段使用這個內建功能時,還有一個文件未記載的不完善之處必須解決。待我說來。

一機多介面的業界新聞 - Motorola Atrix 與 WebOS Enyo

我這陣子上班時,會邊吃早餐邊看癮科技網站,那裡的科技新聞提供我不少樂子。在他們前陣子報導的 CES 2011 新聞中,我看到 Motorola Atrix 和 WebOS 揭示了一些有趣的想法。

關於 Motorola Atrix 的兩則新聞:

關於 WebOS 的兩則新聞:

NoSQL 是資料庫觀念的復興運動

日前公司同事接觸了 CouchDB, MongoDB 這幾套標榜 NoSQL 的資料庫系統。還有江湖傳言道:「RDBMS 落伍了,以後要用 NoSQL 資料庫」。這就在公司內引起了一場討論,到底 RDBMS 是不是落伍了。就我個人觀點,CouchDB, MongoDB 確實很有用,但要說 RDBMS 落伍了,我卻不以為然。

就我所見,NoSQL 其實是資料庫使用觀念的復古運動、正確觀念的復興運動。

HTML5 離線儲存規格仍未定

今天看了《Create offline Web applications on mobile devices with HTML5》,講授 HTML5 的離線儲存功能。由於它使用的是 W3C WebDatabase 功能,於是我又去看了該規範文件。結果看到規範文件的開頭用顯眼的黑底框寫著注意事項,宣告 WebDatabase 不再維護了。

停止理由是各家廠商目前在實作這個規格時,底層的實體儲存項目都是 Sqlite,走向一條死胡同。W3C 則是希望有多樣化且獨立的實現途徑。

多授權/雙授權模式是如何運作的

雙授權模式(dual-licensing)軟體是指一套電腦軟體,它提供了兩種不同授權模式供使用者選擇。實際上,也有些軟體提供了三種甚至三種以上可選擇的授權模式。是以我們統稱為「多授權模式」(Multi-licensing)。在解釋時要特別注意一點,多授權模式係指提供多種授權內容讓使用者擇一使用,並非多種內容同時授權。故中文說明時,不宜使用「雙重授權模式」或「多重授權模式」,因其授權內容並未重合。

多授權/雙授權模式是如何運作的 - VirtualBox 篇

我先前寫了一篇《VirtualBox有多種授權區分,企業使用並未免費》,說明 VirtualBox 有多授權模式,提醒公司的IT人員注意。那篇文章中說明的資訊有些過時了。現在 VirtualBox 3 已經開始提供 GPL 授權證給使用者選擇,此授權模式版本的官方正方稱呼為 VirtualBox Open Source Edition (OSE)。只是現在對客戶說明時也比較麻煩。因為客戶有時並不能理解「 VirtualBox 不等於 VirtualBox OSE」。

2012-03-14: 補充 VirtualBox 4 的授權變動。

石頭成的2010年終LCD購買指南

每年年底,總是有人問我某某電腦產品要怎麼選之類的問題。今年被問到 LCD 的事。說到 LCD ,我就有種不吐不快的感覺。我在兩年前買第一台 LCD 時,就留下一篇文章抱怨台灣沒有平價好貨的 LCD。兩年後,這句話依然適用。

那些向我請教如何選擇 LCD 的親友,我心中的惡魔都在冷笑:「有差嗎?賣場裡的貨色都一樣爛,同規格的挑最便宜的最划算」。 當然啦,我這個人還是有良心的,不會這麼直接地用一句話打發對方。基本上,我還是有一張選購速查表。

Python - Pipe 在 Signal 發生時的處理事項

當我在 Python 中結合 multiprocessing.Pipemultiprocessing.Processsignal 模組進行傳統的多工行程設計時,我注意到被擱置的管道資料讀取方法(read),在沒有取得資料的情形下就返回。使得父、子行程之間的互動過程不如預期。錯誤訊息顯示,讀取方法被系統中斷了(Interrupted system call)。read, signal, interrupted system call 這三個關鍵資訊,讓我直覺聯想到我碰到 EINTR 這個狀況了。當我在錯誤處理的流程中增加 errno 的判斷動作之後,我確認這就是 EINTR 狀況。

一位使用過 C 語言撰寫多工行程程式的程序員,對 EINTR 這件事絕不陌生。只是我未料想到會在 Python 之中再度碰到這位老朋友。對於這位老朋友,我們的招待原則請看《多工作業下的資料讀寫處理事項 - read()/write() 被 signal 中斷的處理 》。那篇處理事項中,提到 C 語言要準備兩招應付 EINTR 狀況。不過使用 Python 時則只需要第一招:如果錯誤是因為被 signal 中斷的話,就再讀一次,如果是其他原因導致的錯誤,則視為致命錯誤,應該中止程式繼續

打造 Windows XP 與 Linux 的雙桌面環境

在 Windows XP 主端桌面系統上,安裝 Ubuntu Linux 桌面系統虛擬機器。利用 VirtualBox 的無縫模式與共用資料夾功能,形成雙桌面環境。

MS Windows 7 專業版有一個 XP 相容模式。它骨子裡就是跑一個 XP 的虛擬機器,然後用 seamless (無縫模式) 執行 XP 軟體。這個玩法,我十幾年前使用 IBM OS/2 3.0 時就玩過了,那時是把 Windows 3.1 以無縫模式嵌在 OS/2 桌面中,讓 Windows 3.1 的軟體跑起來像其他的 OS/2 軟體。啊,年紀大了就喜歡話當年。用過 OS/2 的人大概沒幾個了。不講古,回正題。

我在家中的桌面電腦使用的是運作多年的 Windows XP,利用 VirtualBox 安裝了一個 Ubuntu Linux 桌面的虛擬機器。接著,為了實現我的雙桌面目標,我在 Ubuntu 虛擬機器中安裝 VirtualBox 客端額外功能(Guest Additions),以便啟用無縫模式以及共用資料夾功能。

《國家與認同:一些外省人的觀點》讀記

這本書的編採內容,頗有濫芋充數之嫌。前半本是濫芋,後半本的論述內容才有深度可言。

More about 國家與認同
你以為懂,其實也不一定懂很多的外省人。 國家與認同 總序

「外省人」族群,只有從本省人的角度來看,其定義才是「明確的」。欲跳脫本省人觀點而得到客觀的「外省人」定義,係椽木求魚。

要我來說,那就按照台灣近代經濟史來分。所謂的「本省人」就是國民政府遷台後,失去經濟優勢地位階級的那一群人;他們要鬥爭的階級對象,就是「外省人」。哈哈,雖然我不認同馬克思大部份的經濟理論。但在這種場合,我覺得馬克思經濟學的階級鬥爭論用起來十分方便。

Vala - load dynamic library / shared object

Vala 有許多途徑可以整合 C 語言程式,例如在《Vala 程式語言入門》中,我示範了在源碼層級上整合 Vala 程式碼與 C 程式碼。除此之外,我們更常面臨的情況則是要在 Vala 程式碼中調用二進位碼函數庫的內容。在這方面, Vala 也提供了適當的支持。Vala 可以透過連結或是動態載入的方式連結函數庫,調用函數庫的內容。這也讓我們易於整合既有的 C 語言函數庫。

本文首先以 C 語言撰寫一個 md5sum() 並將其存入一個動態函數庫(dynamic library, Unix界的傳統說法稱為 shared object)。再分別透過動態連結以及動態載入兩種途徑,于 Vala 程式碼中調用此函數。

黃金恆久遠,冥界也流通

週末看了《波西傑克森–神火之賊》電影DVD。當主角一行人為了前入冥界,要賄賂冥河的擺渡人時,羊男首先拿出兩張美鈔鈶擺渡人,結果擺渡人默不作聲地一把火燒了紙幣,不理不睬。羊男氣得大叫那是美金耶! 接著主角想到了先前遭遇梅杜莎時,曾經撿到了一些古希臘金幣,於是把那些金幣拿給擺渡人。擺渡人拿到金幣後,就很高興地收下了,並把主角一行人載到冥王的神殿處。這一幕劇情描繪了紙幣與金幣作為貨幣時的流通性差異。

JavaScript 與 Desktop - Desktop and WebKit

本文是《JavaScript 與 Desktop》系列最後一篇。前兩篇文章中,分別述敘了在 gjs/seed 中呼叫系統函數庫與調用 WebKit 處理圖形化使用介面的工作。

但是在這個架構中,實際上存在了兩個 JavaScript host (host 是 ECMAScript/JavaScript 規範術語,意指 JavaScript 語言解譯器寄宿的環境,故有人將之譯為「宿主」) 。一個是 gjs/seed,另一個便是 WebKit JavaScriptCore 。這兩個 host 都是獨立的環境空間,彼此之間的資源不能直接互通。例如 gjs/seed 這個 host 提供的資源可以載入 DBus 服務,調用 DBus 方法;但是 WebKit JavaScriptCore 並不提供這類資源,所以不能調用 DBus 方法。是以我們需要找出一個互通訊息的途徑,讓這兩個 host的程式碼可以互動。本文將說明其中一種基於事件觸發的途徑。

淺談每日建置、BVTs之目的

我任職的公司,今年年初時,指派我用 CruiseControl.rb 規劃了一套每日建置系統。到目前為止,已經運作了超過半年的時間。也確實解決了許多潛在的軟體開發風險,例如 簡化專案交接風險

不過隨著人員更迭,我時常要對新進員工灌輸每日建置系統的用處。本文就是我每次都會對新進人員說一遍的內容。

中華民國貪污教戰守策 - 由陳水扁二次金改案判決書得到的啟示

免責聲明:本教戰守策之內容,僅適用於中華民國。若於中華民國以外區域,按本守策內容行事因而獲罪者,自負其責,與本人無關。閱讀本守策的人士,須自行承擔風險。

台北地方法院十一月五日宣判二次金改案結果,陳水扁獲判無罪。吾觀判決書內容,欣喜若狂。概因判決書內容大開貪污後門,誠為獲利捷徑。吾心有所悟,特著教戰守策二條。凡我中華民國民意代表與公務員,若能循此教戰守策之指示行事,勤勉不懈,則榮華富貴,指日可待。

Ruby 語言與特定領域語言(DSL)

在 Ruby 語言為人樂道的諸多能力之中,支持 特定領域語言(DSL) 是表現突出的一項能力,也是 Ruby 語言諸多特性融合後的精華。 DSL 在 Ruby 語言的應用程度,有如 Template 在 C++ 語言的狀況。Ruby 語言中的諸多工具,都是應用 DSL 的形式體現,例如 Ruby on Rails, Rake, RSpec 等等。