PHP D-Bus 與 Gearman 之比較

我先前介紹 php-dbus 時,曾捎帶提及 PHP 還支援 Gearman 與 WebSphere MQ Series 兩種訊息匯流排架構。前幾日,便有位同事問我關於 Gearman 的事,他參考的文章則是 jaceju 的《Gearman 心得 》。 我們公司主要是使用 D-Bus 架構,他也熟悉 D-Bus 。我們公司運用 D-Bus 的途徑,大致如《D-Bus 用途說明》所述,將其作為 API 機制。他在試用 Gearman 後,說 Gearman 不能傳 object 、方法的調用敘述不像一般函數,用起來不方便。

我看了 jaceju 的《Gearman 心得 》後,就手癢用 php-dbus 寫了一個相同的範例程式。有興趣的人,可以看看這篇文章和 jaceju 那篇,比較一下 D-Bus 與 Gearman 的程式風格差異。

人口與生育率,我們看的是牲畜還是人?

今日各大報的頭版,幾乎都是台灣生育率連續減少,人口提早負成長的新聞。聯合報:我人口提早負成長 - 總生育率今年破1人,112年人口不增反減。自由時報:生太少 2023年人口負成長。中國時報:生太少!民國111年 人口零成長。 另一方面,翻到內頁,我又看到在不太起眼的版面上,報導全球總人口持續增長,科學家發表研究表示未來恐怕要研發人造肉品,才能防止饑荒。聯合報:防饑荒 科學家研發人造肉。自由時報:40年後人口達90億 恐需食人造肉

頭版新聞顯示區域人口負成長,內頁小版面新聞顯示全球人口成長。從這兩條新聞所顯示的訊息,對制定經濟政策時的影嚮,將視個人觀點而異。

PHP 實作 IoC/DI 設計模式

當我們將許多個體組合為一個新的個體時,按一般的個體導向程式設計模式,我們會在新個體的型態定義內部明確地描述其組合元件的來源。而控制反轉(IoC) 又稱依賴注入(Dependency Injection)模式,則將組合元件的來源從定義內部挪到定義外部。在靜態型別程式語言中, IoC 設計模式有相當重要的地位。在 Java 世界中重要的 Spring framework 就是因為採用 IoC 為核心設計模式,才突破 Java 語言的僵固狀態,為那些 Java 教士帶來新的福音。不過在動態型別程式語言中,實現 IoC 設計模式倒是一件簡單的事,我們不會特別注意它,甚至不會想到原來自己用了 IoC 設計模式。

日前公司同事找我討論在 PHP 實作 IoC 模式的問題。因為他之前寫 Java 程式,接觸 Spring framework 後,覺得那實在是很棒的東西,也想用 PHP 寫一套出來用。我對他說,PHP 要實作 IoC 不會很難,但是你不會感受到 Java 加上 Spring framework 之後生產力突飛猛進的雀躍感。在討論過程中,我順手用 PHP 寫了一段採用屬性注入(setter injection)的 IoC 類別與範例。實作時間不到二小時。這個 IoC 類別基本上模仿了 Spring framework ,所以本文說明時的用語,將會借用 Spring framework 的用語。

Java Spring framework 開發人員面試題

日前我指導公司一位新進人員學習 Java Spring framework 的基礎觀念。在這個過程中,我留意到 Java Spring framework 一些相當基礎而簡單的觀念很適合設計成問答題。所以我設計了三道連環的試題,檢視開發人員是否真的搞懂了。

唉,為什麼我這個討厭 Java 語言的人還會跑去指導別人關於 Java Spring framework 的事呢?總歸一句話:人在江湖身不由己。我也是要混飯吃的,就別問我原因了。

Hello HTML5 and XULRunner

對一位 Web 軟體開發者來說, XULRunner 是一個很奇妙的東西,因為它可以讓我們開發出來的 Web 軟體變成一個桌面軟體。當 HTML5 試圖將我們的 Web 軟體開發經驗延伸到桌面軟體開發領域時, XULRunner 將會是承載我們的夢想之引擎。對了,GtkWebKit/QtWebKit 也具有相同的能力。這件事,我已經等了10年了(Web programming)。

監聽 NetworkManager 的設備異動訊號,執行指定行為(設定 eth0~1)

我的 ThinkPad 安裝 Ubuntu 桌面系統,配合使用需求,我的有線網路設備除了啟用 DHCP 之外,還額外設定了虛擬介面連接內部網路。概略如下列所示:

eth0    inet addr:(DHCP)

eth0:1  inet addr:10.1.2.3

但是,因為我的網路設備是由 NetworkManager 所管理,基於 NetworkManager 以及筆記型電腦的操作特性,每當我切換桌面使用者亦或是筆電進入睡眠狀態,都會導致網路設備重置,使得 eth0:1 的設置消失。為此,我寫了一個小程式,透過 NetworkManager 提供的 D-Bus 服務,監聽 eth0 主設備的狀態,每當 eth0 被啟用亦或重新啟用,都能立即執行 ifconfig 設定 eth0:1 。

附帶一提,希望有人可以教我如何在 NetworkManager 中設定 eth0:1 ,感激不盡。

Java Native Interface with C tutorial, part 2

延續第一篇的教學。示範下列項目的 JNI 實現方式:

  • 在原生方法中,呼叫 Java 的方法。
  • 原生方法回傳新的參考型別資料。
  • 在原生方法中處理參考型別陣列。
  • 如何寫入資料到託管陣列(managed array)。
  • 由原生方法擲出 Java 例外。

Java Native Interface with C tutorial

操作步驟

  1. 用 Java 設計一個類別,將你想要用 C/C++ 實作的方法用修飾子(modifier) native 宣告為原生方法(native method)。原生方法除了不用在 Java 程式碼中寫出程式內容外,其他都與一般方法無異,一樣可以使用 public, protected, private, static, final, synchronized 等修飾子。
  2. 使用 javac 編譯你剛剛設計的 Java 類別,產生 class 文件。我們將會需要透過這份 class 文件,產生撰寫原生方法所需的 C/C++ 標頭文件。
  3. 使用 javah -jni 讀取 class 文件,產生原生方法的 C/C++ 標頭文件。標頭文件中含有原生方法的 C/C++ 函數原型宣告。
  4. 以 C/C++ 實作原生方法的程式內容。我們要先自前一步驟產生的 C/C++ 標頭文件,複製原生方法的 C/C++ 函數原型宣告到 C/C++ 程式碼中。
  5. 使用 C/C++ 編譯器編譯 C/C++ 程式文件,建立一個共享函數庫文件 (dll/so)。
  6. 最後,你可以用 Java 撰寫其他程式,調用這個 Java 類別與其中的原生方法。

參考: The Java Native Interface Programmer's Guide and Specification - Chapter 2 Getting Started

D-Bus 用途說明

D-Bus 是一種與 CORBA, Microsoft COM/DCOM 處於相同抽象層級的行程間通訊(IPC)機制。它們將 IPC 方式抽象化到 API 的形式。一方面簡化了 IPC 需求的設計內容;另一方面,也為不同程式語言之間互相調用方法的作法提供了更易用的途徑。

dbus-glib bindings 入門磚

當你需要用 C 語言實作一個 D-Bus 服務時,你有兩種選擇。其一,使用 D-Bus Low-Level API ( D-Bus Low-Level API Tutorial)。但是 D-Bus 開發人員強烈建議我們不要使用這種方法 (WARNING: you should NOT use this API unless you absolutely have to.)。其二,使用 dbus-glib bindings 。絕大多數時候,我們都將採用此一方法。

XDG規範概念說明

近年的 Linux 桌面環境,處理桌面應用程式選單與項目,依循 FreeDesktop 規格:

XDG Menu 支援樹狀選單結構 (menu tree),樹狀選單的每個節點,都允許包含多個分類項目(category)。選單的葉子則是應用軟體(application),它們與分類項目連結。選單結構描述於 .menu 文件中,選單內容描述於 .directory 文件,應用軟體的內容描述於 .desktop 文件。

使用關係: .menu -> .directory -> .desktop

透過 JavaScript,Ruby,PHP,C# 語言,理解 Java 的 Lambda 語法

日前 OpenJDK 發表了第一版的 Java Lambda 語法 (First Version of Java Lambda Syntax Sparks Debate),語法好壞,爭論不斷。本文分別列出了以 JavaScript, PHP, Ruby, C# 語言模仿 Java Lambda 範例的程式碼。

在數學中,lambda 有一個嚴謹的定義。但在是程式語言中,lambda 有另一個更廣泛的理解,即「匿名函數」(anonymous function)。在大多數程式語言中,根本沒有區分 lambda 與匿名函數,因此有些程式語言用 lambda 稱呼,有些程式語言用匿名函數稱呼。本文使用了五種程式語言,所以在稱呼上,會夾雜使用 lambda 與匿名函數。

Hello Autoconf, the GNU Build System

Autoconf solves an important problem—reliable discovery of system-specific build and runtime information. The GNU Build System

一名資深的 Linux 程序員,應該很熟悉下列的軟體源碼安裝動作:


./configure
make
make install

configure 是由 GNU 軟體建構系統產生的自動組態指令稿,它可以檢查源碼編譯前的相依項目,並按照系統環境產生搭配的 Makefile 。所以使用者可以用相同的操作指令,完成軟體源碼的編譯動作。本文將以一個 hello 程式為例,說明如何產生符合 GNU 軟體開發指南的 configure

高度科技產業,低度管理思想

鴻海富士康廠區,連續且密集地發生12起「非正常死亡」事件,引起世人注目。在我看來,這整起事件曝露了台灣高科技產業在管理上的通病。亦即「高度科技產業,低度管理思想」。

想跳就跳,加入富士康

Autoconf 檢查額外函數庫

日前處理一件工作,用 C 語言引用另一家廠商提供的 SDK 開發一套小工具。身為一個專業人員,按照 GNU 軟體開發指南,我們的 C 程式碼,應該要透過 Autoconf/Automake 完成建置前的組態工作。於是我進一步地使用 Autoconf 工具完成完成軟體建置環境的檢測與生產的組態文件。

然而我在將第三方廠商的 SDK 檢測動作加入 Autoconf 流程時,碰到了麻煩。為了處理這件事,花了我一整個工作天解決。令我不禁抱怨 GNU Autoconf manual 的內容編排內容實在很糟糕。本文記錄了在 Autoconf 中,如何檢查建置軟體時所需的額外標頭檔與函數庫。

就地(不用額外記憶體)把字串反向

前陣子,有位同事看了《約耳趣談軟體》(Joel On Software 中譯版),就作者提到面試人員教戰守則中的第一道程式問題向我請教。那道題目是「就地(不用額外記憶體)把字串反向」。同事不熟 C 語言,不了解作者為何說不懂指標的人,解這題一定會錯。所以跑來問我。

這道問題難就難在「不用額外記憶體」的條件。再者,就算面試者用了指標,我仍然可以就 C 語言的意義挑毛病,指出光用指標無法滿足「不用額外記憶體」的條件。如果只是從 C 語言的角度思考,僅用指標寫不出滿足條件的字串反向程式。面試者還要能從組合語言的角度思考,才能向出題者解釋他的程式確實滿足條件。

體驗 HTML5, CSS3 功能的好地方

Firefox, IE, Opera, Chrome 等瀏覽器,都在高喊 HTML5, CSS3 。但是 HTML5, CSS3 到底有何特異功能,讓大伙們趨之若騖? 微軟提供了一個網頁: Internet Explorer 9 Platform Demos 讓我們體驗 Web 的未來趨勢。雖然這是微軟為了測試 IE9 所設計的網頁,但我用 Firefox 3.6, Opera 10.1 去看,也是玩的很愉快。畢竟 Firefox, Opera 瀏覽器跟隨 HTML/CSS 標準的起步,比 IE9 要早太多了。

內行看門道,外行看熱鬧。一般人可以在該網頁上看看未來的 Web 應用軟體的 UI 設計趨勢。內行的設計師,請記得一定要多用檢視網頁原始碼的功能,把那些新功能全都學起來。

利用 X 字體別名,讓 Linux 桌面環境顯示文件中的標楷體、細明體與黑體

假設我今天在微軟 Windows 系統內,用 OpenOffice 編輯了一份文件,其中的字體設定為標楷體。當我把這份文件拿到 Linux 桌面環境上開啟時,我將發現文件中的字體,全部都無法以楷體顯示。這是因為在 Linux 桌面環境上,並沒有安裝標楷體這套字型。

絕大多數人的解決方式是,將 Windows 系統中的標楷體字型檔案,複製到 Linux 桌面使用。但是就法律層面上來看,此一行為係著作權的侵權行為。微軟並未授權使用者於 Windows 系統之外單獨使用標楷體的權限。

然而,我們是真的非要標楷體不可嗎?未必。設定字體的動作,我們可以用抽象些的方式描述:「這些字要用楷書字體顯示」。重點是楷書,不一定要哪一家。而 X Window 的字型系統有一個非常有彈性的別名功能,可以讓我們指定哪些字體可以使用什麼字體顯示。例如,我們可以告訴 X Window: 『當你碰到一份文字要顯示「標楷體」時,你可以用「全字庫正楷體」顯示它們。看到「細明體」時,則用「全字庫正宋體」顯示』。如此一來,我們就不需要為了顯示文件中的字體,而買一大堆相似的字型檔案。

How to change GDM background/theme in Ubuntu 10.04

GDM 2.20 版之前,登入畫面的 UI 程式是 greeter ;GDM 2.24 版本之後,登入畫面的程式改成 gdm-simple-greeter。兩者的主題設定方式完全不同。由於 Ubuntu 9.10 之後採用的 GDM 版本已經升級到 2.28 以上,故 Ubuntu 9.10 之後無法使用 GDM greeter 的主題套件。

不幸的是,目前絕大部份的 GDM 主題套件,都是 GDM greeter 適用的。例如 GNOME ART Themes / Login Screen 提供的主題套件,就是提供給 GDM greeter 用的。所以在那裡取得的 GDM 主題套件,不能用在 Ubuntu 10.04 上。