JavaScript in Seriver-side 發展現況, Rhino 和 wxJavaScript

去年6月, Google 員工 Steve Yegge 指出他打算開發一套基於 JavaScript 語言的 'on Rails' 框架,主要選定的工具是以 Java 實作的 JavaScript 引擎, Mozilla Rhino。故計劃定名為 Rhino on Rails。隔月,又有一個使用 Rhino 實作的 Web 應用開發框架 Helma 釋出。這讓我開始注意到 JavaScript 在 server-side 的開發工作。

前幾天又讓我找到一套將 JavaScript 應用於 server-side 的開發工具: wxJavaScript (See also: 《wxJavaScript - 以 JavaScript 開發視窗與 Web 應用程式的工具》)。Rhino, wxJavaScript 再加上 JScript.Net ,顯示 JavaScript 在 server-side 開發工作上的基礎工具已經漸趨成熟,現在就缺少一個殺手級的應用開發框架了。

JavaScript 需要類別繼承概念嗎?

這2天在找 JavaScript 在 server-side 的軟體開發工作文件時,找到 Peter's Blog,我看完其中的《Transitioning from Java Classes to JavaScript Prototypes》一文之後,很佩服 Peter 這位作者,能夠擺脫過去使用 Java 時的類別繼承思維,認真去研究 JavaScript 的 OO 哲學。

Peter 原本嘗試要在 JaavScript 上實作基於類別繼承(Class-Based Inheritance in JavaScript) 的功能,但隨著他對 JavaScript 的了解日深,他最後放棄初衷,因為:I struggled and struggled but simulating class-based inheritance in JavaScript really doesn't work and makes the code...well...very un-JavaScript-ish.

TWPUG - cakephp換頁效能與架構回應之二

於 TWPUG 之回應內容,點擊連結參閱: 原文章串之回應內容

本文內容主要討論 PHP 資料查詢函數的記憶體管理機制。

FIEND:

如果 我的 db 有 一千萬筆資料 我全部都要入 變數 再 count ... 應該會 error ....

1. count 陣列變數太誇張了..
我在 db 而且 findall 我己經下 limit 了說
塞入 變數 的想法 真的很酷 不敢用會被打死 .

FIEND 不了解查詢結果的記憶體管理機制。當 PHP 向 DB 查詢資料後,資料內容就已經被儲存在 PHP 這方的記憶體內容了。說的更明白些,例如: $resource = mysql_query($query);。此時 $resource 已經是一個儲存了查詢結果的變數(但型態不是陣列)。如果查詢結果有一千萬筆資料,那麼 $resource 就會配置那麼多的記憶體空間儲存那一千萬筆資料。接著再使用 mysql_fetch_array() 等方法取出個別資料記錄。

TWPUG - cakephp換頁效能與架構

本文起於 FIEND 於 TWPUG 上發表之《小弟寫的 cakephp 換頁 排序 功能》。

FIEND 寫道: 而 CAKEPHP 的架構 是很漂亮的 畢竟也是抄 ruby 的架構 . 雖然只做到三層式架構 將 : 資料邏輯層 和 頁面邏輯層 清礎的切開運用 .

這說法挺奇怪的,基本上 "三層式" 只是概念性的說法,以有別於主從式架構明顯的二層結構,並不是 "只有三層"。所以後來更常見的說法是 n-Tier 或 "分散式架構"。"層數"並不是愈多愈好,因此它"雖然"只有三層,並不表示它做的比較差。

還有一點,三層式並不等於 MVC ,雖然同樣是分三塊。

中共建政頭三十年 ~ 死"一小撮人"的歷史

不久前到大陸探親,返程在香港等候轉機時,在機場內的書店中找到了兩本書,分別是《陽謀: 反右派運動始末》、《文化大革命圖典》。這兩本書在國內似乎是找不著的。

加上我原本的《人禍: 大躍進與大饑荒》、《文革十年史》及《天安門》。這五本書大致上可以拼湊出中共建政頭三十年的各種運動之輪廓。這一段歷史我以為可以這麼形容:「死"一小撮人"的歷史」。

湖南祭祖行雜談

前一陣子趁著失業無事之便,去大陸湖南祭祖。從高雄到香港,再從香港轉機到長沙。沒三通就是不便,這一折騰又是一筆開支。接著由堂兄和他的外孫女婿接上車,一路行到祖藉地桃源縣。就是陶淵明不小心迷路進去,出來後寫了篇桃花源記的那縣。但我祖藉地不在桃花源,桃花源還隔了好幾座山頭呢。

我是在台開枝立葉的第一片葉子,更通俗的稱呼是「外省囝仔」、「外省第二代」。我不喜歡這個稱呼,畢竟我確實是在台灣土生土長的人。更何況從小到大,只要我自己不說,沒人看得出我是外省仔。我為什麼要接受那些福佬沙文主義者的稱呼?

無效連結偵測器 - Brokenlink detector

利用 Ajax 技術實作的無效連結偵測器。基本上,它是純 JavaScript 實作品,在 IE 和 Firefox 上都測試過。只有一個外部資源不是用 JavaScript 實作的,就是供 XmlHttpRequest 讀取其他網頁內容的 proxy 。

WebFlow UserInterface

流程編輯器。使用 JavaScript 實作的使用者介面,未附伺服端儲存與載入功能源碼。

使用 wz_jsgraphics.js 繪製線條。當時曾試過 SVG ,但效果與瀏覽器相容性皆不理想,所以還是用 wz_jsgraphics.js 。它是以 1px 大小的 div node 為畫素,構成圖形。

bbslib~~pool - 以小換大的設計啟學

bbslib::pool 是一個簡單的記憶體配置功能 (源碼: bbslib-20010331.tar.gz/strexp/pool.c)。乍看之下,像是一個動態長度字串,但實際上,卻是簡單的動態記憶體管理模組。bbslib::pool 當初在設計時,是有多種考量的,例如安全性。當它要複製或銜接一個字串時,如果原先的空間不足,就會自動重配置夠大的空間去儲存,如此可避免 buffer ovewflow 的問題。而在使用效率上, bbslib::pool 是用 page 為單位向系統要求配置記憶體空間。

起訴天下圍攻,我要自首

新聞報導去年發動天下圍攻的要角,有16人被起訴了。那我也要自首,因為我那天也參了一腳。

我去年十月八日赴台北考乙級軟體設計技術士證術科考,考完之後就在台北火車站夜宿了二夜。因為我要參加天下圍攻。十月十日那天,我違反集會遊行法,還違反道路交通規則,行人站在快車道上。

我是拍照者。從這個角度可以證明,我確實站在快車道上。

在 C 程式中,使用 Regex (Regular Expression) library

我以前維護學校的 Firebird BBS 系統時,寫了一套 library ,其中字串處理部份包含了 Regex library 的使用函數。源碼可於此下載: bbslib2 sources tarball。接下來的 Regex library 說明內容,都取自其中的源碼,不另行列出。

Regex 於其他程式語言中之應用現狀,可見《Regular Expression (RegExp) in JavaScript》、《PHP Manual:Regular Expression Functions (POSIX Extended)》等。

PHP 可用命名慣例避免名稱衝突

PHP5 目前不提供名稱空間(Namespace)功能,但普遍藉由命名慣例 (Name convention) 避免名稱衝突。名稱空間是語法功能;命名慣例則是編程技巧或準則(coding standard)。最常用的慣例是,把你的名號、公司名號或專案名號加在類別名稱前。例如 john 寫了一套 DB 層,那麼類別名稱當為 John_Db ;Xos 專案有一套 DB 層,那麼類別名稱當為 Xos_Db 。甚至於,要學 Java 以 domain name 為命名慣例 (Java 把這套命名慣例應用於 package) 也無不可,例如把類別名稱取作 Tw_Com_ABC_Db 。

在實際撰寫程式碼時,用命名空間和命名慣例的效果是差不多的。如下所示:

$o = new John::Db; //namespace:

$o = new John_Db; //name convention:

名稱空間只得一項好處,就是可以用關鍵字(using or import) 宣告預設名稱空間,讓程序員少打一些字。然而,即便語法支援名稱空間,老練的程序員仍然會採用上述的命名慣例為名稱空間命名,以避免名稱空間的名稱衝突(真拗口...)。

The Austrian View of the Business Cycle

有人說 "The Austrian Model of Business cycle"。嚴格來說,沒有所謂的 Austrian Model 。Model 是數學經濟學家在搞的玩意;對 Austrian School 而言,談的是 Process 。關於 Business cycle 的內容,可參考《人的行為》第20章「利息、信用擴張和商業循環」(Mises著/夏道平譯);線上英文版:《Human Action - Chapter XX. Interest, Credit Expansion, and the Trade Cycle》。Wiki 有一段簡短的說明: Austrian School Business cycle

數字感之數不過三

目前已知的文字系統,都以重複相同的符號來表示前三個數字,例如中文的「一、二、三」,羅馬符號的「Ⅰ、Ⅱ、Ⅲ」。幾乎所有文字系統都在表達三或四以上的數字時放棄此一原則。「數不過三」,一百多年前,心理學家就知道這是人類對數字了解的瞬時極限。 Bertrand Bourdon 的實驗方式顯示,人眼辨識一、二、三個物體不需要半秒,超過三以後,速度和準確度開始劇減。(Stanislas Dehaene/王麗娟譯,《數字感》,pp.73-80)

人的本能,只能分辨「1,2,3」這三個數。這一點從心理學上說明了中文賦予一、二、三等數的意義。一單、二雙、三眾。就本能而言,三以上的數目在分辨時就不準確了,故用「三」就表示數量眾多。「一生二,二生三,三生萬物」(《老子》)。

SQL tips review

jaceju 提到 一篇關於 MySQL 查詢效率的文章: PHP Mysql tips。基本上,該文所列的最快語法,我全部都不建議使用。因為都是 MySQL 特有語法,不具有可移植性。雖然該文主要就是在談 MySQL tips ,但基於可移植性的理由,這種語法能不用就不用。

其他的 SQL 系統,如 PostgreSQL, SQL Server 等等,都針對標準語法(ANSI SQL)做了最佳化。使用同樣的標準語法查詢時,它們的表現不比 MySQL 差。

教育部自己要先考憲法與法律

日前報導 (2007/07/23) 教育部在美國方面施壓下,要求大專院校測考學生的智慧財產權觀念,未通過者不發圖書館證,並要求校方監控學生電腦的網路傳輸內容。

我看教育部的官員自己要先考考憲法與法律吧。檢察官要搜索嫌犯的住所、監聽嫌犯的通訊內容,尚且要備齊證據向法官申請搜索票與監聽。教育部只憑一紙行政命令就要監控學生的網路通訊內容,這是依什麼法、憑什麼權力?如此侵犯個人隱私權的行為,真虧教育部官員想得出來。同樣的,不發圖書館證,也妨害了學生的受教權。

教育部不是警察機關,別把自己當成智財權警察。再者,就算智財權重要,可也和個人隱私一樣,僅是一種私權。豈有令智財權凌駕個人隱私之理?豈能為了保護一部分人的私權,就侵犯另一部分人的私權?而且,另一部分人根本還未發生犯罪事實。軟體業者要保護自己的利益,應先發明有效率的財產權形式,找尋適當的銷售模式。不是把責任都往政府推。

歡迎加入THK

絕望啊! 我對這個只會炒房炒股的政府絕望啦!

工資漲、股價漲、房價漲,物價也漲。失業率也會漲,難道他們不知道嗎?

那也是陰謀嗎?這也是陰謀嗎?這也是、這也是、這也是。全部都是陰謀嗎?陰謀。陰謀。對,這一定是陰謀! 為什麼以前從來沒有察覺到這麼簡單的事呢!? 這都是把我們捲入臺灣家裡蹲協會(Taiwan Hikikomiri Kyokai) 的陰謀。

因為公司裁員,所以我下星期換工作。新職稱是家裡蹲,英文是 NEET ,日文是ひきこもり。THKにようこそ! 歡迎加入THK!

TWPUG問答 - PHP5 個體指派動作的陷阱

前幾天在 TWPUG 上,有位網友提了一個問題。大意是如何以一個個體為正本,透過指派動作複製多次到陣列中,每個陣列元素的內容應該不相同。我看出他碰到了一個語言陷阱,我也回答了。可惜,我當時的答案是錯的... 我重新思索了一下,本文才是正解。

在 PHP5 之後,個體(object)的指派動作皆是使用參照。換言之,當指派來源的資料型態是object時, PHP5 就會用參照;故 $a = $o 的動作實際上等於 $a =&$o

C++和動態語言的泛型

cf 的回應 中提到了 polymorphism 和 generic 的看法。我的看法稍有不同。

我眼中的泛型(generic),若用非常簡化的方式來表達,就是不管型別,只看程式形式,亦即演算法。如稍候例舉的 max() 就是一種泛型演算法 (STL 也有一個同名的演算法)。我的說法和其他人的說法應該沒什麼不同。那麼多型(polymorphism)、泛型和樣板(templete)之間有什麼關係?端視程式語言的特性而定。

首先,多型(polymorphism)具有類別繼承的性質,是個體導向(OO)的概念,但泛型(generic) 不是個體導向概念。我們同樣可以在只有基礎資料型態,沒有繼承觀念的環境中使用泛型設計,只是彈性就低多了。在個體導向語言中,藉由類別繼承與動態連結的能力,才能充分發揮泛型設計的優點。

STL Vector/Map 的使用練習, 附 Ruby 對照程式碼

最近在練習使用 C++ STL 中的 Container 功能。嗯,寫著寫著,覺得很不順手啊。例如不能用 Vector/Set/Map 直接建表。Stack 的 pop() 方法沒有回傳值;我用 C 寫的 stack 功能, pop() 是會推一個值出來的。

挑了兩個 STL Container 的練習程式碼,再用 Ruby 寫一段相同的。兩相比較,也算在吐槽吧。