Tags: CMMI
各位關注本部落格的朋友,近來一定很失望。竟然快3個月都沒有更新任何資料。其實沒什麼大事,只是因為我前一陣子被公司解雇後,決定給自己放個長假的緣故。
常看我文章的朋友,心裡一定有個印象,那就是我個人並不喜歡CMMI。我也在部落格中說過我待的公司通過CMMI level 3 認證,可能會有一段雞飛狗跳的日子。果不其然,我真的因為CMMI的事被解雇了。然而事情起因卻是因為我在某件專案中,太常抱怨「這樣做不符合CMMI」、「CMMI不允許這麼搞的」諸如此類的話。因此被專案經理認為能力不足。當然啦,有此抱怨的不只我一人。幾經波折,我和幾位同事就先後被解雇了。
我一直認為,CMMI之於公司組識,一如憲法之於國家。憲法一方面規範人民權利與義務內容,另一方面也約束政府權力。那麼CMMI就是一方面規範軟體工程人員的作業內容,另一方面也約束管理階層的權力。但是公司高層的認知顯然和我不同,公司高層說我們要落實CMMI工程面,但不落實CMMI管理面。講白了,公司要求軟體工程人員要按CMMI規範做事,但沒說管理階層要照著做。所以上面的人三番兩次的變更時程、需求與規格。而我這個三番兩次抱怨這樣做不符合CMMI的軟體工程人員,自然也就不能待下去了。
Tags: php sqlite database
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。
Tags: sql serial max
時常接觸資料庫應用的編程人員,應該都會遇到需要新增資料後自動產生一個識別代號(ID)的設計。但遺憾的是, SQL Standard 並沒有定義任何相關型態或函數。於是各種資料庫系統都有自己的一套做法。使得這種普遍的應用設計,帶來了一個可攜性陷阱。
在不考慮使用資料庫系統特定方法的情況下,我長久以來習慣用 MAX(id) + 1 產生識別代號。至於 MySQL 的用戶,我都特別為它準備另一個 SQL Schema,改用 MySQL 特有的 AUTO_INCREMENT 欄位屬性。
Tags: linux
最近公司分了一個案子下來,要在基於 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 所撰寫的《让开发自动化》專欄,皆有相當高的實務價值,值得一讀。
Tags: php5 refactoring nullobject
剛在重構一組類別的程式碼時,突然想到 Martin 在《敏捷軟體開發原則、樣式與實務》一書中提到的一個編程技巧,就是在失敗狀況時回傳 NullObject ,避免行為調用者用 if 或 try 處理失敗狀況,影響程式可讀性。
我重構中的類別程式碼,基本上是一個聚合類別,它包含了其他類別的個體。此聚合類別提供一個方法 get() ,以取得它所包含的個體。外部調用 get() 後取得內容個體後,立即呼叫該個體的一個方法。
前一陣子在工作場所碰到一件事,我的同事抱怨 SVN 不能幫他合併他修改過的分支內容。我覺得很奇怪,因為我並沒有碰過這種情形。一開始我以為他是不熟悉 TortoiseSVN 工具,後來我實際看了他操作後,看到他竟然一次要合併近百份源碼檔,當場無言以對。
我記得我曾說過 SVN 可以幫我們程序員自動合併分支的源碼內容,並在衝突時提示我們。然而,在碰到同事這件例子後,我發覺我忘了加一個但書: 「請在持續整合(Continuous Integration)的原則下利用合併功能」。否則再好的版本控制工具也無法幫你合併。
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內部也是全部轉大寫在處理(還是小寫?我忘了,反正結果一樣)。除非你用雙引號括起來,才會保留大小寫差異。
Tags: web_design
在 Web 應用的設計工作中,我們常常會讓"資料新增"、"資料編輯"與"資料檢視"這幾個動作共用同一個頁面樣板,差別僅在於檢視動作下的表單欄位輸入控制元件是不可編輯的。而要讓輸入控制元件不可編輯的方式很簡單,僅需要設置輸入控制元件的 disabled 或 readonly 即可。只不過,我們最好能在視覺上美化一下不可編輯表單欄位,讓使用者可以看出哪些欄位是不可編輯的。特別是 disabled 的輸入控制元件,其預設的顯示樣式實在很醜。非美化不可。
如果你使用 Selenium Core 編寫 Web 應用的測試案例,那麼關於輸入控制元件的 readonly 屬性有一些測試上的注意事項,請參考《A patch of isEditable of Selenium Core 0.83》。
今天一早打開電子信箱,開始慣例的週一工作: 慢慢地一封一封地過濾信件。這工作可以讓我混一個上午。Ok, 那不是重點。重點是公司發了一封重要公告,內容很簡單,就是公司通過 CMMI level 3 認證了。
啥?有人要恭喜我?且慢,別誤會。我是新進員工,而那個認證申請工作已經進行一年了,而且我也不在參加 CMMI 審核的人員名單中。這公司能通過 CMMI level 3 認證跟我是一點關係都沒有。
這件事對我來說真正重要的是: 看來會有一段雞飛狗跳的日子了。千萬別以為通過 CMMI 後,"馬上就會好"。這公司跟我以前待過的公司一樣,雖然通過 CMMI 了,但其實還沒有在真正的開發工作上 準備好。我幾乎可以預見日後我們程式人員要開始力抗 PM 擬定的 "非結構化、不具重用性的規範文件" 等官僚系統了。我實在無法理解那些人在想什麼,CMMI 導入指引中從未規定過開發過程中的產出文件格式,但就是有人有辦法定出一套 "非結構化、不具重用性的文件格式"。在我觀察中,那種文件不只是程式人員覺得麻煩,就連 PM 自己也無法認真而快速地從中找出多少有用的資訊。因為那些文件格式不具結構性也不具重用性。從資訊管理的角度來看,這完全是不專業的表現。
Anyway, 也許日後我的 blog 又有不少題材可以寫了... 希望是好事比較多,我也不喜歡寫批文。
Tags: selenium web_dev
日前配合 Selenium 撰寫一個 Web 應用軟體的測試案例,案例中有一句斷言要判定指定的表單輸入欄位是唯讀的 (readonly)。我個人很直覺地使用了 assetrNotEditable,但測試結果卻是錯的。後來我又試了 assertEditable、assertAttribute 及 assertNotAttribute 等寫法。始終無法正確而一致地判定輸入欄位的唯讀屬性 (readonly)。
依據參考文件 (Selenium IDE Reference) ,assertEditable/assertNotEditable 的說明,這兩種斷言都是調用 isEditable() 判斷。於是我開啟 selemium-api.js 後搜尋 isEditable ,找出它的源碼內容。結果發現它只判斷輸入控制元件 (input element) 的 disabled 屬性,而未判斷 readonly 屬性。
Tags: phpunit tdd
PHPUnit 預置了一個純文字型式的 TextUI Runner,在大多數情形下,它足夠應付我們的需求。不過,當我想要把 TestSuite 放到專案網頁上,讓小組成員 - 特別是 PM - 可以上網查看立即的測試結果時,那個文字型式的 TextUI Runner 就顯得太簡略了。至少要把測試工作及結果輸出成 HTML 的條列式清單,最好還加上顏色區別成功或失敗。
所幸 PHPUnit 提供了良好的擴充性,要自定一個可以將測試內容輸出為 HTML 網頁的 HTML Runner 相當簡單。
[
P]: Pass;
[
F]: Failure;
[
I]: Incomplete;
[
S]: Skipped;
[
E]: Error.
Tags: database sql
BIT 與 CHAR 使用筆記。以 SQL92 為基準。
BIT很少用,前一陣子為了使用這種資料型態,google了不少資料,不過大部份網路資料都沒有提供什麼有用的資訊 (市面上的 SQL 書籍更是不提)。最後還是在各家資料庫系統本身的 Manual 中找到資訊。留下筆記,以供日後查閱。
Tags: php reflection mix-in include
最近碰到一個分割程式功能的問題,不得已必須用到反映的功能,寫了一個簡單的抽象插件類別
http://blog.pixnet.net/HACGIS/post/15612808。
不知道你有沒有更好的解法?
tokimeki
關於這個問題,我是用所謂「混成(mix-in)」的概念實踐。先前我寫過2篇:
PHP 實踐 mix-in 概念、PHP 實踐 mix-in 概念 part 2。
另外一位網友是用 include ,參考:
mix-in?。嚴格來說那不是 mix-n ,稍後說明。這有3個缺點。
Tags: CodeIgniter phpunit
先說一下 PHP framework 的事,我個人很想用 Zend Framework 。但我服務的公司的軟體是用 PHP4 開發的,所以主機也是跑 PHP4。由於遲遲不見有更新到 PHP5 的計劃,所以我現階是用 CodeIgniter framework 在寫新功能。
另一方面,我又習慣用 PHPUnit 進行測試工作。為此,我必須要弄一個簡單的測試框架出來,才能以 PHPUnit 去測試我用 CodeIgniter framework 寫的功能單元。
日前我在公司和同事討論一個案子的 database schema,PM初期丟下來的 database schema 是寫在 Excel .xls 檔中。我拿到手後看了一會,覺得有些怪怪的,好像有些重覆。自然要討論內容。不過,用 Excel .xls 實在不方便討論,不時地切換試算表頁,常常中斷思考與討論節奏。所以,我乾脆打開 StarUML,建立一個類別圖 (Class diagram),把 database schema 畫了出來。在類別圖中清楚地呈現了表格與關聯性。一畫之下果然討論起來就順暢多了,也重新修正了不少地方。那接下來呢?再打開程式碼編輯器,把剛剛畫出來的 database schema 類別圖的內容,重新用 SQL 語法編寫一次嗎?
喔,不,老兄,那樣太不專業了。我們可是專業的資訊人員,重複輸入同樣的資訊,不是我們該做的事。身為專業資訊人員,就應該重複利用輸入過的資訊才對。不然我們做什麼資訊管理,搞什麼資料庫?
Tags: rest ajax
過去,我提到 REST 這個字眼時,多半指的是一種常用的 Web-based 應用軟體設計慣例或樣式 (我個人偏好用"慣例"一詞,不過用"樣式/pattern"好像比較專業)。既然是慣例,那在設計和使用上就比較隨興。不過隨著 REST 樣式的大量應用,有愈來愈多案例開始使用更制式化的設計樣式,這些高度制式化的 REST 服務,就稱之為 "RESTful web service"。 "-ful" 這個字尾正是在強調它們的設計方式完全符合 REST 文獻的建議內容。
相對於 RESTful ,以往那種基於慣例與相容性的實作方式,有人就稱為 RPC 。不過說到 RPC ,我第一時間想到的是 Unix 系統的 RPC (Remote Procedure Call),而且它的歷史更為悠久。為了避免混淆,所以我傾向於用 "REST-like" 這個稱呼。
Tags: regex regexp
有一字串,其格式為以逗號 (,) 分隔的記錄,例如 "a","b","c"。當某些欄位之值為空白時,會有逗號相連的情形,例如 "a",,"c"。
現在要用字樣規則式(Regular Expression, Regex)修改空白欄位的表達方式,改成一個空字串 (""),一般我們會寫成 s/,,/,"",/g (by Perl)。不過這種寫法碰到連續多個空白欄位時,例如 "a",,,"c",會變成 "a","",,"c",得不到我們要的結果。因為 Regex 解析器在找到第一組 ,, 後,會把處理指標放在第3個逗號的位置上。當 Regex 解析器進行下一個比對動作時,它將從第3個逗號開始尋找,此時它看到的只有一個逗號,故判定不符合樣式,也就不會進行替換動作。
碰到這種情形,我們要用 look-ahead assertion (前瞻斷言) 處理。 Look-ahead assertion 的語法為 (?=pattern)。See also perlre::Look-Around Assertions。
上禮拜在 P購物網訂了一台 Lenovo ThinkVision L220x 22吋 LCD,要價 NT$189xx。週末宅配到家,我使用了兩天後,感覺非常滿意。比公司用的 22吋 LCD 要好太多了,果然是一份錢一份貨啊。
話說為什麼一台 22吋 LCD 跌破萬元關卡之際,我花了 NT$189xx 買一台 22吋 LCD 還覺得有賺呢?原因就在於面板不同啊。