大如「微軟」,也會在源碼授權管理上出錯

ZDNet 報導《開源碼爭議 微軟撤下Windows 7下載工具》,詳情請看 Rafael Rivera 《 Microsoft lifts GPL code, uses in Microsoft Store tool》。

對於這個問題,微軟的反應相當快速。相關回應發佈在《Update on the Windows 7 USB/DVD Tool》。在該文中,微軟承認他們檢視 Windows 7 下載工具(WUDT)後,確實包含了 GPLv2 授權的源碼。並承諾在下週起,依據 GPLv2 授權的規定,提供使用者取得 Windows 7 下載工具的源碼。

微軟指出,問題發生在負責開發 WUDT 的第三方廠商 (原來微軟也會找外包商開發軟體)。而微軟並未將第三方廠商負責的源碼內容,納入微軟內部的程式碼檢視流程中,以致於微軟未能立即發現第三方廠商使用了 GPLv2 授權的源碼。

我不知道微軟到底是找了哪裡的第三方廠商,但猜想其規模應該不會太小。但是這等規模的第三方廠商,也會「違法」使用 GPL 授權的軟體。由此可見,就算是國外,仍然有許多軟體開發廠商與軟體開發人員,還是不了解自由軟體與開放源碼授權證所代表的法律意義。

... also taking measures to apply what we have learned from this experience for future code reviews we perform. Update on the Windows 7 USB/DVD Tool

此外,對大型軟體開發公司而言,這也是個重要的經驗。源碼授權管理已經是不容忽視的工作。我在2008年的IBM開發者大會的議程中,就聽到源碼授權管理工具的議題,顯見相關問題在兩三年前就已經受到關注了。

有鑑於政府近年提倡開放源碼,以及國內愈來愈多的軟體開發公司使用自由軟體與開放源碼的工具與程式,這起事件,值得借鏡。所謂「免費使用」只是對於一般最終用戶的說法;對軟體開發人員而言,還需要加強正確的自由軟體與開放源碼的法律觀念教育。

在專案中是否不應該用其他語言撰寫工具與測試案例

公司的專案完成了第一期,舉行了一個成員會談,檢視專案過程中遭遇的狀況與可改進的內容。在會談中,我談的主題就是我在《建置風險的故事》中所談的內容。除此之外,我也展示了個人在進行專案時使用的一些小工具與功能測試案例。

我展示這些小工具的目的,是為了說明在整個專案開發過程中,除了正式的工作項目之外,還有很多瑣碎的事務。為了幫助我們處理這些瑣碎的事務,我們應該養成寫一些小工具去完成它們的習慣性,這也是為了讓這些瑣碎的、不在工作項目之內的事,能夠被自動化處理,從而幫助我們達成持續整合(Continue Integration)的目標。

這是基於實務經驗所發展出的一種技巧。在《軟體建構之道》一書中,作者提到當一個程序員要進行一項預估工時約5小時的工作時,他們通常會用4個半小時去寫一個工具,再以這個工具使用半小時去處理那件工作。

不幸的是,議題的焦點很快轉移到了我用的語言上了。因為我並不是使用 Java 語言去寫這些小工具。

自動備份 postgresql 資料庫到遠端主機

今有 A, B 兩台主機。 A 主機的服務功能,使用 PostgreSQL 儲存資料。 B 主機平時負責另一項工作,但是它也有啟動 PostgreSQL 。現在我希望每日定期將 A 主機的 PostgreSQL 資料同步備份到 B 主機的 PostgreSQL 中,以便 A 主機故障時,可以立刻將服務工作轉移 B 主機上。

我將使用 ssh 搭配 PostgreSQL 的 pg_dump/pg_restore/psql 工具實現這項需求。

Using ssh to backup PostgreSQL database to remote host and restore in remote host.

從範本快速自製 deb

有許多工具可以幫我們打包 deb ,但是最基本的工具是 dpkg-deb 。只要了解 dpkg-deb 的用法,甚至可以自行開發一個 deb 打包工具。

下載一個既有的套件 deb 作為範本修改,可以省掉許多摸索的時間。

又來了,「觀念先進」真是個壞兆頭

從我退伍至今,我待過四間民營企業。在職期間,他們對我都有一個共通的評語,那就是「觀念先進」。我不曉得我的觀念到底先進在哪?我談的都是國外三、五年前就在實踐的項目,甚至快變冷飯了。但就結果而言,這句評語顯然不是什麼好兆頭。

這四間企業中,其中一間是百貨流通業,我擔任資訊系統管理人員(MIS)職務,這也是我待最久的職務,大約兩年時間。這個職務不太需要我動手寫程式,原則衝突最少,所以我一直待過景氣不佳,公司裁員為止。

其他三間企業的主要業務都是軟體開發。第一間,通過 CMMI lv2 認證。我提了不少意見,他們覺得我觀念先進。然後我待滿三個月的試用期後主動求去。第二間,通過 CMMI lv3 認證。我待得還算愉快,他們也覺得我觀念先進。但是後來因為 CMMI 的緣故而被資遣。我覺得專案經理不按 CMMI lv3 的程序隨意變更時程,專案經理覺得我藉故拖延,所以被資遣。不過還是有兩件外包案丟給我做。若加上離職後接下他們外包案的時間,我算待滿一年。

現在待的這間公司,基於前兩間公司的經驗,我在工作中算是相當沈默了。不過上禮拜進行新進人員試用期末面談時,他們還是覺得我觀念先進。聽到這句評語,我心中一驚,這真不是個好兆頭。觀念先進這句明話的背後,代表的或許正是「過於理想、不切實際」。雖然我覺得我談的事,在國外已經有許多實踐方法,但在國內還是「過於理想」的事。不知道這間公司還能待多久,希望能讓我混到過年後。有錢好過年嘛。

軟體開發之建置風險的故事

在很久很久以前…,天之聲「等等,不是才上個月的事嗎?」 嗯,說故事嘛,慣例是要用「很久很久以前」開場的。 有一件軟體開發專案,在開發過程中,發生了許多的問題,導致測試與部署時期一再出錯。 而那些問題,有一大部份都可歸類為「建置風險」。

建置風險所帶來的重複性,會嚴重削弱我們的軟體開發生產力。但建置風險總是如野草一般,在不起眼的裂縫處萌芽,除之不盡,燒之不絕。這類的問題點,不在架構設計與程式碼內部,而發生在程式外部的運作環境。經常被忽略,而且副作用會延遲發生,往往到部署階段才出問題,導致驗收延期。

Java Json-lib note

  1. JSON array: convert to Java JSONArray.
  2. JSONArray instance: convert to List.
  3. List: convert to Java JSONArray.
  4. JSONArray instance: convert to JSON array(String).
  5. ClassCastException.
  6. You can not use iterator() for enhanced for-loop.

Hibernate 查詢某個欄位的絕對值

當我們試圖從資料庫中查詢某個欄位的絕對值時,我們有兩種途徑。第一種是自定新的 Hibernate UserType ,再透過 HQL 查詢。 第二種則是利用 SQL abs() 函數,透過 SQL 查詢。

自定新的 Hibernate UserType 並不太難,僅需實作 UserType 介面,再套用一個範例來修改即可。 範例可參考 https://www.hibernate.org/388.html 。

PHP - Schema-Database

新增內容: Database Row 簡介

Schema-Database 是一個針對小型應用系統或嵌入式系統所設計的抽象資料庫存取層函數庫。 它提供一組 Schema class 用於組態資料庫表格與欄位,強化資料內容的型態檢查、格式檢查、解碼與編碼動作。 同時設計了兩種 class, Database_Query 和 Database_Row ,提供基礎的 Active Record 與 ORM 能力。這兩種 class 運用 PDO class 與 Schema class ,簡化資料查詢、存取和資料內容檢查動作。

我已經將此軟體放置到 Google Code 上。專案入口: PHP Schema and Database library

遞迴與Smalltalk式介詞應用

前陣子用 Ruby 寫一個文件區塊的格式化工具,它會先載入整個文件區塊到陣列,然後依序將每個段落交給不同的方法處理。 被調用的方法,會從陣列中取出它要處理的段落,直到段落結束。 因為處理過的段落內容已經從陣列中取出,所以下一個方法總是從陣列的開頭繼續處理。

我先用 Ruby 寫幾個小程式來演練概念,寫著寫著就玩起來了。 一共寫了三種作法,分別應用了不同的 Ruby 語法。

  1. 平行指派,後綴式迴圈、無遞迴
  2. 遞迴式
  3. 遞迴式,Smalltalk 式介詞應用,加上迭代器

Java Enum 範例 - enum HttpStatusCode

HTTP 協定規範了 HTTP Status Code,這個狀態碼本身就包含了兩種表達形式,即三位數字的狀態碼,與文字訊息的狀態訊息。

加上 Enum 的定義後,在 Java 語言內就可以用三種表達形式,例如: 200, "Ok", HttpStatusCode.Ok。這實在是用來展示 Enum 用法的絕佳範例。

Java Enum and Generic

Enum(列舉) 在 C 語言時代就是賦予常數值可讀意義的簡便方法。 C# 也是一開始就提供 Enum 型別。 Java 則遲到 5.0 才提供。不過遲來總比不來好。

本文是 Java 語言的 Enum (列舉)型別與 Generic (泛型) 能力共同運作的筆記。 Java 的列舉型別是一種特殊型別,當我們要在列舉型別的場合中加上泛型能力時,需要運用一些不同的處理手段。我們也需要用到 Reflection (反射)。

與 metavige 和 alexchen 對話 Java 語言

所以當然這個 Java 老語言來說,自然沒得比了~

目前的開發方式或者是環境變遷,強調的是快速開發,以往那種慢工出細活的方式已經有點不合時宜了

metavige

有趣的是,Java一點都不老。我在 從中介編程與反射能力來談 Java 語言 列出十年世代的程式語言列表,Java 名列其中。它比Python 年輕3歲,跟Ruby, PHP, JavaScript 同年發佈。單純看語言的特性,Smalltalk這個40歲的程式語言都比 Java 靈活,這才是 Java 令我們老輩程序員驚奇的事。

從 C++ Template 到 Java Generic,一步一步來

Java 實作了泛型(generic)機制以實現 C++ 樣板(template) 的一部份能力,兩者的語法乍看之下也有些相似。 雖然我覺得 C++ 樣板很難搞,而且兩者的語法有點像,但是相較於完全陌生的 Java 泛型,我用起 C++ 樣板來還是比較熟練的。很自然的,當我試圖要用 Java 的泛型重構程式碼時,我會先從 C++ 樣板的觀點來思考。

我將日前工作中碰到的一段我想用泛型重構的程式碼,取其大綱出來練習。本文紀錄了大致的改寫過程。

嘗試使用 Java 的 reflection 重構指派資料欄位值的程式碼

如果你熟悉動態語言,你大概會嘗試使用 Java 的反射(reflection)來重構程式碼。我個人提供一個重構經驗,告訴你使用 Java 的反射時,你可能會感到失望。

這是一段透過 Hibernate 進行的資料更新動作。我從使用者端取得要更新的資料項,接著先向 Hibernate 查詢要更新的資料項目是否存在,存在的話再把新的資料內容更新進去。

PHP 5.3/6 新增功能 - Closures, const, and others

PHP 5.3 新增特性列表與本部落格的系列文章:

  • 名稱空間 (Namespace)
  • 延遲靜態繫結 (Late Static Bindings)
  • 新的魔術方法, __callStatic and __invoke.
  • 標記跳躍, Support for jump labels (limited goto) has been added.
    就是 goto ,忘了它吧。
  • HTTP 串流轉接器(HTTP stream wrapper) 現在將狀態碼 200 到 399 視為成功執行。我不曉得為什麼這會列在新功能中。這看來是為了改善 RESTful service 的支援。
  • 支援巢狀的例外處理。
  • 加入一個垃圾收集器,預設開啟。嗯... PHP 沒有垃圾收集功能嗎?Ok, 原本的垃圾回收機制清潔力不夠。 目前大多數 PHP 程式架構是處於一次性消耗的無狀態環境下,基本上我們都假設程式跑完後行程就自動結束,而行程中配置的資源也會被作業系統回收。 在這種情形下設計出來的 PHP 程式碼,直接搬到 application container 架構執行時,會出現資源佔用不放的問題。 所以這功能應該是為了將來發展 PHP 的 application container 而強化的機制。
  • 閉包、匿名函數(native Closures)(Lambda/Anonymous functions)。
  • 新的即席文件語法(Nowdoc syntax)。
  • 關鍵字 const 現在可用於類別定義之外。
  • 三元運算子(?:)有縮寫形式。

關於 Closures (匿名函數), Const, Nowdoc 等新功能,將於本文中說明。