2012年9月26日
# uname -a # 查看內(nèi)核/操作系統(tǒng)/CPU信息 # head -n 1 /etc/issue # 查看操作系統(tǒng)版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看計(jì)算機(jī)名 # lspci -tv # 列出所有PCI設(shè)備 # lsusb -tv # 列出所有USB設(shè)備 # lsmod # 列出加載的內(nèi)核模塊 # env # 查看環(huán)境變量資源 # free -m # 查看內(nèi)存使用量和交換區(qū)使用量 # df -h # 查看各分區(qū)使用情況 # du -sh <目錄名> # 查看指定目錄的大小 # grep MemTotal /proc/meminfo # 查看內(nèi)存總量 # grep MemFree /proc/meminfo # 查看空閑內(nèi)存量 # uptime # 查看系統(tǒng)運(yùn)行時(shí)間、用戶數(shù)、負(fù)載 # cat /proc/loadavg # 查看系統(tǒng)負(fù)載磁盤和分區(qū) # mount | column -t # 查看掛接的分區(qū)狀態(tài) # fdisk -l # 查看所有分區(qū) # swapon -s # 查看所有交換分區(qū) # hdparm -i /dev/hda # 查看磁盤參數(shù)(僅適用于IDE設(shè)備) # dmesg | grep IDE # 查看啟動(dòng)時(shí)IDE設(shè)備檢測狀況網(wǎng)絡(luò) # ifconfig # 查看所有網(wǎng)絡(luò)接口的屬性 # iptables -L # 查看防火墻設(shè)置 # route -n # 查看路由表 # netstat -lntp # 查看所有監(jiān)聽端口 # netstat -antp # 查看所有已經(jīng)建立的連接 # netstat -s # 查看網(wǎng)絡(luò)統(tǒng)計(jì)信息進(jìn)程 # ps -ef # 查看所有進(jìn)程 # top # 實(shí)時(shí)顯示進(jìn)程狀態(tài)用戶 # w # 查看活動(dòng)用戶 # id <用戶名> # 查看指定用戶信息 # last # 查看用戶登錄日志 # cut -d: -f1 /etc/passwd # 查看系統(tǒng)所有用戶 # cut -d: -f1 /etc/group # 查看系統(tǒng)所有組 # crontab -l # 查看當(dāng)前用戶的計(jì)劃任務(wù)服務(wù) # chkconfig –list # 列出所有系統(tǒng)服務(wù) # chkconfig –list | grep on # 列出所有啟動(dòng)的系統(tǒng)服務(wù)程序 # rpm -qa # 查看所有安裝的軟件包
這篇文章清晰的講述了繼承, 實(shí)現(xiàn), 依賴, 關(guān)聯(lián),組合的概念及他們之間的關(guān)系,以下是原文內(nèi)容:
這是一堂關(guān)于UML基礎(chǔ)知識(shí)的補(bǔ)習(xí)課;現(xiàn)在我們做項(xiàng)目時(shí)間都太緊了,基本上都沒有做過真正的class級(jí)別的詳細(xì)設(shè)計(jì),更別提使用UML來實(shí)現(xiàn)規(guī)范建模了;本篇主要就以前自己一直感覺很迷糊的幾種class之間的關(guān)系進(jìn)行整理,讓我們?cè)谡嬲肬ML進(jìn)行比如類圖設(shè)計(jì)時(shí)能夠更加清晰明了;以下就分別介紹這幾種關(guān)系:
繼承
指的是一個(gè)類(稱為子類、子接口)繼承另外的一個(gè)類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關(guān)系;在Java中此類關(guān)系通過關(guān)鍵字extends明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒有爭議性;

實(shí)現(xiàn)
指的是一個(gè)class類實(shí)現(xiàn)interface接口(可以是多個(gè))的功能;實(shí)現(xiàn)是類與接口之間最常見的關(guān)系;在Java中此類關(guān)系通過關(guān)鍵字implements明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒有爭議性;

依賴
可以簡單的理解,就是一個(gè)類A使用到了另一個(gè)類B,而這種使用關(guān)系是具有偶然性的、、臨時(shí)性的、非常弱的,但是B類的變化會(huì)影響到A;比如某人要過河,需要借用一條船,此時(shí)人與船之間的關(guān)系就是依賴;表現(xiàn)在代碼層面,為類B作為參數(shù)被類A在某個(gè)method方法中使用;

關(guān)聯(lián)
他體現(xiàn)的是兩個(gè)類、或者類與接口之間語義級(jí)別的一種強(qiáng)依賴關(guān)系,比如我和我的朋友;這種關(guān)系比依賴更強(qiáng)、不存在依賴關(guān)系的偶然性、關(guān)系也不是臨時(shí)性的,一般是長期性的,而且雙方的關(guān)系一般是平等的、關(guān)聯(lián)可以是單向、雙向的;表現(xiàn)在代碼層面,為被關(guān)聯(lián)類B以類屬性的形式出現(xiàn)在關(guān)聯(lián)類A中,也可能是關(guān)聯(lián)類A引用了一個(gè)類型為被關(guān)聯(lián)類B的全局變量;

聚合
聚合是關(guān)聯(lián)關(guān)系的一種特例,他體現(xiàn)的是整體與部分、擁有的關(guān)系,即has-a的關(guān)系,此時(shí)整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個(gè)整體對(duì)象,也可以為多個(gè)整體對(duì)象共享;比如計(jì)算機(jī)與CPU、公司與員工的關(guān)系等;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語義級(jí)別來區(qū)分;

組合
組合也是關(guān)聯(lián)關(guān)系的一種特例,他體現(xiàn)的是一種contains-a的關(guān)系,這種關(guān)系比聚合更強(qiáng),也稱為強(qiáng)聚合;他同樣體現(xiàn)整體與部分間的關(guān)系,但此時(shí)整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束;比如你和你的大腦;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語義級(jí)別來區(qū)分;

對(duì)于繼承、實(shí)現(xiàn)這兩種關(guān)系沒多少疑問,他們體現(xiàn)的是一種類與類、或者類與接口間的縱向關(guān)系;其他的四者關(guān)系則體現(xiàn)的是類與類、或者類與接口間的引用、橫向關(guān)系,是比較難區(qū)分的,有很多事物間的關(guān)系要想準(zhǔn)確定位是很難的,前面也提到,這幾種關(guān)系都是語義級(jí)別的,所以從代碼層面并不能完全區(qū)分各種關(guān)系;但總的來說,后幾種關(guān)系所表現(xiàn)的強(qiáng)弱程度依次為:組合>聚合>關(guān)聯(lián)>依賴;
當(dāng)我們使用靜態(tài)的Scaffolding的時(shí)候, 我們經(jīng)常會(huì)用到一些自定義的validator, 那么我們?cè)鯓幼远x國際化的message呢?
或者說我們定義怎樣的一個(gè)key, Grails能查到它呢?
這里,用戶自定義Validator的key的pattern是:
[Class Name].[Property Name].validator.invalid
我們?cè)陂_發(fā)使時(shí)常會(huì)用到資源文件,這可能是為了多語言、國際化的需要,也可能是使用了國外開源項(xiàng)目的原因,這就需要中文轉(zhuǎn)ascii將中文轉(zhuǎn)換為ASCII 編碼,或者將 ASCII 轉(zhuǎn)換為中文,那么我們就可以使用 JDK 自帶的轉(zhuǎn)換工具 native2ascii 。
for example:
No1、中文轉(zhuǎn)換為 ASCII 編碼
步驟:1 、在 D 盤新建 chinese.txt 文件,內(nèi)容為:
parameter.project.title=這是中文
2、在環(huán)境變量中設(shè)置好 JDK 路徑
3、進(jìn)入 dos 控制臺(tái),并進(jìn)入 D 盤目錄
4、輸入命令: native2ascii -encoding gb2312 chinese.txt ascii.txt 回車
那么在D 盤目錄下生成 ascii.txt 文件,內(nèi)容為:
parameter.project.title=\u8fd9\u662f\u4e2d\u6ascii碼 中文587
No1、 ASCII 編碼轉(zhuǎn)換為中文
步驟:1 、在 D 盤新建 ascii.txt 文件,內(nèi)容為:
parameter.project.title=\u8fd9\u662f\u4e2d\u6ascii碼 中文587
2、在環(huán)境變量中設(shè)置好 JDK 路徑
3、進(jìn)入 dos 控制臺(tái),并進(jìn)入 D 盤目錄
4、輸入命令: native2ascii -reverse -encoding UTF8 ascii.txt chinese.txt 回車
那么在D 盤目錄下生成 chinese.txt 文件,內(nèi)容為:
parameter.project.title=這是中文
1. chkconfig腳本格式:
#!/bin/sh
#chkconfig 2345 55 45
#上面為固定格式:2345 表示運(yùn)行級(jí)別,55表示開機(jī)執(zhí)行順序,45為關(guān)機(jī)順序
#description:this is just a demo of chkconfig script
case “$1” in
start)
<start-script>
;;
Stop)
<stop-script>
;;
Status)
Echo <the information you want to display>
;;
*)
Echo “the usage of the script”
Case
2. 然后將腳本保存,并賦予執(zhí)行權(quán)限,再復(fù)制到/etc/init.d目錄
#chmod a+x <myscript>
#copy <myscript> /etc/init.d
3. 使用chkconfig命令添加成服務(wù)
#chkconfig --add <myscript>
#chkconfig --level 35 <myscript > on
#chkconfig --list <myscript>
4. 然后就可以通過service命令管理了
#service <myscript> start | stop | status
5. 下面是我寫的一個(gè)實(shí)例腳本,大家可以參考一些格式:
#!/bin/sh
#chkconfig: 2345 99 99
#description:the script to set the network at run level 2345
IN=eth0
OUT=eth1
HOST_NAME=cluster1.yang.com
INIP=192.168.10.10
OUTIP=192.168.136.10
MASK=255.255.255.0
IP=/sbin/ip
IFC=/sbin/ifconfig
ROUTE=/sbin/route
#flush the address
case "$1" in
start)
#echo "flush the address..."
#$IP addr flush dev eth0
#$IP addr flush dev eth1
echo "set the address..."
$IFC $IN $INIP netmask $MASK up
$IFC $OUT $OUTIP netmask $MASK up
echo "set the hostname..."
hostname $HOST_NAME
echo "set the default gateway..."
$IP route flush all
$ROUTE add default gw 192.168.136.2
echo "finshed!!!"
;;
stop)
echo "flush the network setting..."
$IP addr flush dev eth0
$IP addr flush dev eth1
echo "flush finshed!!!"
;;
status)
echo "hostname is $HOST_NAME"
$IFC eth0
$IFC eth1
;;
*)
echo "requires start,stop or status"
;;
esac
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
在Linux中chkconfighttpd任務(wù)添加,Apache服務(wù)器的最新穩(wěn)定發(fā)布版本是httpd-2.2..0,官方下載地址是:http://httpd.apache.org/download.cgi。我們通過下面的步驟來快速的搭建一個(gè)web服務(wù)器。
1、下載源碼文件httpd-2.2.0.tar.gz 到linux服務(wù)器的某個(gè)目錄。
2、解壓文件 # tar zxvf httpd-2.2.0.tar.gz .
3、配置 # ./configure –refix=/usr/local/apache //指定安裝目錄,以后要?jiǎng)h除安裝就只需刪除這個(gè)目錄。
4、編譯和安裝。 # make ; make install .
5、編寫啟動(dòng)腳本,把它放到目錄 /etc/rc.d/init.d/里,這里取名為httpd,其內(nèi)容如下:
- #!/bin/bash
- #description:http server
- #chkconfig: 235 98 98
- case "$1" in
- start)
- echo "Starting Apache daemon..."
- /usr/local/apache2/bin/apachectl -k start
- ;;
- stop)
- echo "Stopping Apache daemon..."
- /usr/local/apache2/bin/apachectl -k stop
- ;;
- restart)
- echo "Restarting Apache daemon..."
- /usr/local/apache2/bin/apachectl -k restart
- ;;
- status)
- statusproc /usr/local/apache2/bin/httpd
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|status}"
- exit 1
- ;;
- Esac
注意:#description:http server 這一行必須加上,否則在執(zhí)行命令
# chkconfig –add httpd
時(shí)會(huì)出現(xiàn)“service apache does not support chkconfig”的錯(cuò)誤報(bào)告。
#chkconfig: 2345 98 98 表示在執(zhí)行命令
# chkconfig –add httpd 時(shí)會(huì)在目錄 /etc/rc2.d/ 、/etc/rc3.d/ /etc/rc5.d 分別生成文件 S98httpd和 K98httpd。這個(gè)數(shù)字可以是別的。
6、執(zhí)行命令 # chkconfig –add httpd ,進(jìn)入目錄/etc/rc3.d/檢查是否生成文件 S98httpd及K98httpd.
7、啟動(dòng)服務(wù) # service httpd start .
關(guān)鍵詞final在Java中有多重用途,既可被用于instance變量、static變量
也可用于classes或methods,表示不允許客戶覆寫它們。
當(dāng)一個(gè)方法被聲明成final,在兩個(gè)領(lǐng)域中顯得有位重要:
- class設(shè)計(jì)
- 運(yùn)行期性能
在程序設(shè)計(jì)里,有時(shí)我們不希望我們的方法被重寫或覆蓋,final關(guān)鍵字保證了這一點(diǎn)。
final關(guān)鍵字是怎么影響性能的呢?
當(dāng)我們的方法被聲明成static,final和private, 此方法將成為Inlining(內(nèi)聯(lián)函數(shù))的候選者。此類方法可以在編譯期被靜態(tài)決議(staticallyresolved),而不需要?jiǎng)討B(tài)決議(dynamicResolution)。以方法本體(methodbody)替換方法調(diào)用(methodcall)會(huì)使代碼執(zhí)行速度更快。
將方法聲明為static、final和private會(huì)帶來一些缺點(diǎn):這樣的方法無法通過Subclassing(子類化)進(jìn)行擴(kuò)展。這就束縛了derived class通過class函數(shù)做事情的機(jī)會(huì)。inlined方法只有在被多次調(diào)用的情況下,才會(huì)獲得令人側(cè)目的性能提升。這是因?yàn)楫?dāng)一個(gè)方法被inline后,就不再需要負(fù)擔(dān)方法調(diào)用的額外開銷。因此,方法被調(diào)用愈多次,節(jié)省就愈多。
不過inlining也可能使你的代碼體積變大。如果這個(gè)方法有許多調(diào)用點(diǎn),.class文件的體積便會(huì)膨脹,這是因?yàn)樵局恍璐鎯?chǔ)一份的函數(shù)碼,由于inline而在所有調(diào)用點(diǎn)被復(fù)制了一份。
Java NIO 主要是Channel, SelectionKey, Selector 三個(gè)類之間的關(guān)系,下面的例子就是演示如果使用NIO來處理請(qǐng)求的:
/** *
*/
package dongzi.nio.exercise.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
/**
* @author kyle
*
*/
public class SelectSockets {
private static final int PORT_NUMBER = 1234;
/**
* @param args
*/
public static void main(String[] args) {
new SelectSockets().go(args);
}
private void go(String[] args) {
int port = PORT_NUMBER;
if (args.length > 0) {
try {
port = Integer.parseInt(args[0]);
} catch (Exception e) {
}
}
System.out.println("Listening port: " + PORT_NUMBER);
try {
Selector selector = Selector.open();
startServer(port, selector);
while (true) {
int n = selector.select();
if (n == 0) {
continue;
}
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel channel = server.accept();
registerChannel(selector, channel, SelectionKey.OP_READ);
sayHello(channel);
}
if (key.isReadable()) {
readDataFromChannel(key);
}
}
it.remove();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private ByteBuffer buffer = ByteBuffer.allocate(1024);
private void readDataFromChannel(SelectionKey key) throws IOException {
int count = 0;
SocketChannel channel = (SocketChannel) key.channel();
buffer.clear();
while ((count = channel.read(buffer)) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
buffer.clear();
}
if (count < 0) {
channel.close();
}
}
private void sayHello(SocketChannel channel) throws IOException {
if (channel == null) {
return;
}
buffer.clear();
ByteBuffer buffer = ByteBuffer.wrap("Hi, there \r\n".getBytes());
buffer.flip();
channel.write(buffer);
}
private void registerChannel(Selector selector, SocketChannel channel,
int opRead) throws IOException {
if (channel == null) {
return;
}
channel.configureBlocking(false);
channel.register(selector, opRead);
}
private void startServer(int port, Selector selector) throws IOException,
ClosedChannelException {
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
ServerSocket serverSocket = serverChannel.socket();
serverSocket.bind(new InetSocketAddress(port));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
}
There are 5 different steps or milestones in a
products lifecycle from beginning to release. These are:
Stage 1 - First Cycle -
QA Handoff/Acceptance - This is the milestone that determines if a
product is stable enough to be tested against. When a product reaches this stage, it is generally released to QA Testers to begin the testing stage of the produt.
Stage 2 - Alpha phase The product is still in QA review, but the testing scenarios are a little more destructive in nature, in an attempt to start shaking out most of the bugs in a product.
Stage 3 - Beta phase- the product is at a stability level that it can be released to select customers in the customer base for further testing in the 'real world'. This usually shakes out more bugs in a product.
Stage 4 - Release Candidate - This stage is towards the end of the cycle - The product has gone through its testing paces, and is being certified as ready for release.
Stage 5 - GA -The product is ready for the world!
Reference:
http://answers.yahoo.com/question/index?qid=1006020204792