拿到兩張台北 101 大樓觀景台的票,九月底就要截止了。雖然天氣不好,但眼看號稱今年最強的薔蜜颱風要撲台了,所以趁這個週末跟 Oberon 趕快去參觀,順便測試使用 i-gotU 軌跡記錄器,搭配 @trip 服務的效果。
點取底下地圖可以看到詳細內容:
2008-10-07
台北 101 大樓觀景台
Posted by JY at 7:11:00 PM 0 comments
2008-09-09
深入 qsort(3)
如果你有學過演算法或資料結構,相信對 quicksort 一定不會陌生,或許細節忘了,但是至少應該有聽過。實作 quicksort 讓我們學習到重要的「divide and conquer」設計典範 (design paradigm),並且對於操作邊界值有更精確的體體認。我每隔一段時間都會重新實作幾個典型的排序演算法,例如 quicksort、insertion sort、bubble sort、heapsort、merge sort 等等。藉此磨練自己的 coding 技巧,靈活一下自己的腦袋。
實作 quicksort 時,不免讓人想到 standard C library 中的 qsort(3)。從 qsort 這個字眼上,很直覺地想到他可能是由 quicksort 這個名稱來的,甚至直覺地推斷 qsort 就是 quicksort 的實作。實際上只答對了一半,qsort 遠比我原本想像的還要複雜。參考 GNU libc 2.4 中 qsort 的實作部分,在記憶體方面,運用了不少跟硬體平台相關的特性,以加速記憶體的處理。撇開平台相依部分不談,單就演算法設計方面來看也有很多巧妙之處。
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
首先,qsort 會先判斷欲排列元素個數 size 是否小於 1024,若小於 1024 則呼叫
msort_with_tmp
來處理。msort_with_tmp
實作 merge sort 演算法,最後一個參數是一個 size 大小的 buffer,作為 merge sort 所需的 O(n) 空間之用,可以避免過於頻繁的記憶體配置。若是 size 大於 1024,則會根據目前系統的記憶體狀況,決定該使用什麼演算法。在最壞情況下,merge sort 演算法的時間複雜度是 O(n log n),好過 quicksort 的 O(n2)。由於 merge sort 需要額外的 O(n) 空間,所以在記憶體空間允許的條件之下,會優先使用 merge sort,否則便呼叫 _quicksort
。_quicksort
實作一個真正的 quicksort 演算法,並採用以下幾點優化的設計:- Non-recursive (非遞迴) - 使用 stack 資料結構取代遞迴呼叫所需要的 function stack,增進程式執行效率。實際上這個 stack 不用太大,在 32-bit 環境下,最多只需要 32 個元素空間 (在 64-bit 環境下,則為 64 個)。為什麼是 32?因為在 32-bit 環境下 size_t 為 32-bit,log 232 為 32。
- 以 median-of-three 方法決定 pivot - 一般 quicksort 演算法通常取開頭元素當作 pivot,但這往往不是一個理想的值,尤其對於已排序的陣列來說,會造成最壞的結果。以陣列開頭、最後與中間位置三值的中位數當作 pivot,比較有機會取到較理想的值。
- 混合 insertion sort 增加效率 - 對於元素個數少於某個 threshold 的 partition,使用 insertion sort 能夠大大地增加執行效率。對於小陣列而言,insertion sort 會比 quicksort 來的有效率許多。在 GNU libc 2.4 實作中,此 threshold 值設定為 4 (MAX_THRESH),個人感覺太小了點。有些實作將它設定為 8,如 Visual C++。
- 較小的 partition 優先處理 - 換言之,較大的 partition 先放入 stack 中,此舉保證 log(size) 不會超過 stack 大小。
Posted by JY at 2:28:00 AM 0 comments
Labels: programming
2007-12-31
開發 JavaScript 利器 - Prototype
最近為了開發 AJAX 網站,需要找一套支援 AJAX 的程式庫,想到了前一陣子發現的 script.aculo.us 這套 JavaScript 程式庫。script.aculo.us 裡面提供了很多令人讚嘆的 JavaScript 視覺特效,而其是架構在 Prototype 這套 JavaScript 框架上。其實要使用 AJAX 功能,只需要 Prototype 即可。再動手寫幾個測試程式之後,發現 Prototype 實在太好用了,尤其是有 Prototype 的 Swiss Army Knife 之稱的 $() 函式,令人覺得非常神奇。
當然,作為一個 programmer 不能只是感到神奇而罷休,便開始追蹤 Prototype 的程式碼。在追蹤之後才發現,原來 JavaScript 可不是我原本想像的那樣而已,JavaScript 也決不簡單。在 Prototype 原始碼中看到了很多高段的 JavaScript 技巧,不得不佩服作者的巧思,令我獲益良多。如果能看懂 Prototype 原始碼,我敢說你的 JavaScript 功力已經是很不得了了。
Prototype 已經變成我開發網頁的必備良藥之一,改天有空開始再來玩玩 script.aculo.us、Rico 或 YUI 等等其他 JavaSctipt 程式庫。
Posted by JY at 1:48:00 AM 0 comments
Labels: api, development, programming, web
2007-12-24
平安夜的無聊小發現
大家大概知道,從前一陣子開始,Gmail 的容量成長開始加速,預計明年達到 6 GB 以上。剛剛無聊粗略計算了一下,發現 Gmail 的容量在美國時間平安夜當天 (約中午) 會剛好成長到 6000 MB。不知道是不是 Google 故意設計的? :)
Posted by JY at 8:56:00 PM 1 comments
Labels: fun
2007-11-16
台灣辦公室中常聽到念錯的英文單字
在台灣辦公室中,尤其在科技業的,說話時老喜歡夾雜一些英文單字。對於某些外來的專有名詞,直接唸原文會比較直接,避免誤會。但是對於動詞,除非有特殊情況,我個人認為還是盡量使用中文。習慣一旦養成,要改談何容易,但最起碼發音要正確。如果很愛「ㄌㄠ\」英文卻又發音不正確,不是很糗嗎?對於英文非母語的我們,要發音非常標準是有點強人所難啦,但至少要正確吧。
底下舉幾個常被念錯英文單字 (有些字念錯意思可是差了十萬八千里呢):
- file 唸成 fire 。
例:麻煩你把 fire 傳給我。(不禁讓我想到 Prometheus 普羅米修斯) - email 唸成 emare (依媚兒)。
例:給我你的依媚兒。 - cancel 唸成 cancer。
例:這個 case 最後被 cancer 了。(怎麼會扯到癌症) - standard 字尾 dard 應該要發的是 spider 的音,而非 radar 的音。
- implement 唸成 impriment。
- exit。
類似 l 與 r 的音不分的情況不勝枚舉,這可能是亞洲國家英文的通病吧。只要把這兩個音分辨清楚,我想英文發音就算是前進一大步了。
註:聲音檔取自 The Free Dictionary
Posted by JY at 2:28:00 AM 3 comments
2007-11-13
Google's Android SDK Now Available
為了刺激全世界的開發者共襄盛舉,Google 更大手筆端出高達千萬美金的獎金,舉辦 Android Developer Challenge。想必此舉一定讓全世界的高手摩拳擦掌,躍躍欲試。第一輪入選的五十名,每位可以得到 $25,000 美金,第二輪則選出二十名,其中十位可得 $100,000 美金,另外十位可得 $275,000 美金。而這應該只是第一階段而已,因為上述獎金只佔總獎金的一半 (五百萬美金),沒意外的話還會有第二階段的比賽。看到這樣的獎項,真的令人很心動啊!
Android 的介紹:
(看到這段影片第一個反應是:Sergey Brin 的頭髮怎麼了!?)
Posted by JY at 11:06:00 AM 0 comments
Labels: api, development, mobile, web
2007-11-12
六福村之旅
星期六是公司舉辦的 Family Day,地點在六福村主題樂園。上一次到六福村已經是六年前的事了,還記得那天是 2001 年的國慶日,所以印象比較深刻。現在六福村對我來說已經沒有多大的吸引力了,我對於人工式的樂園沒多大興趣,也不熱衷刺激的遊樂設施。老實說,去玩那些刺激的遊樂設施,心裡多少會毛毛的。人說越老越怕死,一點都不假。不過相較於男生,女生似乎比較喜歡這種刺激的遊樂設施。不知道是不是不懂的害怕,還是喜歡享受尖叫的快感?這天六福村主題樂園的重點項目「笑傲飛鷹」與「大怒神」因風強所以暫停開放,現場抱怨聲連連,我倒是鬆了一口氣。
以往到六福村總是忽略它還有一個野生動物園 (曾幾何時,野生動物園是六福村的招牌項目),總認為要玩到遊樂設施才算是值回票價,不過這次的六福村之行有了新的體會。常被忽略的野生動物園,才是這次讓我們覺得值回票價的項目。參觀野生動物園有兩條路線,一個是搭乘蒸汽小火車環繞動物園區,另一個是搭乘猛獸遊園巴士。聽說蒸汽小火車 (當然不是用真的蒸汽火車頭) 是前不久才規劃好的,遊客可以近距離觀賞較溫和的動物。跟台北動物園相比,雖然六福村野生動物園的動物種類不多,但是動物們的活動空間比較大,也比較自由,在這裡的動物應該會比較快樂吧!下次如果有機會到六福村一遊,建議可以去逛逛野生動物園。
Posted by JY at 7:38:00 PM 0 comments
Labels: trip
2007-11-09
PHP vs. Ruby on Rails
因為工作的需要,必須在有限的時間內開發一個網站。這個網站需要具備使用者帳戶管理與認證的功能,並管理使用者上傳的資料,故與資料庫之間的關係密切。我也希望這個網站能盡量運用到 open source 的力量,所以基本的軟體平台將會以 Linux + Apache + MySQL 為主。網站開發工具方面,目前有三個選項:
- 純 PHP (不使用 PHP framework)
- CakePHP (或其他 PHP framework)
- Ruby on Rails (RoR)
CakePHP 的優點
- 我比較熟悉 PHP 語言
- PHP 豐富的資源 (容易整合許多現有 PHP 的 open source 計畫)
- 成熟度高,品質已被廣為驗證 (許多之名網站都是用 PHP 打造的)
- 執行效率快 (相較之下,Ruby is slow!)
- Ruby 語言優勢 (如 OO),以及學習新語言的樂趣。
- 可能是明日之星 (迅速崛起,目前很火紅的 framework)
- Rails framework 肇始者 (比較忠於原味?)
- Ruby 社群團結,只有一個 RoR (相對之下,PHP 選擇太多,容易缺乏向心力)
以此來看,CakePHP 似乎是比較符合我的需求。
Posted by JY at 1:53:00 PM 1 comments
Labels: development, web