posts - 17, comments - 1, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2006年9月25日

          此帖送給初學LINUX的窮人們(LINUX的書太貴了)

          名稱:cat
          使用權限:所有使用者
          使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
          說明:把檔案串連接后傳到基本輸出(螢幕或加 > fileName 到另一個檔案)
          參數:
          -n 或 --number 由 1 開始對所有輸出的行數編號
          -b 或 --number-nonblank 和 -n 相似,只不過對于空白行不編號
          -s 或 --squeeze-blank 當遇到有連續兩行以上的空白行,就代換為一行的空白行
          -v 或 --show-nonprinting

          范例:
          cat -n textfile1 > textfile2 把 textfile1 的檔案內容加上行號后輸入 textfile2 這個檔案里
          cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的檔案內容加上行號(空白行不加)之后將內容附加到 textfile3

          名稱 : cd
          使用權限 : 所有使用者

          使用方式 : cd [dirName]

          說明 : 變換工作目錄至 dirName。 其中 dirName 表示法可為絕對路徑或相對路徑。若目錄名稱省略,則變換至使用者的 home directory (也就是剛 login 時所在的目錄)。

          另外,"~" 也表示為 home directory 的意思,"." 則是表示目前所在的目錄,".." 則表示目前目錄位置的上一層目錄。

          范例 : 跳到 /usr/bin/ :
          cd /usr/bin

          跳到自己的 home directory :
          cd ~

          跳到目前目錄的上上兩層 :
          cd ../..



          指令名稱 : chmod
          使用權限 : 所有使用者

          使用方式 : chmod [-cfvR] [--help] [--version] mode file...

          說明 : Linux/Unix 的檔案存取權限分為三級 : 檔案擁有者、群組、其他。利用 chmod 可以藉以控制檔案如何被他人所存取。

          把計 :

          mode : 權限設定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬于同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。
          + 表示增加權限、- 表示取消權限、= 表示唯一設定權限。
          r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該檔案是個子目錄或者該檔案已經被設定過為可執行。
          -c : 若該檔案權限確實已經更改,才顯示其更改動作
          -f : 若該檔案權限無法被更改也不要顯示錯誤訊息
          -v : 顯示權限變更的詳細資料
          -R : 對目前目錄下的所有檔案與子目錄進行相同的權限變更(即以遞回的方式逐個變更)
          --help : 顯示輔助說明
          --version : 顯示版本

          范例 :將檔案 file1.txt 設為所有人皆可讀取 :
          chmod ugo+r file1.txt

          將檔案 file1.txt 設為所有人皆可讀取 :
          chmod a+r file1.txt

          將檔案 file1.txt 與 file2.txt 設為該檔案擁有者,與其所屬同一個群體者可寫入,但其他以外的人則不可寫入 :
          chmod ug+w,o-w file1.txt file2.txt

          將 ex1.py 設定為只有該檔案擁有者可以執行 :
          chmod u+x ex1.py

          將目前目錄下的所有檔案與子目錄皆設為任何人可讀取 :
          chmod -R a+r *

          此外chmod也可以用數字來表示權限如 chmod 777 file
          語法為:chmod abc file

          其中a,b,c各為一個數字,分別表示User、Group、及Other的權限。

          r=4,w=2,x=1
          若要rwx屬性則4+2+1=7;
          若要rw-屬性則4+2=6;
          若要r-x屬性則4+1=7。

          范例:
          chmod a=rwx file


          chmod 777 file

          效果相同
          chmod ug=rwx,o=x file


          chmod 771 file

          效果相同





          若用chmod 4755 filename可使此程式具有root的權限


          指令名稱 : chown
          使用權限 : root

          使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file...

          說明 : Linux/Unix 是多人多工作業系統,所有的檔案皆有擁有者。利用 chown 可以將檔案的擁有者加以改變。一般來說,這個指令只有是由系統管理者(root)所使用,一般使用者沒有權限可以改變別人的檔案擁有者,也沒有權限可以自己的檔案擁有者改設為別人。只有系統管理者(root)才有這樣的權限。

          把計 :

          user : 新的檔案擁有者的使用者 IDgroup : 新的檔案擁有者的使用者群體(group)-c : 若該檔案擁有者確實已經更改,才顯示其更改動作-f : 若該檔案擁有者無法被更改也不要顯示錯誤訊息-h : 只對于連結(link)進行變更,而非該 link 真正指向的檔案-v : 顯示擁有者變更的詳細資料-R : 對目前目錄下的所有檔案與子目錄進行相同的擁有者變更(即以遞回的方式逐個變更)--help : 顯示輔助說明--version : 顯示版本

          范例 :
          將檔案 file1.txt 的擁有者設為 users 群體的使用者 jessie :
          chown jessie:users file1.txt

          將目前目錄下的所有檔案與子目錄的擁有者皆設為 users 群體的使用者 lamport :
          chmod -R lamport:users *


          名稱:cp
          使用權限:所有使用者

          使用方式:

          cp [options] source dest
          cp [options] source... directory

          說明:將一個檔案拷貝至另一檔案,或將數個檔案拷貝至另一目錄。

          把計

          -a 盡可能將檔案狀態、權限等資料都照原狀予以復制。
          -r 若 source 中含有目錄名,則將目錄下之檔案亦皆依序拷貝至目的地。
          -f 若目的地已經有相同檔名的檔案存在,則在復制前先予以刪除再行復制。
          范例:
          將檔案 aaa 復制(已存在),并命名為 bbb :
          cp aaa bbb

          將所有的C語言程式拷貝至 Finished 子目錄中 :
          cp *.c Finished



          名稱:cut

          使用權限:所有使用者

          用法:cut -cnum1-num2 filename

          說明:顯示每行從開頭算起 num1 到 num2 的文字。

          范例:

          shell>> cat example
          test2
          this is test1
          shell>> cut -c0-6 example ## print 開頭算起前 6 個字元
          test2
          this i


          名稱 : find
          用法 : find
          使用說明 :

          將檔案系統內符合 expression 的檔案列出來。你可以指要檔案的名稱、類別、時間、大小、權限等不同資訊的組合,只有完全相符的才會被列出來。

          find 根據下列規則判斷 path 和 expression,在命令列上第一個 - ( ) , ! 之前的部份為 path,之后的是 expression。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 為預設 expression

          expression 中可使用的選項有二三十個之多,在此只介紹最常用的部份。

          -mount, -xdev : 只檢查和指定目錄在同一個檔案系統下的檔案,避免列出其它檔案系統中的檔案
          -amin n : 在過去 n 分鐘內被讀取過
          -anewer file : 比檔案 file 更晚被讀取過的檔案
          -atime n : 在過去 n 天過讀取過的檔案
          -cmin n : 在過去 n 分鐘內被修改過
          -cnewer file :比檔案 file 更新的檔案
          -ctime n : 在過去 n 天過修改過的檔案
          -empty : 空的檔案-gid n or -group name : gid 是 n 或是 group 名稱是 name
          -ipath p, -path p : 路徑名稱符合 p 的檔案,ipath 會忽略大小寫
          -name name, -iname name : 檔案名稱符合 name 的檔案。iname 會忽略大小寫
          -size n : 檔案大小 是 n 單位,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組。-type c : 檔案類型是 c 的檔案。
          d: 目錄
          c: 字型裝置檔案
          b: 區塊裝置檔案
          p: 具名貯列
          f: 一般檔案
          l: 符號連結
          s: socket
          -pid n : process id 是 n 的檔案

          你可以使用 ( ) 將運算式分隔,并使用下列運算。
          exp1 -and exp2
          ! expr
          -not expr
          exp1 -or exp2
          exp1, exp2
          范例:
          將目前目錄及其子目錄下所有延伸檔名是 c 的檔案列出來。
          # find . -name "*.c"


          將目前目錄其其下子目錄中所有一般檔案列出
          # find . -ftype f


          將目前目錄及其子目錄下所有最近 20 分鐘內更新過的檔案列出
          # find . -ctime -20



          名稱:less

          使用權限:所有使用者

          使用方式:

          less [Option] filename

          說明:
          less 的作用與 more 十分相似,都可以用來瀏覽文字檔案的內容,不同的是 less 允許使用者往回卷動
          以瀏覽已經看過的部份,同時因為 less 并未在一開始就讀入整個檔案,因此在遇上大型檔案的開啟時,會比一般的文書編輯器(如 vi)來的快速。


          范例:


          指令名稱 : ln
          使用權限 : 所有使用者

          使用方式 : ln [options] source dist,其中 option 的格式為 :

          [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
          [--help] [--version] [--]
          說明 : Linux/Unix 檔案系統中,有所謂的連結(link),我們可以將其視為檔案的別名,而連結又可分為兩種 : 硬連結(hard link)與軟連結(symbolic link),硬連結的意思是一個檔案可以有多個名稱,而軟連結的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬連結是存在同一個檔案系統中,而軟連結卻可以跨越不同的檔案系統。
          ln source dist 是產生一個連結(dist)到 source,至于使用硬連結或軟鏈結則由參數決定。

          不論是硬連結或軟鏈結都不會將原本的檔案復制一份,只會占用非常少量的磁碟空間。


          -f : 鏈結時先將與 dist 同檔名的檔案刪除-d : 允許系統管理者硬鏈結自己的目錄-i : 在刪除與 dist 同檔名的檔案時先進行詢問-n : 在進行軟連結時,將 dist 視為一般的檔案-s : 進行軟鏈結(symbolic link)-v : 在連結之前顯示其檔名-b : 將在鏈結時會被覆寫或刪除的檔案進行備份-S SUFFIX : 將備份的檔案都加上 SUFFIX 的字尾-V METHOD : 指定備份的方式--help : 顯示輔助說明--version : 顯示版本
          范例 :
          將檔案 yy 產生一個 symbolic link : zz
          ln -s yy zz

          將檔案 yy 產生一個 hard link : zz
          ln yy xx



          名稱:locate
          使用權限:所有使用者
          使用方式: locate [-q] [-d ] [--database=]
          locate [-r ] [--regexp=]
          locate [-qv] [-o ] [--output=]
          locate [-e ] [-f ] <[-l ] [-c]
          <[-U ] [-u]>
          locate [-Vh] [--version] [--help]
          說明:
          locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。其方法是先建立一個包括系統內所有檔案名稱及路徑的資料庫,之后當尋找時就只需查詢這個資料庫,而不必實際深入檔案系統之中了。

          在一般的 distribution 之中,資料庫的建立都被放在 contab 中自動執行。一般使用者在使用時只要用

          # locate your_file_name

          的型式就可以了。 參數:
          -u
          -U

          建立資料庫,-u 會由根目錄開始,-U 則可以指定開始的位置。

          -e


          排除在尋找的范圍之外。

          -l
          如果 是 1.則啟動安全模式。在安全模式下,使用者不會看到權限無法看到的檔案。這會始速度減慢,因為 locate 必須至實際的檔案系統中取得檔案的權限資料。

          -f
          將特定的檔案系統排除在外,例如我們沒有到理要把 proc 檔案系統中的檔案放在資料庫中。

          -q
          安靜模式,不會顯示任何錯誤訊息。

          -n
          至多顯示 個輸出。

          -r
          使用正規運算式 做尋找的條件。

          -o
          指定資料庫存的名稱。

          -d

          指定資料庫的路徑

          -h
          顯示輔助訊息

          -v
          顯示更多的訊息

          -V
          顯示程式的版本訊息 范例:

          locate chdrv : 尋找所有叫 chdrv 的檔案
          locate -n 100 a.out : 尋找所有叫 a.out 的檔案,但最多只顯示 100 個
          locate -u : 建立資料庫


          名稱 : ls
          使用權限 : 所有使用者

          使用方式 : ls [-alrtAFR] [name...]

          說明 : 顯示指定工作目錄下之內容(列出目前工作目錄所含之檔案及子目錄)。


          -a 顯示所有檔案及目錄 (ls內定將檔案名或目錄名稱開頭為"."的視為隱藏檔,不會列出)
          -l 除檔案名稱外,亦將檔案型態、權限、擁有者、檔案大小等資訊詳細列出
          -r 將檔案以相反次序顯示(原定依英文字母次序)
          -t 將檔案依建立時間之先后次序列出
          -A 同 -a ,但不列出 "." (目前目錄) 及 ".." (父目錄)
          -F 在列出的檔案名稱后加一符號;例如可執行檔則加 "*", 目錄則加 "/"
          -R 若目錄下有檔案,則以下之檔案亦皆依序列出

          范例:
          列出目前工作目錄下所有名稱是 s 開頭的檔案,愈新的排愈后面 :
          ls -ltr s*

          將 /bin 目錄以下所有目錄及檔案詳細資料列出 :
          ls -lR /bin

          列出目前工作目錄下所有檔案及目錄;目錄于名稱后加 "/", 可執行檔于名稱后加 "*" :
          ls -AF

          名稱:more
          使用權限:所有使用者
          使用方式:more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
          說明:類似 cat ,不過會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能(與 vi 相似),使用中的說明文件,請按 h 。
          參數:-num 一次顯示的行數
          -d 提示使用者,在畫面下方顯示 [Press space to continue, q to quit.] ,如果使用者按錯鍵,則會顯示 [Press h for instructions.] 而不是 嗶 聲
          -l 取消遇見特殊字元 ^L(送紙字元)時會暫停的功能
          -f 計算行數時,以實際上的行數,而非自動換行過后的行數(有些單行字數太長的會被擴展為兩行或兩行以上)
          -p 不以卷動的方式顯示每一頁,而是先清除螢幕后再顯示內容
          -c 跟 -p 相似,不同的是先顯示內容再清除其他舊資料
          -s 當遇到有連續兩行以上的空白行,就代換為一行的空白行
          -u 不顯示下引號 (根據環境變數 TERM 指定的 terminal 而有所不同)
          +/ 在每個檔案顯示前搜尋該字串(pattern),然后從該字串之后開始顯示
          +num 從第 num 行開始顯示
          fileNames 欲顯示內容的檔案,可為復數個數
          范例:
          more -s testfile 逐頁顯示 testfile 之檔案內容,如有連續兩行以上空白行則以一行空白行顯示。
          more +20 testfile 從第 20 行開始顯示 testfile 之檔案內容。


          名稱:mv
          使用權限:所有使用者

          使用方式:

          mv [options] source dest
          mv [options] source... directory
          說明:將一個檔案移至另一檔案,或將數個檔案移至另一目錄。
          參數:-i 若目的地已有同名檔案,則先詢問是否覆蓋舊檔。

          范例:

          將檔案 aaa 更名為 bbb :
          mv aaa bbb

          將所有的C語言程式移至 Finished 子目錄中 :
          mv -i *.c



          名稱:rm
          使用權限:所有使用者

          使用方式:rm [options] name...

          說明:刪除檔案及目錄。

          把計

          -i 刪除前逐一詢問確認。
          -f 即使原檔案屬性設為唯讀,亦直接刪除,無需逐一確認。
          -r 將目錄及以下之檔案亦逐一刪除。
          范例:
          刪除所有C語言程式檔;刪除前逐一詢問確認 :
          rm -i *.c

          將 Finished 子目錄及子目錄中所有檔案刪除 :
          rm -r Finished



          名稱:rmdir
          使用權限:于目前目錄有適當權限的所有使用者

          使用方式: rmdir [-p] dirName

          說明: 刪除空的目錄。

          參數: -p 是當子目錄被刪除后使它也成為空目錄的話,則順便一并刪除。

          范例:

          將工作目錄下,名為 AAA 的子目錄刪除 :
          rmdir AAA

          在工作目錄下的 BBB 目錄中,刪除名為 Test 的子目錄。若 Test 刪除后,BBB 目錄成為空目錄,則 BBB 亦予刪除。
          rmdir -p BBB/Test



          名稱:split
          使用權限:所有使用者

          使用方式:split [OPTION] [INPUT [PREFIX]]

          說明:

          將一個檔案分割成數個。而從 INPUT 分割輸出成固定大小的檔案,其檔名依序為 PREFIXaa, PREFIXab...;PREFIX 預設值為 `x。若沒有 INPUT 檔或為 `-,則從標準輸入讀進資料。

          匡兜

          -b, --bytes=SIZE

          SIZE 值為每一輸出檔案的大小,單位為 byte。
          -C, --line-bytes=SIZE

          每一輸出檔中,單行的最大 byte 數。
          -l, --lines=NUMBER

          NUMBER 值為每一輸出檔的列數大小。
          -NUMBER

          與 -l NUMBER 相同。
          --verbose

          于每個輸出檔被開啟前,列印出偵錯資訊到標準錯誤輸出。
          --help

          顯示輔助資訊然后離開。
          --version

          列出版本資訊然后離開。
          SIZE 可加入單位: b 代表 512, k 代表 1K, m 代表 1 Meg。

          范例:

          PostgresSQL 大型資料庫備份與回存:

          因 Postgres 允許表格大過你系統檔案的最大容量,所以要將表格 dump 到單一的檔案可能會有問題,使用 split進行檔案分割。


          % pg_dump dbname | split -b 1m - filename.dump.



          重新載入


          % createdb dbname
          % cat filename.dump.* | pgsql dbname



          名稱:touch
          使用權限:所有使用者

          使用方式:
          touch [-acfm]
          [-r reference-file] [--file=reference-file]
          [-t MMDDhhmm[[CC]YY][.ss]]
          [-d time] [--date=time] [--time={atime,access,use,mtime,modify}]
          [--no-create] [--help] [--version]
          file1 [file2 ...]


          說明:
          touch 指令改變檔案的時間記錄。 ls -l 可以顯示檔案的時間記錄。


          參數:
          a 改變檔案的讀取時間記錄。
          m 改變檔案的修改時間記錄。
          c 假如目的檔案不存在,不會建立新的檔案。與 --no-create 的效果一樣。
          f 不使用,是為了與其他 unix 系統的相容性而保留。
          r 使用參考檔的時間記錄,與 --file 的效果一樣。
          d 設定時間與日期,可以使用各種不同的格式。
          t 設定檔案的時間記錄,格式與 date 指令相同。
          --no-create 不會建立新檔案。
          --help 列出指令格式。
          --version 列出版本訊息。


          范例:


          最簡單的使用方式,將檔案的時候記錄改為現在的時間。若檔案不存在,系統會建立一個新的檔案。

          touch file
          touch file1 file2

          將 file 的時間記錄改為 5 月 6 日 18 點 3 分,公元兩千年。時間的格式可以參考 date 指令,至少需輸入 MMDDHHmm ,就是月日時與分。

          touch -c -t 05061803 file
          touch -c -t 050618032000 file

          將 file 的時間記錄改變成與 referencefile 一樣。

          touch -r referencefile file

          將 file 的時間記錄改成 5 月 6 日 18 點 3 分,公元兩千年。時間可以使用 am, pm 或是 24 小時的格式,日期可以使用其他格式如 6 May 2000 。

          touch -d "6:03pm" file
          touch -d "05/06/2000" file
          touch -d "6:03pm 05/06/2000" file
          名稱 : at
          使用權限 : 所有使用者

          使用方式 : at -V [-q queue] [-f file] [-mldbv] TIME

          說明 : at 可以讓使用者指定在 TIME 這個特定時刻執行某個程式或指令,TIME 的格式是 HH:MM其中的 HH 為小時,MM 為分鐘,甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 點鍾)等口語詞。

          如果想要指定超過一天內的時間,則可以用 MMDDYY 或者 MM/DD/YY 的格式,其中 MM 是分鐘,DD 是第幾日,YY 是指年份。另外,使用者甚至也可以使用像是 now + 時間間隔來彈性指定時間,其中的時間間隔可以是 minutes, hours, days, weeks

          另外,使用者也可指定 today 或 tomorrow 來表示今天或明天。當指定了時間并按下 enter 之后,at 會進入交談模式并要求輸入指令或程式,當你輸入完后按下 ctrl+D 即可完成所有動作,至于執行的結果將會寄回你的帳號中。

          把計 :

          -V : 印出版本編號
          -q : 使用指定的佇列(Queue)來儲存,at 的資料是存放在所謂的 queue 中,使用者可以同時使用多個 queue,而 queue 的編號為 a, b, c... z 以及 A, B, ... Z 共 52 個
          -m : 即使程式/指令執行完成后沒有輸出結果, 也要寄封信給使用者
          -f file : 讀入預先寫好的命令檔。使用者不一定要使用交談模式來輸入,可以先將所有的指定先寫入檔案后再一次讀入
          -l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l)
          -d : 刪除指定 (使用者也可以直接使用 atrm 而不用 at -d)
          -v : 列出所有已經完成但尚未刪除的指定

          例子 :
          三天后的下午 5 點鍾執行 /bin/ls :
          at 5pm + 3 days /bin/ls

          三個星期后的下午 5 點鍾執行 /bin/ls :
          at 5pm + 2 weeks /bin/ls

          明天的 17:20 執行 /bin/date :
          at 17:20 tomorrow /bin/date

          1999 年的最后一天的最后一分鐘印出 the end of world !
          at 23:59 12/31/1999 echo the end of world !




          名稱:cal

          使用權限:所有使用者

          使用方式:cal [-mjy] [month [year]]

          說明:

          顯示日歷。若只有一個參數,則代表年份(1-9999),顯示該年的年歷。年份必須全部寫出:``cal 89\ 將不會是顯示 1989 年的年歷。使用兩個參數,則表示月份及年份。若沒有參數則顯示這個月的月歷。
          1752 年 9 月第 3 日起改用西洋新歷,因這時大部份的國家都采用新歷,有 10 天被去除,所以該月份的月歷有些不同。在此之前為西洋舊歷。

          匡兜

          -m : 以星期一為每周的第一天方式顯示。
          -j : 以凱撒歷顯示,即以一月一日起的天數顯示。
          -y : 顯示今年年歷。

          范例:

          cal : 顯示本月的月歷。



          [root@mylinux /root]# date
          Tue Aug 15 08:00:18 CST 2000
          [root@mylinux /root]# cal
          August 2000
          Su Mo Tu We Th Fr Sa
          1 2 3 4 5
          6 7 8 9 10 11 12
          13 14 15 16 17 18 19
          20 21 22 23 24 25 26
          27 28 29 30 31

          [root@mylinux /root]#


          cal 2001 : 顯示公元 2001 年年歷。

          [root@mylinux /root]# cal 2001
          2001

          January February March
          Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
          1 2 3 4 5 6 1 2 3 1 2 3
          7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10
          14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17
          21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24
          28 29 30 31 25 26 27 28 25 26 27 28 29 30 31

          April May June
          Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
          1 2 3 4 5 6 7 1 2 3 4 5 1 2
          8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9
          15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16
          22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23
          29 30 27 28 29 30 31 24 25 26 27 28 29 30

          July August September
          Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
          1 2 3 4 5 6 7 1 2 3 4 1
          8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8
          15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15
          22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22
          29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29
          30
          October November December
          Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
          1 2 3 4 5 6 1 2 3 1
          7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
          14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
          21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
          28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
          30 31

          [root@mylinux /root]#





          cal 5 2001 : 顯示公元 2001 年 5 月月歷。



          [root@mylinux /root]# cal 5 2001
          May 2001
          Su Mo Tu We Th Fr Sa
          1 2 3 4 5
          6 7 8 9 10 11 12
          13 14 15 16 17 18 19
          20 21 22 23 24 25 26
          27 28 29 30 31

          [root@mylinux /root]#





          cal -m : 以星期一為每周的第一天方式,顯示本月的月歷。



          [root@mylinux /root]# cal -m
          August 2000
          Mo Tu We Th Fr Sa Su
          1 2 3 4 5 6
          7 8 9 10 11 12 13
          14 15 16 17 18 19 20
          21 22 23 24 25 26 27
          28 29 30 31

          [root@mylinux /root]#





          cal -jy : 以一月一日起的天數顯示今年的年歷。



          [root@mylinux /root]# cal -jy
          2000

          January February
          Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
          1 32 33 34 35 36
          2 3 4 5 6 7 8 37 38 39 40 41 42 43
          9 10 11 12 13 14 15 44 45 46 47 48 49 50
          16 17 18 19 20 21 22 51 52 53 54 55 56 57
          23 24 25 26 27 28 29 58 59 60
          30 31
          March April
          Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
          61 62 63 64 92
          65 66 67 68 69 70 71 93 94 95 96 97 98 99
          72 73 74 75 76 77 78 100 101 102 103 104 105 106
          79 80 81 82 83 84 85 107 108 109 110 111 112 113
          86 87 88 89 90 91 114 115 116 117 118 119 120
          121
          May June
          Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
          122 123 124 125 126 127 153 154 155
          128 129 130 131 132 133 134 156 157 158 159 160 161 162
          135 136 137 138 139 140 141 163 164 165 166 167 168 169
          142 143 144 145 146 147 148 170 171 172 173 174 175 176
          149 150 151 152 177 178 179 180 181 182

          July August
          Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
          183 214 215 216 217 218
          184 185 186 187 188 189 190 219 220 221 222 223 224 225
          191 192 193 194 195 196 197 226 227 228 229 230 231 232
          198 199 200 201 202 203 204 233 234 235 236 237 238 239
          205 206 207 208 209 210 211 240 241 242 243 244
          212 213
          September October
          Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
          245 246 275 276 277 278 279 280 281
          247 248 249 250 251 252 253 282 283 284 285 286 287 288
          254 255 256 257 258 259 260 289 290 291 292 293 294 295
          261 262 263 264 265 266 267 296 297 298 299 300 301 302
          268 269 270 271 272 273 274 303 304 305

          November December
          Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
          306 307 308 309 336 337
          310 311 312 313 314 315 316 338 339 340 341 342 343 344
          317 318 319 320 321 322 323 345 346 347 348 349 350 351
          324 325 326 327 328 329 330 352 353 354 355 356 357 358
          331 332 333 334 335 359 360 361 362 363 364 365
          366

          [root@mylinux /root]#




          名稱 : crontab
          使用權限 : 所有使用者

          使用方式 :

          crontab [ -u user ] filecrontab [ -u user ] { -l | -r | -e }
          說明 :
          crontab 是用來讓使用者在固定時間或固定間隔執行程式之用,換句話說,也就是類似使用者的時程表。-u user 是指設定指定 user 的時程表,這個前提是你必須要有其權限(比如說是 root)才能夠指定他人的時程表。如果不使用 -u user 的話,就是表示設定自己的時程表。

          餐數 :

          -e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,如果你想用別的文字編輯器,則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(比如說 setenv VISUAL joe)
          -r : 刪除目前的時程表
          -l : 列出目前的時程表

          時程表的格式如下 :
          f1 f2 f3 f4 f5 program

          其中 f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天。program 表示要執行的程式。
          當 f1 為 * 時表示每分鐘都要執行 program,f2 為 * 時表示每小時都要執行程式,其余類推
          當 f1 為 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 為 a-b 時表示從第 a 到第 b 小時都要執行,其余類推
          當 f1 為 */n 時表示每 n 分鐘個時間間隔執行一次,f2 為 */n 表示每 n 小時個時間間隔執行一次,其余類推
          當 f1 為 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其余類推

          使用者也可以將所有的設定先存放在檔案 file 中,用 crontab file 的方式來設定時程表。
          例子 :

          每月每天每小時的第 0 分鐘執行一次 /bin/ls :
          0 7 * * * /bin/ls

          在 12 月內, 每天的早上 6 點到 12 點中,每隔 20 分鐘執行一次 /usr/bin/backup :
          0 6-12/3 * 12 * /usr/bin/backup

          周一到周五每天下午 5:00 寄一封信給 alex@domain.name :
          0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata

          每月每天的午夜 0 點 20 分, 2 點 20 分, 4 點 20 分....執行 echo "haha"
          20 0-23/2 * * * echo "haha"

          注意 :

          當程式在你所指定的時間執行后,系統會寄一封信給你,顯示該程式執行的內容,若是你不希望收到這樣的信,請在每一行空一格之后加上 > /dev/null 2>&1 即可。

          名稱 : date
          使用權限 : 所有使用者

          使用方式 :

          date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]

          說明 :

          date 可以用來顯示或設定系統的日期與時間,在顯示方面,使用者可以設定欲顯示的格式,格式設定為一個加號后接數個標記,其中可用的標記列表如下 :

          時間方面 :

          % : 印出 %
          %n : 下一行
          %t : 跳格
          %H : 小時(00..23)
          %I : 小時(01..12)
          %k : 小時(0..23)
          %l : 小時(1..12)
          %M : 分鐘(00..59)
          %p : 顯示本地 AM 或 PM
          %r : 直接顯示時間 (12 小時制,格式為 hh:mm:ss [AP]M)
          %s : 從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數
          %S : 秒(00..61)
          %T : 直接顯示時間 (24 小時制)
          %X : 相當于 %H:%M:%S
          %Z : 顯示時區

          日期方面 :
          %a : 星期幾 (Sun..Sat)
          %A : 星期幾 (Sunday..Saturday)
          %b : 月份 (Jan..Dec)
          %B : 月份 (January..December)
          %c : 直接顯示日期與時間
          %d : 日 (01..31)
          %D : 直接顯示日期 (mm/dd/yy)
          %h : 同 %b
          %j : 一年中的第幾天 (001..366)
          %m : 月份 (01..12)
          %U : 一年中的第幾周 (00..53) (以 Sunday 為一周的第一天的情形)
          %w : 一周中的第幾天 (0..6)
          %W : 一年中的第幾周 (00..53) (以 Monday 為一周的第一天的情形)
          %x : 直接顯示日期 (mm/dd/yy)
          %y : 年份的最后兩位數字 (00.99)
          %Y : 完整年份 (0000..9999)

          若是不以加號作為開頭,則表示要設定時間,而時間格式為 MMDDhhmm[[CC]YY][.ss],其中 MM 為月份,DD 為日,hh 為小時,mm 為分鐘,CC 為年份前兩位數字,YY 為年份后兩位數字,ss 為秒數
          把計 :

          -d datestr : 顯示 datestr 中所設定的時間 (非系統時間)
          --help : 顯示輔助訊息
          -s datestr : 將系統時間設為 datestr 中所設定的時間
          -u : 顯示目前的格林威治時間
          --version : 顯示版本編號

          例子 :
          顯示時間后跳行,再顯示目前日期 :
          date +%T%n%D

          顯示月份與日數 :
          date +%B %d

          顯示日期與設定時間(12:34:56) :
          date --date 12:34:56

          注意 :

          當你不希望出現無意義的 0 時(比如說 1999/03/07),則可以在標記中插入 - 符號,比如說 date +%-H:%-M:%-S 會把時分秒中無意義的 0 給去掉,像是原本的 08:09:04 會變為 8:9:4。另外,只有取得權限者(比如說 root)才能設定系統時間。

          當你以 root 身分更改了系統時間之后,請記得以 clock -w 來將系統時間寫入 CMOS 中,這樣下次重新開機時系統時間才會持續抱持最新的正確值。


          名稱 : sleep
          使用權限 : 所有使用者

          使用方式 : sleep [--help] [--version] number[smhd]

          說明 : sleep 可以用來將目前動作延遲一段時間

          參數說明 :

          --help : 顯示輔助訊息
          --version : 顯示版本編號
          number : 時間長度,后面可接 s、m、h 或 d
          其中 s 為秒,m 為 分鐘,h 為小時,d 為日數

          例子 :
          顯示目前時間后延遲 1 分鐘,之后再次顯示時間 :
          date;sleep 1m;date



          名稱: time
          使用權限: 所有使用者

          使用方式: time [options] COMMAND [arguments]

          說明: time 指令的用途,在于量測特定指令執行時所需消耗的時間及系統資源等資訊。例如 CPU 時間、記憶體、輸入輸出等等。需要特別注意的是,部分資訊在 Linux 上顯示不出來。這是因為在 Linux 上部分資源的分配函式與 time 指令所預設的方式并不相同,以致于 time 指令無法取得這些資料。

          把計

          -o or --output=FILE
          設定結果輸出檔。這個選項會將 time 的輸出寫入 所指定的檔案中。如果檔案已經存在,系統將覆寫其內容。
          -a or --append
          配合 -o 使用,會將結果寫到檔案的末端,而不會覆蓋掉原來的內容。
          -f FORMAT or --format=FORMAT
          以 FORMAT 字串設定顯示方式。當這個選項沒有被設定的時候,會用系統預設的格式。不過你可以用環境變數 time 來設定這個格式,如此一來就不必每次登入系統都要設定一次。
          一般設定上,你可以用
          \t
          表示跳欄,或者是用
          \n
          表示換行。每一項資料要用 % 做為前導。如果要在字串中使用百分比符號,就用 。(學過 C 語言的人大概會覺得很熟悉)
          time 指令可以顯示的資源有四大項,分別是:

          Time resources
          Memory resources
          IO resources
          Command info

          詳細的內容如下:


          Time Resources
          E 執行指令所花費的時間,格式是:[hour]:minute:second。請注意這個數字并不代表實際的 CPU 時間。
          e 執行指令所花費的時間,單位是秒。請注意這個數字并不代表實際的 CPU 時間。
          S 指令執行時在核心模式(kernel mode)所花費的時間,單位是秒。
          U 指令執行時在使用者模式(user mode)所花費的時間,單位是秒。
          P 執行指令時 CPU 的占用比例。其實這個數字就是核心模式加上使用者模式的 CPU 時間除以總時間。


          Memory Resources
          M 執行時所占用的實體記憶體的最大值。單位是 KB
          t 執行時所占用的實體記憶體的平均值,單位是 KB
          K 執行程序所占用的記憶體總量(stack+data+text)的平均大小,單位是 KB
          D 執行程序的自有資料區(unshared data area)的平均大小,單位是 KB
          p 執行程序的自有堆疊(unshared stack)的平均大小,單位是 KB
          X 執行程序間共享內容(shared text)的平均值,單位是 KB
          Z 系統記憶體頁的大小,單位是 byte。對同一個系統來說這是個常數


          IO Resources
          F 此程序的主要記憶體頁錯誤發生次數。所謂的主要記憶體頁錯誤是指某一記憶體頁已經置換到置換檔(swap file)中,而且已經分配給其他程序。此時該頁的內容必須從置換檔里再讀出來。
          R 此程序的次要記憶體頁錯誤發生次數。所謂的次要記憶體頁錯誤是指某一記憶體頁雖然已經置換到置換檔中,但尚未分配給其他程序。此時該頁的內容并未被破壞,不必從置換檔里讀出來
          W 此程序被交換到置換檔的次數
          c 此程序被強迫中斷(像是分配到的 CPU 時間耗盡)的次數
          w 此程序自愿中斷(像是在等待某一個 I/O 執行完畢,像是磁碟讀取等等)的次數
          I 此程序所輸入的檔案數
          O 此程序所輸出的檔案數
          r 此程序所收到的 Socket Message
          s 此程序所送出的 Socket Message
          k 此程序所收到的信號 ( Signal )數量


          Command Info
          C 執行時的參數以及指令名稱
          x 指令的結束代碼 ( Exit Status )




          -p or --portability
          這個選項會自動把顯示格式設定成為:
          real %e
          user %U
          sys %S
          這么做的目的是為了與 POSIX 規格相容。
          -v or --verbose
          這個選項會把所有程式中用到的資源通通列出來,不但如一般英文語句,還有說明。對不想花時間去熟習格式設定或是剛剛開始接觸這個指令的人相當有用。

          范例:
          利用下面的指令
          time -v ps -aux

          我們可以獲得執行 ps -aux 的結果和所花費的系統資源。如下面所列的資料:
          USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
          root 1 0.0 0.4 1096 472 ? S Apr19 0:04 init
          root 2 0.0 0.0 0 0 ? SW Apr19 0:00 [kflushd]
          root 3 0.0 0.0 0 0 ? SW Apr19 0:00 [kpiod]
          ......
          root 24269 0.0 1.0 2692 996 pts/3 R 12:16 0:00 ps -aux

          Command being timed: "ps -aux"
          User time (seconds): 0.05
          System time (seconds): 0.06
          Percent of CPU this job got: 68%
          Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.16
          Average shared text size (kbytes): 0
          Average unshared data size (kbytes): 0
          Average stack size (kbytes): 0
          Average total size (kbytes): 0
          Maximum resident set size (kbytes): 0
          Average resident set size (kbytes): 0
          Major (requiring I/O) page faults: 238
          Minor (reclaiming a frame) page faults: 46
          Voluntary context switches: 0
          Involuntary context switches: 0
          Swaps: 0
          File system inputs: 0
          File system outputs: 0
          Socket messages sent: 0
          Socket messages received: 0
          Signals delivered: 0
          Page size (bytes): 4096
          Exit status: 0



          名稱: uptime
          使用權限: 所有使用者
          使用方式: uptime [-V]
          說明: uptime 提供使用者下面的資訊,不需其他參數:

          現在的時間
          系統開機運轉到現在經過的時間
          連線的使用者數量
          最近一分鐘,五分鐘和十五分鐘的系統負載
          參數: -V 顯示版本資訊。
          范例: uptime
          其結果為:
          10:41am up 5 days, 10 min, 1 users, load average: 0.00, 0.00, 1.99

          名稱:chfn

          使用權限:所有使用者

          用法:shell>> chfn

          說明:提供使用者更改個人資訊,用于 finger and mail username

          范例:

          shell>> chfn
          Changing finger information for user
          Password: [del]
          Name[]:Johnney Huang ### 提供 finger 時的資料
          Office[]:NCCU
          Office Phone[]: [del]
          Home Phone[]: [del]


          名稱:chsh

          使用權限:所有使用者

          用法:shell>> chsh

          說明:更改使用者 shell 設定

          范例:

          shell>> chsh
          Changing fihanging shell for user1
          Password: [del]
          New shell [/bin/tcsh]: ### [是目前使用的 shell]
          [del]

          shell>> chsh -l ### 展示 /etc/shells 檔案內容
          /bin/bash
          /bin/sh
          /bin/ash
          /bin/bsh
          /bin/tcsh
          /bin/csh



          ” finger [返回]
          名稱: finger
          使用權限: 所有使用者

          使用方式: finger [options] user[@address]

          說明:finger 可以讓使用者查詢一些其他使用者的資料。會列出來的資料有:

          Login Name
          User Name
          Home directory
          Shell
          Login status
          mail status
          .plan
          .project
          .forward

          其中 .plan ,.project 和 .forward 就是使用者在他的 Home Directory 里的 .plan , .project 和 .forward 等檔案里的資料。如果沒有就沒有。finger 指令并不限定于在同一伺服器上查詢,也可以尋找某一個遠端伺服器上的使用者。只要給一個像是 E-mail address 一般的地址即可。
          把計

          -l
          多行顯示。

          -s
          單行顯示。這個選項只顯示登入名稱,真實姓名,終端機名稱,閑置時間,登入時間,辦公室號碼及電話號碼。如果所查詢的使用者是遠端伺服器的使用者,這個選項無效。

          范例:下列指令可以查詢本機管理員的資料:
          finger root

          其結果如下:
          Login: root Name: root
          Directory: /root Shell: /bin/bash
          Never logged in.
          No mail.
          No Plan.




          名稱:last

          使用權限:所有使用者

          使用方式:shell>> last [options]

          說明:顯示系統開機以來獲是從每月初登入者的訊息

          把計

          -R 省略 hostname 的欄位
          -num 展示前 num 個
          username 展示 username 的登入訊息
          tty 限制登入訊息包含終端機代號

          范例:

          shell>> last -R -2
          johnney pts/1 Mon Aug 14 20:42 still logged in
          johnney pts/0 Mon Aug 14 19:59 still logged in

          wtmp begins Tue Aug 1 09:01:10 2000 ### /var/log/wtmp


          shell>> last -2 minery
          minery pts/0 140.119.217.115 Mon Aug 14 18:37 - 18:40 (00:03)
          minery pts/0 140.119.217.115 Mon Aug 14 17:22 - 17:24 (00:02)

          wtmp begins Tue Aug 1 09:01:10 2000




          名稱:login

          這個命令都不會就不要干算了!呵呵我也不在這里多費筆墨耽誤大家美好青春了^_^



          名稱:passwd

          使用權限:所有使用者

          使用方式:passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]

          說明:用來更改使用者的密碼

          參數:
          -k

          -l

          -u

          -f

          -d 關閉使用者的密碼認證功能, 使用者在登入時將可以不用輸入密碼, 只有具備 root 權限的使用者方可使用.

          -S 顯示指定使用者的密碼認證種類, 只有具備 root 權限的使用者方可使用.

          [username] 指定帳號名稱.



          名稱 : who
          使用權線 : 所有使用者都可使用

          使用方式 : who - [husfV] [user]

          說明 : 顯示系統中有那些使用者正在上面,顯示的資料包含了使用者 ID,使用的終端機,從那邊連上來的,上線時間,呆滯時間,CPU 使用量,動作等等。

          把計 :

          -h : 不要顯示標題列
          -u : 不要顯示使用者的動作/工作
          -s : 使用簡短的格式來顯示
          -f : 不要顯示使用者的上線位置
          -V : 顯示程式版本
          名稱:/etc/aliases
          使用權限:系統管理者
          使用方式: 請用 newaliases 更新資料庫
          說明:
          sendmail 會使用一個在 /etc/aliases 中的檔案做使用者名稱轉換的動作。當 sendmail 收到一個要送給 xxx 的信時,它會依據 aliases檔的內容送給另一個使用者。這個功能可以創造一個只有在信件系統內才有效的使用者。例如 mailing list 就會用到這個功能,在 mailinglist 中,我們可能會創造一個叫 redlinux@link.ece.uci.edu 的 mailinglist,但實際上并沒有一個叫 redlinux 的使用者。實際 aliases 檔的內容是將送給這個使用者的信都收給 mailing list 處理程式負責分送的工作。

          /etc/aliases 是一個文字模式的檔案,sendmail 需要一個二進位格式的 /etc/aliases.db。newaliases 的功能傳是將 /etc/aliases 轉換成一個 sendmail 所能了解的資料庫。范例:
          # newaliases

          下面命令會做相同的事,
          # sendmail -bi

          相關命令:
          mail, mailq, newaliases, sendmail

          ” mail [返回]
          名稱:mail

          使用權限:所有使用者


          使用方式:mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...]


          說明:
          mail 不僅只是一個指令, mail 還是一個電子郵件程式,不過利用 mail 來讀信的人應該很少吧!對于系統管理者來說 mail 就很有用,因為管理者可以用 mail 寫成 script ,定期寄一些備忘錄提醒系統的使用者。


          參數:
          i 忽略 tty 的中斷訊號。 (interrupt)
          I 強迫設成互動模式。 (Interactive)
          v 列印出訊息,例如送信的地點、狀態等等。 (verbose)
          n 不讀入 mail.rc 設定檔。
          s 郵件標題。
          c cc 郵件地址。
          b bcc 郵件地址。


          范例:


          將信件送給一個或以上的電子郵件地址,由于沒有加入其他的選項,使用者必須輸入標題與信件的內容等。而 user2 沒有主機位置,就會送給郵件伺服器的 user2 使用者。



          mail user1@email.address
          mail user1@email.address user2



          將 mail.txt 的內容寄給 user2 同時 cc 給 user1 。如果將這一行指令設成 cronjob 就可以定時將備忘錄寄給系統使用者。

          mail -s 標題 -c user1 user2 < mail.txt



          指令:mesg
          使用權限 : 所有使用者

          使用方式 : mesg [y|n]

          說明 : 決定是否允許其他人傳訊息到自己的終端機介面


          把計 

          y : 允許訊息傳到終端機介面上。
          n : 不允許訊息傳到終端機介面上 。
          如果沒有設定,則訊息傳遞與否則由終端機界面目前狀態而定。

          例子 :
          改變目前訊息設定,改成不允許訊息傳到終端機介面上 :
          mesg n


          與 mesg 相關的指令有: talk,write,wall。


          名稱:/etc/aliases
          使用權限:系統管理者
          使用方式: newaliases
          說明:
          sendmail 會使用一個在 /etc/aliases 中的檔案做使用者名稱轉換的動作。當 sendmail 收到一個要送給 xxx 的信時,它會依據 aliases檔的內容送給另一個使用者。這個功能可以創造一個只有在信件系統內才有效的使用者。例如 mailing list 就會用到這個功能,在 mailinglist 中,我們可能會創造一個叫 redlinux@link.ece.uci.edu 的 mailinglist,但實際上并沒有一個叫 redlinux 的使用者。實際 aliases 檔的內容是將送給這個使用者的信都收給 mailing list 處理程式負責分送的工作。

          /etc/aliases 是一個文字模式的檔案,sendmail 需要一個二進位格式的 /etc/aliases.db。newaliases 的功能傳是將 /etc/aliases 轉換成一個 sendmail 所能了解的資料庫。

          參數:沒有任何參數。 范例:
          # newaliases

          下面命令會做相同的事,
          # sendmail -bi

          相關命令:
          mail, mailq, newaliases, sendmail



          名稱 : talk
          使用權限 : 所有使用者

          使用方式 :

          talk person [ttyname]
          說明 : 與其他使用者對談

          把計 :

          person : 預備對談的使用者帳號,如果該使用者在其他機器上,則可輸入 person@machine.name
          ttyname : 如果使用者同時有兩個以上的 tty 連線,可以自行選擇合適的 tty 傳訊息

          例子.1 :

          與現在機器上的使用者Rollaend對談,此時 Rollaend 只有一個連線 :
          talk Rollaend


          接下來就是等Rollaend回應,若Rollaend接受,則Rollaend輸入 `talk jzlee`即可開始對談,結束請按 ctrl+c

          例子.2 :與linuxfab.cx上的使用者Rollaend對談,使用pts/2來對談 :
          talk Rollaend@linuxfab.cx pts/2


          接下來就是等Rollaend回應,若Rollaend接受,則Rollaend輸入 `talk jzlee@jzlee.home`即可開始對談,結束請按 ctrl+c

          注意 : 若螢幕的字會出現不正常的字元,試著按 ctrl+l 更新螢幕畫面。


          名稱 : wall
          使用權限 : 所有使用者

          使用方式 :

          wall [ message ]
          使用說明:
          wall 會將訊息傳給每一個 mesg 設定為 yes 的上線使用者。當使用終端機介面做為標準傳入時, 訊息結束時需加上 EOF (通常用 Ctrl+D)

          例子 :

          傳訊息"hi" 給每一個使用者 :
          wall hi




          名稱 : write
          使用權限 : 所有使用者

          使用方式 :

          write user [ttyname]
          說明 : 傳訊息給其他使用者

          把計 :

          user : 預備傳訊息的使用者帳號
          ttyname : 如果使用者同時有兩個以上的 tty 連線,可以自行選擇合適的 tty 傳訊息

          例子.1 :

          傳訊息給 Rollaend,此時 Rollaend 只有一個連線 :
          write Rollaend


          接下來就是將訊息打上去,結束請按 ctrl+c

          例子.2 :傳訊息給 Rollaend,Rollaend 的連線有 pts/2,pts/3 :
          write Rollaend pts/2


          接下來就是將訊息打上去,結束請按 ctrl+c

          注意 : 若對方設定 mesg n,則此時訊席將無法傳給對方

          名稱:kill
          使用權限:所有使用者

          使用方式:

          kill [ -s signal | -p ] [ -a ] pid ...
          kill -l [ signal ]
          說明:kill 送出一個特定的信號 (signal) 給行程 id 為 pid 的行程根據該信號而做特定的動作, 若沒有指定, 預設是送出終止 (TERM) 的信號
          把計

          -s (signal) : 其中可用的訊號有 HUP (1), KILL (9), TERM (15), 分別代表著重跑, 砍掉, 結束; 詳細的信號可以用 kill -l
          -p : 印出 pid , 并不送出信號
          -l (signal) : 列出所有可用的信號名稱
          范例:

          將 pid 為 323 的行程砍掉 (kill) :
          kill -9 323

          將 pid 為 456 的行程重跑 (restart) :
          kill -HUP 456




          名稱:nice
          使用權限:所有使用者

          使用方式:nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]]

          說明:以更改過的優先序來執行程式, 如果未指定程式, 則會印出目前的排程優先序, 內定的 adjustment 為 10, 范圍為 -20 (最高優先序) 到 19 (最低優先序)


          把計

          -n adjustment, -adjustment, --adjustment=adjustment 皆為將該原有優先序的增加 adjustment
          --help 顯示求助訊息
          --version 顯示版本資訊
          范例:
          將 ls 的優先序加 1 并執行 :
          nice -n 1 ls

          將 ls 的優先序加 10 并執行 :
          nice ls將 ls 的優先序加 10 并執行

          注意 : 優先序 (priority) 為作業系統用來決定 CPU 分配的參數,Linux 使用『回合制(round-robin)』的演算法來做 CPU 排程,優先序越高,所可能獲得的 CPU時間就越多。



          名稱:ps
          使用權限:所有使用者
          使用方式:ps [options] [--help]
          說明:顯示瞬間行程 (process) 的動態
          參數:
          ps 的參數非常多, 在此僅列出幾個常用的參數并大略介紹含義
          -A 列出所有的行程
          -w 顯示加寬可以顯示較多的資訊
          -au 顯示較詳細的資訊
          -aux 顯示所有包含其他使用者的行程

          au(x) 輸出格式 :

          USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
          USER: 行程擁有者
          PID: pid
          %CPU: 占用的 CPU 使用率
          %MEM: 占用的記憶體使用率
          VSZ: 占用的虛擬記憶體大小
          RSS: 占用的記憶體大小
          TTY: 終端的次要裝置號碼 (minor device number of tty)
          STAT: 該行程的狀態:
          D: 不可中斷的靜止 (通悸□□縝b進行 I/O 動作)
          R: 正在執行中
          S: 靜止狀態
          T: 暫停執行
          Z: 不存在但暫時無法消除
          W: 沒有足夠的記憶體分頁可分配
          <: 高優先序的行程
          N: 低優先序的行程
          L: 有記憶體分頁分配并鎖在記憶體內 (即時系統或捱A I/O)
          START: 行程開始時間
          TIME: 執行的時間
          COMMAND:所執行的指令

          范例:

          ps
          PID TTY TIME CMD
          2791 ttyp0 00:00:00 tcsh
          3092 ttyp0 00:00:00 ps
          % ps -A
          PID TTY TIME CMD
          1 ? 00:00:03 init
          2 ? 00:00:00 kflushd
          3 ? 00:00:00 kpiod
          4 ? 00:00:00 kswapd
          5 ? 00:00:00 mdrecoveryd
          .......
          % ps -aux
          USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
          root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]
          root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]
          root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]
          root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]
          ........



          名稱:pstree
          使用權限:所有使用者
          使用方式:
          pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
          pstree -V
          說明:將所有行程以樹狀圖顯示, 樹狀圖將會以 pid (如果有指定) 或是以 init 這個基本行程為根 (root) ,如果有指定使用者 id , 則樹狀圖會只顯示該使用者所擁有的行程
          參數:
          -a 顯示該行程的完整指令及參數, 如果是被記憶體置換出去的行程則會加上括號
          -c 如果有重覆的行程名, 則分開列出 (預設值是會在前面加上 *
          范例:

          pstree

          init-+-amd
          |-apmd
          |-atd
          |-httpd---10*[httpd]
          %pstree -p
          init(1)-+-amd(447)
          |-apmd(105)
          |-atd(339)
          %pstree -c
          init-+-amd
          |-apmd
          |-atd
          |-httpd-+-httpd
          | |-httpd
          | |-httpd
          | |-httpd
          ....



          名稱:renice
          使用權限:所有使用者

          使用方式:renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]

          說明:重新指定一個或多個行程(Process)的優先序(一個或多個將根據所下的參數而定)

          把計

          -p pid 重新指定行程的 id 為 pid 的行程的優先序
          -g pgrp 重新指定行程群組(process group)的 id 為 pgrp 的行程 (一個或多個) 的優先序
          -u user 重新指定行程擁有者為 user 的行程的優先序
          范例:
          將行程 id 為 987 及 32 的行程與行程擁有者為 daemon 及 root 的優先序號碼加 1 :
          renice +1 987 -u daemon root -p 32

          注意 : 每一個行程(Process)都有一個唯一的 (unique) id



          名稱:top
          使用權限:所有使用者

          使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

          說明:即時顯示 process 的動態

          把計

          d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
          q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的權限,則 top 將會以最高的優先序執行
          c : 切換顯示模式,共有兩種模式,一是只顯示執行檔的名稱,另一種是顯示完整的路徑與名稱S : 累積模式,會將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來
          s : 安全模式,將交談式指令取消, 避免潛在的危機
          i : 不顯示任何閑置 (idle) 或無用 (zombie) 的行程
          n : 更新的次數,完成后將會退出 top
          b : 批次檔模式,搭配 "n" 參數一起使用,可以用來將 top 的結果輸出到檔案內

          范例:
          顯示更新十次后退出 ;
          top -n 10

          使用者將不能利用交談式指令來對行程下命令 :
          top -s

          將更新顯示二次的結果輸入到名稱為 top.log 的檔案里 :
          top -n 2 -b < top.log

          名稱:skill

          使用權限:所有使用者

          使用方式: skill [signal to send] [options] 選擇程序的規則

          說明:

          送個訊號給正在執行的程序,預設的訊息為 TERM (中斷) , 較常使用的訊息為 HUP , INT , KILL , STOP , CONT ,和 0

          訊息有三種寫法:分別為 -9 , -SIGKILL , -KILL , 可以使用 -l 或 -L 已列出可使用的訊息。

          一般參數:

          -f 快速模式/尚未完成

          -i 互動模式/ 每個動作將要被確認

          -v 詳細輸出/ 列出所選擇程序的資訊

          -w 智能警告訊息/ 尚未完成

          -n 沒有動作/ 顯示程序代號

          參數:選擇程序的規則可以是, 終端機代號,使用者名稱,程序代號,命令名稱。

          -t 終端機代號 ( tty 或 pty )

          -u 使用者名稱

          -p 程序代號 ( pid )

          -c 命令名稱 可使用的訊號:

          以下列出已知的訊號名稱,訊號代號,功能。

          名稱 (代號) 功能/ 描述

          ALRM 14 離開

          HUP 1 離開

          INT 2 離開

          KILL 9 離開/ 強迫關閉

          PIPE 13 離開

          POLL 離開

          PROF 離開

          TERM 15 離開

          USR1 離開

          USR2 離開

          VTALRM 離開

          STKFLT 離開/ 只適用于i386, m68k, arm 和 ppc 硬體

          UNUSED 離開/ 只適用于i386, m68k, arm 和 ppc 硬體

          TSTP 停止 /產生與內容相關的行為

          TTIN 停止 /產生與內容相關的行為

          TTOU 停止 /產生與內容相關的行為

          STOP 停止 /強迫關閉

          CONT 從新啟動 /如果在停止狀態則從新啟動,否則忽略

          PWR 忽略 /在某些系統中會離開

          WINCH 忽略

          CHLD 忽略

          ABRT 6 核心

          FPE 8 核心

          ILL 4 核心

          QUIT 3 核心

          SEGV 11 核心

          TRAP 5 核心

          SYS 核心 /或許尚未實作

          EMT 核心 /或許尚未實作

          BUS 核心 /核心失敗

          XCPU 核心 /核心失敗

          XFSZ 核心 /核心失敗

          范例:

          停止所有在 PTY 裝置上的程序
          skill -KILL -v pts/*

          停止三個使用者 user1 , user2 , user3
          skill -STOP user1 user2 user3



          其他相關的命令: kill



          名稱:expr

          使用權限:所有使用者
          ### 字串長度

          shell>> expr length "this is a test"
          14

          ### 數字商數

          shell>> expr 14 % 9
          5

          ### 從位置處抓取字串

          shell>> expr substr "this is a test" 3 5
          is is

          ### 數字串 only the first character

          shell>> expr index "testforthegame" e
          2

          ### 字串真實重現

          shell>> expr quote thisisatestformela
          thisisatestformela




          名稱: tr

          ### 1.比方說要把目錄下所有的大寫檔名換為小寫檔名?

          似乎有很多方式,"tr"是其中一種:

          #!/bin/sh

          dir="/tmp/testdir";
          files=`find $dir -type f`;
          for i in $files
          do
          dir_name=`dirname $i`;
          ori_filename=`basename $i`
          new_filename=`echo $ori_filename | tr [:upper:] [:lower:]` > /dev/null;
          #echo $new_filename;
          mv $dir_name/$ori_filename $dir_name/$new_filename
          done


          ### 2.自己試驗中...lowercase to uppercase

          tr abcdef...[del] ABCDE...[del]
          tr a-z A-Z
          tr [:lower:] [:upper:]

          shell>> echo "this is a test" | tr a-z A-Z > www
          shell>> cat www
          THIS IS A TEST

          ### 3.去掉不想要的字串

          shell>> tr -d this ### 去掉有關 t.e.s.t
          this

          man
          man
          test
          e

          ### 4.取代字串

          shell>> tr -s "this" "TEST"
          this
          TEST
          th
          TE




          指令:clear
          用途:清除螢幕用。

          使用方法:在 console 上輸入 clear。


          名稱: reset, tset
          使用方法: tset [-IQqrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]

          使用說明:

          reset 其實和 tset 是一同個命令,它的用途是設定終端機的狀態。一般而言,這個命令會自動的從環境變數、命令列或是其它的組態檔決定目前終端機的型態。如果指定型態是 ? 的話,這個程式會要求使用者輸入終端機的型別。

          由于這個程式會將終端機設回原始的狀態,除了在 login 時使用外,當系統終端機因為程式不正常執行而進入一些奇怪的狀態時,你也可以用它來重設終端機o 例如不小心把二進位檔用 cat 指令進到終端機,常會有終端機不再回應鍵盤輸入,或是回應一些奇怪字元的問題。此時就可以用 reset 將終端機回復至原始狀態。選項說明:


          -p
          將終端機類別顯示在螢幕上,但不做設定的動作。這個命令可以用來取得目前終端機的類別。
          -e ch
          將 erase 字元設成 ch
          -i ch
          將中斷字元設成 ch
          -k ch
          將刪除一行的字元設成 ch
          -I
          不要做設定的動作,如果沒有使用選項 -Q 的話,erase、中斷及刪除字元的目前值依然會送到螢幕上。
          -Q
          不要顯示 erase、中斷及刪除字元的值到螢幕上。
          -r
          將終端機類別印在螢幕上。
          -s
          將設定 TERM 用的命令用字串的型式送到終端機中,通常在 .login 或 .profile 中用
          范例:
          讓使用者輸入一個終端機型別并將終端機設到該型別的預設狀態。
          # reset ?



          將 erase 字元設定 control-h
          # reset -e ^B



          將設定用的字串顯示在螢幕上
          # reset -s
          Erase is control-B (^B).
          Kill is control-U (^U).
          Interrupt is control-C (^C).
          TERM=xterm;

          名稱:compress

          使用權限:所有使用者


          使用方式:compress [-dfvcV] [-b maxbits] [file ...]


          說明:
          compress 是一個相當古老的 unix 檔案壓縮指令,壓縮后的檔案會加上一個 .Z 延伸檔名以區別未壓縮的檔案,壓縮后的檔案可以以 uncompress 解壓。若要將數個檔案壓成一個壓縮檔,必須先將檔案 tar 起來再壓縮。由于 gzip 可以產生更理想的壓縮比例,一般人多已改用 gzip 為檔案壓縮工具。


          參數:
          c 輸出結果至標準輸出設備(一般指熒幕)
          f 強迫寫入檔案,若目的檔已經存在,則會被覆蓋 (force)
          v 將程式執行的訊息印在熒幕上 (verbose)
          b 設定共同字串數的上限,以位元計算,可以設定的值為 9 至 16 bits 。由于值越大,能使用的共同字串就 越多,壓縮比例就越大,所以一般使用預設值 16 bits (bits)
          d 將壓縮檔解壓縮
          V 列出版本訊息


          范例:


          將 source.dat 壓縮成 source.dat.Z ,若 source.dat.Z 已經存在,內容則會被壓縮檔覆蓋。



          compress -f source.dat



          將 source.dat 壓縮成 source.dat.Z ,并列印出壓縮比例。
          -v 與 -f 可以一起使用



          compress -vf source.dat



          將壓縮后的資料輸出后再導入 target.dat.Z 可以改變壓縮檔名。



          compress -c source.dat > target.dat.Z



          -b 的值越大,壓縮比例就越大,范圍是 9-16 ,預設值是 16 。



          compress -b 12 source.dat



          將 source.dat.Z 解壓成 source.dat ,若檔案已經存在,使用者按 y 以確定覆蓋檔案,若使用 -df 程式則會自動覆蓋檔案。由于系統會自動加入 .Z 為延伸檔名,所以 source.dat 會自動當作 source.dat.Z 處理。



          compress -d source.dat
          compress -d source.dat.Z




          名稱: lpd

          使用權限: 所有使用者

          使用方式:lpd [-l] [#port]
          lpd 是一個常駐的印表機管理程式,它會根據 /etc/printcap 的內容來管理本地或遠端的印表機。/etc/printcap 中定義的每一個印表機必須在 /var/lpd 中有一個相對應的目錄,目錄中以 cf 開頭的檔案表示一個等待送到適當裝置的印表工作。這個檔案通常是由 lpr 所產生。

          lpr 和 lpd 組成了一個可以離線工作的系統,當你使用 lpr 時,印表機不需要能立即可用,甚至不用存在。lpd 會自動監視印表機的狀況,當印表機上線后,便立即將檔案送交處理。這個得所有的應用程式不必等待印表機完成前一工作。

          參數:


          -l: 將一些除錯訊息顯示在標準輸出上。
          #port: 一般而言,lpd 會使用 getservbyname 取得適當的 TCP/IP port,你可以使用這個參數強迫 lpd 使用指定的 port。

          范例:
          這個程式通常是由 /etc/rc.d 中的程式在系統啟始階段執行。



          名稱 lpq
          -- 顯示列表機貯列中未完成的工作 用法

          lpq [l] [P] [user]

          說明
          lpq 會顯示由 lpd 所管理的列表機貯列中未完成的項目。

          范例
          范例 1. 顯示所有在 lp 列表機貯列中的工作


          # lpq -PlpRank Owner Job Files Total Size1st root 238 (standard input) 1428646 bytes




          相關函數
          lpr,lpc,lpd



          名稱: lpr

          使用權限: 所有使用者

          使用方式:lpr [ -P printer ]
          將檔案或是由標準輸入送進來的資料送到印表機貯列之中,印表機管理程式 lpd 會在稍后將這個檔案送給適當的程式或裝置處理。lpr 可以用來將料資送給本地或是遠端的主機來處理。

          參數:


          -p Printer: 將資料送至指定的印表機 Printer,預設值為 lp。

          范例:
          www.c 和 kkk.c 送到印表機 lp。
          lpr -Plp www.c kkk.c




          名稱: lprm
          -- 將一個工作由印表機貯列中移除 用法

          /usr/bin/lprm [P] [file...]

          說明
          尚未完成的印表機工作會被放在印表機貯列之中,這個命令可用來將常未送到印表機的工作取消。由于每一個印表機都有一個獨立的貯列,你可以用 -P 這個命令設定想要作用的印列機。如果沒有設定的話,會使用系統預設的印表機。

          這個命令會檢查使用者是否有足夠的權限刪除指定的檔案,一般而言,只有檔案的擁有者或是系統管理員才有這個權限。

          范例
          將印表機 hpprinter 中的第 1123 號工作移除


          lprm -Phpprinter 1123


          將第 1011 號工作由預設印表機中移除


          lprm 1011




          名稱: fdformat

          使用權限: 所有使用者

          使用方式:fdformat [-n] device

          使用說明 :
          對指定的軟碟機裝置進行低階格式化。使用這個指令對軟碟格式化的時候,最好指定像是下面的裝置:


          /dev/fd0d360 磁碟機 A: ,磁片為 360KB 磁碟
          /dev/fd0h1440 磁碟機 A: ,磁片為 1.4MB 磁碟
          /dev/fd1h1200 磁碟機 B: ,磁片為 1.2MB 磁碟
          如果使用像是 /dev/fd0 之類的裝置,如果里面的磁碟不是標準容量,格式化可能會失敗。在這種情況之下,使用者可以用 setfdprm 指令先行指定必要參數。

          參數:


          -n 關閉確認功能。這個選項會關閉格式化之后的確認步驟。

          范例:

          fdformat -n /dev/fd0h1440

          將磁碟機 A 的磁片格式化成 1.4MB 的磁片。并且省略確認的步驟。



          名稱: mformat

          使用權限: 所有使用者

          使用方式:

          mformat [-t cylinders] [-h heads] [-s sectors] [-l volume_label] [-F] [-I fsVer-sion] [-S sizecode] [-2 sectors_on_track_0] [-M software_sector_size] [-a] [-X] [-C] [-H hidden_sectors] [-r root_sectors] [-B boot_sector] [-0 rate_on_track_0] [-A rate_on_other_tracks] [-1] [-k] drive:

          在已經做過低階格式化的磁片上建立 DOS 檔案系統。如果在編譯 mtools 的時候把 USE_2M 的參數打開,部分與 2M 格式相關的參數就會發生作用。否則這些參數(像是 S,2,1,M)不會發生作用。

          參數:

          -t 磁柱(synlider)數
          -h 磁頭(head)數
          -s 每一磁軌的磁區數
          -l 標簽
          -F 將磁碟格式化為 FAT32 格式,不過這個參數還在實驗中。
          -I 設定 FAT32 中的版本號。這當然也還在實驗中。
          -S 磁區大小代碼,計算方式為 sector = 2^(大小代碼+7)
          -c 磁叢(cluster)的磁區數。如果所給定的數字會導致磁叢數超過 FAT 表的限制,mformat 會自動放大磁區數。
          -s
          -M 軟體磁區大小。這個數字就是系統回報的磁區大小。通常是和實際的大小相同。
          -a 如果加上這個參數,mformat 會產生一組 Atari 系統的序號給這塊軟碟。
          -X 將軟碟格式化成 XDF 格式。使用前必須先用 xdfcopy 指令對軟碟作低階格式化的動作。
          -C 產生一個可以安裝 MS-DOS 檔案系統的磁碟影像檔(disk image)。當然對一個實體磁碟機下這個參數是沒有意義的。
          -H 隱藏磁區的數目。這通常適用在格式化硬碟的分割區時,因為通常一個分割區的前面還有分割表。這個參數未經測試,能不用就不用。
          -n 磁碟序號
          -r 根目錄的大小,單位是磁區數。這個參數只對 FAT12 和 FAT16 有效。
          -B 使用所指定的檔案或是設備的開機磁區做為這片磁片或分割區的開機磁區。當然當中的硬體參數會隨之更動。
          -k 盡量保持原有的開機磁區。
          -0 第 0 軌的資料傳輸率
          -A 第 0 軌以外的資料傳輸率
          -2 使用 2m 格式
          -1 不使用 2m 格式

          范例:
          mformat a:

          這樣會用預設值把 a: (就是 /dev/fd0)里的磁碟片格式化。



          名稱: mkdosfs

          使用權限: 所有使用者

          使用方式: mkdosfs [ -c | -l filename ]
          [ -f number_of_FATs ]
          [ -F FAT_size ]
          [ -i volume_id ]
          [ -m message_file ]
          [ -n volume_name ]
          [ -r root_dir_entry ]
          [ -s sector_per_cluster ]
          [ -v ]
          device
          [ block_count ]



          說明: 建立 DOS 檔案系統。 device 指你想要建立 DOS 檔案系統的裝置代號。像是 /dev/hda1 等等。 block_count 則是你希望配置的區塊數。如果 block_count 沒有指定則系統會自動替你計算符合該裝置大小的區塊數。

          參數:


          -c 建立檔案系統之前先檢查是否有壞軌。
          -l 從得定的檔案中讀取壞軌記錄。
          -f 指定檔案配置表(FAT , File Allocation Table)的數量。預設值為 2 。目前 Linux 的 FAT 檔案系統不支援超過 2 個 FAT 表。通常這個不需要改。
          -F 指定 FAT 表的大小,通常是 12 或是 16 個位元組。12 位元組通常用于磁碟片,16 位元組用于一般硬碟的分割區,也就是所謂的 FAT16 格式。這個值通常系統會自己選定適當的值。在磁碟片上用 FAT16 通常不會發生作用,反之在硬碟上用 FAT12 亦然。
          -i 指定 Volume ID。一般是一個 4 個位元組的數字,像是 2e203a47 。如果不給系統會自己產生。
          -m 當使用者試圖用這片磁片或是分割區開機,而上面沒有作業系統時,系統會給使用者一段警告訊息。這個參數就是用來變更這個訊息的。你可以先用檔案編輯好,然后用這個參數指定,或是用
          -m -
          這樣系統會要求你直接輸入這段文字。要特別注意的是,檔案里的字串長度不要超過 418 個字,包括展開的跳欄符號(TAB)和換行符號(換行符號在 DOS 底下算兩個字元!)
          -n 指定 Volume Name,就是磁碟標簽。如同在 DOS 底下的 format 指令一樣,給不給都可以。沒有預設值。
          -r 指定根目錄底下的最大檔案數。這里所謂的檔案數包括目錄。預設值是在軟碟上是 112 或是 224 ,在硬碟上是 512。沒事不要改這個數字。
          -s 每一個磁叢(cluster)的磁區數。必須是 2 的次方數。不過除非你知道你在作什么,這個值不要亂給。
          -v 提供額外的訊息

          范例:
          mkdosfs -n Tester /dev/fd0 將 A 槽里的磁碟片格式化為 DOS 格式,并將標簽設為 Tester

          posted @ 2006-11-23 15:02 HotJava 閱讀(250) | 評論 (0)編輯 收藏

          作者:李琴 李家明?? 出處:計算機與信息技術

          ?摘 要:本文首先分析了Java源代碼需要加密的原因,簡要介紹了DES算法及Java密碼體系和Java密碼擴展,最后說明了利用DES加密算法保護Java源代碼的方法及步驟。

            關鍵詞 Java 加密 DES算法

            Java語言是一種非常適用于網絡編程的語言,它的基本結構與C++極為相似,但拋棄了C/C++中指針等內容,同時它吸收了Smalltalk、C++面向對象的編程思想。它具有簡單性、魯棒性、可移植性、動態性等特點。這些特點使得Java成為跨平臺應用開發的一種規范,在世界范圍內廣泛流傳。

            加密Java源碼的原因

            Java源代碼經過編譯以后在JVM中執行。由于JVM界面是完全透明的,Java類文件能夠很容易通過反編譯器重新轉換成源代碼。因此,所有的算法、類文件等都可以以源代碼的形式被公開,使得軟件不能受到保護,為了保護產權,一般可以有以下幾種方法:

           ?。?)"模糊"類文件,加大反編譯器反編譯源代碼文件的難度。然而,可以修改反編譯器,使之能夠處理這些模糊類文件。所以僅僅依賴"模糊類文件"來保證代碼的安全是不夠的。

           ?。?)流行的加密工具對源文件進行加密,比如PGPPretty Good Privacy)或GPG(GNU Privacy Guard)。這時,最終用戶在運行應用之前必須先進行解密。但解密之后,最終用戶就有了一份不加密的類文件,這和事先不進行加密沒有什么差別。

           ?。?)加密類文件,在運行中JVM用定制的類裝載器(Class Loader)解密類文件。Java運行時裝入字節碼的機制隱含地意味著可以對字節碼進行修改。JVM每次裝入類文件時都需要一個稱為ClassLoader的對象,這個對象負責把新的類裝入正在運行的JVM。JVM給ClassLoader一個包含了待裝入類(例如java.lang.Object)名字的字符串,然后由ClassLoader負責找到類文件,裝入原始數據,并把它轉換成一個Class對象。

            用戶下載的是加密過的類文件,在加密類文件裝入之時進行解密,因此可以看成是一種即時解密器。由于解密后的字節碼文件永遠不會保存到文件系統,所以竊密者很難得到解密后的代碼。

            由于把原始字節碼轉換成Class對象的過程完全由系統負責,所以創建定制ClassLoader對象其實并不困難,只需先獲得原始數據,接著就可以進行包含解密在內的任何轉換。

            Java密碼體系和Java密碼擴展

            Java密碼體系(JCA)和Java密碼擴展(JCE)的設計目的是為Java提供與實現無關的加密函數API。它們都用factory方法來創建類的例程,然后把實際的加密函數委托給提供者指定的底層引擎,引擎中為類提供了服務提供者接口在Java中實現數據的加密/解密,是使用其內置的JCE(Java加密擴展)來實現的。Java開發工具集1.1為實現包括數字簽名和信息摘要在內的加密功能,推出了一種基于供應商的新型靈活應用編程接口。Java密碼體系結構支持供應商的互操作,同時支持硬件和軟件實現。

            Java密碼學結構設計遵循兩個原則:

            (1)算法的獨立性和可靠性。

            (2)實現的獨立性和相互作用性。

            算法的獨立性是通過定義密碼服務類來獲得。用戶只需了解密碼算法的概念,而不用去關心如何實現這些概念。實現的獨立性和相互作用性通過密碼服務提供器來實現。密碼服務提供器是實現一個或多個密碼服務的一個或多個程序包。軟件開發商根據一定接口,將各種算法實現后,打包成一個提供器,用戶可以安裝不同的提供器。安裝和配置提供器,可將包含提供器的ZIPJAR文件放在CLASSPATH下,再編輯Java安全屬性文件來設置定義一個提供器。Java運行環境Sun版本時, 提供一個缺省的提供器Sun。

            下面介紹DES算法及如何利用DES算法加密和解密類文件的步驟。

            DES算法簡介

            DES(Data Encryption Standard)是發明最早的最廣泛使用的分組對稱加密算法。DES算法的入口參數有三個:Key、Data、Mode。其中Key為8個字節共64位,是DES算法的工作密鑰;Data也為8個字節64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。

            DES算法工作流程如下:若Mode為加密模式,則利用Key 對數據Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密模式,則利用Key對密碼形式的數據Data進行解密,還原為Data的明碼形式(64位)作為DES的輸出結果。在通信網絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然后以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點,數據到達目的地后,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據在公共通信網中傳輸的安全性和可靠性。

            也可以通過定期在通信網絡的源端和目的端同時改用新的Key,便能更進一步提高數據的保密性。
          利用DES算法加密的步驟

           ?。?)生成一個安全密鑰。在加密或解密任何數據之前需要有一個密鑰。密鑰是隨同被加密的應用程序一起發布的一段數據,密鑰代碼如下所示。

            【生成一個密鑰代碼】

          // ?生成一個可信任的隨機數源
          Secure?Random?sr? = ? new ?SecureRandom();
          // ?為我們選擇的DES算法生成一個KeyGenerator對象
          KeyGenerator?kg? = ?KeyGenerator.getInstance?( " DES " ?);
          Kg.init?(sr);
          // ?生成密鑰
          Secret?Key?key? = ?kg.generateKey();
          // ?將密鑰數據保存為文件供以后使用,其中key?Filename為保存的文件名
          Util.writeFile?(key?Filename,?key.getEncoded?()?);

          2)加密數據。得到密鑰之后,接下來就可以用它加密數據。如下所示。

            【用密鑰加密原始數據】
          //?產生一個可信任的隨機數源
          SecureRandom?sr?=?new?SecureRandom();
          //從密鑰文件key?Filename中得到密鑰數據
          Byte?rawKeyData?[]?=?Util.readFile?(key?Filename);
          //?從原始密鑰數據創建DESKeySpec對象
          DESKeySpec?dks?=?new?DESKeySpec?(rawKeyData);
          //?創建一個密鑰工廠,然后用它把DESKeySpec轉換成Secret?Key對象
          SecretKeyFactory?key?Factory?=?SecretKeyFactory.getInstance("DES"?);
          Secret?Key?key?
          =?keyFactory.generateSecret(?dks?);
          //?Cipher對象實際完成加密操作
          Cipher?cipher?=?Cipher.getInstance(?"DES"?);
          //?用密鑰初始化Cipher對象
          cipher.init(?Cipher.ENCRYPT_MODE,?key,?sr?);
          //?通過讀類文件獲取需要加密的數據
          Byte?data?[]?=?Util.readFile?(filename);
          //?執行加密操作
          Byte?encryptedClassData?[]?=?cipher.doFinal(data?);
          //?保存加密后的文件,覆蓋原有的類文件。?
          Util.writeFile(?filename,?encryptedClassData?);
          (3)解密數據。運行經過加密的程序時,ClassLoader分析并解密類文件。操作步驟如下所示。

            【用密鑰解密數據】
          //?生成一個可信任的隨機數源
          SecureRandom?sr?=?new?SecureRandom();
          //?從密鑰文件中獲取原始密鑰數據
          Byte?rawKeyData[]?=?Util.readFile(?keyFilename?);
          //?創建一個DESKeySpec對象
          DESKeySpec?dks?=?new?DESKeySpec?(rawKeyData);
          //?創建一個密鑰工廠,然后用它把DESKeySpec對象轉換成Secret?Key對象?
          SecretKeyFactory?key?Factory?=?SecretKeyFactory.getInstance(?"DES"?);
          SecretKey?key?
          =?keyFactory.generateSecret(?dks?);
          //?Cipher對象實際完成解密操作
          Cipher?cipher?=?Cipher.getInstance(?"DES"?);
          //?用密鑰初始化Cipher對象
          Cipher.init(?Cipher.DECRYPT_MODE,?key,?sr?);
          //?獲得經過加密的數據
          Byte?encrypted?Data?[]?=?Util.readFile?(Filename);
          //執行解密操作
          Byte?decryptedData?[]?=?cipher.doFinal(?encryptedData?);
          //?然后將解密后的數據轉化成原來的類文件。
          將上述代碼與自定義的類裝載器結合就可以做到邊解密邊運行,從而起到保護源代碼的作用。

            結束語

            加密/解密是數據傳輸中保證數據安全性和完整性的常用方法,Java語言因其平臺無關性,在Internet上的應用非常之廣泛。使用DES算法加密Java源碼在一定程度上能保護軟件的產權。

          posted @ 2006-11-03 20:11 HotJava 閱讀(574) | 評論 (0)編輯 收藏

          本文依照HIBERNATE幫助文檔,一些網絡書籍及項目經驗整理而成,只提供要點和思路,具體做法可以留言探討,或是找一些更詳細更有針對性的資料。

            初用HIBERNATE的人也許都遇到過性能問題,實現同一功能,用HIBERNATE與用JDBC性能相差十幾倍很正常,如果不及早調整,很可能影響整個項目的進度。

            大體上,對于HIBERNATE性能調優的主要考慮點如下:

            ? 數據庫設計調整

            ? HQL優化

            ? API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)

            ? 主配置參數(日志,查詢緩存,fetch_size, batch_size等)

            ? 映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)

            ? 一級緩存的管理

            ? 針對二級緩存,還有許多特有的策略

            ? 事務控制策略。

            1、 數據庫設計

            a) 降低關聯的復雜性

            b) 盡量不使用聯合主鍵

            c) ID的生成機制,不同的數據庫所提供的機制并不完全一樣

            d) 適當的冗余數據,不過分追求高范式

            2、 HQL優化

            HQL如果拋開它同HIBERNATE本身一些緩存機制的關聯,HQL的優化技巧同普通的SQL優化技巧一樣,可以很容易在網上找到一些經驗之談。

            3、 主配置

            a) 查詢緩存,同下面講的緩存不太一樣,它是針對HQL語句的緩存,即完全一樣的語句再次執行時可以利用緩存數據。但是,查詢緩存在一個交易系統(數據變更頻繁,查詢條件相同的機率并不大)中可能會起反作用:它會白白耗費大量的系統資源但卻難以派上用場。

            b) fetch_size,同JDBC的相關參數作用類似,參數并不是越大越好,而應根據業務特征去設置

            c) batch_size同上。

            d) 生產系統中,切記要關掉SQL語句打印

            4、 緩存

            a) 數據庫級緩存:這級緩存是最高效和安全的,但不同的數據庫可管理的層次并不一樣,比如,在ORACLE中,可以在建表時指定將整個表置于緩存當中。

            b) SESSION緩存:在一個HIBERNATE SESSION有效,這級緩存的可干預性不強,大多于HIBERNATE自動管理,但它提供清除緩存的方法,這在大批量增加/更新操作是有效的。比如,同時增加十萬條記錄,按常規方式進行,很可能會發現OutofMemeroy的異常,這時可能需要手動清除這一級緩存:Session.evict以及Session.clear

            c) 應用緩存:在一個SESSIONFACTORY中有效,因此也是優化的重中之重,因此,各類策略也考慮的較多,在將數據放入這一級緩存之前,需要考慮一些前提條件:

            i. 數據不會被第三方修改(比如,是否有另一個應用也在修改這些數據?)

            ii. 數據不會太大

            iii. 數據不會頻繁更新(否則使用CACHE可能適得其反)

            iv. 數據會被頻繁查詢

            v. 數據不是關鍵數據(如涉及錢,安全等方面的問題)。

            緩存有幾種形式,可以在映射文件中配置:read-only(只讀,適用于很少變更的靜態數據/歷史數據),nonstrict-read-write,read-write(比較普遍的形式,效率一般),transactional(JTA中,且支持的緩存產品較少)

            d) 分布式緩存:同c)的配置一樣,只是緩存產品的選用不同,在目前的HIBERNATE中可供選擇的不多,oscache, jboss cache,目前的大多數項目,對它們的用于集群的使用(特別是關鍵交易系統)都持保守態度。在集群環境中,只利用數據庫級的緩存是最安全的。

            5、 延遲加載

            a) 實體延遲加載:通過使用動態代理實現

            b) 集合延遲加載:通過實現自有的SET/LIST,HIBERNATE提供了這方面的支持

            c) 屬性延遲加載:

            6、 方法選用

            a) 完成同樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什么方式,可能用性能/代碼都會有影響。顯示,一次返回十萬條記錄(List/Set/Bag/Map等)進行處理,很可能導致內存不夠的問題,而如果用基于游標(ScrollableResults)或Iterator的結果集,則不存在這樣的問題。

            b) Session的load/get方法,前者會使用二級緩存,而后者則不使用。

            c) Query和list/iterator,如果去仔細研究一下它們,你可能會發現很多有意思的情況,二者主要區別(如果使用了Spring,在HibernateTemplate中對應find,iterator方法):

            i. list只能利用查詢緩存(但在交易系統中查詢緩存作用不大),無法利用二級緩存中的單個實體,但list查出的對象會寫入二級緩存,但它一般只生成較少的執行SQL語句,很多情況就是一條(無關聯)。

            ii. iterator則可以利用二級緩存,對于一條查詢語句,它會先從數據庫中找出所有符合條件的記錄的ID,再通過ID去緩存找,對于緩存中沒有的記錄,再構造語句從數據庫中查出,因此很容易知道,如果緩存中沒有任何符合條件的記錄,使用iterator會產生N+1條SQL語句(N為符合條件的記錄數)

            iii. 通過iterator,配合緩存管理API,在海量數據查詢中可以很好的解決內存問題,如:

            while(it.hasNext()){

            YouObject object = (YouObject)it.next();

            session.evict(youObject);

            sessionFactory.evice(YouObject.class, youObject.getId());

            }

            如果用list方法,很可能就出OutofMemory錯誤了。

            iv. 通過上面的說明,我想你應該知道如何去使用這兩個方法了。

            7、 集合的選用

            在HIBERNATE 3.1文檔的“19.5. Understanding Collection performance”中有詳細的說明。

            8、 事務控制

            事務方面對性能有影響的主要包括:事務方式的選用,事務隔離級別以及鎖的選用

            a) 事務方式選用:如果不涉及多個事務管理器事務的話,不需要使用JTA,只有JDBC的事務控制就可以。

            b) 事務隔離級別:參見標準的SQL事務隔離級別

            c) 鎖的選用:悲觀鎖(一般由具體的事務管理器實現),對于長事務效率低,但安全。樂觀鎖(一般在應用級別實現),如在HIBERNATE中可以定義VERSION字段,顯然,如果有多個應用操作數據,且這些應用不是用同一種樂觀鎖機制,則樂觀鎖會失效。因此,針對不同的數據應有不同的策略,同前面許多情況一樣,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特征有足夠的了解。

            9、 批量操作

            即使是使用JDBC,在進行大批數據更新時,BATCH與不使用BATCH有效率上也有很大的差別。我們可以通過設置batch_size來讓其支持批量操作。

            舉個例子,要批量刪除某表中的對象,如“delete Account”,打出來的語句,會發現HIBERNATE找出了所有ACCOUNT的ID,再進行刪除,這主要是為了維護二級緩存,這樣效率肯定高不了,在后續的版本中增加了bulk delete/update,但這也無法解決緩存的維護問題。也就是說,由于有了二級緩存的維護問題,HIBERNATE的批量操作效率并不盡如人意!

            從前面許多要點可以看出,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特征有足夠的了解,一般的,優化方案應在架構設計期就基本確定,否則可能導致沒必要的返工,致使項目延期,而作為架構師和項目經理,還要面對開發人員可能的抱怨,必竟,我們對用戶需求更改的控制力不大,但技術/架構風險是應該在初期意識到并制定好相關的對策。

            還有一點要注意,應用層的緩存只是錦上添花,永遠不要把它當救命稻草,應用的根基(數據庫設計,算法,高效的操作語句,恰當API的選擇等)才是最重要的。?

          Hibernate的緩存***********************************

          1、首先設置EhCache,建立配置文件ehcache.xml,默認的位置在class-path,可以放到你的src目錄下:

          <?xml version="1.0" encoding="UTF-8"?>
          <ehcache>
          ?。糳iskStore path="java.io.tmpdir"/>
           ?。糳efaultCache
             maxElementsInMemory="10000" <!-- 緩存最大數目 -->
             eternal="false" <!-- 緩存是否持久 -->
             overflowToDisk="true" <!-- 是否保存到磁盤,當系統當機時-->
             timeToIdleSeconds="300" <!-- 當緩存閑置n秒后銷毀 -->
             timeToLiveSeconds="180" <!-- 當緩存存活n秒后銷毀-->
             diskPersistent="false"
             diskExpiryThreadIntervalSeconds= "120"/>
          </ehcache>

            2、在Hibernate配置文件中設置:

          <!-- 設置Hibernate的緩存接口類,這個類在Hibernate包中 -->
          <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
           <!-- 是否使用查詢緩存 -->
           <property name="hibernate.cache.use_query_cache">true</property>
            如果使用spring調用Hibernate的sessionFactory的話,這樣設置:
            <!--HibernateSession工廠管理 -->
            ?。糱ean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            ?。紁roperty name="dataSource">
              <ref bean="datasource" />
            ?。?property>
            ?。紁roperty name="hibernateProperties">
             <props>
             ?。紁rop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
             ?。紁rop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
             ?。紁rop key="hibernate.show_sql">true</prop>
             ?。紁rop key="hibernate.cache.use_query_cache">true</prop>
             ?。紁rop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
             </props>
          ?。?property>
          ?。紁roperty name="mappingDirectoryLocations">
           ?。糽ist>
            ?。紇alue>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
            </list>
          ?。?property>
          </bean>

            說明一下:如果不設置“查詢緩存”,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集的話,就需要設置
          hibernate.cache.use_query_cache true 才行

            3、在Hbm文件中添加<cache usage="read-only"/>

            4、如果需要“查詢緩存”,還需要在使用Query或Criteria()時設置其setCacheable(true);屬性

            5、實踐出真知,給一段測試程序,如果成功的話第二次查詢時不會讀取數據庫

          package cn.rmic.hibernatesample;

          import java.util.List;

          import org.hibernate.CacheMode;
          import org.hibernate.Criteria;
          import org.hibernate.Query;
          import org.hibernate.Session;

          import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
          import cn.rmic.manager.po.Resources;

          public class testCacheSelectList ...{

           /** *//**
           * @param args
           */
           public static void main(String[] args) ...{
            // TODO Auto-generated method stub

            Session s=HibernateSessionFactory.getSession();
            Criteria c=s.createCriteria(Resources.class);
            c.setCacheable(true);
            List l=c.list();
            // Query q=s.createQuery("From Resources r")
            // .setCacheable(true)
            // .setCacheRegion("frontpages") ;
            // List l=q.list();
            Resources resources=(Resources)l.get(0);
            System.out.println("-1-"+resources.getName());
            HibernateSessionFactory.closeSession();
            try ...{
             Thread.sleep(5000);
            } catch (InterruptedException e) ...{
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            s=HibernateSessionFactory.getSession();
            c=s.createCriteria(Resources.class);
            c.setCacheable(true);
            l=c.list();
            // q=s.createQuery("From Resources r").setCacheable(true)
            // .setCacheRegion("frontpages");
            // l=q.list();
            resources=(Resources)l.get(0);
            System.out.println("-2-"+resources.getName());
            HibernateSessionFactory.closeSession();
           }
          }

          posted @ 2006-11-02 21:35 HotJava 閱讀(1614) | 評論 (1)編輯 收藏

          本文依照HIBERNATE幫助文檔,一些網絡書籍及項目經驗整理而成,只提供要點和思路,具體做法可以留言探討,或是找一些更詳細更有針對性的資料。

            初用HIBERNATE的人也許都遇到過性能問題,實現同一功能,用HIBERNATE與用JDBC性能相差十幾倍很正常,如果不及早調整,很可能影響整個項目的進度。

            大體上,對于HIBERNATE性能調優的主要考慮點如下:

            ? 數據庫設計調整

            ? HQL優化

            ? API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)

            ? 主配置參數(日志,查詢緩存,fetch_size, batch_size等)

            ? 映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)

            ? 一級緩存的管理

            ? 針對二級緩存,還有許多特有的策略

            ? 事務控制策略。

            1、 數據庫設計

            a) 降低關聯的復雜性

            b) 盡量不使用聯合主鍵

            c) ID的生成機制,不同的數據庫所提供的機制并不完全一樣

            d) 適當的冗余數據,不過分追求高范式

            2、 HQL優化

            HQL如果拋開它同HIBERNATE本身一些緩存機制的關聯,HQL的優化技巧同普通的SQL優化技巧一樣,可以很容易在網上找到一些經驗之談。

            3、 主配置

            a) 查詢緩存,同下面講的緩存不太一樣,它是針對HQL語句的緩存,即完全一樣的語句再次執行時可以利用緩存數據。但是,查詢緩存在一個交易系統(數據變更頻繁,查詢條件相同的機率并不大)中可能會起反作用:它會白白耗費大量的系統資源但卻難以派上用場。

            b) fetch_size,同JDBC的相關參數作用類似,參數并不是越大越好,而應根據業務特征去設置

            c) batch_size同上。

            d) 生產系統中,切記要關掉SQL語句打印。

            4、 緩存

            a) 數據庫級緩存:這級緩存是最高效和安全的,但不同的數據庫可管理的層次并不一樣,比如,在ORACLE中,可以在建表時指定將整個表置于緩存當中。

            b) SESSION緩存:在一個HIBERNATE SESSION有效,這級緩存的可干預性不強,大多于HIBERNATE自動管理,但它提供清除緩存的方法,這在大批量增加/更新操作是有效的。比如,同時增加十萬條記錄,按常規方式進行,很可能會發現OutofMemeroy的異常,這時可能需要手動清除這一級緩存:Session.evict以及Session.clear

            c) 應用緩存:在一個SESSIONFACTORY中有效,因此也是優化的重中之重,因此,各類策略也考慮的較多,在將數據放入這一級緩存之前,需要考慮一些前提條件:

            i. 數據不會被第三方修改(比如,是否有另一個應用也在修改這些數據?)

            ii. 數據不會太大

            iii. 數據不會頻繁更新(否則使用CACHE可能適得其反)

            iv. 數據會被頻繁查詢

            v. 數據不是關鍵數據(如涉及錢,安全等方面的問題)。

            緩存有幾種形式,可以在映射文件中配置:read-only(只讀,適用于很少變更的靜態數據/歷史數據),nonstrict-read-write,read-write(比較普遍的形式,效率一般),transactional(JTA中,且支持的緩存產品較少)

            d) 分布式緩存:同c)的配置一樣,只是緩存產品的選用不同,在目前的HIBERNATE中可供選擇的不多,oscache, jboss cache,目前的大多數項目,對它們的用于集群的使用(特別是關鍵交易系統)都持保守態度。在集群環境中,只利用數據庫級的緩存是最安全的。

            5、 延遲加載

            a) 實體延遲加載:通過使用動態代理實現

            b) 集合延遲加載:通過實現自有的SET/LIST,HIBERNATE提供了這方面的支持

            c) 屬性延遲加載:

            6、 方法選用

            a) 完成同樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什么方式,可能用性能/代碼都會有影響。顯示,一次返回十萬條記錄(List/Set/Bag/Map等)進行處理,很可能導致內存不夠的問題,而如果用基于游標(ScrollableResults)或Iterator的結果集,則不存在這樣的問題。

            b) Session的load/get方法,前者會使用二級緩存,而后者則不使用。

            c) Query和list/iterator,如果去仔細研究一下它們,你可能會發現很多有意思的情況,二者主要區別(如果使用了Spring,在HibernateTemplate中對應find,iterator方法):

            i. list只能利用查詢緩存(但在交易系統中查詢緩存作用不大),無法利用二級緩存中的單個實體,但list查出的對象會寫入二級緩存,但它一般只生成較少的執行SQL語句,很多情況就是一條(無關聯)。

            ii. iterator則可以利用二級緩存,對于一條查詢語句,它會先從數據庫中找出所有符合條件的記錄的ID,再通過ID去緩存找,對于緩存中沒有的記錄,再構造語句從數據庫中查出,因此很容易知道,如果緩存中沒有任何符合條件的記錄,使用iterator會產生N+1條SQL語句(N為符合條件的記錄數)

            iii. 通過iterator,配合緩存管理API,在海量數據查詢中可以很好的解決內存問題,如:

            while(it.hasNext()){

            YouObject object = (YouObject)it.next();

            session.evict(youObject);

            sessionFactory.evice(YouObject.class, youObject.getId());

            }

            如果用list方法,很可能就出OutofMemory錯誤了。

            iv. 通過上面的說明,我想你應該知道如何去使用這兩個方法了。

            7、 集合的選用

            在HIBERNATE 3.1文檔的“19.5. Understanding Collection performance”中有詳細的說明。

            8、 事務控制

            事務方面對性能有影響的主要包括:事務方式的選用,事務隔離級別以及鎖的選用

            a) 事務方式選用:如果不涉及多個事務管理器事務的話,不需要使用JTA,只有JDBC的事務控制就可以。

            b) 事務隔離級別:參見標準的SQL事務隔離級別

            c) 鎖的選用:悲觀鎖(一般由具體的事務管理器實現),對于長事務效率低,但安全。樂觀鎖(一般在應用級別實現),如在HIBERNATE中可以定義VERSION字段,顯然,如果有多個應用操作數據,且這些應用不是用同一種樂觀鎖機制,則樂觀鎖會失效。因此,針對不同的數據應有不同的策略,同前面許多情況一樣,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特征有足夠的了解。

            9、 批量操作

            即使是使用JDBC,在進行大批數據更新時,BATCH與不使用BATCH有效率上也有很大的差別。我們可以通過設置batch_size來讓其支持批量操作。

            舉個例子,要批量刪除某表中的對象,如“delete Account”,打出來的語句,會發現HIBERNATE找出了所有ACCOUNT的ID,再進行刪除,這主要是為了維護二級緩存,這樣效率肯定高不了,在后續的版本中增加了bulk delete/update,但這也無法解決緩存的維護問題。也就是說,由于有了二級緩存的維護問題,HIBERNATE的批量操作效率并不盡如人意!

            從前面許多要點可以看出,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特征有足夠的了解,一般的,優化方案應在架構設計期就基本確定,否則可能導致沒必要的返工,致使項目延期,而作為架構師和項目經理,還要面對開發人員可能的抱怨,必竟,我們對用戶需求更改的控制力不大,但技術/架構風險是應該在初期意識到并制定好相關的對策。

            還有一點要注意,應用層的緩存只是錦上添花,永遠不要把它當救命稻草,應用的根基(數據庫設計,算法,高效的操作語句,恰當API的選擇等)才是最重要的。?

          Hibernate的緩存***********************************

          1、首先設置EhCache,建立配置文件ehcache.xml,默認的位置在class-path,可以放到你的src目錄下:

          <?xml version="1.0" encoding="UTF-8"?>
          <ehcache>
          ?。糳iskStore path="java.io.tmpdir"/>
           ?。糳efaultCache
             maxElementsInMemory="10000" <!-- 緩存最大數目 -->
             eternal="false" <!-- 緩存是否持久 -->
             overflowToDisk="true" <!-- 是否保存到磁盤,當系統當機時-->
             timeToIdleSeconds="300" <!-- 當緩存閑置n秒后銷毀 -->
             timeToLiveSeconds="180" <!-- 當緩存存活n秒后銷毀-->
             diskPersistent="false"
             diskExpiryThreadIntervalSeconds= "120"/>
          </ehcache>

            2、在Hibernate配置文件中設置:

          <!-- 設置Hibernate的緩存接口類,這個類在Hibernate包中 -->
          <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
          ?。?-- 是否使用查詢緩存 -->
          ?。紁roperty name="hibernate.cache.use_query_cache">true</property>
            如果使用spring調用Hibernate的sessionFactory的話,這樣設置:
            <!--HibernateSession工廠管理 -->
            ?。糱ean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            ?。紁roperty name="dataSource">
              <ref bean="datasource" />
            ?。?property>
             <property name="hibernateProperties">
            ?。紁rops>
             ?。紁rop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
             ?。紁rop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
              <prop key="hibernate.show_sql">true</prop>
             ?。紁rop key="hibernate.cache.use_query_cache">true</prop>
             ?。紁rop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
             </props>
          ?。?property>
          ?。紁roperty name="mappingDirectoryLocations">
           ?。糽ist>
             <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
            </list>
           </property>
          </bean>

            說明一下:如果不設置“查詢緩存”,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集的話,就需要設置
          hibernate.cache.use_query_cache true 才行

            3、在Hbm文件中添加<cache usage="read-only"/>

            4、如果需要“查詢緩存”,還需要在使用Query或Criteria()時設置其setCacheable(true);屬性

            5、實踐出真知,給一段測試程序,如果成功的話第二次查詢時不會讀取數據庫

          package cn.rmic.hibernatesample;

          import java.util.List;

          import org.hibernate.CacheMode;
          import org.hibernate.Criteria;
          import org.hibernate.Query;
          import org.hibernate.Session;

          import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;
          import cn.rmic.manager.po.Resources;

          public class testCacheSelectList ...{

           /** *//**
           * @param args
           */
           public static void main(String[] args) ...{
            // TODO Auto-generated method stub

            Session s=HibernateSessionFactory.getSession();
            Criteria c=s.createCriteria(Resources.class);
            c.setCacheable(true);
            List l=c.list();
            // Query q=s.createQuery("From Resources r")
            // .setCacheable(true)
            // .setCacheRegion("frontpages") ;
            // List l=q.list();
            Resources resources=(Resources)l.get(0);
            System.out.println("-1-"+resources.getName());
            HibernateSessionFactory.closeSession();
            try ...{
             Thread.sleep(5000);
            } catch (InterruptedException e) ...{
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            s=HibernateSessionFactory.getSession();
            c=s.createCriteria(Resources.class);
            c.setCacheable(true);
            l=c.list();
            // q=s.createQuery("From Resources r").setCacheable(true)
            // .setCacheRegion("frontpages");
            // l=q.list();
            resources=(Resources)l.get(0);
            System.out.println("-2-"+resources.getName());
            HibernateSessionFactory.closeSession();
           }
          }

          posted @ 2006-11-02 21:33 HotJava 閱讀(247) | 評論 (0)編輯 收藏

               摘要: 一、Java基礎方面 1、作用域public,private,protected,以及不寫時的區別   答:區別如下:   作用域?????? 當前類????? 同一package????? 子孫類?????? 其他package  public???????? √??????????? √???????????? √????????????? √  protected?????...  閱讀全文

          posted @ 2006-11-02 21:33 HotJava 閱讀(389) | 評論 (0)編輯 收藏

               摘要: 1、創建SessionFactory,為了減輕服務器負擔,保證一個應用中僅生成一個SessionFactory即可. package ?dao; import ?org.hibernate.cfg. * ; import ?org.hibernate....  閱讀全文

          posted @ 2006-11-02 20:43 HotJava 閱讀(697) | 評論 (0)編輯 收藏

          常用log4j配置,一般可以采用兩種方式,.properties和.xml,下面舉兩個簡單的例子:
          一、log4j.properties
          ### 設置org.zblog域對應的級別INFO,DEBUG,WARN,ERROR和輸出地A1,A2 ##
          log4j.category.org.zblog=ERROR,A1
          log4j.category.org.zblog=INFO,A2
          log4j.appender.A1=org.apache.log4j.ConsoleAppender
          ### 設置輸出地A1,為ConsoleAppender(控制臺) ##
          log4j.appender.A1.layout=org.apache.log4j.PatternLayout
          ### 設置A1的輸出布局格式PatterLayout,(可以靈活地指定布局模式)##
          log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
          ### 配置日志輸出的格式##
          log4j.appender.A2=org.apache.log4j.RollingFileAppender
          ### 設置輸出地A2到文件(文件大小到達指定尺寸的時候產生一個新的文件)##
          log4j.appender.A2.File=E:/study/log4j/zhuwei.html
          ### 文件位置##
          log4j.appender.A2.MaxFileSize=500KB
          ### 文件大小##
          log4j.appender.A2.MaxBackupIndex=1
          log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
          ##指定采用html方式輸出
          二、log4j.xml
          <?xml version="1.0" encoding="GB2312" ?>
          <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
          <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
          <appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender">
          <!-- 設置通道ID:org.zblog.all和輸出方式:org.apache.log4j.RollingFileAppender -->
          ?? <param name="File" value="E:/study/log4j/all.output.log" /><!-- 設置File參數:日志輸出文件名 -->
          ?? <param name="Append" value="false" /><!-- 設置是否在重新啟動服務時,在原有日志的基礎添加新日志 -->
          ?? <param name="MaxBackupIndex" value="10" />
          ?? <layout class="org.apache.log4j.PatternLayout">
          ?????? <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 設置輸出文件項目和格式 -->
          ?? </layout>
          </appender>
          <appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender">
          ?? <param name="File" value="E:/study/log4j/zhuwei.output.log" />
          ?? <param name="Append" value="true" />
          ?? <param name="MaxFileSize" value="10240" /> <!-- 設置文件大小 -->
          ?? <param name="MaxBackupIndex" value="10" />
          ?? <layout class="org.apache.log4j.PatternLayout">
          ?????? <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
          ?? </layout>
          </appender>
          <logger name="zcw.log"> <!-- 設置域名限制,即zcw.log域及以下的日志均輸出到下面對應的通道中 -->
          ?? <level value="debug" /><!-- 設置級別 -->
          ?? <appender-ref ref="org.zblog.zcw" /><!-- 與前面的通道id相對應 -->
          </logger>
          <root> <!-- 設置接收所有輸出的通道 -->
          ?? <appender-ref ref="org.zblog.all" /><!-- 與前面的通道id相對應 -->
          </root>
          </log4j:configuration>
          三、配置文件加載方法:
          import org.apache.log4j.Logger;
          import org.apache.log4j.PropertyConfigurator;
          import org.apache.log4j.xml.DOMConfigurator;
          public class Log4jApp {
          ?? public static void main(String[] args) {
          ?????? DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加載.xml文件
          ?????? //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加載.properties文件
          ?????? Logger log=Logger.getLogger("org.zblog.test");
          ?????? log.info("測試");
          ?? }
          }
          四、項目使用log4j
          在web 應用中,可以將配置文件的加載放在一個單獨的servlet中,并在web.xml中配置該servlet在應用啟動時候加載。對于在多人項目中,可以給每一個人設置一個輸出通道,這樣在每個人在構建Logger時,用自己的域名稱,讓調試信息輸出到自己的log文件中。
          五、常用輸出格式
          # -X號:X信息輸出時左對齊;
          # %p:日志信息級別
          # %d{}:日志信息產生時間
          # %c:日志信息所在地(類名)
          # %m:產生的日志具體信息
          # %n:輸出日志信息換行

          posted @ 2006-10-10 19:02 HotJava 閱讀(224) | 評論 (0)編輯 收藏

          ?

          【‘と’の用法について:】 ①並列助詞 ★中國語:和、與、同 ◆例:AとBをワークエリアにセットする。 ②動作、関係等的対象 ★中國語:和、與、同 ◆例: 條件書の內容はソースと一致していない。     委託元と打合せする。 ③共同完成動作的対象 ★中國語:和××一起… ◆例:皆さんと同じ職場で働いている。 ④結果 ★中國語:成為(変為)… ◆例:水は氷となる?!   ⌒拚丹欷酷?、AはA+1となる。 ⑤比較対象 ★中國語:和、同、跟 ◆例:AはBと等しい?!   はBと違っている。 ⑥思考、発言、記述內容的引用 ★中國語:…書、…記述、…認為、…所述 ◆例:詳細設計書には「A=0」と書いてありますが、こちら側はA≠0と思っております?!   ∥氃楗僵`スがOKだと言われました。    こちら側は以上の通り処理を行なうのが正しいと思っております?!   NSITE側からソースに問題があると指摘されてきた。 ⑦後跟否定形式 ★中國語:不到、不足 ◆例:1時間とはかからなかった。     ⑧由前因導致後果 ★中國語:由××導致○○的結果 ◆例:このようにソースを修正すると大和ルールと違反している部分があると思います。 ⑨一般條件下成立的條件関係 ★中國語:一.…就…、 ◆例:AにBをたすとCになる。     ⑩仮設 ★中國語:如果…就… ◆例:もし仕様が変更されるとそれと関連する幾つかの部分も変更する必要がある。 【連続詞について】 ①から ?。ㄖ饔Q想方) ★中國語:因為…所以 ◆例: 仕様理解のほうが大変ですから、フローを提出してくれませんか?!  ≡U文:仕様很難理解、能否(向我方)提供流程図。 ②ので ?。陀Q存在) ★中國語:因為…所以 ◆例: 今回の案件は出力全て西暦なので、和暦の場合、まず西暦に変更して下さい?!   ≡U文:因為本次案件的出力全部是西暦、所以請將和暦変更為西暦。 ③ため  (表示原因) ★中國語:由于…(発生)…結果 ◆例: 現行稅制が変更されたため、関連PGMを修正する必要が出て來る。    訳文:由于現行稅制発生変更、因而産生了関連PGM修正的必要。 ④が ★中國語:雖然…但是例: 詳細設計書には「A=0」と書いてありますが、こちら側はA≠0と思っております。   訳文:雖然在詳細設計書中是「A=0」、但是我方認為応該是A≠0。 ⑤のに?。ㄟz憾、失望) ★中國語:卻…、 居然 ◆例: Aにすればよかったなのに、何故わざわざBにしなければならない?!  ≡U文:用A方式來処理本來很好、為什幺還要特意使用B方式陳? ⑥動詞未然形+ずに ★中國語:不… ◆例:ソースの論理を変わらずに修正して下さい?!  ≡U文:請在不改変SOURCE LOGIC的前提下、進行修正。 ⑦動詞未然形+ないように ★中國語:不要… ◆例:二度とこのようなミスを発生しないように良く注意して下さい?!  ≡U文:為避免再次発生這様的錯誤、請加強注意。 ⑧動詞未然形+無ければなれない ★中國語:必須… ◆例:テストをやらなければなれない?!  ≡U文:必須要作測試。 ⑨動詞未然形+無くでも良い(無くでも構いません) ★中國語:不需要… ◆例:この論理についてテストをやらなくても良い。   訳文:針対這個 logic不需要進行測試。 ⑩.…てはいけない ★中國語:不可… ◆例:修正された部分についてテストをしなくてはいけない   訳文:針対被修正的部分必須要進行測試(不作測試不可以)。 ?全て…ではない。 ★中國語:不全是… ◆例:データは全て‘0’ではない?!  ≡U文:數拠并不全是‘0’。 ?…わけではない。 ★中國語:并非… ◆例:全てのテストデータが間違っているわけではない。   訳文:并非所有的測試數拠都是錯誤的。 ?○○における… ★中國語:在○○中… ◆例:コール?ネット信用取引サービスにおける閉鎖基準は、普通の信用取引サービスと異なる。   訳文:在CALLNET信用交易中的閉鎖基準與普通的信用交易   service不同。 ?○○に対する ★中國語:対于○○、針対○○ ◆例:BDAMファイルに対して、更新等の処理を行います?! ≡U文:針対BDAM FILE進行更新等処理。 ?○○について ★中國語:関于○○ ◆例:今度案件背景について詳しく紹介していただきませんか。   訳文:請詳細紹介一下(関于)本回案件的背景。 ?○○による ★中國語:根拠、通過○○ ◆例:仕様理解により、ACO380はTABLEで出力すると思います?! ≡U文:根拠対于仕様的理解、我方認為ACO380要通過TABLE來輸出。 ?○○に関する ★中國語:與○○相関 ◆例:これと関する情報は條件書に明らかに書いています。  訳文:與此相関的信息在條件書中有詳細的記述。 ?○○に伴い ★中國語:伴隨○○、発生… ◆例:Aファイルの追加に伴い、それと関連しているある処理とルーチンもそれぞれ追加される。  訳文:伴隨著A FILE的追加、與其関連的処理和 ROUTINE也分別被追加。 ?○○にとって ★中國語:対于○○來説… ◆例:今度提出してくれた詳細設計書はこちら側にとって、なかなか理解できないので、  もっと詳しく説明して頂きませんか?! ≡U文:本次案件的詳細設計書対于我方來説、某些部分非常難于理解、     請進一歩給于詳細的説明。 ?○○になると ★中國語:一…就… ◆例:ABENDになると、ABENDメッセージがリターンされて來る?! ≡U文:一旦発生ABEND、就會返回ABEND信息?!兢い氦欷趣い氦欷猡斡梅à摔膜い啤?★ いずれ ①《どれ、どちら》陳個、陳方面 ◆ 1001   この數字にいずれが0である數字が入っています。  訳文:1001   在這串數字中包含0這個數字。 ②《やがて、その內》不久、早晩 ◆ このことはいずれ分かることだ?! ≡U文:這件事早晩會水落石出。 ★ いずれも ①《全部、どれも》 ◆ 0000  この數字にいずれも0(の數字)です?! ≡U文:0000  這串數字全都是0。 ◆ 1253  これはいずれも0が入っていない數字です。  訳文:1253  這串數字全都不是0。 ★ A+B=C ◆ A足すBはCだ?! にBを加算するとCになる。 ★ A-B=C ◆ A引くBはCだ。  AにBを引くとCになる。 ★ A*B=C ◆ A掛けるBはCになる?! とB乗法するとCになる。 ★ A÷B=C ◆ A割るBはCになる?! でAを割るとCになる。 【比率と比例】 ①○○に××の割引で… ★○○比××的比率 ◆例:3人に1人の割合で大學進學を希望している?! ≡U文:大學的昇學率是3比1的比率。 ②○○分の×× ★○○分之×× ◆例:全員の3分の2がその案に賛成している。  訳文:全員的3分之2都賛成那個提案。 ③○○と××の比 ★○○和××的比 ◆例:10と5の比は2と1の比に等しい10:5=2:1?! ≡U文:10和5的比等于2和1的比10:5=2:1. ④○○対×× ★○○比×× ◆例:A対BイコールX対Y A:B=X:Y?!≡U文:A比B等于X比Y A:B=X:Y?!?【‘に’の用法について:】 ① に違いない ◆ 中國語:一定、必定    例文:これらのデータでテストするのはきっと正しいに違いない?!  ≡U文:使用這些數拠來測試一定正確。 ② に係わらず ◆ 中國語:不論…都   例文:修正と新規に係わらず、大和ルールを守った上で開発を行われなければなりません?!  ≡U文:不論是修正還是新規、都必須在遵守大和RULE的基準上進行開発。 ③ にそって ◆ 中國語:按照…、沿著…    例文:案件開発では標準化にそって進めなければなりません?!  ≡U文:案件開発必須要按照標準化來進行。 ◆ ○○を元に ★中國語:以…為基礎 例:課稅口401kを元に、判定結果ファイルを作成する?!≡Uす:以課稅口401k為基準來作成判定結果FILE。 ◆ ○○を分けて… ★中國語:分開、分別…  例:『データ區分』ごとに変換処理を分けて行う?!≡Uす:毎個『DATA區分』都要分別進行変更処理。 ◆ ○○を××から△△へGETする ★中國語:把○○從××中GET到△△中 例:課稅口401kデータを企業サーバからHOSTへGETする?!≡Uす:把課稅口401kDATA從企業SEVER中GET到HOST中。 ◆ 【…を…へ返す】 ★ 將…返回…   例:判別結果をメインプログラムへ返す?! ≈袊Z:將判別結果返回主程序。 ◆ 【…に…を加算】 ★ 向…中加算…   例:売買に従い、自己融資カウンタに株數を加算  中國語:按照売買、向自己融資counter中加算株數。 ◆ 【…から…へ変更する】 ★ 従…変更為…   例:決済REC?????【KESTBL】の?????長を162から185へ変更する?! ≈袊Z:將決済REC?????【KESTBL】的RECORD長従162変更為185。 ◆ 【…とする】 ★ 認為…、仮定…   例:ホールには影響を與えない事とする  中國語:認為対于HOST來説沒有什幺影響。 ◆ 【…を…へ出力】 ★ 將…向…出力  例:確定配當編集???のデータをOUTDD1へ出力する?! ≈袊Z:將確定配當編集area的數拠向OUTDD1中出力。 ◆ 【…を…にセット】 ★ 將…設置到…   例:ゼロを(付替)差引 支払額にセットする?! ≈袊Z:將零設置到差引支払額中。 ◆ 【…上に…】 ★ 不但…而且…   例:ルールを基づく上に委託元の指示を応じるわけだ?! ≈袊Z:不但要以RULE為基準、而且同時還要尊従委託元的指示。 ◆ 【…上で…】 ★ …方面、…上  例:テストの上ではまちがいはない?! ≈袊Z:在TEST上沒有錯誤。 ◆ 【…上は…】 ★ 既然…就…   例:見られた上はしかたがない?! ≈袊Z:既然己被発現那就沒有方法了。 ◆ 【…かもしれない】 ★ 可能…、也許…   例:あしたは雪が降るかもしれない。   中國語:明天可能下雨?! ±氦饯螭胜长趣蜓预盲郡猡筏欷胜ぁ! ≈袊Z:或許我説過那様的話。 ◆ 【…とはいえ】 ★ …盡管…但是…   例:近いとはいえ歩いて30分はたっぷりかかる?! ≈袊Z:盡管近、還是需要30分。 ◆ 【…ところが】 ★ …可是…   例:うまくいくだろうと思った.ところが,失敗した?! ≈袊Z:原本認為會順調進行、可是失敗了。 ◆ 【…すると…】 ★ 于是…   例:わたしが歌った、すると妹も歌いだした  中國語:我唱了1首歌、于是妹也唱了起來。 ◆ 【…そして…】 ★ 而且…   例:今日は楽しくそして有意義な日でした  中國語:今日是愉快而且有意義的一日。 ◆ 【…ために…】 ★ 因此…   例:病気のためにこられなかった?! ≈袊Z:因病沒能來。 ◆ 【…ところが…】 ★ 可是…   例:新聞はかるく取り扱っていたようだ、ところが、これは大事件なんだ?! ≈袊Z:新聞沒有作重要的登載、不過這是件大事。 ◆ 【ほど…ない】 ★ 再也沒有更…、最…   例:野球ほど好きなものはない?! ≈袊Z:我最喜歓棒球。 ◆ 【…てしまう】 ★ 完了…、盡…   例:1日で読んでしまった?! ≈袊Z:用了1天就読完了。 ◆ 【わけが無い】 ★ 不會…、不能…?!遣豢赡艿摹 。◤镜览砩洗_信完全不可能)  例:努力もしないで成績があがるわけが無い。  中國語:不努力就不能取得好成績。 ◆ 【わけではない】 ★ 并非…。并不是…   例:日本にも小數民族が無いわけではない。  中國語:就是日本也并非沒有少數民族。 ◆ 【わけにはいかない】 ★ 不能…、不可能…   例:自分の職場を離れるわけにはいかない?! ≈袊Z:不能離開自己的職守。 【列挙、並記、例示】 ◆ および     ★ 和、及  例:會社の運営 および 管理を、彼に任せる?! ≈袊Z:將公司的運営及管理委託給了他。 ◆ ~が ★ 両件事件的連続詞  例:もしもし、田中です が、一郎さんをお願いします?! ≈袊Z:我是田中、請叫一下一郎先生。 ◆ ~て     ★ 並且、既…又…   例:あのレストランは、 安くて、おいしいです?! ≈袊Z:那個飯店、既便宜又好吃。 ◆ そして     ★ 並且、既…又…   例:木村さんはきれいです?!·饯筏啤·郡い丐笥H切です?! ≈袊Z:木村小姐既美麗、又非常熱情。 ◆ それから    ★ 然後  例:切手を下さい?!·饯欷椤·长魏晌铯猡姢い筏蓼埂! ≈袊Z:請給我郵票。然後將行李也拜托給艇了。 ◆ たり     ★ 両個動作和狀態的並列  例:日曜日、買い物したり、映畫を 見たり します?! ≈袊Z:星期日又買東西又看電影。 ◆ で      ★ 表並列  例:木村さんは きれいで、たいへん親切です?! ≈袊Z:木村先生既美麗又情熱。 ◆ また      ★ 又、同時  例:彼は有名な音楽家であり、また、陶蕓家でもある?! ≈袊Z:他是有名的音楽家、同時也是陶蕓家。 【時間的な連続性、前後関係、條件の指定】 ◆ それから    ★ 然後  例:晩ご飯を食べます。それから テレビを見ます。  中國語:吃過晩飯。然後看電視。 ◆ ~て、~て ★ …後  例:晩ご飯を 食べて、テレビを 見て、日本語を勉強します。  中國語:在吃過晩飯、看電視後、學習日語。 ◆ ~てから    ★ …後  例:晩ご飯を 食べてから テレビを見ます。  中國語:在吃過晩飯後、看電視。 ◆ ~とき     ★ …時  例:會社へ行くとき、いつも電車で行きます?! ≈袊Z:経常乗電車、去公司。(去公司時、経常乗電車。) ◆ ~まえに   ★ 在…前  例:寢る前に、日本語を勉強します?! ≈袊Z:在睡覚前、學習日語。 【前の文と対立し、問題提起、或は意見を表わす。予想、期待に反する結果を言う】 ◆ ~が      ★ 有逆接與順接両種用法、  ①順接  例:今日はここまでにしますが、何かご質問は。  中國語:今天就講到這、還有什幺問題?  ?、谀娼樱ǖ牵 ±喝毡兢问长傥铯悉い筏い扦工⒏撙い扦埂! ≈袊Z:日本的食品好吃、但是価格貴。 ◆ けれども    ★ 但是  例:見學はおもしろいです。けれども、質問の時間が短いと思います。  中國語:參観學習是非常有趣的。但是、我認為提問題的時間太短了。 ◆ しかし     ★ 但是   例:たくさん食べた。しかし、お腹がいっぱいにならない。   中國語:吃了很多、但是肚子不覚得飽。 ◆ だが   ★ 但是、可是   例:一生懸命勉強した。だが、安心はできない。   中國語:竭盡全力努力學習。但是、還是不放心。 ◆ でも      ★ 但是、不過   例:カメラが欲しいです。 でも、お金がありません。   中國語:想要照相機。不過、沒有銭。 ◆ ところが    ★ 然而、可是   例:萬事まるく収まるはずだった。ところが とんでもないことになった?!  ≈袊Z:一切本応該非常順調。可是 予想不到的事発生了?!?【前に示す理由、條件により、結果や意見、理由を述べる】 ◆ だから     ★ 因此、所以  例:彼はけちんぼうだ.だから,みなに嫌われる?! ≈袊Z:他是個吝嗇鬼、所以、大家都不喜歓他。 ◆ ~たら ★ 如果…的話  例:もし 明日、雨が 降ったら、うちにいます。  中國語:如果明日下雨的話、就呆在家里。 ◆ ~と      ★ (如果)…就…   例:この道をまっすぐ行く と、右に工場があります?! ≈袊Z:沿著這條路直走、工場就在右辺。 ◆ なぜなら ★ 原因是…   例:私は夏がきらいです。なぜなら、暑いし、泳げないから?! ≈袊Z:我不喜歓夏天、原因是:太熱了、并且不會游泳。 【前に示した文に対して、同じ意味で別の表現をする】 ◆ すなわち      中國語:也就是説…、換言之…   例:痩せるということは、すなわち、體重が減ることだ?! ≈袊Z:説起減肥、換句話説、就是減少體重。 ◆ つまり        中國語:也就是説…、換句話説  例:彼が嫌われるのも、つまり 実力がないからだ?! ≈袊Z:他被嫌棄、(換句話説)是因為沒有実力的原因。 ◆ 要するに     ★ 総之…、換句話説…   例:太り過ぎだよ。要するに、食べ過ぎだね。  中國語:太胖、換句話説就是吃的太多。 【それまでの話と話題を変える時に使う表現】 ◆ さて       ★ 那幺…(話題的転換)  例:さて、雑談はそれぐらいにして本題に入りましょう。  中國語:那幺閑談就到此為止、進入正題。 ◆ ところで    ★ 順便提一下(話題的転換)  例:今日は楽しかったですね。ところで お嬢さんはお元気ですか。  中國語:今日高興。順便問一下、小嬢好宅? ◆ それでは ★ 那幺…(話題的転換)  例:それではこれで失禮します。  中國語:那幺我就失陪了。 【前述の事柄に追加あるいは補充する】 ◆ しかも      ★ 而且、并且  例:わたしの部屋は広くて、しかも明るい?! ≈袊Z:我的屋子大而且明亮。 ◆ なお       ★ 此外、而且   例:會議は以上で終ります。なお、次回は水曜日です。  中國語:會議就此結束。此外、下一次定于周三進行。 ◆ その上 ★ 而且、并且  例:雨が降り出し、その上雷まで鳴りだした?! ≈袊Z:下起雨來、而且開始打雷。 【どちらかを選ぶ】 ◆ それとも    ★ 還有、戓者  例:お土産は人形がいいですか。それとも お菓子がいいですか?! ≈袊Z:禮物是選択玩偶好、還是點心好呀? ◆ または     ★ 戓者  例:傘、または レインコートを準備して來てください?! ≈袊Z:請準備一下傘戓者雨衣。 ◆ もしくは ★ 戓者  例:雨、もしくは雪になるでしょう?! ≈袊Z:快要下雨戓者下雪了吧。馬鹿(ばか baka):就是電視里日本兵常說的“八嘎”。是愚蠢、傻瓜、笨腦子的意思。很常用。 貴様(きさま ki sa ma):男性對對方輕蔑的稱呼,也用在親近人的隨便稱呼。

          posted @ 2006-10-10 17:58 HotJava 閱讀(1588) | 評論 (0)編輯 收藏

          下面開始比較各個框架,僅摘要如下,請恕本人只看缺點,不看優點。因為優點是說不完的
          Struts: used since June 2001 - same time 1.0 was released.
          Spring MVC: used since January 2004 - before 1.0 was released.
          WebWork: used since July 2004.
          Tapestry: used since July 2004.
          JSF: used since July 2004 - both Sun’s RI and MyFaces.?

          Struts缺點:

          ActionForms - they’re a pain
          Can’t unit test - StrutsTestCase only does integration
          Project has been rumored as “dead”

          Display Tag:

          Spring MVC缺點:

          Configuration intensive - lots of XML
          Requires writing lots of code in JSPs
          Almost too flexible - no common parent Controller

          WebWork缺點:

          Small Community
          Documentation is poorly organized

          Tapestry缺點:

          Documentation very conceptual, rather than
          pragmatic
          Steep learning curve - very few examples
          Long release cycles - major upgrades every year

          JSF缺點:

          Tag soup for JSPs
          Doesn't play well with REST or Security
          No single source for implementation

          SiteMesh:

          ?

          IDE支持

          Struts has a lot of IDE support and even has frameworks built on top of it (i.e. Beehive’s PageFlow)
          Spring has Spring IDE - only does XML validation, not a UI/web tool
          WebWork has EclipseWork
          Tapestry has Spindle - great for coders
          JSF has many, and they're getting better and better

          posted @ 2006-10-05 15:05 HotJava 閱讀(758) | 評論 (0)編輯 收藏

          難怪連接不了,以前得
          <hibernate-configuration>

          <session-factory>

          <!-- Database connection settings -->
          <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
          <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433/First</property>
          <property name="connection.username">sa</property>
          <property name="connection.password">123</property>

          <!-- JDBC connection pool (use the built-in) -->
          <property name="connection.pool_size">1</property>

          <!-- SQL dialect -->
          <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>

          <!-- Enable Hibernate's automatic session context management -->
          <property name="current_session_context_class">thread</property>

          <!-- Disable the second-level cache? -->
          <property name="cache.provider_class">
          org.hibernate.cache.NoCacheProvider
          </property>

          <!-- Echo all executed SQL to stdout -->
          <property name="show_sql">true</property>

          <!-- Drop and re-create the database schema on startup -->
          <property name="hbm2ddl.auto">create</property>
          <mapping resource="aa/FirstDemo.hbm.xml" />

          </session-factory>

          </hibernate-configuration>

          ----------------------------------------------------------------------------------
          <session-factory>
          <property name="connection.username">sa</property>
          <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;databasename=First</property>這里寫錯了暈
          <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
          <property name="myeclipse.connection.profile">ballacks</property>
          <property name="connection.password">sa</property>
          <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
          <property name="show_sql">true</property>
          <mapping resource="bean/Classes.hbm.xml" />
          <mapping resource="bean/Student.hbm.xml" />

          </session-factory>

          posted @ 2006-09-27 19:42 HotJava 閱讀(247) | 評論 (0)編輯 收藏

               摘要: 新手的  閱讀全文

          posted @ 2006-09-25 17:26 HotJava 閱讀(3574) | 評論 (0)編輯 收藏

          Hibernate.cfg.xml配置文件:
          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd">
          <hibernate-configuration>
          ??? <session-factory>
          ??????? <!-- properties -->
          ??????? <!-- jndi -->
          ??????? <property name="connection.datasource">java:comp/env/jdbc/quickstart</property>
          ??????? <property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
          ??????? <property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
          ??????? <!-- jdbc
          ??????? <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property>
          ??????? <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
          ??????? <property name="connection.username">sa</property>
          ??????? <property name="connection.password"></property>
          ???????? -->
          ??????? <property name="jdbc.fetch_size">50</property><!-- 一次讀的數據庫記錄數 -->
          ??????? <property name="jdbc.batch_size">30</property><!-- 設定對數據庫進行批量刪除 -->
          ??????? <property name="show_sql">true</property><!-- 將Hibernate發送給數據庫的sql顯示出來 -->
          ??????? <!-- Mapping files -->
          ??????? <mapping resource="cat.hbm.xml"/>
          ??? </session-factory>
          </hibernate-configuration>


          數據庫表主鍵的知識點:
          Generator 為每個 POJO 的實例提供唯一標識。一般情況,我們使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 實現的某個實例,其中包括:


          “assigned”
          主鍵由外部程序負責生成,在 save() 之前指定一個。


          “hilo”
          通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。


          “seqhilo”
          與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,需要數據庫中的 Sequence,適用于支持 Sequence 的數據庫,如Oracle。


          “increment”
          主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:不能在集群下使用。


          “identity”
          采用數據庫提供的主鍵生成機制。如DB2、SQL Server、MySQL 中的主鍵生成機制。


          “sequence”
          采用數據庫提供的 sequence 機制生成主鍵。如 Oralce 中的Sequence。


          “native”
          由 Hibernate 根據使用的數據庫自行判斷采用 identity、hilo、sequence 其中一種作為主鍵生成方式。


          “uuid.hex”
          由 Hibernate 基于128 位 UUID 算法 生成16 進制數值(編碼后以長度32 的字符串表示)作為主鍵。


          “uuid.string”
          與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),不能應用在 PostgreSQL 數據庫中。


          “foreign”
          使用另外一個相關聯的對象的標識符作為主鍵。


          以下舉例:
          1、指定參數的情況:
          ??? <id name="id" unsaved-value="0">
          ????? <generator class="sequence">
          ??????? <param name="sequence">SEQ_CHILD</param>
          ????? </generator>
          </id>
          使用的是sequence,適合oracle數據庫;


          2、對于sql server2000中的數據庫子增字段,在配置文件使用下列方法實現:
          <id name="id" type="long" unsaved-value="0">
          ???? <column name="id" sql-type="numeric" not-null="true" />
          ???? <generator class="identity" />
          </id>
          這里主要是:identity:代表由sql server2000數據庫自己提供子增字段.如果要hibernate自己提供,則用increment關鍵字來實現


          3、如果表中的主鍵用字符串類型:可以用hibernate自己提供的方法實現主鍵唯一:
          ? <id name="id" type="string" unsaved-value="null">
          ????? <column name="cid" sql-type="char(32)" not-null="true" />
          ????? <generator class="uuid.hex" />
          ? </id>
          使用的是uuid.hex: 采用128位的算法來生成一個32位字符串。最通用的一種方式。適用于所有數據庫。


          重要的知識點:
          1. 如果有部門表,有員工表,員工表中有dep_id,則表部門類和員工類是one-to-many的關系:
          ?? 可以使用:? ( 在部門類department中使用下列)
          ?? Department類:?
          ???? /**? 部門的所有員工?? */
          ??? private Set staffs = new TreeSet();
          ???
          ??? xml的文件:
          ????? <set name="staffs" >
          ????????? <key column="dep_id"/>
          ????????? <one-to-many class="hbp.sys.data.Staff"/>
          ????? </set>
          ????? 如果是list,需要用索引<index> </index>,具體其中的含義,不是很明白.待以后研究
          ?????
          ?2. 如果部門要有一個負責人,即部門表(tb_department)中有一個字段:staff_id.
          ???? 那么表示部門和負責人之間的關系是many-to-one的關系
          ???? Department類:
          ????? /** 部門負責人id */
          ??? private Staff staff;
          ???
          ??? xml 文件
          ???? <many-to-one name="staff" class="hbp.sys.data.Staff"? column="staff_id"/>?
          ?
          ?3. 多對多關系,一般我們是做一個中間關聯表.我用角色和權限做了個例子,
          ????? Right(id,name)???? Role(id,name)?? 中間表:tb_role_right(role_id,right_id)
          ????? Right類中有一個Role的集合:private Set roles=new TreeSet();
          ????? Role類中也有一個Right的集合:private Set rights=new TreeSet();
          ????? 則兩者是明顯的多對多關系.使用many-to-many來實現;
          ????? xml文件中
          ????? right.hbm.xml:如下:
          ??????? <set name="roles" table="tb_role_right" cascade="all">
          ?????????? <key column="right_id"/>
          ?????????? <many-to-many column="role_id" class="hbp.sys.data.Role"/>
          ??????? </set>
          ????? role.hbm.xml文件中類似:
          ??????? <set name="rights" table="tb_role_right" cascade="all">
          ????????? <key column="role_id"/>
          ????????? <many-to-many column="right_id" class="hbp.sys.data.Right"/>
          ??????? </set>


          4. 幾個值得注意的問題:
          ??????? a)在xml?映射文件中,寫類的名字時一定用類的全名:即:包+類名如:(hbp.sys.data.Staff),這個錯誤使我費了半天勁.:(
          ??????? b)我在寫實現基本DAO操作時,寫了
          ???????????? session.delete("from Right as right where right.id="+id);?
          ???????????? 程序死活報錯,我折騰了半天,跟蹤到底,才恍然大悟,hibernate在解析sql語句的時候把
          ???????????? 其中的right,當成了數據庫中的右連接("保留字"),唉,這種關鍵字,不能隨便用啊,:)


          5. hibernate中HQL語言的查詢根據你的sql的不同而返回不同的對象類型.
          ???????? 如果你使用session.find(String hql)
          ???????? 一般會返回一個List,如:from Staff staff;返回的是包含所有的員工對象的集合
          ???????? 如你的hql為:select count(*) from Staff staff;則返回的是一個Integer對象
          ???????? 如果你使用的hql為:select count(distinct staff.name),count(*) from Staff staff;則返回的是一個Object
          ???????? 即Object[],需要先把他轉換成Object[],然后在取[0],[1].
          ???????? 這種設計我不知道hibernate是如何處理的,感覺既好也不好.好的是可以使用一個find獲得任意查詢
          ???????? 不好在于根據hql來處理返回結果,容易出錯.

          posted @ 2006-09-25 17:19 HotJava 閱讀(150) | 評論 (0)編輯 收藏

               摘要: 哈哈哈哈  閱讀全文

          posted @ 2006-09-25 15:07 HotJava 閱讀(185) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 淮滨县| 阿拉善盟| 邹城市| 邵东县| 桂平市| 汤原县| 邵武市| 东平县| 嫩江县| 探索| 平罗县| 贵阳市| 陆河县| 绥化市| 本溪| 中山市| 绥芬河市| 伊宁市| 共和县| 尉氏县| 平陆县| 嘉鱼县| 安新县| 株洲县| 平利县| 阳城县| 安义县| 潞西市| 凤阳县| 莱阳市| 兴安县| 周口市| 峨眉山市| 读书| 化德县| 积石山| 广西| 城口县| 罗山县| 海林市| 神池县|