應徵工作,竟碰到2個近十年不見的熟人,高雄真小

昨天去某家進駐高雄軟體園區的公司應徵工作,沒想到來面試的幹部一見面就問我還記不記得他。我一看還真有點印象。他又提了個人名後,我才想到他是我大學網路策進會社團朋友的同學,當年在學校中有過數面之緣。

面談結束後,我剛走出會議室,竟又到有人喊我 "Rock!",這是我在大學時代混網路的 ID。我又嚇一跳。不會吧,又有人認識我。回頭一看,嗯,是個有印象的熟面孔。一問之下才想起他是我大學網路策進會社團的學弟。沒想到在一間辦公室中,竟碰到2個近十年不見的人,高雄有沒有這麼小啊?

那學弟問我是不是也在這工作,我答說我只是來面試。我一邊說「有機會一起工作」,一邊心裡想著「大概沒啥機會。大公司規距多,我這種非科班出身的人,履歷大概到人事單位就被刷下了」。話說回來,十年不見,他們的面孔都比當年成熟了,我一瞬間也認不出來。倒是他們一見我就認出我是誰,難道我十年前的面孔就是這麼「臭老」嗎?唉。

Openchange/libmapi API 用例

在 libmapi 中,主要的封包結構是 mapi_object_t。使用 mapi_object_init() 建構內容。 主要的函數回傳值是 enum MAPISTATUS,並以 MAPI_E_SUCCESS 表示成功執行。 通常在呼叫 libmapi API 後使用 if (retval != MAPI_E_SUCCESS) return false; 判斷程式流程。

就設計架構而言, libmapi 運作時會管理記憶體資源。使用 MAPIFreeBuffer(), mapi_object_release() 便可釋放閒置的記憶體空間。 但就我實測結果顯示,它目前存有 memory lack 問題。以擷取連絡人清單為例,在擁有 256MB 實際記憶體與 384MB Swap 空間的 GNU/Linux 系統上, 大約在擷取200筆訊息後,就會因為記憶體不足而被系統中止程序。

openchangeclient -p rock --fetch-items=contact

這是目前使用 libmapi 開發大型客戶軟體時必須注意之處。其他Bug可以參考 Openchange開發工具補遺

Openchange 開發工具補遺

日前有一項工作,需要從 Microsoft Exchange Server 中轉出行事曆、連絡人等等資料。我嘗試使用 Openchage 這套工具來處理。它透過 Exchange 預設的 SMB 封包協定交換資訊。應用軟體開發人員可使用其 libmapi 函數庫設計一般用戶程式。

OpenChange aims to provide a portable Open Source implementation of Microsoft Exchange Server and Exchange protocols.
Openchange

不過 Openchange 仍未臻成熟,在使用前必須修正不少地方。本文說明 header 檔路徑修正、常數定義修正與中日韓語系修正的內容。

2008 IBM developerWorks開發者大會記要

今天(11月5日)去台北參加 2008 IBM developerWorks 開發者大會。今年的專題是 RSDC (Rational Software Development Conference),還創造了一個 R-Heros 戰隊。分別是 架構神人、析哈天后、時空司令、克隆女王、霸葛殺手、版管將軍,他們的顏色分別是藍、橙、灰、橘、青、綠。嗯,真難記,應該要跟日本動畫多學學... 呃,我扯到哪去了。總之呢,今天的議程也算是最新的 Rational 開發工具的說明會吧。

2006的專題是 EssUP 、2007的專題是 Jazz (Jazz project),今年的專題 RSDC。其實今年 RSDC 的內容,有很大一部份是圍繞著與 Jazz platform 相關的 Rational Team Concert。只是去年偏向說明 Jazz platform 的概念,而今年則是以 Rational Team Concert, Rational Software Delivery Platform 等軟體具體地介紹開發者如何在日常工作中使用這些工具。此外, SOA 也一直是近年來開發者大會中必不可少的內容。除此之外,我個人比較關注還有 B3 議程《加速研發: 開放源碼軟體與 IBM Rational》和 B4 議程《跨地協作開發實戰手冊》。

衍生性金融商品的文獻可以上推到一百年前

根據最近一年來的金融危機可知,未來五年內的學術市場,經濟學者將大量投入在貨幣金融理論之中。要寫論文,就要往這裡鑽才有搞頭。

但個人在閒聊過程中,卻查覺到有人認為這方面由衍生性金融商品所造成的金融危機,沒有可用的理論文獻。我不認同這種看法。事實上,衍生性金融商品並非今日才有的,衍生性金融商品的相關文獻甚至可以上推到一百年前,也就是在貨幣制度從金本位制度轉向紙幣本位制度(信用本位制度)的時期。「衍生性金融商品」有一個古老的詞彙,其名為「信用創造」。

我們應當鼓勵消費,還是鼓勵儉約?

王永慶病逝的消息,佔據昨日(九十七年十月十七日)各大報頭版新聞。我訂的聯合聯當然也不例外。

按我看報的習慣,必先依序翻開各版先看標題。首先,聯合報頭版標題《經營之神 病逝美國》。翻開A2版,標題寫著《總統帶頭血拼 忍痛換新鞋》。繼續翻閱,A5版標題是《座車跟他18年 理髮只剪不洗》。一頭說「愛台灣來消費」,另一頭卻說著「涓滴珍惜」。看著這幾個標題,我心中突然湧現一股不協調感。這股不協調感的起因,與我們目前景氣低迷的生活現況有關。在當前狀況下,我們應當鼓勵消費,還是鼓勵儉約?

Mount VirtualBox's shared folders in linux 掛載 VirtualBox 共用資料夾

在 VirtualBox 配置的虛擬機器上安裝 Linux 系統 (即 linux 作為 guest),並設定 host 主機的目錄做為 Shared folder (共用資料夾)。常見問題。

  1. 掛載方式與指令
  2. 失敗狀況: no such device
  3. 失敗狀況: Protocol error

本文記錄內容,時間跨度從 VirtualBox 2 到 6 版。從 Ubuntu 9 到 Debian 10 。有些狀況是舊版才有,新版修正了。

冰島危機肇因於政府操作擴張政策失利,而非其經濟體的開放程度

聯合報九十七年十月十日A15版有篇讀者投書曰《冰島破產 台灣有以學之 ~ 小國,不適合過度開放的經濟》。不過看完內容後,我認為副標不正確。我看到的是冰島危機肇因於政府操作擴張政策失利。

一般提到「開放經濟」時,指的是從計劃經濟體制轉向自由經濟體制的過程。至於「過度開放的經濟」之意,我猜測投書人是指經濟政策的自由化程度過高。然而觀其文中所舉之事,我看到的是政府持續地操作擴張政策。這並非自由經濟支持者所稱的自由經濟,而「擴張政策」亦不等於「開放政策」。

統計翻譯術,創造流行語

今天在網路論壇上閒逛時,看到一則關於 Google翻譯工具 的真實笑話。Google翻譯工具在翻譯「我想扁你」這句話時,會得到「I think you Chen Shui-bian」這句非常貼近流行的結果。有圖有真相。

「我想扁你」=「I think you Chen Shui-bian」

我想到 Google 說它的翻譯技術是採用統計方法,我又想到一些關於語言發展的事,不禁讓我贊嘆地道「原來流行語是人類不經意地的統計後創造出來的」。

我因為CMMI的事,而被公司解雇了

各位關注本部落格的朋友,近來一定很失望。竟然快3個月都沒有更新任何資料。其實沒什麼大事,只是因為我前一陣子被公司解雇後,決定給自己放個長假的緣故。

常看我文章的朋友,心裡一定有個印象,那就是我個人並不喜歡CMMI。我也在部落格中說過我待的公司通過CMMI level 3 認證,可能會有一段雞飛狗跳的日子。果不其然,我真的因為CMMI的事被解雇了。然而事情起因卻是因為我在某件專案中,太常抱怨「這樣做不符合CMMI」、「CMMI不允許這麼搞的」諸如此類的話。因此被專案經理認為能力不足。當然啦,有此抱怨的不只我一人。幾經波折,我和幾位同事就先後被解雇了。

我一直認為,CMMI之於公司組識,一如憲法之於國家。憲法一方面規範人民權利與義務內容,另一方面也約束政府權力。那麼CMMI就是一方面規範軟體工程人員的作業內容,另一方面也約束管理階層的權力。但是公司高層的認知顯然和我不同,公司高層說我們要落實CMMI工程面,但不落實CMMI管理面。講白了,公司要求軟體工程人員要按CMMI規範做事,但沒說管理階層要照著做。所以上面的人三番兩次的變更時程、需求與規格。而我這個三番兩次抱怨這樣做不符合CMMI的軟體工程人員,自然也就不能待下去了。

SQLite/PHP/Apache 設定筆記

SQLite 目前有兩種版本,一是 SQLite 2,另一為 SQLite 3。PHP 兩種都支援,但所需的擴充項(extension)並不相同。

SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
SQLite Home Page

在 PHP 中使用 SQLite2 ,必須載入 SQLite 擴充項(sqlite.so/php_sqlite.dll)。

在 PHP 中使用 SQLite3 ,必須載入 PDO_SQLite 擴充項(pdo_sqlite.so/php_pdo_sqlite.dll)。同時這也表示兩件事。一,SQLite3 是 PDO 擴充項的一個工廠(factory) ,你必須透過 PDO 介面去呼叫 SQLite3 的方法。二,PHP5 或以上的版本才支援 PDO 擴充項,故 PHP4 不能使用 SQLite3。

新增資料時自動產生識別代號的一些方法

時常接觸資料庫應用的編程人員,應該都會遇到需要新增資料後自動產生一個識別代號(ID)的設計。但遺憾的是, SQL Standard 並沒有定義任何相關型態或函數。於是各種資料庫系統都有自己的一套做法。使得這種普遍的應用設計,帶來了一個可攜性陷阱。

在不考慮使用資料庫系統特定方法的情況下,我長久以來習慣用 MAX(id) + 1 產生識別代號。至於 MySQL 的用戶,我都特別為它準備另一個 SQL Schema,改用 MySQL 特有的 AUTO_INCREMENT 欄位屬性。

CentOS, 我搞不懂你...

最近公司分了一個案子下來,要在基於 CentOS 的環境進行開發工作。公司也配了一台開發用主機下來,不過是空機,OS要自己裝。於是我下載 CentOS 5 完成了安裝工作。安裝工作沒啥問題,但要測試 HTTP 和 FTP 等網路服務時卻出狀況了。其他主機都無法連接開發用主機上的網路服務,如 HTTP, FTP 和資料庫,只有SSH 可以連接(謎啊...)。我一開始認為是防火牆問題,於是新增了對應的 iptables 規則,但仍然無用。於是我開始 google 文件... 最後的答案告訴我,一切都是 SELinux 的問題。

我想想,我用了下列指令。

$ getsebool -a

$ setsebool -P ftpd_disable_trans on
$ service vsftpd restart
## OK! 成功地開放 FTP 服務。

$ setsebool -P httpd_disable_trans on
$ setsebool -P httpd_can_network_connect on
$ service httpd restart
## OMG! HTTP服務還是無法連結 囧

## 也許 iptables 也有影嚮,試試...

$ iptables -A INPUT --dport 80 -j ACCEPT
$ service iptables save
## It still doesn't work.

$ service iptables stop
## 我關掉 iptables ,所有問題都迎刃而解了。
## 最後,我執行 ntsysv ,把 iptables 服務取消了...

我到現在仍然搞不懂一件事。像 FTP, MySQL, PostgreSQL 這些服務,我在 SELinux 設定開啟後就能用了(但未在 iptables 設定對應規則),卻為何在 SELinux 和 iptables 都設定開放 HTTP 服務了,外部主機還是無法連接 HTTP 服務呢?

開發自動化文章參考

前幾天在 developerWorks 看到一篇關於負載測試的新文章,《让开发自动化: 自动负载测试 - 使用 Apache Ant 和 Apache JMeter 频繁进行负载测试》。它提醒了我一件事:負載測試也有自動化工具。我以往很少在這一方面下功夫。大部份時候,我都是針對特定情況,自行撰寫特定的負載測試工具,而且不是很好用...

我目前尚未引入 JMeter 到日常工作之中,暫時先在此做過標註。不過有一點可以先說,JMeter 是針對應用軟體的成品或者整個運作環境進行負載測試,跟你的應用軟體開發工具無關。所以並不侷限於 Java 開發的專案才能用 JMeter 。使用 PHP 或其他工具開發的案子也能用。

附帶一提,developerWorks 專欄作者 Paul Duvall 所撰寫的《让开发自动化》專欄,皆有相當高的實務價值,值得一讀。

利用 NullObject 改善程式可讀性,No more if, no more try

剛在重構一組類別的程式碼時,突然想到 Martin 在《敏捷軟體開發原則、樣式與實務》一書中提到的一個編程技巧,就是在失敗狀況時回傳 NullObject ,避免行為調用者用 iftry 處理失敗狀況,影響程式可讀性。

我重構中的類別程式碼,基本上是一個聚合類別,它包含了其他類別的個體。此聚合類別提供一個方法 get() ,以取得它所包含的個體。外部調用 get() 後取得內容個體後,立即呼叫該個體的一個方法。

請在「持續整合」的原則下利用版本控制工具的合併功能

前一陣子在工作場所碰到一件事,我的同事抱怨 SVN 不能幫他合併他修改過的分支內容。我覺得很奇怪,因為我並沒有碰過這種情形。一開始我以為他是不熟悉 TortoiseSVN 工具,後來我實際看了他操作後,看到他竟然一次要合併近百份源碼檔,當場無言以對。

我記得我曾說過 SVN 可以幫我們程序員自動合併分支的源碼內容,並在衝突時提示我們。然而,在碰到同事這件例子後,我發覺我忘了加一個但書: 「請在持續整合(Continuous Integration)的原則下利用合併功能」。否則再好的版本控制工具也無法幫你合併。

Oracle 的表格、欄位名稱都要大寫嗎?

jaceju : Oracle 的表格、欄位名稱都要大寫這個限制實在很鳥...不曉得有沒有哪位 Oracle 前輩能指點一二?

關於欄位名稱,其實是可以指定大小寫的,但要用 雙引號 (") 括起來。一個「非雙引號括起的」欄位名稱都要大寫這件事,其實是 SQL Standard。而且這是內定程序。

10)The <identifier body> of a <regular identifier> is equivalent to an <identifier body> in which every letter that is a lower- case letter is replaced by the equivalent upper-case letter or letters. This treatment includes determination of equiva- lence, representation in the Information and Definition Schemas, representation in the diagnostics area, and similar uses. SQL 92

但是 SQL Standard 也允許你用雙引號(doublequote) 字元括起名稱,這時就會抑制大小寫轉換的動作。這是 SQL Standard 配合國際字元集所定的規則。在這種情形下,也 SQL Standard 也允許你用保留字做為欄位名稱。

Oracle 在這方面完全遵循 SQL Standard 。也可以參考 Oracle reference 的內容: Oracle Database SQL Language Reference 11g Release 1::Schema Object Names and Qualifiers。就我個人實際使用經驗, PostgresSQL, MS SQL Server, IBM DB2 以及我最不喜歡的 MySQL方言,都遵循這個作法。

話說回來, MySQL 也是一樣,你把欄位名稱輸入小寫符號,MySQL DBMS內部也是全部轉大寫在處理(還是小寫?我忘了,反正結果一樣)。除非你用雙引號括起來,才會保留大小寫差異。

美化不可編輯的表單欄位

在 Web 應用的設計工作中,我們常常會讓"資料新增"、"資料編輯"與"資料檢視"這幾個動作共用同一個頁面樣板,差別僅在於檢視動作下的表單欄位輸入控制元件是不可編輯的。而要讓輸入控制元件不可編輯的方式很簡單,僅需要設置輸入控制元件的 disabledreadonly 即可。只不過,我們最好能在視覺上美化一下不可編輯表單欄位,讓使用者可以看出哪些欄位是不可編輯的。特別是 disabled 的輸入控制元件,其預設的顯示樣式實在很醜。非美化不可。

如果你使用 Selenium Core 編寫 Web 應用的測試案例,那麼關於輸入控制元件的 readonly 屬性有一些測試上的注意事項,請參考《A patch of isEditable of Selenium Core 0.83》。

我服務的公司通過 CMMI level 3認證了

今天一早打開電子信箱,開始慣例的週一工作: 慢慢地一封一封地過濾信件。這工作可以讓我混一個上午。Ok, 那不是重點。重點是公司發了一封重要公告,內容很簡單,就是公司通過 CMMI level 3 認證了。

啥?有人要恭喜我?且慢,別誤會。我是新進員工,而那個認證申請工作已經進行一年了,而且我也不在參加 CMMI 審核的人員名單中。這公司能通過 CMMI level 3 認證跟我是一點關係都沒有。

這件事對我來說真正重要的是: 看來會有一段雞飛狗跳的日子了。千萬別以為通過 CMMI 後,"馬上就會好"。這公司跟我以前待過的公司一樣,雖然通過 CMMI 了,但其實還沒有在真正的開發工作上 準備好。我幾乎可以預見日後我們程式人員要開始力抗 PM 擬定的 "非結構化、不具重用性的規範文件" 等官僚系統了。我實在無法理解那些人在想什麼,CMMI 導入指引中從未規定過開發過程中的產出文件格式,但就是有人有辦法定出一套 "非結構化、不具重用性的文件格式"。在我觀察中,那種文件不只是程式人員覺得麻煩,就連 PM 自己也無法認真而快速地從中找出多少有用的資訊。因為那些文件格式不具結構性也不具重用性。從資訊管理的角度來看,這完全是不專業的表現。

Anyway, 也許日後我的 blog 又有不少題材可以寫了... 希望是好事比較多,我也不喜歡寫批文。

A patch of isEditable of Selenium Core 0.83

日前配合 Selenium 撰寫一個 Web 應用軟體的測試案例,案例中有一句斷言要判定指定的表單輸入欄位是唯讀的 (readonly)。我個人很直覺地使用了 assetrNotEditable,但測試結果卻是錯的。後來我又試了 assertEditableassertAttributeassertNotAttribute 等寫法。始終無法正確而一致地判定輸入欄位的唯讀屬性 (readonly)。

依據參考文件 (Selenium IDE Reference) ,assertEditable/assertNotEditable 的說明,這兩種斷言都是調用 isEditable() 判斷。於是我開啟 selemium-api.js 後搜尋 isEditable ,找出它的源碼內容。結果發現它只判斷輸入控制元件 (input element) 的 disabled 屬性,而未判斷 readonly 屬性。