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 就可以了。安裝完之後,記得重開機才會生效。