PageRank



轉移公告

計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。

新文章只發佈在 http://www.hoamon.info/blog/

何岳峰 敬上

2010年5月25日 星期二

用隨身碟安裝 Linux

我的電腦有些是沒有光碟機的,事實上,光碟機的使用機率是愈來愈低,我曾有一台 Thinkpad 大半年沒開過光碟機,結果要用時,它卻發生讀片錯誤。

所以這次重新安裝 Ubuntu 10.04 時,我是採用隨身碟安裝的方式,而也因為 Open Source 工具愈來愈多、愈來愈方便下,我只使用了 usb-creator 程式,就將 ubuntu-10.04-alternate-amd64.iso 燒到 4G 隨身碟了,方法很簡單,先安裝 usb-creator(# apt-get install usb-creator) ,然後在命令列裡執行 usb-creator-gtk 。選擇要安裝的 iso 檔,並抹除隨身碟內的資料,就可以「製作開機磁碟」了。


接下來,就是重新安裝機器了,首先要切換 BIOS 的開機選項,在技嘉的 BIOS 上,我只選了 usb-hdd 就可從隨身碟開機,然而華碩的 BIOS ,除了要將 boot 選項切到 remoted-device 外,還要調整 usb storage 的 Forced FDD 類型。調整後,就如往常一樣重灌 Ubuntu 了。



"ThinkPad USB Keyboard with TrackPoint" 在 Ubuntu 10.04 的中鍵滾動設定方式

參考了我與小黑(ThinkPad X200s)之小紅點文章後,可輕鬆地設定了我的 R60e 中鍵滾動功能,然而一直無法在我的桌上型電腦上以 gpointing-device-settings 方法或是用 xinput 指令設定成功。因為設備名稱不同所以 "TPPS/2 IBM TrackPoint" 要改成 "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" ,但它就是不成功,指令如下:

# 啟用中鍵模擬功能
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Middle Button Emulation" 8 1
# 啟用滾輪模擬功能
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation" 8 1
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation Axes" 8 6 7 4 5
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Emulation Button" 8 2

# 靈敏度
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Middle Button Timeout" 8 50
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation Inertia" 8 10
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation Timeout" 8 200


還好該文章有詳細參考文件 How to configure the TrackPoint ,從該文中,得知還有別種設定方法,所以我在 /usr/lib/X11/xorg.conf.d/20-thinkpad.conf 中,置入文句如下:
Section "InputClass"
 Identifier "Trackpoint Wheel Emulation"
 MatchProduct "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device"
 MatchDevicePath "/dev/input/event*"
 Option  "EmulateWheel"  "true"
 Option  "EmulateWheelButton" "2"
 Option  "Emulate3Buttons" "false"
 Option  "XAxisMapping"  "6 7"
 Option  "YAxisMapping"  "4 5"
EndSection

然後重開機,就搞定了。

2010年5月22日 星期六

Mercurial 在開發「模組或函式庫」的應用策略

前幾天,學弟問了我一個問題,讓我發現原來我們對 branch 的概念還不是很熟悉。事實上,這是件好事,從問問題中,才能發現原來事情不是我們所想像的,早發現早好。最痛苦的是在弄亂運作中的程式碼後才驚醒。

在說明學弟的問題前,要先來前情提要。我們研究室到目前為止至少開發了 4 套系統,用「至少」是因為這 4 套比較大型,除 django 程式碼外,自己所寫的 .py 及 .js 近 4 萬行,且不含樣版。而這 4 套系統當然有部份的程式碼是一樣的,我想程式碼寫得多的設計師一定也是這麼想,常用的 bug 紀錄器、郵政地址選擇、政府機關資料等東西,一定會弄個模組另外放,到時候開發新系統時,整個模組(資料夾)拿進來就行了。

但是一個模組該如何與主系統共存開發呢? 尤其是模組與主系統程式碼都還在變動階段。
使用 Mercurial 讓這件事,變得非常輕鬆,假設我們有 A, B, C, D 等 4 個系統,而有一個 common 模組,這時,我們應該在 common 模組開 4 個 branches ,分別是
  • 'release for A
  • ''releasr for B
  • ''release for C'
  • 'release for D'
假設這 4 個 branches 都是在 changeset:300 時 branch 出去的。然後,過了一段時間,因為 C 系統的需求,我們修改了 common 模組,它的 changeset 來到了 340 ,且我們也將這 300:340 的修改 merge 到 'release for C' 了,這樣對其他 3 個系統有沒有影響? 當然沒有。

因為在伺服器運作的儲存庫上,以 A 系統為例,一定是把 common 模組切到 'release for A' 了(用 hg update -C 'release for A' 這個指令),就算某天將 A 系統上的 common 更新至 changeset:340 ,但這也只有在 common/.hg 的資料是 340 的, common/* 的資料一定還是停在 'release for A' 這個 branch 上,而 'release for A' 的最新版仍舊是 300 。

所以那天如果負責 A 系統的程設師有空了,它想使用 common 模組的最新功能時,他只要在 'release for A' 的 branch 中, merge tip 版本,並處理 A 系統這邊應對新 common 模組的修改,就可無痛昇級。

利用 branch 觀念,我們可以輕鬆整合多種函式庫、模組之間的版本整合問題,那麼學弟的問題是什麼呢?
如下圖:



學弟很貼心地在 branch 後,再為 " default 分枝" 作一個 manual commit ,以維持兩個 heads ,這樣會讓其他人在使用時,不致於出現 +1 head 的訊息(但這也只是在某些情況下)。

結果我後來又把 " default 分枝" 的成果 merge 到 'Release for XXX' ,這讓儲存庫上只剩下 1 個 head ,這個結果讓學弟有點困惑,他以為剩下一個 head ,那其他人在寫程式時,會不小心 commit 錯 branch 。
我說不會,因為他們原本手頭上的儲存庫就指定好是用那一種 branch ,所以在 hg pull -u 後,程式碼會變成該 branch 的最新版,在改完程式後,他們 commit 的成果也寫入相同的 branch ,而不會在 " default 分枝" 上, commit 到 'Release for XXX' 。

這惟一的小問題是其他學弟要把 commit 後的成果 push 到 HG Server 時,會出現提醒 +1 head 的訊息,但這是沒辦法避免的,用 hg push -f 就解決,因為既然 branch 了,就一定會有 multi heads 的情形。

2010年5月20日 星期四

使用 eCryptfs ,記得一定要備份下「加密錀匙」

使用 eCryptfs 加密目錄時,通常會隨機生成一把 32 字元的加密錀匙,來作目錄作加密,然後再使用使用者密碼來對「加密錀匙」作加密。所以如果因故弄丟了「加密錀匙」,但還記得「使用者密碼」,也是沒有用的。

所以記得,在使用此加密功能前,一定一定一定要先備份「加密錀匙」。

備份方式如下:

# cd /home/.ecryptfs/YOUR_ACCOUNT/.ecryptfs
or
# cd ~/.ecryptfs

# ls
auto-mount auto-umount Private.mnt Private.sig wrapped-passphrase

這個 wrapped-passphrase 就是「加密錀匙」被「使用者密碼」加密後的檔案。

# ecryptfs-unwrap-passphrase wrapped-passphrase
Passphrase: '''輸入使用者密碼'''
b19becdz81z8ba06aa4z35e6z1c0227f

這個 b19becdz81z8ba06aa4z35e6z1c0227f 就是「加密錀匙」,趕快把它記錄到其他檔案去。

使用公私錀登入 Linux 後,如何掛載被加密的目錄?

登入後,因為還沒有輸入過系統密碼,所以無法掛載加密目錄,這時候只會在家目錄看到

Access-Your-Private-Data.desktop README.txt

兩個檔案,其中 README.txt 的內容如下:

# cat README.txt
THIS DIRECTORY HAS BEEN UNMOUNTED TO PROTECT YOUR DATA.

From the graphical desktop, click on:
"Access Your Private Data"

or

From the command line, run:
ecryptfs-mount-private

也就是要你執行 ecryptfs-mount-private ,執行後,它會問你系統密碼,鍵入後,加密目錄就被掛載進來,只是你要重新再進入一次家目錄,才會看到還原的內容。

快速進入家目錄指令:

# cd

升級到 Ubuntu 10.04 後,發生無法使用公私錀登入問題

Ubuntu 10.04 對我而言,最大的優點是內建了家目錄加密的功能。然而在實際使用上,才發現這與我預期的有一段落差,只是這個落差是當初我沒想清楚所造成的。

原本,我以為用了家目錄加密後,一般使用者可以不怕檔案被 root 看光光,但
這是錯的,創建帳號的管理員一開始就可以備份「加密錀匙」,所以就算一般使用者登入後更換密碼,也不會重新製作一把「加密錀匙」,所以更換密碼的動作,只把「加密錀匙」用另一組密碼保存起來,帳號管理員一樣可用之前所保存的「加密錀匙」還原檔案。除非,使用者更換「加密錀匙」(但很麻煩,也需要系統權限),或是一開始,就不要帳號管理員設定「家目錄加密」功能,而是使用者自己作「目錄加密」的動作

原本,我以為不打「登入密碼」,就看不到家目錄,但
這是錯的,只要該使用者登入後有掛載該目錄,其他人就可以透過權限驗證方式來觀看,因為該使用者已將目錄解密了。

原本,我以為一般人可以在自己的家目錄執行網頁程式而不被其他人知道他搞了什麼網站,只要 apache 設定檔有設定 Include /home/xxx/self.conf 之類的語法即可,但
這是錯的。家目錄既然已加密,那 apache daemon 就沒辦法進到網頁程式的目錄,又如何執行它們。

嚴格的說,這個家目錄加密功能,只能用在其他人無法使用光碟開機或是重灌系統來獲取硬碟資料,就只是這樣而已,而這功能,我的 IBM Thinkpad 用硬碟密碼就作到了,我白玩了。但這一切都是我自己先想錯了呀!

而且在使用此功能還發生一件非常烏龍的鳥事,就是無法使用公私錀登入,因為公錀資料夾是放在家目錄的,既然它被加密了,那 ssh daemon 又如何拿到公錀來驗證呢! 解法很簡單,在 /etc/ssh/sshd_config 中,設定

AuthorizedKeysFile /home/ssh-keys/%u/authorized_keys2

即可,也就是將使用者公錀放到沒被加密的資料夾。解法很簡單,但我卻搞了兩天,因為我在 sshd_config 中寫的是

AuthorizedKeysFile /home/ssh-keys/%u/authorized_keys

,但在資料夾中放的是
authorized_keys2 。一個 2 ,我看了 2 天,才發現不一樣。這就是人生呀!

2010年5月15日 星期六

令我驚訝的 2010 日月潭鐵人三項比賽

根本就沒有這個比賽。

年初生了一場病,最近才比較好,本來想想報個日月潭半鐵就成了,結果今天上網查閱相關資料時,才發現今年根本沒辦。所以目標移轉到「台東之美」,也因為還有 5 個月,所以報個 51.5 km 應該是沒問題。
Related Posts Plugin for WordPress, Blogger...