Archive

Make UTF-8 Environment Comfortable

這篇是我對於 UTF-8 環境的設定心得,其實自己從 FreeBSD 4 就開始嘗試用 UTF-8 的環境了,但是我記得 FreeBSD 4對於 UTF-8 的支援度很差,那時候遇到蠻多問題的,後來還是臣服於 Big5。 到了 FreeBSD 6 支援度已經很好了,便著手建造一個好用的 UTF-8 環境,進展最大的應該算是進 CSCC 之後,和 chenpc & LY 討論了蠻多東西的,最後有這個我自己打 80 分的環境,所以有了這篇 Note。 這篇 Note 重點在於 UTF-8、256 Color & 一些我常用的工具設定,我使用的環境是 FreeBSD 6.3 & 7.0 with tcsh。

Putty Setting

主要是在 Window -> Translation 的設定: Putty Encoding Setting
Encoding 選擇 “UTF-8″,不要勾選 “Treat CJK ambiguous characters as wide” (原因容後說明)。

Locale Setting

主要針對 LC_ALL & LANG 做設定,$HOME/.cshrc 加入:

setenv LC_ALL en_US.UTF-8
setenv LANG en_US.UTF-8

LANG 我沒有設定 “zh_TW.UTF-8″ 的原因主要是避免某些 tool 會看 LANG 開啟一些設定,例如 screen 會看 LANG 開啟 cjkwidth;mutt 也會看 LANG 選擇 charset。但我覺得這些設定可以很明確地在設定檔內指定,讓程式自動偵測反而容易讓人混淆,所以一律用 “en_US.UTF-8″,其它原因容後說明。 LC_ALL 基本上指定了很多東西,像是 LC_MESSAGES 等,這些細部設定可以參考 Handbook 修改。

Screen

Screen 經過許多人的努力,對於 UTF-8 和 Big5 之間的轉換已經很好了,唯一要注意的是,因為 Putty 有支援 256 色,Screen 也加入了 256 色的支援,所以在安裝的時候記得勾選 “XTERM_256″,為什麼要用 256 色?因為我覺得 coding 的時候一定要有一個好用的 Text Editor,尤其是我這種大部份工作都依賴 Console 的 programmer。我用的 Text Editor 是 vim,很剛好地,它支援 256 色,這代表我可以將 Syntax Highlighting 弄得更花俏,Coding 起來也舒適多了不是?
screen options

至於另一個選項 “CJK - Treat CJK ambiguous characters as full width”,可以在 Screen 使用 “cjkwidth on” 來修正某些字的字寬,上 BBS 很有用,但是這必須和 Putty ”Treat CJK ambiguous characters as wide” 這個選項互相搭配才可以作用;但在經過各項測試後,發現在 mutt 中常收到一些廣告信,或是 Title 編碼不一樣的情形,雖然 mutt 也有自動轉換的功能,但是並非所有信件都能處理,尤其是廣告信,如果開啟了 Putty “Treat CJK ambiguous characters as wide” 反而亂得更嚴重,這個問題目前也沒什麼好解法,所以選擇不開啟這個選項;還有另一個原因是 dialog 也會因為邊線字寬的問題亂掉,雖然有 rafan 的 poorman box drawing patch 可以解決,但並沒有進 Screen ports,要自己手動 patch,麻煩了點,不過這並不是主要原因啦!主要還是因為 mutt 的問題沒辦法有個好的解法,所以權宜之下,選擇犧牲掉某些特殊字的字寬 (只是字看起來窄了點)。

Screen 的設定主要如下:

# $HOME/.screenrc
defutf8 on
defc1 off
defencoding utf8

bind b encoding big5 utf8 # Ctrl-a b 轉 Big5
bind u encoding utf8 utf8 # Ctrl-a u 轉 UTF-8

# 256 Color Support
term xterm
termcapinfo xterm "Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm"

# allow bold colors - necessary for some reason
attrcolor b ".I"
attrcolor i "+b"

# erase background with current bg color
defbce on

其實設定和網路上可以找到的差不多,不過要特別說明的是設定中的 term & termcapinfo 名稱要跟環境變數中的 TERM 一樣,這樣才會對應到。在這裡我選擇使用 “xterm” 而不像網路上說的 “xterm-color” 或是 “xterm-256color”,主要是因為在 finch 一個奇怪的問題,如果設了 “xterm-color” 或是 “xterm-256color”,finch 當中的 Alt-C 和 Alt-M 搭配 Up、Down、Right、Left 不能正常運作,所以我後來決定使用 “xterm”,可是實際去看 /usr/local/misc/termcap 後發現其實都對應到同一組設定,這讓我覺得很奇怪,還要再找看看問題出在哪。

成功的話會看到這樣的畫面:
screen - 256 Color

IRC Client - irssi

我常用的 IRC Client 就是 irssi,在新的版本中已經預設加入了 Recode 的支援,也就是說可以針對各個不同的 Channel 或是 Message Window 設定編碼,它有點類似翻譯器,舉個例來說,當我設定了某 Channel 的 Recode 為 Big5,但我預設系統使用的是 UTF-8,那麼 irssi 接收時會將 Channel 中的對話當作 Big5 來轉換成 UTF-8,再輸出到畫面上;反之,你送出到這個 Channel 的訊息也會自動轉換成 Big5 後輸出,這個功能相當重要,尤其是每個 Channel 的編碼是使用者認定的,事實上 IRC Protocol 內部是沒有 Encoding 的設計的,所以決定要使用哪種編碼是由該 Channel 的使用者認定的,因此 IRC Server 上萬”碼”奔騰,所以 Recode 的功能有其必要性。

基本上要實現 irssi 的 UTF-8,網路上已經有相當多的教學文了,需要較詳細的設定可以參考 JeffHung 這篇。我這裡僅針對 UTF-8 的設定說明。進入 irssi 後,可以利用它內建的指令來直接修改設定,好處是不用看較複雜的 config 檔($HOME/.irssi/config),如下設定:

/SET term_charset UTF-8
/SET recode_transliterate ON
/SET recode_fallback UTF-8
/SET recode_out_default_charset UTF-8

當設定完成後,必須將它儲存到 config 內:

/SAVE

然後針對各別的 Channel 或 Message Window 設定編碼,舉例來說:

/RECODE ADD #nctucs Big5
/RECODE ADD #bsdchat UTF-8
/RECODE ADD liuyh Big5

有加上 ‘#’ 代表針對 Channel,沒有的則是 Message Window。同樣地,設定完也要下指令儲存到 config 內。

Vim

Vim 對於 UTF-8 的支援度已經相當地完整了,安裝前記得先把 libiconv 先裝起來,然後再裝 vim-lite 即可有自動轉碼的功能,簡單來說就是以 Big5 格式儲存的文件,打開會自動幫你轉換到 UTF-8 顯示,當然這還要加上一點設定 ($HOME/.vimrc):

" 啟動後是使用 utf-8 編碼
set encoding=utf-8

" 新開的檔案預設是 utf-8 編碼
set fileencoding=utf-8

" 所有可能的檔案編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1

" 設定輸出到 terminal 的編碼
set termencoding=utf-8

" 將 unicode 中不確定的字符表示成雙字符,在 unicode 下才有用
set ambiwidth=double

有關 encoding, fileencoding, termencoding,我之前有寫過一篇文章來解釋,大家可以參考一下。

上面有提到 Vim 支援 256 色,要顯示出 256 色需要兩個東西配合,一個是設定 Color Level,在 $HOME/.vimrc 加上:

set t_Co=256

如此可以啟動 256 色,接著要使用 256 色的 Color Scheme,上網 google 一下應該可以找到蠻多的,我自己改了一份自己的,將它放在 $HOME/.vim/colors/ 下,接著在 $HOME/.vimrc 加上:

colorscheme yzlin256

這樣便可以了。

Mutt

Mutt 只需要在 $HOME/.muttrc 下設定:

charset-hook ^us-ascii$ utf-8
charset-hook x-unknown utf-8
set allow_ansi
set ascii_chars=yes
set charset="UTF-8"
set locale="UTF-8"
set assumed_charset="utf-8:big5:gb2312"
set send_charset="utf-8:big5:gb2312:us-ascii:iso-8859-1:x-unknown"

這樣應該會正常許多。比較特別要注意的是,如果 Locale 設定 “zh_TW.UTF-8″,然後 Screen 打開 “cjkwidth on”,Putty 也勾選 “Treat CJK ambiguous characters as wide”,Mutt 會在字寬上判斷錯誤,造成畫面亂掉,尤其是許多 Spam Mail 的 Title 會很明顯讓整個字寬判斷錯誤;其實這不該完全歸疚於 Mutt,原罪還是 Mail 的編碼字寬很難去判斷和做適當的轉換。這也是為什麼我偏愛 Locale 設定 “en_US.UTF-8″,不要 CJKWidth 和 Putty 的字寬修正的原因,和 chenpc 經過幾番測試的結果,認為這是目前最好的解法。

Misc

Finch

Finch 本身已經是 Unicode 了,所以不用做額外設定。

rtorrent

rtorrent 在 $HOME/.rtorrent.rc 加上:

encoding_list = UTF-8

這樣檔案目錄和 File List 的顯示會正常很多,我有測試過 rtorrent (0.7.9) 和 rtorrent-devel (0.8.2),rtorrent File List 較正常,只是選取到的名稱每個字會出現兩次;rtorrent-devel File List 則整個亂碼,這個部份可能要等以後的更新了。

lftp

lftp 是我在 Unix-like 系統下常用的 FTP Client Tool,它對檔名的轉碼很好用,只需在 $HOME/.lftp/rc 設定,下面是我常用的設定:

set ftp:charset UTF-8
set file:charset UTF-8
alias big5 set ftp:charset Big5; set file:charset UTF-8
alias utf8 set ftp:charset UTF-8; set file:charset UTF-8

less

在 $HOME/.cshrc 設定環境變數,用 less 看某些 Big5 編碼的東西會正常很多。CS 工作站上的 help 很需要:

setenv LESSCHARDEF "8bcccbcc18b95.."

這樣的 UTF-8 環境已經能應付我 90% 的需求了,如果有錯誤或其他更好的設定方式,也歡迎大家給我意見。

Screen Show Encoding Patch

Screen 本身提供了 Encoding 的功能,可以針對單一 window 設定其 encoding,它會自動轉換,這個功能很有用,只是我個人龜毛了點,覺得每次都還要用 “Ctrl-A i” show 出 info 來查看目前的 encoding 為何有點多此一舉。我覺得 caption 和 hardstatus 都應該多加一個參數來表示目前的 encoding,可是很遺憾地它沒有提供,所以我乾脆自己 hack,這樣便可以在 caption 和 hardstatus 裡加一個新的參數 “%e” 用來顯示目前的 encoding,下面是我的設定:

caption always "%{.KW} %-w%{.mW}[%n] %t%{.KW}%+w"
hardstatus alwayslastline "%=%{..M}%e  %{..G}%H %{..Y} %c %{..R} %d/%m/%Y %{.K} Load: %l %{wb}"

顯示出來的結果會像這樣:
screen - show encoding
每次改變 encoding,它會自動更新,切換 window 也會更新成目前 window 所用的 encoding。

P.S. 我的 patch 檔是針對 FreeBSD ports 裡 sysutils/screen 將所有 option 都編進去後再改的。

Finch(Pidgin) Alias++ Patch

原本 Buddy List 裡顯示出來的名稱便只有 Alias,原先的名稱不會再顯示出來了。所以 chenpc 之前做了一個 patch 來解決這件事,只是他老人家懶得做成 optional 的版本,所以我從它的 patch 再改成另一個 optional 的版本,這樣可以在 “Preference” 裡設定開啟與否,patch 在這
finch - preferences-1

上完 patch 後,記得在 $HOME/.purple/prefs.xml 加上一行:

<pref name='showoffline' type='bool' value='1'/>
<pref name='showalias' type='bool' value='1'/> # 加上這行

這樣 “Preference” 裡才會有作用,然後每次更動選項後重開 Buddy List 就可以看到結果了。

SSH Agent Forwarding on Putty & Screen

大家在登入工作站或是伺服器的時候,最常使用到的應該是 Putty (Pietty, PuttyTray, …etc) 這類提供 SSH 協定的終端機,最傳統也最麻煩的方式就是每次登入的時候都輸入密碼,比較好的方式就是使用 Key Authentication,創造一組 Public Key 和 Private Key,當登入的時候比對,如果 Match 便直接允許登入,不再需要輸入密碼。

但是,在其他的狀況下,這樣的方式也許不是相當適合。以我來說,我常常登入到一台主要的機器,然後再透過這台機器連到其他機器,而在工作當中,也可能在這些機器之間互連,這代表我必須將同一組 Public/Private Key 都放一份到這些機器中,或是建很多組 Public/Private Key 來做這件事,但對於安全性而言,這已經等同於把 Private Key 放到上面給人用了。幸好,SSH 提供了 Agent Forwarding 的功能,能夠讓我只需將 Private Key 放在自己的 Notebook 上,然後便可在這些機器之間暢行無阻了。有關 SSH Key Authentication 及 Agent Forwarding 相關的運作流程及知識,可以參考這裡,這篇只是教大家如何設定。

1. Basic SSH Key Authentication

要做到基本的 SSH Key Authentication,首先便是要產生一組獨一無二的 Key Pair (Public/Private Key),在 Windows 上我使用 puttygen。執行 puttygen 可以看到下面的畫面:
puttygen 1

按下 “Generate” 產生一組 Key Pair,在產生的過程當中,它會要求你隨意移動滑鼠遊標,然後透過移動來亂數產生這組 Key Pair:
puttygen 2

結束後便會有一組獨一無二的 Key Pair 了:
puttygen 3

我們將產生的 Public Key 複製貼到:

$HOME/.ssh/authorized_keys

然後,再按下 “Save private key” 將其對應的 Private Key 存起來供 SSH Agent 使用。在中間可以看到 “Key passphrase”,它可以用來保護你的 Private Key,在進行 Key Authentication 的時候,會要求你輸入設定的 Key Passphrase,如果不符合,即使拿到了 Private Key 也是無法成功通過認證。

接著我們要利用 SSH Agent 來幫我們管理這些 Key Pair,在 Windows 中,我使用 pageant;執行 pageant,會在右下角看到它的 icon 出現,點選右鍵可以看到它的功能:
pageant 1

“View Keys” 可以檢視現在加入的 Private Key 有哪些,”Add Key” 顧名思義就是加入一個 Private Key,我們現在就是要將剛剛產生的 Private Key 加入到 pageant,在加入的時候,如果你剛剛有設定 Key passphrase,便要要求你輸入,這樣 pageant 在幫你進行認證的時候便不需要再手動輸入 Key passphrase 了:
pageant 2

加入 Private Key 後,便可以看到我們加入的 Key 已經記錄下來了:
pageant 3

然後透過 pageant 來執行我們在 Putty 當中設定的 Session,便會自動幫你進行認證,認證成功便會看到這樣的訊息:
putty 2

要特別注意的是,很多人常常會問,雖然不必再輸入密碼了,但是為什麼還是要輸入帳號,其實只需要在 Putty 當中設定好預設登入的帳號名稱即可:
putty 1

2. SSH Agent Forwarding

要達到 SSH Agent Forwarding,我們必須在 Putty 的設定中動點手腳:
putty 3

將 “Allow agent forwarding” 選取就可以了。然後只需要將同一份 Public Key 放到其他會透過第一部機器連出的機器上,在第一部機器使用 SSH 的時候下:

ssh -A <SERVER_HOST>

便可以將第一台機器的 agent forward 出去。如此一來,只需要同一份 Public/Private Key 便可以在各台機器中暢行無阻,而且不用擔心 Private Key 需要放出去的風險了。

3. SSH Agent Forwarding on Screen

在試的過程中,如果有使用 Screen 這個好用工具的人,一定會發現,一旦進入到 Screen 當中,SSH Agent Forwading 似手就失效了,但是離開 Screen 一切又正常,為何會這樣?

主要是因為使用 SSH Agent Forwarding 會參考一個環境變數 “SSH_AUTH_SOCK”,這個在 Screen 當中並不會被帶入,因此會失效。所以如果要讓 SSH Agent Forwarding 能夠在 Screen 下正常運作,便必須要做一些手腳,在網路上其實有蠻多方法可以用,大部份是將 ssh 和 screen 都做一個 wrapper,主要的想法都是在進入 screen 後自動建立環境變數 (對 .screenrc 下手),但這樣的想法只能確保 screen 自動建立以及已存在的視窗,對於新建立的視窗可能就沒辦法做到,所以我自己寫了個 shell script “setScreenSshAgent”:

#! /bin/sh
MKDIR=`which mkdir`
LN=`which ln`
if [ -n "$SSH_AUTH_SOCK" ]; then
    if [ ! -d "$HOME/.screen" ]; then
        ${MKDIR} -p "$HOME/.screen"
    fi

    if [ -z "$WINDOW" ]; then
        ${LN} -fs "$SSH_AUTH_SOCK" "$HOME/.screen/ssh-agent-screen-$HOST"
    fi
fi

這支程式主要是將當時的 SSH_AUTH_SOCK link 到 “$HOME/.screen/ssh-agent-screen-$HOST” 下,然後在 .cshrc 下加入:

$HOME/bin/setScreenSshAgent
if ($?WINDOW) then
    setenv SSH_AUTH_SOCK "$HOME/.screen/ssh-agent-screen-$HOST"
endif

這樣子就能在登入時更新最新的 SSH_AUTH_SOCK 到 “$HOME/.screen/ssh-agent-screen-$HOST” 中,然後在 Screen 建立新的視窗也會自動將 SSH_AUTH_SOCK 設定到此 link,如此一來,SSH Agent Forwarding 便能正常運作。

Update: 把一些設定改一下,原本的 .cshrc 裡的設定會讓在非家目錄下執行 Shell 出現找不到的問題,所以改成絕對路徑。

FreeBSD 7.0R amd64 上的網卡問題

FreeBSD 7.0R 這次的 release 中,加入了 re(4) 新的支援,尤其是最近普遍被使用的 On-board 網卡:

RTL8168/8111 PCI-E Gigabit Ethernet NIC

這張卡在 i386 的版本上沒問題,但是在 amd64 版本剛啟動的時候運作算正常,可是過了一段時間後,incoming 的連線會死得很慘,好像塞住一樣,網路上也有蠻多人在唉的,有些人提供不少他們自己可以正常運作的設定,但我試過之後依然不能解決問題,後來換了張以前的舊卡:

D-Link 530TX

這張卡也是在 i386 運作得很好,到了 amd64 死得比另一張要快,它是吃 vr(4) 的 driver (後來聽 liuyh 說這張效能也很差),搞了半天受不了,到系計中借了張 Intel 10/100/1000 的網卡來用,吃的 driver 是 em(4),一換上去,從此天下太平…= =,所以我決定去敗幾張這個網卡來存著。

Leopard 10.5.2 更新出來了

Mac OS 10.5 leopard 新的更新出來了,目前最新版本是 10.5.2;除了安全性更新之外,還有軟體功能上的修正和新功能,廢話不多說,趕快來更新!

詳細的更新內容可以參考這裡
leopard 10.5.2 update

Why?! Leopard 這麼會當?!

之前有提到我的 MacBook 自從換了 leopard 之後就當機連連,讓我一度對 Apple 失去信心!= =

不過上次到台北參加某 Y 社的活動時,閒著沒事就抓了套 memory testing 的軟體下來測,不測還好,一測就看到螢幕上滿滿的 “Failure…!@#$@^&”,不會真的是記憶體的問題吧!

活動結束就馬上跟麻大帥衝去光華優仕換記憶體,新的記憶體一裝上,開機之後一直到現在沒有再當過,連程式執行的速度也飛快,我真佩服自己能夠忍受之前的那種工作機環境。

所以,鄉親啊!下次換記憶體的時候記得先測測啊!

Blog 搬家!!

是的!沒錯!我的 blog 搬家了。搬到實驗室的機器上,用 WordPress 架的,順便也申請了自己的 domain name,以後我的 blog 網址固定為:

http://blog.yzlin.org

大家以後就用這個連吧!會慢慢把 Blogger 上的文章轉過來。

CS/BSD Installation Guide

Step 1. 基本系統安裝完畢後

Step 2. 設定 /etc/make.conf

CPUTYPE?= pentium4 # 隨機器而不同,參考 /usr/share/examples/etc/make.conf
SUP_UPDATE= YES
SUP= /usr/bin/csup
SUPFLAGS= -L 2 -Z
SUPHOST= cvsup.tw.freebsd.org
SUPFILE= /usr/share/examples/cvsup/stable-supfile
PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile

Step 3. 設定 /etc/rc.conf,加入 NIS/NFS & AMD 的設定

amd_enable="YES"
amd_flags="-a /amd -c 1800 -d cs.nctu.edu.tw -l /var/log/amd.log -x all /net auto.home"
nfs_client_enable="YES"
nfs_client_flags="-n 10"
nfs_reserved_port_only="YES"
nis_client_enable="YES"
nis_client_flags="-s -m -S +cs.nis,cshome,csmailgate,csduty"
nisdomainname="+cs.nis"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"

Step 4. 修改 user & group

  • 用 vipw 來更改 /etc/master.passwd,修改 root 名稱為對應的 host name 並加入 nis 欄位,如:
    root:*:0:0:bsdX &:... # 可以讓 root 寄出的 mail 較好辨識
    ...
    +:::::::::
  • 修改 /etc/group,將 bsdTA 加入 wheel group 並加入 nis 欄位,如:
    +:*::
  • 在 amd64 的版本中,NIS 可能會有點怪問題,某些 group (security, wwwadm, …) 可能抓不到,可以手動強制加入:
    +security:*::
    +wwwadm:*::
    ...

Step 5. 做 src & ports tree 更新

Step 6. 安裝 subversion (/usr/ports/devel/subversion)

cd /usr/ports/devel/subversion; make install clean

Step 7. 將 csports checkout 下來

cd /usr/ports
svn checkout https://opensvn.csie.org/csports/trunk/cs

Step 8. 安裝 cs/metaport 將所需要的 csports 選起來安裝 (除了 cs/wwwConf)

cd /usr/ports/cs/metaport; make install clean
# 注意!有些套件可能需要有某些檔案存在才能正常 make,例如:cs/cdict5 要先把字典檔抓下來

Step 9. 修改 kernel configuration file,主要有幾個選項要設定:

options COMPAT_FREEBSD4
options COMPAT_FREEBSD5
options COMPAT_FREEBSD6 # FreeBSD 7.0 才需要
options COMPAT_43TTY # help 有用到 BSD 4.3 TTY format
options COMPAT_IA32 # amd64 版本才需要,相容 i386 binaries
options KTRACE
options AUTO_EOI_1 # FreeBSD 7.0 不需要
#options IPFIREWALL
#options IPFIREWALL_DEFAULT_TO_ACCEPT
#options IPFIREWALL_FORWARD
options INET
device bpf

Step 10. 若 kernel configuration file 沒有將網卡、device random、options SYSV* 等編進去,要在 /boot/loader.conf 將它們以 kernel module 的方式動態載入,並加入其他設定

agp_load="YES"
if_em_load="YES" # 網卡代號可能不同,這邊是以 em 網卡為例
random_load="YES"
sio_load="YES"
sysvmsg_load="YES"
sysvsem_load="YES"
sysvshm_load="YES"
kern.ipc.nmbclusters=65535

Step 11. make world & kernel

Step 12. 設定 /etc/inetd.conf,打開 rstatd & ruserd 以及 auth 並修改其啟動參數

  • /etc/inetd.conf
    rstatd/1-3      dgram rpc/udp wait root /usr/libexec/rpc.rstatd  rpc.rstatd
    rusersd/1-2     dgram rpc/udp wait root /usr/libexec/rpc.rusersd rpc.rusersd
    auth    stream  tcp     nowait  root    internal        auth -r -o UNKNOWN -t 30 # -f -n 要拿掉
  • /etc/rc.conf 加入
    inetd_enable=”YES”

Step 13. 在 /etc/mail/ 下 make,生出 bsd*.submit.mc,然後修改加入:

define(`ALIAS_FILE', `/etc/mail/aliases,nis:mail.aliases@+cs.nis')dnl
FEATURE(`msp', `csmailgate.cs.nctu.edu.tw')dnl
MASQUERADE_AS(cs.NCTU.edu.tw) MASQUERADE_DOMAIN(`bsd*.cs.NCTU.edu.tw')dnl # 依照 domain name 的不同做更改

Step 14. 接著在 /etc/mail/ 下 make all install,然後修改 /etc/rc.conf

sendmail_enable="NONE"

Step 15. 設定印表機,從別台機器取得 /etc/printcap(csports/lpd 會自動裝),修改 /etc/rc.conf

lpd_enable="YES"
lpd_flags="-l"
lpd_program="/usr/local/sbin/lpd"

Step 16. 修改 /etc/rc.conf 設定開機啟動 quota

quota_enable="YES"

Step 17. sshd 設定 (這個步驟可以提前做,然後就直接遠端連進去下指令了)

  • /etc/rc.conf
    sshd_enable="YES"
  • /etc/ssh/sshd_config
    VersionAddendum FreeBSD # 改掉,以防用 telnet 看 port 22 時被人得知 FreeBSD 的版本
    Protocol 2 # 強迫使用 SSH2

Step 18. FTP 設定

  • 安裝 /usr/ports/ftp/pure-ftpd
  • 設定 /usr/local/etc/pure-ftpd.conf,下面是主要的設定,其他請參考當時的設定
    DisplayDotFiles             yes
    AnonymousOnly               no
    NoAnonymous                 yes
    AnonymousCanCreateDirs      no
    PassivePortRange          64000 65000
    AnonymousCantUpload         yes
    AllowAnonymousFXP           no
    TLS                      2
    FileSystemCharset       big5
  • rc.conf 加入
    pureftpd_enable="YES"

Step 19. ganglia

  • 安裝 /usr/ports/sysutils/ganglia-monitor-core
  • link /usr/local/etc/gmond.conf
    ln -s /net/admin/etc/gmond.conf /usr/local/etc/gmond.conf
  • rc.conf 加入
    gmond_enable="YES"

Step 20. 重開機後到其它台把 /var/db/ports 下的東西 sync 過來後,將需要的 ports 灌好

Step 21. 其餘設定檔 (從其他台抓)

  • /etc/hosts.allow, /etc/hosts (從別台抓回來)
  • /etc/resolv.conf (記得設定好 domain/search,不然 amd 會抓不到,NFS 就起不來)
  • /etc/motd 特殊字體請用 figlet 生出來

Vim - Encoding

很多人在用 vim 的時候,常常搞不懂要怎麼設定,這篇是之前分享在系計中的文章,順便轉過來。
在 vim 當中,編碼的設定主要有下列三種,它們代表的意思如下:

  • encoding (enc):設定 vim 內部要以何種編碼表示
  • termencoding (tenc):實際輸出到終端機的畫面
  • fileencoding (fenc):文件實際的編碼

最好多加上一行 filencodings 的設定:

set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1

因為一般的 text file 不會在檔案中註明這份文件的編碼是什麼。所以 vim 在開啟文件的時候會依照 fileencodings 的先後順序來嘗試解析這份文件,當決定了這份文件的編碼(fenc)後,便會將它轉換成內部系統的編碼(enc)來處理,而內部系統的編碼又會依照終端機的編碼(tenc)轉換後傳給終端機。所以當 putty 的編碼設定成 big5,但 server 上的編碼是 utf-8,此時便要設定:

set encoding=utf-8
set termencoding=big5

這樣子,server 上依然是以 utf-8 在運作,只是輸出到 putty 時會轉成 big5 給它,而且 putty 上的輸入也會自動轉成 utf-8 到 vim 上,但一般來說都會把 encoding 和 termencoding 設成一樣。
至於 fileencoding,有時候 vim 自動解析會出現誤判,例如明明是 big5 編碼的檔案,它偏偏用 latin1 來 parsing (這個 wwwTA 將 big5 網頁轉成 utf-8 的時候常發生)。如此一來,便會出現亂碼,但是不要以為檔案壞掉了,其實只要先 check fenc 的值看是不是檔案實際的編碼,如果不是,多半只是誤判,此時只要下:

:e ++enc=<指定的編碼>

即可以指定的編碼來解析文件。 (Note: 這裡的 enc 指的不是 encoding,而是 fenc)
fileencoding 還有一項好用的用途,當儲存檔案的時候,vim 也會依據 fileencoding 的設定將文件由 enc 的編碼轉換為 fenc 的編碼,所以只要在編輯文件的時候下:

:set fenc=<指定的編碼>

就可以將文件儲存成指定的編碼了(其實用 iconv 比較快啦!不過改網頁的時候可以直接在 vim 上改編碼),不過記得要在一開始讀文件時的編碼就要對的情況下用,不然對亂碼轉碼的下場就是整個文件爛掉,常有人會在自動解析錯誤的情況下,以為 set fileencoding 成正確的,就可以把文件用正確的編碼解析,其實這個動作會把現在解析錯誤的文件設定成你以為是正確的編碼,結果就是整個文件的編碼都錯了,應該用上面提到的:

:e ++enc=XXX

來用正確的編碼重新讀取文件。