Category: 未分類
-
Speed comparison C vs Common Lisp
昨天看到有人轉噗一則 StackOverflow 上面的問題,內容是問他分別用 C,python, erlang 與 haskell 寫了 Project Euler 的第十二題,但是haskell 版本慢得不像話,該如何改進? 以下是苦主的原始 C 語言版: 我的執行時間約為 5.48s 手癢想看看據說可以編譯出不錯的機器碼的 Common Lisp 速度怎麼樣,於是第一個版本如下 (用 sbcl 執行): 還不錯,11.192s,這個版本採用原文中給 haskell 的建議,使用 rem 而不是 mod,可以加快一點速度。再給一點關於型別的提示,然後把第一個 function inline,第二版可以跑出和 C 版本差不多的成績 5.563s 🙂 純粹湊個熱鬧而已,有興趣的人可以試試看把 loop 改成和原文其他語言一樣使用遞迴來實做,大部分 Lisp 都有做 TCO,速度應該差不多… 結論:Common Lisp is awesome 😉
-
Literate Programming
Let us change our traditional attitude to the construction ofprograms: Instead of imagining that our main task is to instruct acomputer what to do, let us concentrate rather on explaining to humanbeings what we want a computer to do. ― Donald Knuth. “Literate Programming (1984)” Thinker 的一篇心靈與程式碼的協奏曲提到程式由後往前寫似乎比較符合思考的方向,不禁讓我想到 Knuth 提出的 Literate Programming 方法;其實我們思考的順序有時是跳躍式的,用 LP 的方法可以完全跳脫先後關係,用自己喜歡的順序來寫,我覺得也可以稱為碎碎唸寫法。 用 […]
-
Android: Wakelocks and TuxOnIce
最近為了把 TuxOnIce 整到 Android 上面,著實把 Linux 的電源管理系統中關於 suspend 與 hibernation 的部份研究了一下。而 Android 為了增加待機時間加入了 wakelock 的機制,讓情況變得更加複雜。 TuxOnIce TOI Patch TuxOnIce 簡稱 TOI,前身是 Software Suspend 2,是一個長期在 linuxupstream 以外耕耘的一個休眠補釘,相較於早期整合到 linux kernel 內的swsusp,TOI 的功能非常豐富,可以指定把記憶體內容儲存到多種不同的位置,如檔案或置換空間,還可以選擇不同的壓縮方法。 首先幫 ARM 平台加上基本的休眠功能,使用 Hiroshi DOYU 的 patch: http://article.gmane.org/gmane.linux.power-management.general/20543 然後到 TOI 網站下載最新的 3.2 補釘,打上去的時候會有一些衝突但是都還滿容易解決,要注意的是某些衝突是看不出來的,例如因為函式移動位置而造成重複定義,要小心檢查。 然後因為 TOI 對於非 x86 平台有一些假設現在已經不適用,所以需要修改 https://gitorious.org/0xlab-kernel/kernel/commit/e551caf OMAPFB 使用 Pandaboard 加上 Android 測試才發現從休眠醒來後 […]
-
Android 2.3 Introduction & Statistics
如果你有收看 LWN.net 的話,大概知道每次 linux kernel 有新的 release 前 都會有一次針對這次 release 的統計資料,看看主要的貢獻是由哪些人,哪些 公司完成。藉由這次跟 0xlab 分享 Android 2.3 新特性的時候,我學 LWN.net 做了一些小統計,還滿有趣的。 Most active Android 2.3 organizations (by changesets) 4204 google.com 1354 android.com 98 sonyericsson.com 71 gmail.com 39 codeaurora.org 39 samsung.com 38 intel.com 32 nokia.com 32 holtmann.org 29 0xlab.org 25 trusted-logic.com 17 openbossa.org 11 nxp.com 11 linux.org.tw 10 […]
-
Understanding UUID
通用唯一識別碼 (Universally Unique IDentifier, UUID) 或是全域唯一識別碼 (Globally Unique IDentifier, GUID) 是一個 128 bits 的整數,並保證其在時間與空間的分佈都是獨一無二的。UUID 由開放軟體基金會(OSF) 標準化後用在他們的 DCE 系統上,後來在微軟的 COM 系統上發揚光大。除此之外在許多地方也都可以看到 UUID 的身影,如 Linux 上的分割表/區塊裝置就是以 UUID來標示,或是RSS 的 <guid> 標籤也可以使用 UUID,實際上 UUID 是標準的URN 表示法之一,你可以在任何需要標示單一物件的地方使用 UUID。 UUID 的文字形式為一個 8-4-4-4-12 的十六進位表示,共有 16 個 bytes,有人說使用 UUID 不方便人類辨識,但了解 UUID 的組成後你還是可以從這個表示法看出一些端倪來。本文參考的是 IETF 版本的 RFC4122。 UUID 共有四個版本,第 13 個字元的位置就是表示版本號。第一種是以時間和網路卡號組成,時間是以一百奈秒為單位,網路卡號理論上是不會重複的,再加上clock_seq 這個每次開機重設一次的亂數欄位,就算時間回朔了也不會重複,代號是 1。第二種和第四種是以命名空間加上一個 hash 組成的,分別可以使用MD5 […]
-
Blog Redesigned
最近又把 Blog 整頓了一番,目標是改用靜態網頁。使用靜態網頁搭配一些網頁樣板程式不禁讓人想起最初使用 MT 來寫 Blog 的時候,不同的是現在有像Disqus 或是 IntenseDebate 這樣的動態留言服務,讓網頁可以完全的只提供靜態內容,不用多一個 cgi 程式來提供留言功能,這隱然成為最近流行的網頁設計方法之一。 轉換的過程中學到一些新東西,紀錄於此。 網頁編譯器 現在網頁是用產生的,它是大師 Joey Hess 的作品,大師稱它是一個wiki compiler,可以透過各種規則把網頁的原始碼 (可能是 markdown 的格式) 轉成 HTML 網頁。因為強大的 inline 規則以及各式各樣的外掛程式,也有許多人把 ikiwiki 當作Blog 的平台。 轉換的過程其實滿順利的,因為舊的 Blog 都是以 Markdown 寫成,換到ikiwiki 的 Markdown 引擎只需要一點點修改。要感謝 WordPress 可以把資料庫匯出成 XML 格式,轉換只需要簡單的 XSLT 就完成了,我用的XSL 是參考這裡修改,去掉Comment 以及更新 meta的格式而成。 改用文字編輯器來寫 Blog 後,會習慣在 72 行的地方換行,但是在瀏覽器中只要換行就會多一個空白,以前寫網頁的時候遇到中文都要小心的換行才不會讓不該空白的地方出現空白,也不能打開 Emacs 的 auto-fill […]
-
TOP 20 Space-Hungry Packages
Arch Linux 與 Debian 皆可以在安裝的時候選擇最小安裝,究竟哪一個Distribution 在使用一段時間之後最佔空間呢? 剛安裝完的時候似乎是 Arch比較小一點,但是因為 Debian 套件切的比較細,所以最後可能是 Debian 會比較小。 當初在試用 Arch 的時候寫了小程式來畫出前 20 個最佔空間的套件,並依此來瘦身,結果如下: 兩邊因為安裝的套件種類不同因此無從比較,Arch 的 TeXLive 因為沒有切所以會比 Debian 上較大一點,Debian 上的 ghc6 則是為了測試 xmonad 裝的,Haskell 本身做出來的執行檔就頗大,ghc6 需要 369MB 實在不意外… 底下是製作圖片的程式,實際上是用 Google Chart API 畫的: 把 PKGSIZE_PROG 代換成自己 Distro 的就可以了: Debian: Arch:
-
Cool stuff: Pipeline library
如何在 C 程式中方便使用 pipeline 呢? Unix pipeline 之父說 Unix 程式的哲學就是「只做一件事,並把它做好」: “This is the Unix philosophy: Write programs that do one thing and doit well. Write programs to work together. Write programs to handletext streams, because that is a universal interface.”― Doug McIlroy, the inventor of Unix pipes 平常有在使用 shell 的朋友想必對 | 這個符號不陌生,他可以把多個指令頭尾相接,各展所長,讓我們可以把各程式的力量組合起來成一個強大的 pipeline。 在 shell […]
-
Kindle 來我家
做功課 是這樣的,某天在 IRC 上看到某長輩發言 “j5g: Hmm….有點想買 Kindle DX”,小宇宙就有了光,開始上網搜尋 Kindle 相關資訊,經過 Amazon, Wikipedia, Mobile01, MobileRead 無情的生火之後,終於爆炸了啦啦啦!首先是 Kindle DX 的規格: 嗯.. 作業系統是 Linux!有門!趕緊再搜尋一下,的確已經有許許多多成功 Hack Kindle 的案例,其容易的程度,說他是 Hackable Device 也不為過。 開箱 折騰了兩週,訂購的 Kindle DXG 終於在生日當天送達!小小開箱慶祝一下: 開箱之後就是充電,開始把各種不同的文件丟進去測試。這個版本的 Firmware (2.5.5) 對於 PDF 的支援其實已經不錯了,會自動裁掉多餘的留白,內嵌字型也都正常顯示,是一開始閱讀中文的方案之一。測試各種檔案之後發現只有一種不太適合放上來看,就是字很多的雙欄格式論文,因為顯示全頁會顯的字太小,偏偏 150 ppi 的解析度看不太清楚,若是放大瀏覽的話,雙欄論文的走向會需要來回拖拉,而拖拉正是目前 E-Ink® 的弱點… 除此之外,在 Kindle 上面閱讀是非常好的體驗,E-Ink® 的特性可以讓人真的進入閱讀的情境之中,內建的 Text-To-Speech 質量非常好,就有如真人在幫你朗讀一樣,新版的 Firmware 還新增了 Collection 的功能,解決 Kindle 以前一直為人詬病的無法分類電子書的問題,Kindle […]
-
[非官方] COSCUP 2010 Mobile App
今年 GoogleIO 時 Android team 不斷在推廣一個 Android UI Pattern,可以觀察到最早利用這個 Pattern 的應該是預設的 Facebook 程式,接下來發展的更為完備的是 Twitter 官方程式,處處可以見到該 Pattern 的影子。GoogleIO 前 Google 也推出一個程式叫作 IOSched 用來顯示議程相關資訊,同樣是使用該 Pattern 的實作。雖然 Twitter 承諾會釋出 source code,但是一直沒下文,因此想要使用這個 UI Pattern 的可以說完全沒有範例可以參考。 今年 COSCUP 就參考 IOSched,嘗試從頭打造一個類似的程式,順便練習一下怎麼使用這個 UI Pattern,結果寫好後才知道上官大神早有 HTML5 的版本,連 IOSched 不知道什麼時候也有 source code 了 (汗) 無論如何,總算是練習了一下 Android Programming,有參加 COSCUP 的人可以試用看看 😛 Source code 在 http://github.com/kanru/Coscup2010