2008/05/30

好康推薦: Wired-Marker

因工作和興趣,時常需要研讀網路上的資料,如:RFC、HOWTO 等。這些資料的份量常常和一本書一樣,不是一兩天就看得完。如果你和我一樣,不想浪費紙張而直接在電腦上閱讀,一定和我有一樣的困擾:
  • 長長的頁面看到一半,下次要接著看的時候,都要先想想上次看到哪裡...
  • 看到重點不能畫線,剪貼?抄筆記?既麻煩又沒有效果。
  • 因為不能畫線,以至於看到後面時,常常找不到看過的重點...
今天要推薦的就是能夠解決上述問題的工具:Wired Marker


Wired Marker 是 Firefox 的外掛程式,有點類似 bookmark 的功能,但使用起來更接近傳統的書籤,你可以在一個頁面的任意位置放置書籤。它更像是一隻螢光筆,你可以在頁面的文字、圖形、表格上畫上醒目的記號。這些記號也同時是書籤的位置,你可以在 Firefox 的左側框點選既有的書籤;也可以在右側捲軸的旁邊看到文件當中各個書籤位置的示意圖,方便快速移動。

安裝和使用都太簡單了,不需說明。以下再介紹這個程式可能用處:
  • 剪貼筆記本,畫過線的重點可以綜合成一頁,方便瀏覽檢視。
  • 螢光筆可以自訂多種顏色,方便組織分類。
  • 畫線的資料是存在 PC 上,但可以 export 成 XML,很容易就可以複製、傳遞。
心動了嗎?自己試試看吧。

2008/05/20

Ubuntu 的 Terminal Emulator

RS232 是發展 embedded 系統時,相當重要的一個介面。當然,也需要合適的 terminal emulator 來搭配。在 Windows 上,有不少好用的 terminal emulator 可選擇,例如:TeraTerm Pro、PuTTY 或 Windows 預付的超級終端機等等。但在 GNU/Linux 上的選擇就好像少了一點,以下簡單介紹兩個用在 Ubuntu 底下的 terminal emulator。

CuteCom


CuteCom 是 line-based 的 graphical serial terminal。所謂 line-based 是以「行」為單位來輸入,不像一般的 terminal emulator 是以 character 為單位。優點是可以不管 device 的 console 有沒有編輯命令列的能力,我們都可以先在 cutecom 上編輯好再一次送出指令。送出的指令也都存在 GUI 上,只要點一點就可以叫出來重送。另一個好處是可以在字元與字元之間加上延遲,這可解決某些 device 的 console 會掉字元的問題。

Line-based 也是 cutecom 的缺點。許多 embedded Linux 的 console 都有 auto-complete 的功能,但在 cutecom 上卻無法使用。另一個較嚴重的缺點則是不能處理 escape sequences,諸如彩色、粗體、游標移動等,都不能正確顯示。甚至連 tab (0x9) 也都沒有處理。因此 cutecom 比較適合用在簡單型的 console 上。

CuteCom 的安裝方法非常簡單:
apt-get install cutecom
執行的方法更簡單:cutecom,沒有任何命令列參數。

MiniCom

MiniCom 是很傳統的 text-based terminal emulator。雖然沒有 CuteCom 在前面提到的優點,但同樣也沒有那些缺點。既可使用 auto-complete,也可正確處理 escape sequences。因此,非常適合用來當作 embedded Linux 的 console。

MiniCom 安裝方法也一樣簡單:
apt-get install minicom
使用方法也不難,以下幾個心得提供大家參考。首先是設定:
minicom -s
如果你的中文顯示沒有對齊,畫面不清楚。可以用以下方法強迫用英文顯示選單:
LANG= minicom -s
進入設定畫面,有幾個重要的設定項目:
  • Serial port setup,設定 serial device (/dev/ttyS0)、baud rate 等。
  • Modem and dialing,將 Init string、Reset string 設成空字串。
  • Screen and keyboard,將 Status line disabled 以免 status line 破壞畫面。此外,Edit Macros 可提供使用者定義 F1~F10 的 macro,你可以將常用的輸入定義為功能鍵。
  • Save setup as dfl,會將設定存成 ~/.minirc.dfl,設定完畢就 Exit from Minicom
如果設定都正確,在 shell 輸入 minicom 就可以連到 device 的 console 了。離開時,記得按 Ctrl-A 然後 x。

2008/05/19

VMware Virtual Machine 的效能

很好奇 VMware virtual machine 的效能 (performance) 到底如何?於是找了個機會做了一個實驗。實驗用機器的規格為:
  • CPU = Intel Celeron 430 @ 1.80GHz
  • DRAM = 1GiB - 64MiB
此 PC 安裝了兩套作業系統。

第一套是 Windows XP Service Pack 2,並在上面安裝 VMware Player 2.0.2 來跑 Ubuntu 7.10 JeOS i386。分配給 Guest OS 的 memory 是 512MiB,virtual HDD 是 10GiB。我在上面編譯一套 embedded Linux 的系統,總共花了 23 分鐘才完成。

第二套是 Ubuntu 8.04 LTS Desktop x86_64,安裝在 40GiB 的硬碟空間上 (當然 1GiB 的 memory 全歸它使用)。在此環境下編譯同一套系統,總共花了 16 分鐘,大約快了三分之一。

看起來效能的差距不算小。不過一般來說,我們較常進行的是約需兩三分鐘的局部編譯,這時兩者的差異就不是那麼明顯了。況且,編輯的時間比編譯還多更多。因此結論是:還不錯用。

PS:雖然 Ubuntu 的版本不同,但兩次編譯用的 toolchain 是同一套。

2008/04/18

在 EeePC 上安裝 C Compiler

臨時想用 C 寫個小程式,但 EeePC 上卻沒有 C Compiler 可用,這激起我想在小白上面安裝 GNU tool chain 的衝動。

終究按捺下衝動,上網 google 到一套小型的編譯器 -- Tiny C Compiler。雖然只有名副其實的 120K,不過該有的功能一樣不少。適用之後還蠻不錯的,介紹給大家玩玩。

首先,下載以下 packages 到 /tmp:
  • http://packages.debian.org/etch/tcc
    • tcc_0.9.23-4_i386.deb
  • http://packages.debian.org/etch/libc6-dev
    • libc6-dev_2.3.6.ds1-13etch5_i386.deb
    • linux-kernel-headers_2.6.18-7_i386.deb
安裝方法:
sudo -s
dpkg -i tcc_0.9.23-4_i386.deb
dpkg -i linux-kernel-headers_2.6.18-7_i386.deb
dpkg -i --force-depends libc6-dev_2.3.6.ds1-13etch5_i386.deb
使用方法:
tcc hello.c

2008/03/15

在 EeePC 上使用 wxPython

最近在學 wxWidgets。有時只帶 EeePC 出門,又想做點練習... 總不能把整套 GCC 灌到 EeePC 上吧?所以想到利用 EeePC 已內建的 Python。

Python 不能直接使用 wxWidgets,還需要安裝 wxPython 才行。Asus 並沒有提供 wxPython 套件,只好跟 Ubuntu 借。方法如下:
  • 在 /etc/apt/sources.list 新增以下這一行 (或其他 Ubuntu mirror):
    • deb http://free.nchc.org.tw/ubuntu dapper main universe

  • 然後到 console 執行以下指令:
    • sudo apt-get update
    • sudo apt-get install python-wxgtk
這個動作會安裝以下三個套件:
  • libwxgtk2.6-0 (2.6.1.2ubuntu2)
  • python-wxversion (2.6.1.2ubuntu2)
  • python-wxgtk2.6 (2.6.1.2ubuntu2)
安裝完畢,可以用以下範例來試試:
  • http://www.wxpython.org/test7.py.html
以下是一篇很簡短的中文教材:
  • http://yenjinc.info/?p=46
PS:可能不是專為 EeePC 建立的套件,程式結束之後有一些錯誤訊息:
(python:4924): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)'

(python:4924): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(python:4924): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)'

(python:4924): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

還不知道怎麼解決這現象。不過,將就用用還可以...