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

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

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

    軟件是對質量的不懈追求

    2009年12月17日 #

    linux du 查看文件夾占用空間


    du -sh *

    posted @ 2011-04-15 08:39 BlakeSu 閱讀(280) | 評論 (0)編輯 收藏

    Building Standalone Application with Maven2

    If you are building standalone application in Java, Maven is your friend when packing your application,
    There are two way to let Maven package your application, either as a single jar with all your dependencies jar.


     <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
       <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
       </descriptorRefs>
      </configuration>
     </plugin>



    One advantage if you choose to do this way is if you need to sign your application jar.
    This is needed if you are building a Java Web Start client and you need more access than connecting back to the server.
    To read more about have Maven signing your jar read http://maven.apache.org/plugins/maven-jar-plugin/usage.html.
    But if you choose to go this way, make sure that all license agreement are shipped with your one single jar.

    Another way is to let Maven package your source code only and then referring the dependent jar file from the MANIFEST file.


     <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
       <archive>
        <manifest>
         <addClasspath>true</addClasspath>
         <mainClass>se.msc.adapter.Main</mainClass>
         <classpathPrefix>lib/</classpathPrefix>
        </manifest>
       </archive>
      </configuration>
     </plugin>

    posted @ 2011-02-24 13:03 BlakeSu 閱讀(329) | 評論 (0)編輯 收藏

    eclipse 終于有了列編輯功能

    eclipse 3.5之后終于有了列編輯,快捷鍵是alt+shift+a,再次按此快捷鍵返回常規編輯狀態。


    posted @ 2010-10-15 11:33 BlakeSu 閱讀(1484) | 評論 (0)編輯 收藏

    LineNumberReader 指定文件編碼


    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.LineNumberReader;


    public class Main {
        
        
    public static void main(String[] args) throws IOException {

            InputStreamReader isr 
    = new InputStreamReader(new FileInputStream("15370720.pdf4"), "utf-16");
            LineNumberReader lnr
    =new LineNumberReader(isr);
            String line 
    = null;
            
    while((line=lnr.readLine())!=null){  
               System.out.println(lnr.getLineNumber()
    +"\t"+line);
            }
       }
    }

    posted @ 2010-08-05 09:13 BlakeSu 閱讀(1049) | 評論 (0)編輯 收藏

    Class.getResourceAsStream 和 ClassLoader.getResourceAsStream

    兩個方法的區別是資源的定義不同, 一個主要用于相對與一個object取資源,而另一個用于取相對于classpath的
    資源,用的是絕對路徑。

    在使用Class.getResourceAsStream 時, 資源路徑有兩種方式, 一種以 / 開頭,則這樣的路徑是指定絕對
    路徑, 如果不以 / 開頭, 則路徑是相對與這個class所在的包的。

    在使用ClassLoader.getResourceAsStream時, 路徑直接使用相對于classpath的絕對路徑。

    舉例,下面的三個語句,實際結果是一樣的:
       com.explorers.Test.class.getResourceAsStream("abc.jpg")
    = com.explorers.Test.class.getResourceAsStream("/com/explorers/abc.jpg")
    = ClassLoader.getResourceAsStream("com/explorers/abc.jpg")

    posted @ 2010-07-28 16:31 BlakeSu 閱讀(295) | 評論 (0)編輯 收藏

    Standalone Java CAS Client

    There's a variety of clients for CAS. The Java-based clients (JA-SIG, Yale, see JA-SIG website) typically handle the browser-based client interaction with CAS very well through ServletFilter implementations.

    Now what about programmatic authentication, i.e. achieving authentication through non-browser based applications? There exists a CAS .NET client but I did not manage to find the appropriate Java implementation. So here goes - it is based on the Apache HttpClient.

    In case I missed any existing implementation achieving the same purpose, let's look at the bright side: at least now I understand the CAS protocol :-)

    My CAS client works within any application. It uses the HttpClient and behaves like a browser client as CAS requires cookie support.

    Here's the code:
    import org.apache.commons.httpclient.Header;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpMethod;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.apache.log4j.Logger;

    /**
    * The CasClient allows users to programmatically login
    * to CAS protected services based on the CAS 2 protocol.
    * This client behaves like a browser-client in terms of
    * cookie handling.<br>
    *
    @author Mathias Richter
    */
    public class CasClient
    {
      
       
    public static Logger LOG = Logger.getLogger( CasClient.class  );

       
    public static final String LOGIN_URL_PART = "login";
       
    public static final String SERVICE_VALIDATE_URL_PART = "serviceValidate";
       
    public static final String TICKET_BEGIN = "ticket=";
       
    private static final String LT_BEGIN = "name="lt" value="";
       public static final String CAS_USER_BEGIN = "<cas:user>";
       
    public static final String CAS_USER_END = "</cas:user>";
      
       
    private HttpClient fClient;
       
    private String fCasUrl;
      
       
    /**
        * Construct a new CasClient.
        *
        * 
    @param casUrl The base URL of the CAS service to be used.
        
    */
       
    public CasClient( String casBaseUrl )
       {
           
    thisnew HttpClient(), casBaseUrl );
       }
      
       
    /**
        * Construct a new CasClient which uses the specified HttpClient
        * for its HTTP calls.
        *
        * 
    @param client
        * 
    @param casBaseUrl
        
    */
       
    public CasClient( HttpClient client, String casBaseUrl )
       {
           fClient 
    = client;
           fCasUrl 
    = casBaseUrl;
       }
      
       
    /**
        * Authenticate the specified username with the specified password.
        * This will not yield any ticket, as no service is authenticated
        * against. This wil just set the CAS cookie in this client upon
        * successful authentication.
        *
        * 
    @param username
        * 
    @param password
        
    */
       
    public void authenticate( String username, String password )
       {
           authenticate( 
    null, username, password );
       }
      
       
    /**
        * Validate the specified service ticket against the specified service.
        * If the ticket is valid, this will yield the clear text user name
        * of the autenticated user.<br>
        * Note that each service ticket issued by CAS can be used exactly once
        * to validate.
        *
        * 
    @param serviceUrl
        * 
    @param serviceTicket
        *
        * 
    @return Clear text username of the authenticated user.
        
    */
       
    public String validate( String serviceUrl, String serviceTicket )
       {
           String result 
    = null;
           PostMethod method 
    = new PostMethod( fCasUrl + SERVICE_VALIDATE_URL_PART );
           method.setParameter( 
    "service", serviceUrl );
           method.setParameter( 
    "ticket", serviceTicket );
           
    try
           {
               
    int statusCode = fClient.executeMethod(method);
               
    if (statusCode != HttpStatus.SC_OK)
               {
                   LOG.error( 
    "Could not validate: " + method.getStatusLine() );
                   method.releaseConnection();
               } 
    else
               {   
                   result 
    = extractUser( new String( method.getResponseBody() ) );
               }
           } 
    catch ( Exception x )
           {
               LOG.error( 
    "Could not validate: " + x.toString () );
               x.printStackTrace();
           }
           method.releaseConnection();
           
    return result;
       }
      
       
    /**
        * Authenticate the specified user with the specified password against the
        * specified service.
        *
        * 
    @param serviceUrl May be null. If a url is specified, the authentication will happen against this service, yielding a service ticket which can be validated.
        * 
    @param username
        * 
    @param password
        * 
    @return A valid service ticket, if and only if the specified service URL is not null.
        
    */
       
    public String authenticate( String serviceUrl, String username, String password )
       {
           String lt 
    = getLt( serviceUrl );
           
    if ( lt == null )
           {
               LOG.error( 
    "Cannot retrieve LT from CAS. Aborting authentication for '" + username + "'" );
               
    return null;
           }
           String result 
    = null;
           PostMethod method 
    = new PostMethod( fCasUrl + LOGIN_URL_PART );
           
    if ( serviceUrl != null ) // optional
               method.setParameter( "service", serviceUrl );
           method.setParameter( 
    "_eventId""submit" );
           method.setParameter(
    "username", username );
           method.setParameter(
    "password", password );
           method.setParameter(
    "lt", lt );
           method.setParameter( 
    "gateway""true" );
           
    try
           {
               fClient.executeMethod(method);
               
    if ( serviceUrl == null )
               {
                   
    if ( extractLt( new String( method.getResponseBody() ) ) != null ) // if CAS does not return a login page with an LT authentication was successful
                   {
                       LOG.error( 
    "Authentication for '" +  username + "' unsuccessful" );
                       
    if ( LOG.isDebugEnabled() )
                           LOG.debug( 
    "Authentication for '" + username + "' unsuccessful." );
                   } 
    else
                   {
                       
    if ( LOG.isDebugEnabled() )
                           LOG.debug( 
    "Authentication for '" + username + "' unsuccessful." );
                   }
               } 
    else
               {
                   Header h 
    = method.getResponseHeader( "Location" );
                   
    if ( h != null )
                       result 
    = extractServiceTicket( h.getValue() );
                   
    if ( result == null )
                       LOG.error( 
    "Authentication for '" + username + "' unsuccessful." );
               }
           } 
    catch ( Exception x )
           {
               LOG.error( 
    "Could not authenticate'" + username + "':" + x.toString () );
           }
           method.releaseConnection();
           
    return result;
       }
      
       
    /**
        * Helper method to extract the user name from a "service validate" call to CAS.
        *
        * 
    @param data Response data.
        * 
    @return The clear text username, if it could be extracted, null otherwise.
        
    */
       
    protected String extractUser( String data )
       {
           String user 
    = null;
           
    int start = data.indexOf( CAS_USER_BEGIN  );
           
    if ( start >= 0 )
           {
               start 
    += CAS_USER_BEGIN.length();
               
    int end = data.indexOf( CAS_USER_END );
               
    if ( end > start )
                   user 
    = data.substring( start, end );
               
    else
                   LOG.warn( 
    "Could not extract username from CAS validation response. Raw data is: '" + data + "'" );
           } 
    else
           {
               LOG.warn( 
    "Could not extract username from CAS validation response. Raw data is: '" + data + "'" );
           }
           
    return user;
       }
      
       
    /**
        * Helper method to extract the service ticket from a login call to CAS.
        *
        * 
    @param data Response data.
        * 
    @return The service ticket, if it could be extracted, null otherwise.
        
    */
       
    protected String extractServiceTicket( String data )
       {
           String serviceTicket 
    = null;
           
    int start = data.indexOf( TICKET_BEGIN  );
           
    if ( start > 0 )
           {
               start 
    += TICKET_BEGIN.length();
               serviceTicket 
    = data.substring( start );
           }
           
    return serviceTicket;
       }
      
       
    /**
        * Helper method to extract the LT from a login form from CAS.
        *
        * 
    @param data Response data.
        * 
    @return The LT, if it could be extracted, null otherwise.
        
    */
       
    protected String extractLt( String data )
       {
           String token 
    = null;
           
    int start = data.indexOf( LT_BEGIN  );
           
    if ( start < 0 )
           {
               LOG.error( 
    "Could not obtain LT token from CAS: LT Token not found in response." );
           } 
    else
           {
               start 
    += LT_BEGIN.length();
               
    int end = data.indexOf( """, start );
               token = data.substring( start, end );
           }       
           
    return token;
       }
      
       
    /**
        * This method requests the original login form from CAS.
        * This form contains an LT, an initial token that must be
        * presented to CAS upon sending it an authentication request
        * with credentials.<br>
        * If a service URL is provided (which is optional), this method
        * will post the URL such that CAS authenticates against the
        * specified service when a subsequent authentication request is
        * sent.
        *
        * 
    @param serviceUrl
        * 
    @return The LT token if it could be extracted from the CAS response.
        
    */
       
    protected String getLt( String serviceUrl )
       {
           String lt 
    = null;
           HttpMethod method 
    = null;
           
    if ( serviceUrl == null )
               method 
    = new GetMethod( fCasUrl + LOGIN_URL_PART );
           
    else
           {
               method 
    = new PostMethod( fCasUrl + LOGIN_URL_PART );
               ( ( PostMethod ) method ).setParameter( 
    "service", serviceUrl );
           }
           
    try
           {
               
    int statusCode = fClient.executeMethod(method);
               
    if (statusCode != HttpStatus.SC_OK)
               {
                   LOG.error( 
    "Could not obtain LT token from CAS: " + method.getStatusLine() );
                   method.releaseConnection();
               } 
    else
               {
                   Object o 
    = method.getResponseHeaders() ;
                   
    return extractLt( new String( method.getResponseBody() ) );
               }
           } 
    catch ( Exception x )
           {
               LOG.error( 
    "Could not obtain LT token from CAS: " + x.toString () );
           }
           method.releaseConnection();
           
    return lt;
       }
      
    }

    posted @ 2010-07-15 17:59 BlakeSu 閱讀(416) | 評論 (0)編輯 收藏

    java取文件換行符

    System.getProperty("line.separator")

    posted @ 2010-06-30 15:45 BlakeSu 閱讀(311) | 評論 (0)編輯 收藏

    禁止瀏覽器緩存

    html
      <meta http-equiv="pragma" content="no-cache">
      
    <meta http-equiv="cache-control" content="no-cache">
      
    <meta http-equiv="expires" content="0">


    servlet
              response.setHeader("pragma","no-cache");
              response.setHeader(
    "cache-control","no-cache");
              response.setDateHeader(
    "expires"0);


    posted @ 2010-06-25 09:06 BlakeSu 閱讀(253) | 評論 (0)編輯 收藏

    frame 中跨域訪問cookie(java)

    response.addHeader("P3P","CP=CAO PSA OUR");

    posted @ 2010-06-25 09:04 BlakeSu 閱讀(415) | 評論 (0)編輯 收藏

    vim的復制粘貼小結

    原文地址 http://lsong17.spaces.live.com/blog/cns!556C21919D77FB59!603.trak


    用vim這么久 了,始終也不知道怎么在vim中使用系統粘貼板,通常要在網上復制一段代碼都是先gedit打開文件,中鍵粘貼后關閉,然后再用vim打開編輯,真的不 爽;上次論壇上有人問到了怎么在vim中使用系統粘貼板,印象里回復很多,有好幾頁的回復卻沒有解決問題,今天實在受不了了又在網上找辦法,竟意外地找到 了,貼出來分享一下。

    如果只是想使用系統粘貼板的話直接在輸入模式按Shift+Inset就可以了,下面講一下vim的粘貼板的基礎知識,有興趣的可以看看, 應該會有所收獲的。
    vim幫助文檔里與粘貼板有關的內容如下:

    1. vim有12個粘貼板,分別是0、1、2、...、9、a、“、+;用:reg命令可以查看各個粘貼板里的內容。在vim中簡單用y只是復制到 “(雙引號)粘貼板里,同樣用p粘貼的也是這個粘貼板里的內容;

    2. 要將vim的內容復制到某個粘貼板,需要退出編輯模式,進入正常模式后,選擇要復制的內容,然后按"Ny完成復制,其中N為粘 貼板號(注意是按一下雙引號然后按粘貼板號最后按y),例如要把內容復制到粘貼板a,選中內容后按"ay就可以了,有兩點需要說明一下:
      • “號粘貼板(臨時粘貼板)比較特殊,直接按y就復制到這個粘貼板中了,直接按p就粘貼這個粘貼板中的內容;
      • +號粘貼板是系統粘貼板,用"+y將內容復制到該粘貼板后可以使用Ctrl+V將其粘貼到其他文檔(如firefox、gedit) 中,同理,要把在其他地方用Ctrl+C或右鍵復制的內容復制到vim中,需要在正常模式下按"+p;

    3. 要將vim某個粘貼板里的內容粘貼進來,需要退出編輯模式,在正常模式按"Np,其中N為粘貼板號,如上所述,可以按"5p將 5號粘貼板里的內容粘貼進來,也可以按"+p將系統全局粘貼板里的內容粘貼進來。

    注意:在我這里,只有vim.gtk或vim.gnome才能使用系統全局粘貼板,默認的 vim.basic看不到+號寄存器。

    posted @ 2010-06-18 14:21 BlakeSu 閱讀(264) | 評論 (0)編輯 收藏

    Linux下mail使用技巧

    登錄LINUX系統后,經常會看到"you have mail",卻苦于不知道如何查看,相信菜鳥們都遇到過,偶在網上用“linux mail"找了很久,但大都是介紹mail服務器的,黃天總算沒負有心人,在洪恩在找到一篇介紹基礎的文章,不敢獨享。
     
    系統提供了用戶 之間通信的郵件系統,當用戶打開終端注冊登錄時發現系統給出如下信息:
        you have mail.

        這時用戶可通過鍵入mail命令讀取信件:

        $ mail

        mail程序將逐個顯示用戶的信件,并依照時間順序,顯示最新的信件。每顯示一段信件,mail都詢問用戶是否要對該信件作些處理。若用戶回答d,則表示 刪除信件;若僅按回車鍵,表示對信件不作任何改動(信件仍舊保存,下次還可讀這一信件);若回答p,則要求重復顯示信件;s filename表示要把信件存入所命名的文件;若回答q,表示要從mail退出。

        我們在本章的第一個例子中演示了如何寫一封信,作為練習,你可送信件給自己,然后鍵入mail讀取自己發的信件,看看會有什么效果。(發信給自己是一種設 置備忘錄的方法)。

        $mail frank 給自己寫信

        subject: test

        This is a mail test

        CRL-d

        EOT

        $

        $mail 查看信件

        “/var/spool/mail/frank:”1 message 1 new

        >Nfrank@xteam.xteamlinux.comThu Mar 25 11:00 13/403 “test”

        &

        Message 1:

        From frank Thu Mar 25 11:00:25 1999/3/25

        Received: (fromfrank@localhost)

        by xteam.xteamlinux.com(8.8.4/8.8.4)

        id LAA05170 for frank;Thu 25 Mar 1999 11:00:25 GMT

        Date: Thu,25 Mar 1999 11:00:25 GMT

        From:RHS Linux User <frank@xteam.xteamlinux.com>

        Message-Id:<199903251142.LAA05170@xteam.xteamlinux.com>

        To:frank@xteam.xteamlinux.com

        Subject:test

        Status:R

        This is a mail test

        &

        mail命令還有很多其它用法,例如發送事先準備好的信件,或一次送信給若干人。還可以用其它方法送信件。

    posted @ 2010-06-18 11:05 BlakeSu 閱讀(190) | 評論 (0)編輯 收藏

    Mysql中limit的用法詳解

        Mysql中limit的用法:在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行數據,這個時候怎么辦呢?
      不用擔心,mysql已經為我們提供了這樣一個功能。

      SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

    LIMIT 子句可以被用于強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。
      如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1):
      為了與 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

    mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15

    //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1:

    mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.

    //如果只給定一個參數,它表示返回最大的記錄行數目:

    mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行

    //換句話說,LIMIT n 等價于 LIMIT 0,n。

    注意limit 10和limit 9,1的不同:

    例如:

    1.Select * From cyclopedia Where ID>=(
        Select Max(ID) From (
          Select ID From cyclopedia Order By ID limit 90001
        ) As tmp
      ) limit 100;

    2.Select * From cyclopedia Where ID>=(
        Select Max(ID) From (
          Select ID From cyclopedia Order By ID limit 90000,1
        ) As tmp
      ) limit 100;

     

        第1句是先取了前90001條記錄,取其中最大一個ID值作為起始標識,然后利用它可以快速定位下100條記錄

    第2句擇是僅僅取90000條記錄后1條,然后取ID值作起始標識定位下100條記錄

    第1句執行結果.100 rows in set (0.23) sec

    第2句執行結果.100 rows in set (0.19) sec

    其實第2句完全可以簡化成:
        Select * From cyclopedia Where ID>=(
       Select ID From cyclopedia limit 90000,1
    )limit 100;

    直接利用第90000條記錄的ID,不用經過Max運算,這樣做理論上效率因該高一些,但在實際使用中幾乎看不到效果,
       因為本身定位ID返回的就是1條記錄,Max幾乎不用運作就能得到結果,但這樣寫更清淅明朗,省去了畫蛇那一足.


    Select Top 100 * From cyclopedia Where ID>=(
    Select Top 90001 Max(ID) From (
    Select ID From cyclopedia Order By ID
    ) As tmp
    )

    但不管是實現方式是存貯過程還是直接代碼中,瓶頸始終在于MS-SQL的TOP總是要返回前N個記錄,這種情況在數據量不大時感受不深,
       但如果成百上千萬,效率肯定會低下的.相比之下MySQL的limit就有優勢的多,執行:


    Select ID From cyclopedia limit 90000
    Select ID From cyclopedia limit 90000,1

    的結果分別是:


    90000 rows in set (0.36) sec
    1 row in set (0.06) sec

    而MS-SQL只能用Select Top 90000 ID From cyclopedia 執行時間是390ms,執行同樣的操作時間也不及MySQL的360ms.

    limit的offset(偏移量)用于記錄較多的時候,記錄較少時,偏移offset較小,直接使用limit較優。offset越大,后者越優。
     

    1、offset比較小的時候。

    select * from yanxue8_visit limit 10,10

    多次運行,時間保持在0.0004-0.0005之間


    Select * From yanxue8_visit Where vid >=(
      Select vid From yanxue8_visit Order By vid limit 10,1
    ) limit 10

    多次運行,時間保持在0.0005-0.0006之間,主要是0.0006

    結論:偏移offset較小的時候,直接使用limit較優。這個顯示是子查詢的原因。

    2、offset大的時候。

    select * from yanxue8_visit limit 10000,10

    多次運行,時間保持在0.0187左右

    Select * From yanxue8_visit Where vid >=(
      Select vid From yanxue8_visit Order By vid limit 10000,1
    ) limit 10

    多次運行,時間保持在0.0061左右,只有前者的1/3。可以預先offset越大,后者越優。

    mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.

    //如果只給定一個參數,它表示返回最大的記錄行數目.

    posted @ 2010-06-02 14:43 BlakeSu 閱讀(451) | 評論 (0)編輯 收藏

    枚舉類型enum示例




    public enum OrderStatus {
        A(
    1), B(2), C(3), D(4), F(5), INCOMPLETE(6);
        
        
    private final int value;
        
    /**
         * Constructor.
         
    */
        
    private OrderStatus(int value) {
            
    this.value = value;
        }
        
        
    /**
         * Get the value.
         * 
    @return the value
         
    */
        
    public int getValue() {
            
    return value;
        }

    }


    posted @ 2010-06-02 13:33 BlakeSu 閱讀(147) | 評論 (0)編輯 收藏

    JS try.....catch的使用

    <script language="javascript">
    try
    {
    throw new Error(10,"asdasdasd")
    }
    catch (e)
    {
    alert(e.message);
    alert(e.description)
    alert(e.number)
    alert(e.name)
    throw new Error(10,"asdasdasd")
    }

    </script>  

    在JavaScript可以使用try...catch來進行異常處理。例如:  

     

    try {
    foo.bar();
    } catch (e) {
    alert(e.name + ": " + e.message);
    }

    目前我們可能得到的系統異常主要包含以下6種:

    • EvalError: raised when an error occurs executing code in eval()  
    • RangeError: raised when a numeric variable or parameter is outside of its valid range  
    • ReferenceError: raised when de-referencing an invalid reference  
    • SyntaxError: raised when a syntax error occurs while parsing code in eval()  
    • TypeError: raised when a variable or parameter is not a valid type  
    • URIError: raised when encodeURI() or decodeURI() are passed invalid parameters  

    上面的六種異常對象都繼承自Error對象。他們都支持以下兩種構造方法:

     

    new Error();
    new Error("異常信息");

    手工拋出異常的方法如下:

     

    try {
    throw new Error("Whoops!");
    } catch (e) {
    alert(e.name + ": " + e.message);
    }

    如要判斷異常信息的類型,可在catch中進行判斷:

     

    try {
    foo.bar();
    } catch (e) {
    if (e instanceof EvalError) {
       alert(e.name + ":" + e.message);
    }
    else if (e instanceof RangeError) {
       alert(e.name + ": " + e.message);
    }
    // etc
    }

    Error具有下面一些主要屬性:

    • description: 錯誤描述 (僅IE可用).  
    • fileName: 出錯的文件名 (僅Mozilla可用).  
    • lineNumber: 出錯的行數 (僅Mozilla可用).  
    • message: 錯誤信息 (在IE下同description)  
    • name: 錯誤類型.  
    • number: 錯誤代碼 (僅IE可用).  
    • stack: 像Java中的Stack Trace一樣的錯誤堆棧信息 (僅Mozilla可用).  

    因此為了更好的了解錯誤信息我們可以將catch部分改為如下形式:  

     

    try {
    foo.bar();
    } catch (e) {
    if (browserType != BROWSER_IE) {                            
       alert("name: " + e.name +
        "message: " + e.message +
        "lineNumber: " + e.lineNumber +
        "fileName: " + e.fileName +
        "stack: " + e.stack);        
    }
    else {                    
       alert("name: " + e.name +     
        "errorNumber: " + (e.number & 0xFFFF ) +
        "message: " + e.message");        
    }
    }

    JavaScript中的throw命令事實上可以拋出任何對象,并且我們可以在catch接受到此對象。例 如:

     

    try {
    throw new Date(); // 拋出當前時間對象
    } catch (e) {
    alert(e.toLocaleString()); // 使用本地格式顯示當前時間
    }

    posted @ 2010-06-02 10:38 BlakeSu 閱讀(330) | 評論 (0)編輯 收藏

    深拷貝

    import java.io.*;

    public class ObjectCloner
    {
       
    // so that nobody can accidentally create an ObjectCloner object
       private ObjectCloner(){}
       
    // returns a deep copy of an object
       static public Object deepCopy(Object oldObj) throws Exception
       {
          ObjectOutputStream oos 
    = null;
          ObjectInputStream ois 
    = null;
          
    try
          {
             ByteArrayOutputStream bos 
    = new ByteArrayOutputStream(); 
             oos 
    = new ObjectOutputStream(bos); 
             
    // serialize and pass the object
             oos.writeObject(oldObj);   
             oos.flush();               
             ByteArrayInputStream bin 
    = new ByteArrayInputStream(bos.toByteArray()); 
             ois 
    = new ObjectInputStream(bin);
             
    // return the new object
             return ois.readObject();
          }
          
    catch(Exception e)
          {
             System.out.println(
    "Exception in ObjectCloner = " + e);
             
    throw(e);
          }
          
    finally
          {
             oos.close();
             ois.close();
          }
       }
       
    }

    posted @ 2010-05-25 09:30 BlakeSu 閱讀(176) | 評論 (0)編輯 收藏

    mysql convert int to char/varchar

    select cast(1 as char)

    char 不能換成varchar,否則會報錯。

    posted @ 2010-05-12 17:12 BlakeSu 閱讀(2894) | 評論 (0)編輯 收藏

    How to check Linux distribution and version?

    If u are on an unknown server and keen to know it’s linux distribution info, you can check the linux distribution info by just a single command (eg. version, codename, etc). Just tested this command in UBuntu and CentOS, both return as what i expected. :)

    To check linux distribution and version, follow the steps below:-

    • Start your terminal and enter the command below to show your the linux distribution info:-
      $ cat /etc/*-release
    • Here’s my result in one of my my Ubuntu box:-
      $ cat /etc/*-release
      DISTRIB_ID=Ubuntu
      DISTRIB_RELEASE=9.10
      DISTRIB_CODENAME=karmic
      DISTRIB_DESCRIPTION="Ubuntu 9.10"

      Cool right!

    posted @ 2010-05-08 13:29 BlakeSu 閱讀(684) | 評論 (0)編輯 收藏

    Eclipse集成windows資源管理器簡單方法

    Run-->External Tools-->External tools configurations
    new 一個 program
    location 里面填 :C:\WINDOWS\explorer.exe
    Arguments 里面填: ${container_loc}
    點擊 Run

    posted @ 2010-05-08 08:40 BlakeSu 閱讀(262) | 評論 (0)編輯 收藏

    commons lang 比較有用的類

    ArrayUtils                 //簡化數組的操作
    LocaleUtils
    SerializationUtils
    StringEscapeUtils
    StringUtils
    SystemUtils
    Validate                   //輸入參數驗證
    NestableException
    NestableRuntimeException
    StopWatch          //秒表類

    posted @ 2010-04-26 10:16 BlakeSu 閱讀(207) | 評論 (0)編輯 收藏

    xmind 當真不錯

    xmind是繪制思維導圖的工具。
    使用之后,發現繪制組織結構圖和wbs都很方便。
    軟件基于eclipse框架開發,反應速度和操作性也都很不錯。
    更重要的,圖形的效果也是專業級的 :)

    posted @ 2010-04-23 09:51 BlakeSu 閱讀(249) | 評論 (0)編輯 收藏

    Java 中serialVersionUID的解釋

    serialVersionUID作用:
           序列化時為了保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。
    有兩種生成方式:
           一個是默認的1L,比如:private static final long serialVersionUID = 1L;
           一個是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段,比如:
           private static final   long     serialVersionUID = xxxxL;

    當你一個類實現了Serializable接口,如果沒有定義serialVersionUID,Eclipse會提供這個
         提示功能告訴你去定義 。在Eclipse中點擊類中warning的圖標一下,Eclipse就會
         自動給定兩種生成的方式。如果不想定義它,在Eclipse的設置中也
          可以把它關掉的,設置如下:
            Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==>
            Potential programming problems
            將Serializable class without serialVersionUID的warning改成ignore即可。

    如果你沒有考慮到兼容性問題時,就把它關掉,不過有這個功能是好的,只要任何類別實現了Serializable這個接口的話,如果沒有加入 serialVersionUID,Eclipse都會給你warning提示,這個serialVersionUID為了讓該類別 Serializable向后兼容。

    如果你的類Serialized存到硬盤上面后,可是后來你卻更改了類別的field(增加或減少或改名),當你Deserialize時,就會出現 Exception的,這樣就會造成不兼容性的問題。

    但當serialVersionUID相同時,它就會將不一樣的field以type的預設值Deserialize,可避開不兼容性問題。

    posted @ 2010-04-08 10:37 BlakeSu 閱讀(158) | 評論 (0)編輯 收藏

    spring 相關

    ApplicationContext wac = WebApplicationContextUtils          .getRequiredWebApplicationContext(config.getServletContext());

    posted @ 2010-04-06 13:01 BlakeSu 閱讀(151) | 評論 (0)編輯 收藏

    wesphere6.1修改默認端口

    環境->虛擬主機->default_host->其它屬性(主機別名)->修改端口
    服務器->應用程序服務器->server1->端口->WC_defaulthost->修改端口

    posted @ 2010-04-02 10:36 BlakeSu 閱讀(225) | 評論 (0)編輯 收藏

    jquery validate自定義驗證方法


     /* 追加自定義驗證方法 */   
     
    // 身份證號碼驗證   
     jQuery.validator.addMethod("idcardno"function(value, element) {
       
    return this.optional(element) || isIdCardNo(value);   
     }, 
    "請正確輸入身份證號碼");
     
      
    //字母數字
     jQuery.validator.addMethod("alnum"function(value, element) {
       
    return this.optional(element) || /^[a-zA-Z0-9]+$/.test(value);
     }, 
    "只能包括英文字母和數字");
     
      
    // 手機號碼驗證   
     jQuery.validator.addMethod("cellphone"function(value, element) {
       
    var length = value.length;
       
    return this.optional(element) || (length == 11 && /^(1\d{10})$/.test(value));
     }, 
    "請正確填寫手機號碼"); 
     
      
    // 電話號碼驗證   
     jQuery.validator.addMethod("telephone"function(value, element) {
       
    var tel = /^(\d{3,4}-?)?\d{7,9}$/g;
       
    return this.optional(element) || (tel.test(value));
     }, 
    "請正確填寫電話號碼");
     
     
    // 郵政編碼驗證
     jQuery.validator.addMethod("zipcode"function(value, element) {
       
    var tel = /^[0-9]{6}$/;
       
    return this.optional(element) || (tel.test(value));
     }, 
    "請正確填寫郵政編碼");
     
      
    // 漢字
     jQuery.validator.addMethod("chcharacter"function(value, element) {
       
    var tel = /^[\u4e00-\u9fa5]+$/;
       
    return this.optional(element) || (tel.test(value));
     }, 
    "請輸入漢字");
     
     
    /**
     * 身份證號碼驗證
     *
     
    */
    function isIdCardNo(num) {

     
    var factorArr = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
     
    var parityBit=new Array("1","0","X","9","8","7","6","5","4","3","2");
     
    var varArray = new Array();
     
    var intValue;
     
    var lngProduct = 0;
     
    var intCheckDigit;
     
    var intStrLen = num.length;
     
    var idNumber = num;
       
    // initialize
         if ((intStrLen != 15&& (intStrLen != 18)) {
             
    return false;
         }
         
    // check and set value
         for(i=0;i<intStrLen;i++) {
             varArray[i] 
    = idNumber.charAt(i);
             
    if ((varArray[i] < '0|| varArray[i] > '9') && (i != 17)) {
                 
    return false;
             } 
    else if (i < 17) {
                 varArray[i] 
    = varArray[i] * factorArr[i];
             }
         }
         
         
    if (intStrLen == 18) {
             
    //check date
             var date8 = idNumber.substring(6,14);
             
    if (isDate8(date8) == false) {
                
    return false;
             }
             
    // calculate the sum of the products
             for(i=0;i<17;i++) {
                 lngProduct 
    = lngProduct + varArray[i];
             }
             
    // calculate the check digit
             intCheckDigit = parityBit[lngProduct % 11];
             
    // check last digit
             if (varArray[17!= intCheckDigit) {
                 
    return false;
             }
         }
         
    else{        //length is 15
             //check date
             var date6 = idNumber.substring(6,12);
             
    if (isDate6(date6) == false) {

                 
    return false;
             }
         }
         
    return true;
         
     }
    /**
     * 判斷是否為“YYYYMM”式的時期
     *
     
    */
    function isDate6(sDate) {
       
    if(!/^[0-9]{6}$/.test(sDate)) {
          
    return false;
       }
       
    var year, month, day;
       year 
    = sDate.substring(04);
       month 
    = sDate.substring(46);
       
    if (year < 1700 || year > 2500return false
       
    if (month < 1 || month > 12return false
       
    return true
    }
    /**
     * 判斷是否為“YYYYMMDD”式的時期
     *
     
    */
    function isDate8(sDate) {
       
    if(!/^[0-9]{8}$/.test(sDate)) {
          
    return false;
       }
       
    var year, month, day;
       year 
    = sDate.substring(04);
       month 
    = sDate.substring(46);
       day 
    = sDate.substring(68);
       
    var iaMonthDays = [31,28,31,30,31,30,31,31,30,31,30,31]
       
    if (year < 1700 || year > 2500return false
       
    if (((year % 4 == 0&& (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1]=29;
       
    if (month < 1 || month > 12return false
       
    if (day < 1 || day > iaMonthDays[month - 1]) return false
       
    return true
    }




    posted @ 2010-03-30 11:30 BlakeSu 閱讀(3020) | 評論 (2)編輯 收藏

    Mozilla Thunderbird的一些設置

    為了在windows和linux平臺公用相同的郵件客戶端和郵件內容,主要是有時候切換操作系統又要看以前的郵件。最后找到了 thunderbird(下面簡稱TB)客戶端。這個客戶端就是有點慢,倒是能滿足我的要求。但是它的默認設置有時候有點不符合我們的使用習慣,我對它的 設置作了下面的一些修改:

        1:轉發郵件
           默認的設置轉發把郵件的內容作為附件轉發。這樣有兩個不好的地方:第一,如果郵件有附件,這個附件不能轉發;第二,接收方必須要用TB客戶端了,否則打不 開。
           修改:編輯 -> 首選項 -> 編寫 -> 常規:轉發消息改成內聯
       
        2:其它郵件客戶端接收TB發的中文附件是亂碼
           這個是標準問題,TB使用的是新的標準,但是別的客戶端使用的是舊的標準(具體那個標準忘了,google一下就可以了)。這樣就會出現亂碼了。
           修改:編輯 -> 首選項 -> 高級 -> 配置編輯器:mail.strictly_mime.parm_folding 改成0或者1

        3:自動打開附件
           TB默認的是在打開郵件的時候同時自動打開郵件的附件。這樣的話,如果附件大就很頭痛。
           修改:編輯 -> 首選項 -> 高級 -> 配置編輯器:
              mail.inline_attachments   改成faulse
              mail.content_disposition.type   改成1

        4:回復郵件時回復的郵件內容在下面
           TB默認的回復郵件的回復內容是在下面的,這樣如果郵件來回幾次,回復比較多,看起來很不方便。
           修改:編輯 -> 首選項 -> 高級 -> 配置編輯器:Mail.identify.default.reply_on_top值由0改為1
      
        還有一個問題沒有解決,就是有時候在TB中打開一個文件夾,它會重新建索引還是什么的,這時候打開一個文件夾比較慢。看網上有說把這個文件夾重命名,再創 建一個同名的文件夾,最后把老的文件夾的內容拷貝到新的里面就好了,這個沒有試過。不過這個也不是特別大的問題,就沒有繼續搞了,什么時候有空再看看,到 時候再貼上來。

    posted @ 2010-03-19 16:39 BlakeSu 閱讀(701) | 評論 (0)編輯 收藏

    tar命令詳解

    格式:  tar  選項  文件目錄列表
    功能:  對文件目錄進行打包備份
    選項:
    -c  建立新的歸檔文件
    -r  向歸檔文件末尾追加文件
    -x  從歸檔文件中解出文件
    -O  將文件解開到標準輸出
    -v  處理過程中輸出相關信息
    -f  對普通文件操作
    -z  調用gzip來壓縮歸檔文件,與-x聯用時調用gzip完成解壓縮
    -Z  調用compress來壓縮歸檔文件,與-x聯用時調用compress完成解壓縮  
    例如:
    1.將當前目錄下所有.txt文件打包并壓縮歸檔到文件this.tar.gz,我們可以使用
    tar czvf this.tar.gz ./*.txt
    2.將當前目錄下的this.tar.gz中的文件解壓到當前目錄我們可以使用
    tar xzvf this.tar.gz ./

    posted @ 2010-03-18 17:21 BlakeSu 閱讀(203) | 評論 (0)編輯 收藏

    websphere6.1 設定虛擬機參數

    Application Servers > server1 > Process Definition > Java Virtual Machine > Custom Properties

    虛擬機參數在命令行的形式為 -Dproperty=value,在程序中可以用System.getProperty("property")取值。
    利用這個特性可以對程序運行進行控制,避免代碼的修改。




    posted @ 2010-03-15 09:57 BlakeSu 閱讀(259) | 評論 (0)編輯 收藏

    firefox3.6擴展和插件安裝位置

    地址欄輸入about:support,在打開的頁面有打開配置文件夾的按鈕;
    擴展在Extensions文件夾下,插件在安裝文件夾下的plugin和其他目錄。

    posted @ 2010-03-15 09:22 BlakeSu 閱讀(419) | 評論 (0)編輯 收藏

    xfire 動態客戶端


    import java.net.URL;

    import org.codehaus.xfire.client.Client;

    public class XfireClient
    {

        
    public static void main(String[] args)
        {
            DyClient();
        }

        
    /**
         * You get a DynamicClient when you create a Client with the URL of a WSDL
         
    */
        
    public static void DyClient()
        {
            
    try
            {
                Client client 
    = new Client(
                        
    new URL(
                                
    "http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));
                Object[] results 
    = client.invoke("qqCheckOnline",
                        
    new Object[] { "31506173" });
                System.out.println((String) results[
    0]);

            }
            
    catch ( Exception e)
            {
                e.printStackTrace();
            }
        }
    }




    必須jar:
    commons-codec-1.3.jar
    commons-httpclient-3.0.jar
    commons-logging-1.0.4.jar
    jdom-1.0.jar
    wsdl4j-1.6.1.jar
    xfire-all-1.2.6.jar
    XmlSchema-1.1.jar

    posted @ 2010-03-08 16:00 BlakeSu 閱讀(339) | 評論 (0)編輯 收藏

    漢字與utf8編碼相互轉換


    import java.io.UnsupportedEncodingException;


    public class UTF {

        public static void main(String[] args) {
            String s 
    = "非常好";
            
    try {
                
    byte[] b = s.getBytes("UTF-8");
                
    for(int i=0; i< b.length; i++){
                    System.out.println(Integer.toHexString(b[i]).substring(
    6));
                    
                }
                System.out.println(
    new String(b, "UTF-8"));

            } 
    catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } 
            

        }

    }

    輸出:
    e9
    9d
    9e
    e5
    b8
    b8
    e5
    a5
    bd
    非常好

    posted @ 2010-02-26 13:39 BlakeSu 閱讀(199) | 評論 (0)編輯 收藏

    狀態模式與策略模式的重要區別

    是否需要在State類或Strategy類中訪問Context.
    狀態模式通常需要調用Context中的方法,以改變Context的狀態。
    Strategy通常不需要。

    posted @ 2010-02-23 17:50 BlakeSu 閱讀(326) | 評論 (0)編輯 收藏

    linux正則表達式


    記號 含義 舉例 匹配
    . 任何字符 a.. a后兩個字符
    ^ 行首 ^wood 位于行首的wood
    $ 行尾 x$
    ^INSERT$
    ^$
    位于行尾的x
    只包含字符串INSERT的行
    不包含任何字符的行
    * 前導的正則表達式重復0或若干次 x*
    xx*
    .*
    w.*s
    0或若干次連續的x
    1或多個連續的x
    0或若干個字符
    以w開始,s結尾的任何字符串
    [字符表] 字符表中的任一 [tT]
    [a-z]
    [a-zA-Z]
    小寫或大寫的t
    小寫字母
    字母(大寫或小寫)
    [^字符表] 任一不在字符表中的字符 [^0-9]
    [^a-zA-Z]
    任何數字
    非字母
    \{min,max\} 前導的正則表達式重復至少min次,最多max次 X\{1,5\}
    [0-9]\{3,9\}
    [0-9]\{3\}
    [0-9]\{3,\}
    最少1個,最多5個x
    3到9個數字
    正好3個數字
    至少3個數字
    \(…\) 將小括號中匹配的字符串存儲到下一個寄存器中(1-9) ^\(.\)
    ^\(.\)\1
    行中第1個字符存到1號寄存器
    行首兩個字符,且它們相同

    如下命令含有正則表達式: cut paste sed tr grep sort uniq

    posted @ 2010-02-11 15:01 BlakeSu 閱讀(274) | 評論 (0)編輯 收藏

    開源框架(spring struts2 tomcat)源碼下載地址

    spring

    svn checkout https://src.springframework.org/svn/spring-framework/trunk spring-framework

      ant resolve

    struts2

    svn checkout http://svn.apache.org/repos/asf/struts/struts2/trunk struts2
    svn checkout http://svn.apache.org/repos/asf/struts/xwork/trunk/ xwork

     mvn install
     mvn eclipse:eclipse

    tomcat6

    svn checkout http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk tc6.0.x
     1.下載ant 1.6.x
     2. 命令行下執行 ant download,下載依賴jar.

    posted @ 2010-02-07 10:41 BlakeSu 閱讀(461) | 評論 (0)編輯 收藏

    spring 計時器類 StopWatch

     StopWatch

    posted @ 2010-02-05 16:08 BlakeSu 閱讀(540) | 評論 (0)編輯 收藏

    [李琨]REST的主要優勢到底是什么?

    在JavaEye論壇上回答網友joyjiang的疑問:“REST的優勢到底是什么?開發效率?文檔的管理?url的直觀?還是其它的什么優勢呢?”

    REST的主要優勢在我看來其實在于它是一種對于服務器的更加有效的抽象方式。

    對于基于網絡的應用來說,你怎么樣看待服務器,就會產生什么樣的架構風格,隨之產生與該架構風格相關的交互模式。

    RPC架構風格將服務器看作是由一些過程組成,客戶端調用這些過程來執行特定的任務。SOAP就是RPC風格的一種架構。過程是動詞性的(做某件事),因此RPC建模是以動詞為中心的。

    分布式對象架構風格認 為服務器是由一些對象和對象上的方法組成,客戶端通過調用這些對象上的方法來執行特定的任務。并且客戶端調用這些對象上的方法應該就像是調用本地對象上的 方法一樣,這樣開發就可以完全按照統一的面向對象方法來做。但是很可惜,這樣的抽象并不是很有效,因為分布式對象與本地對象存在著巨大的本質差別,想要掩 蓋這些差別很多時候甚至是有害無益的。

    REST架構風格并 沒有試圖掩蓋這些差別,而是將服務器抽象為一組離散資源的集合。資源是一個抽象的概念,而不是代表某個具體的東西。注意:要真正理解REST,就一定要增 強自己的抽象思維能力,充分理解到資源是抽象的。如果完全不具有抽象思維的能力,一定要將資源與數據庫中的一張表或服務器端的一個文件(HTML、 Servlet、JSP、etc.)一一掛起鉤來,就無法真正理解REST了。資源是名詞性的,因此REST建模是以名詞為中心的。

    上述 是目前基于網絡的應用的主要的三種抽象方式。這三種不同的抽象方式會嚴重影響客戶端與服務器的交互模式,而不同交互模式的交互效率差別相當大。分布式對象 的交互模式很多時候效率很低,因為掩蓋了分布式對象與本地對象的差別,很多時候都會導致細粒度的API(需要一再強調才能讓一些不明就里的架構初哥按照正 確的方式來做設計)。實踐已經證明,與RPC和分布式對象相比,REST是一種對于服務器更加有效的抽象方式,將會帶來粒度更大和更有效率的交互模式。這 樣的效果與Fielding設計REST的初衷是吻合的,REST就是專門為交互的性能和可伸縮性進行過優化的一種架構風格。而SOAP在設計的時候優先 考慮的從來不是性能和可伸縮性,而是互操作性。除非出現奇跡,否則你種什么,就應該長出來什么。你種的是瓜,長出來的就是瓜;你種的是豆,長出來的就是 豆。

    Fielding寫到:“REST提供了一組架構約束,當作為一個整體來應用時,強調組件交互的可伸縮性、接口的通用性、組件的獨立部署、以及用來減少交互延遲、增強安全性、封裝遺留系統的中間組件。

    有 人認為REST不是面向對象的,其實REST雖然沒有分布式對象那么面向對象,在我看來至少比RPC更加面向對象。按照《企業應用架構模式》,以動詞為中 心建模是什么?是不是就是事務腳本?以名詞為中心建模是什么?是不是就是領域模型?這就扯遠了,網絡通信是否一定需要實現為面向對象的形式,我認為是不需 要的。

    “REST的主要優勢在我看來其實在于它是一種對于服務器的更加有效的抽象方式。”
    這句話等于是,我先把一個骨架放在這里,還沒有用血肉來充實它,也就是還沒有舉出具體的實例來。具體的實例以后我們還需要來詳細討論。REST是非常簡練的,同時又是一種非常強大的抽象方式,在我看來就是從根本上簡化Web開發的一味良藥。

    posted @ 2010-02-05 10:57 BlakeSu 閱讀(237) | 評論 (0)編輯 收藏

    取用戶所有表的所有索引

    select index_name from dba_indexes where table_name
    in (select table_name from user_tables)

    posted @ 2010-01-29 10:08 BlakeSu 閱讀(145) | 評論 (0)編輯 收藏

    oracle優化新知識

    1.位圖索引用于數據倉庫,不能用于普通系統
    2.使用組合索引. 當大量字段同同時作為過濾條件時,使用組合索引會大大提高性能。
    建立組合索引時,注意小基數字段在前,大基數字段在后。
    3.同一字段出現在不同表要保持類型一致(確有需要,可使用函數索引)
    4.使用count(*)
    5.使用返回單個結果的查詢改寫外連接能取得較好的性能

    posted @ 2010-01-22 13:22 BlakeSu 閱讀(194) | 評論 (0)編輯 收藏

    Oracle中表連接的運行原理

    Oracle優化器會自動選擇以下三種方式的一種運行表連接,但在數據環境上配合強化選擇合適的方式或強制使用某種方式是SQL優化的需要:
     
       NESTED LOOP

    對于被連接的數據子集較小的情況,nested loop連接是個較好的選擇。nested loop就是掃描一個表,每讀到一條記錄,就根據索引去另一個表里面查找,沒有索引一般就不會是 nested loops。

    一般在nested loop中, 驅動表滿足條件結果集不大,被驅動表的連接字段要有索引,這樣就走nested loop。如果驅動表返回記錄太多,就不適合nested loops了。如果連接字段沒有索引,則適合走hash join,因為不需要索引。

    可用ordered提示來改變優化器默認的驅動表,可用USE_NL(table_name1 table_name2)提示來強制使用nested loop。

    HASH JOIN

    hash join是優化器做大數據集連接時的常用方式。優化器掃描小表(或數據源),利用連接鍵(也就是根據連接字段計算hash 值)在內存中建立hash表,然后掃描大表,每讀到一條記錄就來探測hash表一次,找出與hash表匹配的行。

    當 小表可以全部放入內存中,其成本接近全表掃描兩個表的成本之和。如果表很大不能完全放入內存,這時優化器會將它分割成若干不同的分區,不能放入內存的部分 就把該分區寫入磁盤的臨時段,此時要有較大的臨時段從而盡量提高I/O 的性能。臨時段中的分區都需要換進內存做hash join。這時候成本接近于全表掃描小表+分區數*全表掃描大表的代價和。

    至于兩個表都進行分區,其好處是可以使用parallel query,就是多個進程同時對不同的分區進行join,然后再合并。但是復雜。

    使用hash join時,HASH_AREA_SIZE初始化參數必須足夠的大,如果是9i,Oracle建議使用SQL工作區自動管理,設置WORKAREA_SIZE_POLICY 為AUTO,然后調整PGA_AGGREGATE_TARGET即可

    以下條件下hash join可能有優勢:

    兩個巨大的表之間的連接。

    在一個巨大的表和一個小表之間的連接。

    可用ordered提示來改變優化默認的驅動表,可用USE_HASH(table_name1 table_name2)提示來強制使用hash join。

    SORT MERGE JOIN

    sort merge join的操作通常分三步:對連接的每個表做table access full;對table access full的結果進行排序;進行merge join對排序結果進行合并。sort merge join性能開銷幾乎都在前兩步。一般是在沒有索引的情況下,9i開始已經很少出現了,因為其排序成本高,大多為hash join替代了

    通常情況下hash join的效果都比sort merge join要好,然而如果行源已經被排過序,在執行sort merge join時不需要再排序了,這時sort merge join的性能會優于hash join。

    在全表掃描比索引范圍掃描再通過rowid進行表訪問更可取的情況下,sort merge join會比nested loops性能更佳。

    可用USE_MERGE(table_name1 table_name2)提示強制使用sort merge join。

    posted @ 2010-01-15 12:05 BlakeSu 閱讀(376) | 評論 (0)編輯 收藏

    java 運行windows命令 并獲取輸出

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    public class ProcessTest {

        
    public static void main(String[] args) {
            
             ProcessBuilder pb 
    = new  ProcessBuilder ( "tasklist");  
             try {
                Process process 
    = pb.start();
                InputStream fis 
    = process.getInputStream();
                BufferedReader br 
    = new BufferedReader(new InputStreamReader(fis));

                String line 
    = null;
                StringBuffer cmdout 
    = new StringBuffer();
                
    while ((line = br.readLine()) != null) {
                    cmdout.append(line).append(
    "\n");
                }
                System.out.println(cmdout.toString().trim());
            } 
    catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    輸出如下:

    圖像名                       PID 會話名           會話#       內存使用
    ========================= ====== ================ ======== ============
    System Idle Process            0 Console                 0         28 K
    System                         4 Console                 0        324 K
    smss.exe                    1076 Console                 0        812 K
    csrss.exe                   1152 Console                 0      3,296 K
    winlogon.exe                1176 Console                 0     31,580 K
    services.exe                1220 Console                 0      4,684 K
    lsass.exe                   1232 Console                 0      1,672 K
    svchost.exe                 1408 Console                 0      6,236 K
    svchost.exe                 1496 Console                 0      5,036 K
    svchost.exe                 1656 Console                 0     38,656 K
    spoolsv.exe                 1872 Console                 0      8,000 K
    explorer.exe                 332 Console                 0     18,888 K
    avp.exe                      376 Console                 0     24,960 K
    db2dasrrm.exe                460 Console                 0     34,652 K
    TSVNCache.exe                672 Console                 0     12,476 K
    igfxtray.exe                1380 Console                 0      7,344 K
    hkcmd.exe                   1236 Console                 0      4,056 K
    igfxpers.exe                1428 Console                 0      3,468 K
    db2mgmtsvc.exe              1444 Console                 0     10,072 K
    RTHDCPL.exe                 1460 Console                 0     32,480 K
    igfxsrvc.exe                1572 Console                 0      3,772 K
    avp.exe                     1680 Console                 0      6,008 K
    db2systray.exe              1700 Console                 0     32,512 K
    ctfmon.exe                  1780 Console                 0      4,892 K
    picpick.exe                 1984 Console                 0      3,600 K
    QQ.exe                      2024 Console                 0     34,648 K
    dsNcService.exe              264 Console                 0      3,880 K
    365日歷.EXE                 1952 Console                 0     43,788 K
    CLCL.exe                    1028 Console                 0      8,252 K
    klnagent.exe                1052 Console                 0      3,196 K
    thunderbird.exe              352 Console                 0     38,692 K
    rtxc.exe                     472 Console                 0     29,968 K
    db2rcmd.exe                 1836 Console                 0     11,832 K
    TXPlatform.exe              2488 Console                 0      3,808 K
    firefox.exe                 2724 Console                 0    195,912 K
    cmd.exe                     2716 Console                 0         52 K
    sh.exe                      3936 Console                 0        152 K
    conime.exe                  2752 Console                 0      3,424 K
    eclipse.exe                 3060 Console                 0      2,592 K
    JAVAW.EXE                   2984 Console                 0    446,692 K
    EXCEL.EXE                   3232 Console                 0      1,936 K
    wmiprvse.exe                4084 Console                 0      6,368 K
    JAVAW.EXE                    320 Console                 0      6,860 K
    tasklist.exe                2936 Console                 0      4,812 K

    當運行其他命令 ,如dir等時,用如下寫法:

     
    ProcessBuilder pb = new  ProcessBuilder ( "cmd""/c""dir");


    posted @ 2010-01-13 13:49 BlakeSu 閱讀(590) | 評論 (0)編輯 收藏

    Ubuntu9.10正確有效關閉IPV6的方法

    Ubuntu下上網解析DNS慢有很大程度上是和IPV6有關,而目前國內大部分地方都還沒有IPV6網絡,所以一般用戶應該需要關閉IPV6

    網上流傳著很多IPV6的關閉方法,但是經過測試大部分都是針對老版本的,而且效果不好。

    這里提供一種方法作為參考

    /proc/sys/net/ipv6/conf/lo/disable_ipv6

    這個檔案,用cat指令可以看到 0 這個數字,將他設定為1就可以了。
    因為已經將ipv6編入kernel,因此在proc里面就可以看得到相關的設定。

    設定的方式有很多種,有的是用echo 1 >> [路徑]/檔桉名稱
    的方式,這種方式是每次開機以后就得要打一次。
    所以延伸出第二個方法,在rcS.d里面設定一個連結,去執行這個指令的script。
    第3個方法,就是設定sysctl.conf檔桉,也是最正統的做法。
    位置在
    /etc/sysctl.conf
    這個檔桉可以設定很多,包括要當成NAT時的封包轉發等等。
    要設定
    /proc/sys/net/ipv6/conf/lo/disable_ipv6
    這個檔桉,就是在sysctl.conf里面加上

    net.ipv6.conf.lo.disable_ipv6 = 1

    posted @ 2010-01-09 14:53 BlakeSu 閱讀(565) | 評論 (0)編輯 收藏

    Git: Branch from a tag

    In git, you can’t update a tag directly, but you can branch the code to create a new tag. Here’s how you would do that:

    First, you need to checkout the tag:

    git checkout <tag_name> 

    Then create a branch:

    git branch -b <branch_name>

    After you make your changes, commit them (there are a few ways to do this, keeping it simple):

    git commit -am 'my descriptive comment on this commit'

    You can create a new tag:

    git tag <new_tag_name>

    Then you can push the tag:

    git push --tags

    posted @ 2010-01-08 08:37 BlakeSu 閱讀(1099) | 評論 (0)編輯 收藏

    'git revert' Is Not Equivalent To 'svn revert'

    I just learned that if you have some changes in your working tree that you want to get rid of, you don't type 'git revert' like you might guess. No, that's what cvs, subversion, mercurial, and bazaar (to name a few) use revert to mean, but not git. With git, revert is used to undo actual commits. Thankfully, you can undo your revert with another 'git revert', I just learned. So let me repeat to be clear, if you have changes to your working files that you want to abandon, DO NOT do this:

    git revert HEAD

    That will undo your last commit. Do this instead:

    git reset --hard HEAD

    I'm glad I have that straightened out now. I'm wondering if /etc was really a good place for me to start out playing with git.

    UPDATE: Nearly two years later and I'm still getting comments on this. I'm glad I've been able to help people out this way. The discussion in the comments is good, and one thing I'd like to point out is that I now always use and recommend:

    git checkout filename

    (as recommended by Anonymous and others below) instead of git reset. I think the git stash trick from Nicolas is pretty cool too.

    posted @ 2010-01-06 14:48 BlakeSu 閱讀(659) | 評論 (0)編輯 收藏

    Linux內核版本號的意義

    內核版本指的是在Linus領導下的開發小組開發出的系統內核的版本號。第一數字叫主版本號,第二個叫次版本號,第三個叫修訂版本號。一般說來次版本號還 有特定的意義,以序號的第二位為偶數的版本表明這是一個可以使用的穩定版本,如2.0.35,而序號的第二位為奇數的版本一般有一些新的東西加入,是不一 定很穩定的測試版本,如2.1.88。這樣穩定版本來源于上一個測試版升級版本號,而一個穩定版本發展到完全成熟后就不再發展。
    總結一下:
    第一個數字表示大版本,相當于大升級了.
    第二個數字有兩個含義:大版本的小版本;偶數表示生產版(奇數表示測試版);
    第三個數字表示指定小版本的補丁包;如2.6.10 Linux內核的推出,表明一年中已經發布了10個版本.
    不過,2.6.x系列以前版本沒有帶有次小數點的版本號,即沒有四個數字組成的版本號,而在2.6.x系列中,從2.6.8.1內核開始,一直持續到2.6.11,較小的內核隱患和安全補丁被賦予了次小數點版本號(例如2.6.11.1)。
    但 值得注意的是.readhat linux內核的版本稍有不同如2.4.20-10,可以發現多了一組數字(10),該數字是建立(build)號。每個建立可以增加少量新的驅動程序或 缺陷修復。一些readhat 內核還帶“pp”,就是“pre-patch”的意思,是個內核的測試版本。

    posted @ 2010-01-05 11:40 BlakeSu 閱讀(606) | 評論 (0)編輯 收藏

    技術領導之路

     理解問題

     管理思維

     保證質量

    posted @ 2009-12-30 16:03 BlakeSu 閱讀(161) | 評論 (0)編輯 收藏

    PV,評判網站的標準

    PV(pageview),即頁面瀏覽量,或點擊量;通常是衡量一個網絡新聞頻道或網站甚至一條網絡新聞液沒滌的主要指標;當然,有時還會同時考察另外一個指標,即uv(unique visitor),指訪問某個站點或點擊某條新聞的不同IP地址的人數。

        PV之于網站,就像收視率之于電視,從某種程度上已成為投資者衡量商業網站表現的最重要尺度。從長遠看,很多網站也意識到,PV的追求需要和品牌的打造結合起來;但現代商業行為在投資者急功近利的評判壓力下,往往無奈為了使PV提升而不擇手段。

        一條新聞發布以后,其PV便可以加以跟蹤,通常是每5分鐘統計一次。不同網站的不 同頻道,對其所發布新聞的PV表現有一個大致的評判尺度。新聞發布后,一般PV值總有一個上升的過程。可以從不同時段來計算PV的單位時間變化幅度,有經 驗的網絡編輯,經過幾個5分鐘的數據積累,便能大致預料到這條新聞的PV峰值水平。如果這個水平不能令人滿意,則編輯就要采取一些手段,如“優化”標題、 增加圖片、挪動位置等。一般來說,通過這樣的“處理”,一條新聞的PV表現能有所改善,達到新的高峰。也就是說,網絡新聞的編輯手段影響著PV值。

        還有哪些因素對PV有影響呢?至少還有這些因素:新聞發布的時間。不同的時間段,上網的人數不同,訪問該站點的人數也不同,因此,有時PV的漲落,其主要貢獻,在于不同時段上網人數的自然波動。同樣一條新聞,在不同的時段發布,PV就會有差別。

        不同時段上網的人,其人口特征(性別、年齡、教育程度、閱讀旨趣等)不同,所以,同樣是一萬個上網的人,甚至同樣是對某個網站的一萬次訪問,不同時段,這一萬次訪問在不同頻道/內容上的分布是有差別的。所以PV的變化,與這些因素導致的變化有關。

        訪問的周期。對于一些常瀏覽的網站,我們可能一天之中會訪問幾次,這中間有一定的 時間間隔。這個間隔,很多時候和人們的現實工作節奏有關系。比如,不少人一上班會抽空瀏覽一下新聞,第二次再來看看又有什么新聞的時候,往往是上午中間休 息時,甚至是午飯后的休息時間。因此,即使其他因素不變,由于人們回訪網站的周期性,也會對新聞或網站的PV帶來影響。當然,由于不同的人回訪的周期長短 不一、時段不一,這個影響因素未必會導致明顯的波動,而可能分散在不同時段的PV表現中,但可以肯定的是,任何一個PV數據,也有這種回訪周期的因素所起 的作用。

        搭便車因素。比如一些突發事件,會導致人們對某一網站的訪問增加,但這些訪問的 初衷,本只是突發事件相關新聞。然而由于人們的新聞消費,往往具有不可預期性,所以常見的現象是,人們在看完想看的新聞后,還會順帶看看其他的。這一因 素,也可能對某條新聞(與突發事件無關)的PV有所貢獻。

        最后,偶然因素也對PV有一定影響,比如天氣因素,比如非典期間等等。

        由此看來,一個簡單的PV數據,其實是多種因素綜合貢獻的結果,所以有時的PV漲 落,實在不是完全可以通過編輯手段來加以引導和影響的。知道這一點很重要,因為這告訴我們,盲目地、不加具體分析地以PV來衡量成敗好壞,是不合理的。在 社會科學研究中,這種區分不同因素對某一個現象的貢獻,就是所謂的詳析模式。很多看似不變的東西,其實內部構成比例上發生了很大的變化。而有些看似變化的 東西,其相對關系其實沒有什么變化,只是一種單純的數量上的漲落。

        這使我想到那本《統計陷阱》,一本由一個記者所寫的通俗讀物。這本書的英文名稱直譯,叫“如何用統計數據說謊”。

    posted @ 2009-12-21 11:42 BlakeSu 閱讀(173) | 評論 (0)編輯 收藏

    徹底理解JavaHelp結構的好處

    Sun微系統的JavaHelp系統是一種應用程序幫助技術,它可以在所有支持Java的平臺和瀏覽器中運行只要它是一個純粹的Java產品。通過 applet和Java應用程序,在其他環境下,比如在互聯網或企業內部互聯網中,它是理想的使用對象。在本文中,我將回顧JavaHelp的主要作用, 并闡明它的簡單使用方法。

        優點

        JavaHelp通過使用Java基礎類(JFC) 軟件組件來實現,這使得開發戶自定義界面和功能變得靈活輕松。您可以輕而易舉地將應用程序的幫助信息嵌入到應用程序之中,或者嵌入到另一個獨立的窗口里。JFC 還具有通過自定義導航控件拓展幫助功能的能力。

        JavaHelp使動態更新幫助數據或將其存儲在一個便利的位置變得簡單易行,不管是在客戶端還是服務器端。內容窗口使用HTML 3.2格式顯示話題,使內容設計變得簡單。標準導航提供內容表單(TOC)、索引和全文搜索。(TOC和索引都遵循W3C標準。)

        JavaHelp Data Sheet提供以下信息:TOC提供層疊式和擴展式話題展示,無限量等級層次和多重TOC的合并。TOC與內容閱讀器同步顯示,也就是說顯示的話題在 TOC中被突出。索引支持多重索引的合并。全文搜索被設計得很靈活,并且可以配置。搜索引擎也可置于用戶或服務器中的任一方。

        幫助內容和搜索引擎被壓縮成一個使用標準JAR格式的單個文件。盡管為了使存儲和訪問更具靈活性,推薦將所有文件壓縮成一個單獨的文件,但是您仍然可以將 所有文件以擴展的格式保存在目錄中。您可以在自定義編寫的導航器、搜索引擎、標準JavaHelp閱讀器或在任何HTML顯示中,包括標準Web瀏覽器 中,查看和導航內容。

        JavaHelp API提供一個上下文敏感幫助和ID映射的機制。您可以將多重組件的幫助信息用JavaHelp API合并,這樣用戶就看到一個單獨的完整文檔。合并機制可以應用于TOC、索引和搜索數據庫。

        特性

        JavaHelp有兩個主要版本:1.1.3和2.0版。最早支持JavaHelp 2.0的Java版本是J2SE 1.2.2,因此您無需擔心自己的代碼是否支持JavaHelp。JavaHelp系統由一個特性完整的、可擴展的規范、API以及一個參考執行組成。

        標準JavaHelp系統的主窗口:有三個顯示窗口,在您退出窗口時并未被關閉,依然可配置。在默認情況下,一個主要窗口有以下三個窗格:工具欄、導航窗口和內容窗口。見圖表1。

        用戶可以應用多種方式通過內部應用程序調用在線幫助,例如,當一個用戶從幫助菜單中選擇一項,或在應用程序GUI中點擊幫助按鈕,JavaHelp系統提 供一個簡便的界面,通過這個界面,應用程序要求話題的ID 得以顯示。然后JavaHelp系統將話題ID與相應的URL相連接并將其顯示出來。

        ID被映射到一個被稱作映射文件的JavaHelp系統元數據文件中的URL上。例如,當為文件選擇對話框編碼時,開發人員要求話題ID fc_help在當對話框底部的幫助按鈕被點擊時顯示。在映射文件中,ID fc_help被定義為名為 FileChooser.html的文件,使用以下XML句法:

        將文件名(或URL)的規范從程序代碼分離為內容的作者提供了控制與話題ID相關的信息的自由。

        工具提示是一個顯示給用戶的簡短信息,當光標停留在一個按鈕上的時間間隔長于閾值時它就會出現。您還可以將工具提示信息納入JavaHelp系統數據。

        JavaHelp系統數據具有調用在線幫助的能力,能夠在應用程序GUI中描述圖形組件。用戶操縱激活語境敏感幫助,然后將組件以問題形式特定化。與組件相聯系的ID被顯示。您可以從TOC、索引導航或主要窗口的內容窗格中顯示幫助話題。

        輕型組件

        輕型組件能夠向幫助話題添加功能。這些組件與Java的applet相似,但它們的加載和執行更為迅速。一個幫助的創作者能夠使用已經在JavaHelp 中執行的輕型組件;這個組件執行彈出窗口和次級窗口。在HTML 話題文件中使用輕型組件,您可以使用HTML<object>標記,正如列表A中的例子所顯示的。

        在例子中,彈出的對象包括文件../topicB/glossary_def.html,用戶點擊的對象(viewerActivator)是個鏈接,窗 口類型屬于彈出型,窗口大小為300x400,用戶在鏈接中看到的內容是“Click here(點擊這里)”。

        Java開發商還可以創造新的輕型組件。例如,這樣的組件可能為幫助話題添加動畫和多媒體功能。

        要求抽象查看的輕型組件必須執行javax.javahelp.impl.ViewAwareComponen。這些組件執行setViewData() 方法。這個組件能夠根據抽象查看中的信息決定它所執行的環境。(注意:要訪問抽象查看,您應該使用JavaHelp API。)在列表B中,文檔對象下面的編碼片斷來自于抽象查看。

        需要更多關于創造Java輕型組件的信息,請參閱相關文件。

        JavaHelp編寫工具

        有很多通過商業途徑可以得到的編寫工具能夠為您的應用程序編寫和維護一個完美的幫助系統。最有名的三個是Software7 Gmbh的Helen 1.5、Solutionsoft的HelpBreeze和Pivotonic的JawaHelpAuthor。所有這些第三方產品都支持Java 2 和Java 1.1標準。需要更多關于編寫工具的信息,請參閱Sun的幫助編寫工具頁面。

        試試看吧

        如果JavaHelp聽起來像是一個您認為您的用戶和伙伴開發商都喜歡的系統的話,那么從Sun Microsystem公司的網站上立刻下載吧。這個地址提供了安裝過程所需要的所有信息。

    posted @ 2009-12-21 09:23 BlakeSu 閱讀(198) | 評論 (0)編輯 收藏

    在Linux中開啟IP轉發

    本文源地址: http://easwy.com/blog/archives/enable-ip-forward-on-linux/

    Linux系統缺省并沒有打開IP轉發功能,要確認IP轉發功能的狀態,可以查看/proc文件系統,使用下面命令:

    cat /proc/sys/net/ipv4/ip_forward

    如果上述文件中的值為0,說明禁止進行IP轉發;如果是1,則說明IP轉發功能已經打開。

    要想打開IP轉發功能,可以直接修改上述文件:

    echo 1 > /proc/sys/net/ipv4/ip_forward

    把文件的內容由0修改為1。禁用IP轉發則把1改為0。

    上面的命令并沒有保存對IP轉發配置的更改,下次系統啟動時仍會使用原來的值,要想永久修改IP轉發,需要修改/etc/sysctl.conf文件,修改下面一行的值:

    net.ipv4.ip_forward = 1

    修改后可以重啟系統來使修改生效,也可以執行下面的命令來使修改生效:

    sysctl -p /etc/sysctl.conf

    進行了上面的配置后,IP轉發功能就永久使能了

    posted @ 2009-12-18 13:41 BlakeSu 閱讀(1941) | 評論 (0)編輯 收藏

    linux庫管理

     Linux下的庫文件分為共享庫和靜態庫兩大類,它們兩者的差別僅在程序執行時所需的代碼是在運行時動態加載的,
      還是在編譯時靜態加載的。區分庫類型最好的方法是看它們的文件后綴,通常共享庫以.so(Shared Object的縮寫)結尾,
      靜態鏈接庫通常以.a結尾(Archive的縮寫)。在終端缺省情況下,共享庫通常為綠色,而靜態庫為黑色。

    庫操作命令

      Linux庫操作可以使用命令完成,目前常用的命令是ldd和ldconfig。

     1.ldd
      ldd是Library Dependency Display縮寫,它的作用是顯示一個可執行程序必須使用的共享庫。

      $ ldd /usr/bin/mesg
      libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7eaf000)
      /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7feb000)

     2.ldconfig
      庫安裝到系統以后,為了讓動態鏈接庫為系統所認識及共享,就需要運行ldconfig。ldconfig命令的用途,
      主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如lib*.so*),
      進而創建出動態裝入程序(ld.so)所需的連接和緩存文件。緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表,
      ldconfig通常在系統啟動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令。

     (1)命令格式
       ldconfig [選項] [libs]

     (2)主要選項
       -v或–verbose ldconfig將顯示正在掃描的目錄、搜索到的動態鏈接庫,以及它所創建的連接的名字。

       -f CONF 指定動態鏈接庫的配置文件為CONF,系統默認為/etc/ld.so.conf。

       -C CACHE 指定生成的緩存文件為CACHE,系統默認的是/etc/ld.so.cache,文件存放已排好序的可共享的動態鏈接庫的列表。

       -p或–print-cache 讓ldconfig打印出當前緩存文件所保存的所有共享庫的名字。

       -r ROOT 改變應用程序的根目錄為ROOT。

       -n ldconfig僅掃描命令行指定的目錄,不掃描默認目錄(/lib、/usr/lib),也不掃描配置文件/etc/ld.so.conf所列的目錄。

      運行沒有選項的ldconfig命令時,用于更新高速緩沖文件。這個命令主要用于高速緩沖DNS服務器(Caching DNS Server)。
      高速緩沖DNS服務器的原理是提供查詢的歷史記錄,并且利用這些記錄來提高查詢的效率。

      當某個查詢是第一次被發送到高速緩沖DNS服務器時,高速緩沖DNS服務器就將此查詢的整個過程記錄下來,
      在一定的時期內用它來回答所有相同的查詢,從而減少整個DNS系統的負擔并且提高查詢速度。

    庫的升級

      Linux系統軟件更新很快,新的核心幾乎每幾個星期就公布一次,其它軟件的更新也是非常頻繁。多數情況下,
      盲目跟隨潮流的升級并不必要,如果確實需要新版本的特性時再升級。換句話說,不要為了升級而升級。
      Linux系統中多數軟件都是用共享庫來編譯的,其中包含了在不同程序之間共享的公用子例程。

      在運行某個程序時,如果看到如下信息:“Incompatible library version.”則表明需要將該庫升級到程序所需要的版本。
      庫是向下兼容的,也就是說,用老版本庫編譯的程序可以在新安裝的版本庫上運行,反之則不行。

      Linux庫函數的升級是一項重要的工作,往往與其它軟件包的升級有一定關聯作用,所以操作前一定要備份文件。
      下面看一下如何把Glibc 2.2.4.13升級至2.3.2版本,其過程如下:

      1.下載.gz壓縮文件并解壓

        在GUN C網站下載的四個.gz壓縮文件,解壓至一臨時目錄中:
        cd /usr/caolinux
        tar xzvf glibc-2.3.2.tar.gz
        cd glibc-2.3.2
        tar xzvf ../glibc-linuxthreads-2.3.2.tar.gz
        tar xzvf ../glibc-crypt-2.3.2.tar.gz
        tar xzvf ../glibc-localedata-2.3.2.tar.gz

      2.建立庫函數的安裝目錄
        mkdir /usr/higlibc
        cd /usr/higlibc

      3.建立編譯目錄
        mkdir cao
        cd cao
        ./configure –enable-add-ons=linuxthreads,crypt,localedata -prefix=/usr/higlibc

      4.編譯與安裝
        make
        make check
        make install

      5.改變數據庫的鏈接
        ln -s /usr/higlibc/lib/ld-linux.so.2 /lib/ld-linux.so.2

        然后,修改/etc/ld.so.conf,加入一行/usr/higlibc/lib,執行下面代碼:
        ldconfig -v

        更新/etc/ld.so.cache的內容,列出每個庫的版本號,掃描目錄和所要創建及更新的鏈接。

      6.更改GCC設置
        cd /usr/lib/gcc-lib
        cp -r i386-redhat-linux higlibc

      7.更新符號鏈接
        cd /usr/higlibc/include
        ln -s /usr/src/linux/include/linux
        ln -s /usr/src/linux/include/asm
        ln -s /usr/X11R6/include/X11

      8.測試并完成

    posted @ 2009-12-18 09:25 BlakeSu 閱讀(158) | 評論 (0)編輯 收藏

    Boot-Up Manager 介紹

        在Windows下,大家應該知道系統里面有很多服務,掌控著系統中各個設備和功能的啟動,停止,暫停等操作。
    在Ubuntu下,自然也是一樣,只不過Linux下對服務的管理,要比windows高級N多,也細致很多。
    因此linux的服務這部分,一直讓許多新人們望而卻步。

       這次的教程,我將推薦給大家一個Ubuntu下的圖形化的,管理系統服務的軟件。名字叫:Boot-Up Manager,簡稱:BUM。

    一. 基礎知識補充

       在Linux系統下,各個服務都是運行在一定的”運行級別“下的。我們先來認識下運行級別,在Linux系統下,系統有6個級別,分別是:

       *運行等級 S:開機進程中的第一個運行等級。
       *運行等級 1:(single-user)單用戶模式。為單用戶模式,就像Win9x 下的安全模式類似。
       *運行等級 2,3,4,5: multi-user多用戶環境,細分的話,是:
         (2) 為多用戶模式,但是沒有NFS 支持。
         (3) 為完整的多用戶模式,是標準的運行級。
         (4) 一般不用,在一些特殊情況下可以用它來做一些事情。
            例如在筆記本電腦的電池用盡時,可以切換到這個模式來做一些設置。
         (5) 就是 X11 ,進到 X Window 系統了。
       *運行等級 0:(halt)關閉計算機
       *運行等級 6:(reboot)重起計算機

       我們以Ubuntu Linux為例,大家可以在 /etc/目錄下找到類似: rcS.d,rc1.d,rc2.d等等這樣的文件夾,應該是有 7 個。
       這些文件夾當中,就是用來存儲在相應(數字)等級下要運行(或者不運行)的服務的”鏈接“。大家可以隨便著一個進去看看,
       它里面的文件應該都是在左上角帶一個”箭頭“的。這些文件具體的鏈接,都是統一的,指向: /etc/init.d/ 這個文件夾下的文件。

       這7個rc*.d文件下的文件,有個共性,就是:若文件夾下的鏈接文件開頭子母是大寫的,那么它鏈接的在 /etc/init.d 下的對應腳本將被調用并開啟,
       該進程將被執行。 相反,如果是小寫字母,則代表該服務不會被運行。

       此外,鏈接文件的開頭S(start)或K(kill)后緊接的數字是指運行的順序,數字小的運行在前。

    二.對系統服務的“控制”

       由上面的內容,我們應該知道,其實想開啟,關閉一個服務,只需要將運行級的鏈接文件名的第一個字母由大寫改為小寫 (S–>s,K–>k)。
       或者,我們先說我這次的教程推薦的“圖形化”控制方式。

       1. BUM 的安裝: sudo apt-get install bum ,回車就是了,這個沒什么問題的
       2. BUM 的運行: 這個軟件安裝后,“應用程序”里面沒有快捷方式的。可以從終端里面輸入:sudo bum 來運行
       3. BUM 的使用: 我們先來看看他的界面吧,每次運行,它都會先掃描系統的服務項目,掃描完成就是這個樣子。
          然后,我們勾選:Advanced,切換到“高級”模式,然后選擇”Services“,就能看到我們當前系統的”服務“了。

         這個軟件使用很簡單,如果我們要禁用某個服務,在列表中找到它,然后去掉前面的“勾”,點擊“應用”就行了。
         夠簡單吧?這個軟件,除了可以控制服務的開啟和關閉,還能控制系統的“開關機腳本(Startup and shutdown scripts),
         操作方法一樣的,有需要的兄弟們可以看下。

       4. 用”命令“的方法來控制服務。

        剛才我們說過了,其實禁用某個服務,就是把 rc*.d下的對應文件,開頭字母改成小寫。因此我們可以這樣做,比如我要禁用”mdadm-raid”這個服務,
        它是管理系統的 Raid(磁盤陣列)的,如果你沒有陣列,自然不需要了。
          sudo mv /etc/rcS.d/S04mdadm-raid /etc/rcS.d/s04mdadm-raid
        估計喜歡玩“命令”的人,肯定都會選擇這樣做吧,呵呵,命令控們~

      5. 系統服務的常見”操作“。在linux系統里面,如果你需要暫時性的對某個服務的運行狀態進行操作,一般都可以這樣操作:
         (1)運行服務: sudo /etc/init.d/服務名 start
         (2)停止服務: sudo /etc/init.d/服務名 stop
         (3)重啟服務: sudo /etc/init.d/服務名 restart
            比如:sudo /etc/init.d/gdm restart

    posted @ 2009-12-17 15:37 BlakeSu 閱讀(387) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 一级黄色免费网站| 美景之屋4在线未删减免费| 亚洲一区在线免费观看| 特级aaaaaaaaa毛片免费视频| 精品国产一区二区三区免费| 毛片a级毛片免费播放100| 怡红院亚洲怡红院首页| 亚洲无吗在线视频| 中文字幕免费观看全部电影| 久久久久国色AV免费观看性色| 中文字幕专区在线亚洲| 亚洲国产精品一区二区三区在线观看| 在线免费视频你懂的| 成年美女黄网站色大免费视频| 亚洲精品无码鲁网中文电影| 亚洲最大天堂无码精品区| 99久久国产精品免费一区二区 | 亚洲一卡2卡4卡5卡6卡在线99 | 77777亚洲午夜久久多喷| 久草免费福利在线| 成人午夜免费福利| 亚洲永久永久永久永久永久精品| 暖暖免费中文在线日本| 青青久在线视频免费观看| 亚洲国产成人高清在线观看| 日韩精品无码永久免费网站| 四虎国产精品免费久久| 亚洲AV无码久久寂寞少妇| 青青青视频免费观看| 成人毛片免费观看| 亚洲国产成人久久| 国产在线精品免费aaa片| 免费在线视频一区| 亚洲一区二区三区丝袜| 一级毛片成人免费看免费不卡| 亚洲精品无码永久在线观看| 亚洲精品亚洲人成在线| 免费v片在线观看视频网站| 日本红怡院亚洲红怡院最新| 色多多A级毛片免费看| 免费黄色大片网站|