<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Be alaways javaing...

    Loving Java
    posts - 43, comments - 5, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2008年7月8日


    posted @ 2008-12-16 09:37 追風舞者 閱讀(157) | 評論 (0)編輯 收藏

    轉(zhuǎn)載自:www.tkk7.com/zhaobin
    來自BlueDavy的博客

      1. 為什么學習OSGi
      2. OSGi成為JSR291以及OSGi對Spring產(chǎn)生的影響
      3. OSGi應用于企業(yè)應用Step by step之持久篇
      4. SCA:企業(yè)應用開發(fā)的利器
      5. OSGi和SCA
      6. 基于OSGi實現(xiàn)可擴展的模塊的設計
      7. OSGi in action online演講的資料【推薦】
      8. 基于OSGi搭建動態(tài)化的系統(tǒng)
      9. OSGi Extender Model啟示錄
      10. Play OSGi
      11. Bnd - Bundle Tool中文使用手冊
      12. 基于Eclipse Equinox的插件框架:TPF
      13. TPF插件管理框架功能、實現(xiàn)以及下載【推薦】
      14. 發(fā)布《OSGi實戰(zhàn)》正式版【特別推薦】
      15. 發(fā)布《OSGi進階》正式版【特別推薦】
      16. OSGi PPT For Newer【推薦】

    來自 勤勞的蜜蜂的博客

      1. OSGi介紹(一)什么是OSGi
      2. OSGi介紹(二)一個假想的實例
      3. OSGi介紹(三)OSGi service platform的體系結構
      4. OSGi介紹(四)第一個bundle
      5. OSGi介紹(五)兩個bundle
      6. OSGi介紹(六)OSGi的service
      7. OSGi介紹(七)bundle和service(續(xù))

    來自Phrancol的博客

      1. 構建模塊化的動態(tài)Web應用(演示版)
      2. 開發(fā)基于Equinox/OSGI 的 Web Application (一) [譯]
      3. 開發(fā)基于Equinox/OSGI 的 Web Application (二) [譯]
      4. Spring-OSGI 1.0 M3 中文手冊(Spring Dynamic Modules Reference Guide for OSGi(tm) Service Platforms)
      5. Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1 - 顯示首頁【推薦】
      6. Developing Equinox/Spring-osgi/Spring Framework Web Application Part 2 - 使用Spring-OSGI
      7. Developing Equinox/Spring-osgi/Spring Framework Web Application Part 3 - 找到我的Bean

    來自八進制的博客

      1. Equinox OSGi服務器應用程序的配置步驟
      2. 利用OSGi DS實現(xiàn)可配置Web應用程序初探

    來自羅明的博客

      1. 讓OSGi支持JSF Web開發(fā)
      2. [OSGi]為什么我們需要Bnd?

    來自yangbutao的博客

      1. OSGI 服務層探究
      2. OSGI Module & lifecycle

    來自erylee的博客

      1. OpenCore: OSGi上部署Hibernate的四種方式
      2. OpenCore:OSGi上部署Apache Common Log
      3. OpenCore:基于OSGi開發(fā)純插件體系結構的WEB應用程序

    來自

      1. Equinox OSGi系列之一 Equinox入門
      2. Equinox OSGi系列之二 搭建Equinox OSGi核心環(huán)境
      3. Equinox OSGi系列之三 Equinox配置參數(shù)詳解
      4. Equinox OSGi系列之四 創(chuàng)建自己的OSGi應用項目 

    來自IBM 的developerworks

      1. 利用 Eclipse 開發(fā)基于 OSGi 的 Bundle 應用(2006 年 7 月 17 日)
      2. 基于 OSGi 的面向服務的組件編程(2007 年 8 月 31 日)

    來自其他的博客或帖子:

      1. SOA應用系統(tǒng)總體框架及相關概念
      2. SCA與OSGi真的具有可比性嗎?【推薦】
      3. Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture)
      4. 談談osgi中的事件機制
      5. 基于Web的OSGi框架構想
      6. From JavaWorld  "Hello, OSGi, Part 1: Bundles for beginners" "Hello, OSGi, Part 3: Take it to the server side - JavaWorld"

    posted @ 2008-12-11 14:40 追風舞者 閱讀(221) | 評論 (0)編輯 收藏

    剛剛找到的面試題目。自己做了一下,反正挺慘不人睹的。貼出來就想幫幫有需要的人
    并且問問為什么是這個結果呢?有的題的答案真的想不到啊~想不到~

    一、判斷題(30分)
    1.Java程序里,創(chuàng)建新的類對象用關鍵字new,回收無用的類對象使用關鍵字free。
    2.對象可以賦值,只要使用賦值號(等號)即可,相當于生成了一個各屬性與賦值對象相同的新對象。
    3.有的類定義時可以不定義構造函數(shù),所以構造函數(shù)不是必需的。
    4.類及其屬性、方法可以同時有一個以上的修飾符來修飾。
    5.Java的屏幕坐標是以像素為單位,容器的左下角被確定為坐標的起點
    6.抽象方法必須在抽象類中,所以抽象類中的方法都必須是抽象方法。
    7.Final類中的屬性和方法都必須被final修飾符修飾。
    8.最終類不能派生子類,最終方法不能被覆蓋。
    9.子類要調(diào)用父類的方法,必須使用super關鍵字。
    10.一個Java類可以有多個父類。
    11.如果p是父類Parent的對象,而c是子類Child的對象,則語句c = p是正確的。
    12.在java集合中,Vector和HashMap是線程安全的。
    13.當一個方法在運行過程中產(chǎn)生一個異常,則這個方法會終止,但是整個程序不一定終止運行。
    14.接口是特殊的類,所以接口也可以繼承,子接口將繼承父接口的所有常量和抽象方法。
    15.用“+”可以實現(xiàn)字符串的拼接,用- 可以從一個字符串中去除一個字符子串。

    二、選擇題(30分)
    1、關于垃圾收集的哪些敘述是正確的(   ):
    A.程序開發(fā)者必須自己創(chuàng)建一個線程進行內(nèi)存釋放的工作
    B.垃圾收集允許程序開發(fā)者明確指定并立即釋放該內(nèi)存
    C.垃圾收集將檢查并釋放不再使用的內(nèi)存
    D.垃圾收集能夠在期望的時間釋放被java對象使用的內(nèi)存
    2、下面的哪些賦值語句是不正確的(   ):
    A.float f=11.1;
    B.double d=5.3E12;
    C.double d=3.14159;
    D.double d=3.14D;
    3、下面關于變量及其范圍的陳述哪些是不正確的(   ):
    A.實例變量是類的成員變量
    B.實例變量用關鍵字static聲明
    C.在方法中定義的局部變量在該方法被執(zhí)行時創(chuàng)建
    D.局部變量在使用前必須被初始化
    4、下列關于修飾符混用的說法,錯誤的是(  ):
    A.a(chǎn)bstract不能與final并列修飾同一個類
    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、以下標識符中哪項是不合法的(    ):
    A、 BigMeaninglessName                     B、$int
    C、1 st                                    D、$1
    7、main方法是Java  Application程序執(zhí)行的入口點,關于main方法的方法頭以下哪項是合法的(    ):
    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];后,以下哪項說明是正確的(    ):
    A、    x[24]為0
    B、    x[24]未定義
    C、    x[25]為0
    D、    x[0]為空
    9、以下代碼段執(zhí)行后的輸出結果為(     ):
           int  x=3; int  y=10;
           System.out.println(y%x);
    A、0
    B、1
    C、2
    D、3
    10、以下哪個表達式是不合法的(    ):
    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、編譯運行以下程序后,關于輸出結果的說明正確的是 (    ):
           public  class   Conditional{
                  public  static  void  main(String  args[  ]){
                         int  x=4;
                         System.out.println(“value  is  “+ ((x>4) ? 99.9 :9));
    }
    }
    A、    輸出結果為:value  is  99.99
    B、    輸出結果為:value  is  9
    C、    輸出結果為:value  is  9.0
    D、    編譯錯誤
    12、以下聲明合法的是(     ):
    A、    default  String  s;
    B、    public  final  static  native  int  w( )
    C、    abstract  double  d;
    D、    abstract  final  double  hyperbolicCosine( )
    13、關于以下application的說明,正確的是(    ):
    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行不能通過編譯,因為缺少方法名和返回類型 
    B、 9行不能通過編譯,因為只能有一個靜態(tài)初始化器
    C、 編譯通過,執(zhí)行結果為:x=5
    D、編譯通過,執(zhí)行結果為:x=3
    14、關于以下程序代碼的說明正確的是(   ):
    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行不能通過編譯,因為引用了私有靜態(tài)變量
    B、10行不能通過編譯,因為x是私有靜態(tài)變量
    C、程序通過編譯,輸出結果為:x=103
    D、程序通過編譯,輸出結果為:x=102
    15、以下選項中循環(huán)結構合法的是(    ):
    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);

    三、簡答題(40分)
    1.    寫出下列程序的運行結果
    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();
      }
    }


    寫出下列程序的運行結果
    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());
        }
    }

    寫出下列程序的運行結果
    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);
          }
    }


    寫出下列程序的運行結果
    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 追風舞者 閱讀(396) | 評論 (0)編輯 收藏

    一、參考資料:

    1. Tuning Garbage Collection with the 5.0 Java Virtual Machine 官方指南。
    2. Hotspot memory management whitepaper 官方白皮書。
    3. Java Tuning White Paper 官方文檔。
    4. FAQ about Garbage Collection in the Hotspot  官方FAQ,JVM1.4.2。
    5. Java HotSpot 虛擬機中的垃圾收集 JavaOne2004上的中文ppt
    6. A Collection of JVM Options JVM選項的超完整收集。

    二、基本概念

    1、堆(Heap)

    JVM管理的內(nèi)存叫堆。在32Bit操作系統(tǒng)上有1.5G-2G的限制,而64Bit的就沒有。

    JVM初始分配的內(nèi)存由-Xms指定,默認是物理內(nèi)存的1/64但小于1G。

    JVM最大分配的內(nèi)存由-Xmx指定,默認是物理內(nèi)存的1/4但小于1G。

    默認空余堆內(nèi)存小于40%時,JVM就會增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。
    默認空余堆內(nèi)存大于70%時,JVM會減少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。

    服務器一般設置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小,所以上面的兩個參數(shù)沒啥用。 

    2.基本收集算法

    1. 復制:將堆內(nèi)分成兩個相同空間,從根(ThreadLocal的對象,靜態(tài)對象)開始訪問每一個關聯(lián)的活躍對象,將空間A的活躍對象全部復制到空間B,然后一次性回收整個空間A。
      因為只訪問活躍對象,將所有活動對象復制走之后就清空整個空間,不用去訪問死對象,所以遍歷空間的成本較小,但需要巨大的復制成本和較多的內(nèi)存。
    2. 標記清除(mark-sweep):收集器先從根開始訪問所有活躍對象,標記為活躍對象。然后再遍歷一次整個內(nèi)存區(qū)域,把所有沒有標記活躍的對象進行回收處理。該算法遍歷整個空間的成本較大暫停時間隨空間大小線性增大,而且整理后堆里的碎片很多。
    3. 標記整理(mark-sweep-compact):綜合了上述兩者的做法和優(yōu)點,先標記活躍對象,然后將其合并成較大的內(nèi)存塊。

        可見,沒有免費的午餐,無論采用復制還是標記清除算法,自動的東西都要付出很大的性能代價。

    3.分代

        分代是Java垃圾收集的一大亮點,根據(jù)對象的生命周期長短,把堆分為3個代:Young,Old和Permanent,根據(jù)不同代的特點采用不同的收集算法,揚長避短也。

    Young(Nursery),年輕代。研究表明大部分對象都是朝生暮死,隨生隨滅的。因此所有收集器都為年輕代選擇了復制算法。
        復制算法優(yōu)點是只訪問活躍對象,缺點是復制成本高。因為年輕代只有少量的對象能熬到垃圾收集,因此只需少量的復制成本。而且復制收集器只訪問活躍對象,對那些占了最大比率的死對象視而不見,充分發(fā)揮了它遍歷空間成本低的優(yōu)點。

        Young的默認值為4M,隨堆內(nèi)存增大,約為1/15,JVM會根據(jù)情況動態(tài)管理其大小變化。
        -XX:NewRatio= 參數(shù)可以設置Young與Old的大小比例,-server時默認為1:2,但實際上young啟動時遠低于這個比率?如果信不過JVM,也可以用-Xmn硬性規(guī)定其大小,有文檔推薦設為Heap總大小的1/4。

        Young的大小非常非常重要,見“后面暫停時間優(yōu)先收集器”的論述。

        Young里面又分為3個區(qū)域,一個Eden,所有新建對象都會存在于該區(qū),兩個Survivor區(qū),用來實施復制算法。每次復制就是將Eden和第一塊Survior的活對象復制到第2塊,然后清空Eden與第一塊Survior。Eden與Survivor的比例由-XX:SurvivorRatio=設置,默認為32。Survivio大了會浪費,小了的話,會使一些年輕對象潛逃到老人區(qū),引起老人區(qū)的不安,但這個參數(shù)對性能并不重要。 

    Old(Tenured),年老代。年輕代的對象如果能夠挺過數(shù)次收集,就會進入老人區(qū)。老人區(qū)使用標記整理算法。因為老人區(qū)的對象都沒那么容易死的,采用復制算法就要反復的復制對象,很不合算,只好采用標記清理算法,但標記清理算法其實也不輕松,每次都要遍歷區(qū)域內(nèi)所有對象,所以還是沒有免費的午餐啊。

    -XX:MaxTenuringThreshold=設置熬過年輕代多少次收集后移入老人區(qū),CMS中默認為0,熬過第一次GC就轉(zhuǎn)入,可以用-XX:+PrintTenuringDistribution查看。

    Permanent,持久代。裝載Class信息等基礎數(shù)據(jù),默認64M,如果是類很多很多的服務程序,需要加大其設置-XX:MaxPermSize=,否則它滿了之后會引起fullgc()或Out of Memory。 注意Spring,Hibernate這類喜歡AOP動態(tài)生成類的框架需要更多的持久代內(nèi)存。

    4.minor/major collection

        每個代滿了之后都會促發(fā)collection,(另外Concurrent Low Pause Collector默認在老人區(qū)68%的時候促發(fā))。GC用較高的頻率對young進行掃描和回收,這種叫做minor collection。
    而因為成本關系對Old的檢查回收頻率要低很多,同時對Young和Old的收集稱為major collection。
        System.gc()會引發(fā)major collection,使用-XX:+DisableExplicitGC禁止它,或設為CMS并發(fā)-XX:+ExplicitGCInvokesConcurrent。

    5.小結

    Young -- minor collection -- 復制算法

    Old(Tenured) -- major colletion -- 標記清除/標記整理算法

    三、收集器

    1.古老的串行收集器(Serial Collector)

        使用 -XX:+UseSerialGC,策略為年輕代串行復制,年老代串行標記整理。

    2.吞吐量優(yōu)先的并行收集器(Throughput Collector)

        使用 -XX:+UseParallelGC ,也是JDK5 -server的默認值。策略為:
        1.年輕代暫停應用程序,多個垃圾收集線程并行的復制收集,線程數(shù)默認為CPU個數(shù),CPU很多時,可用–XX:ParallelGCThreads=減少線程數(shù)。
        2.年老代暫停應用程序,與串行收集器一樣,單垃圾收集線程標記整理。

        所以需要2+的CPU時才會優(yōu)于串行收集器,適用于后臺處理,科學計算。

        可以使用-XX:MaxGCPauseMillis= 和 -XX:GCTimeRatio 來調(diào)整GC的時間。

    3.暫停時間優(yōu)先的并發(fā)收集器(Concurrent Low Pause Collector-CMS)

        前面說了這么多,都是為了這節(jié)做鋪墊......

        使用-XX:+UseConcMarkSweepGC,策略為:
        1.年輕代同樣是暫停應用程序,多個垃圾收集線程并行的復制收集。
        2.年老代則只有兩次短暫停,其他時間應用程序與收集線程并發(fā)的清除。

    3.1 年老代詳述

        并行(Parallel)與并發(fā)(Concurrent)僅一字之差,并行指多條垃圾收集線程并行,并發(fā)指用戶線程與垃圾收集線程并發(fā),程序在繼續(xù)運行,而垃圾收集程序運行于另一個個CPU上。

        并發(fā)收集一開始會很短暫的停止一次所有線程來開始初始標記根對象,然后標記線程與應用線程一起并發(fā)運行,最后又很短的暫停一次,多線程并行的重新標記之前可能因為并發(fā)而漏掉的對象,然后就開始與應用程序并發(fā)的清除過程??梢?,最長的兩個遍歷過程都是與應用程序并發(fā)執(zhí)行的,比以前的串行算法改進太多太多了!!!

        串行標記清除是等年老代滿了再開始收集的,而并發(fā)收集因為要與應用程序一起運行,如果滿了才收集,應用程序就無內(nèi)存可用,所以系統(tǒng)默認68%滿的時候就開始收集。內(nèi)存已設得較大,吃內(nèi)存又沒有這么快的時候,可以用-XX:CMSInitiatingOccupancyFraction=恰當增大該比率。

    3.2 年輕代詳述

       可惜對年輕代的復制收集,依然必須停止所有應用程序線程,原理如此,只能靠多CPU,多收集線程并發(fā)來提高收集速度,但除非你的Server獨占整臺服務器,否則如果服務器上本身還有很多其他線程時,切換起來速度就..... 所以,搞到最后,暫停時間的瓶頸就落在了年輕代的復制算法上。

        因此Young的大小設置挺重要的,大點就不用頻繁GC,而且增大GC的間隔后,可以讓多點對象自己死掉而不用復制了。但Young增大時,GC造成的停頓時間攀升得非常恐怖,比如在我的機器上,默認8M的Young,只需要幾毫秒的時間,64M就升到90毫秒,而升到256M時,就要到300毫秒了,峰值還會攀到恐怖的800ms。誰叫復制算法,要等Young滿了才開始收集,開始收集就要停止所有線程呢。

    3.3 持久代

    可設置-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled,使CMS收集持久代的類,而不是fullgc,netbeans5.5 performance文檔的推薦。

    4.增量(train算法)收集器(Incremental Collector)

    已停止維護,–Xincgc選項默認轉(zhuǎn)為并發(fā)收集器。

    四、暫停時間顯示

     加入下列參數(shù) (請將PrintGC和Details中間的空格去掉,CSDN很怪的認為是禁止字句) 

    -verbose:gc -XX:+PrintGC Details  -XX:+PrintGCTimeStamps

    會程序運行過程中將顯示如下輸出

     9.211: [GC 9.211: [ParNew: 7994K->0K(8128K), 0.0123935 secs] 427172K->419977K(524224K), 0.0125728 secs]

     顯示在程序運行的9.211秒發(fā)生了Minor的垃圾收集,前一段數(shù)據(jù)針對新生區(qū),從7994k整理為0k,新生區(qū)總大小為8128k,程序暫停了12ms,而后一段數(shù)據(jù)針對整個堆。

    對于年老代的收集,暫停發(fā)生在下面兩個階段,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]

    再加兩個參數(shù) -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime對暫停時間看得更清晰。

    五、真正不停的BEA JRockit 與Sun RTS2.0

       Bea的JRockit 5.0 R27 的特色之一是動態(tài)決定的垃圾收集策略,用戶可以決定自己關心的是吞吐量,暫停時間還是確定的暫停時間,再由JVM在運行時動態(tài)決定、改變改變垃圾收集策略。
       
       它的Deterministic GC的選項是-Xgcprio: deterministic,號稱可以把暫??梢钥刂圃?0-30毫秒,非常的牛,一句Deterministic道盡了RealTime的真諦。 不過細看一下文檔,30ms的測試環(huán)境是1 GB heap 和 平均  30% 的活躍對象(也就是300M)活動對象,2 個 Xeon 3.6 GHz  4G內(nèi)存 ,或者是4 個Xeon 2.0 GHz,8G內(nèi)存。

      最可惜JRockt的license很奇怪,雖然平時使用免費,但這個30ms的選項就需要購買整個Weblogic Real Time Server的license。 

      其他免費選項,有:

    • -Xgcprio:pausetime -Xpausetarget=210ms 
        因為免費,所以最低只能設置到200ms pause target。 200ms是Sun認為Real-Time的分界線。
    • -Xgc:gencon
      普通的并發(fā)做法,效率也不錯。

      JavaOne2007上有Sun的 Java Real-Time System 2.0 的介紹,RTS2.0基于JDK1.5,在Real-Time  Garbage Collctor上又有改進,但還在beta版狀態(tài),只供給OEM,更怪。

    六、JDK 6.0的改進

    因為JDK5.0在Young較大時的表現(xiàn)還是不夠讓人滿意,又繼續(xù)看JDK6.0的改進,結果稍稍失望,不涉及我最頭痛的年輕代復制收集改良。

    1.年老代的標識-清除收集,并行執(zhí)行標識
      JDK5.0只開了一條收集進程與應用線程并發(fā)標識,而6.0可以開多條收集線程來做標識,縮短標識老人區(qū)所有活動對象的時間。

    2.加大了Young區(qū)的默認大小
    默認大小從4M加到16M,從堆內(nèi)存的1/15增加到1/7

    3.System.gc()可以與應用程序并發(fā)執(zhí)行
    使用-XX:+ExplicitGCInvokesConcurrent 設置

    七、小結

    1. JDK5.0/6.0

    對于服務器應用,我們使用Concurrent Low Pause Collector,對年輕代,暫停時多線程并行復制收集;對年老代,收集器與應用程序并行標記--整理收集,以達到盡量短的垃圾收集時間。

    本著沒有深刻測試前不要胡亂優(yōu)化的宗旨,命令行屬性只需簡單寫為:

    -server -Xms<heapsize>M -Xmx<heapsize>M -XX:+UseConcMarkSweepGC  -XX:+PrintGC Details  -XX:+PrintGCTimeStamps

    然后要根據(jù)應用的情況,在測試軟件輔助可以下看看有沒有JVM的默認值和自動管理做的不夠的地方可以調(diào)整,如-xmn 設Young的大小,-XX:MaxPermSize設持久代大小等。

    2. JRockit 6.0 R27.2

    但因為JDK5的測試結果實在不能滿意,后來又嘗試了JRockit,總體效果要好些。
     JRockit的特點是動態(tài)垃圾收集器是根據(jù)用戶關心的特征動態(tài)決定收集算法的,參數(shù)如下

     -Xms<heapsize>M -Xmx<heapsize>M -Xgcprio:pausetime -Xpausetarget=200ms -XgcReport -XgcPause -Xverbose:memory

    posted @ 2008-12-03 09:51 追風舞者 閱讀(218) | 評論 (0)編輯 收藏

    1.垃圾收集算法的核心思想

      Java語言建立了垃圾收集機制,用以跟蹤正在使用的對象和發(fā)現(xiàn)并回收不再使用(引用)的對象。該機制可以有效防范動態(tài)內(nèi)存分配中可能發(fā)生的兩個危險:因內(nèi)存垃圾過多而引發(fā)的內(nèi)存耗盡,以及不恰當?shù)膬?nèi)存釋放所造成的內(nèi)存非法引用。

      垃圾收集算法的核心思想是:對虛擬機可用內(nèi)存空間,即堆空間中的對象進行識別,如果對象正在被引用,那么稱其為存活對象,反之,如果對象不再被引用,則為垃圾對象,可以回收其占據(jù)的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統(tǒng)參數(shù)的合理調(diào)節(jié)直接影響著系統(tǒng)性能,因此需要開發(fā)人員做比較深入的了解。

    2.觸發(fā)主GC(Garbage Collector)的條件

      JVM進行次GC的頻率很高,但因為這種GC占用時間極短,所以對系統(tǒng)產(chǎn)生的影響不大。更值得關注的是主GC的觸發(fā)條件,因為它對系統(tǒng)影響很明顯。總的來說,有兩個條件會觸發(fā)主GC:
     

      ①當應用程序空閑時,即沒有應用線程在運行時,GC會被調(diào)用。因為GC在優(yōu)先級最低的線程中進行,所以當應用忙時,GC線程就不會被調(diào)用,但以下條件除外。

     ?、贘ava堆內(nèi)存不足時,GC會被調(diào)用。當應用線程在運行,并在運行過程中創(chuàng)建新對象,若這時內(nèi)存空間不足,JVM就會強制地調(diào)用GC線程,以便回收內(nèi)存用于新的分配。若GC一次之后仍不能滿足內(nèi)存分配的要求,JVM會再進行兩次GC作進一步的嘗試,若仍無法滿足要求,則 JVM將報“out of memory”的錯誤,Java應用將停止。

      由于是否進行主GC由JVM根據(jù)系統(tǒng)環(huán)境決定,而系統(tǒng)環(huán)境在不斷的變化當中,所以主GC的運行具有不確定性,無法預計它何時必然出現(xiàn),但可以確定的是對一個長期運行的應用來說,其主GC是反復進行的。

    3.減少GC開銷的措施

      根據(jù)上述GC的機制,程序的運行會直接影響系統(tǒng)環(huán)境的變化,從而影響GC的觸發(fā)。若不針對GC的特點進行設計和編碼,就會出現(xiàn)內(nèi)存駐留等一系列負面影響。為了避免這些影響,基本的原則就是盡可能地減少垃圾和減少GC過程中的開銷。具體措施包括以下幾個方面:

      (1)不要顯式調(diào)用System.gc()

      此函數(shù)建議JVM進行主GC,雖然只是建議而非一定,但很多情況下它會觸發(fā)主GC,從而增加主GC的頻率,也即增加了間歇性停頓的次數(shù)。

      (2)盡量減少臨時對象的使用

      臨時對象在跳出函數(shù)調(diào)用后,會成為垃圾,少用臨時變量就相當于減少了垃圾的產(chǎn)生,從而延長了出現(xiàn)上述第二個觸發(fā)條件出現(xiàn)的時間,減少了主GC的機會。

      (3)對象不用時最好顯式置為Null

      一般而言,為Null的對象都會被作為垃圾處理,所以將不用的對象顯式地設為Null,有利于GC收集器判定垃圾,從而提高了GC的效率。

      (4)盡量使用StringBuffer,而不用String來累加字符串(詳見blog另一篇文章JAVA中String與StringBuffer)

      由于String是固定長的字符串對象,累加String對象時,并非在一個String對象中擴增,而是重新創(chuàng)建新的String對象,如Str5=Str1+Str2+Str3+Str4,這條語句執(zhí)行過程中會產(chǎn)生多個垃圾對象,因為對次作“+”操作時都必須創(chuàng)建新的String對象,但這些過渡對象對系統(tǒng)來說是沒有實際意義的,只會增加更多的垃圾。避免這種情況可以改用StringBuffer來累加字符串,因StringBuffer是可變長的,它在原有基礎上進行擴增,不會產(chǎn)生中間對象。

      (5)能用基本類型如Int,Long,就不用Integer,Long對象

      基本類型變量占用的內(nèi)存資源比相應對象占用的少得多,如果沒有必要,最好使用基本變量。

      (6)盡量少用靜態(tài)對象變量

      靜態(tài)變量屬于全局變量,不會被GC回收,它們會一直占用內(nèi)存。

      (7)分散對象創(chuàng)建或刪除的時間

      集中在短時間內(nèi)大量創(chuàng)建新對象,特別是大對象,會導致突然需要大量內(nèi)存,JVM在面臨這種情況時,只能進行主GC,以回收內(nèi)存或整合內(nèi)存碎片,從而增加主GC的頻率。集中刪除對象,道理也是一樣的。它使得突然出現(xiàn)了大量的垃圾對象,空閑空間必然減少,從而大大增加了下一次創(chuàng)建新對象時強制主GC的機會。

    4.gc與finalize方法

      ⑴gc方法請求垃圾回收

      使用System.gc()可以不管JVM使用的是哪一種垃圾回收的算法,都可以請求Java的垃圾回收。需要注意的是,調(diào)用System.gc()也僅僅是一個請求。JVM接受這個消息后,并不是立即做垃圾回收,而只是對幾個垃圾回收算法做了加權,使垃圾回收操作容易發(fā)生,或提早發(fā)生,或回收較多而已。

     ?、苀inalize方法透視垃圾收集器的運行

      在JVM垃圾收集器收集一個對象之前 ,一般要求程序調(diào)用適當?shù)姆椒ㄡ尫刨Y源,但在沒有明確釋放資源的情況下,Java提供了缺省機制來終止化該對象釋放資源,這個方法就是finalize()。它的原型為:

      protected void finalize() throws Throwable

      在finalize()方法返回之后,對象消失,垃圾收集開始執(zhí)行。原型中的throws Throwable表示它可以拋出任何類型的異常。

      因此,當對象即將被銷毀時,有時需要做一些善后工作。可以把這些操作寫在finalize()方法里。

     

    java 代碼
    1. protected void finalize()    
    2.    {    
    3.    // finalization code here    
    4.    }  

     

    ⑶代碼示例

    java 代碼
    1. class Garbage{    
    2.    int index;    
    3.    static int count;    
    4.   
    5.    Garbage() {    
    6.    count++;    
    7.    System.out.println("object "+count+" construct");    
    8.    setID(count);    
    9.    }    
    10.   
    11.    void setID(int id) {    
    12.    index=id;    
    13.    }    
    14.   
    15.    protected void finalize() //重寫finalize方法    
    16.    {    
    17.    System.out.println("object "+index+" is reclaimed");    
    18.    }    
    19.   
    20.    public static void main(String[] args)    
    21.    {    
    22.    new Garbage();    
    23.    new Garbage();    
    24.    new Garbage();    
    25.    new Garbage();    
    26.    System.gc(); //請求運行垃圾收集器    
    27.    }    
    28.   
    29.  }  

    5.Java 內(nèi)存泄漏
      由于采用了垃圾回收機制,任何不可達對象(對象不再被引用)都可以由垃圾收集線程回收。因此通常說的Java 內(nèi)存泄漏其實是指無意識的、非故意的對象引用,或者無意識的對象保持。無意識的對象引用是指代碼的開發(fā)人員本來已經(jīng)對對象使用完畢,卻因為編碼的錯誤而意外地保存了對該對象的引用(這個引用的存在并不是編碼人員的主觀意愿),從而使得該對象一直無法被垃圾回收器回收掉,這種本來以為可以釋放掉的卻最終未能被釋放的空間可以認為是被“泄漏了”。

      考慮下面的程序,在ObjStack類中,使用push和pop方法來管理堆棧中的對象。兩個方法中的索引(index)用于指示堆棧中下一個可用位置。push方法存儲對新對象的引用并增加索引值,而pop方法減小索引值并返回堆棧最上面的元素。在main方法中,創(chuàng)建了容量為64的棧,并64次調(diào)用push方法向它添加對象,此時index的值為64,隨后又32次調(diào)用pop方法,則index的值變?yōu)?2,出棧意味著在堆棧中的空間應該被收集。但事實上,pop方法只是減小了索引值,堆棧仍然保持著對那些對象的引用。故32個無用對象不會被GC回收,造成了內(nèi)存滲漏。

     

    java 代碼
    public class ObjStack {    
    1.    private Object[] stack;    
    2.    private int index;    
    3.    ObjStack(int indexcount) {    
    4.    stack = new Object[indexcount];    
    5.    index = 0;    
    6.    }    
    7.    public void push(Object obj) {    
    8.    stack[index] = obj;    
    9.    index++;    
    10.    }    
    11.    public Object pop() {    
    12.    index--;    
    13.    return stack[index];    
    14.    }    
    15.    }    
    16.    public class Pushpop {    
    17.    public static void main(String[] args) {    
    18.    int i = 0;    
    19.    Object tempobj;    
    20.   
    21. //new一個ObjStack對象,并調(diào)用有參構造函數(shù)。分配stack Obj數(shù)組的空間大小為64,可以存64個對象,從0開始存儲   
    22.    ObjStack stack1 = new ObjStack(64);   
    23.   
    24.    while (i < 64)    
    25.    {    
    26.    tempobj = new Object();//循環(huán)new Obj對象,把每次循環(huán)的對象一一存放在stack Obj數(shù)組中。    
    27.    stack1.push(tempobj);    
    28.    i++;    
    29.    System.out.println("第" + i + "次進棧" + "\t");    
    30.    }    
    31.   
    32.    while (i > 32)    
    33.    {    
    34.    tempobj = stack1.pop();//這里造成了空間的浪費。    
    35.    //正確的pop方法可改成如下所指示,當引用被返回后,堆棧刪除對他們的引用,因此垃圾收集器在以后可以回收他們。    
    36.    /*   
    37.    * public Object pop() {index - -;Object temp = stack [index];stack [index]=null;return temp;}   
    38.    */    
    39.    i--;    
    40.    System.out.println("第" + (64 - i) + "次出棧" + "\t");    
    41.    }    
    42.    }    
    43.    }  

     

    6.如何消除內(nèi)存泄漏

      雖然Java虛擬機(JVM)及其垃圾收集器(garbage collector,GC)負責管理大多數(shù)的內(nèi)存任務,Java軟件程序中還是有可能出現(xiàn)內(nèi)存泄漏。實際上,這在大型項目中是一個常見的問題。避免內(nèi)存泄漏的第一步是要弄清楚它是如何發(fā)生的。本文介紹了編寫Java代碼的一些常見的內(nèi)存泄漏陷阱,以及編寫不泄漏代碼的一些最佳實踐。一旦發(fā)生了內(nèi)存泄漏,要指出造成泄漏的代碼是非常困難的。因此本文還介紹了一種新工具,用來診斷泄漏并指出根本原因。該工具的開銷非常小,因此可以使用它來尋找處于生產(chǎn)中的系統(tǒng)的內(nèi)存泄漏。

      垃圾收集器的作用

      雖然垃圾收集器處理了大多數(shù)內(nèi)存管理問題,從而使編程人員的生活變得更輕松了,但是編程人員還是可能犯錯而導致出現(xiàn)內(nèi)存問題。簡單地說,GC循環(huán)地跟蹤所有來自“根”對象(堆棧對象、靜態(tài)對象、JNI句柄指向的對象,諸如此類)的引用,并將所有它所能到達的對象標記為活動的。程序只可以操縱這些對象;其他的對象都被刪除了。因為GC使程序不可能到達已被刪除的對象,這么做就是安全的。

      雖然內(nèi)存管理可以說是自動化的,但是這并不能使編程人員免受思考內(nèi)存管理問題之苦。例如,分配(以及釋放)內(nèi)存總會有開銷,雖然這種開銷對編程人員來說是不可見的。創(chuàng)建了太多對象的程序?qū)韧瓿赏瑯拥墓δ芏鴦?chuàng)建的對象卻比較少的程序更慢一些(在其他條件相同的情況下)。

      而且,與本文更為密切相關的是,如果忘記“釋放”先前分配的內(nèi)存,就可能造成內(nèi)存泄漏。如果程序保留對永遠不再使用的對象的引用,這些對象將會占用并耗盡內(nèi)存,這是因為自動化的垃圾收集器無法證明這些對象將不再使用。正如我們先前所說的,如果存在一個對對象的引用,對象就被定義為活動的,因此不能刪除。為了確保能回收對象占用的內(nèi)存,編程人員必須確保該對象不能到達。這通常是通過將對象字段設置為null或者從集合(collection)中移除對象而完成的。但是,注意,當局部變量不再使用時,沒有必要將其顯式地設置為null。對這些變量的引用將隨著方法的退出而自動清除。

      概括地說,這就是內(nèi)存托管語言中的內(nèi)存泄漏產(chǎn)生的主要原因:保留下來卻永遠不再使用的對象引用。

      典型泄漏

      既然我們知道了在Java中確實有可能發(fā)生內(nèi)存泄漏,就讓我們來看一些典型的內(nèi)存泄漏及其原因。

      全局集合

      在大的應用程序中有某種全局的數(shù)據(jù)儲存庫是很常見的,例如一個JNDI樹或一個會話表。在這些情況下,必須注意管理儲存庫的大小。必須有某種機制從儲存庫中移除不再需要的數(shù)據(jù)。

      這可能有多種方法,但是最常見的一種是周期性運行的某種清除任務。該任務將驗證儲存庫中的數(shù)據(jù),并移除任何不再需要的數(shù)據(jù)。

      另一種管理儲存庫的方法是使用反向鏈接(referrer)計數(shù)。然后集合負責統(tǒng)計集合中每個入口的反向鏈接的數(shù)目。這要求反向鏈接告訴集合何時會退出入口。當反向鏈接數(shù)目為零時,該元素就可以從集合中移除了。

      緩存

      緩存是一種數(shù)據(jù)結構,用于快速查找已經(jīng)執(zhí)行的操作的結果。因此,如果一個操作執(zhí)行起來很慢,對于常用的輸入數(shù)據(jù),就可以將操作的結果緩存,并在下次調(diào)用該操作時使用緩存的數(shù)據(jù)。

      緩存通常都是以動態(tài)方式實現(xiàn)的,其中新的結果是在執(zhí)行時添加到緩存中的。典型的算法是:

      檢查結果是否在緩存中,如果在,就返回結果。

      如果結果不在緩存中,就進行計算。

      將計算出來的結果添加到緩存中,以便以后對該操作的調(diào)用可以使用。

      該算法的問題(或者說是潛在的內(nèi)存泄漏)出在最后一步。如果調(diào)用該操作時有相當多的不同輸入,就將有相當多的結果存儲在緩存中。很明顯這不是正確的方法。

      為了預防這種具有潛在破壞性的設計,程序必須確保對于緩存所使用的內(nèi)存容量有一個上限。因此,更好的算法是:

      檢查結果是否在緩存中,如果在,就返回結果。

      如果結果不在緩存中,就進行計算。

      如果緩存所占的空間過大,就移除緩存最久的結果。

      將計算出來的結果添加到緩存中,以便以后對該操作的調(diào)用可以使用。

      通過始終移除緩存最久的結果,我們實際上進行了這樣的假設:在將來,比起緩存最久的數(shù)據(jù),最近輸入的數(shù)據(jù)更有可能用到。這通常是一個不錯的假設。

      新算法將確保緩存的容量處于預定義的內(nèi)存范圍之內(nèi)。確切的范圍可能很難計算,因為緩存中的對象在不斷變化,而且它們的引用包羅萬象。為緩存設置正確的大小是一項非常復雜的任務,需要將所使用的內(nèi)存容量與檢索數(shù)據(jù)的速度加以平衡。

      解決這個問題的另一種方法是使用java.lang.ref.SoftReference類跟蹤緩存中的對象。這種方法保證這些引用能夠被移除,如果虛擬機的內(nèi)存用盡而需要更多堆的話。

      ClassLoader

      Java ClassLoader結構的使用為內(nèi)存泄漏提供了許多可乘之機。正是該結構本身的復雜性使ClassLoader在內(nèi)存泄漏方面存在如此多的問題。ClassLoader的特別之處在于它不僅涉及“常規(guī)”的對象引用,還涉及元對象引用,比如:字段、方法和類。這意味著只要有對字段、方法、類或ClassLoader的對象的引用,ClassLoader就會駐留在JVM中。因為ClassLoader本身可以關聯(lián)許多類及其靜態(tài)字段,所以就有許多內(nèi)存被泄漏了。

      確定泄漏的位置

      通常發(fā)生內(nèi)存泄漏的第一個跡象是:在應用程序中出現(xiàn)了OutOfMemoryError。這通常發(fā)生在您最不愿意它發(fā)生的生產(chǎn)環(huán)境中,此時幾乎不能進行調(diào)試。有可能是因為測試環(huán)境運行應用程序的方式與生產(chǎn)系統(tǒng)不完全相同,因而導致泄漏只出現(xiàn)在生產(chǎn)中。在這種情況下,需要使用一些開銷較低的工具來監(jiān)控和查找內(nèi)存泄漏。還需要能夠無需重啟系統(tǒng)或修改代碼就可以將這些工具連接到正在運行的系統(tǒng)上??赡茏钪匾氖?,當進行分析時,需要能夠斷開工具而保持系統(tǒng)不受干擾。

      雖然OutOfMemoryError通常都是內(nèi)存泄漏的信號,但是也有可能應用程序確實正在使用這么多的內(nèi)存;對于后者,或者必須增加JVM可用的堆的數(shù)量,或者對應用程序進行某種更改,使它使用較少的內(nèi)存。但是,在許多情況下,OutOfMemoryError都是內(nèi)存泄漏的信號。一種查明方法是不間斷地監(jiān)控GC的活動,確定內(nèi)存使用量是否隨著時間增加。如果確實如此,就可能發(fā)生了內(nèi)存泄漏。

    posted @ 2008-12-03 09:41 追風舞者 閱讀(1305) | 評論 (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 追風舞者 閱讀(214) | 評論 (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(
    "請輸入盤數(shù):");
            BufferedReader br 
    = new BufferedReader(new InputStreamReader(System.in));
            
    int n = Integer.parseInt(br.readLine());
            move(n, 
    'A''B''C');
        }

        
    /**
         * 將n個盤子借助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 追風舞者 閱讀(201) | 評論 (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 追風舞者 閱讀(2054) | 評論 (4)編輯 收藏

    在Ubuntu 8.04中查看顯卡是否裝好
    運行glxinfo | grep rendering
    如果顯示”direct rendering: Yes”,則已安裝

    1、下載驅(qū)動

    我下載的就是NVIDIA-Linux-x86_64-173.14.12-pkg2.run這個文件,下載后放到home目錄下吧。

     

    2、刪除原驅(qū)動包
    sudo apt-get -–purge remove nvidia-glx nvidia-glx-new
    然后刪除 /lib/linux-restricted-modules/2.6.22-14-generic/文件夾下面帶有nvidia字樣的內(nèi)容,注意里面有一個隱藏文件.nvidia-new-installer也要刪掉

    這里是內(nèi)核自帶的驅(qū)動

    再檢查一下這兩個文件是否存在,/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`

    安裝編譯包。

    我在安裝的時候提示說沒有l(wèi)ib,驅(qū)動安裝時候要安裝Kernel Interface,如果采用自己編譯的方式則要求系統(tǒng)中有l(wèi)ibc的源碼。我想一般人都是沒有的,呵呵。這個時候我們可以在安裝驅(qū)動之前先自己把這個源碼給安裝好,問題就解決了。如何安裝?呵呵,更簡單,強大的 apt install阿, 運行:
    sudo apt-get install libc6-dev
    一行命令搞定。

    4、備份
    備份文件是一個好習慣。
    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)使用默認的驅(qū)動
    sudo gedit /etc/default/linux-restricted-modules-common
    在最后的雙引號中添加nv nvidia_new,即把文件中的“”,改成“nv nvidia_new”
    如果前面第二步刪除完整了其實也可以不用執(zhí)行這一步。

    6、將后面的操作記錄在紙上,因為后面會完全在終端字符界面下操作。

    7、停止GDM進程
    sudo /etc/init.d/gdm stop
    按Ctrl+Alt+F1,登錄后進入第7步。

    8、安裝驅(qū)動
    進入下好的驅(qū)動所在目錄
    執(zhí)行:sudo sh ./NVIDIA-Linux-x86_64-173.14.12-pkg2.run

    安裝過程中

    如果提示有舊驅(qū)動,詢問是否刪除舊驅(qū)動,選Yes;
    如果提示缺少某某模塊(modules),詢問是否上網(wǎng)下載,選no;
    如果提示編譯模塊,詢問是否進行編譯,選ok;
    如果提示將要修改Xorg.conf,詢問是否允許,選Yes;

    接下來就是等待安裝完成。

    9、安裝完成就回到終端,重啟GDM
    sudo /etc/init.d/gdm restart

    如果失敗,就重啟機子:sudo shutdown -r now

    好了,當看到NV的logo后,才表示安裝成功。

    如果不想看NVIDIA的LOGO,可以修改 /etc/X11/xorg.conf
    在Section “Device”中添加Option “NoLogo” “True”

    如:
    Section “Device”
    Identifier “通用顯示卡”
    Driver “nvidia”
    Option “NoLogo” “True”
    EndSection

    10.顯示高級設置
    如果想進行顯示方面的高級設置,在終端下輸入:nvidia-settings命令。

    左邊第二項是設置分辨率(server display configuration),從右邊的resolution中選擇分辨率,再點擊apply,

    預覽一下,不好取消就行了。

    至此,安裝完畢。

    如果御載的話就用這個命令

    sh NVIDIA-Linux-x86_64-173.14.12-pkg2.run –uninstall

    安裝成功,就這么簡單,一般nvidia 會自動配置好所有~`

    重新配置x server:
    sudo apt-get install pkg-config xserver-xorg-dev3
    sudo dpkg-reconfigure xserver-xorg



    posted @ 2008-09-19 13:23 追風舞者 閱讀(509) | 評論 (0)編輯 收藏

    安裝MySQL

    sudo apt-get install mysql-server

    這個應該很簡單了,而且我覺得大家在安裝方面也沒什么太大問題,所以也就不多說了,下面我們來講講配置。

    配置MySQL

    注意,在Ubuntu下MySQL缺省是只允許本地訪問的,如果你要其他機器也能夠訪問的話,那么需要改變/etc/mysql/my.cnf配置文件了!下面我們一步步地來:

    默認的MySQL安裝之后根用戶是沒有密碼的,所以首先用根用戶進入:

    $mysql -u root

    在這里之所以用-u root是因為我現(xiàn)在是一般用戶(firehare),如果不加-u root的話,mysql會以為是firehare在登錄。注意,我在這里沒有進入根用戶模式,因為沒必要。一般來說,對mysql中的數(shù)據(jù)庫進行操作, 根本沒必要進入根用戶模式,只有在設置時才有這種可能。

    進入mysql之后,最要緊的就是要設置Mysql中的root用戶密碼了,否則,Mysql服務無安全可言了。

    mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456";

    注意,我這兒用的是123456做為root用戶的密碼,但是該密碼是不安全的,請大家最好使用大小寫字母與數(shù)字混合的密碼,且不少于8位。

    這樣的話,就設置好了MySQL中的root用戶密碼了,然后就用root用戶建立你所需要的數(shù)據(jù)庫。我這里就以xoops為例:

    mysql>CREATE DATABASE xoops;

    mysql>GRANT ALL PRIVILEGES ON xoops.* TO xoops_root@localhost IDENTIFIED BY "654321";

    這樣就建立了一個xoops_roots的用戶,它對數(shù)據(jù)庫xoops有著全部權限。以后就用xoops_root來對xoops數(shù)據(jù)庫進行管理,而無需要再用root用戶了,而該用戶的權限也只被限定在xoops數(shù)據(jù)庫中。

    如果你想進行遠程訪問或控制,那么你要做兩件事:

    其一:

    mysql>GRANT ALL PRIVILEGES ON xoops.* TO xoops_root@"%" IDENTIFIED BY "654321";

    允許xoops_root用戶可以從任意機器上登入MySQL。

    其二:

    $sudo gedit /etc/mysql/my.cnf

    老的版本中

    >skip-networking => # skip-networking

    新的版本中

    >bind-address=127.0.0.1 => bind-address= 你機器的IP

    這樣就可以允許其他機器訪問MySQL了。

    posted @ 2008-09-18 17:53 追風舞者 閱讀(180) | 評論 (0)編輯 收藏

    Ubuntu8.04開啟3D桌面特效與設置方法


    文章來源于http://www.lupaworld.com
    Ubuntu 8.04 (Hardy Heron) 中集成了強大3D交互界面,Ubuntu 的 3D桌面特效給用戶帶來了一種全新的視覺用戶。想必有很多朋友也因為看到了 Ubuntu 8.04 那炫目的 3D 桌面特效才開始慢慢地了解Ubuntu 8.04 (Hardy Heron) 的。雖然在這之前也不少的朋友寫過設置 Ubuntu 閱讀全文
    類別:Ubuntu 查看評論
    文章來源:http://hi.baidu.com/whchensiyuan/blog/item/75a0ddbe9e308d0c18d81fd5.html

    posted @ 2008-09-18 12:28 追風舞者 閱讀(528) | 評論 (0)編輯 收藏

    Ubuntu 8.04加源安裝Google Gadgets
    此篇是Ubuntu 8.04下加源安裝Google Gadgets的方法,用戶不再需要自行編譯了,而且能一直保持最新。

      Google Gadgets是一套跨平臺的桌面工具集,for Linux版本剛剛公布不久。

      在ubuntu 8.04中:

      編輯源文件:

    sudo gedit /etc/apt/sources.list

      加入下面兩行:

    deb http://ppa.launchpad.net/googl

    閱讀全文
    類別:Ubuntu 查看評論
    文章來源:http://hi.baidu.com/whchensiyuan/blog/item/0c2bec1ebdef9a0c314e15bf.html

    posted @ 2008-09-18 12:28 追風舞者 閱讀(99) | 評論 (0)編輯 收藏

    很多新手面臨的困難和困惑都出現(xiàn)在編譯和打包軟件方面,unubtu的apt-get方式的確很易用,但是也屏蔽了學習的空間,對于那些希望好好學習linux的而又感到困惑的人,通過以下三個程序的幫助,應該可以有效的減輕你的負擔:

    第一個,checkinstall
    安裝命令:sudo apt-get install checkinstall
    程序功能:能跟蹤由“make install”或類似命令安裝的所有文件,并為這些文件創(chuàng)建Slackware、RPM或者Debian安裝包,然后把它添加到已安裝軟件包數(shù)據(jù)庫中,以
    閱讀全文
    類別:默認分類 查看評論
    文章來源:http://hi.baidu.com/whchensiyuan/blog/item/ac02403c7db675e83c6d9745.html

    posted @ 2008-09-18 12:28 追風舞者 閱讀(129) | 評論 (0)編輯 收藏

    Linux常用命令詳解

    來源: LUPA開源社區(qū)
    發(fā)布時間: 2007-05-27 05:34 版權申明

    字體: 小 中 大
    [點擊圖片可在新窗口打開]

    文章來源于http://www.lupaworld.com

    Linux之所以受到廣大計算機愛好者的喜愛,主要原因有兩個,首先它是自由軟件,用戶不用支付費用就可以使用它,并可根據(jù)自己的需要對它進行修改。另外,它具有Unix的全部功能,任何使用Unix系統(tǒng)或想要學習Unix系統(tǒng)的人都可以從中獲益。

    讓我們一起從每一個命令開始,走向Linux高手之路吧。

    1.Linux進入與退出系 閱讀全文
    類別:默認分類 查看評論
    文章來源:http://hi.baidu.com/whchensiyuan/blog/item/8a8b9ad58836ab07a08bb74e.html

    posted @ 2008-09-18 12:28 追風舞者 閱讀(146) | 評論 (0)編輯 收藏

    ubuntu中默認的是gnome桌面,也可以為你的程序設置快捷方式。

    可以以兩種方式生成快捷方式,這里叫做起動器:命令行方式和拖動程序圖標的方式。這里以Lumaqq為例說明之。

    1.在應用程序菜單中創(chuàng)建起動器:

    在命令行中輸入如下命令:

    sudo gedit /usr/share/applications/LumaQQ.desktop

    //sudo是以超級用戶權限執(zhí)行后面命令
    //gedit是打開文本編輯器,后面的路徑標識要編輯的文件
    //在/usr/share/applications目錄下可以看到許多*.desktop的文件,都是應用程序的起動器,所以上述 閱讀全文
    類別:默認分類 查看評論
    文章來源:http://hi.baidu.com/whchensiyuan/blog/item/df1445e695411c28b83820f4.html

    posted @ 2008-09-18 12:28 追風舞者 閱讀(119) | 評論 (0)編輯 收藏

    已經(jīng)有一些熱心人寫了Compiz Fusion的設置指南,但大多是在7.10版下面的,現(xiàn)在系統(tǒng)升級成8.04后,CompizConfig設置管理器的內(nèi)容有些不同,我等新手摸索了幾天,小有心得,奉獻給大家,寫得有點羅嗦,清見諒。

    點擊 系統(tǒng)->首選項->Advanced Desktop Effects Settings 打開CompizConfig設置管理器(即CCSM)

    1、3D桌面設置:點擊General options,把Desktop Size選項卡里的“Horizontal Virtual Size(水平虛擬大?。?rdquo;設置為4,“Vertical Virtual Size(垂直虛擬大?。?rdquo;設置為
    閱讀全文
    類別:默認分類 查看評論
    文章來源:http://hi.baidu.com/whchensiyuan/blog/item/43e981eef1e8fee9cf1b3e4a.html

    posted @ 2008-09-18 12:28 追風舞者 閱讀(230) | 評論 (0)編輯 收藏

    Linux之所以受到廣大計算機愛好者的喜愛,主要原因有兩個,首先它是自由軟件,用戶不用支付費用就可以使用它,并可根據(jù)自己的需要對它進行修改。另外,它具有Unix的全部功能,任何使用Unix系統(tǒng)或想要學習Unix系統(tǒng)的人都可以從中獲益。

    讓我們一起從每一個命令開始,走向Linux高手之路吧。

    1.Linux進入與退出系統(tǒng)
    進入Linux系統(tǒng):
    必須要輸入用戶的賬號,在系統(tǒng)安裝過程中可以創(chuàng)建以下兩種帳號:
    1.root--超級用戶帳號(系統(tǒng)管理員),使用這個帳號可以在系統(tǒng)中做任何事情。
    2.普通用戶--這個帳號供普通用戶使用,可以進行有限的操作。
    一般的Linux使用者均為普通用戶,而系統(tǒng)管理員一般使用超級用戶帳號完成一些系統(tǒng)管理的工作。如果只需要完成一些由普通帳號就能完成的任務,建議不要使用超級用戶帳號,以免無意中破壞系統(tǒng)。影響系統(tǒng)的正常運行。
    用戶登錄分兩步:第一步,輸入用戶的登錄名,系統(tǒng)根據(jù)該登錄名識別用戶;第二步,輸入用戶的口令,該口令是用戶自己設置的一個字符串,對其他用戶是保密的,是在登錄時系統(tǒng)用來辨別真假用戶的關鍵字。
    當用戶正確地輸入用戶名和口令后,就能合法地進入系統(tǒng)。屏幕顯示:
    [root@loclhost /root] #

    這時就可以對系統(tǒng)做各種操作了。注意超級用戶的提示符是“#”,其他用戶的提示符是“$”。

    修改口令
    為了更好的保護用戶帳號的安全,Linux允許用戶隨時修改自己的口令,修改口令的命令是passwd,它將提示用戶輸入舊口令和新口令,之后還要求用戶再次確認新口令,以避免用戶無意中按錯鍵。如果用戶忘記了口令,可以向系統(tǒng)管理員申請為自己重新設置一個。

    虛擬控制臺
    Linux是一個真正的多用戶操作系統(tǒng),它可以同時接受多個用戶登錄。Linux還允許一個用戶進行多次登錄,這是因為Linux和UNIX一樣,提供了 虛擬控制臺的訪問方式,允許用戶在同一時間從控制臺進行多次登錄。虛擬控制臺的選擇可以通過按下Alt鍵和一個功能鍵來實現(xiàn),通常使用F1-F6例如,用 戶登錄后,按一下Alt-F2鍵,用戶又可以看到"login:"提示符,說明用戶看到了第二個虛擬控制臺。然后只需按Alt-F1鍵,就可以回到第一個 虛擬控制臺。一個新安裝的Linux系統(tǒng)默認允許用戶使用Alt-F1到Alt-F6鍵來訪問前六個虛擬控制臺。虛擬控制臺可使用戶同時在多個控制臺上工 作,真正體現(xiàn) Linux系統(tǒng)多用戶的特性。用戶可以在某一虛擬控制臺上進行的工作尚未結束時,切換到另一虛擬控制臺開始另一項工作。
    退出系統(tǒng)
    不論是超級用戶,還是普通用戶,需要退出系統(tǒng)時,在shell提示符下,鍵入exit命令即可。

    Linux文件的復制、刪除和移動命令
    cp命令

    該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同MSDOS下的copy命令一樣,功能十分強大。
    語法: cp [選項] 源文件或目錄 目標文件或目錄
    說明:該命令把指定的源文件復制到目標文件或把多個源文件復制到目標目錄中。
    該命令的各選項含義如下:
    - a 該選項通常在拷貝目錄時使用。它保留鏈接、文件屬性,并遞歸地拷貝目錄,其作用等于dpR選項的組合。
    - d 拷貝時保留鏈接。
    - f 刪除已經(jīng)存在的目標文件而不提示。
    - i 和f選項相反,在覆蓋目標文件之前將給出提示要求用戶確認?;卮饄時目標文件將被覆蓋,是交互式拷貝。
    - p 此時cp除復制源文件的內(nèi)容外,還將把其修改時間和訪問權限也復制到新文件中。
    - r 若給出的源文件是一目錄文件,此時cp將遞歸復制該目錄下所有的子目錄和文件。此時目標文件必須為一個目錄名。
    - l 不作拷貝,只是鏈接文件。
    需要說明的是,為防止用戶在不經(jīng)意的情況下用cp命令破壞另一個文件,如用戶指定的目標文件名已存在,用cp命令拷貝文件后,這個文件就會被新源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時,最好使用i選項。

    mv命令

    用戶可以使用mv命令來為文件或目錄改名或?qū)⑽募梢粋€目錄移入另一個目錄中。該命令如同MSDOS下的ren和move的組合。
    語法:mv [選項] 源文件或目錄 目標文件或目錄
    說明:視mv命令中第二個參數(shù)類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或?qū)⑵湟浦烈粋€新的目錄中。當?shù)诙€參數(shù)類型是文件時,mv 命令完成文件重命名,此時,源文件只能有一個(也可以是源目錄名),它將所給的源文件或目錄重命名為給定的目標文件名。當?shù)诙€參數(shù)是已存在的目錄名稱 時,源文件或目錄參數(shù)可以有多個,mv命令將各參數(shù)指定的源文件均移至目標目錄中。在跨文件系統(tǒng)移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件 的鏈接也將丟失。
    命令中各選項的含義為:
    - I 交互方式操作。如果mv操作將導致對已存在的目標文件的覆蓋,此時系統(tǒng)詢問是否重寫,要求用戶回答y或n,這樣可以避免誤覆蓋文件。
    - f 禁止交互操作。在mv操作要覆蓋某已有的目標文件時不給任何指示,指定此選項后,i選項將不再起作用。
    如果所給目標文件(不是目錄)已存在,此時該文件的內(nèi)容將被新文件覆蓋。為防止用戶用mv命令破壞另一個文件,使用mv命令移動文件時,最好使用i選項。

    rm命令

    用戶可以用rm命令刪除不需要的文件。該命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文件及子目錄均刪除。對于鏈接文件,只是斷開了鏈接,原文件保持不變。
    rm命令的一般形式為:
    rm [選項] 文件…
    如果沒有使用- r選項,則rm不會刪除目錄。
    該命令的各選項含義如下:
    - f 忽略不存在的文件,從不給出提示。
    - r 指示rm將參數(shù)中列出的全部目錄和子目錄均遞歸地刪除。
    - i 進行交互式刪除。
    使用rm命令要小心。因為一旦文件被刪除,它是不能被恢復的。了防止這種情況的發(fā)生,可以使用i選項來逐個確認要刪除的文件。如果用戶輸入y,文件將被刪除。如果輸入任何其他東西,文件則不會刪除。

    Linux目錄的創(chuàng)建與刪除命令
    mkdir命令

    功能:創(chuàng)建一個目錄(類似MSDOS下的md命令)。
    語法:mkdir [選項] dir-name
    說明:該命令創(chuàng)建由dir-name命名的目錄。要求創(chuàng)建目錄的用戶在當前目錄中(dir-name的父目錄中)具有寫權限,并且dirname不能是當前目錄中已有的目錄或 文件名稱。
    命令中各選項的含義為:
    - m 對新建目錄設置存取權限。也可以用chmod命令設置。
    - p 可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在, 加上此選項后, 系統(tǒng)將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄。

    rmdir 命令

    功能:刪除空目錄。
    語法:rmdir [選項] dir-name
    說明:dir-name表示目錄名。該命令從一個目錄中刪除一個或多個子目錄項。需要 特別注意的是,一個目錄被刪除之前必須是空的。rm - r dir命令可代替 rmdir,但是有危險性。刪除某目錄時也必須具有對父目錄的寫權限。
    命令中各選項的含義為:
    - p 遞歸刪除目錄dirname,當子目錄刪除后其父目錄為空時,也一同被刪除。如果整個路徑被刪除或者由于某種原因保留部分路徑,則系統(tǒng)在標準輸出上顯示相應 的信息。

    cd 命令

    功能:改變工作目錄。
    語法:cd [directory]
    說明:該命令將當前目錄改變至directory所指定的目錄。若沒有指定directory, 則回到用戶的主目錄。為了改變到指定目錄,用戶必須擁有對指定目錄的執(zhí)行和讀 權限。
    該命令可以使用通配符(通配符含義請參見第十章)。

    pwd 命令

    在Linux層次目錄結構中,用戶可以在被授權的任意目錄下利用mkdir命令創(chuàng)建新目錄,也可以利用cd命令從一個目錄轉(zhuǎn)換到另一個目錄。然而,沒有提示符來告知用 戶目前處于哪一個目錄中。要想知道當前所處的目錄,可以使用pwd命令,該命令顯示整個路徑名。
    語法:pwd
    說明:此命令顯示出當前工作目錄的絕對路徑。

    ls 命令

    ls是英文單詞list的簡寫,其功能為列出目錄的內(nèi)容。這是用戶最常用的一個命令之一,因為用戶需要不時地查看某個目錄的內(nèi)容。該命令類似于DOS下的dir命令。
    語法:ls [選項] [目錄或是文件]
    對于每個目錄,該命令將列出其中的所有子目錄與文件。對于每個文件,ls將輸出 其文件名以及所要求的其他信息。默認情況下,輸出條目按字母順序排序。當未給出目錄名或是文件名時,就顯示當前目錄的信息。
    命令中各選項的含義如下:
    - a 顯示指定目錄下所有子目錄與文件,包括隱藏文件。
    - A 顯示指定目錄下所有子目錄與文件,包括隱藏文件。但不列出“.”和 “..”。
    - b 對文件名中的不可顯示字符用八進制逃逸字符顯示。
    - c 按文件的修改時間排序。
    - C 分成多列顯示各項。
    - d 如果參數(shù)是目錄,只顯示其名稱而不顯示其下的各文件。往往與l選項一起使 用,以得到目錄的詳細信息。
    - f 不排序。該選項將使lts選項失效,并使aU選項有效。
    - F 在目錄名后面標記“/”,可執(zhí)行文件后面標記“*”,符號鏈接后面標記 “@”,管道(或FIFO)后面標記“|”,socket文件后面標記“=”。
    - i 在輸出的第一列顯示文件的i節(jié)點號。
    - l 以長格式來顯示文件的詳細信息。這個選項最常用。
    每行列出的信息依次是: 文件類型與權限 鏈接數(shù) 文件屬主 文件屬組 文件大小 建立或最近修改的時間 名字
    對于符號鏈接文件,顯示的文件名之后有“—〉”和引用文件路徑名。
    對于設備文件,其“文件大小”字段顯示主、次設備號,而不是文件大小。
    目錄中的總塊數(shù)顯示在長格式列表的開頭,其中包含間接塊。
    - L 若指定的名稱為一個符號鏈接文件,則顯示鏈接所指向的文件。
    - m 輸出按字符流格式,文件跨頁顯示,以逗號分開。
    - n 輸出格式與l選項相同,只不過在輸出中文件屬主和屬組是用相應的UID號和 GID號來表示,而不是實際的名稱。
    - o 與l選項相同,只是不顯示擁有者信息。
    - p 在目錄后面加一個“/”。
    - q 將文件名中的不可顯示字符用“?”代替。
    - r 按字母逆序或最早優(yōu)先的順序顯示輸出結果。
    - R 遞歸式地顯示指定目錄的各個子目錄中的文件。
    - s 給出每個目錄項所用的塊數(shù),包括間接塊。
    - t 顯示時按修改時間(最近優(yōu)先)而不是按名字排序。若文件修改時間相同,則 按字典順序。修改時間取決于是否使用了c或u選頂。缺省的時間標記是最后一次修 改時間。
    - u 顯示時按文件上次存取的時間(最近優(yōu)先)而不是按名字排序。即將-t的時間 標記修改為最后一次訪問的時間。
    - x 按行顯示出各排序項的信息。
    用ls - l命令顯示的信息中,開頭是由10個字符構成的字符串,其中第一個字符表示文件類型,它可以是下述類型之一:
    - 普通文件
    d 目錄
    l 符號鏈接
    b 塊設備文件
    c 字符設備文件
    后面的9個字符表示文件的訪問權限,分為3組,每組3位。
    第一組表示文件屬主的權限,第二組表示同組用戶的權限,第三組表示其他用戶的權限。每一組的三個字 符分別表示對文件的讀、寫和執(zhí)行權限。
    各權限如下所示:
    r 讀
    w 寫
    x 執(zhí)行。對于目錄,表示進入權限。
    s 當文件被執(zhí)行時,把該文件的UID或GID賦予執(zhí)行進程的UID(用戶ID)或GID(組 ID)。
    t 設置標志位(留在內(nèi)存,不被換出)。如果該文件是目錄,在該目錄中的文件只能被超級用戶、目錄擁有者或文件屬主刪除。如果它是可執(zhí)行文件,在該文件執(zhí)行 后,指向其正文段的指針仍留在內(nèi)存。這樣再次執(zhí)行它時,系統(tǒng)就能更快地裝入該文件。

    Linux文本處理命令
    sort命令

    sort命令的功能是對文件中的各行進行排序。sort命令有許多非常實用的選項,這些選項最初是用來對數(shù)據(jù)庫格式的文件內(nèi)容進行各種排序操作的。實際上,sort命令可以被認為是一個非常強大的數(shù)據(jù)管理工具,用來管理內(nèi)容類似數(shù)據(jù)庫記錄的文件。
    Sort命令將逐行對文件中的內(nèi)容進行排序,如果兩行的首字符相同,該命令將繼續(xù)比較這兩行的下一字符,如果還相同,將繼續(xù)進行比較。
    語法:
    sort [選項] 文件
    說明:sort命令對指定文件中所有的行進行排序,并將結果顯示在標準輸出上。如不指定輸入文件或使用“- ”,則表示排序內(nèi)容來自標準輸入。
    sort排序是根據(jù)從輸入行抽取的一個或多個關鍵字進行比較來完成的。排序關鍵字定義了用來排序的最小的字符序列。缺省情況下以整行為關鍵字按ASCII字符順序進行排序。
    改變?nèi)笔≡O置的選項主要有:
    - m 若給定文件已排好序,合并文件。
    - c 檢查給定文件是否已排好序,如果它們沒有都排好序,則打印一個出錯信息,并以狀態(tài)值1退出。
    - u 對排序后認為相同的行只留其中一行。
    - o 輸出文件 將排序輸出寫到輸出文件中而不是標準輸出,如果輸出文件是輸入文件之一,sort先將該文件的內(nèi)容寫入一個臨時文件,然后再排序和寫輸出結果。
    改變?nèi)笔∨判蛞?guī)則的選項主要有:
    - d 按字典順序排序,比較時僅字母、數(shù)字、空格和制表符有意義。
    - f 將小寫字母與大寫字母同等對待。
    - I 忽略非打印字符。
    - M 作為月份比較:“JAN”<“FEB”
    - r 按逆序輸出排序結果。
    +posl - pos2 指定一個或幾個字段作為排序關鍵字,字段位置從posl開始,到pos2為止(包括posl,不包括pos2)。如不指定pos2,則關鍵字為從posl到行尾。字段和字符的位置從0開始。
    - b 在每行中尋找排序關鍵字時忽略前導的空白(空格和制表符)。
    - t separator 指定字符separator作為字段分隔符。

    uniq命令

    文件經(jīng)過處理后在它的輸出文件中可能會出現(xiàn)重復的行。例如,使用cat命令將兩個文件合并后,再使用sort命令進行排序,就可能出現(xiàn)重復行。這時可以使用uniq命令將這些重復行從輸出文件中刪除,只留下每條記錄的唯一樣本。
    語法:
    uniq [選項] 文件
    說明:這個命令讀取輸入文件,并比較相鄰的行。在正常情況下,第二個及以后更多個重復行將被刪去,行比較是根據(jù)所用字符集的排序序列進行的。該命令加工后的結果寫到輸出文件中。輸入文件和輸出文件必須不同。如果輸入文件用“- ”表示,則從標準輸入讀取。
    該命令各選項含義如下:
    - c 顯示輸出中,在每行行首加上本行在文件中出現(xiàn)的次數(shù)。它可取代- u和- d選項。
    - d 只顯示重復行。
    - u 只顯示文件中不重復的各行。
    - n 前n個字段與每個字段前的空白一起被忽略。一個字段是一個非空格、非制表符的字符串,彼此由制表符和空格隔開(字段從0開始編號)。
    +n 前n個字符被忽略,之前的字符被跳過(字符從0開始編號)。
    - f n 與- n相同,這里n是字段數(shù)。
    - s n 與+n相同,這里n是字符數(shù)。

    Linux備份與壓縮命令
    tar命令

    tar可以為文件和目錄創(chuàng)建檔案。利用tar,用戶可以為某一特定文件創(chuàng)建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。 tar最初被用來在磁帶上創(chuàng)建檔案,現(xiàn)在,用戶可以在任何設備上創(chuàng)建檔案,如軟盤。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這對于 備份文件或?qū)讉€文件組合成為一個文件以便于網(wǎng)絡傳輸是非常有用的。Linux上的tar是GNU版本的。
    語法:tar [主選項+輔選項] 文件或者目錄
    使用該命令時,主選項是必須要有的,它告訴tar要做什么事情,輔選項是輔助使用的,可以選用。
    主選項:
    c 創(chuàng)建新的檔案文件。如果用戶想備份一個目錄或是一些文件,就要選擇這個選項。
    r 把要存檔的文件追加到檔案文件的未尾。例如用戶已經(jīng)作好備份文件,又發(fā)現(xiàn)還有一個目錄或是一些文件忘記備份了,這時可以使用該選項,將忘記的目錄或文件追加到備份文件中。
    t 列出檔案文件的內(nèi)容,查看已經(jīng)備份了哪些文件。
    u 更新文件。就是說,用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最后。
    x 從檔案文件中釋放文件。
    輔助選項:
    b 該選項是為磁帶機設定的。其后跟一數(shù)字,用來說明區(qū)塊的大小,系統(tǒng)預設值為20(20*512 bytes)。
    f 使用檔案文件或設備,這個選項通常是必選的。
    k 保存已經(jīng)存在的文件。例如我們把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋。
    m 在還原文件時,把所有文件的修改時間設定為現(xiàn)在。
    M 創(chuàng)建多卷的檔案文件,以便在幾個磁盤中存放。
    v 詳細報告tar處理的文件信息。如無此選項,tar不報告文件信息。
    w 每一步都要求確認。
    z 用gzip來壓縮/解壓縮文件,加上該選項后可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮。

    gzip命令

    減少文件大小有兩個明顯的好處,一是可以減少存儲空間,二是通過網(wǎng)絡傳輸文件時,可以減少傳輸?shù)臅r間。gzip是在Linux系統(tǒng)中經(jīng)常使用的一個對文件進行壓縮和解壓縮的命令,既方便又好用。
    語法:gzip [選項] 壓縮(解壓縮)的文件名
    各選項的含義:
    -c 將輸出寫到標準輸出上,并保留原有文件。
    -d 將壓縮文件解壓。
    -l 對每個壓縮文件,顯示下列字段:
    壓縮文件的大小
    未壓縮文件的大小
    壓縮比
    未壓縮文件的名字
    -r 遞歸式地查找指定目錄并壓縮其中的所有文件或者是解壓縮。
    -t 測試,檢查壓縮文件是否完整。
    -v 對每一個壓縮和解壓的文件,顯示文件名和壓縮比。
    -num 用指定的數(shù)字num調(diào)整壓縮的速度,-1或--fast表示最快壓縮方法(低壓縮比),-9或--best表示最慢壓縮方法(高壓縮比)。系統(tǒng)缺省值為6。

    unzip命令

    用MS Windows下的壓縮軟件winzip壓縮的文件如何在Linux系統(tǒng)下展開呢?可以用unzip命令,該命令用于解擴展名為.zip的壓縮文件。
    語法:unzip [選項] 壓縮文件名.zip
    各選項的含義分別為:
    -x 文件列表 解壓縮文件,但不包括指定的file文件。
    -v 查看壓縮文件目錄,但不解壓。
    -t 測試文件有無損壞,但不解壓。
    -d 目錄 把壓縮文件解到指定目錄下。
    -z 只顯示壓縮文件的注解。
    -n 不覆蓋已經(jīng)存在的文件。
    -o 覆蓋已存在的文件且不要求用戶確認。
    -j 不重建文檔的目錄結構,把所有文件解壓到同一目錄下。

    在Linux環(huán)境下運行DOS命令   
    Linux系統(tǒng)提供了一組稱為mtools的可移植工具,可以讓用戶輕松地從標準的DOS軟盤上讀、寫文件和目錄。它們對DOS和Linux環(huán)境之間交換 文件非常有用。它們是不具備共同的文件系統(tǒng)格式的系統(tǒng)之間交換文件的有力手段。對于一個MSDOS的軟盤,只要把軟盤放在軟驅(qū)中,就可以利用 mtools提供的命令來訪問軟盤上的文件。
    mtools的主要命令如下:
    mcd 目錄名 改變MSDOS目錄;
    mcopy 源文件 目標文件 在MSDOS和Unix之間復制文件;
    mdel 文件名 刪除MSDOS文件;
    mdir 目錄名 顯示MSDOS目錄;
    mformat 驅(qū)動器號 在低級格式化的軟盤上創(chuàng)建MSDOS文件系統(tǒng);
    rnlabel 驅(qū)動器號 產(chǎn)生MSDOS卷標;
    mmd 目錄名 建立MSDOS目錄;
    mrd 目錄名 刪除MSDOS目錄;
    mren 源文件 目標文件 重新命名已存在的MSDOS文件;
    mtype 文件名 顯示MSDOS文件的內(nèi)容。
    提示:這些命令和對應的MSDOS命令非常相似。

    Linux改變文件或目錄的訪問權限命令
    Linux系統(tǒng)中的每個文件和目錄都有訪問許可權限,用它來確定誰可以通過何種方式對文件和目錄進行訪問和操作。
    文件或目錄的訪問權限分為只讀,只寫和可執(zhí)行三種。以文件為例,只讀權限表示只允許讀其內(nèi)容,而禁止對其做任何的更改操作??蓤?zhí)行權限表示允許將該文件作 為一個程序執(zhí)行。文件被創(chuàng)建時,文件所有者自動擁有對該文件的讀、寫和可執(zhí)行權限,以便于對文件的閱讀和修改。用戶也可根據(jù)需要把訪問權限設置為需要的任 何組合。
    有三種不同類型的用戶可對文件或目錄進行訪問:文件所有者,同組用戶、其他用戶。所有者一般是文件的創(chuàng)建者。所有者可以允許同組用戶有權訪問文件,還可以將文件的訪問權限賦予系統(tǒng)中的其他用戶。在這種情況下,系統(tǒng)中每一位用戶都能訪問該用戶擁有的文件或目錄。
    每一文件或目錄的訪問權限都有三組,每組用三位表示,分別為文件屬主的讀、寫和執(zhí)行權限;與屬主同組的用戶的讀、寫和執(zhí)行權限;系統(tǒng)中其他用戶的讀、寫和執(zhí)行權限。當用ls -l命令顯示文件或目錄的詳細信息時,最左邊的一列為文件的訪問權限。例如:
    $ ls -l sobsrc. tgz
    -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz
    橫線代表空許可。r代表只讀,w代表寫,x代表可執(zhí)行。注意這里共有10個位置。第一個字符指定了文件類型。在通常意義上,一個目錄也是一個文件。如果第一個字符是橫線,表示是一個非目錄的文件。如果是d,表示是一個目錄。
    例如:

    - rw- r-- r--
    普通文件 文件主 組用戶 其他用戶
    是文件sobsrc.tgz 的訪問權限,表示sobsrc.tgz是一個普通文件;sobsrc.tgz的屬主有讀寫權限;與sobsrc.tgz屬主同組的用戶只有讀權限;其他用戶也只有讀權限。
    確定了一個文件的訪問權限后,用戶可以利用Linux系統(tǒng)提供的chmod命令來重新設定不同的訪問權限。也可以利用chown命令來更改某個文件或目錄的所有者。利用chgrp命令來更改某個文件或目錄的用戶組。
    下面分別對這些命令加以介紹。

    chmod 命令

    chmod命令是非常重要的,用于改變文件或目錄的訪問權限。用戶用它控制文件或目錄的訪問權限。
    該命令有兩種用法。一種是包含字母和操作符表達式的文字設定法;另一種是包含數(shù)字的數(shù)字設定法。

    1. 文字設定法
    chmod [who] [+ | - | =] [mode] 文件名?
    命令中各選項的含義為:
    操作對象who可是下述字母中的任一個或者它們的組合:
    u 表示“用戶(user)”,即文件或目錄的所有者。
    g 表示“同組(group)用戶”,即與文件屬主有相同組ID的所有用戶。
    o 表示“其他(others)用戶”。
    a 表示“所有(all)用戶”。它是系統(tǒng)默認值。
    操作符號可以是:
    + 添加某個權限。
    - 取消某個權限。
    = 賦予給定權限并取消其他所有權限(如果有的話)。
    設置mode所表示的權限可用下述字母的任意組合:
    r 可讀。
    w 可寫。
    x 可執(zhí)行。
    X 只有目標文件對某些用戶是可執(zhí)行的或該目標文件是目錄時才追加x 屬性。
    s 在文件執(zhí)行時把進程的屬主或組ID置為該文件的文件屬主。方式“u+s”設置文件的用戶ID位,“g+s”設置組ID位。
    t 保存程序的文本到交換設備上。
    u 與文件屬主擁有一樣的權限。
    g 與和文件屬主同組的用戶擁有一樣的權限。
    o 與其他用戶擁有一樣的權限。
    文件名:以空格分開的要改變權限的文件列表,支持通配符。
    在一個命令行中可給出多個權限方式,其間用逗號隔開。例如:chmod g+r,o+r example
    使同組和其他用戶對文件example 有讀權限。

    2. 數(shù)字設定法
    我們必須首先了解用數(shù)字表示的屬性的含義:0表示沒有權限,1表示可執(zhí)行權限,2表示可寫權限,4表示可讀權限,然后將其相加。所以數(shù)字屬性的格式應為3個從0到7的八進制數(shù),其順序是(u)(g)(o)。
    例如,如果想讓某個文件的屬主有“讀/寫”二種權限,需要把4(可讀)+2(可寫)=6(讀/寫)。
    數(shù)字設定法的一般形式為:
    chmod [mode] 文件名?

    chgrp命令

    功能:改變文件或目錄所屬的組。
    語法:chgrp [選項] group filename?
    該命令改變指定指定文件所屬的用戶組。其中group可以是用戶組ID,也可以是/etc/group文件中用戶組的組名。文件名是以空格分開的要改變屬組的文件列表,支持通配符。如果用戶不是該文件的屬主或超級用戶,則不能改變該文件的組。
    該命令的各選項含義為:
    - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的屬組。

    chown 命令

    功能:更改某個文件或目錄的屬主和屬組。這個命令也很常用。例如root用戶把自己的一個文件拷貝給用戶xu,為了讓用戶xu能夠存取這個文件,root用戶應該把這個文件的屬主設為xu,否則,用戶xu無法存取這個文件。
    語法:chown [選項] 用戶或組 文件
    說明:chown將指定文件的擁有者改為指定的用戶或組。用戶可以是用戶名或用戶ID。組可以是組名或組ID。文件是以空格分開的要改變權限的文件列表,支持通配符。
    該命令的各選項含義如下:
    - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的擁有者。
    - v 顯示chown命令所做的工作。
    Linux與用戶有關的命令

    passwd命令

    出于系統(tǒng)安全考慮,Linux系統(tǒng)中的每一個用戶除了有其用戶名外,還有其對應的用戶口令。因此使用useradd命令增加時,還需使用passwd命令為每一位新增加的用戶設置口令;用戶以后還可以隨時用passwd命令改變自己的口令。
    該命令的一般格式為: passwd [用戶名] 其中用戶名為需要修改口令的用戶名。只有超級用戶可以使用“passwd 用戶名”修改其他用戶的口令,普通用戶只能用不帶參數(shù)的passwd命令修改自己的口令。
    該命令的使用方法如下:
    輸入
    passwd< Enter>;
    在(current) UNIX passwd:下輸入當前的口令
    在new password:提示下輸入新的口令(在屏幕上看不到這個口令):
    系統(tǒng)提示再次輸入這個新口令。
    輸入正確后,這個新口令被加密并放入/etc/shdow文件。選取一個不易被破譯的口令是很重要的。
    選取口令應遵守如下規(guī)則:
    口令應該至少有六位(最好是八位)字符;
    口令應該是大小寫字母、標點符號和數(shù)字混雜的。
    超級用戶修改其他用戶(xxq)的口令的過程如下,
    # passwd root
    New UNIX password:
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully
    #

    su命令

    這個命令非常重要。它可以讓一個普通用戶擁有超級用戶或其他用戶的權限,也可以讓超級用戶以普通用戶的身份做一些事情。普通用戶使用這個命令時必須有超級用戶或其他用戶的口令。如要離開當前用戶的身份,可以打exit。
    該命令的一般形式為: su [選項] [? ] [使用者帳號]
    說明:若沒有指定使用者帳號,則系統(tǒng)預設值為超級用戶root。 該命令中各選項的含義分別為:
    ? c 執(zhí)行一個命令后就結束。
    ? 加了這個減號的目的是使環(huán)境變量和欲轉(zhuǎn)換的用戶相同。
    ? m 保留環(huán)境變量不變。
    password: 【輸入超級用戶的密碼】  
    Linux系統(tǒng)管理命令

    wall命令

    這個命令的功能是對全部已登錄的用戶發(fā)送信息,用戶可以先把要發(fā)送的信息寫好存入一個文件中,然后輸入:
    # wall < 文件名
    這樣就能對所有的用戶發(fā)送信息了。
    在上面的例子中符號“<”表示輸入重定向,有關它的含義和用法請參閱第十章的有關內(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)中某一個用戶發(fā)送信息。 該命令的一般格式為:
    write 用戶帳號 [終端名稱]
    例如: $ write Guest hello
    此時系統(tǒng)進入發(fā)送信息狀態(tài),用戶可以輸入要發(fā)送的信息,輸入完畢,希望退出發(fā)送狀態(tài)時,按組合鍵< Ctrl+c>即可。

    mesg指令

    mesg命令設定是否允許其他用戶用write命令給自己發(fā)送信息。如果允許別人給自己發(fā)送信息,輸入命令:
    # mesg y
    否則,輸入:
    # mesg n
    對于超級用戶,系統(tǒng)的默認值為 n;而對于一般用戶系統(tǒng)的默認值為y。 如果mesg后不帶任何參數(shù),則顯示當前的狀態(tài)是y還是n.。

    sync命令

    sync命令是在關閉Linux系統(tǒng)時使用的。用戶需要注意的是,不能用簡單的關閉電源的方法關閉系統(tǒng),因為Linux象其他Unix系統(tǒng)一樣,在內(nèi)存中 緩存了許多數(shù)據(jù),在關閉系統(tǒng)時需要進行內(nèi)存數(shù)據(jù)與硬盤數(shù)據(jù)的同步校驗,保證硬盤數(shù)據(jù)在關閉系統(tǒng)時是最新的,只有這樣才能確保數(shù)據(jù)不會丟失。一般正常的關閉 系統(tǒng)的過程是自動進行這些工作的,在系統(tǒng)運行過程中也會定時做這些工作,不需要用戶干預。 sync命令是強制把內(nèi)存中的數(shù)據(jù)寫回硬盤,以免數(shù)據(jù)的丟失。用戶可以在需要的時候使用此命令。該命令的一般格式為:
    sync

    shutdown命令

    shutdown 命令可以安全地關閉或重啟Linux系統(tǒng),它在系統(tǒng)關閉之前給系統(tǒng)上的所有登錄用戶提示一條警告信息。該命令還允許用戶指定一個時間參數(shù),可以是一個精確 的時間,也可以是從現(xiàn)在開始的一個時間段。精確時間的格式是hh:mm,表示小時和分鐘;時間段由“+”和分鐘數(shù)表示。系統(tǒng)執(zhí)行該命令后,會自動進行數(shù)據(jù) 同步的工作。
    該命令的一般格式為: shutdown [選項] [時間] [警告信息] 命令中各選項的含義為:
    - k 并不真正關機,而只是發(fā)出警告信息給所有用戶。
    - r 關機后立即重新啟動。
    - h 關機后不重新啟動。
    - f 快速關機,重啟動時跳過fsck。
    - n 快速關機,不經(jīng)過init程序。
    - c 取消一個已經(jīng)運行的shutdown。
    需要特別說明的是,該命令只能由超級用戶使用。

    free命令

    free命令的功能是查看當前系統(tǒng)內(nèi)存的使用情況,它顯示系統(tǒng)中剩余及已用的物理內(nèi)存和交換內(nèi)存,以及共享內(nèi)存和被核心使用的緩沖區(qū)。
    該命令的一般格式為: free [-b | -k | -m] 命令中各選項的含義如下:
    -b 以字節(jié)為單位顯示。
    -k 以K字節(jié)為單位顯示。
    -m 以兆字節(jié)為單位顯示。

    uptime命令

    uptime命令顯示系統(tǒng)已經(jīng)運行了多長時間,它依次顯示下列信息:現(xiàn)在時間、系統(tǒng)已經(jīng)運行了多長時間、目前有多少登錄用戶、系統(tǒng)在過去的1分鐘、5分鐘和15分鐘內(nèi)的平均負載。
    該命令的一般格式為: uptime

    Linux磁盤管理
    df命令

    功能:檢查文件系統(tǒng)的磁盤空間占用情況。可以利用該命令來獲取硬盤被占用了多少空間,目前還剩下多少空間等信息。
    語法:df [選項]
    說明:df命令可顯示所有文件系統(tǒng)對i節(jié)點和磁盤塊的使用情況。
    該命令各個選項的含義如下:
    -a 顯示所有文件系統(tǒng)的磁盤使用情況,包括0塊(block)的文件系統(tǒng),如/proc文件系統(tǒng)。
    -k 以k字節(jié)為單位顯示。
    -i 顯示i節(jié)點信息,而不是磁盤塊。
    -t 顯示各指定類型的文件系統(tǒng)的磁盤空間使用情況。
    -x 列出不是某一指定類型文件系統(tǒng)的磁盤空間使用情況(與t選項相反)。
    -T 顯示文件系統(tǒng)類型。

    du命令

    du的英文原義為“disk usage”,含義為顯示磁盤空間的使用情況。
    功能:統(tǒng)計目錄(或文件)所占磁盤空間的大小。
    語法:du [選項] [Names…]
    說明:該命令逐級進入指定目錄的每一個子目錄并顯示該目錄占用文件系統(tǒng)數(shù)據(jù)塊(1024字節(jié))的情況。若沒有給出Names,則對當前目錄進行統(tǒng)計。
    該命令的各個選項含義如下:
    -s 對每個Names參數(shù)只給出占用的數(shù)據(jù)塊總數(shù)。
    -a 遞歸地顯示指定目錄中各文件及子孫目錄中各文件占用的數(shù)據(jù)塊數(shù)。若既不指定-s,也不指定-a,則只顯示Names中的每一個目錄及其中的各子目錄所占的磁盤塊數(shù)。
    -b 以字節(jié)為單位列出磁盤空間使用情況(系統(tǒng)缺省以k字節(jié)為單位)。
    -k 以1024字節(jié)為單位列出磁盤空間使用情況。
    -c 最后再加上一個總計(系統(tǒng)缺省設置)。
    -l 計算所有的文件大小,對硬鏈接文件,則計算多次。
    -x 跳過在不同文件系統(tǒng)上的目錄不予統(tǒng)計。

    dd命令

    功能:把指定的輸入文件拷貝到指定的輸出文件中,并且在拷貝過程中可以進行格式轉(zhuǎn)換??梢杂迷撁顚崿F(xiàn)DOS下的diskcopy命令的作用。先用dd 命令把軟盤上的數(shù)據(jù)寫成硬盤的一個寄存文件,再把這個寄存文件寫入第二張軟盤上,完成diskcopy的功能。需要注意的是,應該將硬盤上的寄存文件用 rm命令刪除掉。系統(tǒng)默認使用標準輸入文件和標準輸出文件。
    語法:dd [選項]
    if =輸入文件(或設備名稱)。
    of =輸出文件(或設備名稱)。
    ibs = bytes 一次讀取bytes字節(jié),即讀入緩沖區(qū)的字節(jié)數(shù)。
    skip = blocks 跳過讀入緩沖區(qū)開頭的ibs*blocks塊。
    obs = bytes 一次寫入bytes字節(jié),即寫入緩沖區(qū)的字節(jié)數(shù)。
    bs = bytes 同時設置讀/寫緩沖區(qū)的字節(jié)數(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 把變動位轉(zhuǎn)換成固定字符。
    conv = ublock 把固定位轉(zhuǎn)換成變動位。
    conv = ucase 把字母由小寫轉(zhuǎn)換為大寫。
    conv = lcase 把字母由大寫轉(zhuǎn)換為小寫。
    conv = notrunc 不截短輸出文件。
    conv = swab 交換每一對輸入字節(jié)。
    conv = noerror 出錯時不停止處理。
    conv = sync 把每個輸入記錄的大小都調(diào)到ibs的大?。ㄓ肗UL填充)。

    fdformat 命令

    軟盤是用戶常用的存儲介質(zhì)之一。軟盤在使用之前必須先作格式化操作,然后可以用tar、dd、cpio等命令存儲數(shù)據(jù),也可以在軟盤上建立可安裝的文件系統(tǒng)。
    功能:低級格式化軟盤
    語法:format [-n] device
    說明:該命令的作用是對軟盤進行格式化。
    -n 軟盤格式化后不作檢驗。
    device 指定要進行格式化的設備,通常是下述設備之一:
    /dev/fd0d360
    /dev/fd0h1200
    /dev/fd0D360
    /dev/fd0H360
    /dev/fd0D720
    /dev/fd0H720
    /dev/fd0h360
    /dev/fd0h720
    /dev/fd0H1440

    Linux其它命令
    echo命令

    echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用。
    該命令的一般格式為: echo [ -n ] 字符串
    其中選項n表示輸出文字后不換行;字符串可以加引號,也可以不加引號。用echo命令輸出加引號的字符串時,將字符串原樣輸出;用echo命令輸出不加引號的字符串時,將字符串中的各個單詞作為字符串輸出,各字符串之間用一個空格分割。

    cal命令

    cal命令的功能是顯示某年某月的日歷。
    該命令的一般格式為: cal [選項] [月 [年]] 命令中各選項的含義為:
    - j 顯示出給定月中的每一天是一年中的第幾天(從1月1日算起)。
    - y 顯示出整年的日歷。

    date命令

    date命令的功能是顯示和設置系統(tǒng)日期和時間。
    該命令的一般格式為: date [選項] 顯示時間格式(以+開頭,后面接格式)
    date 設置時間格式
    命令中各選項的含義分別為:
    -d datestr, --date datestr 顯示由datestr描述的日期
    -s datestr, --set datestr 設置datestr 描述的日期
    -u, --universal 顯示或設置通用時間
    時間域
    % H 小時(00..23)
    % I 小時(01..12)
    % k 小時(0..23)
    % l 小時(1..12)
    % M 分(00..59)
    % p 顯示出AM或PM
    % r 時間(hh:mm:ss AM或PM),12小時
    % s 從1970年1月1日00:00:00到目前經(jīng)歷的秒數(shù)
    % S 秒(00..59)
    % T 時間(24小時制)(hh:mm:ss)
    % X 顯示時間的格式(%H:%M:%S)
    % Z 時區(qū) 日期域
    % a 星期幾的簡稱( Sun..Sat)
    % A 星期幾的全稱( Sunday..Saturday)
    % b 月的簡稱(Jan..Dec)
    % B 月的全稱(January..December)
    % c 日期和時間( Mon Nov 8 14:12:46 CST 1999)
    % d 一個月的第幾天(01..31)
    % D 日期(mm/dd/yy)
    % h 和%b選項相同
    % j 一年的第幾天(001..366)
    % m 月(01..12)
    % w 一個星期的第幾天(0代表星期天)
    % W 一年的第幾個星期(00..53,星期一為第一天)
    % x 顯示日期的格式(mm/dd/yy)
    % y 年的最后兩個數(shù)字( 1999則是99)
    % Y 年(例如:1970,1996等)
    注意:只有超級用戶才有權限使用date命令設置時間,一般用戶只能使用date命令顯示時間。

    clear命令

    clear命令的功能是清除屏幕上的信息,它類似于DOS中的 cls命令。清屏后,提示符移動到屏幕左上角。
    文章來源于http://www.lupaworld.com

    posted @ 2008-09-18 12:15 追風舞者 閱讀(377) | 評論 (0)編輯 收藏

    ubuntu中默認的是gnome桌面,也可以為你的程序設置快捷方式。

    可以以兩種方式生成快捷方式,這里叫做起動器:命令行方式和拖動程序圖標的方式。這里以Lumaqq為例說明之。

    1.在應用程序菜單中創(chuàng)建起動器:

    在命令行中輸入如下命令:

    sudo gedit /usr/share/applications/LumaQQ.desktop

    //sudo是以超級用戶權限執(zhí)行后面命令
    //gedit是打開文本編輯器,后面的路徑標識要編輯的文件
    //在/usr/share/applications目錄下可以看到許多*.desktop的文件,都是應用程序的起動器,所以上述命令是為LunaQQ創(chuàng)建一個起動器配置文件。

    在打開的窗口中輸入如下內(nèi)容:

    [Desktop Entry]
    Name=LumaQQ
    Comment=QQ Client
    Exec=/opt/LumaQQ/lumaqq//這里的路徑應該是你的LunaQQ程序的安裝路徑
    Icon=/opt/LumaQQ/QQ.png//同上
    Terminal=false
    Type=Application
    Categories=Application;Network;//這里的內(nèi)容決定創(chuàng)建出的起動器在應用程序菜單中的位置,按照上面的寫法創(chuàng)建的起動器將出現(xiàn)在應用程序-Internet中,以此類推,如果想在應用程序-辦公中創(chuàng)建起動器,上述最后一行應該寫成:

    Categories=Application;Office;

    2.在頂部面板中創(chuàng)建起動器(類似windows中的快速啟動):

    可以把任意位置的程序圖標拖拽到窗口最頂端的頂部面板(Top Panel)上中間的位置,兩個起動器分別是命令行終端和LumaQQ的,分別是從應用程序菜單和文件管理器中拖拽到當前位置的,在這個頂部面板中還可以 添加許多給定的起動器,方法是在頂部面板中右鍵單擊選擇添加到面板,可以看到許多內(nèi)容。

    3.在桌面創(chuàng)建起動器

    方法同2類似,只需簡單拖拽即可。(LumaQQ在桌面上的大圖標好可愛?。?

    posted @ 2008-09-18 12:13 追風舞者 閱讀(1912) | 評論 (0)編輯 收藏

    Evolution是ubuntu,fedora等發(fā)行版本自帶的一個郵件管理軟件,可以幫助你方便的管理和收發(fā)郵件,其設置步驟如下:
     
    1.確認你的gmail的POP已經(jīng)打開: 登錄gmail-settings-forwarding and POP, 確認“Enable POP for all mail”被選上
    2.打開Application→Internet→Evolution Mail
    3.添加用戶,如果已經(jīng)創(chuàng)建了gmail用戶,直接點擊edit。
    4. 在Receive mail選項,
    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

    有些文檔或許會提到995,465等端口號,根據(jù)我設置的實驗來看不設置端口號也可以。

    posted @ 2008-09-18 10:29 追風舞者 閱讀(444) | 評論 (0)編輯 收藏

    一、rpm包安裝方式步驟:


    1、找到相應的軟件包,比如soft.version.rpm,下載到本機某個目錄;

    2、打開一個終端,su -成root用戶;

    3、cd soft.version.rpm所在的目錄;

    4、輸入rpm -ivh soft.version.rpm


    二、deb包安裝方式步驟:


    1、找到相應的軟件包,比如soft.version.deb,下載到本機某個目錄;

    2、打開一個終端,su -成root用戶;

    3、cd soft.version.deb所在的目錄;

    4、輸入dpkg -i soft.version.deb


    三、tar.gz源代碼包安裝方式:


    1、找到相應的軟件包,比如soft.tar.gz,下載到本機某個目錄;

    2、打開一個終端,su -成root用戶;

    3、cd soft.tar.gz所在的目錄;

    4、tar -xvzf soft.tar.gz //一般會生成一個soft目錄

    5、cd soft

    6、./configure

    7、make

    8、make install


    四、tar.bz2源代碼包安裝方式:

    1、找到相應的軟件包,比如soft.tar.bz2,下載到本機某個目錄;

    2、打開一個終端,su -成root用戶;

    3、cd soft.tar.bz2所在的目錄;

    4、tar -xjvf soft.tar.bz2 //一般會生成一個soft目錄

    5、cd soft

    6、./configure

    7、make

    8、make install


    五、apt方式安裝:


    1、打開一個終端,su -成root用戶;

    2、apt-cache search soft 注:soft是你要找的軟件的名稱或相關信息

    3、如果2中找到了軟件soft.version,則用apt-get install soft.version命令安

    裝軟件 注:只要你可以上網(wǎng),只需要用apt-cache search查找軟件,用apt-get

    install軟件


    六、bin文件安裝:


    如果你下載到的軟件名是soft.bin,一般情況下是個可執(zhí)行文件,安裝方法如下:

    1、打開一個終端,su -成root用戶;

    2、chmod +x soft.bin

    3、./soft.bin //運行這個命令就可以安裝軟件了


    七、不需要安裝的軟件:


    有了些軟件,比如lumaqq,是不需要安裝的,自帶jre解壓縮后可直接運行。假設

    下載的是lumaqq.tar.gz,使用方法如下:

    1、打開一個終端,su -成root用戶;

    2、tar -xzvf lumaqq.tar.gz //這一步會生成一個叫LumaQQ的目錄

    3、cd LumaQQ

    4、chmod +x lumaqq //設置lumaqq這個程序文件為可運行

    5、此時就可以運行l(wèi)umaqq了,用命令./lumaqq即可,但每次運行要輸入全路徑或

    切換到剛才生成的LumaQQ目錄里

    6、為了保證不設置路徑就可以用,你可以在/bin目錄下建立一個lumaqq的鏈接,

    用命令ln -s lumaqq /bin/ 即可,以后任何時候打開一個終端輸入lumaqq就可以

    啟動QQ聊天軟件了

    7、如果你要想lumaqq有個菜單項,使用菜單編輯工具,比如Alacarte Menu

    Editor,找到上面生成的LumaQQ目錄里的lumaqq設置一個菜單項就可以了,當然你

    也可以直接到 /usr/share/applications目錄,按照里面其它*.desktop文件的格

    式生成一個自己的desktop文件即可。

    posted @ 2008-09-16 11:24 追風舞者 閱讀(137) | 評論 (0)編輯 收藏

    一.配置

    1framework下的entity里的config里面打開entityengine.xml文件,在此文件里找有四行都是以<delegator name開頭的,請將里面的datasource-name="localderby"都改為datasource-name="localmysql"

    2在此文件里找到〈datasource-name="localmysql"開頭的代碼區(qū)域,將里面的jdbc-username= jdbc-password= 都改為你安裝mysql時的用戶名和密碼。

    3我們要在entity下的lib下的jdbc中導入mysql5.0的驅(qū)動,同時加入xapool.jar

        4)mysql中建ofbiz數(shù)據(jù)庫,否則在下面部署工程中報錯

        二.部署

        1) 在命令行下運行 ant run-install

            (前提:在環(huán)境變量中添加 ant\bin)

    2) 運行 startofbiz.bat

     

    三. 工程端口號的修改

      修改framework/base/config/ofbiz-containers.xml

    1)  修改ofbiz端口號

        <property name="http-connector" value="connector">

                <property name="port" value="8080"/>

          </property>

     

      2)修改項目鏈接的端口號

    <property name="https-connector" value="connector">

              <property name="port" value="8443"/>

     </property>

     

    四.運行

     在瀏覽器中輸入地址 http://localhost:8080

     



    posted @ 2008-09-11 11:44 追風舞者 閱讀(2138) | 評論 (0)編輯 收藏

    1.實體引擎核心應用類(客戶端API)
    涉及到12 個類:GenericDelegator,GenericValue,GenericPK,EntityCondition,
    EntityExpr,EntityFieldMap,EntityConditionList,EntityWhereString,EntityOperator,
    EntityListIterator,這些類都是為GenericDelegator 的接口服務的。用
    戶端程序和數(shù)據(jù)庫之間的所有交往多是通過“GenericDelegator”完成的。

    2.服務引擎應用類(服務器端API)
    涉及LocalDispatcher, GenericDispatcher; ServiceDispatcher;ServiceUtil;
    DispatchContext ;ServiceConfigUtil 等6 個類。

    3.常用工具類
    工具類主要在包org.ofbiz.core.util 中。
    1、 屬性文件訪問工具類:UtilProperties。
    2、 Map、List 對象操作工具類:UtilMisc。
    3、 UtilFormatOut :通用格式化輸出工具類(主要用在 Jsp 文件或View Helper 中)。
    4、 UtilURL:得到文件流的URL 地址類。
    5、 UtilCache:緩存管理類。
    6、 UtilValidate:通用數(shù)據(jù)輸入輸出數(shù)據(jù)校驗(合法性和有效性)類,可任意擴展。.
    7、 UtilDateTime:java.util.Date 和java.sql.Date 格式的日期/時間處理類。
    8、 StringUtil:增強的字符串處理類。
    9、 UtilXML:增強的符合JAXP & DOM 規(guī)范的XMl 解析器處理工具類。
    10、 SiteDefs:常數(shù)定義類,定義所有Web 程序用到的和環(huán)境有關的常量。
    11、 Debug:格式化輸出程序調(diào)試信息類。
    12、 HttpClient:模擬一個HttpServlet 請求類。
    13、 HttpRequestFileUpload:接受一個通過Http 上傳的文件工具類。
    14、 SendMailSMTP:符合SMTP 協(xié)議的郵件發(fā)送處理類(實現(xiàn)發(fā)送郵件服務器的功能)。

    posted @ 2008-09-10 16:33 追風舞者 閱讀(144) | 評論 (0)編輯 收藏

    1. entitymodle.xml中的字段類型參見 opentaps-1.0\framework\entity\fieldtype
         比較常見的字段類型定義如下:
             <field-type-def type="id-ne" sql-type="VARCHAR(20)" java-type="String">
                        <validate method="isNotEmpty" />
            </field-type-def>
             <field-type-def type="id" sql-type="VARCHAR(20)" java-type="String"></field-type-def>
             <field-type-def type="comment" sql-type="VARCHAR(255)" java-type="String"></field-type-def>
            <field-type-def type="description" sql-type="VARCHAR(255)" java-type="String"></field-type-def>
            <field-type-def type="name" sql-type="VARCHAR(100)" java-type="String"></field-type-def>
            <field-type-def type="value" sql-type="VARCHAR(255)" java-type="String"></field-type-def>

    entity

    Attribute Name Required? Description
    entity-name Y The name of the entity as it is referred to when using the Entity Engine Java API and various other places in the Entity Engine.
    table-name N The name of the database table that corresponds to this entity. This attribute is optional and if not specified the table name will be derived from the entity name.
    package-name Y The name of the package that this entity is contained in. With hundreds of entities in a large data model this is used to organize and structure the entities definitions.
    dependent-on N This can be used to specify a parent entity or an entity that this entity is dependent on. This is currently not used for anything automated in the Entity Engine, but can be used to specify an heirarchical entity structure.
    enable-lock N Specifies whether or not optimistic locking should be used for this entity. The lastUpdatedStamp field must exist on the entity and will be used to keep track of the last time the entity instance was updated. If the current instance to be updated does not have a matching lastUpdatedStamp an EntityLockedException will be thrown. Must be true or false. Defaults to false.
    never-cache N If this is set to true caching of this entity will not be allowed. Automatic cache clearing will not be done to improve efficiency and any attempt to use the cache methods on the entity will result in an exception so that it is easier to find and eliminate where this is being done. Must be true or false. Defaults to false.
    title N A title for the entity. If not specified defaults to the global setting for the file the entity is in.
    copyright N The copyright of the entity. If not specified defaults to the global setting for the file the entity is in.
    author N The author of the entity. If not specified defaults to the global setting for the file the entity is in.
    version N The version of the entity. If not specified defaults to the global setting for the file the entity is in.
    Sub-Element Name How Many Description
    description 0 or 1 A description of the entity. If not specified defaults to the global setting for the file the entity is in. This element has no attributes and should contain only a simple string of characters.
    field 1 to many Used to declare fields that are part of the entity.
    prim-key 0 to many Used to declare which fields are primary keys
    relation 0 to many Used to declare relationships between entities.

    field

    Attribute Name Required? Description
    name Y The name of the field that is used to refer to it in Java code and other places.
    col-name N The name of the corresponding database column. This is not required and if not specified this will be derived from the field name.
    type Y The type of the field. This is looked up in the field types file for the current datasource at run-time to determine the Java and SQL types for the field and database column.

    Sub-Element Name How Many Description
    validate 0 to many Each validate element has a single attribute called name which specifies the name of the validation method to call. These methods are not called in all Entity Engine operations and are only used for generic user interfaces like the Entity Data Maintenance pages in WebTools.

    prim-key

    Attribute Name Required? Description
    field Y The name of the field that will be part of the primary key.

    relation

    Attribute Name Required? Description
    type Y Specifies the type of the relationship including the cardinality of the relationship (in one direction) and if a foreign key should be created for cardinality one relationships. Must be "one", "one-nofk", or "many".
    title N Because you may want to have more than one relationship to a single entity this attribute allows you to specify a title that will be prepended to the rel-entity-name to make up the name of the relationship. If not specified the rel-entity-name alone will be used as the relationship name.
    rel-entity-name Y The name of the related entity. The relationship goes from this entity to the related entity.
    fk-name N The foreign key name can be created automatically from the relationship name, but this is not recommended for two reasons: many databases have a very small maximum size (like 18 characters) for foreign key and index names, and many databases require that the FK name be unique for the entire database and not just for the table the FK is coming from.

    Sub-Element Name How Many Description
    key-map 1 to many The key-map is used to specify a field in this entity that corresponds to a field in the related entity. This element has two attributes: field-name and rel-field-name. These are used to specify the name of the field on this entity and the corresponding name of the field on the related entity.

    更加詳細的內(nèi)容參照: http://ofbiz.apache.org/docs/entity.html

    posted @ 2008-09-09 10:25 追風舞者 閱讀(726) | 評論 (0)編輯 收藏

    1.將Opentaps項目導入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
    REM ####################################################
    REM Licensed to the Apache Software Foundation (ASF) under one
    REM or more contributor license agreements.  See the NOTICE file
    REM distributed with this work for additional information
    REM regarding copyright ownership.  The ASF licenses this file
    REM to you under the Apache License, Version 2.0 (the
    REM "License"); you may not use this file except in compliance
    REM with the License.  You may obtain a copy of the License at
    REM
    REM http://www.apache.org/licenses/LICENSE-2.0
    REM
    REM Unless required by applicable law or agreed to in writing,
    REM software distributed under the License is distributed on an
    REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    REM KIND, either express or implied.  See the License for the
    REM specific language governing permissions and limitations
    REM under the License.
    REM ########################################################
    ECHO ON

    "%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 為上面紅色標記,兩者必需一致。





    posted @ 2008-09-08 18:23 追風舞者 閱讀(2069) | 評論 (0)編輯 收藏

    1.OfBiz中利用delegator訪問數(shù)據(jù)庫

    1)創(chuàng)建GenericDelegator對象
      1.1 service中
      public static Map createHelloPerson(DispatchContext dctx, Map context) {
              GenericDelegator delegator = dctx.getDelegator();
         ...
      }
      1.2手工建立GenericDelegator對象
      GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");

    2)Insert a record
      通過調(diào)用delegator對象的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中存儲了查詢條件
        GenericValue obj = delegator.findByPrimaryKey("ClassName", pk);
          obj.setNonPKFields(context);//contex為Map類型,存儲了要更新的字段
        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ù)值對象進行訪問
        在現(xiàn)有的數(shù)值對象(GenericValue類型)上可以進行下列操作:
            根據(jù)關系查找關聯(lián)信息getRelated,包括getRelated、getRelatedByAnd、getRelatedDummyPK、getRelatedMulti、getRelatedOrderBy。
            刷新本數(shù)值對象refresh
            保存本數(shù)值對象store,主要用于修改后的保存
            刪除數(shù)值對象remove,包括刪除本數(shù)值對象remove和刪除某個關聯(lián)的數(shù)值對象removeRelated
            在現(xiàn)有數(shù)值對象上的操作是通過調(diào)用
       
        更加具體的信息可參考:http://www.opentaps.org/javadocs/release-1.0.1/framework/api/


    posted @ 2008-09-08 17:59 追風舞者 閱讀(1233) | 評論 (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
    尤其是第一個里面有很多不錯的文章,不過都是英文的,耐心的看下去吧。

    posted @ 2008-09-05 15:07 追風舞者 閱讀(254) | 評論 (0)編輯 收藏

          Java語言中的equals的規(guī)范:

              1. 自反性:對于任何一個非空引用x,x.equals(x)應該返回true;
        2. 對稱性:對于任何引用xy,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
        3. 傳遞性:對于任何引用x、yz,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true
        4. 一致性:如果xy引用的對象沒有發(fā)生變化,那么反復調(diào)用x.equals(y)應該返回同樣的結果。
        5. 對于任何非空引用xx.equals(null)應該返回false。

     public boolean equals(Object obj) {
      boolean result = false;
      if (this == obj)
       return true;
      if (!(obj instanceof Student))
       return false;
      Student objTemp = (Student) obj;
      if (this.getId() == objTemp.getId())
       result = true;
      return result;
     }

    Java語言中的hashcode:

      1. 將一個非0常數(shù),例如17,儲存于int result變量中。
      2. 對對象中的每一個有意義的字段f(更確切地說是被equals()所考慮的每一個字段)進行如下處理:
        A. 對這個字段計算出型別為int的hash 碼 c:
          i. 如果字段是個boolean,計算(f ? 0 : 1)。
          ii. 如果字段是個byte,char,short或int,計算(int)f。
          iii. 如果字段是個long,計算(int)(f^(f >>> 32))。
          iv. 如果字段是個float,計算Float.floatToIntBits(f)。
          v. 如果字段是個double,計算Double.doubleToLongBits(f),然后將計算結果按步驟2.A.iii處理。
          vi. 如果字段是個object reference,而且class 的equals()透過「遞歸呼叫equals()」的方式來比較這一字段,那么就同樣也對該字段遞歸呼叫hashCode()。
          vii. 如果字段是個array,請將每個元素視為獨立字段。也就是說對每一個有意義的元素施行上述規(guī)則,用以計算出hash 碼,然后再依步驟2.B將這些數(shù)值組合起來。
        B. 將步驟A計算出來的hash碼 c按下列公式組合到變量result中:result = 37*result + c;
     3. 傳回result。
     4. 完成hashCode()之后,反躬自省一下:是否相等的實體具有相等的hash 碼?如果不是,找出原因并修正問題。

    posted @ 2008-08-04 14:38 追風舞者 閱讀(195) | 評論 (0)編輯 收藏

         摘要: 前人栽樹,后人乘涼。想當初自己初學Java時為了解決一個很基礎的問題,好多的朋友熱心的回復我,幫我分析錯誤。現(xiàn)在為了方便那些Java新手,特給出自己感覺比較好的學習網(wǎng)站和論壇,希望對朋友們能有點幫助。
    1,http://www.javaeye.com/ 由Robbin創(chuàng)建發(fā)起的技術網(wǎng)站,人氣相當旺,有不少牛人。最初是以討論Java技 術和Hibernate技術開始的技術論壇,現(xiàn)在已經(jīng)成為一個涵蓋整個軟件開發(fā)領域的綜合性網(wǎng)站,2005年被選為中國十佳技術網(wǎng)站之一。
    2,http://www.ibm.com/developerworks/cn/java/ 著名的IBM Developer Works。涵蓋各種技術。
    3,http://dev2dev.bea.com.cn/ IBM和BEA都在主推Java應用。它們的技術網(wǎng)站中有不少關于Java的好文章。
    ………………  閱讀全文

    creasure 2008-07-08 20:19 發(fā)表評論

    文章來源:http://www.tkk7.com/creasure/archive/2008/07/08/213420.html

    posted @ 2008-07-10 09:48 追風舞者 閱讀(79) | 評論 (0)編輯 收藏

    Eclipse 常用快捷鍵
    Eclipse的編輯功能非常強大,掌握了Eclipse快捷鍵功能,能夠大大提高開發(fā)效率。Eclipse中有如下一些和編輯相關的快捷鍵。
       1. 【ALT+/】
       此快捷鍵為用戶編輯的好幫手,能為用戶提供內(nèi)容的輔助,不要為記不全方法和屬性名稱犯愁,當記不全類、方法和屬性的名字時,多體驗一下【ALT+/】快捷鍵帶來的好處吧。
       2. 【Ctrl+O】
       顯示類中方法和屬性的大綱,能快速定位類的方法和屬性,在查找Bug時非常有用。

       3. 【Ctrl+/】
       快速添加注釋,能為光標所在行或所選定行快速添加注釋或取消注釋,在調(diào)試的時候可能總會需要注釋一些東西或取消注釋,現(xiàn)在好了,不需要每行進行重復的注釋。

       4. 【Ctrl+D】
       刪除當前行,這也是筆者的最愛之一,不用為刪除一行而按那么多次的刪除鍵。

       5. 【Ctrl+M】
       窗口最大化和還原,用戶在窗口中進行操作時,總會覺得當前窗口?。ㄓ绕湓诰帉懘a時),現(xiàn)在好了,試試【Ctrl+M】快捷鍵。

       查看和定位快捷鍵

       在程序中,迅速定位代碼的位置,快速找到Bug的所在,是非常不容易的事,Eclipse提供了強大的查找功能,可以利用如下的快捷鍵幫助完成查找定位的工作。

       1. 【Ctrl+K】、【Ctrl++Shift+K】
       快速向下和向上查找選定的內(nèi)容,從此不再需要用鼠標單擊查找對話框了。

       2. 【Ctrl+Shift+T】
       查找工作空間(Workspace)構建路徑中的可找到Java類文件,不要為找不到類而痛苦,而且可以使用“*”、“?”等通配符。

       3. 【Ctrl+Shift+R】
       和【Ctrl+Shift+T】對應,查找工作空間(Workspace)中的所有文件(包括Java文件),也可以使用通配符。

       4. 【Ctrl+Shift+G】
       查找類、方法和屬性的引用。這是一個非常實用的快捷鍵,例如要修改引用某個方法的代碼,可以通過【Ctrl+Shift+G】快捷鍵迅速定位所有引用此方法的位置。

       5. 【Ctrl+Shift+O】
    快速生成import,當從網(wǎng)上拷貝一段程序后,不知道如何import進所調(diào)用的類,試試【Ctrl+Shift+O】快捷鍵,一定會有驚喜。

       6. 【Ctrl+Shift+F】
       格式化代碼,書寫格式規(guī)范的代碼是每一個程序員的必修之課,當看見某段代碼極不順眼時,選定后按【Ctrl+Shift+F】快捷鍵可以格式化這段代碼,如果不選定代碼則默認格式化當前文件(Java文件)。

       7. 【ALT+Shift+W】
       查找當前文件所在項目中的路徑,可以快速定位瀏覽器視圖的位置,如果想查找某個文件所在的包時,此快捷鍵非常有用(特別在比較大的項目中)。

       8. 【Ctrl+L】
       定位到當前編輯器的某一行,對非Java文件也有效。

       9. 【Alt+←】、【Alt+→】
       后退歷史記錄和前進歷史記錄,在跟蹤代碼時非常有用,用戶可能查找了幾個有關聯(lián)的地方,但可能記不清楚了,可以通過這兩個快捷鍵定位查找的順序。

       10. 【F3】
    快速定位光標位置的某個類、方法和屬性。

       11. 【F4】
       顯示類的繼承關系,并打開類繼承視圖。

       調(diào)試快捷鍵

       Eclipse中有如下一些和運行調(diào)試相關的快捷鍵。

       1. 【Ctrl+Shift+B】:在當前行設置斷點或取消設置的斷點。
       2. 【F11】:調(diào)試最后一次執(zhí)行的程序。
       3. 【Ctrl+F11】:運行最后一次執(zhí)行的程序。
       4. 【F5】:跟蹤到方法中,當程序執(zhí)行到某方法時,可以按【F5】鍵跟蹤到方法中。
       5. 【F6】:單步執(zhí)行程序。
       6. 【F7】:執(zhí)行完方法,返回到調(diào)用此方法的后一條語句。
       7. 【F8】:繼續(xù)執(zhí)行,到下一個斷點或程序結束。

       常用編輯器快捷鍵

       通常文本編輯器都提供了一些和編輯相關的快捷鍵,在Eclipse中也可以通過這些快捷鍵進行文本編輯。
       1. 【Ctrl+C】:復制。
       2. 【Ctrl+X】:剪切。
       3. 【Ctrl+V】:粘貼。
       4. 【Ctrl+S】:保存文件。
       5. 【Ctrl+Z】:撤銷。
       6. 【Ctrl+Y】:重復。
       7. 【Ctrl+F】:查找。

       其他快捷鍵

       Eclipse中還有很多快捷鍵,無法一一列舉,用戶可以通過幫助文檔找到它們的使用方式,另外還有幾個常用的快捷鍵如下。
       1. 【Ctrl+F6】:切換到下一個編輯器。
       2. 【Ctrl+Shift+F6】:切換到上一個編輯器。
       3. 【Ctrl+F7】:切換到下一個視圖。
       4. 【Ctrl+Shift+F7】:切換到上一個視圖。
       5. 【Ctrl+F8】:切換到下一個透視圖。
       6. 【Ctrl+Shift+F8】:切換到上一個透視圖。

       Eclipse中快捷鍵比較多,可以通過幫助文檔找到所有快捷鍵的使用,但要掌握所有快捷鍵的使用是不可能的,也沒有必要,如果花點時間熟悉本節(jié)列舉的快捷鍵,必將會事半功倍

    posted @ 2008-07-09 14:06 追風舞者 閱讀(224) | 評論 (0)編輯 收藏

         摘要: 速動畫教程第二十七集? SVN的安裝和配置 下載:請到?http://this.oksonic.cn 下載? 工具:...  閱讀全文

    oksonic 2007-02-10 09:56 發(fā)表評論

    文章來源:http://www.tkk7.com/oksonic/archive/2007/02/10/99100.html

    posted @ 2008-07-09 11:02 追風舞者 閱讀(129) | 評論 (0)編輯 收藏

         摘要: 速動畫教程第二十五集? 使用 xfire 開發(fā) web service 應用 ? 下載地址: http://this.oksonic.cn ...  閱讀全文

    oksonic 2006-07-19 21:20 發(fā)表評論

    文章來源:http://www.tkk7.com/oksonic/archive/2006/07/19/59069.html

    posted @ 2008-07-09 10:46 追風舞者 閱讀(83) | 評論 (0)編輯 收藏

         摘要: 速動畫教程第三十集 搭建SSH2的集成開發(fā)環(huán)境 下載地址:www.oksonic.cn    www.oksonic.com.cn   一.開發(fā)環(huán)境: 1.  Windows2003 sp1 2.  Eclipse3.2.2 3.  MyEclipse5.1.1 4.  Struts2.0.6 5.&n...  閱讀全文

    oksonic 2007-04-28 16:00 發(fā)表評論

    文章來源:http://www.tkk7.com/oksonic/archive/2007/04/28/114363.html

    posted @ 2008-07-09 10:46 追風舞者 閱讀(166) | 評論 (0)編輯 收藏

    在hibernate中,延遲加載是1個非常大的優(yōu)點,但有時候卻給我們帶來一些小麻煩,在后臺查詢結束后,session已經(jīng)關閉,但在前臺顯示的時候,如果存在關聯(lián)關系就會產(chǎn)生延遲加載異常。
    解決辦法是客戶端每次請求就分配1個session,將請求結果返回給客戶端,并完成展現(xiàn)后關閉session。
    實現(xiàn)這個功能非常簡單,在web.xml中加入以下配置
    <filter>
     <filter-name>hibernateFilter</filter-name>
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
    <init-param>
         <param-name>singleSession</param-name>
           <param-value>true</param-value>
      </init-param>
    </filter>
    <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    </filter-mapping>


    使用spring提供這個過濾器就可以實現(xiàn)session的集中管理了,所有以.do結尾的請求都自動分配了1個session,并且在這個請求過程中都使用這個session.

     

    來自:http://springking.javaeye.com/



    BeanSoft 2008-06-19 23:05 發(fā)表評論

    文章來源:http://www.tkk7.com/beansoft/archive/2008/06/19/209283.html

    posted @ 2008-07-09 10:42 追風舞者 閱讀(134) | 評論 (0)編輯 收藏

    1.   select * from emp;

        EMPNO ENAME  JOB        MGR HIREDATE     SAL COMM  DEPTNO
        ----- ------ --------- ---- ----------- ---- ---- -------
         7369 SMITH  CLERK     7902 17-DEC-1980  800           20
         7499 ALLEN  SALESMAN  7698 20-FEB-1981 1600  300      30
         7521 WARD   SALESMAN  7698 22-FEB-1981 1250  500      30
         7566 JONES  MANAGER   7839 02-APR-1981 2975           20
         7654 MARTIN SALESMAN  7698 28-SEP-1981 1250 1400      30
         7698 BLAKE  MANAGER   7839 01-MAY-1981 2850           30
         7782 CLARK  MANAGER   7839 09-JUN-1981 2450           10
         7788 SCOTT  ANALYST   7566 09-DEC-1982 3000           20
         7839 KING   PRESIDENT      17-NOV-1981 5000           10
         7844 TURNER SALESMAN  7698 08-SEP-1981 1500    0      30
         7876 ADAMS  CLERK     7788 12-JAN-1983 1100           20
         7900 JAMES  CLERK     7698 03-DEC-1981  950           30
         7902 FORD   ANALYST   7566 03-DEC-1981 3000           20
         7934 MILLER CLERK     7782 23-JAN-1982 1300           10

    2.問題:查找DEPTNO 20中出現(xiàn)最多次數(shù)的工資?
     select sal
          from emp
         where deptno = 20
         order by sal

               SAL
        ----------
               800
              1100
              2975
              3000
              3000

    3.解決方案
    使用窗口函數(shù) DENSE_RANK,把工資重復出現(xiàn)的次數(shù)分等級。
      1     select sal
      2       from (
      3     select sal,
      4            dense_rank()over( order by cnt desc) as rnk
      5       from (
      6     select sal, count(*) as cnt
      8       from emp
      9      where deptno = 20
     10      group by sal
     11            ) x
     12            ) y
     13      where rnk = 1 

    posted @ 2008-07-08 11:55 追風舞者 閱讀(154) | 評論 (0)編輯 收藏

    1.ISNULL 判斷某一字段是否為空,若為空返回 TRUE,否則返回 FALSE

    2.NULLIF(字段名,字段值)若字段名的值為"字段值",則將該字段值替換成NULL

    3.COALESCE(表達式1,表達式2,...表達式n) 從左到右 依次判斷表達式的值,返回第一個非空的表達式的值。

    posted @ 2008-07-08 10:43 追風舞者 閱讀(279) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 久久久无码精品亚洲日韩软件| 在线毛片片免费观看| 456亚洲人成在线播放网站| 亚洲国产精品一区二区久| 亚洲一区二区三区丝袜| 亚洲av无码片vr一区二区三区| 亚洲色大成WWW亚洲女子| 久久免费线看线看| 成人黄色免费网址| 成人毛片18女人毛片免费96| 国产免费69成人精品视频| 亚洲欧洲中文日韩久久AV乱码| 免费人妻无码不卡中文字幕18禁| 亚洲区小说区图片区| 涩涩色中文综合亚洲| 成人片黄网站色大片免费观看cn| 久久国产精品免费看| 永久免费毛片在线播放| 亚洲第一区精品观看| 亚洲精品网站在线观看你懂的 | 精品少妇人妻AV免费久久洗澡 | 国产中文在线亚洲精品官网| 国产亚洲综合久久系列| 亚洲字幕在线观看| 色欲aⅴ亚洲情无码AV| 国产情侣久久久久aⅴ免费 | 亚洲人成网站观看在线播放| 久久亚洲精品成人av无码网站| 最新亚洲精品国偷自产在线| 亚洲无砖砖区免费| www.亚洲精品| 亚洲色欲色欲综合网站| 亚洲av纯肉无码精品动漫| 嫩草影院在线免费观看| 亚洲国产高清人在线| 中国一级特黄的片子免费| 久久亚洲中文字幕精品一区| 无码日韩人妻AV一区免费l | 16女性下面扒开无遮挡免费| 久久亚洲精品中文字幕无码 | 亚洲色大成WWW亚洲女子|