2009年11月25日 星期三

虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!


本文章發佈於免費資源網路社群,轉貼時請註明原文連結並保留本訊息,謝謝。
文章連結:http://www.freegroup.org/2009/11/lego-digital-designer/
lego digital designer 01 虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!
作者/Pseric(2009-11-23)
LEGO Digital Designer(簡稱LDD)樂高數位設計師是由樂高公司提供的免費軟體,分為 PC 與 Mac 版本。透過這個軟體使用者就可以在電腦裡拼裝積木,完成後還可以變成說明書,引導使用者讓實體積木組合起來,非常有趣。LDD 目前支援一般的 DESIGNbyMe 積木,也支援 CREATOR 與 Mindstorms 系列。


筆者使用 Mac 版作為範例介紹,與 PC 版應無太大差異,除了安裝過程不一樣以外,LDD 的介面應該相同。
lego digital designer 02 虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!
Mac 版的 LDD 共會佔用 109.5MB 的硬碟空間,安裝後如果不想使用直接從應用程式移除即可。
lego digital designer 03 虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!
安裝後開啟軟體,可以選擇要使用的積木系列,使用者能夠開啟預設的一些成品模型,或是開啟新的模版來自行組裝。下圖是採用 DESIGNbyMe 積木預設的房屋模型,滑鼠左鍵可以移動或搬移積木,右鍵按著則可以調整觀看的角度。
lego digital designer 04 虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!
右上角可以切換模式,分別是組裝模式環境模式說明書模式,下圖是以說明書來展示如何組裝該模型,共有 56 個步驟,一般使用時若你手動組裝完樂高模型,點選說明書模式就會自動產生步驟導引,非常方便。
lego digital designer 05 虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!
前面有介紹過,LDD 也支援 Mindstorms 樂高系列,怎樣?夠酷吧!有時候用 LDD 過過癮也不錯。
lego digital designer 06 虛擬樂高積木軟體,讓你在電腦裡也能玩樂高!
好了,大致上的介面就是這樣,至於一些細部的功能或特色就不詳加闡述,如果使用者有興趣的話不妨前往樂高網站下載LEGO Digital Designer來玩玩吧!

2009年10月29日 星期四

C語言常見錯誤小結

C語言常見錯誤小結
出處:http://fanqiang.chinaunix.net/a4/b2/20010706/220800825_b.html



C語言的最大特點是:功能強、使用方便靈活。C編譯的程序對語法檢查並不象其它高級語言那嚴格,這就給編程 人員留下“靈活的余地”,但還是由這個靈活給程序的調試帶來了許多不便,尤其對初學C語言的人來說,經常會出一些連自己都不知道錯在哪裡的錯誤。看著有錯 的程序,不知該如何改起,本人通過對C的學習,積累了一些C編程時常犯的錯誤,寫給各位學員以供參考。

1.書寫標識符時,忽略了大小寫字母的區別。

main()
{
     int a=5;
     printf("%d",A);
}

編譯程序把a和A認為是兩個不同的變量名,而顯示出錯信息。C認為大寫字母和小寫字母是兩個不同的字符。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。
2.忽略了變量的類型,進行了不合法的運算。

main()
{
     float a,b;
     printf("%d",a%b);
}

%是求余運算,得到a/b的整余數。整型變量a和b可以進行求余運算,而實型變量則不允許進行“求余”運算。
3.將字符常量與字符串常量混淆。
char c;
c="a";

在這裡就混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,字符串常量是一對雙引號括起來的字符序列。C規定以“\”作字符串結束標 志,它是由系統自動加上的,所以字符串“a”實際上包含兩個字符:‘a'和‘\',而把它賦給一個字符變量是不行的。
4.忽略了“=”與“==”的區別。 
在許多高級語言中,用“=”符號作為關系運算符“等”。如在BASIC程序中可以寫
if (a=3) then …
但C語言中,“=”是賦值運算符,“==”是關系運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,者表示如果a和3相等,把b值賦給a。由習慣問題,初學者往往會犯這樣的錯誤。

5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1
b=2

編譯時,編譯程序在“a=1”面沒發現分號,就把下一行“b=2”也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{
     z=x+y;
     t=z/100;
     printf("%f",t);
}

對復合語句來說,最一個語句中最的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對一個復合語句,如:
{

     z=x+y;
     t=z/100;
     printf("%f",t);
};
復合語句的花括號不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由if (a%3==0)多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I<5;I++);
{

     scanf("%d",&x);
     printf("%d",x);

}
本意是先輸入5個數,每輸入一個數再將它輸出。由for()多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。

7.輸入變量時忘記加地址運算符“&”。
int a,b;
scanf("%d%d",a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。“&a”指a在內存中的地址。

8.輸入數據的方式與要求不符。
scanf("%d%d",&a,&b);
輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
scanf("%d,%d",&a,&b);
C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字符是不對的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4

9.輸入字符的格式與要求不一致。
在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c
字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,面不需要用空格作為兩個字符的間隔。

10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf("%f%d\n",a,b);
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。

11.輸入數據時,企圖規定精度。
scanf("%7.2f",&a);
這樣做是不合法的,輸入數據時不能規定精度。


12.switch語句中漏寫break語句。
例如:根據考試成績的等級打印出百分制數段。
switch(grade)
{

     case 'A':printf("85~100\n");
     case 'B':printf("70~84\n");
     case 'C':printf("60~69\n");
     case 'D':printf("<60\n");
     default:printf("error\n");

}
由於漏寫了break語句,case只起標號的作用,而不起判斷作用。因此,當grade值為A時,printf函數在執行完第一個語句接著執行第二、三、四、五個printf函數語句。正確寫法應在每個分支再加上“break;”。例如
case 'A':printf("85~100\n");break;

13.忽視了while和do-while語句在細節上的區別。
(1)
main()
{

     int a=0,I;
     scanf("%d",&I);
     while(I<=10)
     {

          a=a+I;
          I++;
     }
     printf("%d",a);
}

(2)
main()
{

     int a=0,I;
     scanf("%d",&I);
     do
     {

         a=a+I;
         I++;
     }while(I<=10);
     printf("%d",a);
}
可以看到,當輸入I的值小或等10時,二者得到的結果相同。而當I>10時,二者結果就不同了。因為while循環是先判斷執行,而do- while循環是先執行判斷。對大10的數while循環一次也不執行循環體,而do-while語句則要執行一次循環體。

14.定義數組時誤用變量。
int n;
scanf("%d",&n);
int a[n];
數組名用方括號括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。


15.在定義數組時,將定義的“元素個數”誤認為是可使的最大下標值。
main()
{

     static int a[10]={1,2,3,4,5,6,7,8,9,10};
     printf("%d",a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。

16.初始化數組時,未使用靜態存儲。
int a[3]={0,1,2};
這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:
static int a[3]={0,1,2};

17.在不應加地址運算符&的位置加了地址運算符。
scanf("%s",&str);
C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字符數組名,不必要再加地址符&。應改為:
scanf("%s",str);

18.同時定義了形參和函數中的局部變量。

int max(x,y)
int x,y,z;
{

     z=x>y?x:y;
     return(z);
}
形參應該在函數體外定義,而局部變量應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{

     int z;
     z=x>y?x:y;
     return(z);
}




2009年9月29日 星期二

XFS Backup/Restore

 XFS Backup/Restore

轉載

一般 unix base 的備份多使用 tar, cpio, dump 之類的軟體. 最常看見的應該算是 tar 了. 不過 tar 目前只能備份標準的一些檔案屬性, 對於 XFS 來說,額外的 ACL 屬性就沒有辦法了. 所以如果使用 XFS, 通常就會利用本身所提供的工具來備份.

下面的 script 就是利用 xfsdump, bzip2, dd 備份資料到磁帶上. 備份後會測試一次, 以確定資料完整.

#!/bin/sh

# 磁帶機的裝置名稱
TAPE_DEV="/dev/nst0"

# null 裝置名稱
NULL_DEV="/dev/null"

# 指令檔存放的路徑
CMD_PATH="/etc/backup"

# 磁帶的區塊大小 (TR-5 使用 9-65536, 備份與還原必須使用相同設定)
# 配合壓縮軟體與 dd 時, 若設定過大會有問題
BLOCK_SIZE=1024

# 備份的等級, 0 為完全備份
BACKUP_LEVEL=0

# 備份時顯示的間格秒數
TIME_DISPLAY=300

# 備份的指令檔
DUMP_CMD="/usr/sbin/xfsdump"

# 還原備份的指令檔
RESTORE_CMD="/usr/sbin/xfsrestore"

# mt 指令
MT_CMD="/bin/mt"

# dd 指令
DD_CMD="/bin/dd"

# 壓縮程式
ZIP_CMD="/usr/bin/bzip2"

# ls 指令
LS_CMD="/bin/ls"

# head 指令
HEAD_CMD="/usr/bin/head"

# 備份路徑設定檔
# 檔案格式如下:
#
#/dev/hda1 /
#/dev/vg01/ora /home/oracle oracle_stop oracle_start
VOLS_INCL_FILE="${CMD_PATH}/vols.include.xfsdump"

if [ -f ${VOLS_INCL_FILE} ]; then
date
echo "---------------------------------------------------------------"
echo "如果要還原備份資料, 可以使用下面的指令:"
echo "${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | \ "
echo " ${ZIP_CMD} -dqv | \ "
echo " ${RESTORE_CMD} -p ${TIME_DISPLAY} -J - /path/to/restore/"
echo "---------------------------------------------------------------"
echo

echo "---------------------------------------------------------------"
echo "列出本檔案的內容 - ${0}"
echo "---------------------------------------------------------------"
cat ${0}
echo "---------------------------------------------------------------"
echo "檔案結束!"
echo "---------------------------------------------------------------"
echo

echo "---------------------------------------------------------------"
echo "將磁帶回轉, 並設定區塊大小"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} retension"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} rewind"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} setblk ${BLOCK_SIZE}"
echo "---------------------------------------------------------------"
echo
${MT_CMD} -f ${TAPE_DEV} retension
${MT_CMD} -f ${TAPE_DEV} rewind
${MT_CMD} -f ${TAPE_DEV} setblk ${BLOCK_SIZE}

echo "---------------------------------------------------------------"
echo "載入設定檔: ${VOLS_INCL_FILE}"
index=0
declare -a device_names
declare -a session_names
declare -a before_cmds
declare -a after_cmds
exec 9<&0
exec <${VOLS_INCL_FILE}
while read DEVICE_NAME SESSION_NAME BEFORE_CMD AFTER_CMD
do
case "${DEVICE_NAME}" in
""|\#*)
continue;
;;
esac
device_names[$index]=${DEVICE_NAME}
session_names[$index]=${SESSION_NAME}
before_cmds[$index]=${BEFORE_CMD}
after_cmds[$index]=${AFTER_CMD}
let "index += 1"
done
echo "共有 ${index} 個檔案系統要備份!"
echo "---------------------------------------------------------------"
exec 0<&9 9<&-

num=0
while [ "$num" -lt "$index" ]; do
DEVICE_NAME=${device_names[$num]}
SESSION_NAME=${session_names[$num]}
BEFORE_CMD=${before_cmds[$num]}
AFTER_CMD=${after_cmds[$num]}
let "num += 1"

date
echo "---------------------------------------------------------------"
echo "備份 ${DEVICE_NAME} 到磁帶 ${TAPE_DEV} 中..."
echo "---------------------------------------------------------------"
if [ "${BEFORE_CMD}" != "" ]; then
echo " *** 執行備份前置指令: ${CMD_PATH}/${BEFORE_CMD}"
${CMD_PATH}/${BEFORE_CMD}
fi
echo " *** 開始備份..."
echo "cmd: ${DUMP_CMD} \
-l ${BACKUP_LEVEL} \
-o \
-p ${TIME_DISPLAY} \
-J \
-F \
-M weekly_backup \
-L ${SESSION_NAME} \
- ${DEVICE_NAME} | \
${ZIP_CMD} -9qv | \
${DD_CMD} bs=${BLOCK_SIZE} conv=sync of=${TAPE_DEV}"
${DUMP_CMD} \
-l ${BACKUP_LEVEL} \
-o \
-p ${TIME_DISPLAY} \
-J \
-F \
-M weekly_backup \
-L ${SESSION_NAME} \
- ${DEVICE_NAME} | \
${ZIP_CMD} -9qv | \
${DD_CMD} bs=${BLOCK_SIZE} conv=sync of=${TAPE_DEV}
echo " *** 備份完成!"
if [ "${AFTER_CMD}" != "" ]; then
echo " *** 執行備份後置指令: ${CMD_PATH}/${AFTER_CMD}"
${CMD_PATH}/${AFTER_CMD}
fi
done

date
echo "---------------------------------------------------------------"
echo "備份完成!"
echo "---------------------------------------------------------------"

echo "---------------------------------------------------------------"
echo "將磁帶回轉"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} rewind"
echo "---------------------------------------------------------------"
echo
${MT_CMD} -f ${TAPE_DEV} rewind

num=0
lnum=0
while [ "$num" -lt "$index" ]; do
DEVICE_NAME=${device_names[$num]}
SESSION_NAME=${session_names[$num]}
BEFORE_CMD=${before_cmds[$num]}
AFTER_CMD=${after_cmds[$num]}
let "num += 1"

date
echo "---------------------------------------------------------------"
echo "測試備份內容 ${DEVICE_NAME}"
echo "---------------------------------------------------------------"
echo "cmd: ${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | ${ZIP_CMD} -tqv"
${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | ${ZIP_CMD} -tqv
echo
echo "---------------------------------------------------------------"
echo "如果要還原備份資料, 可以使用下面的指令:"
echo "${MT_CMD} -f ${TAPE_DEV} rewind"
echo "${MT_CMD} -f ${TAPE_DEV} fsf ${lnum}"
echo "${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | \ "
echo " ${ZIP_CMD} -dqv | \ "
echo " ${RESTORE_CMD} -p ${TIME_DISPLAY} -J - /path/to/restore/"
echo "---------------------------------------------------------------"
echo
let "lnum += 1"
done
fi

date
echo "---------------------------------------------------------------"
echo "將磁帶回轉"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} rewind"
echo "---------------------------------------------------------------"
echo
${MT_CMD} -f ${TAPE_DEV} rewind

date
exit 0

本文的最新版本可以由下列的網頁取得:

http://www.teatime.com.tw/~tommy/doc/xfs_backup.txt

postfix 說明

postfix 說明
轉載

以下是個人在 FreeBSD 上裝 postfix 的一些說明文件,由於檔案較大,故分成七個部份,希望對有需要的人有所幫助。

Postfix 是一套使用於架設 mail server 的軟體,其協定為 smpt (port 25),亦是各信件主機傳送信件或是你要將信件傳送至信件主機的通訊協定,在一般 unix-like 中大多是使用 sendmail ,那麼改用 Postfix 有何好處呢?請看以下說明:

1.安全性:sendmail 最為人詬病的就是其安全性,而 Postfix 可有效的改善這種現象,因其在執行時並不以 root 身份執行

2.簡單、快速:使用過 sendmail 的人便知道,sendmail 的設定檔並不很友善,而 Postfix 的設定檔簡單,只需設定一個重要的檔案 main.cf,且其說明詳細,如此在設定時可讓人快速的,省掉一些設定時的麻煩。另外,Postfix 的執行時是由一些分開的小程式個別執行,因此其執行效率較佳

3.相容性:Postfix 就是為了改善 sendmail 的一些缺點而設計的,因此其和 sendmail 的相容性極佳,在轉移上無任何問題

4.使用資源較少

5.為一免費的開放碼軟體

6.是供一些有用的工具軟體,便於日常管理及加強與 sendmail 的溝通

如同在 Postfix 概說中所說的,Postfix 是提供發信的功能,因此一個完整的 mail server 尚需提供收信功能。在 FreeBSD 中提供 qpopper 可達到此功能,以下介紹透過 FreeBSD 的 ports 來安裝 qpopper:

# cd /usr/ports/mail/qpopper
# make install

當安裝完成後,還需修改以下事項:

將 sendmail disable,請編輯 /etc/rc.conf ,將 sendmail_enable="YES" 設定為 sendmail_enable="NO",使用 killall -9 sendmail 停止掉 sendmail daemon

編輯 /etc/inetd.conf ,修改此行 pop3 stream tcp nowait root /usr/local/libexec/qpopper popper -s ,-s 的意思是啟動記錄檔

重新啟動 inetd,執行 killall -HUP inetd

經過以上 step ,測試一下 pop3 是否正常:

# telnet 0 110
Trying 0.0.0.0...
Connect to 0.
Escape character is '^]'.
+OK Qpopper (Version 以下省略..)

出現以上訊息,代表你的 Qpopper 已能正常工作,請鍵入 quit 結束連線..

Postfix 是提供發信的功能(透過 port 25),同樣的,我們透過方便的 ports 來安裝:

# cd /usr/ports/mail/postfix
# make install

在安裝過程中,會問你是否安裝帳號,請按 yes 確定

當安裝完成後,還需修改以下事項。由於 postfix 執行方式,是透過 standalone 而非由 inetd 來控制,因此我們需在 /usr/local/etc/rc.d 中建立一個 shell script 檔,以便開機時能啟動 postfix,建立方式如下:

# cd /usr/local/etc/rc.d
# ee postfixd.sh <- 這個名稱你可自取

在 postfixd.sh 中輸入以下資料:

#!/bin/sh
/usr/local/sbin/postfix start &
echo " postfix "

存檔後,啟動 postfix ,執行

# /bin/sh /usr/local/etc/rc.d/postfixd.sh

# /usr/local/sbin/postfix start

測試 Postfix 是否正常執行:

# telnet 0 25
Trying 0.0.0.0...
Connect to 0.
Escape character is '^]'.
220 cmlab.idv.tw ESMTP Postfix

出現以上訊息,代表你的 Postfix 已能正常執行,現在鍵入 quit 結束連線

在設定 Postfix ,我們需先了解 Postfix 的設定檔案,請參照以下說明:

Postfix 的設定檔案在 /usr/local/etc/postfix 目錄下,檔案分為以下類型
main.cf 這是 Postfix 最重要的設定檔,所有的設定都在此設定,這也是我們討論的重點
1.master.cf 這是用來設定 Postfix 信件處理時程式的相關設定( Postfix 是由於多個小程式共同處理信件的),一般我們不需也不建議去更改它

2.以 sample -* .cf ,這些是一些 sample 參考檔案,如 sample-main.cf、sample-master.cf .. 等,我們不需更改這些檔案,因為 Postfix 的主要設定檔是在 main.cf ,這些只是提供參考用

3.sample.access 和 sample-aliases 這二個檔和 sendmail 中的一樣,用來設定別名及存取控制

4.設定時我們可參考 sample-*.cf 檔案,將想變動的部份加至 main.cf 中即可

一般我們在設定 mail server 時,重點皆是擺在網域的設定、relay 的存取控制、以及一些安全措施(如信箱大小..等),因此我們就這些問題討論:

以下以網域名稱為 cmlab.idv.tw、主機名稱為 mail.cmlab.idv.tw 來做說明:

=> 設定網域名稱
mydomain = cmlab.idv.tw

=> 設定主機名稱(host name)
myhostname = mail.cmlab.idv.tw

=> 設定 aliases 的目錄
alias_maps = hash:/usr/local/etc/postfix/aliases
建立好你的 aliases 檔後(亦可由原先 sendmail 的 aliases 檔案拷貝過來,或將 sample-aliases 改為 aliases 使用),並轉換為 aliases.db

=> 將 aliases 檔轉換為 aliases.db
# cd /usr/local/etc/postfix
# /usr/local/sbin/postalias hash:aliases

=> 利用 access 檔來做存取限制,可參考在 /usr/local/etc/postfix/sample-access 檔案
在 access 中的設定格式如下:
設定對象 <設定方式>
其中設定對象可用主機名稱、主機 ip、網域、或郵件地址..
<設定方式> 主要有 REJECT、OK
如以下的設定
61.219.230.5 OK
cmlab.idv.tw OK
bad.com REJECT
test@com.tw OK

=> 用 postmap 將 access 轉換成 access.db
# cd /usr/local/etc/postfix
# /usr/local/sbin/postmap hash:access

=> 另外建議在 main.cf 中自行加上以下設定
mailbox_size_limit = 102400000 ->這是用來設定信箱大小,單位是 byte,如沒設定則內定值為 50 M,如本例將信箱大小設為 100 M
disable_vrfy_command = yes -> 將vrfy 功能關掉
smtpd_recipient_limit = 100 -> 限定每一封信可寄給幾個人,如本例為 100


=> 經過以上設定後,你便可測試你的 mail server 是否正常(通常可借由寄一封信到外面的主機,及從外面的主機寄一封信到 local 來確定 mail server 是否正常)

在設定 Postfix 後,我們來了解 Postfix 的檔案結構,請參照以下說明:

Postfix 的設定檔案在 /usr/local/etc/postfix 目錄下,檔案分為以下類型

1.main.cf 這是 Postfix 最重要的設定檔,所有的設定都在此設定,這也是我們討論的重點

2.master.cf 這是用來設定 Postfix 信件處理時程式的相關設定( Postfix 是由於多個小程式共同處理信件的),一般我們不需也不建議去更改它

3.以 sample -* .cf ,這些是一些 sample 參考檔案,如 sample-main.cf、sample-master.cf .. 等,我們不需更改這些檔案,因為 Postfix 的主要設定檔是在 main.cf ,這些只是提供參考用

4.sample-access 和 sample-aliases 這二個檔和 sendmail 中的一樣,用來設定別名及存取控制

5.Postfix 的執行檔在 /usr/local/sbin 目錄下,都是一些 post* 的檔案,如 postcat、postsuper,另還有一個和 sendmail (沒錯,就和 sendmail 一樣),可用來取代 sendmail 用的

6.信件放在 /var/mail 之下

7.mail queue 在 /var/spool/postfix 目錄下,是由一些分門別類的目錄所構成,有興趣的朋友可自行研究看看

8.系統日誌檔在 /var/log/maillog,建議時時查看,以維護系統的安全,亦可檢查信件來往正不正常

Postfix 在設計初,便是為了取代 sendmail ,因此和 sendmail 的相容性極佳,在此我們來研究一下 Postfix 如何和 sendmail 互通有無。

Postfix 的設定檔 mail.cf 和 sendmail 的 sendmail.cf 相當,不過簡單易懂

Postfix 可以使用 sendmail 的 access 及 aliases 檔,方法如下:
=> 將 aliases 檔轉換為 aliases.db
# cd /usr/local/etc/postfix
# /usr/local/sbin/postalias hash:aliases

=> 用 postmap 將 access 轉換成 access.db
# cd /usr/local/etc/postfix
# /usr/local/sbin/postmap hash:acces

sendmail 提供的一些指令,如 mailq .. ,Postfix 亦可達到其功能,方法如下:
=> 將 /etc/mail/mailer.conf 裡面的四項設定改成:
sendmail /usr/local/sbin/sendmail
send-mail /usr/local/sbin/sendmail
mailq /usr/local/sbin/sendmail
newaliases /usr/local/sbin/sendmail

如此則可在 Postfix 中使用 mailq 來查看目前 mail queue 的狀況,另外 Posfix 所提供的 sendmail 指令,亦可提供大部份先前 sendmail 的功能,各位朋友可用好男人 man sendmail 來查看,以下提供一些說明(請注意路徑):

=> 查詢目前 mail queue,和原 sendmail 的 mailq 功能一樣
# /usr/local/sbin/sendmail -bp

=> 立即送出信件
# /usr/local/sbin/sendmail -q

=> 模仿原 sendmail 的 newaliases 功能
# /usr/local/sbin/sendmail -I

在 /usr/local/sbin 這個目錄中,Postfix 提供了一些工具程式,皆是以 post 開頭,如 postcat、postfix、postsuper .. 等,其中有些是在信件處理時使用的,不建議在一般 command line 下用,我們就一些實用的指令來做說明:

=> postfix 這個指令用來啟動、停止、重新啟動 postfix daemon,如
# /usr/local/sbin/postfix start -> 啟動 postfix
# /usr/local/sbin/postfix stop -> 停止postfix
# /usr/local/sbin/postfix reload -> 重新啟動 postfix

=> postalias 這個指令用來將 aliases 檔轉為 aliases.db 檔
# cd /usr/local/etc/postfix
# /usr/local/sbin/postalias hash:aliases

=> postmap 將 access 檔轉為 access.db 檔
# cd /usr/local/etc/postfix
# /usr/local/sbin/postmap hash:access

=> postsuper 從其名稱不難得知,這是 Postfix 中最 super 的指令了,其詳細用法可用 man postsuper 查看,在此只做簡單說明:
# /usr/local/sbin/postsuper -d -> 將某一封 queue message 刪掉
# /usr/local/sbin/postsuper -d ALL -> 刪除所有的 queue
# /usr/local/sbin/postsuper -sv -> 檢查和修復 postfix 的信件檔

Ports安裝設定

Ports安裝設定
轉載

安裝應用軟體:The Ports collection
本文件操作於:FreeBSD 4.4-RELEASE

Ports安裝設定:

安裝應用軟體:The Ports collection
本文件操作於:FreeBSD 4.4-RELEASE
Ports安裝設定:
用Ports的方式安裝基本的應用軟體。而FreeBSD原則上會到各應用軟體的總站臺下載原始程式後才編譯、安裝,如此速度上會顯得很慢。因此,我們必須設定FreeBSD只需到交大資工系(或者是臺灣地區其他的mirror站)來抓取原始程式碼即可。

cp /etc/defaults/make.conf /etc/
vi /etc/make.conf

將:

# Port master sites.
#
# If you want your port fetches to go somewhere else than the default
# (specified below) in case the distfile/patchfile was not found,
# uncomment this and change it to a location nearest you. (Don't
# remove the "/${DIST_SUBDIR}/" part.)
#
#MASTER_SITE_BACKUP?= \
# ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
#
# If you want your port fetches to check the above site first (before
# the MASTER_SITES specified in the port Makefiles), uncomment the
# line below. You can also change the right side to point to wherever
# you want.
#
#MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}
#

改為:

# Port master sites.
#
# If you want your port fetches to go somewhere else than the default
# (specified below) in case the distfile/patchfile was not found,
# uncomment this and change it to a location nearest you. (Don't
# remove the "/${DIST_SUBDIR}/" part.)
#

MASTER_SITE_BACKUP?= \
ftp://ftp.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp5.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp10.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp2.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp3.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp4.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp7.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp8.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp9.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp11.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp12.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/

#
# If you want your port fetches to check the above site first (before
# the MASTER_SITES specified in the port Makefiles), uncomment the
# line below. You can also change the right side to point to wherever
# you want.
#
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}
#

上述站台的排列原則是,哪一台的網路連線與您的網路環境最佳者,排在第一個。

抓檔案時,如果第一台抓不到,會依序向第二台詢問有沒有。如果都問完了,還是沒有,就會到國外的原始站台去抓。不過,這種情形應該很少見到。

開始用Ports安裝應用軟體:

cd /usr/ports/net/cvsup-without-gui; make install clean
cd /usr/ports/sysutils/portupgrade ; make install clean
cd /usr/ports/ftp/wget ; make install clean
cd /usr/ports/security/sudo ; make install clean
cd /usr/ports/shells/bash2 ; make install clean
cd /usr/ports/ftp/ncftp3 ; make install clean
cd /usr/ports/mail/imap-uw ; make install clean
cd /usr/ports/mail/qpopper ; make install clean
cd /usr/ports/security/pidentd ; make install clean
cd /usr/ports/misc/gnuls ; make install clean

其中,cvsup-without-gui 與 portupgrade 是屬於系統更新( src 及 ports-tree )的工具軟體,建議您一定要裝。

查看安裝之後的結果:

pkg_info
autoconf-2.13_1 Automatically configure source code on many Un*x platforms
bash-2.05 The GNU Bourne Again Shell
gettext-0.10.35 GNU gettext package
gettext-0.10.38 GNU gettext package
gmake-3.79.1 GNU version of 'make' utility
isc-dhcp3-3.0.r11 ISC Dynamic Host Configuration Protocol client and server code
libiconv-1.7_1 A character set conversion library
libtool-1.3.4_2 Generic shared library support script
m4-1.4 GNU's m4
ncftp3-3.0.3 ftp replacement with advanced user interface
pidentd-2.8.5 An RFC1413 identification server
qpopper-4.0.3_1 Berkeley POP 3 server (now maintained by Qualcomm)
wget-1.7_3 Retrieve files from the 'net via HTTP and FTP

大海撈針:搜尋某一ports
cd /usr/ports
make search key="popper" | more
cd /usr/ports
make search key="libiconv" | grep Path: | grep libiconv

Port: qpopper-2.53_2
Path: /usr/ports/mail/popper
Info: Berkeley POP 3 server (now maintained by Qualcomm)
Maint: ache@freebsd.org
Index: mail
B-deps:
R-deps:

Port: qpopper-4.0.3_1
Path: /usr/ports/mail/qpopper
Info: Berkeley POP 3 server (now maintained by Qualcomm)
Maint: lioux@FreeBSD.org
Index: mail ipv6
B-deps: autoconf-2.13_1 m4-1.4
R-deps:

Port:軟體名稱,Path:路徑,Info:訊息,Maint:維護者,Index:類型。

cd /usr/ports
make search key="libiconv" | grep Path: | grep libiconv

ports-tree的更新

cd /usr/ports

fetch ftp://freebsd.csie.nctu.edu.tw/pub/CVSup/cvsupfile-ports
cvsup -g -L 2 cvsupfile-ports

我以HiNet-ADSL在FreeBSD 4.2-RELEASE上至NCTU更新ports,共花費了01:07:00。

而在苗栗縣網中,以FreeBSD 4.6-RELEASE至NCTU更新ports,只花費了00:05:00。

這個更新的內容預設值是全部的ports,所需耗費的時間相對就很長。您可以只選擇其中的一部份來更新即可,只要改cvsupfile-ports檔案最底下的那一行(ports-all)。

ports-base: /usr/ports/... misc files at the top of /usr/ports
ports-archivers: /usr/ports/archivers archiving tools
ports-audio: /usr/ports/audio sound support
ports-benchmarks: /usr/ports/benchmarks benchmarks
ports-cad: /usr/ports/cad CAD tools
ports-comms: /usr/ports/comms communication software
ports-databases: /usr/ports/databases databases
ports-devel: /usr/ports/devel development utilities
ports-editors: /usr/ports/editors editors
ports-emulators: /usr/ports/emulators emulators for other OSes
ports-games: /usr/ports/games games
ports-graphics: /usr/ports/graphics various graphics utilities
ports-japanese: /usr/ports/japanese Japanese software.
ports-lang: /usr/ports/lang programming languages
ports-mail: /usr/ports/mail mail software
ports-math: /usr/ports/math numerical computation software
ports-misc: /usr/ports/misc miscellaneous utilities
ports-net: /usr/ports/net networking software
ports-news: /usr/ports/news USENET news software
ports-plan9: /usr/ports/plan9 various programs from Plan9
ports-print: /usr/ports/print printing software
ports-russian: /usr/ports/russian Russian software
ports-security: /usr/ports/security ``security'' utilities, for better or for worse
ports-shells: /usr/ports/shells various UN*X shells
ports-sysutils: /usr/ports/sysutils system utilities
ports-www: /usr/ports/www software related to the world wide web
ports-x11: /usr/ports/x11 X11 software

用 ports 安裝的軟體,遇有該軟體版本更新時如何處置?
請先做「ports-tree的更新」的動作,之後再分別執行下列三道指令:

portsdb -Uu

pkgdb -F

portupgrade -acCv

備註:執行 portsdb -Uu 時,會有令人覺得當機的味道。別耽心,耐心的稍等一下下就好。

portupgrade時,改變預設的編譯安裝選項
編輯 /usr/local/etc/pkgtools.conf

MAKE_ARGS = {
'databases/mysql323-*' => 'WITH_CHARSET=big5',
'databases/mysql323-*' => 'SKIP_INSTALL_DB=yes',
'databases/phpmyadmin' => 'MYADMDIR?=www/data/phpMyAdmin',
'www/apache13' => 'WITH_APACHE_SUEXEC=yes',
}

mysql 安裝時,預設不支援中文;而phpMyAdmin預設的安裝路徑則在www/data.default/phpMyAdmin,與apache不同,害我裝了之後找好久才找到。

版本衝突時
pkgdb -F

Duplicated origin: sysutils/portupgrade - portupgrade-20020706 portupgrade-20020805
Unregister any of them? [no] yes

Unregister portupgrade-20020706 keeping the installed files intact? [no] no

portupgrade 強制更新 (操作於 FreeBSD 4.6.2-RELEASE )

* 未更新 PORTS-TREE 前,portupgrade 已安裝的版本:

pkg_info | grep portupgrade
portupgrade-20020429 Very powerful FreeBSD ports/packages upgrading tool and mor

* 更新 PORTS-TREE 之後,PORTS 中 portupgrade 的版本:

grep \PORTVERSION= /usr/ports/sysutils/portupgrade/Makefile

PORTVERSION= 20020805

* 執行 portupgrade 後,portupgrade 自己並未更新。

* 強制以新的portupgrade取代舊的portupgrade-20020429

portupgrade -o /usr/ports/sysutils/portupgrade portupgrade-20020429

* 再檢查一遍portupgrade 安裝的版本:

pkg_info | grep portupgrade

portupgrade-20020805 Very powerful FreeBSD ports/packages upgrading tool and mor

FreshPorts
http://freshports.org/

每一個ports都有專人負責,其更新也是非常迅速,這兒有第一手資料。

網路上的相關文件:
http://freebsd.sinica.edu.tw/~statue/handbook/ports.html
http://freebsd.sinica.edu.tw/pipermail/freebsd-taiwan-doc/2001-April/000013.html
http://www.lsps.tp.edu.tw/~gsyan/freebsd2001/ports.html
http://ohaha.ks.edu.tw/ports.htm
http://ohaha.ks.edu.tw/portupgrade.htm
http://ohaha.ks.edu.tw/portexec.htm
http://www.study-area.net/freebsd/how_to_use_ports_package/how_to_use_ports.htm
http://freebsd.csie.nctu.edu.tw/handbook.big5/handbook197.html

其他:

* make install : 安裝所選定的 Port
* make deinstall : 移除已安裝的 Port
* make reinstall : 移除之後再安裝一次
* make clean : 安裝完畢後移除 make 資料夾下的檔案
* make distclean : 移除安裝後的原始檔案,以節省磁碟空間

* make install
* make install clean
* make install clean distclean