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 ts=4 sw=4 et:
嵌入 modeline 設定不單純只給 vim 看,而是當作一種宣告:本文件的縮排為四格而且以空白展開 TAB,希望修改文件的人都能遵循這個慣例。

但是有一個例外:Makefile。Makefile 的 TAB 字元是有意義的,不可用空白取代,所以 modeline 應該設為:
vim: set ts=8 sw=8 noet:
另外,我也建議 ~/.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)。

2008/10/28

不用 sudo!以 non-root 身份用 Wireshark 抓封包

在 Ubuntu 上安裝好 Wireshark,想抓封包時卻找不到網路卡。原來必須執行 "sudo wireshark" 才有足夠的權限。這樣子除了麻煩之外,還有一個不方便:封包存檔之後是屬於 root 所有,處理起來相當不便。

經過一番努力,找出幾個解決方案 (越後面的方法越好)。

方案一

最簡單的作法是安裝完 Wireshark 之後執行 "sudo chmod u+s /usr/bin/dumpcap"。這樣子就可以一般使用者的身份抓封包了。關鍵在於 "dumpcap" 就是那個需要 root 權限的部份,上述指令讓一般使用者也可以 root 的身份執行 "dumpcap"。

這種方法雖然簡單,但對講求安全的人來說卻不太妙。因為所有人都可以執行這隻需要 root 權限的程式。方案二是一個改進的方法。

方案二

改進的方式就是只開放給特定 group 的人以 root 身份執行 "dumpcap":
  1. 執行 "sudo vi /etc/group" 並新增一個 group (建議叫做 "wireshark"),然後將自己加入此 group
  2. 執行 "sudo chgrp wireshark /usr/bin/dumpcap",將 dumpcap 改為 wireshark group
  3. 執行 "sudo chmod 4754 /usr/bin/dumpcap",只讓屬於 wireshark group 的人可以 root 身份執行 dumpcap
完成上述動作之後,重新登入讓 group 所屬生效。這樣你就可以用原本的身份抓封包了,封包存檔的所有也都屬於原本的身份。

方案三

方案二雖然已經限縮有執行權限的人,但終究還是以 root 身份執行 dumpcap。更嚴謹的方法是:利用 Linux Capabilities 只授權 dumpcap 有抓封包的權限。方法如下:
  1. 同方案二的步驟 1 和 2
  2. 執行 "sudo chmod 750 /usr/bin/dumpcap",只讓屬於 wireshark group 的人可以執行 dumpcap (以一般身份)
  3. 執行 "sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap",授予 dumpcap 有抓封包所需的權限 (若沒有 setcap,請自己安裝 "sudo apt-get install libcap2-bin")
參考資料:

2008/10/23

Running Wireshark as a non root user

In general, we have to run "sudo wireshark" to capture packets. It is very annoying. Luckily, I found solutions that work on my Ubuntu box.

Solution 1:

The simplest way is to run "sudo chmod u+s /usr/bin/dumpcap" once. That's all! Because "dumpcap" is the only part that need root privileges. However, it is not a good practice to enable all to run an executable that has root privileges.

Solution 2:

The better solution is to create a group and allow the members of the group to run "dumpcap" with root privileges:
  1. "sudo vi /etc/group" to create a new group, say "wireshark", and enroll yourself to this group
  2. "sudo chgrp wireshark /usr/bin/dumpcap"
  3. "sudo chmod 4754 /usr/bin/dumpcap"
Logout and login again to take the new groupship and you can use Wireshark to capture packets as a non-root user.

Solution 3:

The best solution is to grant "dumpcap" the right to do its job without involving root access at all:
  1. Same as step 1 & 2 of Solution 2
  2. "sudo chmod 750 /usr/bin/dumpcap"
  3. "sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap"
References:

2008/10/17

在 Ubuntu 上安裝 Apache2 的 HTTPS Server

在 Ubuntu 8.04 上安裝一般的 Apache2 HTTP server 非常簡單,只要以下的指令:
sudo apt-get install apache2
若要安裝支援 SSL 的 HTTPS server 還需以下步驟:
sudo apt-get install openssl
sudo apt-get install ssl-cert
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf \
/etc/ssl/private/localhost.pem
第三動是要產生 SSL 用的 key。執行時會問以下的問題 (若只想作作實驗,可以先隨便填):
Country Name = TW
State or Province Name = Taiwan
Locality Name = Some-Locality
Organization Name = One Organization
Organizational Unit Name = Organizational Unit Name
Host Name = localhost
Email Address = webmaster@localhost
接下來是要設定 Apache2:
# 先換到這個目錄
cd /etc/apache2/sites-available/
sudo -s

# 保存一版原有的 default
cp default default.backup.date

# 確定 default port 是 80
sed -i '1,2s/\*/*:80/' default

# 複製 default 來當作 ssl 的樣板
cp default ssl

# 以下兩個 sed 是將樣板前給行修改成 SSL 需要的設定,也就是:
# ========================================
# NameVirtualHost *:443
# <virtualhost>
# ServerAdmin webmaster@localhost
# SSLEngine On
# SSLCertificateFile /etc/ssl/private/localhost.pem
#
# DocumentRoot /var/www/
# ========================================

sed -i '1,2s/\*:80/*:443/' ssl
sed -i "3a\\\tSSLEngine On\n\tSSLCertificateFile /etc/ssl/private/localhost.pem" ssl

# 把剛剛完成的 SSL 掛上去
a2ensite ssl
a2enmod ssl

# 重新啟動 apache2
/etc/init.d/apache2 restart
完成上述動作之後,你就可以用 https://localhost 看到「It works!」了。當然,架正式網站時,你可能會想要一個正式的 key。那麼上面的資料就要好好填,而且得準備一點錢去申請。這我就沒有經驗了。

參考資料:
https://launchpad.net/ubuntu/+source/apache2/+bug/77675/comments/47

2008/09/01

Ubuntu 上 VirtualBox 的 Host Key

在 Ubuntu 上安裝 VirtualBox 很容易,卻很容易遇到一個問題:Host Key 沒有作用。其實,正確的說法是:在 guest OS 上不能使用 keyboard。

這問題很容易解決,只要安裝 scim-bridge-client-qt 這個 package 就可以了。安裝完之後,記得重開機才會生效。

2008/08/31

VirtualBox 的三種網路型態

VMware Player 的 host OS 和 guest OS 之間有 三種網路型態。VirtualBox 同樣也有三種,而且功能很類似:
  • Host Interface Networking (HIF)
  • Internal Networking
  • Network Address Translation (NAT)
其中,Network Address Translation (NAT) 與 VMware 的名稱一樣,功能也完全相同。

Host Interface Networking (HIF) 除了名字不同之外,功能和 VMware 的 Bridged Networking 是一樣的。

Internal Networking 則和 WMware 的 Host-Only Networking 相近,但有以下不同:
  • Internal network 上沒有 DHCP server
  • 不能直接和 host OS 溝通
當然,如果你比較習慣 VMware 的 Host-Only Networking,已經有人試出設定的方法:

2008/08/30

用 VirtualBox 跑 Ubuntu Server

利用 VirtualBox 來安裝 Ubuntu 8.04.1 LTS Server Edition。過程很順利,不過安裝好了 Ubuntu 卻開不起來,開機時出現 CPU 缺少了一些 feature 的錯誤訊息:
This kernel requires the following features not present on the CPU:
0:6
Unable to boot - please use a kernel appropriate for your CPU.

原來 32bit 的 x86 最多只能支援到 4GB 的 RAM,但若有 PAE (Physical Address Extension) 的加持就能擴充到 64GB。因為 Ubuntu Server 的 32bit kernel 用到 PAE 這個特性,所以在 VirtualBox 上必須啟動這個 PAE:
Settings -> General -> Advanced -> Enable PAE/NX

2008/07/02

Ubuntu 的 Manpages

寫程式時發現有些標準的 C 函數 man 不到,查了一下才發現 manpage 是分散在三個 packages,需要自己安裝:
$ sudo apt-get install manpages
$ sudo apt-get install manpages-posix
$ sudo apt-get install manpages-posix-dev
其中:
  • manpages 包含 GNU/Linux 的基本操作,應該預設就會安裝到。
  • manpages-posix 則包含 POSIX 所定義公用程式的用法。
  • manpages-posix-dev 則包含 POSIX 的 header files 和 library calls 的用法。寫程式的人一定需要這一個。

2008/06/28

在 VirtualBox 的 NAT 底下開 port

VirtualBox 預設的網路模式是 NAT。換句話說,Guest OS 可以透過 Host OS 連到外界,但 Guest OS 受到 NAT 的保護,外界無法連進去。

因此,若要在 Guest OS 架設任何服務 (例如:sshd),就必須設定 VirtualBox 的 port forwarding。方法如下:
VMNAME="Ubuntu"
SVR=ssh

VBoxManage setextradata "$VMNAME" \
"VBoxInternal/Devices/pcnet/0/LUN#0/Config/$SVR/HostPort" \
2222

VBoxManage setextradata "$VMNAME" \
"VBoxInternal/Devices/pcnet/0/LUN#0/Config/$SVR/GuestPort" \
22

VBoxManage setextradata "$VMNAME" \
"VBoxInternal/Devices/pcnet/0/LUN#0/Config/$SVR/Protocol" \
TCP
這樣,當外界連到 Host OS 的 port 2222,就等於連到 Guest OS 的 port 22。

當這種設定很多時,可以用以下的指令來列出所有的設定值:
VBoxManage getextradata "$VMNAME" enumerate
注意!做完上述設定之後,要重新啟動 VirtualBox 才會生效。

2008/06/27

在 Ubuntu 上安裝 VirtualBox OSE


貼後補充:亦可到 VirtualBox 官方網站 下載適合 Ubuntu 的最新版本,用 dpkg -i 即可安裝。


雖然 VMware Player 在 Windows 上用得很順手,我還是決定在 Ubuntu 上試試 VirtualBox。沒想到安裝和使用都出奇的簡單,而且操作介面和功能都令我驚艷。

安裝方法非常簡單,只要用 Synaptic 或 apt-get 安裝以下 package 即可:
  • virtualbox-ose
  • virtualbox-ose-modules-generic
安裝好了之後,在主選單會新增一組「系統工具」的選單,馬上就可以啟動 VirtualBox OSE。不過在你真正執行 virtual machine 之前,你必須先將自己加到 /etc/group 的 vboxusers group。

其實,我還是有遇到一點小麻煩。用此版的 VirtualBox,一旦將 keyboard 的控制權交給 virtual machine 之後,系統就卡住了:Host 和 Guest 都沒辦法控制,後來才找到解法:

2008/06/25

在 Ubuntu 上 mount USB drive

一般來說,在 Ubuntu Desktop 上掛 USB 碟並不需要特別處理,系統會自己處理。一插上去,就馬上可以使用。但有一些例外情況,需要自己手動 mount,例如從遠端 ssh 進去。

這時最麻煩的,就是怎麼知道這個 USB 碟的 device name。我發現最簡單的方法是:
ls /dev/disk/by-id/usb-*
搭配 lsusb 的輸出,很容易就可以找到可用來 mount 的 device name。

2008/06/16

錯誤代碼: 0x80072EE2

工作環境遷移之後,每次執行 Windows Update 總是出現 [錯誤代碼: 0x80072EE2] 。找到以下看似相當豐富的 support 資訊,卻一點用處也沒有:
http://support.microsoft.com/kb/836941/zh-tw
終於有一天福至心靈,猜出問題的原因:雙層 NAT。我的 Windows XP 是接在一台 D-Link DI-704P 之內 (簡稱 704P-NAT),而 DI-704P 的 WAN port 則接到另一個以 Linux 建構的 private network (簡稱 Linux-NAT)。

幾個簡單的實驗:
  • XP 放在 Linux-NAT + 704P-NAT 之內 => 結果一直出現錯誤
  • XP 只放在 Linux-NAT 之內 => 順利完成 Windows Update
  • XP 只放在 704P-NAT 之內 => 也順利完成 Windows Update
想要進一步分析,所以用 WireShark 在 XP 上抓封包。發現進行 Windows Update 時,一開始都會有2 至 3 秒的溝通 (HTTP),然後一分多鐘之後再啟動第二次的溝通 (目的主機是 www.update.microsoft.com),但此時是 TLS (https) 連線,無法進一步分析。只知若出現錯誤,溝通的資料只有 11K 左右;反之,順利進入更新畫面則有 88K 的溝通資料。

看起來,Windows Update 的通訊協定無法通過兩層的 NAT。或者應該說,Windows Update 的通訊協定是 NAT-unfriendly,但有考慮到一層 NAT 的狀況。

2008/06/14

在 Ubuntu 上裝 IE

將工作環境轉換到 Ubuntu 8.04 之後,一切都相當得心應手。不過有些時候需要用到 IE,若切回 Windows 會相當不方便,所以決定在 Ubuntu 上裝個 IE 來應急。透過 Google 很容易就可以找到安裝方法:
http://www.tatanka.com.br/ies4linux/page/Installation:Ubuntu
一開始,需先安裝 wine 和 cabextract 兩個 package:
$ sudo apt-get install wine
$ sudo apt-get install cabextract
接下來就是下載 IEs 4 Linux,也就是 http://www.tatanka.com.br 所開發的 shell script,可以自動從 Microsoft 網站抓取 IE 相關的檔案,並以適合 Wine 的方式來安裝。目前最新版本是 2.99.0.1:
$ wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-2.99.0.1.tar.gz
接下來要解開及執行 IEs 4 Linux 來安裝 IE。此版本的 ies4linux 已支援多國語言的 GUI 介面,但是在中文環境有一些問題,所以需強迫以英文介面進行 (若堅持要看中文,這裡 有修正方法):
$ tar xvzf ies4linux-2.99.0.1.tar.gz
$ cd ies4linux-2.99.0.1
$ LANG=C ./ies4linux
接下來,按照 GUI 指示進行就可以順利完成。若安裝時出現 No such file or directory 之類的錯誤,可能是抓檔的部份沒處理好,只要再重新執行幾次 LANG=C ./ies4linux 就可以解決。

要啟動 IE,請執行 ie6 或 ~/bin/ie6。

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

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

2008/03/10

在 EeePC 播 Real Player 影片

EeePC 內建的影音播放器並不支援 Real Player 的影片格式。想要在 EeePC 上看 rm/rmvb 格式的影片,有兩種方法:

第一是自己安裝 Real Player for Linux。這個方法我沒試過,有興趣的人可以參考如下圖文並茂的安裝教學:
第二個方法是幫 EeePC 原本就內建的影音播放器灌輸功力 -- 加掛編解碼器 (codec)。方法非常簡單:到 MPlayer 的網站下載 rp9codecs-20050115.tar.bz2,解開之後將幾個 *.so.6.0 的檔案複製到 /usr/lib/codecs 目錄即可。詳細方法請參考以下網頁 (注意!該網頁給的下載連結有錯,解開之後是給 Windows 用的 .dll 檔,請改成上述檔案即可):

2008/03/07

在 Cygwin 安裝 Man Pages

Cygwin 裡的 man page 資料很少,經常 man 不到。找了許久,才發現 The Linux Documentation Project 有 man pages 可以下載。安裝方法如下:
  1. 下載 man-pages-2.78.tar.bz2 或更新的版本
  2. 將檔案解到 /usr/share/man/tldp.org-2.78
  3. 編輯 /usr/share/misc/man.conf,加入以下這行:
    MANPATH /usr/share/man/tldp.org-2.78
這樣就 OK 了。

2008/02/29

Cygwin 的 Terminal

除了之前介紹過的 NFS server,Cygwin 還有很多好用的地方,如:充當 X server 等。所以 Cygwin 是我必備的軟體之一。

不過,用標準方法安裝的 Cygwin,terminal 是架構在 DOS 視窗之上,非常不好用。我推薦大家使用 rxvt。首先,你必須重跑 setup.exe 來安裝 Shells 底下 rxvt 這個 package,然後自己建立如下的捷徑:
C:\Cygwin\bin\rxvt.exe -sr -sl 1000 -e /bin/bash --login -i
rxvt 的參數就不仔細介紹了,請大家自己 man man 看。

2008/02/28

啟動 Eee PC 的進階模式

Eee PC 正熱門,我也弄了一部來玩。第一件工作就是要把預設的簡易模式改成進階模式。找了很多資料來看,就屬以下這份最清楚完整:
不過看起來有點複雜,以下是我整理出來的簡化版,請大家參考:

首先,按 Ctrl-Alt-T 開啟 console,然後執行以下命令:
  • sudo -s
  • echo "deb http://download.tuxfamily.org/eeepcrepos p701 main" >> /etc/apt/sources.list
  • apt-get update
  • apt-get install advanced-desktop-eeepc
  • exit
安裝完畢,可以將剛剛加入 sources.list 的那一行刪除。關機時選擇「進階模式」就可以重新開啟為進階模式了。要回到簡易模式,只要在 Logout 時選 Easy Mode 就可以了。

註:apt-get update 時會出現以下訊息,可以忽略:
W: GPG error: http://download.tuxfamily.org p701 Release: 由於沒有公鑰,下列簽名無法進行驗證: NO_PUBKEY 2042B4BAF2BCFBF8
W: 用『apt-get -f install』指令或許能修正這些問題。

2008/02/27

善用 Windows XP「執行身分」的命令

即使一部 Unix 機器只有自己一個人用,「在執行管理工作時,才以 root 身份做事」應該是使用 Unix 的人都有的基本觀念吧?但我發現很多使用 Windows 的人都習慣用 Administrator 的權限來進行一般日常的操作。究其原因,可能是貪圖方便吧?

Unix 有個 sudo 指令,可以很方便地切換 root 身份去執行需要管理權限的工作。其實,Windows 上也有類似的方法,那就是「執行身分 (Run As)」:在圖示上按右鍵就可以看到「執行身分」這個選項。

「執行身分」這個功能需要啟動 Secondary Logon 這項服務才可以動作。如果這服務沒有啟動,會有如下的錯誤訊息:
無法啟動服務,可能因為服務已停用,或它沒有相關的啟用裝置。
解決方法是:
  • 控制台 -> 系統管理工具 -> 服務 -> Secondary Logon
  • 將「啟動類型」改成「自動」即可
參考資料

2008/02/26

用 Cygwin 在 Windows 上架設 NFS Server

想在 Windows 上架個 NFS Server,但除了 Cygwin 和 SFU (Microsoft Windows Services for UNIX) 之外,找不到 free 的 NFS Server 解決方案。以下就先介紹 Cygwin 上 NFS Server 的安裝方式。

安裝

Cygwin 上的 NFS Server 需要以下幾個 packages (執行用來安裝 Cygwin 的 setup.exe 程式就可以勾選。雙冒號之前是 Category,後面是不含版本編號 Package 名稱):
  • Net :: nfs-server
  • Libs :: sunrpc
  • Admin :: cygrunsrv
安裝完成之後,需進入 Cygwin console 執行以下指令:
/usr/bin/nfs-server-config
執行時會出現以下畫面,請回答 yes:
This script sets up a default configuration for running an NFS server under
Cygwin. As part of this setup, the script will do the following:

1) Create a user account to run the services under. [OPTIONAL]
2) Install portmap, mountd, and nfsd as Windows services.
3) Create a sample exports file.
4) Create a sample uid/gid mapping file.

After installing, please read the nfs-server README for Cygwin:

/usr/share/doc/Cygwin/nfs-server-2.3-*.README

This document contains notes on installation and documents known problems
and workarounds with the NFS server; ex:

- ISSUE : Recommend using ntsec
- ISSUE : Daemons are single-threaded
- ISSUE : Daemons require 'impersonate logged on user' right.
- ISSUE : Daemons cannot re-export mapped network drives
- ISSUE : Daemons expect 'nobody' or 'Guest' as anonymous user
- ISSUE : Portmap service fails to start
- ISSUE : Cannot export Windows directories not under Cygwin root
- ISSUE : Considerations when mapping UIDs/GIDs

Do you want to continue? (yes/no)
接下來的畫面是詢問你要不要使用 separate user account 來執行 NFS Server,在 XP 上一定要回答 yes。接下來會問你帳號名稱和密碼。這個帳號是在 XP 上的帳號,用來執行 service 的,帳號密碼都要對才可以 (請仔細輸入帳號,不然有許多設定需要修改,相當麻煩):
Checking for other Unix environments on this system ...
Good! There doesn't seem to be any other Unix environments installed.

You can choose to install the services so that they run under the local system
account, or under a separate user account. Which option you should choose
depends on which version of Windows you are running:

Windows 2000 : You may run nfsd under either a local system account or
a separate user account. You _probably_ want to run under
the local system account.
Windows XP : You _must_ run nfsd under a separate user account.

If you choose to run nfsd under a separate user account, you will be prompted
for a user name and password. If the user name you supply does not exist,
it will be created.

Do you want to run nfsd under a separate user account? (yes/no)
設定

完成上述動作之後,就差不多可以啟動 NFS Server 了。在此之前,請修改 Cygwin 上的/etc/exports 來設定要對外開放的目錄位置。以下是個簡單例子,詳細的格式請參考 man exports
/home/share
/cygdrive/d/work 192.168.6.14(rw)
/home/share 開放給所有人讀取;/cygdrive/d/work (即 D:\work,在 Cygwin,要用 /cygdrive/c 來代表 C:,餘此類推) 只給來自 192.168.6.14 的 client 讀寫。

啟動

接下來就要啟動 NFS Server 了:
  • 到 控制台 -> 系統管理工具 -> 服務
  • 將以下服務一一啟動:
    • Cygwin mountd
    • Cygwin nfsd
    • Cygwin portmap
如果你之前設定的密碼有問題,可以在此修改 (雙擊上述項目,切到「登入」頁),若是帳號有問題,建議重新執行 /usr/bin/nfs-server-config。

若一切正常,應該可以順利啟動以上三個服務。這個動作只需要做一次就可以了,以後再登入也都會保持啟動狀態。但以後若修改 /etc/exports 檔,必須重新啟動 portmap 這個服務 (會自動重新啟動其他兩個)。

障礙排除

若啟動上述 service 失敗,請利用以下方式來找出錯誤原因:
  • 控制台 -> 系統管理工具 -> 事件檢視器
仔細查看系統部份是否有新產生錯誤事件。若找不到,就找找應用程式部份。例如我啟動 portmap 的時候出現一個錯誤訊息:「服務已啟動又停止」。找了好久才發現到 portmap 所需要的 port (TCP/UDP 111) 已經被佔用了。將佔用該 port 的程式移除問題就解決了。同理,也要小心 NFS 的 port (UDP 2049) 是否有被佔用。

若上述三個 service 順利啟動,但是 client 在 mount 的時候一直 time out,很有可能是被 Windows firewall 給擋下來了。請按如下方式處理:
  • 控制台 -> Windows 防火牆 -> 例外
  • 用「新增程式」一一加入以下三隻程式:
    • C:\cygwin\usr\sbin\portmap.exe
    • C:\cygwin\usr\sbin\rpc.mountd.exe
    • C:\cygwin\usr\sbin\rpc.nfsd.exe
參考資料

2008/02/21

移除 Windows 桌面的資源回收筒

在現實的生活中,不論是家裏或辦公室,我的桌面都亂得可以。但我卻對電腦上的虛擬桌面有無法克制的潔癖:不喜歡放任何的東西,包含資源回收筒。

以下是移除資源回收筒的方法:
  1. 執行 regedit,找到以下機碼 (若有缺少,必須自己新增): HKEY_CURRENT_USER\Software
    \Microsoft\Windows\CurrentVersion
    \Explorer\HideDesktopIcons\NewStartPanel
  2. 編輯或新增一個內容為 1 的 DWORD 機碼,名稱如下: {645FF040-5081-101B-9F08-00AA002F954E}
  3. 儲存後登出再登入即可生效
參考資料

2008/02/10

Programming Paradigms

重新拿出 The C++ Programming Language 來看 (C++ 的爸爸, Bjarne Stroustrup, 寫的),覺得 Programming Paradigms 這一節寫得真好。

首先,他強調 支援 (support) 和 允許 (enable) 是不相同的:
A language is said to support a style of programming if it provides facilities that make it convenient (reasonably easy, safe, and efficient) to use that style. A language does not support a technique if it takes exceptional effort or skill to write such programs; it merely enables the technique to be used.
在接下來的 programming styles 介紹當中,我們可以更了解這兩個概念的不同之處。

Procedural Programming

這是最早期的程式設計方法,它的法則是:
Decide which procedures you want;
use the best algorithms you can find.
也就是說,先想好一件工作需要由哪些 procedures 完成;再用最好的演算法完成這些 procedures。Fortran 算是 support 這種程式設計方式的始祖,C 也 support 這種設計方法。

Modular Programming

隨著程式規模愈來愈大,程式設計開始重視如何組織資料。將資料和處理這些資料的 procedures 結合在一起,稱之為 module。這種程式設計方法的法則是:
Decide which modules you want;
partition the program so that data is hidden within modules.
也就是說,以資料為中心,將相關的資料和 procedures 結合成各自獨立的 module。Module 和 module 之間,資料是隱藏起來的,所以此種法則也叫做 data-hiding principle。Modula-2 直接 support 這種程式設計方式,但 C 只能算是 enable 這種方法。

Data Abstraction

在某些應用場合,data hiding 這個觀念仍然不夠理想,必須導入 abstract data types 的觀念 (也就是 user-defined types)。這種程式設計方法的法則是:
Decide which types you want;
provide a full set of operations for each type.
也就是說,先想好有哪些資料型態要操作,然後為每一個資料型態設計完整的操作程序。

Object-Oriented Programming

對於類似圖形使用者介面的系統,data abstraction 缺乏彈性和擴充能力。這時,就需要導入 object-oriented 這種可以繼承類別的觀念。這種程式設計方法的法則是:
Decide which classes you want;
provide a full set of operations for each class;
make commonality explicit by using inheritance.
也就是說,先想好有哪些類別要操作,然後為每一個類別設計完整的操作程序;類別和類別之間的共通特性要以繼承的方式來處理。

Generic Programming

這種程式設計方法的法則是:
Decide which algorithms you want;
parameterize them so that they work for
a variety of suitable types and data structures.
這一部份,我還要多多努力學習才行。

2008/02/09

TIOBE Programming Community Index

TIOBE Programming Community Index 是一份很有趣的統計資料。它利用搜尋引擎來統計 programming language 的熱門程度,每個月更新一次。除了 2005 年前後被 C 打敗之外,Java 已經蟬聯盟主寶座多年,C 則穩居第二名。

排名總是會引起誤解。例如:Java 比 C/C++ 好。我想這是非常錯誤的觀念。Programming language 只是個工具,不同場合需要不同的工具。如此而已。

套句廣告台詞:它傻瓜,你聰明。會使用對的 programming language 來解決問題,才是聰明的程式設計師。

2008/02/02

VMware 的 Bridged, Host-only 和 NAT 網路型態

VMware Player 的 host OS 和 guest OS 之間有三種網路型態:

Bridged Networking

在這種網路型態之下,guest OS 是透過一個 virtual bridge 和 host OS 所在的 Ethernet 相連,請參考 VMware 的官方 示意圖

對於與 host OS 同在一個 Ethernet 上的機器來說,guest OS 和 host OS 是兩台獨立的電腦,都可以透過同一個 Ethernet 介面連接,並無法分辨出這兩個 OS 其實是在同一台機器上執行。甚至當 Ethernet 連線出問題時,guest OS 和 host OS 也不能互通 (即使是在同一台機器之內)。

換句話說,當你把接到 host OS 的網路線拔掉時,這兩個 OS 就無法溝通。因此,想把 VMware Player 灌在 notebook 上帶著跑的人,這種網路型態是不太合適的。

Host-Only Networking

在這種網路型態之下,guest OS 和 host OS 是在一個與世隔絕的虛擬網路上。此虛擬網路有一個 DHCP server,可以分配 IP address 給 guest OS 和 host OS (分配給一個虛擬的介面)。因此,guest OS 和 host OS 可以互通。請參考 VMware 的官方 示意圖

對於與 host OS 同在一個 Ethernet 上的機器來說,guest OS 是看不見的。guest OS 對外聯繫的唯一管道就是 host OS。因此,guest OS 若想連上外部網路或 Internet,就必須在 host OS 安裝 routing 或 NAT 的服務。

這種架構不會受到實體網路的影響,即使把網路線拔掉,host OS 和 guest OS 還是可以互通。

Network Address Translation (NAT)

此種網路型態與 host-only networking 的架構很像,但是在虛擬網路上多了一台 NAT router。請參考 VMware 的官方 示意圖

因為有了這台虛擬的 NAT router,guest 雖然與外界隔離,但仍然可以很方便地透過連接在 host OS 的網路連接 Internet。

這種架構也不會受到實體網路的影響,即使把網路線拔掉,host OS 和 guest OS 還是可以互通。若連接到 host OS 的 Internet 連線沒有問題,guest OS 也一樣可以連接到 Internet。

2008/01/31

4t Tray Minimizer

習慣透過 ssh 進入在 VMware 上執行的 VM,因此並不需要看到 VM 的那個虛擬螢幕。所以通常都把 VMware 最小化,丟到工作列上。

但工作列的空間有限,browser、editor、office、pdf reader、skype... 一下子就佔滿了。於是,這個不需要去看的最小化按鈕就變得很礙眼,讓人想除之而後快。

經過一番搜尋,終於找到一套很不錯 (而且有免費版) 的軟體:4t Tray Minimizer。他可以讓任何程式從桌面上消失,或者放到 工作列的通知區域。有了這套軟體,VMware 就乖乖的變成通知區域的小圖示了。

PS: 4t Tray Minimizer 和工作列一樣,都能夠自動隱藏非使用中的通知區域圖示,以便讓出空間給工作列按鈕用。但千萬不要同時啟動這兩者,否則可能會因互相拉扯而僵持不下。個人建議,啟動工作列的自動隱藏功能就好。

2008/01/30

原來沒有 System Tray 這一回事

很多人都 知道 Windows 上有個地方叫做 System Tray 吧?就是一般在畫面下面工作列右手邊的那個區塊。

其實,在 Microsoft 的正式術語當中,是沒有 System Tray 這個詞的。這個詞的出現源自於誤解,正式的說法應該是 Taskbar Notification Area。也就是說,工作列是由 Start menu (開始功能表)、quick launch bar (快速啟動列)、taskbar buttons (工作列按鈕) 和 notification area (通知區域) 所組成的。

有興趣的人可以看看以下的第一則參考資料。

參考資料

2008/01/29

vim 的彩色語法顯示

昨天剛安裝好的 Ubuntu virtual appliance 有個缺點:vim 不會以彩色來顯示文件的語法格式。

上網找解法,發現很多人都有相同的問題,也有很多人回答,但排在前幾名的答案都不太管用。我想是每個人的環境都不太相同,問問題的沒有說清楚自己的環境,回答問題的人只就自己的環境來回答的緣故吧?

研究了很久終於把這問題解決了。希望以下的方法對你是管用的 :)

首先,先確定你安裝的 vim 是否有把彩色語法顯示的功能編譯進去。方法是直接問 vim (vim --version)。這個指令除了顯示版本號碼之外,還會顯示有哪些功能。彩色語法顯示這個功能就叫 syntax。如以下範例:
    # vim --version | grep syntax
    -scrollbind -signs -smartindent -sniff -statusline -sun_workshop
    -syntax
syntax 前面是個減號,就表示這個 vim 根本沒有將彩色語法顯示的功能編譯進去,你再怎麼調整設定也沒有用。Ubuntu 預先安裝的是 vim-tiny 就是這種陽春版,必須安裝標準版的 vim 才有此功能。方法安裝如下:
    # apt-get update
    # apt-get install vim
接下來,找個 source code 或 Makefile 來編輯看看。如果已經有彩色語法顯示,恭喜你大功告成了。如果還不行,請在 vim 上下這個指令看看:「 :syntax on 」。如果有彩色出現,就代表彩色語法顯示的預設值是關閉的。這時,請編輯 /etc/vim/vimrc 將 syntax on 之前的註解符號移除,就可以打開這個功能。也請看看你的 vi 是否有 alias 到 vim。

還是不行?那只好請你自己找 Google 先生幫忙了。

2008/01/28

Ubuntu 7.10 JeOS Virtual Appliance

今天要推薦另一個 VMware 的 virtual appliance:
這個 image 有以下特色:
  • 精簡,不含 X-Windows 等
  • 小巧,只有 225MB,很快就能下載完畢
  • 已安裝好 VMware Tools,可以解決 Guest OS 系統時間的問題
  • 適用於 VMware Player 2.0.* 版
這個 virtual appliance 已包含基本開發工具如 gcc、make 等,缺的也很容易自己補 (apt-get install),很適合在 Linux 上開發非 GUI 程式的人使用 (解開後需要 1GB 的空間,開始使用後會逐漸變大)。

這個 virtual appliance 預設需要 512MB 的記憶體,如果你的記憶體不夠,請參考 這裡 修改 .vmx 檔。

以下是個人的設定方式,僅供參考:
  • 以 user 身份登入 (password = user)
  • 用 sudo 設定 root 密碼 (這樣比較方便) (sudo passwd root)
  • 改以 root 身份登入
  • 安裝 ssh daemon (apt-get install ssh)
  • 用 ifconfig 查看 IP address
  • 從 PC 用 PuTTY 連到該 IP,因為這樣比較好操作 (可剪貼)
  • 刪除 user 這個帳號 (userdel user)
  • 新增一個自己的帳號 (useradd yourname -m -s /bin/bash -p password)
我習慣設定固定 IP,這樣可以砍掉 VMware 的 DHCP service。Ubuntu 設定固定 IP 的方法如下:
  • 執行 ifconfig 查看並記下 DHCP server 分配的 IP address、gateway 等資訊
  • 編輯 /etc/network/interfaces,根據上一步記下的資訊修改 (若要改 IP address,只能改最後一碼):
    # The primary network interface
    auto eth0
    #iface eth0 inet dhcp
    iface eth0 inet static
    address 192.168.123.14
    netmask 255.255.255.0
    network 192.168.123.0
    broadcast 192.168.123.255
    gateway 192.168.123.2
  • 編輯 /etc/resolv.conf,設定 name server:
    nameserver 192.168.123.2
  • 重新啟動網路介面
    # sudo /etc/init.d/networking restart
我還需要跑 tftp server 以便和發展中的 embedded system 交換資料。設定方法如下:
  • 安裝 tftp client 和 server
    # apt-get install tftp
    # apt-get install tftpd
  • 第二動還會一併安裝 openbsd-inetd。你必須檢查一下/etc/inetd.conf 看看有沒有需要修改的地方。以下是我的設定:
    tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
  • 將 /tftpboot 設好權限,就可以重新啟動 inetd 了:
    # chmod 777 /tftpboot
    # /etc/init.d/openbsd-inetd restart

2008/01/26

VMware Player -- Guest OS 的 MAC Address

VMware Player 有一套演算法來自動決定 Guest OS 虛擬網路卡的 MAC address。這個機制運作得很好不會有問題,但有時候我們就是想自己指定這些 MAC address。要這樣作,只要修改 .vmx 檔就可以了。

首先,把以下這幾行刪除 (或以 # 「註」掉):
#ethernet0.addressType = "generated"
#ethernet0.generatedAddress = "00:0c:29:12:34:56"
#ethernet0.generatedAddressOffset = "0"
然後,增加以下兩行:
ethernet0.addressType = "static"
ethernet0.address = "00:50:56:03:06:14"
其中 ethernet0.address 一定要在這個範圍之內:00:50:56:00:00:00-00:50:56:3F:FF:FF。

當然,改完之後要重新啟動 GuestOS 才可以生效。

參考資料

2008/01/21

CentOS 5 Minimal Virtual Appliance

今天要推薦一個 VMware 的 virtual appliance:
這個 image 有以下特色:
  • 精簡,不含 X-Windows 等
  • 小巧,只有 186MB,很快就能下載完畢
  • 已安裝好 VMware Tools,可以解決 Guest OS 系統時間的問題
  • 相容於 VMware Player 1.0.* 版
這個 virtual appliance 已包含基本開發工具如 gcc、make 等,缺的也很容易自己補,很適合在 Linux 上開發非 GUI 程式的人使用。(注意!解開後需要 10GB 的空間)

這個 virtual appliance 預設需要 512MB 的記憶體,若你的主機有 1GB 的 DRAM,這當然不成問題。不過,我的 PC 只有不到 512MB,所以必須自己手動調整。方法很簡單:用 editor 編輯副檔名為 .vmx 的檔案,將 memsize 改小即可。我改成 192,效能還在可接受的範圍之內。

建議開始使用前,先作一次更新:
# yum update
# yum upgrade

2008/01/17

VMware Player

對於需要同時使用 Windows 和 Linux 的人來說,VMware Player 是非常實用的工具。

VMware Player 是可 免費下載 和使用的 x86 虛擬機器,也就是在實體 PC 上以軟體模擬出另一套虛擬的系統。例如;你可以在 Windows 或 Linux 上再執行另一套系統,並讓主系統 (Host OS) 和虛擬系統 (Guest OS) 兩者同時運作,就好像有兩台機器一樣。

雖然使用多重開機也可以在一部 PC 上安裝多套作業系統,但一次只能選擇一種。而且切換系統時,需要重新開機,不是很方便。

使用 VMware Player 的缺點當然是 PC 的效能是由 Host OS 和 Guest OS 分享的,速度會稍微差一點。但好處不少:
  • 兩套系統可以一起運作,例如在 Windows 上看文件,在 Linux 上編譯程式。
  • 不需考慮如何設定開機程式和分割硬碟 (邏輯硬碟的大小可自行設定)。
  • 可以省下灌作業系統的時間,直接下載別人灌好了的來用。
  • 設定好的虛擬機器只是一般的檔案,可以用各種方法備份起來。
  • 回復虛擬系統就像複製檔案一樣容易。
  • ...
以個人的實際經驗來說,方便勝過於效能減少的問題,所以還是非常推薦。

VMware Player 的安裝方法相當非常簡單直接,不需多加介紹。倒是版本有兩個選擇:1.0.* 版和 2.0.* 版。2.0.* 版增加以下的功能:
  • Windows Vista support
  • USB 2.0 Support
  • Shared folders
  • Appliance view
  • Welcome page
  • Experimental support for Virtual SMP
為了這些新功能,似乎付出不少代價。原本安裝 1.0.* 版只需要約 57MB 的空間,升級到 2.0.* 之後竟然需要 243MB!若不需要這些新功能,1.0.* 版已經非常的穩定好用了,所以 PC 資源比較陽春的人,可以考慮用 1.0.* 版就好 (不過,有些現成的 virtual appliance 只能以 2.0.* 版開啟,這一點要納入考量)。

安裝好 VMware Player 之後,接下來要想辦法弄到所需要的 virtual appliance image,也就是運作在虛擬機器上的 Guest OS。你可以自行製作 image,也可以到以下網站看看有沒有現成的:
將下載的 image 解開就可以用 VMware Player 開啟虛擬系統 (*.vmx)。Host OS 和 Guest OS 是同時運作的,但輸入裝置必須共用:點 Player 的視窗就會將輸入介面轉移到 Guest OS;按 Ctrl-Alt 才會切回 Host OS。

若想自己製作或修改 virtual appliance image 也相當簡單,可以參考以下資料:
下次有空再推薦幾個現成的 virtual appliance image。

2008/01/14

TeraTerm Pro

發展 embedded system 的人,大概都需要透過 console 去控制 target device。這時候就需要一個好用且上手的 terminal emulator 程式了。個人推薦 TeraTerm Pro。

TeraTerm Pro 的最大強項是巨集 (macro),具有相當程度的字串和數值資料處理能力。只要稍微花點心思,可以寫出相當有趣的控制邏輯,例如:啟動 tftp 來傳輸資料,並依照傳輸的成功與否來決定下一動作。

TeraTerm Pro 還有一個功能值得一提:可設定字元或行的傳輸延遲。筆者接觸過不少 target devices,其中有些 console 設計得不太好,輸入太快就會漏字,因此不能 copy&paste,相當不方便。遇到這種情況,通常加個 1 ms 的延遲就可解決。詳細的語法請參考 TeraTerm Pro 的 Help 或 這裡 (有部份指令是新版才有)。

TeraTerm Pro 有兩套:
  • 一套是出自原創者的 2.3 版。這版雖然已不再維護了,但短小精幹,既穩定又好用。
  • 另一套則是由後繼者維護的 open source 版本:UTF-8 TeraTerm Pro with TTSSH2。除了支援 UTF-8、SSH2 之外,巨集的能力也加強不少。
TeraTerm Pro 除了可透過 RS232 連接 console 之外,也支援 TCP/IP 的 telnet 和 ssh/ssh2。但說到 telnet 和 ssh/ssh2 的一般操作,還是 PuTTY 比較好用。

2008/01/01

楔子: Softsmith = 軟體工匠

還未進入社會,就以寫軟體謀取微薄的報酬維生。在工作時程最緊的時候,常覺得寫軟體就跟黑手工匠一樣累,甚至有過之而無不及。

Softsmith 是我自創的詞 (但並非首創,Google 一下就知道)。一般來說,-smith 是用於金屬工匠的詞綴。如:goldsmith, silversmith, blacksmith, locksmith, gunsmith 等等,這些都是一般人所認知的黑手工匠。

其實,wordsmith, tunesmith 也使用 -smith 這個詞綴。我想這些寫作或作曲的人在熬夜趕工的時候,也是覺得自己比黑手工匠還累吧?這樣看來,softsmith 也是挺合理的組合。

另外,應該沒人沒聽過 sourceforge 吧?Source 都能放進 forge 了,software 當然要有 smith 來敲敲打打。

我就是那些敲敲打打的 smith 之一,而且還老大不小了。因為年紀一大,記憶力就變差,所以在這個部落格整理工作所需的筆記,自娛娛人。