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。