<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2008年9月18日


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

    轉載自:www.tkk7.com/zhaobin
    來自BlueDavy的博客

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

    來自Phrancol的博客

      1. 構建模塊化的動態Web應用(演示版)
      2. 開發基于Equinox/OSGI 的 Web Application (一) [譯]
      3. 開發基于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實現可配置Web應用程序初探

    來自羅明的博客

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

    來自yangbutao的博客

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

    來自erylee的博客

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

    來自

      1. Equinox OSGi系列之一 Equinox入門
      2. Equinox OSGi系列之二 搭建Equinox OSGi核心環境
      3. Equinox OSGi系列之三 Equinox配置參數詳解
      4. Equinox OSGi系列之四 創建自己的OSGi應用項目 

    來自IBM 的developerworks

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

    來自其他的博客或帖子:

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

    二、選擇題(30分)
    1、關于垃圾收集的哪些敘述是正確的(   ):
    A.程序開發者必須自己創建一個線程進行內存釋放的工作
    B.垃圾收集允許程序開發者明確指定并立即釋放該內存
    C.垃圾收集將檢查并釋放不再使用的內存
    D.垃圾收集能夠在期望的時間釋放被java對象使用的內存
    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.在方法中定義的局部變量在該方法被執行時創建
    D.局部變量在使用前必須被初始化
    4、下列關于修飾符混用的說法,錯誤的是(  ):
    A.abstract不能與final并列修飾同一個類
    B.abstract類中不可以有private的成員
    C.abstract方法必須在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程序執行的入口點,關于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、執行完以下代碼int [ ]  x = new  int[25];后,以下哪項說明是正確的(    ):
    A、    x[24]為0
    B、    x[24]未定義
    C、    x[25]為0
    D、    x[0]為空
    9、以下代碼段執行后的輸出結果為(     ):
           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行不能通過編譯,因為只能有一個靜態初始化器
    C、 編譯通過,執行結果為:x=5
    D、編譯通過,執行結果為: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行不能通過編譯,因為引用了私有靜態變量
    B、10行不能通過編譯,因為x是私有靜態變量
    C、程序通過編譯,輸出結果為:x=103
    D、程序通過編譯,輸出結果為:x=102
    15、以下選項中循環結構合法的是(    ):
    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管理的內存叫堆。在32Bit操作系統上有1.5G-2G的限制,而64Bit的就沒有。

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

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

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

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

    2.基本收集算法

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

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

    3.分代

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

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

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

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

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

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

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

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

    4.minor/major collection

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

    5.小結

    Young -- minor collection -- 復制算法

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

    三、收集器

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

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

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

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

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

        可以使用-XX:MaxGCPauseMillis= 和 -XX:GCTimeRatio 來調整GC的時間。

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

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

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

    3.1 年老代詳述

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

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

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

    3.2 年輕代詳述

       可惜對年輕代的復制收集,依然必須停止所有應用程序線程,原理如此,只能靠多CPU,多收集線程并發來提高收集速度,但除非你的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選項默認轉為并發收集器。

    四、暫停時間顯示

     加入下列參數 (請將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秒發生了Minor的垃圾收集,前一段數據針對新生區,從7994k整理為0k,新生區總大小為8128k,程序暫停了12ms,而后一段數據針對整個堆。

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

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

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

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

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

      其他免費選項,有:

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

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

    六、JDK 6.0的改進

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

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

    2.加大了Young區的默認大小
    默認大小從4M加到16M,從堆內存的1/15增加到1/7

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

    七、小結

    1. JDK5.0/6.0

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

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

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

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

    2. JRockit 6.0 R27.2

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

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

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

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

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

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

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

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

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

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

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

    3.減少GC開銷的措施

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

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

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

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

      臨時對象在跳出函數調用后,會成為垃圾,少用臨時變量就相當于減少了垃圾的產生,從而延長了出現上述第二個觸發條件出現的時間,減少了主GC的機會。

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

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

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

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

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

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

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

      靜態變量屬于全局變量,不會被GC回收,它們會一直占用內存。

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

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

    4.gc與finalize方法

      ⑴gc方法請求垃圾回收

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

      ⑵finalize方法透視垃圾收集器的運行

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

      protected void finalize() throws Throwable

      在finalize()方法返回之后,對象消失,垃圾收集開始執行。原型中的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 內存泄漏
      由于采用了垃圾回收機制,任何不可達對象(對象不再被引用)都可以由垃圾收集線程回收。因此通常說的Java 內存泄漏其實是指無意識的、非故意的對象引用,或者無意識的對象保持。無意識的對象引用是指代碼的開發人員本來已經對對象使用完畢,卻因為編碼的錯誤而意外地保存了對該對象的引用(這個引用的存在并不是編碼人員的主觀意愿),從而使得該對象一直無法被垃圾回收器回收掉,這種本來以為可以釋放掉的卻最終未能被釋放的空間可以認為是被“泄漏了”。

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

     

    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對象,并調用有參構造函數。分配stack Obj數組的空間大小為64,可以存64個對象,從0開始存儲   
    22.    ObjStack stack1 = new ObjStack(64);   
    23.   
    24.    while (i < 64)    
    25.    {    
    26.    tempobj = new Object();//循環new Obj對象,把每次循環的對象一一存放在stack Obj數組中。    
    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.如何消除內存泄漏

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

      垃圾收集器的作用

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

      雖然內存管理可以說是自動化的,但是這并不能使編程人員免受思考內存管理問題之苦。例如,分配(以及釋放)內存總會有開銷,雖然這種開銷對編程人員來說是不可見的。創建了太多對象的程序將會比完成同樣的功能而創建的對象卻比較少的程序更慢一些(在其他條件相同的情況下)。

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

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

      典型泄漏

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

      全局集合

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

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

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

      緩存

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

      緩存通常都是以動態方式實現的,其中新的結果是在執行時添加到緩存中的。典型的算法是:

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

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

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

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

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

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

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

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

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

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

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

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

      ClassLoader

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

      確定泄漏的位置

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

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

    posted @ 2008-12-03 09:41 追風舞者 閱讀(1305) | 評論 (1)編輯 收藏

    public class Search {

        
    /**
         * 前提條件array數組已排序
         
    */
        
    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(
    "請輸入盤數:");
            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、下載驅動

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

     

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

    這里是內核自帶的驅動

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

    安裝編譯包。

    我在安裝的時候提示說沒有lib,驅動安裝時候要安裝Kernel Interface,如果采用自己編譯的方式則要求系統中有libc的源碼。我想一般人都是沒有的,呵呵。這個時候我們可以在安裝驅動之前先自己把這個源碼給安裝好,問題就解決了。如何安裝?呵呵,更簡單,強大的 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、禁止系統使用默認的驅動
    sudo gedit /etc/default/linux-restricted-modules-common
    在最后的雙引號中添加nv nvidia_new,即把文件中的“”,改成“nv nvidia_new”
    如果前面第二步刪除完整了其實也可以不用執行這一步。

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

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

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

    安裝過程中

    如果提示有舊驅動,詢問是否刪除舊驅動,選Yes;
    如果提示缺少某某模塊(modules),詢問是否上網下載,選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是因為我現在是一般用戶(firehare),如果不加-u root的話,mysql會以為是firehare在登錄。注意,我在這里沒有進入根用戶模式,因為沒必要。一般來說,對mysql中的數據庫進行操作, 根本沒必要進入根用戶模式,只有在設置時才有這種可能。

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

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

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

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

    mysql>CREATE DATABASE xoops;

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

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

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

    其一:

    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)編輯 收藏

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

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

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

    Linux常用命令詳解

    來源: LUPA開源社區
    發布時間: 2007-05-27 05:34 版權申明

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

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

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

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

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

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

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

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

    1.在應用程序菜單中創建起動器:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    mv命令

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

    rm命令

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

    Linux目錄的創建與刪除命令
    mkdir命令

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

    rmdir 命令

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

    cd 命令

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

    pwd 命令

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

    ls 命令

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

    Linux文本處理命令
    sort命令

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

    uniq命令

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

    Linux備份與壓縮命令
    tar命令

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

    gzip命令

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

    unzip命令

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

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

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

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

    chmod 命令

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

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

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

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

    su命令

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

    wall命令

    這個命令的功能是對全部已登錄的用戶發送信息,用戶可以先把要發送的信息寫好存入一個文件中,然后輸入:
    # wall < 文件名
    這樣就能對所有的用戶發送信息了。
    在上面的例子中符號“<”表示輸入重定向,有關它的含義和用法請參閱第十章的有關內容。 例如:
    # wall ‘Thank you!’
    Broadcast message from root (tty1) Fri Nov 26 14:15:07 1999…
    Thank you!
    #
    執行以上命令后,用戶的屏幕上顯示出“Thank you!”信息后,并不出現系統提示符$(#),再次按回車鍵后,屏幕出現系統提示符。

    write命令

    write命令的功能是向系統中某一個用戶發送信息。 該命令的一般格式為:
    write 用戶帳號 [終端名稱]
    例如: $ write Guest hello
    此時系統進入發送信息狀態,用戶可以輸入要發送的信息,輸入完畢,希望退出發送狀態時,按組合鍵< Ctrl+c>即可。

    mesg指令

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

    sync命令

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

    shutdown命令

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

    free命令

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

    uptime命令

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

    Linux磁盤管理
    df命令

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

    du命令

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

    dd命令

    功能:把指定的輸入文件拷貝到指定的輸出文件中,并且在拷貝過程中可以進行格式轉換。可以用該命令實現DOS下的diskcopy命令的作用。先用dd 命令把軟盤上的數據寫成硬盤的一個寄存文件,再把這個寄存文件寫入第二張軟盤上,完成diskcopy的功能。需要注意的是,應該將硬盤上的寄存文件用 rm命令刪除掉。系統默認使用標準輸入文件和標準輸出文件。
    語法:dd [選項]
    if =輸入文件(或設備名稱)。
    of =輸出文件(或設備名稱)。
    ibs = bytes 一次讀取bytes字節,即讀入緩沖區的字節數。
    skip = blocks 跳過讀入緩沖區開頭的ibs*blocks塊。
    obs = bytes 一次寫入bytes字節,即寫入緩沖區的字節數。
    bs = bytes 同時設置讀/寫緩沖區的字節數(等于設置ibs和obs)。
    cbs = byte 一次轉換bytes字節。
    count=blocks 只拷貝輸入的blocks塊。
    conv = ASCII 把EBCDIC碼轉換為ASCIl碼。
    conv = ebcdic 把ASCIl碼轉換為EBCDIC碼。
    conv = ibm 把ASCIl碼轉換為alternate EBCDIC碼。
    conv = block 把變動位轉換成固定字符。
    conv = ublock 把固定位轉換成變動位。
    conv = ucase 把字母由小寫轉換為大寫。
    conv = lcase 把字母由大寫轉換為小寫。
    conv = notrunc 不截短輸出文件。
    conv = swab 交換每一對輸入字節。
    conv = noerror 出錯時不停止處理。
    conv = sync 把每個輸入記錄的大小都調到ibs的大小(用NUL填充)。

    fdformat 命令

    軟盤是用戶常用的存儲介質之一。軟盤在使用之前必須先作格式化操作,然后可以用tar、dd、cpio等命令存儲數據,也可以在軟盤上建立可安裝的文件系統。
    功能:低級格式化軟盤
    語法: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命令的功能是顯示和設置系統日期和時間。
    該命令的一般格式為: 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到目前經歷的秒數
    % S 秒(00..59)
    % T 時間(24小時制)(hh:mm:ss)
    % X 顯示時間的格式(%H:%M:%S)
    % Z 時區 日期域
    % 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 年的最后兩個數字( 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.在應用程序菜單中創建起動器:

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

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

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

    在打開的窗口中輸入如下內容:

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

    Categories=Application;Office;

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

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

    3.在桌面創建起動器

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

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

    Evolution是ubuntu,fedora等發行版本自帶的一個郵件管理軟件,可以幫助你方便的管理和收發郵件,其設置步驟如下:
     
    1.確認你的gmail的POP已經打開: 登錄gmail-settings-forwarding and POP, 確認“Enable POP for all mail”被選上
    2.打開Application→Internet→Evolution Mail
    3.添加用戶,如果已經創建了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選現,
    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等端口號,根據我設置的實驗來看不設置端口號也可以。

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

    主站蜘蛛池模板: 日美韩电影免费看| 青青青国产在线观看免费| 免费无遮挡无码永久在线观看视频| 亚洲精品午夜在线观看| 91精品国产免费网站| 亚洲最大成人网色| 99热这里只有精品6免费| 亚洲福利视频一区| 未满十八18禁止免费无码网站| 亚洲国产精品无码久久久秋霞2| 99精品免费视品| 久久噜噜噜久久亚洲va久| 青青青国产手机频在线免费观看| 亚洲国产第一页www| 精品熟女少妇a∨免费久久| 久久精品国产亚洲AV高清热 | 精品国产污污免费网站入口在线| 亚洲精品无码专区久久同性男| 免费无码一区二区| 国产亚洲精品xxx| 50岁老女人的毛片免费观看| 亚洲一区二区三区亚瑟| 免费高清资源黄网站在线观看| 国产成人亚洲精品蜜芽影院| 亚洲一级黄色视频| 久久免费高清视频| 亚洲性色成人av天堂| 全免费一级毛片在线播放| 黄页网址大全免费观看12网站| 久久亚洲国产精品123区| 国产亚洲免费的视频看| 亚洲人成电影青青在线播放| 日本高清免费网站| 中文字幕在线视频免费| 亚洲综合综合在线| 免费A级毛片无码久久版| 国偷自产一区二区免费视频| 亚洲一区精品视频在线| 亚洲国产成人久久综合区| 成全动漫视频在线观看免费高清版下载 | 青青操在线免费观看|