2009/01/15

Firefox 的 PDFescape Extension

唉... 可能寫筆記不夠用心,竟然跟上時代潮流放起無薪假來了。趁著悠閒,上網看看 Firefox 有什麼新鮮的外掛程式可用,發現 PDFescape 是蠻有意思的服務。

裝上這個 extension 之後,你可以將網路上的 PDF 文件送到 http://www.pdfescape.com 作線上編輯,如:用空白蓋掉原有的內容、加上新的文字和簡易的方圓等圖形,甚至可以加上文字輸入方塊和 checkbox 等。等改好之後,就可以下載這份修改過的文件。

我想到一個使用場合。有時我們必須下載 PDF 格式的表格,印出、填寫然後拿去申請任何東東。有了這服務,寫字難看的我就可以先加工過再印出來,頂多留下簽名欄位就可以了。

我承認用到的場合不多,所以我不會安裝這個 extension。因此隨手記下,以備將來之需...

2009/01/13

使用 vim 和 cscope 來 trace 程式碼

Vim 是個很實用的程式編寫工具,不過一開始需要花點心力走過學習曲線。有興趣的人可以在網路上找找學習教材;如果你已經有點基礎但記不清按鍵,以下這個網址提供相當有系統的整理,依照功能分成七個自學課程,很值得一看:
除了編寫程式,Vim 用來追溯程式 (trace code) 也相當好用。例如,先將游標移到程式的某個文字串,再按以下按鍵:
  • '*' 往前找出此文字串 (按 n、N 繼續找)
  • '#' 往後找出此文字串 (按 n、N 繼續找)
  • 'gd' 將此文字串視為 local 變數,找到定義此 local 變數的地方 (如果有的話)
其他追溯程式常見的動作:
  • '%' 找到被配的括號
  • '[[' 找到函數的開頭
  • ']]' 找到下一個函數的開頭
當你維護的軟體專案不小時,上述功能絕對不夠用。這時你需要 cscope 的協助。當你安裝好 cscope,而且建立好專案的 cscope 資料庫之後,將游標移到程式當中某個文字串,按 Ctrl+\ 再按以下按鍵:
  • 's': 即 Symbol,以此文字串當識別字,列出專案當中所有參考到此識別字的地方,包含定義和引用
  • 'g': 即 Global,以此文字串當作 global 變數或函數的名稱,跳到專案中定義此 global 變數或函數的地方 (這個功能有另一個與 ctags 相同的快速鍵 Ctrl-])
  • 'c': 即 Calls,以此文字串當函數名稱,找出所有呼叫到的此函數的函數
  • 't': 即 Text,列出專案中所有出現此文字串的地方 (包含註解)
  • 'e': 即 Egrep,以此文字串當 regular expression,用 egrep 方式來搜尋
  • 'f': 即 File,以此文字串當檔案名稱,開啟此檔案
  • 'i': 即 Includes,以此文字串當 header 檔名稱,列出所有 include 此檔案的檔案
  • 'd': 即 calleD,以此文字串當函數名稱,列出此函數所呼叫到的函數
上述指令若是列出相關程式碼,你可以輸入數字加 Enter 來跳到該檔案的相對位置。按 Ctrl-T 就會回到游標原來的檔案和位置。你也可以用以下的方式來輸入指令 (foo 就是搜尋的文字串):
  • :cscope find symbol foo
  • :cs f s foo
安裝 cscope 的方法:
sudo apt-get install cscope
mkdir -p ~/.vim/plugin
cd ~/.vim/plugin
wget http://cscope.sourceforge.net/cscope_maps.vim
建立及更新軟體專案 cscope 資料庫的簡單方法如下 (其他更複雜的用法請參考 http://cscope.sourceforge.net):
cd PROJECT
cscope -bR

2009/01/07

Ubuntu 存放 icon 的位置

這絕對是一件小事,但每次都記不得,所以決定寫下來:Ubuntu 存放 icon 的主要目錄是 /usr/share/pixmaps。當你在面板上加入自訂的程式啟動圖示時,常常會需要到這個目錄找應用程式的圖示。

2008/12/29

Vim 建議的四種 TAB 字元處理方式

Vim 的 help 建議四種 TAB 字元處理方式:
  1. 將 'tabstop' 固定設為 8;'softtabstop' 和 'shiftwidth' 設為 4 (或其他你所喜好的縮排長度);然後指定 'noexpandtab'。這樣,vim 在處理檔案的時候會視需求自動混用 TAB 和空白字元,但你按 TAB 或 BS 鍵時,都會以 4 格 (或你喜好的縮排長度) 來移動。

  2. 將 'tabstop' 和 'shiftwidth' 設成你所喜好的縮排長度,然後設定 'expandtab'。這樣,你編輯的檔案將不會有任何 TAB 字元。以其他編輯器來看時,縮排不會受到 TAB 設定不同的影響。

  3. 將 'tabstop' 和 'shiftwidth' 設成你所喜好的縮排長度,然後將此設定以 modeline 的方式寫在檔案之中。這樣,只要使用 vim 而且 modeline 有開啟的話,大家看到的樣子都會一致。

  4. 將 'tabstop' 和 'shiftwidth' 設成相同的值,然後設 'noexpandtab'。這樣,即使別人的設定不一樣,看起來也只是縮排程度不同,結構上是沒有問題的。不過,你只能在每一行的開頭使用 TAB 字元,其他地方的 TAB 字元可能會因縮排長度的不同而破壞原來的排版 (例如:原本對齊的 C 常數定義變沒有對齊)。
個人推薦方式 2 再嵌入 modeline 設定,如下:
vim: set et ts=4 sw=4:
嵌入 modeline 設定不單純只給 vim 看,而是當作一種宣告:本文件的縮排為四格而且以空白展開 TAB,希望修改文件的人都能遵循這個慣例。

但是有一個例外:Makefile。Makefile 的 TAB 字元是有意義的,不可用空白取代,所以 modeline 應該設為:
vim: set noet ts=8 sw=8:
另外,我也建議 ~/.vimrc 要有如下的設定:
set smarttab
set autoindent
這樣寫程式會比較方便。

2008/12/28

Vim 的 modeline

有團隊合作寫程式經驗的人,應該能夠了解共同的 coding style 是非常重要的。先不管 if-else、for、while 之類的述句該怎麼編排,至少縮排幾格、tab 如何處理一定要統一。否則一個 source code 經過幾個人 (其實是編輯器) 的修改,可能會變得不成人形。

問題出在不同的編輯器對 tab 可以有不同的處理方式:對齊四或八格?要不要展開成空白?若編輯器的設定不同,甲看起來漂漂亮亮的排版,在乙那邊可能是歪七扭八的。

Vim 的 modeline 提供一個方便的解法:在 source code 當中就可以指定編輯設定,包含此檔案的 tab 應該要如何解讀。

Modeline 是藏在文件開頭或末尾幾行的特殊格式字串,vim 讀取文件時若發現這些字串便會修正自身的設定。在程式當中,通常是寫在註解裡頭。例如:
// vim: ts=4 sw=4 et
這是 modeline 的第一種寫法。vim: 標記特殊字串的開頭,結尾則是本行結束。特殊字串當中以空白或「:」隔開各個設定項目。利用這種方式,後面不可有其他任何字元,所以,若是用 C 的註解符號必須寫成:
/* vim: ts=4 sw=4 et
*/
第二種寫法同樣以 vim: 標記特殊字串的開始,但之後必須跟著一個 set。下一個「:」代表特殊字串的結束,之後可以有其他文字。例如以下用於 Python 的範例,同一行除了包含 vim modeline 之外,也包含 Pyhton 指定 source code encoding 的寫法:
# vim: set ts=4 sw=4 et: -*- coding: utf-8 -*-
個人推薦這種寫法,因為 vim 的 modeline 處理並非強制的,有些 Linux distro 的 vim 預設值將 modeline 關閉;也有些人有安全顧慮,不想開啟 modeline。遇到此情況,我們可以直接剪貼兩個冒號之間的字串即可複製該設定。若要啟用或關閉 modeline 功能可以編輯 ~/.vimrc:
set modeline
set modelines=2
第一行是啟用 modeline;第二行是將搜尋 modeline 的範圍設定為文件開頭和末尾各兩行,若省略則預設為五行。

參考資料:

2008/12/24

VirtualBox 2.1.0 的 Host Interface Networking

使用 VirtualBox 的 Host Interface Networking 的好處是:可以省掉 NAT 型態設定 port forwarding 的麻煩;缺點則是要多一點設定的工作。但是 VirtualBox 2.1.0 版針對此部份有大幅的改進,只要從 GUI 點選 Host Interface,再從選單選出 host 主機的網路介面即可。請參考:

2008/11/25

coLinux: 讓 Linux 在 Windows 上跳舞

需要同時使用 Windows 和 Linux 的人,除了可以在 Windows 上用 VirtualBox 或 VMware 等跑 Linux 的 virtual machine 外,還有另一個選擇:Cooperative Linux。

Cooperative Linux 簡稱 coLinux,是 Windows device drivers 加上搭配的 Linux kernel modules 所形成的組合。透過這個組合,原生的 Linux 系統可以和 Windows 共用硬體資源。你可以想像 coLinux 是將 Linux 系統當成 Windows 的應用程式來執行。據說任何 GNU/Linux 的 distro 都可跑,不過要稍微調整過。比較簡單的方法是安裝 coLinux 時,直接挑選他們準備好的 distro。

和使用 virtual machine 的方式來比,coLinux 有幾個缺點:
  1. 穩定性。coLinux 以最高權限的方式和 Windows 共用資源,萬一有甚麼問題,整個 Windows 系統都有可能受到影響。
  2. 安全性。在 Linux 系統上取得 root 權限,就有可能也取得 Windows 系統的管理者權限。
  3. coLinux 目前還無法共用繪圖硬體,因此不能在 coLinux 上跑 X server (不過可以在 Windows 上跑 X server)。