
posted @ 2008-12-16 09:37 追風(fēng)舞者 閱讀(163) | 評(píng)論 (0) | 編輯 收藏
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
轉(zhuǎn)載自:www.aygfsteel.com/zhaobin
來(lái)自 勤勞的蜜蜂的博客: 來(lái)自Phrancol的博客:
來(lái)自八進(jìn)制的博客: 來(lái)自羅明的博客: 來(lái)自yangbutao的博客: 來(lái)自erylee的博客: posted @ 2008-12-11 14:40 追風(fēng)舞者 閱讀(226) | 評(píng)論 (0) | 編輯 收藏 剛剛找到的面試題目。自己做了一下,反正挺慘不人睹的。貼出來(lái)就想幫幫有需要的人
并且問(wèn)問(wèn)為什么是這個(gè)結(jié)果呢?有的題的答案真的想不到啊~想不到~ 一、判斷題(30分) 1.Java程序里,創(chuàng)建新的類對(duì)象用關(guān)鍵字new,回收無(wú)用的類對(duì)象使用關(guān)鍵字free。 2.對(duì)象可以賦值,只要使用賦值號(hào)(等號(hào))即可,相當(dāng)于生成了一個(gè)各屬性與賦值對(duì)象相同的新對(duì)象。 3.有的類定義時(shí)可以不定義構(gòu)造函數(shù),所以構(gòu)造函數(shù)不是必需的。 4.類及其屬性、方法可以同時(shí)有一個(gè)以上的修飾符來(lái)修飾。 5.Java的屏幕坐標(biāo)是以像素為單位,容器的左下角被確定為坐標(biāo)的起點(diǎn) 6.抽象方法必須在抽象類中,所以抽象類中的方法都必須是抽象方法。 7.Final類中的屬性和方法都必須被final修飾符修飾。 8.最終類不能派生子類,最終方法不能被覆蓋。 9.子類要調(diào)用父類的方法,必須使用super關(guān)鍵字。 10.一個(gè)Java類可以有多個(gè)父類。 11.如果p是父類Parent的對(duì)象,而c是子類Child的對(duì)象,則語(yǔ)句c = p是正確的。 12.在java集合中,Vector和HashMap是線程安全的。 13.當(dāng)一個(gè)方法在運(yùn)行過(guò)程中產(chǎn)生一個(gè)異常,則這個(gè)方法會(huì)終止,但是整個(gè)程序不一定終止運(yùn)行。 14.接口是特殊的類,所以接口也可以繼承,子接口將繼承父接口的所有常量和抽象方法。 15.用“+”可以實(shí)現(xiàn)字符串的拼接,用- 可以從一個(gè)字符串中去除一個(gè)字符子串。 二、選擇題(30分) 1、關(guān)于垃圾收集的哪些敘述是正確的( ): A.程序開(kāi)發(fā)者必須自己創(chuàng)建一個(gè)線程進(jìn)行內(nèi)存釋放的工作 B.垃圾收集允許程序開(kāi)發(fā)者明確指定并立即釋放該內(nèi)存 C.垃圾收集將檢查并釋放不再使用的內(nèi)存 D.垃圾收集能夠在期望的時(shí)間釋放被java對(duì)象使用的內(nèi)存 2、下面的哪些賦值語(yǔ)句是不正確的( ): A.float f=11.1; B.double d=5.3E12; C.double d=3.14159; D.double d=3.14D; 3、下面關(guān)于變量及其范圍的陳述哪些是不正確的( ): A.實(shí)例變量是類的成員變量 B.實(shí)例變量用關(guān)鍵字static聲明 C.在方法中定義的局部變量在該方法被執(zhí)行時(shí)創(chuàng)建 D.局部變量在使用前必須被初始化 4、下列關(guān)于修飾符混用的說(shuō)法,錯(cuò)誤的是( ): A.a(chǎn)bstract不能與final并列修飾同一個(gè)類 B.a(chǎn)bstract類中不可以有private的成員 C.a(chǎn)bstract方法必須在abstract類中 D.static方法中能處理非static的屬性 5、容器Panel和Applet缺省使用的布局編輯策略是( ): A、BorderLayout B、FlowLayout C、GridLayout D、CardLayout 6、以下標(biāo)識(shí)符中哪項(xiàng)是不合法的( ): A、 BigMeaninglessName B、$int C、1 st D、$1 7、main方法是Java Application程序執(zhí)行的入口點(diǎn),關(guān)于main方法的方法頭以下哪項(xiàng)是合法的( ): A、 public static void main() B、 public static void main(String[ ] args) C、 public static int main(String[ ] arg) D、 public void main(String arg[ ]) 8、執(zhí)行完以下代碼int [ ] x = new int[25];后,以下哪項(xiàng)說(shuō)明是正確的( ): A、 x[24]為0 B、 x[24]未定義 C、 x[25]為0 D、 x[0]為空 9、以下代碼段執(zhí)行后的輸出結(jié)果為( ): int x=3; int y=10; System.out.println(y%x); A、0 B、1 C、2 D、3 10、以下哪個(gè)表達(dá)式是不合法的( ): A、String x=”Hello”; int y=9; x+=y; B、String x=”Hello”; int y=9; if(x= =y) { } C、String x=”Hello”; int y=9; x=x+y; D、String x=null; int y=(x!=null)&&(x.length()>0) ? x.length : 0 11、編譯運(yùn)行以下程序后,關(guān)于輸出結(jié)果的說(shuō)明正確的是 ( ): public class Conditional{ public static void main(String args[ ]){ int x=4; System.out.println(“value is “+ ((x>4) ? 99.9 :9)); } } A、 輸出結(jié)果為:value is 99.99 B、 輸出結(jié)果為:value is 9 C、 輸出結(jié)果為:value is 9.0 D、 編譯錯(cuò)誤 12、以下聲明合法的是( ): A、 default String s; B、 public final static native int w( ) C、 abstract double d; D、 abstract final double hyperbolicCosine( ) 13、關(guān)于以下application的說(shuō)明,正確的是( ): 1. class StaticStuff 2. { 3. static int x=10; 4. static { x+=5;} 5. public static void main(String args[ ]) 6. { 7. System.out.println(“x=” + x); 8. } 9. static { x/=3;} 10. } A、 4行與9行不能通過(guò)編譯,因?yàn)槿鄙俜椒头祷仡愋?nbsp; B、 9行不能通過(guò)編譯,因?yàn)橹荒苡幸粋€(gè)靜態(tài)初始化器 C、 編譯通過(guò),執(zhí)行結(jié)果為:x=5 D、編譯通過(guò),執(zhí)行結(jié)果為:x=3 14、關(guān)于以下程序代碼的說(shuō)明正確的是( ): 1.class HasStatic{ 2. private static int x=100; 3. public static void main(String args[ ]){ 4. HasStatic hs1=new HasStatic( ); 5. hs1.x++; 6. HasStatic hs2=new HasStatic( ); 7. hs2.x++; 8. hs1=new HasStatic( ); 9. hs1.x++; 10. HasStatic.x- -; 11. System.out.println(“x=”+x); 12. } 13.} A、5行不能通過(guò)編譯,因?yàn)橐昧怂接徐o態(tài)變量 B、10行不能通過(guò)編譯,因?yàn)閤是私有靜態(tài)變量 C、程序通過(guò)編譯,輸出結(jié)果為:x=103 D、程序通過(guò)編譯,輸出結(jié)果為:x=102 15、以下選項(xiàng)中循環(huán)結(jié)構(gòu)合法的是( ): A、while (int i<7){ i++; System.out.println(“i is “+i); } B、int j=3; while(j){ System.out.println(“ j is “+j); } C、int j=0; for(int k=0; j + k !=10; j++,k++){ System.out.println(“ j is “+ j + “k is”+ k); } D、int j=0; do{ System.out.println( “j is “+j++); if (j = = 3) {continue loop;} }while (j<10); 三、簡(jiǎn)答題(40分) 1. 寫出下列程序的運(yùn)行結(jié)果 public class Cat { void mi( ) throws NullPointerException { System.out.println( “Cat mi mi .. “ ); } } public class SmallCat extends Cat {int i=8; void mi( ) throws Exception { System.out.println( “SmallCat mi mi .. “ ); } public static void main( String[] a ) throws Exception { Cat cat = new SmallCat(); cat.mi(); } } 寫出下列程序的運(yùn)行結(jié)果 interface Playable { void play(); } interface Bounceable { void play(); } interface Rollable extends Playable, Bounceable { Ball ball = new Ball("PingPang"); } class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } } 寫出下列程序的運(yùn)行結(jié)果 class Value{ public int i = 15; } public class Test{ public static void main(String argv[]){ Test t = new Test(); t.first(); } public void first(){ int i = 5; Value v = new Value(); v.i = 25; second(v, i); System.out.println(v.i); } public void second(Value v, int i){ i = 0; v.i = 20; Value val = new Value(); v = val; System.out.println(v.i + " " + i); } } 寫出下列程序的運(yùn)行結(jié)果 class MyThread extends Thread{ public void run(){ System.out.println("MyThread: run()"); } public void start(){ System.out.println("MyThread: start()"); } } class MyRunnable implements Runnable{ public void run(){ System.out.println("MyRunnable: run()"); } public void start(){ System.out.println("MyRunnable: start()"); } } public class MyTest { public static void main(String args[]){ MyThread myThread = new MyThread(); MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); myThread.start(); thread.start(); } } posted @ 2008-12-03 09:57 追風(fēng)舞者 閱讀(399) | 評(píng)論 (0) | 編輯 收藏 一、參考資料:
二、基本概念 1、堆(Heap) JVM管理的內(nèi)存叫堆。在32Bit操作系統(tǒng)上有1.5G-2G的限制,而64Bit的就沒(méi)有。 JVM初始分配的內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64但小于1G。 JVM最大分配的內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4但小于1G。 默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。 服務(wù)器一般設(shè)置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小,所以上面的兩個(gè)參數(shù)沒(méi)啥用。
2.基本收集算法
可見(jiàn),沒(méi)有免費(fèi)的午餐,無(wú)論采用復(fù)制還是標(biāo)記清除算法,自動(dòng)的東西都要付出很大的性能代價(jià)。 3.分代 分代是Java垃圾收集的一大亮點(diǎn),根據(jù)對(duì)象的生命周期長(zhǎng)短,把堆分為3個(gè)代:Young,Old和Permanent,根據(jù)不同代的特點(diǎn)采用不同的收集算法,揚(yáng)長(zhǎng)避短也。 Young(Nursery),年輕代。研究表明大部分對(duì)象都是朝生暮死,隨生隨滅的。因此所有收集器都為年輕代選擇了復(fù)制算法。 Young的默認(rèn)值為4M,隨堆內(nèi)存增大,約為1/15,JVM會(huì)根據(jù)情況動(dòng)態(tài)管理其大小變化。 Young的大小非常非常重要,見(jiàn)“后面暫停時(shí)間優(yōu)先收集器”的論述。 Young里面又分為3個(gè)區(qū)域,一個(gè)Eden,所有新建對(duì)象都會(huì)存在于該區(qū),兩個(gè)Survivor區(qū),用來(lái)實(shí)施復(fù)制算法。每次復(fù)制就是將Eden和第一塊Survior的活對(duì)象復(fù)制到第2塊,然后清空Eden與第一塊Survior。Eden與Survivor的比例由-XX:SurvivorRatio=設(shè)置,默認(rèn)為32。Survivio大了會(huì)浪費(fèi),小了的話,會(huì)使一些年輕對(duì)象潛逃到老人區(qū),引起老人區(qū)的不安,但這個(gè)參數(shù)對(duì)性能并不重要。 Old(Tenured),年老代。年輕代的對(duì)象如果能夠挺過(guò)數(shù)次收集,就會(huì)進(jìn)入老人區(qū)。老人區(qū)使用標(biāo)記整理算法。因?yàn)槔先藚^(qū)的對(duì)象都沒(méi)那么容易死的,采用復(fù)制算法就要反復(fù)的復(fù)制對(duì)象,很不合算,只好采用標(biāo)記清理算法,但標(biāo)記清理算法其實(shí)也不輕松,每次都要遍歷區(qū)域內(nèi)所有對(duì)象,所以還是沒(méi)有免費(fèi)的午餐啊。 -XX:MaxTenuringThreshold=設(shè)置熬過(guò)年輕代多少次收集后移入老人區(qū),CMS中默認(rèn)為0,熬過(guò)第一次GC就轉(zhuǎn)入,可以用-XX:+PrintTenuringDistribution查看。 Permanent,持久代。裝載Class信息等基礎(chǔ)數(shù)據(jù),默認(rèn)64M,如果是類很多很多的服務(wù)程序,需要加大其設(shè)置-XX:MaxPermSize=,否則它滿了之后會(huì)引起fullgc()或Out of Memory。 注意Spring,Hibernate這類喜歡AOP動(dòng)態(tài)生成類的框架需要更多的持久代內(nèi)存。 4.minor/major collection 每個(gè)代滿了之后都會(huì)促發(fā)collection,(另外Concurrent Low Pause Collector默認(rèn)在老人區(qū)68%的時(shí)候促發(fā))。GC用較高的頻率對(duì)young進(jìn)行掃描和回收,這種叫做minor collection。 5.小結(jié) Young -- minor collection -- 復(fù)制算法 Old(Tenured) -- major colletion -- 標(biāo)記清除/標(biāo)記整理算法
三、收集器 1.古老的串行收集器(Serial Collector) 使用 -XX:+UseSerialGC,策略為年輕代串行復(fù)制,年老代串行標(biāo)記整理。 2.吞吐量?jī)?yōu)先的并行收集器(Throughput Collector) 使用 -XX:+UseParallelGC ,也是JDK5 -server的默認(rèn)值。策略為: 所以需要2+的CPU時(shí)才會(huì)優(yōu)于串行收集器,適用于后臺(tái)處理,科學(xué)計(jì)算。 可以使用-XX:MaxGCPauseMillis= 和 -XX:GCTimeRatio 來(lái)調(diào)整GC的時(shí)間。 3.暫停時(shí)間優(yōu)先的并發(fā)收集器(Concurrent Low Pause Collector-CMS) 前面說(shuō)了這么多,都是為了這節(jié)做鋪墊...... 使用-XX:+UseConcMarkSweepGC,策略為: 3.1 年老代詳述 并行(Parallel)與并發(fā)(Concurrent)僅一字之差,并行指多條垃圾收集線程并行,并發(fā)指用戶線程與垃圾收集線程并發(fā),程序在繼續(xù)運(yùn)行,而垃圾收集程序運(yùn)行于另一個(gè)個(gè)CPU上。 并發(fā)收集一開(kāi)始會(huì)很短暫的停止一次所有線程來(lái)開(kāi)始初始標(biāo)記根對(duì)象,然后標(biāo)記線程與應(yīng)用線程一起并發(fā)運(yùn)行,最后又很短的暫停一次,多線程并行的重新標(biāo)記之前可能因?yàn)椴l(fā)而漏掉的對(duì)象,然后就開(kāi)始與應(yīng)用程序并發(fā)的清除過(guò)程。可見(jiàn),最長(zhǎng)的兩個(gè)遍歷過(guò)程都是與應(yīng)用程序并發(fā)執(zhí)行的,比以前的串行算法改進(jìn)太多太多了!!! 串行標(biāo)記清除是等年老代滿了再開(kāi)始收集的,而并發(fā)收集因?yàn)橐c應(yīng)用程序一起運(yùn)行,如果滿了才收集,應(yīng)用程序就無(wú)內(nèi)存可用,所以系統(tǒng)默認(rèn)68%滿的時(shí)候就開(kāi)始收集。內(nèi)存已設(shè)得較大,吃內(nèi)存又沒(méi)有這么快的時(shí)候,可以用-XX:CMSInitiatingOccupancyFraction=恰當(dāng)增大該比率。 3.2 年輕代詳述 可惜對(duì)年輕代的復(fù)制收集,依然必須停止所有應(yīng)用程序線程,原理如此,只能靠多CPU,多收集線程并發(fā)來(lái)提高收集速度,但除非你的Server獨(dú)占整臺(tái)服務(wù)器,否則如果服務(wù)器上本身還有很多其他線程時(shí),切換起來(lái)速度就..... 所以,搞到最后,暫停時(shí)間的瓶頸就落在了年輕代的復(fù)制算法上。 因此Young的大小設(shè)置挺重要的,大點(diǎn)就不用頻繁GC,而且增大GC的間隔后,可以讓多點(diǎn)對(duì)象自己死掉而不用復(fù)制了。但Young增大時(shí),GC造成的停頓時(shí)間攀升得非常恐怖,比如在我的機(jī)器上,默認(rèn)8M的Young,只需要幾毫秒的時(shí)間,64M就升到90毫秒,而升到256M時(shí),就要到300毫秒了,峰值還會(huì)攀到恐怖的800ms。誰(shuí)叫復(fù)制算法,要等Young滿了才開(kāi)始收集,開(kāi)始收集就要停止所有線程呢。 3.3 持久代 可設(shè)置-XX:+CMSClassUnloadingEnabled 4.增量(train算法)收集器(Incremental Collector) 已停止維護(hù),–Xincgc選項(xiàng)默認(rèn)轉(zhuǎn)為并發(fā)收集器。 四、暫停時(shí)間顯示 加入下列參數(shù) (請(qǐng)將PrintGC和Details中間的空格去掉,CSDN很怪的認(rèn)為是禁止字句)
會(huì)程序運(yùn)行過(guò)程中將顯示如下輸出 9.211: [GC 9.211: [ParNew: 7994K->0K(8128K), 0.0123935 secs] 427172K->419977K(524224K), 0.0125728 secs] 顯示在程序運(yùn)行的9.211秒發(fā)生了Minor的垃圾收集,前一段數(shù)據(jù)針對(duì)新生區(qū),從7994k整理為0k,新生區(qū)總大小為8128k,程序暫停了12ms,而后一段數(shù)據(jù)針對(duì)整個(gè)堆。 對(duì)于年老代的收集,暫停發(fā)生在下面兩個(gè)階段,CMS-remark的中斷是17毫秒: [GC [1 CMS-initial-mark: 80168K(196608K)] 81144K(261184K), 0.0059036 secs] [1 CMS-remark: 80168K(196608K)] 82493K(261184K),0.0168943 secs] 再加兩個(gè)參數(shù) -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime對(duì)暫停時(shí)間看得更清晰。 五、真正不停的BEA JRockit 與Sun RTS2.0 Bea的JRockit 5.0 R27 的特色之一是動(dòng)態(tài)決定的垃圾收集策略,用戶可以決定自己關(guān)心的是吞吐量,暫停時(shí)間還是確定的暫停時(shí)間,再由JVM在運(yùn)行時(shí)動(dòng)態(tài)決定、改變改變垃圾收集策略。 最可惜JRockt的license很奇怪,雖然平時(shí)使用免費(fèi),但這個(gè)30ms的選項(xiàng)就需要購(gòu)買整個(gè)Weblogic Real Time Server的license。 其他免費(fèi)選項(xiàng),有:
JavaOne2007上有Sun的 Java Real-Time System 2.0 的介紹,RTS2.0基于JDK1.5,在Real-Time Garbage Collctor上又有改進(jìn),但還在beta版狀態(tài),只供給OEM,更怪。 六、JDK 6.0的改進(jìn) 因?yàn)镴DK5.0在Young較大時(shí)的表現(xiàn)還是不夠讓人滿意,又繼續(xù)看JDK6.0的改進(jìn),結(jié)果稍稍失望,不涉及我最頭痛的年輕代復(fù)制收集改良。 1.年老代的標(biāo)識(shí)-清除收集,并行執(zhí)行標(biāo)識(shí) 2.加大了Young區(qū)的默認(rèn)大小 3.System.gc()可以與應(yīng)用程序并發(fā)執(zhí)行 七、小結(jié) 1. JDK5.0/6.0 對(duì)于服務(wù)器應(yīng)用,我們使用Concurrent Low Pause Collector,對(duì)年輕代,暫停時(shí)多線程并行復(fù)制收集;對(duì)年老代,收集器與應(yīng)用程序并行標(biāo)記--整理收集,以達(dá)到盡量短的垃圾收集時(shí)間。 本著沒(méi)有深刻測(cè)試前不要胡亂優(yōu)化的宗旨,命令行屬性只需簡(jiǎn)單寫為: ![]() 然后要根據(jù)應(yīng)用的情況,在測(cè)試軟件輔助可以下看看有沒(méi)有JVM的默認(rèn)值和自動(dòng)管理做的不夠的地方可以調(diào)整,如-xmn 設(shè)Young的大小,-XX:MaxPermSize設(shè)持久代大小等。 2. JRockit 6.0 R27.2 但因?yàn)镴DK5的測(cè)試結(jié)果實(shí)在不能滿意,后來(lái)又嘗試了JRockit,總體效果要好些。 ![]() posted @ 2008-12-03 09:51 追風(fēng)舞者 閱讀(222) | 評(píng)論 (0) | 編輯 收藏 1.垃圾收集算法的核心思想 Java語(yǔ)言建立了垃圾收集機(jī)制,用以跟蹤正在使用的對(duì)象和發(fā)現(xiàn)并回收不再使用(引用)的對(duì)象。該機(jī)制可以有效防范動(dòng)態(tài)內(nèi)存分配中可能發(fā)生的兩個(gè)危險(xiǎn):因內(nèi)存垃圾過(guò)多而引發(fā)的內(nèi)存耗盡,以及不恰當(dāng)?shù)膬?nèi)存釋放所造成的內(nèi)存非法引用。 垃圾收集算法的核心思想是:對(duì)虛擬機(jī)可用內(nèi)存空間,即堆空間中的對(duì)象進(jìn)行識(shí)別,如果對(duì)象正在被引用,那么稱其為存活對(duì)象,反之,如果對(duì)象不再被引用,則為垃圾對(duì)象,可以回收其占據(jù)的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統(tǒng)參數(shù)的合理調(diào)節(jié)直接影響著系統(tǒng)性能,因此需要開(kāi)發(fā)人員做比較深入的了解。 2.觸發(fā)主GC(Garbage Collector)的條件 JVM進(jìn)行次GC的頻率很高,但因?yàn)檫@種GC占用時(shí)間極短,所以對(duì)系統(tǒng)產(chǎn)生的影響不大。更值得關(guān)注的是主GC的觸發(fā)條件,因?yàn)樗鼘?duì)系統(tǒng)影響很明顯。總的來(lái)說(shuō),有兩個(gè)條件會(huì)觸發(fā)主GC: ①當(dāng)應(yīng)用程序空閑時(shí),即沒(méi)有應(yīng)用線程在運(yùn)行時(shí),GC會(huì)被調(diào)用。因?yàn)镚C在優(yōu)先級(jí)最低的線程中進(jìn)行,所以當(dāng)應(yīng)用忙時(shí),GC線程就不會(huì)被調(diào)用,但以下條件除外。 ②Java堆內(nèi)存不足時(shí),GC會(huì)被調(diào)用。當(dāng)應(yīng)用線程在運(yùn)行,并在運(yùn)行過(guò)程中創(chuàng)建新對(duì)象,若這時(shí)內(nèi)存空間不足,JVM就會(huì)強(qiáng)制地調(diào)用GC線程,以便回收內(nèi)存用于新的分配。若GC一次之后仍不能滿足內(nèi)存分配的要求,JVM會(huì)再進(jìn)行兩次GC作進(jìn)一步的嘗試,若仍無(wú)法滿足要求,則 JVM將報(bào)“out of memory”的錯(cuò)誤,Java應(yīng)用將停止。 由于是否進(jìn)行主GC由JVM根據(jù)系統(tǒng)環(huán)境決定,而系統(tǒng)環(huán)境在不斷的變化當(dāng)中,所以主GC的運(yùn)行具有不確定性,無(wú)法預(yù)計(jì)它何時(shí)必然出現(xiàn),但可以確定的是對(duì)一個(gè)長(zhǎng)期運(yùn)行的應(yīng)用來(lái)說(shuō),其主GC是反復(fù)進(jìn)行的。 3.減少GC開(kāi)銷的措施 根據(jù)上述GC的機(jī)制,程序的運(yùn)行會(huì)直接影響系統(tǒng)環(huán)境的變化,從而影響GC的觸發(fā)。若不針對(duì)GC的特點(diǎn)進(jìn)行設(shè)計(jì)和編碼,就會(huì)出現(xiàn)內(nèi)存駐留等一系列負(fù)面影響。為了避免這些影響,基本的原則就是盡可能地減少垃圾和減少GC過(guò)程中的開(kāi)銷。具體措施包括以下幾個(gè)方面: (1)不要顯式調(diào)用System.gc() 此函數(shù)建議JVM進(jìn)行主GC,雖然只是建議而非一定,但很多情況下它會(huì)觸發(fā)主GC,從而增加主GC的頻率,也即增加了間歇性停頓的次數(shù)。 (2)盡量減少臨時(shí)對(duì)象的使用 臨時(shí)對(duì)象在跳出函數(shù)調(diào)用后,會(huì)成為垃圾,少用臨時(shí)變量就相當(dāng)于減少了垃圾的產(chǎn)生,從而延長(zhǎng)了出現(xiàn)上述第二個(gè)觸發(fā)條件出現(xiàn)的時(shí)間,減少了主GC的機(jī)會(huì)。 (3)對(duì)象不用時(shí)最好顯式置為Null 一般而言,為Null的對(duì)象都會(huì)被作為垃圾處理,所以將不用的對(duì)象顯式地設(shè)為Null,有利于GC收集器判定垃圾,從而提高了GC的效率。 (4)盡量使用StringBuffer,而不用String來(lái)累加字符串(詳見(jiàn)blog另一篇文章JAVA中String與StringBuffer) 由于String是固定長(zhǎng)的字符串對(duì)象,累加String對(duì)象時(shí),并非在一個(gè)String對(duì)象中擴(kuò)增,而是重新創(chuàng)建新的String對(duì)象,如Str5=Str1+Str2+Str3+Str4,這條語(yǔ)句執(zhí)行過(guò)程中會(huì)產(chǎn)生多個(gè)垃圾對(duì)象,因?yàn)閷?duì)次作“+”操作時(shí)都必須創(chuàng)建新的String對(duì)象,但這些過(guò)渡對(duì)象對(duì)系統(tǒng)來(lái)說(shuō)是沒(méi)有實(shí)際意義的,只會(huì)增加更多的垃圾。避免這種情況可以改用StringBuffer來(lái)累加字符串,因StringBuffer是可變長(zhǎng)的,它在原有基礎(chǔ)上進(jìn)行擴(kuò)增,不會(huì)產(chǎn)生中間對(duì)象。 (5)能用基本類型如Int,Long,就不用Integer,Long對(duì)象 基本類型變量占用的內(nèi)存資源比相應(yīng)對(duì)象占用的少得多,如果沒(méi)有必要,最好使用基本變量。 (6)盡量少用靜態(tài)對(duì)象變量 靜態(tài)變量屬于全局變量,不會(huì)被GC回收,它們會(huì)一直占用內(nèi)存。 (7)分散對(duì)象創(chuàng)建或刪除的時(shí)間 集中在短時(shí)間內(nèi)大量創(chuàng)建新對(duì)象,特別是大對(duì)象,會(huì)導(dǎo)致突然需要大量?jī)?nèi)存,JVM在面臨這種情況時(shí),只能進(jìn)行主GC,以回收內(nèi)存或整合內(nèi)存碎片,從而增加主GC的頻率。集中刪除對(duì)象,道理也是一樣的。它使得突然出現(xiàn)了大量的垃圾對(duì)象,空閑空間必然減少,從而大大增加了下一次創(chuàng)建新對(duì)象時(shí)強(qiáng)制主GC的機(jī)會(huì)。 4.gc與finalize方法 ⑴gc方法請(qǐng)求垃圾回收 使用System.gc()可以不管JVM使用的是哪一種垃圾回收的算法,都可以請(qǐng)求Java的垃圾回收。需要注意的是,調(diào)用System.gc()也僅僅是一個(gè)請(qǐng)求。JVM接受這個(gè)消息后,并不是立即做垃圾回收,而只是對(duì)幾個(gè)垃圾回收算法做了加權(quán),使垃圾回收操作容易發(fā)生,或提早發(fā)生,或回收較多而已。 ⑵finalize方法透視垃圾收集器的運(yùn)行 在JVM垃圾收集器收集一個(gè)對(duì)象之前 ,一般要求程序調(diào)用適當(dāng)?shù)姆椒ㄡ尫刨Y源,但在沒(méi)有明確釋放資源的情況下,Java提供了缺省機(jī)制來(lái)終止化該對(duì)象釋放資源,這個(gè)方法就是finalize()。它的原型為: protected void finalize() throws Throwable 在finalize()方法返回之后,對(duì)象消失,垃圾收集開(kāi)始執(zhí)行。原型中的throws Throwable表示它可以拋出任何類型的異常。 因此,當(dāng)對(duì)象即將被銷毀時(shí),有時(shí)需要做一些善后工作。可以把這些操作寫在finalize()方法里。
java 代碼
⑶代碼示例 java 代碼
5.Java 內(nèi)存泄漏 考慮下面的程序,在ObjStack類中,使用push和pop方法來(lái)管理堆棧中的對(duì)象。兩個(gè)方法中的索引(index)用于指示堆棧中下一個(gè)可用位置。push方法存儲(chǔ)對(duì)新對(duì)象的引用并增加索引值,而pop方法減小索引值并返回堆棧最上面的元素。在main方法中,創(chuàng)建了容量為64的棧,并64次調(diào)用push方法向它添加對(duì)象,此時(shí)index的值為64,隨后又32次調(diào)用pop方法,則index的值變?yōu)?2,出棧意味著在堆棧中的空間應(yīng)該被收集。但事實(shí)上,pop方法只是減小了索引值,堆棧仍然保持著對(duì)那些對(duì)象的引用。故32個(gè)無(wú)用對(duì)象不會(huì)被GC回收,造成了內(nèi)存滲漏。
java 代碼
6.如何消除內(nèi)存泄漏 雖然Java虛擬機(jī)(JVM)及其垃圾收集器(garbage collector,GC)負(fù)責(zé)管理大多數(shù)的內(nèi)存任務(wù),Java軟件程序中還是有可能出現(xiàn)內(nèi)存泄漏。實(shí)際上,這在大型項(xiàng)目中是一個(gè)常見(jiàn)的問(wèn)題。避免內(nèi)存泄漏的第一步是要弄清楚它是如何發(fā)生的。本文介紹了編寫Java代碼的一些常見(jiàn)的內(nèi)存泄漏陷阱,以及編寫不泄漏代碼的一些最佳實(shí)踐。一旦發(fā)生了內(nèi)存泄漏,要指出造成泄漏的代碼是非常困難的。因此本文還介紹了一種新工具,用來(lái)診斷泄漏并指出根本原因。該工具的開(kāi)銷非常小,因此可以使用它來(lái)尋找處于生產(chǎn)中的系統(tǒng)的內(nèi)存泄漏。 垃圾收集器的作用 雖然垃圾收集器處理了大多數(shù)內(nèi)存管理問(wèn)題,從而使編程人員的生活變得更輕松了,但是編程人員還是可能犯錯(cuò)而導(dǎo)致出現(xiàn)內(nèi)存問(wèn)題。簡(jiǎn)單地說(shuō),GC循環(huán)地跟蹤所有來(lái)自“根”對(duì)象(堆棧對(duì)象、靜態(tài)對(duì)象、JNI句柄指向的對(duì)象,諸如此類)的引用,并將所有它所能到達(dá)的對(duì)象標(biāo)記為活動(dòng)的。程序只可以操縱這些對(duì)象;其他的對(duì)象都被刪除了。因?yàn)镚C使程序不可能到達(dá)已被刪除的對(duì)象,這么做就是安全的。 雖然內(nèi)存管理可以說(shuō)是自動(dòng)化的,但是這并不能使編程人員免受思考內(nèi)存管理問(wèn)題之苦。例如,分配(以及釋放)內(nèi)存總會(huì)有開(kāi)銷,雖然這種開(kāi)銷對(duì)編程人員來(lái)說(shuō)是不可見(jiàn)的。創(chuàng)建了太多對(duì)象的程序?qū)?huì)比完成同樣的功能而創(chuàng)建的對(duì)象卻比較少的程序更慢一些(在其他條件相同的情況下)。 而且,與本文更為密切相關(guān)的是,如果忘記“釋放”先前分配的內(nèi)存,就可能造成內(nèi)存泄漏。如果程序保留對(duì)永遠(yuǎn)不再使用的對(duì)象的引用,這些對(duì)象將會(huì)占用并耗盡內(nèi)存,這是因?yàn)樽詣?dòng)化的垃圾收集器無(wú)法證明這些對(duì)象將不再使用。正如我們先前所說(shuō)的,如果存在一個(gè)對(duì)對(duì)象的引用,對(duì)象就被定義為活動(dòng)的,因此不能刪除。為了確保能回收對(duì)象占用的內(nèi)存,編程人員必須確保該對(duì)象不能到達(dá)。這通常是通過(guò)將對(duì)象字段設(shè)置為null或者從集合(collection)中移除對(duì)象而完成的。但是,注意,當(dāng)局部變量不再使用時(shí),沒(méi)有必要將其顯式地設(shè)置為null。對(duì)這些變量的引用將隨著方法的退出而自動(dòng)清除。 概括地說(shuō),這就是內(nèi)存托管語(yǔ)言中的內(nèi)存泄漏產(chǎn)生的主要原因:保留下來(lái)卻永遠(yuǎn)不再使用的對(duì)象引用。 典型泄漏 既然我們知道了在Java中確實(shí)有可能發(fā)生內(nèi)存泄漏,就讓我們來(lái)看一些典型的內(nèi)存泄漏及其原因。 全局集合 在大的應(yīng)用程序中有某種全局的數(shù)據(jù)儲(chǔ)存庫(kù)是很常見(jiàn)的,例如一個(gè)JNDI樹(shù)或一個(gè)會(huì)話表。在這些情況下,必須注意管理儲(chǔ)存庫(kù)的大小。必須有某種機(jī)制從儲(chǔ)存庫(kù)中移除不再需要的數(shù)據(jù)。 這可能有多種方法,但是最常見(jiàn)的一種是周期性運(yùn)行的某種清除任務(wù)。該任務(wù)將驗(yàn)證儲(chǔ)存庫(kù)中的數(shù)據(jù),并移除任何不再需要的數(shù)據(jù)。 另一種管理儲(chǔ)存庫(kù)的方法是使用反向鏈接(referrer)計(jì)數(shù)。然后集合負(fù)責(zé)統(tǒng)計(jì)集合中每個(gè)入口的反向鏈接的數(shù)目。這要求反向鏈接告訴集合何時(shí)會(huì)退出入口。當(dāng)反向鏈接數(shù)目為零時(shí),該元素就可以從集合中移除了。 緩存 緩存是一種數(shù)據(jù)結(jié)構(gòu),用于快速查找已經(jīng)執(zhí)行的操作的結(jié)果。因此,如果一個(gè)操作執(zhí)行起來(lái)很慢,對(duì)于常用的輸入數(shù)據(jù),就可以將操作的結(jié)果緩存,并在下次調(diào)用該操作時(shí)使用緩存的數(shù)據(jù)。 緩存通常都是以動(dòng)態(tài)方式實(shí)現(xiàn)的,其中新的結(jié)果是在執(zhí)行時(shí)添加到緩存中的。典型的算法是: 檢查結(jié)果是否在緩存中,如果在,就返回結(jié)果。 如果結(jié)果不在緩存中,就進(jìn)行計(jì)算。 將計(jì)算出來(lái)的結(jié)果添加到緩存中,以便以后對(duì)該操作的調(diào)用可以使用。 該算法的問(wèn)題(或者說(shuō)是潛在的內(nèi)存泄漏)出在最后一步。如果調(diào)用該操作時(shí)有相當(dāng)多的不同輸入,就將有相當(dāng)多的結(jié)果存儲(chǔ)在緩存中。很明顯這不是正確的方法。 為了預(yù)防這種具有潛在破壞性的設(shè)計(jì),程序必須確保對(duì)于緩存所使用的內(nèi)存容量有一個(gè)上限。因此,更好的算法是: 檢查結(jié)果是否在緩存中,如果在,就返回結(jié)果。 如果結(jié)果不在緩存中,就進(jìn)行計(jì)算。 如果緩存所占的空間過(guò)大,就移除緩存最久的結(jié)果。 將計(jì)算出來(lái)的結(jié)果添加到緩存中,以便以后對(duì)該操作的調(diào)用可以使用。 通過(guò)始終移除緩存最久的結(jié)果,我們實(shí)際上進(jìn)行了這樣的假設(shè):在將來(lái),比起緩存最久的數(shù)據(jù),最近輸入的數(shù)據(jù)更有可能用到。這通常是一個(gè)不錯(cuò)的假設(shè)。 新算法將確保緩存的容量處于預(yù)定義的內(nèi)存范圍之內(nèi)。確切的范圍可能很難計(jì)算,因?yàn)榫彺嬷械膶?duì)象在不斷變化,而且它們的引用包羅萬(wàn)象。為緩存設(shè)置正確的大小是一項(xiàng)非常復(fù)雜的任務(wù),需要將所使用的內(nèi)存容量與檢索數(shù)據(jù)的速度加以平衡。 解決這個(gè)問(wèn)題的另一種方法是使用java.lang.ref.SoftReference類跟蹤緩存中的對(duì)象。這種方法保證這些引用能夠被移除,如果虛擬機(jī)的內(nèi)存用盡而需要更多堆的話。 ClassLoader Java ClassLoader結(jié)構(gòu)的使用為內(nèi)存泄漏提供了許多可乘之機(jī)。正是該結(jié)構(gòu)本身的復(fù)雜性使ClassLoader在內(nèi)存泄漏方面存在如此多的問(wèn)題。ClassLoader的特別之處在于它不僅涉及“常規(guī)”的對(duì)象引用,還涉及元對(duì)象引用,比如:字段、方法和類。這意味著只要有對(duì)字段、方法、類或ClassLoader的對(duì)象的引用,ClassLoader就會(huì)駐留在JVM中。因?yàn)镃lassLoader本身可以關(guān)聯(lián)許多類及其靜態(tài)字段,所以就有許多內(nèi)存被泄漏了。 確定泄漏的位置 通常發(fā)生內(nèi)存泄漏的第一個(gè)跡象是:在應(yīng)用程序中出現(xiàn)了OutOfMemoryError。這通常發(fā)生在您最不愿意它發(fā)生的生產(chǎn)環(huán)境中,此時(shí)幾乎不能進(jìn)行調(diào)試。有可能是因?yàn)闇y(cè)試環(huán)境運(yùn)行應(yīng)用程序的方式與生產(chǎn)系統(tǒng)不完全相同,因而導(dǎo)致泄漏只出現(xiàn)在生產(chǎn)中。在這種情況下,需要使用一些開(kāi)銷較低的工具來(lái)監(jiān)控和查找內(nèi)存泄漏。還需要能夠無(wú)需重啟系統(tǒng)或修改代碼就可以將這些工具連接到正在運(yùn)行的系統(tǒng)上。可能最重要的是,當(dāng)進(jìn)行分析時(shí),需要能夠斷開(kāi)工具而保持系統(tǒng)不受干擾。 雖然OutOfMemoryError通常都是內(nèi)存泄漏的信號(hào),但是也有可能應(yīng)用程序確實(shí)正在使用這么多的內(nèi)存;對(duì)于后者,或者必須增加JVM可用的堆的數(shù)量,或者對(duì)應(yīng)用程序進(jìn)行某種更改,使它使用較少的內(nèi)存。但是,在許多情況下,OutOfMemoryError都是內(nèi)存泄漏的信號(hào)。一種查明方法是不間斷地監(jiān)控GC的活動(dòng),確定內(nèi)存使用量是否隨著時(shí)間增加。如果確實(shí)如此,就可能發(fā)生了內(nèi)存泄漏。 posted @ 2008-12-03 09:41 追風(fēng)舞者 閱讀(1312) | 評(píng)論 (1) | 編輯 收藏 public class Search {
/** * 前提條件array數(shù)組已排序 */ public static boolean binarySearch(int[] array, int target) { boolean result = false; int bottom = 0; int top = array.length-1; while (bottom <= top) { int mid = (top + bottom) / 2; if (target == array[mid]) { result = true; break; } else if (target < array[mid]) { top = mid - 1; } else if (target > array[mid]) { bottom = mid + 1; } } return result; } public static void main(String[] args) { int [] array = {1,3,5,7,9,10}; boolean result = binarySearch(array, 10); System.out.println(result); } } posted @ 2008-10-10 16:19 追風(fēng)舞者 閱讀(217) | 評(píng)論 (0) | 編輯 收藏 import java.io.BufferedReader;
import java.io.IOException; import java.io.InputStreamReader; public class Hanoi { public static void main(String[] args) throws NumberFormatException, IOException { System.out.print("請(qǐng)輸入盤數(shù):"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); move(n, 'A', 'B', 'C'); } /** * 將n個(gè)盤子借助b,從 a 移到 c */ public static void move(int n, char a, char b, char c) { if (n == 1) System.out.println("盤 " + n + " 由 " + a + " 移至 " + c); else { move(n - 1, a, c, b); System.out.println("盤 " + n + " 由 " + a + " 移至 " + c); move(n - 1, b, a, c); } } } posted @ 2008-10-10 15:56 追風(fēng)舞者 閱讀(204) | 評(píng)論 (0) | 編輯 收藏 public class Sort {
public static void quickSort(int[] array) { quickSort(array, 0, array.length - 1); } private static void quickSort(int[] array, int low, int high) { if (low < high) { int p = partition(array, low, high); quickSort(array, low, p - 1); quickSort(array, p + 1, high); } } private static int partition(int[] array, int low, int high) { int s = array[high]; int i = low - 1; for (int j = low; j < high; j++) { if (array[j] < s) { i++; swap(array, i, j); } } swap(array, ++i, high); return i; } private static void swap(int[] array, int i, int j) { int temp; temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void main(String[] args) { int [] array = {2,5,3,7,4}; quickSort(array); for(int i = 0;i<array.length;i++){ System.out.println(array[i]); } } } posted @ 2008-10-10 15:39 追風(fēng)舞者 閱讀(2062) | 評(píng)論 (4) | 編輯 收藏 在Ubuntu 8.04中查看顯卡是否裝好
運(yùn)行g(shù)lxinfo | grep rendering 如果顯示”direct rendering: Yes”,則已安裝 1、下載驅(qū)動(dòng) 我下載的就是NVIDIA-Linux-x86_64-173.14.12-pkg2.run這個(gè)文件,下載后放到home目錄下吧。 2、刪除原驅(qū)動(dòng)包 sudo apt-get -–purge remove nvidia-glx nvidia-glx-new 然后刪除 /lib/linux-restricted-modules/2.6.22-14-generic/文件夾下面帶有nvidia字樣的內(nèi)容,注意里面有一個(gè)隱藏文件.nvidia-new-installer也要?jiǎng)h掉 這里是內(nèi)核自帶的驅(qū)動(dòng) 再檢查一下這兩個(gè)文件是否存在,/etc/init.d/nvidia-glx /etc/init.d/nvidia-kernel 如果存在,刪除掉。 3、安裝要用到的軟件 sudo apt-get install build-essential pkg-config xserver-xorg-dev linux-headers-`uname -r` 安裝編譯包。 我在安裝的時(shí)候提示說(shuō)沒(méi)有l(wèi)ib,驅(qū)動(dòng)安裝時(shí)候要安裝Kernel Interface,如果采用自己編譯的方式則要求系統(tǒng)中有l(wèi)ibc的源碼。我想一般人都是沒(méi)有的,呵呵。這個(gè)時(shí)候我們可以在安裝驅(qū)動(dòng)之前先自己把這個(gè)源碼給安裝好,問(wèn)題就解決了。如何安裝?呵呵,更簡(jiǎn)單,強(qiáng)大的 apt install阿, 運(yùn)行: sudo apt-get install libc6-dev 一行命令搞定。 4、備份 備份文件是一個(gè)好習(xí)慣。 sudo cp /etc/default/linux-restricted-modules-common ~/linux-restricted-modules-common.backup sudo cp /etc/X11/xorg.conf ~/xorg.conf.backup 5、禁止系統(tǒng)使用默認(rèn)的驅(qū)動(dòng) sudo gedit /etc/default/linux-restricted-modules-common 在最后的雙引號(hào)中添加nv nvidia_new,即把文件中的“”,改成“nv nvidia_new” 如果前面第二步刪除完整了其實(shí)也可以不用執(zhí)行這一步。 6、將后面的操作記錄在紙上,因?yàn)楹竺鏁?huì)完全在終端字符界面下操作。 7、停止GDM進(jìn)程 sudo /etc/init.d/gdm stop 按Ctrl+Alt+F1,登錄后進(jìn)入第7步。 8、安裝驅(qū)動(dòng) 進(jìn)入下好的驅(qū)動(dòng)所在目錄 執(zhí)行:sudo sh ./NVIDIA-Linux-x86_64-173.14.12-pkg2.run 安裝過(guò)程中 如果提示有舊驅(qū)動(dòng),詢問(wèn)是否刪除舊驅(qū)動(dòng),選Yes; 如果提示缺少某某模塊(modules),詢問(wèn)是否上網(wǎng)下載,選no; 如果提示編譯模塊,詢問(wèn)是否進(jìn)行編譯,選ok; 如果提示將要修改Xorg.conf,詢問(wèn)是否允許,選Yes; 接下來(lái)就是等待安裝完成。 9、安裝完成就回到終端,重啟GDM sudo /etc/init.d/gdm restart 如果失敗,就重啟機(jī)子:sudo shutdown -r now 好了,當(dāng)看到NV的logo后,才表示安裝成功。 如果不想看NVIDIA的LOGO,可以修改 /etc/X11/xorg.conf 在Section “Device”中添加Option “NoLogo” “True” 如: Section “Device” Identifier “通用顯示卡” Driver “nvidia” Option “NoLogo” “True” EndSection 10.顯示高級(jí)設(shè)置 如果想進(jìn)行顯示方面的高級(jí)設(shè)置,在終端下輸入:nvidia-settings命令。 左邊第二項(xiàng)是設(shè)置分辨率(server display configuration),從右邊的resolution中選擇分辨率,再點(diǎn)擊apply, 預(yù)覽一下,不好取消就行了。 至此,安裝完畢。 如果御載的話就用這個(gè)命令 sh NVIDIA-Linux-x86_64-173.14.12-pkg2.run –uninstall 安裝成功,就這么簡(jiǎn)單,一般nvidia 會(huì)自動(dòng)配置好所有~` 重新配置x server: sudo apt-get install pkg-config xserver-xorg-dev3 sudo dpkg-reconfigure xserver-xorg posted @ 2008-09-19 13:23 追風(fēng)舞者 閱讀(515) | 評(píng)論 (0) | 編輯 收藏 安裝MySQL sudo apt-get install mysql-server 這個(gè)應(yīng)該很簡(jiǎn)單了,而且我覺(jué)得大家在安裝方面也沒(méi)什么太大問(wèn)題,所以也就不多說(shuō)了,下面我們來(lái)講講配置。 配置MySQL 注意,在Ubuntu下MySQL缺省是只允許本地訪問(wèn)的,如果你要其他機(jī)器也能夠訪問(wèn)的話,那么需要改變/etc/mysql/my.cnf配置文件了!下面我們一步步地來(lái): 默認(rèn)的MySQL安裝之后根用戶是沒(méi)有密碼的,所以首先用根用戶進(jìn)入: $mysql -u root 在這里之所以用-u root是因?yàn)槲椰F(xiàn)在是一般用戶(firehare),如果不加-u root的話,mysql會(huì)以為是firehare在登錄。注意,我在這里沒(méi)有進(jìn)入根用戶模式,因?yàn)闆](méi)必要。一般來(lái)說(shuō),對(duì)mysql中的數(shù)據(jù)庫(kù)進(jìn)行操作, 根本沒(méi)必要進(jìn)入根用戶模式,只有在設(shè)置時(shí)才有這種可能。 進(jìn)入mysql之后,最要緊的就是要設(shè)置Mysql中的root用戶密碼了,否則,Mysql服務(wù)無(wú)安全可言了。 mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456"; 注意,我這兒用的是123456做為root用戶的密碼,但是該密碼是不安全的,請(qǐng)大家最好使用大小寫字母與數(shù)字混合的密碼,且不少于8位。 這樣的話,就設(shè)置好了MySQL中的root用戶密碼了,然后就用root用戶建立你所需要的數(shù)據(jù)庫(kù)。我這里就以xoops為例: mysql>CREATE DATABASE xoops; mysql>GRANT ALL PRIVILEGES ON xoops.* TO xoops_root@localhost IDENTIFIED BY "654321"; 這樣就建立了一個(gè)xoops_roots的用戶,它對(duì)數(shù)據(jù)庫(kù)xoops有著全部權(quán)限。以后就用xoops_root來(lái)對(duì)xoops數(shù)據(jù)庫(kù)進(jìn)行管理,而無(wú)需要再用root用戶了,而該用戶的權(quán)限也只被限定在xoops數(shù)據(jù)庫(kù)中。 如果你想進(jìn)行遠(yuǎn)程訪問(wèn)或控制,那么你要做兩件事: 其一: mysql>GRANT ALL PRIVILEGES ON xoops.* TO xoops_root@"%" IDENTIFIED BY "654321"; 允許xoops_root用戶可以從任意機(jī)器上登入MySQL。 其二: $sudo gedit /etc/mysql/my.cnf 老的版本中 >skip-networking => # skip-networking 新的版本中 >bind-address=127.0.0.1 => bind-address= 你機(jī)器的IP 這樣就可以允許其他機(jī)器訪問(wèn)MySQL了。posted @ 2008-09-18 17:53 追風(fēng)舞者 閱讀(184) | 評(píng)論 (0) | 編輯 收藏 Ubuntu8.04開(kāi)啟3D桌面特效與設(shè)置方法Ubuntu 8.04 (Hardy Heron) 中集成了強(qiáng)大3D交互界面,Ubuntu 的 3D桌面特效給用戶帶來(lái)了一種全新的視覺(jué)用戶。想必有很多朋友也因?yàn)榭吹搅?Ubuntu 8.04 那炫目的 3D 桌面特效才開(kāi)始慢慢地了解Ubuntu 8.04 (Hardy Heron) 的。雖然在這之前也不少的朋友寫過(guò)設(shè)置 Ubuntu 閱讀全文 類別:Ubuntu 查看評(píng)論 文章來(lái)源:http://hi.baidu.com/whchensiyuan/blog/item/75a0ddbe9e308d0c18d81fd5.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(530) | 評(píng)論 (0) | 編輯 收藏 Ubuntu 8.04加源安裝Google Gadgets
Google Gadgets是一套跨平臺(tái)的桌面工具集,for Linux版本剛剛公布不久。 在ubuntu 8.04中: 編輯源文件:
加入下面兩行:
類別:Ubuntu 查看評(píng)論 文章來(lái)源:http://hi.baidu.com/whchensiyuan/blog/item/0c2bec1ebdef9a0c314e15bf.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(101) | 評(píng)論 (0) | 編輯 收藏
很多新手面臨的困難和困惑都出現(xiàn)在編譯和打包軟件方面,unubtu的apt-get方式的確很易用,但是也屏蔽了學(xué)習(xí)的空間,對(duì)于那些希望好好學(xué)習(xí)linux的而又感到困惑的人,通過(guò)以下三個(gè)程序的幫助,應(yīng)該可以有效的減輕你的負(fù)擔(dān):
第一個(gè),checkinstall 安裝命令:sudo apt-get install checkinstall 程序功能:能跟蹤由“make install”或類似命令安裝的所有文件,并為這些文件創(chuàng)建Slackware、RPM或者Debian安裝包,然后把它添加到已安裝軟件包數(shù)據(jù)庫(kù)中,以 閱讀全文 類別:默認(rèn)分類 查看評(píng)論 文章來(lái)源:http://hi.baidu.com/whchensiyuan/blog/item/ac02403c7db675e83c6d9745.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(130) | 評(píng)論 (0) | 編輯 收藏
Linux常用命令詳解
來(lái)源: LUPA開(kāi)源社區(qū) 發(fā)布時(shí)間: 2007-05-27 05:34 版權(quán)申明 字體: 小 中 大 [點(diǎn)擊圖片可在新窗口打開(kāi)] 文章來(lái)源于http://www.lupaworld.com Linux之所以受到廣大計(jì)算機(jī)愛(ài)好者的喜愛(ài),主要原因有兩個(gè),首先它是自由軟件,用戶不用支付費(fèi)用就可以使用它,并可根據(jù)自己的需要對(duì)它進(jìn)行修改。另外,它具有Unix的全部功能,任何使用Unix系統(tǒng)或想要學(xué)習(xí)Unix系統(tǒng)的人都可以從中獲益。 讓我們一起從每一個(gè)命令開(kāi)始,走向Linux高手之路吧。 1.Linux進(jìn)入與退出系 閱讀全文 類別:默認(rèn)分類 查看評(píng)論 文章來(lái)源:http://hi.baidu.com/whchensiyuan/blog/item/8a8b9ad58836ab07a08bb74e.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(148) | 評(píng)論 (0) | 編輯 收藏
ubuntu中默認(rèn)的是gnome桌面,也可以為你的程序設(shè)置快捷方式。
可以以兩種方式生成快捷方式,這里叫做起動(dòng)器:命令行方式和拖動(dòng)程序圖標(biāo)的方式。這里以Lumaqq為例說(shuō)明之。 1.在應(yīng)用程序菜單中創(chuàng)建起動(dòng)器: 在命令行中輸入如下命令: sudo gedit /usr/share/applications/LumaQQ.desktop //sudo是以超級(jí)用戶權(quán)限執(zhí)行后面命令 //gedit是打開(kāi)文本編輯器,后面的路徑標(biāo)識(shí)要編輯的文件 //在/usr/share/applications目錄下可以看到許多*.desktop的文件,都是應(yīng)用程序的起動(dòng)器,所以上述 閱讀全文 類別:默認(rèn)分類 查看評(píng)論 文章來(lái)源:http://hi.baidu.com/whchensiyuan/blog/item/df1445e695411c28b83820f4.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(121) | 評(píng)論 (0) | 編輯 收藏
已經(jīng)有一些熱心人寫了Compiz Fusion的設(shè)置指南,但大多是在7.10版下面的,現(xiàn)在系統(tǒng)升級(jí)成8.04后,CompizConfig設(shè)置管理器的內(nèi)容有些不同,我等新手摸索了幾天,小有心得,奉獻(xiàn)給大家,寫得有點(diǎn)羅嗦,清見(jiàn)諒。
點(diǎn)擊 系統(tǒng)->首選項(xiàng)->Advanced Desktop Effects Settings 打開(kāi)CompizConfig設(shè)置管理器(即CCSM) 1、3D桌面設(shè)置:點(diǎn)擊General options,把Desktop Size選項(xiàng)卡里的“Horizontal Virtual Size(水平虛擬大小)”設(shè)置為4,“Vertical Virtual Size(垂直虛擬大小)”設(shè)置為 閱讀全文 類別:默認(rèn)分類 查看評(píng)論 文章來(lái)源:http://hi.baidu.com/whchensiyuan/blog/item/43e981eef1e8fee9cf1b3e4a.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(231) | 評(píng)論 (0) | 編輯 收藏 Linux之所以受到廣大計(jì)算機(jī)愛(ài)好者的喜愛(ài),主要原因有兩個(gè),首先它是自由軟件,用戶不用支付費(fèi)用就可以使用它,并可根據(jù)自己的需要對(duì)它進(jìn)行修改。另外,它具有Unix的全部功能,任何使用Unix系統(tǒng)或想要學(xué)習(xí)Unix系統(tǒng)的人都可以從中獲益。
讓我們一起從每一個(gè)命令開(kāi)始,走向Linux高手之路吧。 1.Linux進(jìn)入與退出系統(tǒng) 進(jìn)入Linux系統(tǒng): 必須要輸入用戶的賬號(hào),在系統(tǒng)安裝過(guò)程中可以創(chuàng)建以下兩種帳號(hào): 1.root--超級(jí)用戶帳號(hào)(系統(tǒng)管理員),使用這個(gè)帳號(hào)可以在系統(tǒng)中做任何事情。 2.普通用戶--這個(gè)帳號(hào)供普通用戶使用,可以進(jìn)行有限的操作。 一般的Linux使用者均為普通用戶,而系統(tǒng)管理員一般使用超級(jí)用戶帳號(hào)完成一些系統(tǒng)管理的工作。如果只需要完成一些由普通帳號(hào)就能完成的任務(wù),建議不要使用超級(jí)用戶帳號(hào),以免無(wú)意中破壞系統(tǒng)。影響系統(tǒng)的正常運(yùn)行。 用戶登錄分兩步:第一步,輸入用戶的登錄名,系統(tǒng)根據(jù)該登錄名識(shí)別用戶;第二步,輸入用戶的口令,該口令是用戶自己設(shè)置的一個(gè)字符串,對(duì)其他用戶是保密的,是在登錄時(shí)系統(tǒng)用來(lái)辨別真假用戶的關(guān)鍵字。 當(dāng)用戶正確地輸入用戶名和口令后,就能合法地進(jìn)入系統(tǒng)。屏幕顯示: [root@loclhost /root] # 這時(shí)就可以對(duì)系統(tǒng)做各種操作了。注意超級(jí)用戶的提示符是“#”,其他用戶的提示符是“$”。 修改口令 為了更好的保護(hù)用戶帳號(hào)的安全,Linux允許用戶隨時(shí)修改自己的口令,修改口令的命令是passwd,它將提示用戶輸入舊口令和新口令,之后還要求用戶再次確認(rèn)新口令,以避免用戶無(wú)意中按錯(cuò)鍵。如果用戶忘記了口令,可以向系統(tǒng)管理員申請(qǐng)為自己重新設(shè)置一個(gè)。 虛擬控制臺(tái) Linux是一個(gè)真正的多用戶操作系統(tǒng),它可以同時(shí)接受多個(gè)用戶登錄。Linux還允許一個(gè)用戶進(jìn)行多次登錄,這是因?yàn)長(zhǎng)inux和UNIX一樣,提供了 虛擬控制臺(tái)的訪問(wèn)方式,允許用戶在同一時(shí)間從控制臺(tái)進(jìn)行多次登錄。虛擬控制臺(tái)的選擇可以通過(guò)按下Alt鍵和一個(gè)功能鍵來(lái)實(shí)現(xiàn),通常使用F1-F6例如,用 戶登錄后,按一下Alt-F2鍵,用戶又可以看到"login:"提示符,說(shuō)明用戶看到了第二個(gè)虛擬控制臺(tái)。然后只需按Alt-F1鍵,就可以回到第一個(gè) 虛擬控制臺(tái)。一個(gè)新安裝的Linux系統(tǒng)默認(rèn)允許用戶使用Alt-F1到Alt-F6鍵來(lái)訪問(wèn)前六個(gè)虛擬控制臺(tái)。虛擬控制臺(tái)可使用戶同時(shí)在多個(gè)控制臺(tái)上工 作,真正體現(xiàn) Linux系統(tǒng)多用戶的特性。用戶可以在某一虛擬控制臺(tái)上進(jìn)行的工作尚未結(jié)束時(shí),切換到另一虛擬控制臺(tái)開(kāi)始另一項(xiàng)工作。 退出系統(tǒng) 不論是超級(jí)用戶,還是普通用戶,需要退出系統(tǒng)時(shí),在shell提示符下,鍵入exit命令即可。 Linux文件的復(fù)制、刪除和移動(dòng)命令 cp命令 該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同MSDOS下的copy命令一樣,功能十分強(qiáng)大。 語(yǔ)法: cp [選項(xiàng)] 源文件或目錄 目標(biāo)文件或目錄 說(shuō)明:該命令把指定的源文件復(fù)制到目標(biāo)文件或把多個(gè)源文件復(fù)制到目標(biāo)目錄中。 該命令的各選項(xiàng)含義如下: - a 該選項(xiàng)通常在拷貝目錄時(shí)使用。它保留鏈接、文件屬性,并遞歸地拷貝目錄,其作用等于dpR選項(xiàng)的組合。 - d 拷貝時(shí)保留鏈接。 - f 刪除已經(jīng)存在的目標(biāo)文件而不提示。 - i 和f選項(xiàng)相反,在覆蓋目標(biāo)文件之前將給出提示要求用戶確認(rèn)。回答y時(shí)目標(biāo)文件將被覆蓋,是交互式拷貝。 - p 此時(shí)cp除復(fù)制源文件的內(nèi)容外,還將把其修改時(shí)間和訪問(wèn)權(quán)限也復(fù)制到新文件中。 - r 若給出的源文件是一目錄文件,此時(shí)cp將遞歸復(fù)制該目錄下所有的子目錄和文件。此時(shí)目標(biāo)文件必須為一個(gè)目錄名。 - l 不作拷貝,只是鏈接文件。 需要說(shuō)明的是,為防止用戶在不經(jīng)意的情況下用cp命令破壞另一個(gè)文件,如用戶指定的目標(biāo)文件名已存在,用cp命令拷貝文件后,這個(gè)文件就會(huì)被新源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時(shí),最好使用i選項(xiàng)。 mv命令 用戶可以使用mv命令來(lái)為文件或目錄改名或?qū)⑽募梢粋€(gè)目錄移入另一個(gè)目錄中。該命令如同MSDOS下的ren和move的組合。 語(yǔ)法:mv [選項(xiàng)] 源文件或目錄 目標(biāo)文件或目錄 說(shuō)明:視mv命令中第二個(gè)參數(shù)類型的不同(是目標(biāo)文件還是目標(biāo)目錄),mv命令將文件重命名或?qū)⑵湟浦烈粋€(gè)新的目錄中。當(dāng)?shù)诙€(gè)參數(shù)類型是文件時(shí),mv 命令完成文件重命名,此時(shí),源文件只能有一個(gè)(也可以是源目錄名),它將所給的源文件或目錄重命名為給定的目標(biāo)文件名。當(dāng)?shù)诙€(gè)參數(shù)是已存在的目錄名稱 時(shí),源文件或目錄參數(shù)可以有多個(gè),mv命令將各參數(shù)指定的源文件均移至目標(biāo)目錄中。在跨文件系統(tǒng)移動(dòng)文件時(shí),mv先拷貝,再將原有文件刪除,而鏈至該文件 的鏈接也將丟失。 命令中各選項(xiàng)的含義為: - I 交互方式操作。如果mv操作將導(dǎo)致對(duì)已存在的目標(biāo)文件的覆蓋,此時(shí)系統(tǒng)詢問(wèn)是否重寫,要求用戶回答y或n,這樣可以避免誤覆蓋文件。 - f 禁止交互操作。在mv操作要覆蓋某已有的目標(biāo)文件時(shí)不給任何指示,指定此選項(xiàng)后,i選項(xiàng)將不再起作用。 如果所給目標(biāo)文件(不是目錄)已存在,此時(shí)該文件的內(nèi)容將被新文件覆蓋。為防止用戶用mv命令破壞另一個(gè)文件,使用mv命令移動(dòng)文件時(shí),最好使用i選項(xiàng)。 rm命令 用戶可以用rm命令刪除不需要的文件。該命令的功能為刪除一個(gè)目錄中的一個(gè)或多個(gè)文件或目錄,它也可以將某個(gè)目錄及其下的所有文件及子目錄均刪除。對(duì)于鏈接文件,只是斷開(kāi)了鏈接,原文件保持不變。 rm命令的一般形式為: rm [選項(xiàng)] 文件… 如果沒(méi)有使用- r選項(xiàng),則rm不會(huì)刪除目錄。 該命令的各選項(xiàng)含義如下: - f 忽略不存在的文件,從不給出提示。 - r 指示rm將參數(shù)中列出的全部目錄和子目錄均遞歸地刪除。 - i 進(jìn)行交互式刪除。 使用rm命令要小心。因?yàn)橐坏┪募粍h除,它是不能被恢復(fù)的。了防止這種情況的發(fā)生,可以使用i選項(xiàng)來(lái)逐個(gè)確認(rèn)要?jiǎng)h除的文件。如果用戶輸入y,文件將被刪除。如果輸入任何其他東西,文件則不會(huì)刪除。 Linux目錄的創(chuàng)建與刪除命令 mkdir命令 功能:創(chuàng)建一個(gè)目錄(類似MSDOS下的md命令)。 語(yǔ)法:mkdir [選項(xiàng)] dir-name 說(shuō)明:該命令創(chuàng)建由dir-name命名的目錄。要求創(chuàng)建目錄的用戶在當(dāng)前目錄中(dir-name的父目錄中)具有寫權(quán)限,并且dirname不能是當(dāng)前目錄中已有的目錄或 文件名稱。 命令中各選項(xiàng)的含義為: - m 對(duì)新建目錄設(shè)置存取權(quán)限。也可以用chmod命令設(shè)置。 - p 可以是一個(gè)路徑名稱。此時(shí)若路徑中的某些目錄尚不存在, 加上此選項(xiàng)后, 系統(tǒng)將自動(dòng)建立好那些尚不存在的目錄,即一次可以建立多個(gè)目錄。 rmdir 命令 功能:刪除空目錄。 語(yǔ)法:rmdir [選項(xiàng)] dir-name 說(shuō)明:dir-name表示目錄名。該命令從一個(gè)目錄中刪除一個(gè)或多個(gè)子目錄項(xiàng)。需要 特別注意的是,一個(gè)目錄被刪除之前必須是空的。rm - r dir命令可代替 rmdir,但是有危險(xiǎn)性。刪除某目錄時(shí)也必須具有對(duì)父目錄的寫權(quán)限。 命令中各選項(xiàng)的含義為: - p 遞歸刪除目錄dirname,當(dāng)子目錄刪除后其父目錄為空時(shí),也一同被刪除。如果整個(gè)路徑被刪除或者由于某種原因保留部分路徑,則系統(tǒng)在標(biāo)準(zhǔn)輸出上顯示相應(yīng) 的信息。 cd 命令 功能:改變工作目錄。 語(yǔ)法:cd [directory] 說(shuō)明:該命令將當(dāng)前目錄改變至directory所指定的目錄。若沒(méi)有指定directory, 則回到用戶的主目錄。為了改變到指定目錄,用戶必須擁有對(duì)指定目錄的執(zhí)行和讀 權(quán)限。 該命令可以使用通配符(通配符含義請(qǐng)參見(jiàn)第十章)。 pwd 命令 在Linux層次目錄結(jié)構(gòu)中,用戶可以在被授權(quán)的任意目錄下利用mkdir命令創(chuàng)建新目錄,也可以利用cd命令從一個(gè)目錄轉(zhuǎn)換到另一個(gè)目錄。然而,沒(méi)有提示符來(lái)告知用 戶目前處于哪一個(gè)目錄中。要想知道當(dāng)前所處的目錄,可以使用pwd命令,該命令顯示整個(gè)路徑名。 語(yǔ)法:pwd 說(shuō)明:此命令顯示出當(dāng)前工作目錄的絕對(duì)路徑。 ls 命令 ls是英文單詞list的簡(jiǎn)寫,其功能為列出目錄的內(nèi)容。這是用戶最常用的一個(gè)命令之一,因?yàn)橛脩粜枰粫r(shí)地查看某個(gè)目錄的內(nèi)容。該命令類似于DOS下的dir命令。 語(yǔ)法:ls [選項(xiàng)] [目錄或是文件] 對(duì)于每個(gè)目錄,該命令將列出其中的所有子目錄與文件。對(duì)于每個(gè)文件,ls將輸出 其文件名以及所要求的其他信息。默認(rèn)情況下,輸出條目按字母順序排序。當(dāng)未給出目錄名或是文件名時(shí),就顯示當(dāng)前目錄的信息。 命令中各選項(xiàng)的含義如下: - a 顯示指定目錄下所有子目錄與文件,包括隱藏文件。 - A 顯示指定目錄下所有子目錄與文件,包括隱藏文件。但不列出“.”和 “..”。 - b 對(duì)文件名中的不可顯示字符用八進(jìn)制逃逸字符顯示。 - c 按文件的修改時(shí)間排序。 - C 分成多列顯示各項(xiàng)。 - d 如果參數(shù)是目錄,只顯示其名稱而不顯示其下的各文件。往往與l選項(xiàng)一起使 用,以得到目錄的詳細(xì)信息。 - f 不排序。該選項(xiàng)將使lts選項(xiàng)失效,并使aU選項(xiàng)有效。 - F 在目錄名后面標(biāo)記“/”,可執(zhí)行文件后面標(biāo)記“*”,符號(hào)鏈接后面標(biāo)記 “@”,管道(或FIFO)后面標(biāo)記“|”,socket文件后面標(biāo)記“=”。 - i 在輸出的第一列顯示文件的i節(jié)點(diǎn)號(hào)。 - l 以長(zhǎng)格式來(lái)顯示文件的詳細(xì)信息。這個(gè)選項(xiàng)最常用。 每行列出的信息依次是: 文件類型與權(quán)限 鏈接數(shù) 文件屬主 文件屬組 文件大小 建立或最近修改的時(shí)間 名字 對(duì)于符號(hào)鏈接文件,顯示的文件名之后有“—〉”和引用文件路徑名。 對(duì)于設(shè)備文件,其“文件大小”字段顯示主、次設(shè)備號(hào),而不是文件大小。 目錄中的總塊數(shù)顯示在長(zhǎng)格式列表的開(kāi)頭,其中包含間接塊。 - L 若指定的名稱為一個(gè)符號(hào)鏈接文件,則顯示鏈接所指向的文件。 - m 輸出按字符流格式,文件跨頁(yè)顯示,以逗號(hào)分開(kāi)。 - n 輸出格式與l選項(xiàng)相同,只不過(guò)在輸出中文件屬主和屬組是用相應(yīng)的UID號(hào)和 GID號(hào)來(lái)表示,而不是實(shí)際的名稱。 - o 與l選項(xiàng)相同,只是不顯示擁有者信息。 - p 在目錄后面加一個(gè)“/”。 - q 將文件名中的不可顯示字符用“?”代替。 - r 按字母逆序或最早優(yōu)先的順序顯示輸出結(jié)果。 - R 遞歸式地顯示指定目錄的各個(gè)子目錄中的文件。 - s 給出每個(gè)目錄項(xiàng)所用的塊數(shù),包括間接塊。 - t 顯示時(shí)按修改時(shí)間(最近優(yōu)先)而不是按名字排序。若文件修改時(shí)間相同,則 按字典順序。修改時(shí)間取決于是否使用了c或u選頂。缺省的時(shí)間標(biāo)記是最后一次修 改時(shí)間。 - u 顯示時(shí)按文件上次存取的時(shí)間(最近優(yōu)先)而不是按名字排序。即將-t的時(shí)間 標(biāo)記修改為最后一次訪問(wèn)的時(shí)間。 - x 按行顯示出各排序項(xiàng)的信息。 用ls - l命令顯示的信息中,開(kāi)頭是由10個(gè)字符構(gòu)成的字符串,其中第一個(gè)字符表示文件類型,它可以是下述類型之一: - 普通文件 d 目錄 l 符號(hào)鏈接 b 塊設(shè)備文件 c 字符設(shè)備文件 后面的9個(gè)字符表示文件的訪問(wèn)權(quán)限,分為3組,每組3位。 第一組表示文件屬主的權(quán)限,第二組表示同組用戶的權(quán)限,第三組表示其他用戶的權(quán)限。每一組的三個(gè)字 符分別表示對(duì)文件的讀、寫和執(zhí)行權(quán)限。 各權(quán)限如下所示: r 讀 w 寫 x 執(zhí)行。對(duì)于目錄,表示進(jìn)入權(quán)限。 s 當(dāng)文件被執(zhí)行時(shí),把該文件的UID或GID賦予執(zhí)行進(jìn)程的UID(用戶ID)或GID(組 ID)。 t 設(shè)置標(biāo)志位(留在內(nèi)存,不被換出)。如果該文件是目錄,在該目錄中的文件只能被超級(jí)用戶、目錄擁有者或文件屬主刪除。如果它是可執(zhí)行文件,在該文件執(zhí)行 后,指向其正文段的指針仍留在內(nèi)存。這樣再次執(zhí)行它時(shí),系統(tǒng)就能更快地裝入該文件。 Linux文本處理命令 sort命令 sort命令的功能是對(duì)文件中的各行進(jìn)行排序。sort命令有許多非常實(shí)用的選項(xiàng),這些選項(xiàng)最初是用來(lái)對(duì)數(shù)據(jù)庫(kù)格式的文件內(nèi)容進(jìn)行各種排序操作的。實(shí)際上,sort命令可以被認(rèn)為是一個(gè)非常強(qiáng)大的數(shù)據(jù)管理工具,用來(lái)管理內(nèi)容類似數(shù)據(jù)庫(kù)記錄的文件。 Sort命令將逐行對(duì)文件中的內(nèi)容進(jìn)行排序,如果兩行的首字符相同,該命令將繼續(xù)比較這兩行的下一字符,如果還相同,將繼續(xù)進(jìn)行比較。 語(yǔ)法: sort [選項(xiàng)] 文件 說(shuō)明:sort命令對(duì)指定文件中所有的行進(jìn)行排序,并將結(jié)果顯示在標(biāo)準(zhǔn)輸出上。如不指定輸入文件或使用“- ”,則表示排序內(nèi)容來(lái)自標(biāo)準(zhǔn)輸入。 sort排序是根據(jù)從輸入行抽取的一個(gè)或多個(gè)關(guān)鍵字進(jìn)行比較來(lái)完成的。排序關(guān)鍵字定義了用來(lái)排序的最小的字符序列。缺省情況下以整行為關(guān)鍵字按ASCII字符順序進(jìn)行排序。 改變?nèi)笔≡O(shè)置的選項(xiàng)主要有: - m 若給定文件已排好序,合并文件。 - c 檢查給定文件是否已排好序,如果它們沒(méi)有都排好序,則打印一個(gè)出錯(cuò)信息,并以狀態(tài)值1退出。 - u 對(duì)排序后認(rèn)為相同的行只留其中一行。 - o 輸出文件 將排序輸出寫到輸出文件中而不是標(biāo)準(zhǔn)輸出,如果輸出文件是輸入文件之一,sort先將該文件的內(nèi)容寫入一個(gè)臨時(shí)文件,然后再排序和寫輸出結(jié)果。 改變?nèi)笔∨判蛞?guī)則的選項(xiàng)主要有: - d 按字典順序排序,比較時(shí)僅字母、數(shù)字、空格和制表符有意義。 - f 將小寫字母與大寫字母同等對(duì)待。 - I 忽略非打印字符。 - M 作為月份比較:“JAN”<“FEB” - r 按逆序輸出排序結(jié)果。 +posl - pos2 指定一個(gè)或幾個(gè)字段作為排序關(guān)鍵字,字段位置從posl開(kāi)始,到pos2為止(包括posl,不包括pos2)。如不指定pos2,則關(guān)鍵字為從posl到行尾。字段和字符的位置從0開(kāi)始。 - b 在每行中尋找排序關(guān)鍵字時(shí)忽略前導(dǎo)的空白(空格和制表符)。 - t separator 指定字符separator作為字段分隔符。 uniq命令 文件經(jīng)過(guò)處理后在它的輸出文件中可能會(huì)出現(xiàn)重復(fù)的行。例如,使用cat命令將兩個(gè)文件合并后,再使用sort命令進(jìn)行排序,就可能出現(xiàn)重復(fù)行。這時(shí)可以使用uniq命令將這些重復(fù)行從輸出文件中刪除,只留下每條記錄的唯一樣本。 語(yǔ)法: uniq [選項(xiàng)] 文件 說(shuō)明:這個(gè)命令讀取輸入文件,并比較相鄰的行。在正常情況下,第二個(gè)及以后更多個(gè)重復(fù)行將被刪去,行比較是根據(jù)所用字符集的排序序列進(jìn)行的。該命令加工后的結(jié)果寫到輸出文件中。輸入文件和輸出文件必須不同。如果輸入文件用“- ”表示,則從標(biāo)準(zhǔn)輸入讀取。 該命令各選項(xiàng)含義如下: - c 顯示輸出中,在每行行首加上本行在文件中出現(xiàn)的次數(shù)。它可取代- u和- d選項(xiàng)。 - d 只顯示重復(fù)行。 - u 只顯示文件中不重復(fù)的各行。 - n 前n個(gè)字段與每個(gè)字段前的空白一起被忽略。一個(gè)字段是一個(gè)非空格、非制表符的字符串,彼此由制表符和空格隔開(kāi)(字段從0開(kāi)始編號(hào))。 +n 前n個(gè)字符被忽略,之前的字符被跳過(guò)(字符從0開(kāi)始編號(hào))。 - f n 與- n相同,這里n是字段數(shù)。 - s n 與+n相同,這里n是字符數(shù)。 Linux備份與壓縮命令 tar命令 tar可以為文件和目錄創(chuàng)建檔案。利用tar,用戶可以為某一特定文件創(chuàng)建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。 tar最初被用來(lái)在磁帶上創(chuàng)建檔案,現(xiàn)在,用戶可以在任何設(shè)備上創(chuàng)建檔案,如軟盤。利用tar命令,可以把一大堆的文件和目錄全部打包成一個(gè)文件,這對(duì)于 備份文件或?qū)讉€(gè)文件組合成為一個(gè)文件以便于網(wǎng)絡(luò)傳輸是非常有用的。Linux上的tar是GNU版本的。 語(yǔ)法:tar [主選項(xiàng)+輔選項(xiàng)] 文件或者目錄 使用該命令時(shí),主選項(xiàng)是必須要有的,它告訴tar要做什么事情,輔選項(xiàng)是輔助使用的,可以選用。 主選項(xiàng): c 創(chuàng)建新的檔案文件。如果用戶想備份一個(gè)目錄或是一些文件,就要選擇這個(gè)選項(xiàng)。 r 把要存檔的文件追加到檔案文件的未尾。例如用戶已經(jīng)作好備份文件,又發(fā)現(xiàn)還有一個(gè)目錄或是一些文件忘記備份了,這時(shí)可以使用該選項(xiàng),將忘記的目錄或文件追加到備份文件中。 t 列出檔案文件的內(nèi)容,查看已經(jīng)備份了哪些文件。 u 更新文件。就是說(shuō),用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最后。 x 從檔案文件中釋放文件。 輔助選項(xiàng): b 該選項(xiàng)是為磁帶機(jī)設(shè)定的。其后跟一數(shù)字,用來(lái)說(shuō)明區(qū)塊的大小,系統(tǒng)預(yù)設(shè)值為20(20*512 bytes)。 f 使用檔案文件或設(shè)備,這個(gè)選項(xiàng)通常是必選的。 k 保存已經(jīng)存在的文件。例如我們把某個(gè)文件還原,在還原的過(guò)程中,遇到相同的文件,不會(huì)進(jìn)行覆蓋。 m 在還原文件時(shí),把所有文件的修改時(shí)間設(shè)定為現(xiàn)在。 M 創(chuàng)建多卷的檔案文件,以便在幾個(gè)磁盤中存放。 v 詳細(xì)報(bào)告tar處理的文件信息。如無(wú)此選項(xiàng),tar不報(bào)告文件信息。 w 每一步都要求確認(rèn)。 z 用gzip來(lái)壓縮/解壓縮文件,加上該選項(xiàng)后可以將檔案文件進(jìn)行壓縮,但還原時(shí)也一定要使用該選項(xiàng)進(jìn)行解壓縮。 gzip命令 減少文件大小有兩個(gè)明顯的好處,一是可以減少存儲(chǔ)空間,二是通過(guò)網(wǎng)絡(luò)傳輸文件時(shí),可以減少傳輸?shù)臅r(shí)間。gzip是在Linux系統(tǒng)中經(jīng)常使用的一個(gè)對(duì)文件進(jìn)行壓縮和解壓縮的命令,既方便又好用。 語(yǔ)法:gzip [選項(xiàng)] 壓縮(解壓縮)的文件名 各選項(xiàng)的含義: -c 將輸出寫到標(biāo)準(zhǔn)輸出上,并保留原有文件。 -d 將壓縮文件解壓。 -l 對(duì)每個(gè)壓縮文件,顯示下列字段: 壓縮文件的大小 未壓縮文件的大小 壓縮比 未壓縮文件的名字 -r 遞歸式地查找指定目錄并壓縮其中的所有文件或者是解壓縮。 -t 測(cè)試,檢查壓縮文件是否完整。 -v 對(duì)每一個(gè)壓縮和解壓的文件,顯示文件名和壓縮比。 -num 用指定的數(shù)字num調(diào)整壓縮的速度,-1或--fast表示最快壓縮方法(低壓縮比),-9或--best表示最慢壓縮方法(高壓縮比)。系統(tǒng)缺省值為6。 unzip命令 用MS Windows下的壓縮軟件winzip壓縮的文件如何在Linux系統(tǒng)下展開(kāi)呢?可以用unzip命令,該命令用于解擴(kuò)展名為.zip的壓縮文件。 語(yǔ)法:unzip [選項(xiàng)] 壓縮文件名.zip 各選項(xiàng)的含義分別為: -x 文件列表 解壓縮文件,但不包括指定的file文件。 -v 查看壓縮文件目錄,但不解壓。 -t 測(cè)試文件有無(wú)損壞,但不解壓。 -d 目錄 把壓縮文件解到指定目錄下。 -z 只顯示壓縮文件的注解。 -n 不覆蓋已經(jīng)存在的文件。 -o 覆蓋已存在的文件且不要求用戶確認(rèn)。 -j 不重建文檔的目錄結(jié)構(gòu),把所有文件解壓到同一目錄下。 在Linux環(huán)境下運(yùn)行DOS命令 Linux系統(tǒng)提供了一組稱為mtools的可移植工具,可以讓用戶輕松地從標(biāo)準(zhǔn)的DOS軟盤上讀、寫文件和目錄。它們對(duì)DOS和Linux環(huán)境之間交換 文件非常有用。它們是不具備共同的文件系統(tǒng)格式的系統(tǒng)之間交換文件的有力手段。對(duì)于一個(gè)MSDOS的軟盤,只要把軟盤放在軟驅(qū)中,就可以利用 mtools提供的命令來(lái)訪問(wèn)軟盤上的文件。 mtools的主要命令如下: mcd 目錄名 改變MSDOS目錄; mcopy 源文件 目標(biāo)文件 在MSDOS和Unix之間復(fù)制文件; mdel 文件名 刪除MSDOS文件; mdir 目錄名 顯示MSDOS目錄; mformat 驅(qū)動(dòng)器號(hào) 在低級(jí)格式化的軟盤上創(chuàng)建MSDOS文件系統(tǒng); rnlabel 驅(qū)動(dòng)器號(hào) 產(chǎn)生MSDOS卷標(biāo); mmd 目錄名 建立MSDOS目錄; mrd 目錄名 刪除MSDOS目錄; mren 源文件 目標(biāo)文件 重新命名已存在的MSDOS文件; mtype 文件名 顯示MSDOS文件的內(nèi)容。 提示:這些命令和對(duì)應(yīng)的MSDOS命令非常相似。 Linux改變文件或目錄的訪問(wèn)權(quán)限命令 Linux系統(tǒng)中的每個(gè)文件和目錄都有訪問(wèn)許可權(quán)限,用它來(lái)確定誰(shuí)可以通過(guò)何種方式對(duì)文件和目錄進(jìn)行訪問(wèn)和操作。 文件或目錄的訪問(wèn)權(quán)限分為只讀,只寫和可執(zhí)行三種。以文件為例,只讀權(quán)限表示只允許讀其內(nèi)容,而禁止對(duì)其做任何的更改操作。可執(zhí)行權(quán)限表示允許將該文件作 為一個(gè)程序執(zhí)行。文件被創(chuàng)建時(shí),文件所有者自動(dòng)擁有對(duì)該文件的讀、寫和可執(zhí)行權(quán)限,以便于對(duì)文件的閱讀和修改。用戶也可根據(jù)需要把訪問(wèn)權(quán)限設(shè)置為需要的任 何組合。 有三種不同類型的用戶可對(duì)文件或目錄進(jìn)行訪問(wèn):文件所有者,同組用戶、其他用戶。所有者一般是文件的創(chuàng)建者。所有者可以允許同組用戶有權(quán)訪問(wèn)文件,還可以將文件的訪問(wèn)權(quán)限賦予系統(tǒng)中的其他用戶。在這種情況下,系統(tǒng)中每一位用戶都能訪問(wèn)該用戶擁有的文件或目錄。 每一文件或目錄的訪問(wèn)權(quán)限都有三組,每組用三位表示,分別為文件屬主的讀、寫和執(zhí)行權(quán)限;與屬主同組的用戶的讀、寫和執(zhí)行權(quán)限;系統(tǒng)中其他用戶的讀、寫和執(zhí)行權(quán)限。當(dāng)用ls -l命令顯示文件或目錄的詳細(xì)信息時(shí),最左邊的一列為文件的訪問(wèn)權(quán)限。例如: $ ls -l sobsrc. tgz -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz 橫線代表空許可。r代表只讀,w代表寫,x代表可執(zhí)行。注意這里共有10個(gè)位置。第一個(gè)字符指定了文件類型。在通常意義上,一個(gè)目錄也是一個(gè)文件。如果第一個(gè)字符是橫線,表示是一個(gè)非目錄的文件。如果是d,表示是一個(gè)目錄。 例如: - rw- r-- r-- 普通文件 文件主 組用戶 其他用戶 是文件sobsrc.tgz 的訪問(wèn)權(quán)限,表示sobsrc.tgz是一個(gè)普通文件;sobsrc.tgz的屬主有讀寫權(quán)限;與sobsrc.tgz屬主同組的用戶只有讀權(quán)限;其他用戶也只有讀權(quán)限。 確定了一個(gè)文件的訪問(wèn)權(quán)限后,用戶可以利用Linux系統(tǒng)提供的chmod命令來(lái)重新設(shè)定不同的訪問(wèn)權(quán)限。也可以利用chown命令來(lái)更改某個(gè)文件或目錄的所有者。利用chgrp命令來(lái)更改某個(gè)文件或目錄的用戶組。 下面分別對(duì)這些命令加以介紹。 chmod 命令 chmod命令是非常重要的,用于改變文件或目錄的訪問(wèn)權(quán)限。用戶用它控制文件或目錄的訪問(wèn)權(quán)限。 該命令有兩種用法。一種是包含字母和操作符表達(dá)式的文字設(shè)定法;另一種是包含數(shù)字的數(shù)字設(shè)定法。 1. 文字設(shè)定法 chmod [who] [+ | - | =] [mode] 文件名? 命令中各選項(xiàng)的含義為: 操作對(duì)象who可是下述字母中的任一個(gè)或者它們的組合: u 表示“用戶(user)”,即文件或目錄的所有者。 g 表示“同組(group)用戶”,即與文件屬主有相同組ID的所有用戶。 o 表示“其他(others)用戶”。 a 表示“所有(all)用戶”。它是系統(tǒng)默認(rèn)值。 操作符號(hào)可以是: + 添加某個(gè)權(quán)限。 - 取消某個(gè)權(quán)限。 = 賦予給定權(quán)限并取消其他所有權(quán)限(如果有的話)。 設(shè)置mode所表示的權(quán)限可用下述字母的任意組合: r 可讀。 w 可寫。 x 可執(zhí)行。 X 只有目標(biāo)文件對(duì)某些用戶是可執(zhí)行的或該目標(biāo)文件是目錄時(shí)才追加x 屬性。 s 在文件執(zhí)行時(shí)把進(jìn)程的屬主或組ID置為該文件的文件屬主。方式“u+s”設(shè)置文件的用戶ID位,“g+s”設(shè)置組ID位。 t 保存程序的文本到交換設(shè)備上。 u 與文件屬主擁有一樣的權(quán)限。 g 與和文件屬主同組的用戶擁有一樣的權(quán)限。 o 與其他用戶擁有一樣的權(quán)限。 文件名:以空格分開(kāi)的要改變權(quán)限的文件列表,支持通配符。 在一個(gè)命令行中可給出多個(gè)權(quán)限方式,其間用逗號(hào)隔開(kāi)。例如:chmod g+r,o+r example 使同組和其他用戶對(duì)文件example 有讀權(quán)限。 2. 數(shù)字設(shè)定法 我們必須首先了解用數(shù)字表示的屬性的含義:0表示沒(méi)有權(quán)限,1表示可執(zhí)行權(quán)限,2表示可寫權(quán)限,4表示可讀權(quán)限,然后將其相加。所以數(shù)字屬性的格式應(yīng)為3個(gè)從0到7的八進(jìn)制數(shù),其順序是(u)(g)(o)。 例如,如果想讓某個(gè)文件的屬主有“讀/寫”二種權(quán)限,需要把4(可讀)+2(可寫)=6(讀/寫)。 數(shù)字設(shè)定法的一般形式為: chmod [mode] 文件名? chgrp命令 功能:改變文件或目錄所屬的組。 語(yǔ)法:chgrp [選項(xiàng)] group filename? 該命令改變指定指定文件所屬的用戶組。其中g(shù)roup可以是用戶組ID,也可以是/etc/group文件中用戶組的組名。文件名是以空格分開(kāi)的要改變屬組的文件列表,支持通配符。如果用戶不是該文件的屬主或超級(jí)用戶,則不能改變?cè)撐募慕M。 該命令的各選項(xiàng)含義為: - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的屬組。 chown 命令 功能:更改某個(gè)文件或目錄的屬主和屬組。這個(gè)命令也很常用。例如root用戶把自己的一個(gè)文件拷貝給用戶xu,為了讓用戶xu能夠存取這個(gè)文件,root用戶應(yīng)該把這個(gè)文件的屬主設(shè)為xu,否則,用戶xu無(wú)法存取這個(gè)文件。 語(yǔ)法:chown [選項(xiàng)] 用戶或組 文件 說(shuō)明:chown將指定文件的擁有者改為指定的用戶或組。用戶可以是用戶名或用戶ID。組可以是組名或組ID。文件是以空格分開(kāi)的要改變權(quán)限的文件列表,支持通配符。 該命令的各選項(xiàng)含義如下: - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的擁有者。 - v 顯示chown命令所做的工作。 Linux與用戶有關(guān)的命令 passwd命令 出于系統(tǒng)安全考慮,Linux系統(tǒng)中的每一個(gè)用戶除了有其用戶名外,還有其對(duì)應(yīng)的用戶口令。因此使用useradd命令增加時(shí),還需使用passwd命令為每一位新增加的用戶設(shè)置口令;用戶以后還可以隨時(shí)用passwd命令改變自己的口令。 該命令的一般格式為: passwd [用戶名] 其中用戶名為需要修改口令的用戶名。只有超級(jí)用戶可以使用“passwd 用戶名”修改其他用戶的口令,普通用戶只能用不帶參數(shù)的passwd命令修改自己的口令。 該命令的使用方法如下: 輸入 passwd< Enter>; 在(current) UNIX passwd:下輸入當(dāng)前的口令 在new password:提示下輸入新的口令(在屏幕上看不到這個(gè)口令): 系統(tǒng)提示再次輸入這個(gè)新口令。 輸入正確后,這個(gè)新口令被加密并放入/etc/shdow文件。選取一個(gè)不易被破譯的口令是很重要的。 選取口令應(yīng)遵守如下規(guī)則: 口令應(yīng)該至少有六位(最好是八位)字符; 口令應(yīng)該是大小寫字母、標(biāo)點(diǎn)符號(hào)和數(shù)字混雜的。 超級(jí)用戶修改其他用戶(xxq)的口令的過(guò)程如下, # passwd root New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully # su命令 這個(gè)命令非常重要。它可以讓一個(gè)普通用戶擁有超級(jí)用戶或其他用戶的權(quán)限,也可以讓超級(jí)用戶以普通用戶的身份做一些事情。普通用戶使用這個(gè)命令時(shí)必須有超級(jí)用戶或其他用戶的口令。如要離開(kāi)當(dāng)前用戶的身份,可以打exit。 該命令的一般形式為: su [選項(xiàng)] [? ] [使用者帳號(hào)] 說(shuō)明:若沒(méi)有指定使用者帳號(hào),則系統(tǒng)預(yù)設(shè)值為超級(jí)用戶root。 該命令中各選項(xiàng)的含義分別為: ? c 執(zhí)行一個(gè)命令后就結(jié)束。 ? 加了這個(gè)減號(hào)的目的是使環(huán)境變量和欲轉(zhuǎn)換的用戶相同。 ? m 保留環(huán)境變量不變。 password: 【輸入超級(jí)用戶的密碼】 Linux系統(tǒng)管理命令 wall命令 這個(gè)命令的功能是對(duì)全部已登錄的用戶發(fā)送信息,用戶可以先把要發(fā)送的信息寫好存入一個(gè)文件中,然后輸入: # wall < 文件名 這樣就能對(duì)所有的用戶發(fā)送信息了。 在上面的例子中符號(hào)“<”表示輸入重定向,有關(guān)它的含義和用法請(qǐng)參閱第十章的有關(guān)內(nèi)容。 例如: # wall ‘Thank you!’ Broadcast message from root (tty1) Fri Nov 26 14:15:07 1999… Thank you! # 執(zhí)行以上命令后,用戶的屏幕上顯示出“Thank you!”信息后,并不出現(xiàn)系統(tǒng)提示符$(#),再次按回車鍵后,屏幕出現(xiàn)系統(tǒng)提示符。 write命令 write命令的功能是向系統(tǒng)中某一個(gè)用戶發(fā)送信息。 該命令的一般格式為: write 用戶帳號(hào) [終端名稱] 例如: $ write Guest hello 此時(shí)系統(tǒng)進(jìn)入發(fā)送信息狀態(tài),用戶可以輸入要發(fā)送的信息,輸入完畢,希望退出發(fā)送狀態(tài)時(shí),按組合鍵< Ctrl+c>即可。 mesg指令 mesg命令設(shè)定是否允許其他用戶用write命令給自己發(fā)送信息。如果允許別人給自己發(fā)送信息,輸入命令: # mesg y 否則,輸入: # mesg n 對(duì)于超級(jí)用戶,系統(tǒng)的默認(rèn)值為 n;而對(duì)于一般用戶系統(tǒng)的默認(rèn)值為y。 如果mesg后不帶任何參數(shù),則顯示當(dāng)前的狀態(tài)是y還是n.。 sync命令 sync命令是在關(guān)閉Linux系統(tǒng)時(shí)使用的。用戶需要注意的是,不能用簡(jiǎn)單的關(guān)閉電源的方法關(guān)閉系統(tǒng),因?yàn)長(zhǎng)inux象其他Unix系統(tǒng)一樣,在內(nèi)存中 緩存了許多數(shù)據(jù),在關(guān)閉系統(tǒng)時(shí)需要進(jìn)行內(nèi)存數(shù)據(jù)與硬盤數(shù)據(jù)的同步校驗(yàn),保證硬盤數(shù)據(jù)在關(guān)閉系統(tǒng)時(shí)是最新的,只有這樣才能確保數(shù)據(jù)不會(huì)丟失。一般正常的關(guān)閉 系統(tǒng)的過(guò)程是自動(dòng)進(jìn)行這些工作的,在系統(tǒng)運(yùn)行過(guò)程中也會(huì)定時(shí)做這些工作,不需要用戶干預(yù)。 sync命令是強(qiáng)制把內(nèi)存中的數(shù)據(jù)寫回硬盤,以免數(shù)據(jù)的丟失。用戶可以在需要的時(shí)候使用此命令。該命令的一般格式為: sync shutdown命令 shutdown 命令可以安全地關(guān)閉或重啟Linux系統(tǒng),它在系統(tǒng)關(guān)閉之前給系統(tǒng)上的所有登錄用戶提示一條警告信息。該命令還允許用戶指定一個(gè)時(shí)間參數(shù),可以是一個(gè)精確 的時(shí)間,也可以是從現(xiàn)在開(kāi)始的一個(gè)時(shí)間段。精確時(shí)間的格式是hh:mm,表示小時(shí)和分鐘;時(shí)間段由“+”和分鐘數(shù)表示。系統(tǒng)執(zhí)行該命令后,會(huì)自動(dòng)進(jìn)行數(shù)據(jù) 同步的工作。 該命令的一般格式為: shutdown [選項(xiàng)] [時(shí)間] [警告信息] 命令中各選項(xiàng)的含義為: - k 并不真正關(guān)機(jī),而只是發(fā)出警告信息給所有用戶。 - r 關(guān)機(jī)后立即重新啟動(dòng)。 - h 關(guān)機(jī)后不重新啟動(dòng)。 - f 快速關(guān)機(jī),重啟動(dòng)時(shí)跳過(guò)fsck。 - n 快速關(guān)機(jī),不經(jīng)過(guò)init程序。 - c 取消一個(gè)已經(jīng)運(yùn)行的shutdown。 需要特別說(shuō)明的是,該命令只能由超級(jí)用戶使用。 free命令 free命令的功能是查看當(dāng)前系統(tǒng)內(nèi)存的使用情況,它顯示系統(tǒng)中剩余及已用的物理內(nèi)存和交換內(nèi)存,以及共享內(nèi)存和被核心使用的緩沖區(qū)。 該命令的一般格式為: free [-b | -k | -m] 命令中各選項(xiàng)的含義如下: -b 以字節(jié)為單位顯示。 -k 以K字節(jié)為單位顯示。 -m 以兆字節(jié)為單位顯示。 uptime命令 uptime命令顯示系統(tǒng)已經(jīng)運(yùn)行了多長(zhǎng)時(shí)間,它依次顯示下列信息:現(xiàn)在時(shí)間、系統(tǒng)已經(jīng)運(yùn)行了多長(zhǎng)時(shí)間、目前有多少登錄用戶、系統(tǒng)在過(guò)去的1分鐘、5分鐘和15分鐘內(nèi)的平均負(fù)載。 該命令的一般格式為: uptime Linux磁盤管理 df命令 功能:檢查文件系統(tǒng)的磁盤空間占用情況。可以利用該命令來(lái)獲取硬盤被占用了多少空間,目前還剩下多少空間等信息。 語(yǔ)法:df [選項(xiàng)] 說(shuō)明:df命令可顯示所有文件系統(tǒng)對(duì)i節(jié)點(diǎn)和磁盤塊的使用情況。 該命令各個(gè)選項(xiàng)的含義如下: -a 顯示所有文件系統(tǒng)的磁盤使用情況,包括0塊(block)的文件系統(tǒng),如/proc文件系統(tǒng)。 -k 以k字節(jié)為單位顯示。 -i 顯示i節(jié)點(diǎn)信息,而不是磁盤塊。 -t 顯示各指定類型的文件系統(tǒng)的磁盤空間使用情況。 -x 列出不是某一指定類型文件系統(tǒng)的磁盤空間使用情況(與t選項(xiàng)相反)。 -T 顯示文件系統(tǒng)類型。 du命令 du的英文原義為“disk usage”,含義為顯示磁盤空間的使用情況。 功能:統(tǒng)計(jì)目錄(或文件)所占磁盤空間的大小。 語(yǔ)法:du [選項(xiàng)] [Names…] 說(shuō)明:該命令逐級(jí)進(jìn)入指定目錄的每一個(gè)子目錄并顯示該目錄占用文件系統(tǒng)數(shù)據(jù)塊(1024字節(jié))的情況。若沒(méi)有給出Names,則對(duì)當(dāng)前目錄進(jìn)行統(tǒng)計(jì)。 該命令的各個(gè)選項(xiàng)含義如下: -s 對(duì)每個(gè)Names參數(shù)只給出占用的數(shù)據(jù)塊總數(shù)。 -a 遞歸地顯示指定目錄中各文件及子孫目錄中各文件占用的數(shù)據(jù)塊數(shù)。若既不指定-s,也不指定-a,則只顯示Names中的每一個(gè)目錄及其中的各子目錄所占的磁盤塊數(shù)。 -b 以字節(jié)為單位列出磁盤空間使用情況(系統(tǒng)缺省以k字節(jié)為單位)。 -k 以1024字節(jié)為單位列出磁盤空間使用情況。 -c 最后再加上一個(gè)總計(jì)(系統(tǒng)缺省設(shè)置)。 -l 計(jì)算所有的文件大小,對(duì)硬鏈接文件,則計(jì)算多次。 -x 跳過(guò)在不同文件系統(tǒng)上的目錄不予統(tǒng)計(jì)。 dd命令 功能:把指定的輸入文件拷貝到指定的輸出文件中,并且在拷貝過(guò)程中可以進(jìn)行格式轉(zhuǎn)換。可以用該命令實(shí)現(xiàn)DOS下的diskcopy命令的作用。先用dd 命令把軟盤上的數(shù)據(jù)寫成硬盤的一個(gè)寄存文件,再把這個(gè)寄存文件寫入第二張軟盤上,完成diskcopy的功能。需要注意的是,應(yīng)該將硬盤上的寄存文件用 rm命令刪除掉。系統(tǒng)默認(rèn)使用標(biāo)準(zhǔn)輸入文件和標(biāo)準(zhǔn)輸出文件。 語(yǔ)法:dd [選項(xiàng)] if =輸入文件(或設(shè)備名稱)。 of =輸出文件(或設(shè)備名稱)。 ibs = bytes 一次讀取bytes字節(jié),即讀入緩沖區(qū)的字節(jié)數(shù)。 skip = blocks 跳過(guò)讀入緩沖區(qū)開(kāi)頭的ibs*blocks塊。 obs = bytes 一次寫入bytes字節(jié),即寫入緩沖區(qū)的字節(jié)數(shù)。 bs = bytes 同時(shí)設(shè)置讀/寫緩沖區(qū)的字節(jié)數(shù)(等于設(shè)置ibs和obs)。 cbs = byte 一次轉(zhuǎn)換bytes字節(jié)。 count=blocks 只拷貝輸入的blocks塊。 conv = ASCII 把EBCDIC碼轉(zhuǎn)換為ASCIl碼。 conv = ebcdic 把ASCIl碼轉(zhuǎn)換為EBCDIC碼。 conv = ibm 把ASCIl碼轉(zhuǎn)換為alternate EBCDIC碼。 conv = block 把變動(dòng)位轉(zhuǎn)換成固定字符。 conv = ublock 把固定位轉(zhuǎn)換成變動(dòng)位。 conv = ucase 把字母由小寫轉(zhuǎn)換為大寫。 conv = lcase 把字母由大寫轉(zhuǎn)換為小寫。 conv = notrunc 不截短輸出文件。 conv = swab 交換每一對(duì)輸入字節(jié)。 conv = noerror 出錯(cuò)時(shí)不停止處理。 conv = sync 把每個(gè)輸入記錄的大小都調(diào)到ibs的大小(用NUL填充)。 fdformat 命令 軟盤是用戶常用的存儲(chǔ)介質(zhì)之一。軟盤在使用之前必須先作格式化操作,然后可以用tar、dd、cpio等命令存儲(chǔ)數(shù)據(jù),也可以在軟盤上建立可安裝的文件系統(tǒng)。 功能:低級(jí)格式化軟盤 語(yǔ)法:format [-n] device 說(shuō)明:該命令的作用是對(duì)軟盤進(jìn)行格式化。 -n 軟盤格式化后不作檢驗(yàn)。 device 指定要進(jìn)行格式化的設(shè)備,通常是下述設(shè)備之一: /dev/fd0d360 /dev/fd0h1200 /dev/fd0D360 /dev/fd0H360 /dev/fd0D720 /dev/fd0H720 /dev/fd0h360 /dev/fd0h720 /dev/fd0H1440 Linux其它命令 echo命令 echo命令的功能是在顯示器上顯示一段文字,一般起到一個(gè)提示的作用。 該命令的一般格式為: echo [ -n ] 字符串 其中選項(xiàng)n表示輸出文字后不換行;字符串可以加引號(hào),也可以不加引號(hào)。用echo命令輸出加引號(hào)的字符串時(shí),將字符串原樣輸出;用echo命令輸出不加引號(hào)的字符串時(shí),將字符串中的各個(gè)單詞作為字符串輸出,各字符串之間用一個(gè)空格分割。 cal命令 cal命令的功能是顯示某年某月的日歷。 該命令的一般格式為: cal [選項(xiàng)] [月 [年]] 命令中各選項(xiàng)的含義為: - j 顯示出給定月中的每一天是一年中的第幾天(從1月1日算起)。 - y 顯示出整年的日歷。 date命令 date命令的功能是顯示和設(shè)置系統(tǒng)日期和時(shí)間。 該命令的一般格式為: date [選項(xiàng)] 顯示時(shí)間格式(以+開(kāi)頭,后面接格式) date 設(shè)置時(shí)間格式 命令中各選項(xiàng)的含義分別為: -d datestr, --date datestr 顯示由datestr描述的日期 -s datestr, --set datestr 設(shè)置datestr 描述的日期 -u, --universal 顯示或設(shè)置通用時(shí)間 時(shí)間域 % H 小時(shí)(00..23) % I 小時(shí)(01..12) % k 小時(shí)(0..23) % l 小時(shí)(1..12) % M 分(00..59) % p 顯示出AM或PM % r 時(shí)間(hh:mm:ss AM或PM),12小時(shí) % s 從1970年1月1日00:00:00到目前經(jīng)歷的秒數(shù) % S 秒(00..59) % T 時(shí)間(24小時(shí)制)(hh:mm:ss) % X 顯示時(shí)間的格式(%H:%M:%S) % Z 時(shí)區(qū) 日期域 % a 星期幾的簡(jiǎn)稱( Sun..Sat) % A 星期幾的全稱( Sunday..Saturday) % b 月的簡(jiǎn)稱(Jan..Dec) % B 月的全稱(January..December) % c 日期和時(shí)間( Mon Nov 8 14:12:46 CST 1999) % d 一個(gè)月的第幾天(01..31) % D 日期(mm/dd/yy) % h 和%b選項(xiàng)相同 % j 一年的第幾天(001..366) % m 月(01..12) % w 一個(gè)星期的第幾天(0代表星期天) % W 一年的第幾個(gè)星期(00..53,星期一為第一天) % x 顯示日期的格式(mm/dd/yy) % y 年的最后兩個(gè)數(shù)字( 1999則是99) % Y 年(例如:1970,1996等) 注意:只有超級(jí)用戶才有權(quán)限使用date命令設(shè)置時(shí)間,一般用戶只能使用date命令顯示時(shí)間。 clear命令 clear命令的功能是清除屏幕上的信息,它類似于DOS中的 cls命令。清屏后,提示符移動(dòng)到屏幕左上角。 文章來(lái)源于http://www.lupaworld.com posted @ 2008-09-18 12:15 追風(fēng)舞者 閱讀(380) | 評(píng)論 (0) | 編輯 收藏 ubuntu中默認(rèn)的是gnome桌面,也可以為你的程序設(shè)置快捷方式。
可以以兩種方式生成快捷方式,這里叫做起動(dòng)器:命令行方式和拖動(dòng)程序圖標(biāo)的方式。這里以Lumaqq為例說(shuō)明之。 1.在應(yīng)用程序菜單中創(chuàng)建起動(dòng)器: 在命令行中輸入如下命令: sudo gedit /usr/share/applications/LumaQQ.desktop //sudo是以超級(jí)用戶權(quán)限執(zhí)行后面命令 //gedit是打開(kāi)文本編輯器,后面的路徑標(biāo)識(shí)要編輯的文件 //在/usr/share/applications目錄下可以看到許多*.desktop的文件,都是應(yīng)用程序的起動(dòng)器,所以上述命令是為L(zhǎng)unaQQ創(chuàng)建一個(gè)起動(dòng)器配置文件。 在打開(kāi)的窗口中輸入如下內(nèi)容: [Desktop Entry] Name=LumaQQ Comment=QQ Client Exec=/opt/LumaQQ/lumaqq//這里的路徑應(yīng)該是你的LunaQQ程序的安裝路徑 Icon=/opt/LumaQQ/QQ.png//同上 Terminal=false Type=Application Categories=Application;Network;//這里的內(nèi)容決定創(chuàng)建出的起動(dòng)器在應(yīng)用程序菜單中的位置,按照上面的寫法創(chuàng)建的起動(dòng)器將出現(xiàn)在應(yīng)用程序-Internet中,以此類推,如果想在應(yīng)用程序-辦公中創(chuàng)建起動(dòng)器,上述最后一行應(yīng)該寫成: Categories=Application;Office; 2.在頂部面板中創(chuàng)建起動(dòng)器(類似windows中的快速啟動(dòng)): 可以把任意位置的程序圖標(biāo)拖拽到窗口最頂端的頂部面板(Top Panel)上中間的位置,兩個(gè)起動(dòng)器分別是命令行終端和LumaQQ的,分別是從應(yīng)用程序菜單和文件管理器中拖拽到當(dāng)前位置的,在這個(gè)頂部面板中還可以 添加許多給定的起動(dòng)器,方法是在頂部面板中右鍵單擊選擇添加到面板,可以看到許多內(nèi)容。 3.在桌面創(chuàng)建起動(dòng)器 方法同2類似,只需簡(jiǎn)單拖拽即可。(LumaQQ在桌面上的大圖標(biāo)好可愛(ài)!) posted @ 2008-09-18 12:13 追風(fēng)舞者 閱讀(1915) | 評(píng)論 (0) | 編輯 收藏 Evolution是ubuntu,fedora等發(fā)行版本自帶的一個(gè)郵件管理軟件,可以幫助你方便的管理和收發(fā)郵件,其設(shè)置步驟如下:
1.確認(rèn)你的gmail的POP已經(jīng)打開(kāi): 登錄gmail-settings-forwarding and POP, 確認(rèn)“Enable POP for all mail”被選上
2.打開(kāi)Application→Internet→Evolution Mail
3.添加用戶,如果已經(jīng)創(chuàng)建了gmail用戶,直接點(diǎn)擊edit。
4. 在Receive mail選項(xiàng),
server type 選 POP
server: pop.gmail.com
username: 你的gmail用戶名(eg.'myname@gmail.com'則填入'myname')
use secure connection: SSL encryption
authentication type: password, remember password
5. 在sending mail選現(xiàn),
server type: SMTP
server: smtp.gmail.com
選中server require authentication
use secure connection: SSL encryption
authentication type: PAIN
username: 你的gmail用戶名(eg.'myname@gmail.com'則填入'myname')
選中remember password
6. OK
有些文檔或許會(huì)提到995,465等端口號(hào),根據(jù)我設(shè)置的實(shí)驗(yàn)來(lái)看不設(shè)置端口號(hào)也可以。 posted @ 2008-09-18 10:29 追風(fēng)舞者 閱讀(448) | 評(píng)論 (0) | 編輯 收藏 一、rpm包安裝方式步驟:
2、打開(kāi)一個(gè)終端,su -成root用戶; 3、cd soft.version.rpm所在的目錄; 4、輸入rpm -ivh soft.version.rpm
2、打開(kāi)一個(gè)終端,su -成root用戶; 3、cd soft.version.deb所在的目錄; 4、輸入dpkg -i soft.version.deb
2、打開(kāi)一個(gè)終端,su -成root用戶; 3、cd soft.tar.gz所在的目錄; 4、tar -xvzf soft.tar.gz //一般會(huì)生成一個(gè)soft目錄 5、cd soft 6、./configure 7、make 8、make install
1、找到相應(yīng)的軟件包,比如soft.tar.bz2,下載到本機(jī)某個(gè)目錄; 2、打開(kāi)一個(gè)終端,su -成root用戶; 3、cd soft.tar.bz2所在的目錄; 4、tar -xjvf soft.tar.bz2 //一般會(huì)生成一個(gè)soft目錄 5、cd soft 6、./configure 7、make 8、make install
2、apt-cache search soft 注:soft是你要找的軟件的名稱或相關(guān)信息 3、如果2中找到了軟件soft.version,則用apt-get install soft.version命令安 裝軟件 注:只要你可以上網(wǎng),只需要用apt-cache search查找軟件,用apt-get install軟件
1、打開(kāi)一個(gè)終端,su -成root用戶; 2、chmod +x soft.bin 3、./soft.bin //運(yùn)行這個(gè)命令就可以安裝軟件了
下載的是lumaqq.tar.gz,使用方法如下: 1、打開(kāi)一個(gè)終端,su -成root用戶; 2、tar -xzvf lumaqq.tar.gz //這一步會(huì)生成一個(gè)叫LumaQQ的目錄 3、cd LumaQQ 4、chmod +x lumaqq //設(shè)置lumaqq這個(gè)程序文件為可運(yùn)行 5、此時(shí)就可以運(yùn)行l(wèi)umaqq了,用命令./lumaqq即可,但每次運(yùn)行要輸入全路徑或 切換到剛才生成的LumaQQ目錄里 6、為了保證不設(shè)置路徑就可以用,你可以在/bin目錄下建立一個(gè)lumaqq的鏈接, 用命令ln -s lumaqq /bin/ 即可,以后任何時(shí)候打開(kāi)一個(gè)終端輸入lumaqq就可以 啟動(dòng)QQ聊天軟件了 7、如果你要想lumaqq有個(gè)菜單項(xiàng),使用菜單編輯工具,比如Alacarte Menu Editor,找到上面生成的LumaQQ目錄里的lumaqq設(shè)置一個(gè)菜單項(xiàng)就可以了,當(dāng)然你 也可以直接到 /usr/share/applications目錄,按照里面其它*.desktop文件的格 式生成一個(gè)自己的desktop文件即可。 posted @ 2008-09-16 11:24 追風(fēng)舞者 閱讀(141) | 評(píng)論 (0) | 編輯 收藏 一.配置 1)framework下的entity里的config里面打開(kāi)entityengine.xml文件,在此文件里找有四行都是以<delegator name開(kāi)頭的,請(qǐng)將里面的datasource-name="localderby"都改為datasource-name="localmysql"。 2)在此文件里找到〈datasource-name="localmysql"開(kāi)頭的代碼區(qū)域,將里面的jdbc-username= 和jdbc-password= 都改為你安裝mysql時(shí)的用戶名和密碼。 3)我們要在entity下的lib下的jdbc中導(dǎo)入mysql5.0的驅(qū)動(dòng),同時(shí)加入xapool.jar。 4)在mysql中建ofbiz數(shù)據(jù)庫(kù),否則在下面部署工程中報(bào)錯(cuò) 二.部署 1) 在命令行下運(yùn)行 ant run-install (前提:在環(huán)境變量中添加 ant\bin) 2) 運(yùn)行 startofbiz.bat 三. 工程端口號(hào)的修改 修改framework/base/config/ofbiz-containers.xml 1) 修改ofbiz端口號(hào) <property name="http-connector" value="connector"> <property name="port" value="8080"/> </property> 2)修改項(xiàng)目鏈接的端口號(hào) <property name="https-connector" value="connector"> <property name="port" value="8443"/> </property> 四.運(yùn)行 在瀏覽器中輸入地址 http://localhost:8080
posted @ 2008-09-11 11:44 追風(fēng)舞者 閱讀(2145) | 評(píng)論 (0) | 編輯 收藏 1.實(shí)體引擎核心應(yīng)用類(客戶端API) 2.服務(wù)引擎應(yīng)用類(服務(wù)器端API) 3.常用工具類 posted @ 2008-09-10 16:33 追風(fēng)舞者 閱讀(145) | 評(píng)論 (0) | 編輯 收藏 1. entitymodle.xml中的字段類型參見(jiàn) opentaps-1.0\framework\entity\fieldtype entity
field
prim-key
relation
更加詳細(xì)的內(nèi)容參照: http://ofbiz.apache.org/docs/entity.html posted @ 2008-09-09 10:25 追風(fēng)舞者 閱讀(726) | 評(píng)論 (0) | 編輯 收藏 1.將Opentaps項(xiàng)目導(dǎo)入Eclipse中
Filee -> Import -> General -> Existing Projects into Workspace 2.Eclipse中為.bsh,.ftl文件添加編輯器 安裝Freemarker Eclipse plug-in. Windows > Preferences > General > Editors > File Associations and add "*.bsh" and associate it with the Scrapbook editor. 3.修改 startofbiz.bat文件 ECHO OFF "%JAVA_HOME%\bin\java" -Xms256M -Xmx512M -Duser.language=en -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar ofbiz.jar > runtime\logs\console.log 4.Eclipse菜單 Run -> Open Debug Dialog 選擇 Remote Java Application 注意: 右側(cè)面板中的 Port 為上面紅色標(biāo)記,兩者必需一致。 ![]() ![]() posted @ 2008-09-08 18:23 追風(fēng)舞者 閱讀(2076) | 評(píng)論 (0) | 編輯 收藏 1.OfBiz中利用delegator訪問(wèn)數(shù)據(jù)庫(kù)
1)創(chuàng)建GenericDelegator對(duì)象 1.1 service中 public static Map createHelloPerson(DispatchContext dctx, Map context) { GenericDelegator delegator = dctx.getDelegator(); ... } 1.2手工建立GenericDelegator對(duì)象 GenericDelegator delegator = GenericDelegator.getGenericDelegator("default"); 2)Insert a record 通過(guò)調(diào)用delegator對(duì)象的getNextSeqId(), makeValue(String entityName, Map fields)和create()方法。 例如: String helloPersonId = delegator.getNextSeqId("HelloPerson"); GenericValue helloPerson = delegator.makeValue("HelloPerson", UtilMisc.toMap("helloPersonId", helloPersonId)); // create a GenericValue from ID we just got helloPerson.setNonPKFields(context); // move non-primary key fields from input parameters to GenericValue delegator.create(helloPerson); // store the generic value, ie persists it 3)Remove a record delegator.removeByAnd(String entityName, Map fields); 4)Strore a record 例如: Map pk = UtilMisc.toMap("attribute1", attribute1Value, "attribute2", attribute2Value);//pk中存儲(chǔ)了查詢條件 GenericValue obj = delegator.findByPrimaryKey("ClassName", pk); obj.setNonPKFields(context);//contex為Map類型,存儲(chǔ)了要更新的字段 obj.store(); 5)Store records List resultList = delegator.findAll(String entityName, List orderBy); List toStore = new ArrayList(); toStore.addAll(resultList); delegator.storeAll(toStore); 6)Look for record/records findByAnd,findByCondition、findByLike、findByOr、findByPrimaryKey、 findListIteratorByCondition、 findall、findAllByPrimaryKeys 2) 依據(jù)數(shù)值對(duì)象進(jìn)行訪問(wèn) 在現(xiàn)有的數(shù)值對(duì)象(GenericValue類型)上可以進(jìn)行下列操作: 根據(jù)關(guān)系查找關(guān)聯(lián)信息getRelated,包括getRelated、getRelatedByAnd、getRelatedDummyPK、getRelatedMulti、getRelatedOrderBy。 刷新本數(shù)值對(duì)象refresh 保存本數(shù)值對(duì)象store,主要用于修改后的保存 刪除數(shù)值對(duì)象remove,包括刪除本數(shù)值對(duì)象remove和刪除某個(gè)關(guān)聯(lián)的數(shù)值對(duì)象removeRelated 在現(xiàn)有數(shù)值對(duì)象上的操作是通過(guò)調(diào)用 更加具體的信息可參考:http://www.opentaps.org/javadocs/release-1.0.1/framework/api/ posted @ 2008-09-08 17:59 追風(fēng)舞者 閱讀(1239) | 評(píng)論 (0) | 編輯 收藏 http://www.opensourcestrategies.com/ofbiz/tutorials.php
http://ofbiz.apache.org/ http://www.opentaps.org/index.php http://docs.ofbiz.org/display/OFBADMIN/OFBiz+Documentation+Index 尤其是第一個(gè)里面有很多不錯(cuò)的文章,不過(guò)都是英文的,耐心的看下去吧。 posted @ 2008-09-05 15:07 追風(fēng)舞者 閱讀(256) | 評(píng)論 (0) | 編輯 收藏 Java語(yǔ)言中的equals的規(guī)范: 1. 自反性:對(duì)于任何一個(gè)非空引用x,x.equals(x)應(yīng)該返回true; 1. 將一個(gè)非0常數(shù),例如17,儲(chǔ)存于int result變量中。 posted @ 2008-08-04 14:38 追風(fēng)舞者 閱讀(199) | 評(píng)論 (0) | 編輯 收藏 摘要: 前人栽樹(shù),后人乘涼。想當(dāng)初自己初學(xué)Java時(shí)為了解決一個(gè)很基礎(chǔ)的問(wèn)題,好多的朋友熱心的回復(fù)我,幫我分析錯(cuò)誤。現(xiàn)在為了方便那些Java新手,特給出自己感覺(jué)比較好的學(xué)習(xí)網(wǎng)站和論壇,希望對(duì)朋友們能有點(diǎn)幫助。
1,http://www.javaeye.com/ 由Robbin創(chuàng)建發(fā)起的技術(shù)網(wǎng)站,人氣相當(dāng)旺,有不少牛人。最初是以討論Java技 術(shù)和Hibernate技術(shù)開(kāi)始的技術(shù)論壇,現(xiàn)在已經(jīng)成為一個(gè)涵蓋整個(gè)軟件開(kāi)發(fā)領(lǐng)域的綜合性網(wǎng)站,2005年被選為中國(guó)十佳技術(shù)網(wǎng)站之一。 2,http://www.ibm.com/developerworks/cn/java/ 著名的IBM Developer Works。涵蓋各種技術(shù)。 3,http://dev2dev.bea.com.cn/ IBM和BEA都在主推Java應(yīng)用。它們的技術(shù)網(wǎng)站中有不少關(guān)于Java的好文章。 ……………… 閱讀全文 creasure 2008-07-08 20:19 發(fā)表評(píng)論 文章來(lái)源:http://www.aygfsteel.com/creasure/archive/2008/07/08/213420.html posted @ 2008-07-10 09:48 追風(fēng)舞者 閱讀(81) | 評(píng)論 (0) | 編輯 收藏 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||