最近已經不太貢獻時間到 Debian 計畫中,雖然日常工作、辦事還是全部使用 Debian GNU/Linux。做的比較多的大概是幫忙踩地雷,跟偶爾回報一些自己常用軟體的小問題。

相較於商業軟體軟體,在自由軟體或開放原碼社群,最棒的使用經驗就是如果你碰到了甚麼問題,而且你描述得當的話,通常有機會得到開發者的注意與修正。但是你得「描述正確」。作為一個嘴砲開發者,我不甚喜歡收到毫無意義的回饋,過度熱情的回報人往往造成小開發團隊的極大困擾,數量跟質量往往成反比,而低質量的大量回報只會降低團隊士氣跟產能。如果可以的話,我希望可以收到許多高質量的回饋,也期許自己盡力這麼作。

這裡不談基本的回報問題的方式,你若用 Debian 請參考 How to report a bug in Debian using reportbugreportbug-ng,使用 Ubuntu 請參考 ReportingBugs。你若是新手,在你回報問題之前應該先讀 Simon Tatham如何有效地報告錯誤。這篇文章提供了一些基本的原則,你若碰到軟體使用的問題,應該試著按照文中的原則跟軟體開發者對話,可以避免殺死太多開發者的腦細胞,也可以幫你快點解決問題。

在先進的軟體中,不少已經內建 Crash reporter,像是 Gnome 的 Bug Buddy、Mozilla 的 Breakpad、Ubuntu 的 Apport 等等,這些工具會在你的軟體當掉時,自動收集一些系統資訊與程式狀態,並回報、收集到中央系統。這些資訊可以協助開發者收集一些技術性的資料,比「我的程式當掉了」這種回報更容易辨別錯誤所在。不過這些資訊只能提供一般性技術資料,並不方便作為直接除錯使用,大約可以利用於統計、分析軟體穩定性等加強軟體品質的用途。

若你恰巧不幸是軟體工程師,你可以試著利用 gdb 等試著收集更多資訊,甚至先進行初步的偵錯。但是我知道要求一般人重新編譯軟體加上除錯資訊等,再開啟暗黑 gdb 視窗下指令除錯,實在會嚇跑一些曾經習慣在其他平台只用 IDE 開發軟體的朋友。事實上,在 Debian 中還是有些工具可以讓你快速的進行軟體除錯,而且也有比較友善的工具可用。

你若要除錯,第一部大概是取得除錯資訊,預設的 Debian 套件是不含除錯資訊 (Debug symbols) 的,因為大部分的使用者不需要這些特別佔用空間的檔案。許多資深的 Debian Developer, 都會分別在包裝的套件時加上 Debug package,於是你可以在不重新編譯軟體的狀況下拿到同版的除錯訊息。 這些除錯套件的命名原則都是以 dbg 為結尾,例如以 Lifera 為例,你可以安裝 liferea-dbg

另外你也需要原本的程式碼,這點可以直接利用  apt-get source 指令取得,例如以下指令,系統會自動抓回你目前安裝版本的原始檔,並自動解開。
apt-get source liferea

而除錯時,你需要一個除錯工具,上述提到了 gdb 這個工具,對一些朋友說,熟悉指令的學習門檻似乎有點高,不過你若熟練 gdb 的使用技巧,可以直接利用其強大的 sciprt 功能進行許多自動化的測試或對程式直接插入命令。有機會還是應該學習一下。圖性化的使用介面亦有相當多選擇,像是 ddd 或是 KDbg 等。這裡推薦一下 Gnome 中新的工具 nemiver,若你曾經用過其他除錯工具,大概看到 nemiver 的介面就知道該何使用。它基本上就是原始碼閱讀工具加上 Call Stack, Variables, Breakpoints, Registers, Memory 等觀看與編輯工具,圖形介面非常簡單直覺。

這裡以 liferea 為例子,若你想對其除錯,可用以下指令,使 nemiver 載入 lifera 擺在 /usr/lib/debug 的除錯資訊。nemiver 會詢問你原始檔位置,你可以將其指到剛剛利用 apt-get 下載的原始碼目錄,這樣便可以一邊除錯一邊閱讀其程式碼或設定除錯點 (Break points)

LD_LIBRARY_PATH=/usr/lib/debug nemiver liferea

畫面會像是

nemiver

快快樂樂來抓蟲吧。

先前裝了 HelloTxtUbiquity Script 來用,以便於可以在 Firefox 中直接用 Ubiquity 介面來更新自己的狀態到多個微網誌。不過 Hellotxt 的 script 是針對早期 Ubiquity 版本所撰寫,因此在 0.5 版釋出後,原 Script 不相容於新 Parser 2 API,因此幾個月前就無法使用了,官方也一直未修正。於是自立自強的依照 Parser 2 API Conversion Tutorial 修正一版,可於此網址安裝或下載 patch

自己已經用了 Ubiquity 一陣子,目前使用經驗良好,值得推薦給你使用。但網路上介紹已相當多,除了 Mr6 的「開啟比 Google寬一千倍的路」目光短視的膚淺廢話不要浪費時間之外,其他的使用面介紹都可參考。這裡就不多費唇舌,你想了解基本的使用方法可以參考 Ubiquity 0.1 實際操作過程的精彩影片示範一文。

若可聽讀英文或日文,可讀 mitchoTokyo 2.0 的精彩演講 Ubiquity: Command the Web with Language 言葉で操作するWeb (簡報),mitcho (Michael  Yoshitaka  Erlewine) 現在是 MIT Department of Linguistics 博士生,之前在 Mozilla Lab 擔任研究員開發 Ubiquity。

Ubiquity 的指令與功能極多,逐一介紹極耗時,請安裝後利用 list ubiquity commands 指令取得各項功能說明。

自從新版的 Ubiquity 的 Mozilla Web Search Commands 整合了 Firefox 的 Open Search 功能後,我就可以直接用 search 指令查詢自建的 Open Search Plugins。過去雖然依照自己的需求建立了十幾個不同的 open search plugin 來找不同的郵遞論壇BTS、搜尋引擎、拍賣等,但是用滑鼠切換搜尋引擎絲毫沒有可用性可言。

新版的 Ubiquity 可讓你利用鍵盤快速搜尋所選文字,而且常用的指令會排序再前頭,也可以直接選擇文字後透過滑鼠右鍵執行該指令。因此除了內建的 IMDB, Wikipedia 外,我自己最常用得就是 amazon, aNobii, FindBook, 博客來臺北市立圖書館館藏間互查書籍,一邊在 aNobii 規劃書單,一方面在不同的地方查詢藏書。

過去查詢一本書,你得「複製」、「開啟新頁」、「連上特定網站」、「貼上」、「搜尋」等幾個步驟,現在一樣是選取可以直接用右鍵選擇該服務,或者叫出 Ubiquity 的搜尋介面鍵入該服務名稱即可,也避免在複製貼上間還得找網頁的輸入欄位。剪貼行為總是很快讓我進入昏睡狀態。

另外一個值得提的指令是 Marcello Herreshoffcreate search command,之前建立自己的 Open Search plugins 程序其實有點複雜,即便利用 Ready2SearchSearch Plugins Generator 等工具也需要一些步驟。這個指令只要選定一個搜尋欄位,鍵入 create search command 名稱 就會自動產生一組 Ubiquity 專用指令,一行程式都不需要寫!非常好用。另外你也可以利用 create bookmarklet command 把你常用的 bookmarklet 轉成 Ubiquity 指令。

即便我自己最常使用的還是搜尋引擎等指令,但是我相當看好 Ubiquity 的未來發展。不少人認為 Ubiquity 僅多提供 Web 的 CLI 的介面,也有些人質疑指令列根本就是走退路,未能體會 Ubiquity 的多國自然語言介面設計理念。

事實上,對電腦下命令不難,難的是背指令後依照指定語法下命令。

CLI 介面最令人畏懼的是得背下指令名稱,還得依據其指定之語法給予參數。而多國自然語言介面的設計用意就是,讓使用者盡量用熟悉的口語方式給予指令,不讓使用者強記。替代日漸繁雜的選單與功能列,取而代之是選取文字後使用「search this with Findbook」、「到 Findbook 查這個」的這種指令方法。

在新版 Ubiquity 的 Parser 2 中,Ubiquity 帶入semantic roles 的指令設計,搭配先前設計的名詞詞性 (Nountypes),可以更精確的分析使用者欲執行的指令。再研究過眾多語言的文法架構後,在語意分析器設計上也可有彈性的適應於不同語系,現在你可以依照自己的語言特性設定 Branching、斷詞等方式,讓分析器再判斷完介係詞、分隔字後正確判斷文句意義。因此未來除了現有的英文語系之外,你也可以使用中文來下達指令,再接下來的計畫中,也會納入 Command chaining,於是或許接下來你就可以直接對電腦說「到 Findbook 查這個並寄給 Rex」這種語法。

不少人拿 Ubiquity 跟一般桌面的 Launcher applications 作比較,像是 MacOS 上的 Quicksilver 介面,或 Linux 上的 Gnome-Do 等。但是桌面系統的特性畢竟跟網頁略有不同,許多桌面工具並非文字導向,應用上並沒有像網頁間互相傳輸字串那樣自然。

我最期待的幻想其實是希望這套系統可以置入行動裝置,並結合語音辨識功能。雖說現在許多智慧型手機已內建語音辨識,但常常都還只是啟動電腦或直接撥打電話這樣程度的應用,軟體若可以知道自己接受哪些參數,或許就可以利用觸控螢幕輸入欲傳送之「物件」(object) 並用語音給予指令了。這樣的應用相對只需要聽懂指令,可以避免以語音給予「物件」數值時容易聽錯的缺點。

最近,追蹤了一些在 HTML5 draft 上的新規格,試著想跟上一些更動,一方面嘗試新 API 的用法。基於 HTML5 的強大功能,未來只用 HTML 與 Java Script 便可以實做出許多的網頁版本的應用軟體,在行動裝置如 iPhone, Palm webOS 上已經有許多軟體或小遊戲之實做。其中一項感興趣的功能是離線 Web Apps 的應用。這篇文章稍微紀錄一下相關的規格。

若想進一步瞭解 HTML5,可參考 Google 的 Brad Neuberg 的演講 Introduction to HTML 5Ian HicksonHTML 5: Features you want desperately but still can’t use 的展示。Ian Hickson 是 Web Applications 1.0/HTML 5 specification, CSS 2.1 的規格作者之一,也是 Acid2, Acid3 的維護者。

Offline resources

離線網頁的第一個問題,是必須使頁面中所使用的各項網頁、圖片先行快取於系統中。欲達到此目的,規格中定義了一個 manifest 宣告機制,你必須在此檔案中宣告所有欲快取之檔案列表。規格中亦定義了一組 Application Cache API,使你知悉目前快取狀態。

Offline resources 功能已經包含於Gecko 1.9.1/Firefox 3.5 中。

Online and offline events

若要作離線程式,第一個要判斷的可能還是網路連線狀態,雖說有時會是電腦依然接在網路上,但是卻連不上網路的狀態,但是若系統可以自行告知目前連線狀態,就可以省下不停確認連線狀態的白工。在 Debian GNU/Linux 上,若使用 NetworkManager,瀏覽器如 Iceweasel 會自動依照網路狀態切換狀態。

關於連線狀態之規格定義在 Browser state API 中,在 Firefox 3 中已可取得連線狀態改變通知

Client-side Storage

關於儲存離線使用的客戶端資料,在不同的瀏覽器中有不同的作法。像是早期 Firefox 2 (與 IE8) 的 globalStorage、Microsoft’s userData、Flash storage、Google GearsDatabase API 等等。原則上有兩種形式,一是 key-value 為主,另一種則是 SQL 語法導向,在 HTML 5  中有兩份規格,可以用來儲存離線使用的客戶端資料,一為 Web Storage、另一則為 Web Database

Web Storage 即為 key/value 形式的 API,在 Firefox 3.5 後已可使用相容於規格的 DOM Storage API. 而 Web Database 則提供給開發者利用 SQL (SQLite) 的語法直接管理資料庫,但除了特別需要搜尋功能外,我其實頗懷疑還有多少人願意用 JS 寫 SQL 語法。目前尚未見到 Firefox 實做 Web Database API,類似的 API 是 mozilla.org/storage/service,此 API 只能提供給 Firefox Extension 使用,尚無法直接應用於網頁中,網頁中必須透過 XPConnect取得權限才能使用。實際的作法可以參考 Klaus Förster 的 Offline SQLiteSVG database applications with Firefox 一文。

Other APIs

雖說目前已有較新的瀏覽器開始逐步支援 HTML 5 規格,但是基於跨平台的考量,目前最方便的 API Framework 應該暫時還是 Google Gears。這麼說得主要原因是因為其支援眾多平台,Firefox 1.5 之後、Safari 或者 IE6 以上皆可支援,甚至也支援一些 Windows Mobile 5 或 Android 平台,自然 Google 自己的 Chrome 瀏覽器也是內建支援的。跨平台支援,大約是網頁開發者最想避免的痛苦之一吧,在 HTML 5 普及前,若你願意使用 Database API 的 SQL 語法,Google Gears 可以減輕一些痛苦。另外 Google Gears 比 HTML 5 還好一點的特色是,Database API 讓開發者直接作全文搜尋,此乃利用 SQLite 的 fts2 模組。

或者,也可以利用一些 Java Script Library 來避開平台問題,讓 Library 自己選擇適當的儲存機制,像是早期的 Dojo Offline ToolkitPersistJS,或者我自己比較偏好使用的 jquery-jstore

新版的 Google Gears 0.5.21 (Released May 29, 2009),還支援 BlobCanvas。Blob 可以讓你在瀏覽器中存取一些二進位的檔案。Canvas 最大的用處大概是拿來縮圖,並另存檔案吧。0.5.21 中也增強了 Desktop API,Desktop API 除了最強大的製作捷徑 (createShortcut) 功能外,也新增了猜(圖片)檔案格式的 extractMetaData,跟可以處理檔案拖拉進瀏覽器處理的 getDragData。

目前的狀況,若想直接使用 Google Gears 同步網站資料,依然需要自己花費一些精力配合自己的伺服端 API 整合設計。一個需要考量的技術瓶頸是得避免同步抓取時,使網頁下載、解讀速度變慢,影響使用者的使用經驗。雖然這個問題可利用 WorkerPool 進行背景下載 (見 Google Gears 架構之  Background Sync),但依然必須攥構一快取與同步機制。

我更感興趣的是 Vladimir Vukićević 所提出的看法,他提議或許可用 CouchDB 來處理資料儲存的問題。而 Atul Varma 發表了他的新嘗試 BrowserCouch,用 Java Script 重作 CouchDB 的 API,目的是若上線狀態,可將資料存進「雲端」,而離線則可用本地快取。這種作法相當接近我期待中的系統架構。

最近為了在網頁中使用一個 C Library,從頭寫了一個 PHP PECL Extension。期間自然做了一些調查與研究,在此寫下供其他朋友作為參考。

首先應瞭解開發 PECL 時,一些必要得知識,像是基本的 Zend SAPI、每個模組的生命週期、記憶體管理、ZVAL 參數的取得等等。關於這方面的知識,除了已經相對太舊的Zend API – Hacking the Core of PHP 外,Sara Golemon 算是著述的較多的開發者,他甚至出了一本書叫做《Extending and Embedding PHP》,去年在 ZendCon 2008 也談過一次 PHP Extension Writing

不過要完成一個 PECL Extension,大約不需要讀完一本書,Sara Golemon 在 2005 年時亦在 Zend Developer Zone 發表幾篇詳盡的技術文章,說明了最重要的幾個重點,讀過跟著做一次,大約就可以熟悉一些基本的技巧。我並沒有發現 Zend SAPI 的詳細文件,因此必須再翻翻 /usr/include/php5/Zend 下的 header files,看看其他 core extensions 的程式碼,大概就可以掌握完成一個 Extension 的知識。

Sara Golemon 的幾篇經典文章是

英文若嚥不下,或可參考 Huang Shiqiang簡體中文翻譯。Huang Shiqiang 尚做了一個以 C 為基礎的 PHP Framekwork – Kiss (計畫網頁),頗有趣。以效能為出發點的 framework 或 template engine 還有 Blitz 等。

讀過文章,瞭解基本的概念之後,就可以開始動手寫程式。首先,你得有開發環境,包含編譯檔案、目錄結構、文件封裝機制等。你自然可以動手複製一份別人的來改,或者你可以依照 PHP Manual 中的說明利用 ext_skel 來產出一個空白的專案。我自己是利用功能相較完整一點的 CodeGen_PECL。利用 Pear 裝好後,就可以利用 pecl-gen 生出一份空白的專案。

PHP Extension 預設利用 phpize 來自動生成 autotools scripts,對開發者來講,若要新增編譯參數或增加原始檔案,只需要增修 config.m4 中的內容即可,不用管整套的 autotools scripts,算是相當方便。config.m4 是用 m4 這個 macro processor 來處理,語法這裡就略過不提了,編譯文件應相當好找。

撰寫一個 Extenstion 的知識大概是這樣。補充說明,上述文件沒有提到的 PHP5 中的 Reflection API,你可以為每個函式加上 arginfo,可以方便一些工具自動取出這些 API 來用,作法請參考 Christian WeiskeHacking PHP5

另外一個值得一提的是做 Unit Testing 的方法,養成寫 test case 是維持軟體品質的好習慣。你若用了 phpize,系統應會自動生成 run-tests.php 等自動測試工具,你可以依照其設計寫一些自動測試的案例,每次編譯後可 make test 做自動測試,確保運作正常。在 IBM developerWorks 上有一篇淺析 PHP 官方自動化測試方法,值得一讀。

最後補充一點,這次我寫的延伸函式庫乃是 C 語言,若欲整合物件導向的  C++ 函式庫,可參考 Wrapping C++ Classes in a PHP Extension 一文。

這兩日試玩幾個 clutter 為基礎的軟體,像是 mutterGnome Shell 時,發現在我的 X200 上畫面的反應極慢,根本爆慢到了不堪用的地步。翻查了一陣子之後,知道大約是 Intel 顯示卡驅動程式 (GM45) 中的 sync-to-vblank 問題。

根據 Emmanuele Bassi說法,若安裝了新版的 Intel driver,必須開啟 KMS (kernel mode setting) 後,驅動程式才會有正確的 sync-to-vblank 行為。

這個問題大約從 Clutter 0.2 之後就開始了,影響到所有的 Clutter 為基礎的軟體,像是 Gnome 的接龍遊戲 (/usr/games/sol-clutter) 等等,若啟動接龍遊戲後畫面速度極慢,大約就是這個問題造成的。

正確的解決方法是啟用 KMS (作法: Debian, Ubuntu)。

若暫時不想啟用 KMS,你可以在環境參數中設定CLUTTER_VBLANK=none,如

# echo "CLUTTER_VBLANK=none" >> /etc/environment

然後重新啟動 X 即可。

Last weekend (2009 10/17~10/18), I went to Yahoo Open Hack Day Taiwan. The event seems has been become a big PR issue of Yahoo, only because a few minutes of lap dance.

Before I talked about what I feel about lap dance as a developer joined this event, I like to share about what we did in this event. As a team with hychen, tusng and honki, we were thinking about implement a self-learning web site, which provides a bookmarklet or plugin to let you look up the English words. And also help you to convert unfamiliar word on computer into physical flash card. But after we got there, we found this web site does not really use any Yahoo!API. :p

So, we pick up another idea from my never-have-time-to-start TODO list. We called it Synker,the original idea is to help people sync photos from any social network website into their own Google/Yahoo contacts. But we don’t want to have an avatar, we like to have photos with really face of our contacts. So we only use photos with face identified by integrated face detection technology. If you use these contact services on your phone, you will find it extremely useful when you try to remember someone when he/she calls.

After changed the idea, we start to implement it at Saturday afternoon. And finally we do can login with Yahoo account, download the contacts and find possible photo from Wretch profile and albums. It’s quite slow but it works. We tried to find Wretch girls hired by Yahoo as staffs to be our beta testers, it turns out that much of people don’t really use Yahoo! Contacts or Yahoo!360 lately. So most of the contacts are added very long time ago when YIM is still popular in Taiwan. For the local Wretch users, it might be much more useful if we can help them link their wretch users back to Yahoo contacts. However, Synker should be a service to help people sync photo into different contact service, the web site is now still a prototype, we might finish it later when we are available.

However, we did not win any award. Thanks to Erik Eldridge, at least we are mentioned in his favorite hacks list. But still, I have a lot of fun work with my teammate to implement a web site from scratch. I do enjoy to get tired, beard grown and smelly with friends after a non-stop 24 hours hacking. It’s exciting to experience issue and fix them together. It’s fun and we never stop laughing.

Thanks to Yahoo for organized this event. Without this event, I probably won’t get any chance to study Yahoo!APIs, and work with my friends on these APIs all day long. Thanks!

Sexism ?

So, many people feels women are offended, and they said sexism is bad for creating an inclusive environment in industry. I have to say please don’t judge the organizer before you understand the local culture. Applying your own viewpoints to the other side of earth is globalism, which does not help to create an inclusive environment.

As a developer staying there for the whole event, I don’t see the any lady are offended. But we, the shyly nerds are probably more insulted. :p

One my the other female friend XDite, she has been attend to Yahoo Open Hack Day since last year. She has same feeling as I do, we don’t feel it’s offending women. The dancing show is only a few minutes. We disliked it because it’s very annoyed for developers, since we have been coding for hours, a loudly music and dancing show just make us headache. It’s just annoying as the anchorwoman made some stupid jokes and asked developers to dance before the warding ceremony. It’s perhaps humiliated us much more then the dance girls.

Seriously, No! There are many female staffs around and many of the many of the top managers of Yahoo!Kimo Taiwan are female! And also the other female members in the other team. I don’t see there is any sexism issue in Yahoo and this event. However, I can understand why they like to have the dancing show, one for cheer the developers up after long time work, the other reason is to satisfy the local sick mass media.

The dancing show is only a few minutes, not the major part of the event. And we don’t care about the show, since we are really busy on get the things work. And yes, the kind of entertainments are expected in many IT events. It might comes from the history of southerns Taiwanese funerals and temple fair. People think it’s important to entertain Spirits, and living people, so they hire strippers to dance in public. It’s a symbol of supplicatory.

And somewhat this kind of traditions infected the IT event, but much more refined. Now, without Show Girls in a IT event, you will never get reported on local mainstream media. And this kind of tradition are spread in the world, which you can see many show girls on the online IT web sites.

It’s now become yet another industry for provide profession performing in IT events (commercial IT events does not mean open source software conference or hackathon). In addition, the dancing girl are professional dancers, they are not just boob girls or some woman found from the strip club. They are payed as profession for performing. I meant is creating something with your mind is much respectable then creatively with the body ? And what’s wrong that these ladies choose dancing as profession, is that one of talents should be appreciated ?

If you ask my opinion, I dislike this kind of arrangement it’s because it disturbed me. And don’t blame Yahoo, it’s totally not an issue of sexism of the event, you idiot. It’s about the sicked (local and global) media. Please go fight with the mainstream media if you think they are sexist, and many Taiwanese are already doing so.