The practice of anonymous recursion function in JavaScript

匿名遞迴函數在 JavaScript 中之實踐途徑。所謂遞迴函數即函數在其內部調用自己的函數,為了能夠自我調用,我們通常會為函數命名以便以名稱調用之。然而在某些語言中,其語言特性足以實踐匿名函數之遞迴。

在 JavaScript 中欲實踐此技法,須具備三個 ECMAScript/JavaScript 知識基礎:一、理解什麼是 Function object 及匿名函數;二、理解 operator() 的用法;三、理解如何以 Function.call()/Function.apply() 改變 this 的指涉對象。

正名政策是「浪費無罪,正名有理」

中華郵政的官股蕫事及主管機關交通部,為了配合政府的「正名」政策而開董事會議修改組織名稱,中華郵政員工為了維護公司的「主體性」並避免此一措施所帶來的無謂費用及名譽損失,怒踹會議室大門。奈何那些喪失了經營倫理、忘卻了對員工及股東之經營責任的經理階層,偷偷摸摸地更換會議地點,最後還是通過了改名決議。

從此一事件我看到了當前政府之「正名」政策,端得是「浪費無罪,正名有理」。

Load and Execute JavaScript on Demand

這是一個使用在本部落格的技巧,用於因應樂多部落格系統之限制。

傳統上,我們執行 JavaScript 程式的方式是靜態的,在 HTML 文件中以 <script type="text/javascript" src="example.js"></script> 的敘述載入並執行外部 JavaScript 程式。若我們無法使用上述方式時,就需要動態載入與執行。另一種需要動態載入與執行 JavaScript 程式的時機為,存在幾個相當龐大的 JavaScript 程式但不全部都用得到的情形,為了降低瀏覽器載入的時間,此時我們需要依某些條件決定那些 JavaScript 程式需要載入。

Development within Eclipse PHP IDE (PDT)

今天在 IBM developerWorks 的 Open Source 專區中看到《PHP development within Eclipse》這一篇文章。看了一下,原來在介紹 Eclipse 中的 PHP IDE project 。文章中使用的版本和我現在用的版本一樣 (去年12月釋出) 。我使用 PHP IDE project 後,覺得跟 Java/CDT 比起來功能還是很陽春,編輯功能也不算順手。所以目前我仍然使用 PSPad 作為程式編輯器。

順道看了一下 PHP IDE project 的網站,發現計劃名稱改為 PDT (PHP Development Tool) 了。以下就用 PDT 稱呼 PHP IDE 。

請使用者也參與軟體專案, CMMI-ACQ

先前我在《Bug 數量與軟體品質控制》的回應中提到:從 PM 的角度來看,以使用者和開發者都認可的 use case 為準,必須在此 use case 的範疇下無 bug 才能交貨。不過我觀察國內的 case 好像有個現象,使用者不參與 use case 內容的,彷彿使用者跟這軟體沒關係。依據開發者單方面規劃的 use case 來撰寫 test case 。這種現象好像很正常,但我個人總覺得哪裡不對。

就讓我們這些 programmer 承認吧,我們在進行軟體專案時,口中有 user ,但心中無 user 。使用者總在有意無意之中被排除在外。其實使用者也很關心如何能評量委託他人開發的軟體是否符合需求。例如我現在服務的百貨零售業,前一陣子就為了公司的零售與進銷存系統到底有沒有達到預期目標 (事關付款問題) ,而跟廠商「飛x 高」打了場官司。

到底在軟體工程方法中,有沒有關於甲方 (使用者) 的部份呢?褐雨燕學習筆記 中提到了 CMMI 的部份,規範於「CMMI-ACQ(CMMI for Acquisition Organizations」之中,雖然目前還僅僅在草案階段。

DOM bug in Opera when using an unknown HTML element

前幾天我在寫用 JavaScript 自動轉換 Tag 註記的工具時,發現 Opera 瀏覽器在操作 Unknown HTML 元素 (即自定元素) 的 DOM 方法中有 bug ,不能正確取代或插入其他節點在 Unknown HTML 元素之節點後。如果用取代方法 (replaceChild) 甚至會切斷 DOM 結構。

我設置了一個最簡單的測試環境,使用三種瀏覽器: MSIE 6, Firefox 1.5, Opera 9.1 (build 8679) 測試操作取代及插入動作。 MSIE 和 Firefox 都如預期般正確操作,唯 Opera 有錯誤。

鎖不鎖學術論文之我見

日前聯合報報導台大李嗣涔要求鎖住其指導學生之碩士論文十年,不准他人閱覽 (鎖學生論文10年 惹爭議)。李嗣涔表示願意對論文內容有興趣的人發表演講,一起討論,但不包括有競爭威脅的人。說來說去,不過兩字:「名」、「利」罷了。

在我看來,從事研究工作者不外兩種人:求名利者,求知識者。而應不應該鎖住論文內容,也要從這兩種立場去談。

求名利者,為了名利歸於己,就必須排除競爭者,不能讓別人比自己早一步找到答案。他們發表論文與演講之目的,除藉此收取費用外,更要提高自己的名聲,才能奠定將來獲利的基礎。此外之任何可能對他人有利之途徑皆須排除。對他們而言,鎖住論文是利己的理性行為。

求知識者,但以追求答案為目的,為此可以不拘手段。為了儘早得知答案,甚至讓別人幫他們找到答案,他們反倒希望有更多人一起來競爭。儘可能地利用別人,以便早一天知道答案。對他們而言,鎖住論文是不利己的不理性行為。

我以為從一般認知中,求知識者可稱「學者」,求名利者僅能稱「發明者」、「研究者」。同樣在一般認知中,學校是學者的活動領域,營利性研究機構是發明者的活動領域。倘若李嗣涔對其研究內容如此念念在茲,不妨到營利性研究機構去做,名正言順。

Programming with Subversion Quickstart - Direct repository access

我看到 thinkingmore 在《subversion 與 file:// protocol》提到,在 Windows 下,可以偷懶不用裝 Subversion server ,利用 file:// protocol 就可以存取專案貯藏庫 (Repository) 。在 Subversion 文件中,稱 file:// protocol 的方式為 Direct repository access (See also: Subversion Repository URLs) ,或 Local Access (See also: Local Access to the Repository)。關於這種做法,我補充一些內容。

運用訊息溝通網絡及軟體工程方法建立開放源碼專案之個人淺見

威豆兄問我「如果有一個公司希望你來參與,建立 Open Source 的軟體工程流程 你願意試試看嗎 ?」,我很誠實地回答,我不適合這工作。但威豆兄是位有心人,對 Open Source 的發展很有熱情,又說道:

我們不是要理論的人啊 ... 我們要組成能夠去實踐的團隊 !! 看到很多中小學已經有很多老師願意投入 OSS 程式開發, 但到現在還是非常沒有組織 ... 照這樣下去, OSS 永遠是 Just for Fun !! 如何成為具有關鍵性的角色呢 ? 我們期待更多有心人投入 ... by 威豆 at 2007年02月1日

於是,我也很認真的寫了這篇文章,談談我心目中的 FOSS (Free/Open Source Software) 實踐團隊,以及我是如何從經驗中擁抱軟體工程 (主要是 XP/Agile) 的。

活用 PHP5 的 magic methods - __set(), __get() and __call()

PHP5 在動態性及個體導向兩方面都做了大幅度的加強。其中 Magic methods 概念的引用,更為 PHP5 帶來許多靈活性。

本文說明如何活用 Magic methods 重整 (refactoring) 程式碼。讓 PHP 的程式碼更易於使用。主要重點在 __set(), __get() ,同時也示範了 __toString(), __isset(), __call() 的用途。

PHP 不需要另一個樣版引擎, part 2 - 補充與回應

繼《PHP 不需要另一個樣版引擎》,我再補充一些內容。

PHP 本身就是一個 SGML,XML,HTML 等 markup language document 用的解析器 (parser) ,所以就像一份 XML 文件必須標示 <?xml ?> 一樣, PHP 要求自己包含在 <?php ?> 標籤中。上文說了,這是 SGML 規範內容。儘管我們可以把 PHP 當一個純粹的程式語言,但還是要把 code 放在標籤中。這個怪僻在 Perl, Python, Ruby 中可看不到。

PHP 不需要另一個樣版引擎 (Smarty, PHPLib, etc)

前幾天我看到 phpPatterns 的《PHP and Templates》,作者舉了很多例子說明 PHP 不需要使用樣版引擎。我個人的經驗與該作者一樣, PHP 確實不需要使用樣版引擎。因為 PHP 本身就是一種樣版引擎,在樣版引擎上再加一個樣版引擎是多此一舉。

《蟲師 ~ 重い実》觀後感

動畫《蟲師 ~ 重い実 (沈重之實)》劇情中,有一顆稱為「未成之實」的稻實 (稻種) 。只要埋在土裡,周圍就會有僅限一年的豐收。代價是會奪走一名受惠者的生命。而從犧牷者的口中,會再長出另一顆「未成之實」。每當村裡歉收時,祭主就將「未成之實」植入田中,帶來一次的豐收以及帶走一名村民的生命。代代流傳,就成了「離別的收獲」傳說。

補充資料:企業應用軟體系統的開放原始碼潮流

單憑銷售軟體使用授權的方式,已不足以維持軟體公司的獲利與成長。再者,對企業而言,使用一間小公司的封閉源碼軟體也有後續維護與使用的風險。供給者與需求者雙方都在尋求對自己更有利的交易方式,交易「服務」而非交易「軟體」。

開放源碼的成功,不在其高道德理想,而在其更貼近使用者需求。

我也來看「媒體與學術間的杜正勝」

這幾天為了教育部新編《成語典》中該如何定位「三位小豬」等用語,又讓國文議題登上新聞版面。而教育部長杜正勝又一次糊里糊塗地提起油桶上火線,為著這些事辯護起來,火上加油,引來眾人一陣非議。

教育部長杜正勝昨天下午在部務會報中,對部內官員公開闡明他對成語的看法,「我是胡適的信徒,胡適文存中的八不主義,其中一個就是不用典、不用成語。」他說,「如果我是學務單位,就不會公布成語典。」 聯合報/記者薛荷玉/台北報導 2007.01.25

Regular Expression (RegExp) in JavaScript

Regular Expression (以下簡稱 REGEX) 是以一組特定字元符號描述字串樣式規則的記述語法。簡單地說, REGEX 用於表達字元符號在字串中出現的規則。舉個例子說明,在 REGEX 中,字元 '^' 放在第一個位置表示字串開頭位置,當我寫下 ^A 的記述時,便表示必須是一個開頭為 A 的字串,如 Adam,才符合此一規則。這個表達規則通常稱為 pattern 。 ECMAScript/JavaScript 以內建的 RegExp Object 提供 REGEX 功能。See also: ECMA-262 15.10 - RegExp Objects

無所覺的表單動作, 在使用者未察覺的情形下自動送出表單

這是本人一時興起的試驗作品,寫完之後發現... 這是「惡意」的表單動作。因為我可以在使用者毫無所覺的情形下,記錄使用者瀏覽網站的每一個動作。

原始動機起於我想要在每一個連結上加上「點擊即自動加入書籤」的功能。作法是為網頁上每一個連結都加上點擊事件 (click event) 。當使用者點擊連結時,事件處理函數會自動產生一個表單 (form) ,將連結的網址及標題 (連結標籤中的文字) 填入,再自動將表單送往 黑米共享書籤 (Hemidemi) ,即完成加入書籤的動作。整個過程中,表單是不可見及不可察覺的。瀏覽器仍然會載入連結,而使用者不會察覺到表單送出動作。

徵程式工程師,月薪六萬,每天工作16小時。你做不做?

今天看了獨孤木《我想離職 但也想當好人》一文,剛好跟我的經驗有些雷同。

我離開上一家資訊軟體公司時,用的理由基本上是獨孤木說的「擔心你健康,很怕你常時間熬夜加班,會過勞而死的母親」。另外還加上一些別的理由,例如對公司文化不適應。嘿,所謂公司文化就是唯「微軟」是從,除了 Visual Studio XXX 以外不知其他工具,除 ASP, .Net 外不知其他技術。我在《為什麼程序員不用版本控制工具?》說的就是我碰到的情形。我在 Open source 界混太久了,還真無法退化去適應這種封閉文化。