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 上。

D-Bus service activation

當一名程序員實作了一個 daemon 時,他將會面臨一個關於系統啟動流程的問題。他要如何安排啟動流程,才能正常地啟動他的 daemon? 要放在 init.d 嗎?還是放在 rc.local?再者,每種 Linux 或 BSD 系統的啟動流程都有差異,更是為這項工作增加不少負擔。而 D-Bus service 的運作模式基本上也是一個 daemon ,所以當程序員實作了一個 D-Bus service 後,按理也是要為安排啟動流程煩惱。

所幸 D-Bus 有一個 dbus daemon launch helper 的功能,可以免除程序員安排 D-Bus service 啟動程序的困惱。只要按照 D-Bus 規格上說明的方式,寫好 .service 文件,dbus daemon lauhcn helper 就會在使用者呼叫指定 D-Bus service 時,自動啟動該 D-Bus service 程序。程序員不必煩惱 D-Bus service 程序的啟動問題。

How to change Ubuntu loading splash/background in Ubuntu 10.04

Ubuntu 10.04 採用 Plymouth 取代 xsplash ,所以 Ubuntu 9.10 及以前版本的啟動畫面修改方式全都不適用。但是 Plymouth 提供了更簡單的修改方式。

Ubuntu 10.04 的 Plymouth 設定文件都放置在 /lib/plymouth 目錄內。與主題樣式有關的設定文件放置於 /lib/plymouth/themes ,預設主題樣式文件為 default.plymouth。其內容大致如下:

[Plymouth Theme]
Name=Ubuntu Logo
Description=A theme that features a blank background with a logo.
ModuleName=script

[script]
ImageDir=/lib/plymouth/themes/ubuntu-logo
ScriptFile=/lib/plymouth/themes/ubuntu-logo/ubuntu-logo.script

觀其內容,稍有經驗的使用者應該很快就能理解該如何下手修改了。

How to change grub2 background in Ubuntu 10.04

Ubuntu 10.04 採用 Grub2 作為啟動管理程式,同時也大幅改寫了設定文件的內容。這讓使用者更容易改變 Grub 的主題樣式(背景圖案與文字顏色)。

Ubuntu 10.04 的 Grub2 主題設置文件是 /etc/grub.d/05_debian_theme。Ubuntu 10.04 大幅改寫了 05_debian_theme 的內容。預設情形,它會去尋找 /usr/share/images/desktop-base/moreblue-orbit-grub.png 作為 Grub 的背景圖案。一般使用者只要將背景圖檔複製為 /usr/share/images/desktop-base/moreblue-orbit-grub.png ,再執行 sudo update-grub2 即可。