我上週末參加在高雄舉辦的 ICOS 2010 開放源碼國際研討會。原定是五六日三天(9/17 ~ 9/19)的活動,但最後一天碰到凡那比颱風侵台,週六時就宣佈最後一天的議程取消。今年的 ICOS 難得辦一次大規模活動,卻碰到颱風提早結束,十分可惜。
話說颱台登陸那天,高雄也是災情最慘重的區域。我家停了一整天電,完全接收不了外界的消息。第二天恢復電力後,才從電視新聞中得知我所居鄉鎮超過一半區域淹水,我家十分幸運地位在那沒有淹水的一小半區域。現在想來,我也算十分幸運了。
前幾天心血來潮,在網路拍賣的二手書店上淘書,意外地找到臺灣銀行經濟研究室出版的經濟學名著翻譯叢書之《經濟思想史》上、下兩卷,譯者是周憲文先生,民國71年出版。
臺灣銀行經濟研究室出版的經濟學名著翻譯叢書,我以往只在各大學的圖書館內看過,流出不多。我從未在市面上看過這套叢書。其中有不少名著,至今仍無其他中譯版本,更顯珍貴。
php dbus 0.1.0 (Derick's php-dbus) 仍然在發展階段,其中還有許多待解決的問題。故目前使用時,可能會碰到許多意外事件。本文整理了我的使用經驗,可為 PHP 程序員以 php-dbus 撰寫 DBus 服務之參考。
本文收集的內容是安裝 Debian/Ubutnu 作為 VirtualBox Guest OS 的情形。如果你的 Guest OS 是 Windows 系統,本文對你無用。
- 安裝客端額外功能(Guest Additions)
- 滑鼠整合沒作用(Mouse pointer integration not work)
- 螢幕解析度可調整項目變少了
- 掛載共用資料夾
上週參加了每年慣例的 IBM 開發者大會。Innovate 2010 IBM開發者大會活動主頁。從 2007 年的 Jazz 、2008 年 Rational Team Concert、一直到今年的主題「Let's build a smarter planet」,仍然聚焦在團隊的協同開發工作。這一點也不令人意外。軟體系統的複雜度與日俱增,軟體開發的工作早就脫離了單一平台、單一技術、單一開發者就能獨力完成的時代。由複數成員組成開發團隊,完成一項專案已經是常態現象。而《人月神話》一書中提到團隊成員愈多,則互相交流的活動量就愈頻繁,溝通成本也就愈高。因此能夠降低溝通成本,有效協同團隊成員活動的工具,自然就日益重要了。
不過連續說了這麼多年的協同開發,今年的協同重點自然也不會原地踏步。從一開始談如何實現協同開發,今年已經進展到如何在協同開發的基礎上,追求軟體生產效率,改善軟體品質以及促進創新機會 (Efficiency, Quality, Innovation)。
在 Kiosk 、旅客導覽系統或門禁系統中,通常只連接有限的資料輸入設備。主要是提供觸控螢幕,允許使用者點選畫面選項,以便操作公開性的服務。進階者,則提供特制數字鍵盤、條碼讀取機、RFID讀取機等輸入設備,讓使用者輸入由數字構成的文字資料。
本文說明所用的案例,便是一個提供條碼讀取機的Web介面導覽系統,它會在畫面上顯示一個書籍感應畫面,提示顧客將書籍的背面的ISBN條碼放到條碼讀取處讀取,然後將它的 ISBN 送到後端查詢書籍資訊。
我使用了幾套 Ubuntu 10.04 版提供的音樂播放軟體,在此記錄其支援格式、播放清單評價、介面整合能力以及記憶體用量。
目的是為了我帶著 小黑(ThinkPad) X200s 筆記型電腦出門時,可以用一套最省電的音樂播放軟體聽音樂。
本文的使用環境是 ThinkPad X200s 筆電,安裝 Ubuntu 10.04 64bit 桌面版。選用的播放軟體,都是由 Ubuntu 10.04 套件清單所提供者,僅用套件管理程式即可完成安裝。
介紹
如果你知道 "C with Classes" 甚至曾經用過,那麼對於 Vala 的運作方式,想必也會感到熟悉。我認為「 Vala 是 "C with GObject" 的編譯器」 (Vala is a C with GObject compiler) 是非常貼切的介紹描述。
Vala is a new programming language that allows modern programming techniques to be used to write applications that run on the GNOME runtime libraries, particularly GLib and GObject.
Vala Tutorial
This article describes two things about Vala programming. First, how to get current time and output it as a formatted timesamp. Second, how to design custom log.
我先前介紹 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億 恐需食人造肉
。
頭版新聞顯示區域人口負成長,內頁小版面新聞顯示全球人口成長。從這兩條新聞所顯示的訊息,對制定經濟政策時的影嚮,將視個人觀點而異。
當我們將許多個體組合為一個新的個體時,按一般的個體導向程式設計模式,我們會在新個體的型態定義內部明確地描述其組合元件的來源。而控制反轉(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 語言的人還會跑去指導別人關於 Java Spring framework 的事呢?總歸一句話:人在江湖身不由己。我也是要混飯吃的,就別問我原因了。
對一位 Web 軟體開發者來說, XULRunner 是一個很奇妙的東西,因為它可以讓我們開發出來的 Web 軟體變成一個桌面軟體。當 HTML5 試圖將我們的 Web 軟體開發經驗延伸到桌面軟體開發領域時, XULRunner 將會是承載我們的夢想之引擎。對了,GtkWebKit/QtWebKit 也具有相同的能力。這件事,我已經等了10年了(Web programming)。
我的 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 ,感激不盡。
延續第一篇的教學。示範下列項目的 JNI 實現方式:
-
在原生方法中,呼叫 Java 的方法。
-
原生方法回傳新的參考型別資料。
-
在原生方法中處理參考型別陣列。
-
如何寫入資料到託管陣列(managed array)。
-
由原生方法擲出 Java 例外。
操作步驟
-
用 Java 設計一個類別,將你想要用 C/C++ 實作的方法用修飾子(modifier) native 宣告為原生方法(native method)。原生方法除了不用在 Java 程式碼中寫出程式內容外,其他都與一般方法無異,一樣可以使用 public, protected, private, static, final, synchronized 等修飾子。
-
使用 javac 編譯你剛剛設計的 Java 類別,產生 class 文件。我們將會需要透過這份 class 文件,產生撰寫原生方法所需的 C/C++ 標頭文件。
-
使用 javah -jni 讀取 class 文件,產生原生方法的 C/C++ 標頭文件。標頭文件中含有原生方法的 C/C++ 函數原型宣告。
-
以 C/C++ 實作原生方法的程式內容。我們要先自前一步驟產生的 C/C++ 標頭文件,複製原生方法的 C/C++ 函數原型宣告到 C/C++ 程式碼中。
-
使用 C/C++ 編譯器編譯 C/C++ 程式文件,建立一個共享函數庫文件 (dll/so)。
-
最後,你可以用 Java 撰寫其他程式,調用這個 Java 類別與其中的原生方法。
參考: The Java Native Interface
Programmer's Guide and Specification - Chapter 2 Getting Started
UPDATE: I have commit this code to Matthew Johnson. This bug is fixed in the version 0.7.3 of
libmatthew-java. See Debian Bug report logs - #590331.
Java D-Bus bindings requires libmatthew-java, a small JNI library, to use Unix-Sockets. We find a memory leak in libmatthew-java version 0.7.2. Here is the fixed code.
D-Bus 是一種與 CORBA, Microsoft COM/DCOM 處於相同抽象層級的行程間通訊(IPC)機制。它們將 IPC 方式抽象化到 API 的形式。一方面簡化了 IPC 需求的設計內容;另一方面,也為不同程式語言之間互相調用方法的作法提供了更易用的途徑。
當你需要用 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 。絕大多數時候,我們都將採用此一方法。