#
Linux中find常見用法示例·
find path -option [ -print ] [ -exec -ok command ] {} \; #-print 將查找到的文件輸出到標準輸出
#-exec command {} \; -----將查到的文件執(zhí)行command操作,{} 和 \;之間有空格
#-ok 和-exec相同,只不過在
操作前要詢用戶 ==================================================== -name filename #查找名為filename的文件
-perm #按執(zhí)行權(quán)限來查找
-user username #按文件屬主來查找
-group groupname #按組來查找
-mtime -n +n #按文件更改時間來查找文件,-n指n天以內(nèi),+n指n天以前
-atime -n +n #按文件訪問時間來查GIN: 0px">-perm #按執(zhí)行權(quán)限來查找
-user username #按文件屬主來查找
-group groupname #按組來查找
-mtime -n +n #按文件更改時間來查找文件,-n指n天以內(nèi),+n指n天以前
-atime -n +n #按文件訪問時間來查找文件,-n指n天以內(nèi),+n指n天以前
-ctime -n +n #按文件創(chuàng)建時間來查找文件,-n指n天以內(nèi),+n指n天以前
-nogroup #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以內(nèi),+n指n天以前
-ctime -n +n #按文件創(chuàng)建時間來查找文件,-n指n天以內(nèi),+n指n天以前
-nogroup #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer f1 !f2 #查更改時間比f1新但比f2舊的文件
-type b/d/c/p/l/f #查是塊設(shè)備、目錄、字符設(shè)備、管道、符號鏈接、普通文件-size n[c] #查長度為n塊[或n字節(jié)]的文件
-depth #使查找在進入子目錄前先行查找完本目錄
-fstype #查更改時間比f1新但比f2舊的文件
-mount #查文件時不跨越文件
系統(tǒng)mount點
-follow #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio #對匹配的文件使用cpio命令,將他們備份到磁帶設(shè)備中
-prune #忽略某個目錄 ====================================================
$find ~ -name "*.txt" -print #在$HOME中查.txt文件并顯示
$find . -name "*.txt" -print $find . -name "[A-Z]*" -pri26nbsp; #對匹配的文件使用cpio命令,將他們備份到磁帶設(shè)備中
-prune #忽略某個目錄 $find . -name "[A-Z]*" -print #查以大寫字母開頭的文件
$find /etc -name "host*" -print #查以host開頭的文件
$find . -name "[a-z][a-z][0--9][0--9].txt" -print #查以兩個小寫字母和兩個數(shù)字開頭的txt文件
$find . -perm 755 -print
$find . -perm -007 -exec ls -l {} \; #查所有用戶都可讀寫執(zhí)行的文件同-perm 777
$find . -type d -print 打印目錄結(jié)構(gòu)
$find .
! -type d -print
打印非目錄文件find /usr/include -name '*.h' -exec grep AF_INEF6 {} \; 因grep無法遞歸搜索子目錄,故可以和find相結(jié)合使用。 在/usr/include 所有子目錄中的.h文件中找字串AF_INEF6
$find . -type l -print $find . -size +1000000c -print #查長度大于1Mb的文件
$find . -size 100c -print # 查長度為100c的文件
$find . -size +10 -print #查長度超過期作廢10塊的文件(1塊=512字節(jié)) $cd /
$find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
$find /etc -name "passwd*" -exec grep "cnscn" {} \; #看是否存在cnscn用戶
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo "" > /tmp/core.log
$find . -name "yao*" | xargs chmod o-w ====================================================== find -name april* 在當前目錄下查找以april開始的文件
find -name april* fprint file 在當前目錄下查找以april開始的文件,并把結(jié)果輸出到file中
find -name ap* -o -name may* 查找以ap或may開頭的文件
find /mnt -name tom.txt -ftype vfat 在/mnt下查找名稱為tom.txt且文件
系統(tǒng)類型為vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名稱為tom.txt且文件
系統(tǒng)類型不為vfat的文件
find /tmp -name wa* -type l 在/tmp下查找名為wa開頭且類型為符號鏈接的文件
find /home -mtime -2 在/home下查最近兩天內(nèi)改動過的文件
find /home -atime -1 查1天之內(nèi)被存取過的文件
find /home -mmin +60 在/home下查60分鐘前改動過的文件
find /home -amin +30 查最近30分鐘前被存取過的文件
find /home -newer tmp.txt 在/home下查更新時間比tmp.txt近的文件或目錄
find /home -anewer tmp.txt 在/home下查存取時間比tmp.txt近的文件或目錄
find /home -used -2 列出文件或目錄被改動過之后,在2日內(nèi)被存取過的文件或目錄
find /home -user cnscn 列出/home目錄內(nèi)屬于用戶cnscn的文件或目錄
find /home -uid +501 列出/home目錄內(nèi)用戶的識別碼大于501的文件或目錄
find /home -group cnscn 列出/home內(nèi)組為cnscn的文件或目錄
find /home -gid 501 列出/home內(nèi)組id為501的文件或目錄
find /home -nouser 列出/home內(nèi)不屬于本地用戶的文件或目錄
find /home -nogroup 列出/home內(nèi)不屬于本地組的文件或目錄
find /home -name tmp.txt -maxdepth 4 列出/home內(nèi)的tmp.txt 查時深度最多為3層
find /home -name tmp.txt -mindepth 3 從第2層開始查
find /home -empty 查找大小為0的文件或空目錄
find /home -size +512k 查大于512k的文件
find /home -size -512k 查小于512k的文件
find /home -links +2 查硬連接數(shù)大于2的文件或目錄
find /home -perm 0700 查權(quán)限為700的文件或目錄
find /tmp -name tmp.txt -exec cat {} \;
find /tmp -name tmp.txt -ok rm {} \; find / -amin -10 # 查找在
系統(tǒng)中最后10分鐘訪問的文件
find / -atime -2 # 查找在
系統(tǒng)中最后48小時訪問的文件
find / -empty # 查找在
系統(tǒng)中為空的文件或者文件夾
find / -group cat # 查找在
系統(tǒng)中屬于 groupcat的文件
find / -mmin -5 # 查找在
系統(tǒng)中最后5分鐘里修改過的文件
find / -mtime -1 #查找在
系統(tǒng)中最后24小時里修改過的文件
find / -nouser #查找在
系統(tǒng)中屬于作廢用戶的文件
find / -user fred #查找在
系統(tǒng)中屬于FRED這個用戶的文件
查當前目錄下的所有普通文件
--------------------------------------------------------------------------------
# find . -type f -exec ls -l {} \;-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
查當前目錄下的所有普通文件,并在- e x e c選項中使用ls -l命令將它們列出
=================================================
在/ l o g s目錄中查找更改時間在5日以前的文件并刪除它們:
$ find logs -type f -mtime +5 -exec -ok rm {} \;
=================================================
查詢當天修改過的文件
[root@book class]# find ./ -mtime -1 -type f -exec ls -l {} \;
=================================================
查詢文件并詢問是否要顯示
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {} \;
< ls ... ./classDB.inc.php > ? y
-rw-r--r-- 1 cnscn cnscn 13709 1月 12 12:22 ./classDB.inc.php
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {} \;
< ls ... ./classDB.inc.php > ? n
[root@book class]# =================================================
查詢并交給awk去處理
[root@book class]# who | awk '{print $1"\t"$2}'
cnscn pts/0 =================================================
awk---grep---sed [root@book class]# df -k | awk '{print $1}' | grep -v 'none' | sed s"/\/dev\///g"
文件
系統(tǒng)sda2
sda1
[root@book class]# df -k | awk '{print $1}' | grep -v 'none'
文件
系統(tǒng)/dev/sda2
/dev/sda1
1)在/tmp中查找所有的*.h,并在這些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名 A) find /tmp -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
B) grep SYSCALL_VECTOR /tmp/*.h | cut -d':' -f1| uniq > filename
C) find /tmp -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print
2)find / -name filename -exec rm -rf {} \;
find / -name filename -ok rm -rf {} \;
3)比如要查找磁盤中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;
4)將find出來的東西拷到另一個地方
find *.c -exec cp '{}' /tmp ';' 如果有特殊文件,可以用cpio,也可以用這樣的語法:
find dir -name filename -print | cpio -pdv newdir
6)查找2004-11-30 16:36:37時更改過的文件
# A=`find ./ -name "*php"` | ls -l --full-time $A 2>/dev/null | grep "2004-11-30 16:36:37
二、linux下find命令的用法
1. 基本用法:
find / -name 文件名
find ver1.d ver2.d -name '*.c' -print 查找ver1.d,ver2.d *.c文件并打印 find . -type d -print 從當前目錄查找,僅查找目錄,找到后,打印路徑名。可用于打印目錄結(jié)構(gòu)。
2. 無錯誤查找:
find / -name access_log 2 >/dev/null
3. 按尺寸查找:
find / -size 1500c (查找1,500字節(jié)大小的文件,c表示字節(jié))
find / -size +1500c (查找大于1,500字節(jié)大小的文件,+表示大于)
find / -size +1500c (查找小于1,500字節(jié)大小的文件,-表示小于)
4. 按時間:
find / -amin n 最后n分鐘
find / -atime n 最后n天
find / -cmin n 最后n分鐘改變狀態(tài)
find / -ctime n 最后n天改變狀態(tài)
5. 其它:
find / -empty 空白文件、空白文件夾、沒有子目錄的文件夾
find / -false 查找
系統(tǒng)中總是錯誤的文件
find / -fstype type 找存在于指定文件
系統(tǒng)的文件,如type為ext2
find / -gid n 組id為n的文件
find / -group gname 組名為gname的文件
find / -depth n 在某層指定目錄中優(yōu)先查找文件內(nèi)容
find / -maxdepth levels 在某個層次目錄中按遞減方式查找
6. 邏輯
-and 條件與 -or 條件或
7. 查找字符串
find . -name '*.html' -exec grep 'mailto:'{}
ln是linux中又一個非常重要命令,它的功能是為某一個文件在另外一個位置建立一個同不的鏈接,這個命令最常用的參數(shù)是-s,具體用法是:ln –s 源文件 目標文件。
當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄,放上該文件,然后在 其它的目錄下用ln命令鏈接(link)它就可以,不必重復(fù)的占用磁盤空間。例如:ln –s /bin/less /usr/local/bin/less
-s 是代號(symbolic)的意思。
這里有兩點要注意:第一,ln命令會保持每一處鏈接文件的同步性,也就是說,不論你改動了哪一處,其它的文件都會發(fā)生相同的變化;第二,ln的鏈接又 軟鏈接和硬鏈接兩種,軟鏈接就是ln –s ** **,它只會在你選定的位置上生成一個文件的鏡像,不會占用磁盤空間,硬鏈接ln ** **,沒有參數(shù)-s, 它會在你選定的位置上生成一個和源文件大小相同的文件,無論是軟鏈接還是硬鏈接,文件都保持同步變化。
如果你用ls察看一個目錄時,發(fā)現(xiàn)有的文件后面有一個@的符號,那就是一個用ln命令生成的文件,用ls –l命令去察看,就可以看到顯示的link的路徑了。
指令詳細說明
指令名稱 : ln
使用權(quán)限 : 所有使用者
使用方式 : ln [options] source dist,其中 option 的格式為 :
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[--help] [--version] [--]
說明 : Linux/Unix 檔案系統(tǒng)中,有所謂的連結(jié)(link),我們可以將其視為檔案的別名,而連結(jié)又可分為兩種 : 硬連結(jié)(hard link)與軟連結(jié)(symbolic link),硬連結(jié)的意思是一個檔案可以有多個名稱,而軟連結(jié)的方式則是產(chǎn)生一個特殊的檔案,該檔案的內(nèi)容是指向另一個檔案的位置。硬連結(jié)是存在同一個檔 案系統(tǒng)中,而軟連結(jié)卻可以跨越不同的檔案系統(tǒng)。
ln source dist 是產(chǎn)生一個連結(jié)(dist)到 source,至于使用硬連結(jié)或軟鏈結(jié)則由參數(shù)決定。
不論是硬連結(jié)或軟鏈結(jié)都不會將原本的檔案復(fù)制一份,只會占用非常少量的磁碟空間。
-f : 鏈結(jié)時先將與 dist 同檔名的檔案刪除
-d : 允許系統(tǒng)管理者硬鏈結(jié)自己的目錄
-i : 在刪除與 dist 同檔名的檔案時先進行詢問
-n : 在進行軟連結(jié)時,將 dist 視為一般的檔案
-s : 進行軟鏈結(jié)(symbolic link)
-v : 在連結(jié)之前顯示其檔名
-b : 將在鏈結(jié)時會被覆寫或刪除的檔案進行備份
-S SUFFIX : 將備份的檔案都加上 SUFFIX 的字尾
-V METHOD : 指定備份的方式
--help : 顯示輔助說明
--version : 顯示版本
范例 :
將檔案 yy 產(chǎn)生一個 symbolic link : zz
ln -s yy zz
將檔案 yy 產(chǎn)生一個 hard link : zz
ln yy xx
1.Linux的變量種類
按變量的生存周期來劃分,Linux變量可分為兩類:
1.1 永久的:需要修改配置文件,變量永久生效。
1.2 臨時的:使用export命令聲明即可,變量在關(guān)閉shell時失效。
Linux 的變量可分為兩類:環(huán)境變量和本地變量
環(huán)境變量,或者稱為全局變量,存在與所有的shell 中,在你登陸系統(tǒng)的時候就已經(jīng)有了相應(yīng)的系統(tǒng)定義的環(huán)境變量了。Linux 的環(huán)境變量具有繼承性,即子shell 會繼承父shell 的環(huán)境變量。
本地變量,當前shell 中的變量,很顯然本地變量中肯定包含環(huán)境變量。Linux 的本地變量的非環(huán)境變量不具備繼承性。
Linux 中環(huán)境變量的文件
當你進入系統(tǒng)的時候,linux 就會為你讀入系統(tǒng)的環(huán)境變量,這些環(huán)境變量存放在什么地方,那就是環(huán)境變量的文件中。Linux 中有很多記載環(huán)境變量的文件,它們被系統(tǒng)讀入是按照一定的順序的。
1. /etc/profile :
此文件為系統(tǒng)的環(huán)境變量,它為每個用戶設(shè)置環(huán)境信息,當用戶第一次登錄時,該文件被執(zhí)行。
2.設(shè)置變量的三種方法
2.1 在/etc/profile文件中添加變量【對所有用戶生效(永久的)】
用VI在文件/etc/profile文件中增加變量,該變量將會對Linux下所有用戶有效,并且是“永久的”。
例如:編輯/etc/profile文件,添加CLASSPATH變量
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想馬上生效還要運行# source /etc/profile不然只能在下次重進此用戶時生效。
2.2 在用戶目錄下的.bash_profile文件中增加變量【對單一用戶生效(永久的)】
用VI在用戶目錄下的.bash_profile文件中增加變量,改變量僅會對當前用戶有效,并且是“永久的”。
例如:編輯guok用戶目錄(/home/guok)下的.bash_profile
$ vi /home/guok/.bash.profile
添加如下內(nèi)容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想馬上生效還要運行$ source /home/guok/.bash_profile不然只能在下次重進此用戶時生效。
2.3 直接運行export命令定義變量【只對當前shell(BASH)有效(臨時的)】
在shell的命令行下直接使用[export 變量名=變量值]
定義變量,該變量只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關(guān)閉了,變量也就失效了,再打開新shell時就沒有這個變量,需要使用的話還需要重新定義。
3.環(huán)境變量的查看
3.1 使用echo命令查看單個環(huán)境變量。例如:
echo $PATH
3.2 使用env查看所有環(huán)境變量。例如:
env
3.3 使用set查看所有本地定義的環(huán)境變量。
unset可以刪除指定的環(huán)境變量。
4.常用的環(huán)境變量
PATH 決定了shell將到哪些目錄中尋找命令或程序
HOME 當前用戶主目錄
HISTSIZE 歷史記錄數(shù)
LOGNAME 當前用戶的登錄名
HOSTNAME 指主機的名稱
SHELL 當前用戶Shell類型
LANGUGE 語言相關(guān)的環(huán)境變量,多語言可以修改此環(huán)境變量
MAIL 當前用戶的郵件存放目錄
PS1 基本提示符,對于root用戶是#,對于普通用戶是$
指令名稱 : chmod
使用權(quán)限 : 所有使用者
使用方式 : chmod [-cfvR] [--help] [--version] mode file...
說明 : Linux/Unix 的檔案存取權(quán)限分為三級 : 檔案擁有者、群組、其他。利用 chmod 可以控制檔案如何被他人所存取。
只能文件屬主或特權(quán)用戶才能使用該功能來改變文件存取模式。mode可以是數(shù)字形式或以who opcode permission形式表示。who是可選的,默認是a(所有用戶)。只能選擇一個opcode(操作碼)。可指定多個mode,以逗號分開。
options:
-c,--changes
只輸出被改變文件的信息
-f,--silent,--quiet
當chmod不能改變文件模式時,不通知文件的用戶
--help
輸出幫助信息。
-R,--recursive
可遞歸遍歷子目錄,把修改應(yīng)到目錄下所有文件和子目錄
--reference=filename
參照filename的權(quán)限來設(shè)置權(quán)限
-v,--verbose
無論修改是否成功,輸出每個文件的信息
--version
輸出版本信息。
who
u
用戶
g
組
o
其它
a
所有用戶(默認)
opcode
+
增加權(quán)限
-
刪除權(quán)限
=
重新分配權(quán)限
permission
r
讀
w
寫
x
執(zhí)行
s
設(shè)置用戶(或組)的ID號
t
設(shè)置粘著位(sticky bit),防止文件或目錄被非屬主刪除
u
用戶的當前權(quán)限
g
組的當前權(quán)限
o
其他用戶的當前權(quán)限
作為選擇,我們多數(shù)用三位八進制數(shù)字的形式來表示權(quán)限,第一位指定屬主的權(quán)限,第二位指定組權(quán)限,第三位指定其他用戶的權(quán)限,每位通過4(讀)、2(寫)、1(執(zhí)行)三種數(shù)值的和來確定權(quán)限。如6(4+2)代表有讀寫權(quán),7(4+2+1)有讀、寫和執(zhí)行的權(quán)限。
還可設(shè)置第四位,它位于三位權(quán)限序列的前面,第四位數(shù)字取值是4,2,1,代表意思如下:
4,執(zhí)行時設(shè)置用戶ID,用于授權(quán)給基于文件屬主的進程,而不是給創(chuàng)建此進程的用戶。
2,執(zhí)行時設(shè)置用戶組ID,用于授權(quán)給基于文件所在組的進程,而不是基于創(chuàng)建此進程的用戶。
1,設(shè)置粘著位。
實例:
$ chmod u+x file 給file的屬主增加執(zhí)行權(quán)限
$ chmod 751 file 給file的屬主分配讀、寫、執(zhí)行(7)的權(quán)限,給file的所在組分配讀、執(zhí)行(5)的權(quán)限,給其他用戶分配執(zhí)行(1)的權(quán)限
$ chmod u=rwx,g=rx,o=x file 上例的另一種形式
$ chmod =r file 為所有用戶分配讀權(quán)限
$ chmod 444 file 同上例
$ chmod a-wx,a+r file 同上例
$ chmod -R u+r directory 遞歸地給directory目錄下所有文件和子目錄的屬主分配讀的權(quán)限
$ chmod 4755 設(shè)置用ID,給屬主分配讀、寫和執(zhí)行權(quán)限,給組和其他用戶分配讀、執(zhí)行的權(quán)限。
指令名稱 : chown
使用權(quán)限 : root
使用方式 : chown[-cfhvR] [--help] [--version] user[:group] file...
說明 : Linux/Unix 是多人多工作業(yè)系統(tǒng),所有的檔案皆有擁有者。利用 chown 可以將檔案的擁有者加以改變。一般來說,這個指令只有是由系統(tǒng)管理者(root)所使用,一般使用者沒有權(quán)限可以改變別人的檔案擁有者,也沒有權(quán)限可以自己的檔案擁有者改設(shè)為別人。只有系統(tǒng)管理者(root)才有這樣的權(quán)限。
基于spring開發(fā)了個自定義標簽,功能測試正常,在myeclipse中提示編譯錯誤:
Multiple annotations found at this line:
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'fw:annotation-handler'.
- schema_reference.4: Failed to read schema document 'http://www.300.cn/schema/annotation-handler.xsd', because 1) could not find the
document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
這個問題在以前改動struts配置文件的時候也出現(xiàn)過。在引入一些第三方j(luò)ar容易出現(xiàn)這個問題。
雖然不影響使用,但是看著挺討厭的,找了一下解決方法。
菜單-->windows-->prefreneces 找到XML Catalog,在User Specified Entries添加xsd文件
有兩個地方要注意:
1.Key type設(shè)置為Schema location;
2.key 設(shè)置虛擬xsd地址,即
xsi:schemaLocation=" http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd“
名稱對后邊的這一個。
自從搬到東邊住以后就很少去海淀圖書城了,因為想?yún)⒓?1月的軟考,端午去海圖找本考試大綱。
前幾年去海圖的時候,java方面的圖書都放在最顯眼的地方,能占好幾排書架,現(xiàn)在已經(jīng)被andriod、ios取代。找了一圈才在一個不起眼的角落找到j(luò)ava系列圖書。c/c++這樣的書倒不見減少,比印象中還有增加。
從書市上看java最風(fēng)光的時候已經(jīng)過去了,一直做java方面的開發(fā),對這方面的變化不敏感,還是賣書的對市場感受更直接。
各領(lǐng)風(fēng)騷好幾年。
這幾天抽空看了本《問題分析與決策》,蘭德公司出版的,就是那個預(yù)言中國將出兵朝鮮的公司。挺好的一本書,不知道為什么中文版的特別少,找了半天。
老外做研究的風(fēng)格,很少那種大而無當?shù)目赵挘瑢栴}分析的過程和分析者的心理活動做了大量研究工作。
我做過一段時間的系統(tǒng)分析工作,書中有些觀點讓人看起來心有戚戚焉,還有部分觀點是自己沒想到的,讀后很是能解惑。
做些簡單摘錄
很多人采用的處理問題與決策的辦法,根本沒有多大用處,甚至完全沒有用處。
引言蘭德提出這種問題分析方法的思路,從一個公司的某一個問題著手,追溯到解決這一問題的程序,仔細剖視每一步驟中的思想過程。
根據(jù)這些研究得出了很多概念和方法,認為問題分析與決策時管理上的行為,必須自覺和有系統(tǒng)的去做。
而且必要的話,還應(yīng)該記錄下來。
分析問題是一項依照邏輯體系而進行的程序,首先是確定問題,然后是經(jīng)過分析以及尋求原因,最后做決定。
每個階段包括若干基本的概念,其中一項基本概念是,一個問題乃是一件事“應(yīng)該怎么樣”和“事實上是怎么樣的”兩者之間的偏差。
另一項概念是,這種偏差是由于某一種“變化”二造成的。除非先把這一變化準確的予以確定,否則一切糾正這一偏差的措施都只是揣測而已。
概念與方法
問題分析的兩個主要概念:
1.每個問題都是標準的預(yù)期效果所發(fā)生的偏差;
2.某種變化是造成這一問題的根本原因。
分析問題的七項基本概念
1.有標準;
2.問題就是情況與標準之間的偏差
3.偏差要準確的認定
4.分析問題的獨特性,受影響和沒受影響部分各有什么特點,區(qū)分開來;
5.只考慮與特殊變化有關(guān)的情況,通過界定問題范圍找出原因。
6.造成偏差的原因是從分析問題時發(fā)現(xiàn)的變化中推導(dǎo)出來的 。
7.最可能造成偏差的原因,是能解釋界定范圍內(nèi)一切事實的那一項原因。
如何界定一個問題1.什么;2時間;3.地點4.幅度
如何尋求特點與變化
任何問題發(fā)生的原因,乃是一種變化;這種變化的影響是有限度的,只在某些地方有影響,在其他地方?jīng)]有影響。
這種變化,只存在于特定的范圍之內(nèi),或者只發(fā)生與那些可以區(qū)分出問題的“是”的一面某些因素上。
因此,要追究什么樣的變化會發(fā)生某一種影響,最有效的方法是只尋求那些僅存在于界定問題時所發(fā)現(xiàn)的各項特點的變化。
我們要找出來把事物區(qū)分開來的因素,分析問題的人必須從事物的不同點去思考。
(么東西出了問題,不是什么出了問題,減小范圍)
發(fā)生變化的線索就在,區(qū)分“是”與“不是”的特點中。
能看出特點與變化的能力是智慧的主要表現(xiàn)之一,在問題分析上是非常重要的。
一個問題的形成可能受許多因素的影響,但是真正動搖了事態(tài)均衡而引發(fā)問題的卻只有一種變化。
事先不界定問題和研求特點,一發(fā)現(xiàn)某項變化立即斷定這就是問題的原因所在是很危險的。
決策分析1.訂立決策的目標;
2.依據(jù)重要性將目標分類;
3.擬定可供選擇的措施;
4.把各種可行的辦法與目標加以對照衡量;
5.選擇最好的辦法作為暫時決策;
6.研究決策是否會有不良影響;
7.同時采取防止不良后果的措施。
之前做過一版工作流引擎,自己開發(fā)的。這段時間又以jbpm為內(nèi)核做了一版流程系統(tǒng),有些思考就記錄下來。
有一句話說的好,如果你手里有一把錘子你就看什么都像釘子。做流程系統(tǒng)的時候也遇到這類現(xiàn)象,因為對流程系統(tǒng)的不熟悉,在開發(fā)過程中就想到處都用工作流來處理問題。
其實引入一個新的東西,一定要先搞明白的它的適用場景,有什么價值。把握了這點后結(jié)合具體場景,就能很好的使用,而不會亂用。
一、工作流適用場景
以下兩種情況需要引入流程系統(tǒng)
1.分散系統(tǒng)整合(企業(yè)應(yīng)用集成)
2.簡化業(yè)務(wù)系統(tǒng)的開發(fā);
工作流的價值
1.業(yè)務(wù)流程獨立化;
2.優(yōu)化改進流程更容易;
3.提供統(tǒng)一的監(jiān)控頁面。
Ⅰ 、相對于分散系統(tǒng),提供了統(tǒng)一的操作和監(jiān)控頁面。對用戶更友好,過程可監(jiān)控,業(yè)務(wù)規(guī)則更明確。
1.業(yè)務(wù)流程獨立化,業(yè)務(wù)規(guī)則不僅僅存在與工作人員的頭腦中。
2.提供了統(tǒng)一的監(jiān)控界面,實現(xiàn)業(yè)務(wù)過程可監(jiān)控;
3.有明確的規(guī)則,可以監(jiān)控運行情況,為流程的優(yōu)化提供了便利;
4.對用戶更友好;
Ⅱ 、相對于傳統(tǒng)業(yè)務(wù)系統(tǒng)方式
1.業(yè)務(wù)流程獨立化,業(yè)務(wù)規(guī)則不會淹沒于業(yè)務(wù)系統(tǒng)代碼中。避免業(yè)務(wù)系統(tǒng)開發(fā)完成后再次改動成本高的情況。
2.提供了統(tǒng)一的監(jiān)控界面,實現(xiàn)業(yè)務(wù)過程可監(jiān)控;原業(yè)務(wù)系統(tǒng)提供的報表對環(huán)節(jié)執(zhí)行時間可能信息不足,一般只是簡單反應(yīng)狀態(tài)變化。
3.有明確的規(guī)則,可以監(jiān)控運行情況,為流程的優(yōu)化提供了便利;
4.對于工作人員來講,這些改進其實是透明的,從用戶體驗的角度沒有什么變化。
所以對原業(yè)務(wù)系統(tǒng)的用戶來講,變化不大。引入流程系統(tǒng)更多的是為了監(jiān)控和優(yōu)化流程的方便,是從管理的角度考慮問題。
從流程系統(tǒng)提供的待辦事項列表進行操作,還是從業(yè)務(wù)系統(tǒng)的功能菜單進行操作,哪個更友好是UE設(shè)計的問題,跟流程系統(tǒng)無關(guān)。
業(yè)務(wù)系統(tǒng)功能菜單的劃分可能相對于待辦事項列表更直觀、定位更準確。(見下圖紅色箭頭對兩種方式的表示)
考慮到業(yè)務(wù)流程的復(fù)雜性,對于企業(yè)信息化系統(tǒng)引入流程系統(tǒng)可以便于優(yōu)化流程,對于成熟的業(yè)務(wù)系統(tǒng)如財務(wù)軟件引入流程系統(tǒng)完全沒有必要。
補充說明:
1.當前任務(wù)列表方式,需要用戶不停的查看有沒有新任務(wù)到來;優(yōu)點是在一個頁面可以看到全部待辦事項。
2.業(yè)務(wù)系統(tǒng)功能菜單方式,需要用戶不停的查詢工作進展并作出處理。優(yōu)點是任務(wù)類型劃分更明確;
二、業(yè)務(wù)系統(tǒng)接入方式
1.在jsp頁面增加環(huán)節(jié)信息(環(huán)節(jié)編號,流程編號...);
2.業(yè)務(wù)系統(tǒng)aciton不變;
3.在業(yè)務(wù)系統(tǒng)action完成操作后,流程攔截器處理流程變化并記錄到數(shù)據(jù)庫;
4.流程監(jiān)控頁面和待辦事項列表,不斷從流程數(shù)據(jù)庫查詢。
5.對于專業(yè)性比價強的的狀態(tài)值還是在業(yè)務(wù)系統(tǒng)維護,避免流程系統(tǒng)壓力過大。在需要監(jiān)控改進的業(yè)務(wù)點交由流程系統(tǒng)調(diào)度,其它部分還是由業(yè)務(wù)系統(tǒng)處理。
--------------------------------------
下邊是對struts項目接入流程系統(tǒng)的一個分析
1.業(yè)務(wù)系統(tǒng)jsp,action調(diào)用關(guān)系

2.采用攔截器在業(yè)務(wù)系統(tǒng)action執(zhí)行完成后,進行流程驅(qū)動,并在下一個jsp頁面注入流程信息。

主要邏輯都在beforeResult()方法中。3.數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)說明:
1.對于通用的流程數(shù)據(jù)可以在beforeResult()方法自動嵌入,為考慮交互效果在jsp自行設(shè)置流程信息;
2.jsp頁面流程數(shù)據(jù)應(yīng)該包括:
1.nodeName
節(jié)點名稱,環(huán)節(jié)在流程定義中的名稱;
2.transitionNames
流向名稱列表,需要作出選擇的列表。
3.entityId
實體id,用于查詢流程實例ID。
3.在action執(zhí)行完成后驅(qū)動流程所需要的數(shù)據(jù):
1.definitionId
流程定義,說明是新啟動一個流程。
2.nodeName
節(jié)點名稱,根據(jù)流程實例ID和節(jié)點名稱查詢?nèi)蝿?wù)ID,每個節(jié)點只能是單任務(wù)的,否則jsp頁面無法提供taskId.
3.transitionName
流向名稱,根據(jù)流向選擇流程下一步跳轉(zhuǎn)的節(jié)點。串行節(jié)點不用transitionName 可為空。
4.entityId
實體id,查詢流程實例ID用。
4.對與工作流無關(guān)的action實行過濾,不做處理。
兩種過濾方式:
1.在action方法加注解;
2.在數(shù)據(jù)結(jié)構(gòu)中增加數(shù)據(jù)項標記。
5.對與工作流無關(guān)的jsp頁面,不使用工作流tag即可。
-----------------------------
上邊是我一開始的想法,后來和同事討論后又做了些調(diào)整。編輯web文字比較麻煩,就不合在一起了。
1.對執(zhí)行業(yè)務(wù)操作的action和進入jsp頁面的初始化action進行分類;

2.參數(shù)傳遞過程補充說明

一個分為三步
倒著說
第三步,功能頁面jsp在提交參數(shù)時需附加(節(jié)點名稱、流向名稱、工單編號),流程引擎才能驅(qū)動流程;
第二步,要能夠向第三步提供數(shù)據(jù),jsp頁面必須包含(節(jié)點名稱、流向名稱列表、工單編號),這些數(shù)據(jù)有兩個來源:1.收到在jsp頁面寫入;2.從第一步接收。
第一步,有同事建議,提供節(jié)點和資源路徑的關(guān)系表,通過資源路徑查找節(jié)點名稱。減少流程系統(tǒng)對業(yè)務(wù)系統(tǒng)的侵入。
----------------------------------
上傳的時候圖片丟了,重新補一下。
今天抽空整理些有關(guān)rest方面的理論。主要參考了幾篇網(wǎng)上的文章,做了些整理,原文見附錄。
一、起源
越來越多的人開始意識到,網(wǎng)站即軟件,而且是一種新型的軟件。
這種"互聯(lián)網(wǎng)軟件"采用客戶端/服務(wù)器模式,建立在分布式體系上,通過互聯(lián)網(wǎng)通信,具有高延時(high latency)、高并發(fā)等特點。
網(wǎng)站開發(fā),完全可以采用軟件開發(fā)的模式。但是傳統(tǒng)上,軟件和網(wǎng)絡(luò)是兩個不同的領(lǐng)域,很少有交集;軟件開發(fā)主要針對單機環(huán)境,網(wǎng)絡(luò)則主要研究系統(tǒng)之間的通信。互聯(lián)網(wǎng)的興起,使得這兩個領(lǐng)域開始融合,現(xiàn)在我們必須考慮,如何開發(fā)在互聯(lián)網(wǎng)環(huán)境中使用的軟件。
RESTful架構(gòu),就是一種互聯(lián)網(wǎng)軟件架構(gòu)。它結(jié)構(gòu)清晰、符合標準、易于理解、擴展方便,所以正得到越來越多網(wǎng)站的采用。
二、名稱
Fielding將他對互聯(lián)網(wǎng)軟件的架構(gòu)原則,定名為REST,即Representational State Transfer的縮寫。我對這個詞組的翻譯是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。
如果一個架構(gòu)符合REST原則,就稱它為RESTful架構(gòu)。
要理解RESTful架構(gòu),最好的方法就是去理解Representational State Transfer這個詞組到底是什么意思,它的每一個詞代表了什么涵義。如果你把這個名稱搞懂了,也就不難體會REST是一種什么樣的設(shè)計。
三、資源(Resources)
REST的名稱"表現(xiàn)層狀態(tài)轉(zhuǎn)化"中,省略了主語。"表現(xiàn)層"其實指的是"資源"(Resources)的"表現(xiàn)層"。
所謂"資源",就是網(wǎng)絡(luò)上的一個實體,或者說是網(wǎng)絡(luò)上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務(wù),總之就是一個具體的實在。你可以用一個URI(統(tǒng)一資源定位符)指向它,每種資源對應(yīng)一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。
所謂"上網(wǎng)",就是與互聯(lián)網(wǎng)上一系列的"資源"互動,調(diào)用它的URI。
四、表現(xiàn)層(Representation)
"資源"是一種信息實體,它可以有多種外在表現(xiàn)形式。我們把"資源"具體呈現(xiàn)出來的形式,叫做它的"表現(xiàn)層"(Representation)。
比如,文本可以用txt格式表現(xiàn),也可以用HTML格式、XML格式、JSON格式表現(xiàn),甚至可以采用二進制格式;圖片可以用JPG格式表現(xiàn),也可以用PNG格式表現(xiàn)。
URI只代表資源的實體,不代表它的形式。嚴格地說,有些網(wǎng)址最后的".html"后綴名是不必要的,因為這個后綴名表示格式,屬于"表現(xiàn)層"范疇,而URI應(yīng)該只代表"資源"的位置。它的具體表現(xiàn)形式,應(yīng)該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段才是對"表現(xiàn)層"的描述。
五、狀態(tài)轉(zhuǎn)化(State Transfer)
訪問一個網(wǎng)站,就代表了客戶端和服務(wù)器的一個互動過程。在這個過程中,勢必涉及到數(shù)據(jù)和狀態(tài)的變化。
互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議,是一個無狀態(tài)協(xié)議。這意味著,所有的狀態(tài)都保存在服務(wù)器端。因此,如果客戶端想要操作服務(wù)器,必須通過某種手段,讓服務(wù)器端發(fā)生"狀態(tài)轉(zhuǎn)化"(State Transfer)。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的,所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。
客戶端用到的手段,只能是HTTP協(xié)議。具體來說,就是HTTP協(xié)議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應(yīng)四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來刪除資源。
六、綜述
綜合上面的解釋,我們總結(jié)一下什么是RESTful架構(gòu):
(1)每一個URI代表一種資源;
(2)客戶端和服務(wù)器之間,傳遞這種資源的某種表現(xiàn)層;
(3)客戶端通過四個HTTP動詞,對服務(wù)器端資源進行操作,實現(xiàn)"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。
REST關(guān)鍵原則
一個簡單扼要的定義:REST定義了應(yīng)該如何正確地使用Web標準,例如HTTP和URI。如果你在設(shè)計應(yīng)用程序時能堅持REST原則,那就預(yù)示著你將會得到一個使用了優(yōu)質(zhì)Web架構(gòu)(這將讓你受益)的系統(tǒng)。總之,五條關(guān)鍵原則列舉如下:
- 為所有“事物”定義ID
- 將所有事物鏈接在一起
- 使用標準方法
- 資源多重表述
- 無狀態(tài)通信
為所有“事物”定義ID
在這里我使用了“事物”來代替更正式準確的術(shù)語“資源”,因為一條如此簡單的原則,不應(yīng)該被淹沒在術(shù)語當中。思考一下人們構(gòu)建的系統(tǒng),通常會找到一系列值得被標識的關(guān)鍵抽象。每個事物都應(yīng)該是可標識的,都應(yīng)該擁有一個明顯的ID——在Web中,代表ID的統(tǒng)一概念是:URI。URI構(gòu)成了一個全局命名空間,使用URI標識你的關(guān)鍵資源意味著它們獲得了一個唯一、全局的ID。
值得被URI標識的事物——資源——要比數(shù)據(jù)庫記錄抽象的多。標識所有值得標識的事物,領(lǐng)會這個觀念可以進一步引導(dǎo)你創(chuàng)造出在傳統(tǒng)的應(yīng)用程序設(shè)計中不常見的資源:一個流程或者流程步驟、一次銷售、一次談判、一份報價請求——這都是應(yīng)該被標識的事物的示例。
將所有事物鏈接在一起
接下來要討論的原則有一個有點令人害怕的正式描述:“超媒體被當作應(yīng)用狀態(tài)引擎(Hypermedia as the engine of application state)”,有時簡寫為HATEOAS。(嚴格地說,這不是我說的。)這個描述的核心是超媒體概念,換句話說:是鏈接的思想。鏈接是我們在HTML中常見的概念,但是它的用處絕不局限于此(用于人們網(wǎng)絡(luò)瀏覽)。
使用標準方法
在前兩個原則的討論中暗含著一個假設(shè):接收URI的應(yīng)用程序可以通過URI明確地做一些有意義的事情。如果你在公共汽車上看到一個URI,你可以將它輸入瀏覽器的地址欄中并回車——但是你的瀏覽器如何知道需要對這個URI做些什么呢?
它知道如何去處理URI的原因在于所有的資源都支持同樣的接口,一套同樣的方法(只要你樂意,也可以稱為操作)集合。在HTTP中這被叫做動詞(verb),除了兩個大家熟知的(GET和POST)之外,標準方法集合中還包含PUT、DELETE、HEAD和OPTIONS。這些方法的含義連同行為許諾都一起定義在HTTP規(guī)范之中。
資源多重表述
在實踐中,資源多重表述還有著其它重要的好處:如果你為你的資源提供HTML和XML兩種表述方式,那這些資源不僅可以被你的應(yīng)用所用,還可以被任意標準Web瀏覽器所用——也就是說,你的應(yīng)用信息可以被所有會使用Web的人獲取到。
無狀態(tài)通信
首先,需要著重強調(diào)的是,雖然REST包含無狀態(tài)性(statelessness)的觀念,但這并不是說暴露功能的應(yīng)用不能有狀態(tài)——
事實上,在大部分情況下這會導(dǎo)致整個做法沒有任何用處。REST要求狀態(tài)要么被放入資源狀態(tài)中,要么保存在客戶端上。
或者換句話說,服務(wù)器端不能保持除了單次請求之外的,任何與其通信的客戶端的通信狀態(tài)。這樣做的最直接的理由就是可伸縮性—— 如果服務(wù)器需要保持客戶端狀態(tài),那么大量的客戶端交互會嚴重影響服務(wù)器的內(nèi)存可用空間(footprint)。(注意,要做到無狀態(tài)通信往往需要需要一些重新設(shè)計——不能簡單地將一些session狀態(tài)綁縛在URI上,然后就宣稱這個應(yīng)用是RESTful。)
但除此以外,其它方面可能顯得更為重要:無狀態(tài)約束使服務(wù)器的變化對客戶端是不可見的,因為在兩次連續(xù)的請求中,客戶端并不依賴于同一臺服務(wù)器。一個客戶端從某臺服務(wù)器上收到一份包含鏈接的文檔,當它要做一些處理時,這臺服務(wù)器宕掉了,可能是硬盤壞掉而被拿去修理,可能是軟件需要升級重啟——如果這個客戶端訪問了從這臺服務(wù)器接收的鏈接,它不會察覺到后臺的服務(wù)器已經(jīng)改變了。
REST風(fēng)格的一個“化身”便是HTTP(以及一套相關(guān)的一套標準,比如URI)。
附錄:
1.深入淺出REST
http://www.infoq.com/cn/articles/rest-introduction2.理解Restful 架構(gòu)
http://www.ruanyifeng.com/blog/2011/09/restful.html3.Rest和soap比較
http://www.infoq.com/cn/articles/rest-soap-when-to-use-each4.Rest和Rpc比較
http://xinklabi.iteye.com/blog/807220
定時程序時間格式,原文見http://blog.csdn.net/remote_roamer/article/details/6573173
一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。
按順序依次為
秒(0~59)
分鐘(0~59)
小時(0~23)
天(月)(0~31,但是你需要考慮你月的天數(shù))
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,F(xiàn)RI,SAT)
7.年份(1970-2099)
其中每個元素可以是一個值(如6),一個連續(xù)區(qū)間(9-12),一個間隔時間(8-18/4)(/表示每隔4小時),一個列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"這兩個元素互斥的,必須要對其中一個設(shè)置?.
0 0 10,14,16 * * ? 每天上午10點,下午2點,4點
0 0/30 9-17 * * ? 朝九晚五工作時間內(nèi)每半小時
0 0 12 ? * WED 表示每個星期三中午12點
"0 0 12 * * ?" 每天中午12點觸發(fā)
"0 15 10 ? * *" 每天上午10:15觸發(fā)
"0 15 10 * * ?" 每天上午10:15觸發(fā)
"0 15 10 * * ? *" 每天上午10:15觸發(fā)
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)
"0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發(fā)
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā)
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā)
"0 15 10 15 * ?" 每月15日上午10:15觸發(fā)
"0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā)
"0 15 10 ? * 6L" 每月的最后一個星期五上午10:15觸發(fā)
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發(fā)
有些子表達式能包含一些范圍或列表
例如:子表達式(天(星期) )可以為 “MON-FRI”,“MON,WED,F(xiàn)RI”,“MON-WED,SAT”
“*”字符代表所有可能的值
因此,“*”在子表達式(月 )里表示每個月的含義,“*”在子表達式(天(星期) )表示星期的每一天
“/”字符用來指定數(shù)值的增量
例如:在子表達式(分鐘)里的“0/15”表示從第0分鐘開始,每15分鐘
在子表達式(分鐘)里的“3/20”表示從第3分鐘開始,每20分鐘(它和“3,23,43”)的含義一樣
“?”字符僅被用于天(月)和天(星期)兩個子表達式,表示不指定值
當2個子表達式其中之一被指定了值以后,為了避免沖突,需要將另一個子表達式的值設(shè)為“?”
“L” 字符僅被用于天(月)和天(星期)兩個子表達式,它是單詞“last”的縮寫
但是它在兩個子表達式里的含義是不同的。
在天(月)子表達式中,“L”表示一個月的最后一天
在天(星期)自表達式中,“L”表示一個星期的最后一天,也就是SAT
如果在“L”前有具體的內(nèi)容,它就具有其他的含義了
例如:“6L”表示這個月的倒數(shù)第6天,“FRIL”表示這個月的最一個星期五
注意:在使用“L”參數(shù)時,不要指定列表或范圍,因為這會導(dǎo)致問題
字段 |
|
允許值 |
|
允許的特殊字符 |
秒 |
|
0-59 |
|
, - * / |
分 |
|
0-59 |
|
, - * / |
小時 |
|
0-23 |
|
, - * / |
日期 |
|
1-31 |
|
, - * ? / L W C |
月份 |
|
1-12 或者 JAN-DEC |
|
, - * / |
星期 |
|
1-7 或者 SUN-SAT |
|
, - * ? / L C # |
年(可選) |
|
留空, 1970-2099 |
|
, - * / |