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

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

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

    posts - 41, comments - 15, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2012年8月6日

    有時候在客戶端使用svg畫圖,而在服務器端需要同樣的圖片,在服務器端重新畫一遍是非常費事的。這時候我們就可以利用已有的svg直接通過下面的類轉換成png格式。

    使用這個方法需要引用batic相關的包,maven pom文件如下:

    <!-- svg 生成png格式圖片  -->
    <dependency><groupId>batik</groupId><artifactId>batik-svggen</artifactId><version>1.6</version></dependency>        
    <dependency><groupId>batik</groupId><artifactId>batik-awt-util</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-bridge</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-css</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-dom</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-gvt</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-parser</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-script</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-svg-dom</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-transcoder</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-util</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-xml</artifactId><version>1.6</version></dependency>
    <!-- 此處不能使用2.9.1版本,使用2.9.1生成png會失敗 -->
    <dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.5.0</version></dependency>
    <dependency><groupId>xml-apis</groupId><artifactId>xmlParserAPIs</artifactId><version>2.0.2</version></dependency>
    <dependency><groupId>org.axsl.org.w3c.dom.svg</groupId><artifactId>svg-dom-java</artifactId><version>1.1</version></dependency>
    <dependency><groupId>xml-apis</groupId>    <artifactId>xml-apis</artifactId><version>2.0.0</version></dependency>
    <dependency><groupId>org.w3c.css</groupId> <artifactId>sac</artifactId>    <version>1.3</version></dependency>
    <!-- svg 生成png格式圖片結束  -->
    package com.yhb.web.util;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URL;
    import org.apache.batik.transcoder.TranscoderException;
    import org.apache.batik.transcoder.TranscoderInput;
    import org.apache.batik.transcoder.TranscoderOutput;
    import org.apache.batik.transcoder.image.PNGTranscoder;
    public final class FileUtil {
    /** 
         *@Description: 將svg字符串轉換為png 
         *@Author: 
         *@param svgCode svg代碼 
         *@param pngFilePath  保存的路徑 
         *@throws IOException io異常 
         *@throws TranscoderException svg代碼異常 
        */  
    public static void convertToPng(String svgCode,String pngFilePath) throws IOException,TranscoderException{  
     
            File file = new File (pngFilePath);  
      
            FileOutputStream outputStream = null;  
            try {  
                file.createNewFile ();  
                outputStream = new FileOutputStream (file);  
                convertToPng (svgCode, outputStream);  
            } finally {  
                if (outputStream != null) {  
                    try {  
                        outputStream.close ();  
                    } catch (IOException e) {  
                        e.printStackTrace ();  
                    }  
                }  
            }  
        }  
    /** 
         *@Description: 將svgCode轉換成png文件,直接輸出到流中 
         *@param svgCode svg代碼 
         *@param outputStream 輸出流 
         *@throws TranscoderException 異常 
         *@throws IOException io異常 
         */  
        public static void convertToPng(String svgCode,OutputStream outputStream) throws TranscoderException,IOException{  
            try {  
            byte[] bytes = svgCode.getBytes ("UTF-8");  
                PNGTranscoder t = new PNGTranscoder ();  
                TranscoderInput input = new TranscoderInput (new ByteArrayInputStream (bytes));  
                TranscoderOutput output = new TranscoderOutput (outputStream);  
                t.transcode (input, output);  
                outputStream.flush ();  
            } finally {  
                if (outputStream != null) {  
                    try {  
                        outputStream.close ();  
                    } catch (IOException e) {  
                        e.printStackTrace ();  
                    }  
                }  
            }  
        }  
    }

    posted @ 2015-10-19 15:17 yuhaibo736 閱讀(314) | 評論 (0)編輯 收藏

    方法1: 設定環(huán)境變量
    set NLS_SORT=SCHINESE_RADICAL_M ;export NLS_SORT (sh)
    or setenv NLS_SORT SCHINESE_RADICAL_M (csh)
    or regedit 
    HKLC/SOFTWARE/ORACLE/home0/NLS_SORT        (win)

    方法2: 在session中修改
    alter session set NLS_SORT='SCHINESE_RADICAL_M'

    方法3: 直接使用NLSSORT函數 (推薦)
    select name,id from t
    order by NLSSORT(name,'NLS_SORT = SCHINESE_STROKE_M')

    設置NLS_SORT值:

    SCHINESE_RADICAL_M 按照部首(第一順序)、筆劃(第二順序)排序 

    SCHINESE_STROKE_M 按照筆劃(第一順序)、部首(第二順序)排序 

    SCHINESE_PINYIN_M 按照拼音排序

    posted @ 2014-08-29 14:13 yuhaibo736 閱讀(1286) | 評論 (0)編輯 收藏

        在IBATIS中,框架內置了對OSCache的支持,如果我們想使用EHCache,則需要通過我們手工實現(xiàn)來完成二級緩存的功能機制。

        在mybatis中,開發(fā)組織只提供了一些默認的二級緩存實現(xiàn)的機制,并沒有直接內置的支持OSCache和EHCache等二級緩存機制,而是作為一個集成jar包來提供二級緩存的實現(xiàn),在官方網站上我們可以找到mybatis-ehcache-1.0.1-bundle.zip,mybatis-oscache-1.0.1-bundle.zip等ehcache和oscache提供二級緩存的獨立工具包. 這里我就拿oscache在mybatis中的使用來舉例說明:

           1.   將mybatis-oscache-1.0.1-bundle.zip中涉及到的jar包放入到classpath路徑下 
                 maven下可以這樣配置
                   <dependencies>  
                        
    ... 

                        <dependency> 

                            <groupId>org.mybatis.caches</groupId> 

                            <artifactId>mybatis-oscache</artifactId>      
                             <version>1.0.2-SNAPSHOT</version> 

                        </dependency>             

                        <dependency>
                            <groupId>javax.jms</groupId>
                            <artifactId>jms</artifactId>
                            <version>1.1</version>
                        </dependency>

                        <dependency>
                             <groupId>opensymphony</groupId>
                             <artifactId>oscache</artifactId>
                             <version>2.4</version>
                             <exclusions>       
                                   <exclusion>
                                       <groupId>com.sun.jdmk</groupId>
                                       <artifactId>jmxtools</artifactId>
                                   </exclusion>
                               <exclusion>
                               <groupId>com.sun.jmx</groupId>
                               <artifactId>jmxri</artifactId>
                           </exclusion>
                         </exclusions>
                    </dependency>

                        ... 

                    </dependencies>

           2.   在mapper文件中的配置如下:

                 <mapper namespace="org.test.AuthMapper" >         

                     <cache  type="org.mybatis.caches.oscache.OSCache"/>

                 </mapper>
                注意下面兩點
                 (a)在
    <select id="getAuth" parameterType="Map" resultType="Auth"  useCache="false">中使用useCache="false"或useCache="true"來決定是否使用二級緩存。    
                 (b)在增刪改中<insert id="insertAuth" parameterType="Auth"  flushCache="true">使用flushCache="true"或flushCache="flase"來決定對這些進行操作后清空該xml文件中所有查詢語句的二級緩存。 

           3.  在src目錄下創(chuàng)建一個oscache.properties的屬性文件,在里面指定緩存的各種屬性的設置:
                 cache.memory=true             
                 cache.path=c:\\myapp\\cache
                 cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
                 cache.persistence.overflow.only=true
                 cache.capacity=100000

                

    posted @ 2014-08-11 18:22 yuhaibo736 閱讀(2731) | 評論 (0)編輯 收藏

    import java.awt.Color;
    import java.io.FileOutputStream;

    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.Rectangle;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfPCell;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;

    public class CellEvents {


     /**
      * @param args
      */
     public static void main(String[] args) {
      Object[] objArr = new Object[]{100,20,300};
      
      Document document = new Document(PageSize.A4.rotate(),50,50,50,50);
      try{
       //bfSongti = BaseFont.createFont("/simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
       Font songtiSFivefont = new Font(BaseFont.createFont("/simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED), 9f);//宋體小五號字
             //設置存放位置
             PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
             document.open();
     
             PdfPTable table = new PdfPTable(5);
       table.setSpacingBefore(10f);
       table.getDefaultCell().setPadding(5);
       //HowbuyBorderPdfPTableEvent event = new HowbuyBorderPdfPTableEvent();
       //table.setTableEvent(event);
       //table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
       table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
       PdfPCell cellTitle = new PdfPCell(new Phrase("總資產\n(萬元)",songtiSFivefont));
       cellTitle.setBorderWidth(2f);
       cellTitle.setBackgroundColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       cellTitle.setMinimumHeight(25);
       table.addCell(cellTitle);
     
       cellTitle = new PdfPCell(new Phrase(""));
       cellTitle.setBorder(Rectangle.NO_BORDER);
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
       
       cellTitle = new PdfPCell(new Phrase("當前收益\n(萬元)",songtiSFivefont));
       cellTitle.setBorderWidth(2f);
       cellTitle.setBackgroundColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
     
       cellTitle = new PdfPCell(new Phrase("",songtiSFivefont));
       cellTitle.setBorder(Rectangle.NO_BORDER);
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
       
       
       cellTitle = new PdfPCell(new Phrase("累計收益\n(萬元)",songtiSFivefont));
       cellTitle.setBorderWidth(2f);
       cellTitle.setBackgroundColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
       
       float[] widths2 = { 24.5f, 12.25f,24.5f,12.25f,24.5f};

       table.setWidths(widths2);
       
       table.setHorizontalAlignment(Element.ALIGN_LEFT);//
       table.setWidthPercentage(70);
       double zzc = objArr[0]==null ? 0:Double.parseDouble(objArr[0].toString());
       double dqsy = objArr[1]==null ? 0:Double.parseDouble(objArr[1].toString());
       double ljsy = objArr[2]==null ? 0:Double.parseDouble(objArr[2].toString());
       PdfPCell cell1 = new PdfPCell(new Phrase(String.valueOf(zzc),songtiSFivefont));
       cell1.setBorderWidth(2f);
       cell1.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       cell1.setMinimumHeight(20);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase("",songtiSFivefont));
       cell1.setBorder(Rectangle.NO_BORDER);
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase(String.valueOf(dqsy),songtiSFivefont));
       cell1.setBorderWidth(2f);
       cell1.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase("",songtiSFivefont));
       cell1.setBorder(Rectangle.NO_BORDER);
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase(String.valueOf(ljsy),songtiSFivefont));
       cell1.setBorderWidth(2f);
       cell1.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       document.add(table);
      }catch(Exception ex){
       ex.printStackTrace();
      }
            document.close();

     }

    }

    posted @ 2014-06-24 16:27 yuhaibo736 閱讀(1463) | 評論 (0)編輯 收藏

    相信很多人都聽過nginx,這個小巧的東西慢慢地在吞食apache和IIS的份額。那究竟它有什么作用呢?可能很多人未必了解。

    說到反向代理,可能很多人都聽說,但具體什么是反向代理,很多人估計就不清楚了。摘一段百度百科上的描述:

    Html代碼 復制代碼 收藏代碼
    1. 反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發(fā)給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現(xiàn)為一個服務器。 

    這里講得很直白。反向代理方式實際上就是一臺負責轉發(fā)的代理服務器,貌似充當了真正服務器的功能,但實際上并不是,代理服務器只是充當了轉發(fā)的作用,并且從真正的服務器那里取得返回的數據。這樣說,其實nginx完成的就是這樣的工作。我們讓nginx監(jiān)聽一個端口,譬如80端口,但實際上我們轉發(fā)給在8080端口的tomcat,由它來處理真正的請求,當請求完成后,tomcat返回,但數據此時沒直接返回,而是直接給nginx,由nginx進行返回,這里,我們會以為是nginx進行了處理,但實際上進行處理的是tomcat。

    說到上面的方式,也許很多人又會想起來,這樣可以把靜態(tài)文件交由nginx來進行處理。對,很多用到nginx的地方都是作為靜態(tài)伺服器,這樣可以方便緩存那些靜態(tài)文件,比如CSS,JS,html,htm等文件。

    閑話就不多說了,我們直接來看看nginx怎么使用。

    1)要用到的軟件當然要下載啦。到nginx官網下一個。http://nginx.org/en/download.html可以到這里去下。我現(xiàn)在用的版本是1.1.7,但基本上以后的版本都兼容,而且我們用到的并不涉及到太底層的,應該不會有什么變化。

    這里,由于我的是windows,當然下windows版啦。下完后首先要啟動吧。進入到nginx文件夾,直接start nginx就OK了。

    比如我下載后放在D:\software\developerTools\server\nginx-1.1.7,直接cmd后cd D:\software\developerTools\server\nginx-1.1.7,有些不習慣命令行的可能會奇怪,它沒有進行到那個文件夾。windows并不會在分區(qū)間跳轉,除非你自己指定了。所以我們要直接d:如下:

    然后,我們直接start nginx,這里也許你會看到一個窗口一閃而過,根據我們使用tomcat的經驗,如果一閃而過,證明有錯誤了,是吧?但實際上不是。

    此時我們打開任務管理器,可以看到兩個nginx.exe在那里好好的。這說明我們已經啟動了,至于為什么兩個,我們這里不深究。

    現(xiàn)在,我們已經啟動了nginx,這時就可以啟動tomcat,想著直接訪問http://localhost就可以直接訪問tomcat了。

    先不急,我們來看看啟動后的nginx是怎樣的。直接訪問http://localhost可以看到:

        我們可以看到nginx啟動成功,現(xiàn)在訪問是直接進到nginx的目錄里面了。

    那么這些實際上是在哪里配置的。這就涉及到nginx的一個重要配置文件nginx.conf了。

    2)我們可以看到nginx文件夾內有一個conf文件夾,其中有好幾個文件,其他先不管,我們打開nginx.conf,可以看到一段:

    這段代碼在server里面,相當于一個代理服務器,當然可以配置多個。

    下面我們仔細來分析一下:

    listen:表示當前的代理服務器監(jiān)聽的端口,默認的是監(jiān)聽80端口。注意,如果我們配置了多個server,這個listen要配置不一樣,不然就不能確定轉到哪里去了。

    server_name:表示監(jiān)聽到之后需要轉到哪里去,這時我們直接轉到本地,這時是直接到nginx文件夾內。

    location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這里

    root:里面配置了root這時表示當匹配這個請求的路徑時,將會在這個文件夾內尋找相應的文件,這里對我們之后的靜態(tài)文件伺服很有用。

    index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,并按順序來加載,如果第一個不存在,則找第二個,依此類推。

    下面的error_page是代表錯誤的頁面,這里我們暫時不用,先不管它。

    那我們知道了具體的配置了,怎么讓它訪問localhost時轉到tomcat時。實際上就修改兩個地方:

    Java代碼 復制代碼 收藏代碼
    1. server_name localhost:8080
    2.  
    3. location / { 
    4.     proxy_pass http://localhost:8080 

    我們就修改了上面兩個地方,我的tomcat在8080端口,可以根據自己的需要修改。這里有一個新元素proxy_pass,它表示代理路徑,相當于轉發(fā),而不像之前說的root必須指定一個文件夾。

    此時我們修改了文件,是不是就意思著必須先關了nginx再重新啟動了,其實不必,nginx可以重新加載文件的。

    我們直接運行:

    Html代碼 復制代碼 收藏代碼
    1. nginx -s reload 

    高興得太早了,我們發(fā)現(xiàn)有一個錯誤:

    什么來的,45行發(fā)現(xiàn)錯誤,不希望在那一行找到},于是我們仔細找,發(fā)現(xiàn)我們加入的proxy_pass很奇怪,沒有;號結尾,這就是問題了,直接修改,然后再運行一下,發(fā)現(xiàn)沒錯誤,OK了。

    如果不想直接加載,而只是想看看自己的配置文件有沒有問題,可以直接輸入:

    Xml代碼 復制代碼 收藏代碼
    1. nginx -t 

    這可以檢查配置文件中是否有錯。 下面我們所有的修改都假設我們修改完成后運行了nginx -s reload進行重新加載配置文件,請注意。

    一切沒問題了,然后我們再重新打開http://localhost,我們看到下面的頁面:

    這時,我們發(fā)現(xiàn)它并不是剛才的welcome頁面了,而是tomcat的管理頁面了,不管我們點擊什么鏈接都是沒問題的,相當于直接訪問http://localhost:8080一樣。

    3)上面我們直接試了一個小例子,讓nginx進行轉發(fā),即所謂的反向代理。但實際上我們的需求不會是這樣的,我們需要分文件類型來進行過濾,比如jsp直接給tomcat處理,因為nginx并不是servlet容器,沒辦法處理JSP,而html,js,css這些不需要處理的,直接給nginx進行緩存。

    下面我們來進行一下配置,讓JSP頁面直接給tomcat,而html,png等一些圖片和JS等直接給nginx進行緩存。

    這時最主要用的還是location這個元素,并且涉及到一部分正則,但不難:

    Xml代碼 復制代碼 收藏代碼
    1. location ~ \.jsp$ { 
    2.         proxy_pass http://localhost:8080; 
    3.          
    4. location ~ \.(html|js|css|png|gif)$ { 
    5.     root D:/software/developerTools/server/apache-tomcat-7.0.8/webapps/ROOT; 

    我們先要去掉之前配的location /,避免全部請求被攔截了。

    然后我們再來看看http://localhost

    當我們不指定jsp頁面的時候,它會出現(xiàn)找不到,因為,此時并沒有相應的location匹配,所以就會有404錯誤,這時就跳到了nginx自定義的error頁面去了。

    而當我們用http://localhost/index.jsp去訪問時,我們看到了熟悉的頁面:

    而且圖片那些都顯示正常,因為圖片是png的,所以直接在tomcat/webapps/ROOT目錄下直接查找,當然,如果我們點擊Manager Application HOW-TO這個鏈接,我們發(fā)現(xiàn):

    它還是找不到,為什么呢?因為這是個html頁面,但它并不在ROOT目錄下,而是在docs目錄下,但當我們匹配html時,我們卻到ROOT目錄下去找,所以還是找不到這個頁面。

    一般情況下,如果我們需要用nginx來進行靜態(tài)文件伺服,一般都會把所有靜態(tài)文件,html,htm,js,css等都放在同一個文件夾下,這樣就不會有tomcat這樣的情況了,因為tomcat下的是屬于不同的項目,這個我們就沒辦法了。

    3)有些人會說,這些都只會找一臺服務器,但如果我們想在一臺服務器掛了的時候,自動去找另外一臺,這怎么辦?這實際上nginx都考慮到了。

    這時,我們之前用的proxy_pass就有大用途了。

    我們把之前的第一個例子,即全部都代理的修改一下:

    最后修改如下:

    Xml代碼 復制代碼 收藏代碼
    1. upstream local_tomcat { 
    2.     server localhost:8080; 
    3.  
    4. server{ 
    5.         location / { 
    6.            proxy_pass http://local_tomcat; 
    7.         } 
    8.         #......其他省略 

    我們在server外添加了一個upstream,而直接在proxy_pass里面直接用http://+upstream的名稱來使用。

    我們還是直接來http://localhost,還是和第一個一樣的效果,所有鏈接都沒問題,說明我們配置正確。

    upstream中的server元素必須要注意,不能加http://,但proxy_pass中必須加。

    我們剛才說可以在一個服務器掛了的情況下連到另外一個,那怎么弄呢?

    其實很簡單,在upstream中的local_tomcat中配置多一個server。比如我現(xiàn)在弄多一個jetty,端口在9999,所以我們配置如下:

    Xml代碼 復制代碼 收藏代碼
    1. upstream local_tomcat { 
    2.     server localhost:8080; 
    3.     server localhost:9999; 

    此時,我們關閉tomcat,而只開jetty。我們來運行http://localhost看看效果:

    我們看到它請求到了jetty的頁面,但由于jetty的機制,這時沒有顯示jetty主頁,這個我們先不管。但我們的在一個服務器掛的情況下自動使用另外一個的功能實現(xiàn)了。

    但有時我們就不想它掛的時候訪問另外一個,而只是希望一個服務器訪問的機會比另外一個大,這個可以在server最后加上一個weight=數字來指定,數字越大,表明請求到的機會越大。

    Xml代碼 復制代碼 收藏代碼
    1. upstream local_tomcat { 
    2.     server localhost:8080 weight=1
    3.     server localhost:9999 weight=5

    這時我們給了jetty一個更高的權值,讓它更有機會訪問到,實際上當我們刷新http://localhost訪問的時候發(fā)現(xiàn)jetty訪問機率大很多,tomcat幾乎沒機會訪問,一般情況下,如果我們必須這樣用,不要相關太大,以免一個服務器負載太大。

    當然,server還有一些其他的元素,比如down表示暫時不用到該服務器等等。這些可以參考nginx的wiki。也許寫了一大堆,有人會有問題,那nginx怎么關閉呢?這倒是個問題,其實直接運行nginx -s stop就可以關閉了。

    基本上nginx的用法是這樣,深入的以后我們如果用到再學習。

    posted @ 2014-06-17 15:24 yuhaibo736 閱讀(1382) | 評論 (0)編輯 收藏

    第一步:

       1)下載jad.exe文件:http://www.varaneckas.com/jad

       2)下載jadeclipse插件:http://sourceforge.net/projects/jadclipse/files/


    第二步:
        1)解壓縮jad158g.win.zip成jad.exe,把它copy至jre的bin目錄下,比如我的jre安裝到了c盤下,copy的路徑即為c:\Program Files\Java\jre6\bin(下一步配置等待net.sf.jadclipse_3.3.0.jar配置完成之后再說)
        2)找到myeclipse的安裝目錄,我的myeclipse安裝在c盤下,路徑如下:c:\ Program Files\yEclipse10。該目錄下有dropins文件,我們需要在該文件夾下,新建jad文件夾,jad文件夾下新建 features 和 plugins 兩個文件夾,把net.sf.jadclipse_3.3.0.jar 復制到兩個文件夾下,然后重啟myeclipse。

    第三步:
        1)在eclipse窗口下,點擊Window > Preferences > Java > JadClipse > Path to Decompiler。(設置jad的絕對路徑,如 c:\Program Files\Java\jre6\bin\jad.exe  )。Use Eclipse code formatter(overrides Jad formatting instructions)選項打勾,與格式化出來的代碼樣式一致。

        2)在eclipse窗口下,點擊Window > Preferences > Java > JadClipse > Misc,將Convert Unicode strings into ANSI strings選項打勾,避免反編譯后可能出現(xiàn)的中文亂碼。
    第四步:
        安裝完成后,myeclipse沒有自動將JadClipse Class File Viewer設置成class文件的缺省打開方式,設置方法如

    在Eclipse的Windows—> Perference—>General->Editors->File
    Associations中修改“*.class”默認關聯(lián)的編輯器為“JadClipse Class File Viewer”。

    第五步:
        設置完成,找一個jar包中的*.class文件,myeclipse將自動反編譯。

    posted @ 2014-05-26 16:05 yuhaibo736 閱讀(1368) | 評論 (0)編輯 收藏

    首先在網上下載Eclipse Class Decompiler插件: http://download.csdn.net/detail/ibm_hoojo/5250263
    下載后,解壓可以看到如下目錄,復制所有文件粘貼到你的eclipse或MyEclipse的目錄:D:\MyEclipse 6.5\dropins\eclipse或D:\eclipse\dropins\eclipse下,沒有對應的文件夾就新建,選擇覆蓋即可。然后重新啟動eclipse。 

    再次打開.class文件就是反編譯后的文件了

    posted @ 2014-05-21 17:14 yuhaibo736 閱讀(1112) | 評論 (0)編輯 收藏

    用oracle用戶登陸系統(tǒng),
    用戶名/密碼  oracle/oracle
    sqlplus / as sysdba
    startup
    啟動后然后 exit
    然后啟動監(jiān)聽 lsnrctl start

    Linux 下啟動oracle步驟
    1.進入到sqlplus啟動實例
    [oracle@redhat ~]$ su - oracle --“切換到oracle用戶”
    2.[oracle@redhat ~]$ lsnrctl start --“打開監(jiān)聽”
    3.[oracle@redhat ~]$ sqlplus /nolog --“進入到sqlplus”
    4.SQL> conn /as sysdba --“連接到sysdba”
    5.SQL> startup --“啟動數據庫實例”
    6.SQL> shutdown immediate --“關閉數據庫實例”
    7.[oracle@redhat ~]$ lsnrctl stop --“關閉監(jiān)聽”

    posted @ 2013-09-10 22:38 yuhaibo736 閱讀(994) | 評論 (0)編輯 收藏



    一、vi的基本概念



    基本上vi可分為三種操作狀態(tài),分別是命令模式(Command mode)、插入模式(Insert mode)和底線命令模式(Last line mode),



    各模式的功能區(qū)分如下:



    1. Comand mode:控制屏幕光標的移動,字符或光標的刪除,移動復制某區(qū)段及進入Insert mode下,或者到Last line mode。



    2. Insert mode:唯有在Insert mode下,才可做文字數據輸入,按Esc等可回到Comand mode。



    3. Last line mode:將儲存文件或離開編輯器,也可設置編輯環(huán)境,如尋找字符串、列出行號等。



    不過可以把vi簡化成兩個模式,即是將Last line mode也算入Command mode,把vi分成Command
    和Insert mode。



    二、vi的基本操作



    1.進入vi



    在系統(tǒng)提示符號輸入vi及文件名稱后,即可進入vi全屏幕編輯畫面:



    $
    vi testfile



    注意:進入vi之后是處于“Command mode”下,要切換到Insert mode才能輸入文字。



    初次用vi的用戶都會想先用上下左右鍵移動光標,結果電腦一直叫,把自己氣個半死,所以進入vi后,先不要亂動,轉換入Insert后再說。



    (1)切換至Insert mode編輯文件在Command mode下按‘i’、‘a’或‘o’三鍵就可進入Insert mode。這時候就可以開始輸入文字了。



    i: 插入,從目前光標所在之處插入所輸入的文字。



    a: 增加,目前光標所在的下一個字開始輸入文字。



    o: 插入新的一行,從行首開始輸入文字。



    (2)Insert的切換→Command
    mode
    ,按Esc鍵



    您目前處于Insert mode,您就只能一直打字。假如您發(fā)現(xiàn)打錯字了,想用光標鍵往回移動,將該字刪除,就要按ESC鍵轉換回Command mode,再刪除文字。



    (3)離開vi及存文件



    在Command mode下,可按冒號“:”鍵入入Last line mode,例如:



    :w
    filename (
    輸入“w filename”,將文章存入指定的文件名filename)



    :wq
    (
    輸入“wq”,因為進入之時已經指定文件名testfile,所以會寫入testfile并離開vi)



    :q!
    (
    輸入“q!”,強制離開并放棄編輯的文件)



    2.Command
    mode
    功能鍵列表



    在介紹command mode指令的時后,指令后面加上“常用”字眼的功能鍵,表示比較常用的vi指令,



    請讀者您一定要學會、記住。



    (1)I、a、o切換進入Insert mode。[超級常用]



    (2)移動光標



    vi可以直接用鍵盤上的光標鍵來上下左右移動,但正規(guī)的vi是用小寫英文字母



    h、j、k、l,分別控制光標左、下、上、右移一格。



    按Ctrl+B:屏幕往后移動一頁。[常用]



    按Ctrl+F:屏幕往前移動一頁。[常用]



    按Ctrl+U:屏幕往后移動半頁。



    按Ctrl+D:屏幕往前移動半頁。



    按 0 (數字零):移動文章的開頭。[常用]



    按 G:移動到文章的最后。[常用]



    按 w:光標跳到下個word的開頭。[常用]



    按 e:光標跳到下個word的字尾。



    按 b:光標回到上個word的開頭。



    按 $:移到光標所在行的行尾。[常用]



    按 ^:移到該行第一個非空白的字符。



    按 0:移到該行的開頭位置。[常用]



    按 #:移到該行的第#個位置,例:51、121。[常用]



    (3)刪除文字



    x:每按一次刪除光標所在位置的后面一個字符。[超常用]



    #x:例如,6x 表刪除光標所在位置的后面6個字符。[常用]



    X:大字的X,每按一次刪除光標所在位置的前面一個字符。



    #X:例如,20X 表刪除光標所在位置的前面20個字符。



    dd:刪除光標所在行。[超常用]



    #dd:例如,6dd表刪除從光標所在的該行往下數6行之文字。[常用]



    (4)復制



    yw:將光標所在處到字尾的字符復制到緩沖區(qū)中。



    (想在和#x、#X的功能相反)



    p:將緩沖區(qū)內的字符粘貼到光標所在位置(指令‘yw’與‘p必須搭配使用)。



    yy:復制光標所在行。[超常用]



    p:復制單行到您想粘貼之處。(指令‘yy’與‘p’必須搭配使用)



    #yy:如:6yy表示拷貝從光標所在的該行往下數6行之文字。[常用]



    p:復制多行到您想粘貼之處。(指令‘#yy’與‘p’必須搭配使用)



    “ayy:將復制行放入buffer a, vi提供buffer功能,可將常用的數據存在buffer



    “ap:將放在buffer a的數據粘貼。



    “b3yy:將三行數據存入buffer b。



    “b3p:將存在buffer b的資料粘貼



    (5)取代



    r: 取代光標所在處的字符:[常用]



    R:取代字符直到按Esc為止。



    (6)復原(undo)上一個指令



    u:假如您誤操作一個指令,可以馬上按u,回復到上一個操作。[超常用]



    .:
    .
    可以重復執(zhí)行上一次的指令。



    (7)更改



    cw:更改光標所在處的字到字尾$處。



    c#w:例如,c3w代表更改3個字。



    (8)跳至指定行



    Ctrl+G:列出光標所在行的行號。



    #G:例如,15G,表示移動光標至文章的第15行行首。[常用]



    3.Last
    line mode
    下指令簡介



    讀者您要使用Last line mode之前,請記得先按Esc鍵確定您已經處于Command mode下后,再按冒號“:”或“/”或“?”



    三鍵的其中一鍵進入Last line mode。



    (1).列出行號



    set
    nu:
    輸入“set
    nu
    或者set number”后,會在文章的每一行前面列出行號。



    set
    nonu
    :輸入“set
    nonu
    或者set nonumber”,取消行號



    (2).跳到文章的某一行



    #:井號代表一個數字,在Last line
    mode
    提示符號“:”前輸入數字,再按Enter就會跳到該行了,



    如:15[Enter]就會跳到文章的第15行。[常用]



    (3).尋找字符串



    /關鍵字:先按/,再輸入您想尋找的字,如果第一次找的關鍵字不是您相盡可能的,可以一直按n會往下尋找到您要的關鍵字為止。自上而下進行搜索!



    ?關鍵字:先按?,再輸入您想尋找的字,如果第一次找的關鍵字不是您想要的,可以按n會往前尋找到您要的關鍵字為止。自下而上搜索!



    如:3/x 表示查找當前點第三次出現(xiàn) x 的地方,就像是 /x 后跟 2n。類似地,2/^e 將從當前位置開始的第二行查找以 e 開始的內容。



    注意,到達文件底部之后,搜索將回到頂部。



    (4).取代字符串



    1,$s/string/replae/g:在last line mode輸入“1,$s/string/replace/g”會將全文的string字符串取代為replace字符串,



    其中1,$s就是指搜尋區(qū)間為文章從頭至尾的意思,g則是表示全部取代不必確認。



    %s/string/replace/c:同樣會將全文的string字符串取代為replace字符串,和上面指令不同的地方是,%s和1,$s是相同的功能,



    c則是表示要替代之前必須再次確認是否取代。



    1,20s/string/replace/g:將1至20行間的string替代為relpace字符串。



    (5).存文件



    w:在last line mode提示符號“:”前按w即可將文件存起來。[超常用]



    #,# w filename:如果您想摘取文章的某一段,存成另一個文件,可用這個指令#代表行號,例如30,50 w nice,



    將您正在編輯文章的第30~50行存成nice這個文件。



    或者是30,50 w >> nice ,表示把內容附加到nice文件,不覆蓋



    (6).離開



    q:按q就離開,有時如果無法離開vi,可搭配“!:強置離開vi,如“q!”



    qw:一般建議離開時,搭配w一起使用,如此離開時還可存文件。[常用]



    posted @ 2013-09-09 18:31 yuhaibo736 閱讀(859) | 評論 (0)編輯 收藏

    系統(tǒng)信息
    arch 顯示機器的處理器架構(1)
    uname -m 顯示機器的處理器架構(2)
    uname -r 顯示正在使用的內核版本
    dmidecode -q 顯示硬件系統(tǒng)部件 - (SMBIOS / DMI)
    hdparm -i /dev/hda 羅列一個磁盤的架構特性
    hdparm -tT /dev/sda 在磁盤上執(zhí)行測試性讀取操作
    cat /proc/cpuinfo 顯示CPU info的信息
    cat /proc/interrupts 顯示中斷
    cat /proc/meminfo 校驗內存使用
    cat /proc/swaps 顯示哪些swap被使用
    cat /proc/version 顯示內核的版本
    cat /proc/net/dev 顯示網絡適配器及統(tǒng)計
    cat /proc/mounts 顯示已加載的文件系統(tǒng)
    lspci -tv 羅列 PCI 設備
    lsusb -tv 顯示 USB 設備
    date 顯示系統(tǒng)日期
    cal 2007 顯示2007年的日歷表
    date 041217002007.00 設置日期和時間 - 月日時分年.秒
    clock -w 將時間修改保存到 BIOS

     

    關機 (系統(tǒng)的關機、重啟以及登出 )
    shutdown -h now 關閉系統(tǒng)(1)
    init 0 關閉系統(tǒng)(2)
    telinit 0 關閉系統(tǒng)(3)
    shutdown -h hours:minutes & 按預定時間關閉系統(tǒng)
    shutdown -c 取消按預定時間關閉系統(tǒng)
    shutdown -r now 重啟(1)
    reboot 重啟(2)
    logout 注銷

     

    文件和目錄
    cd /home 進入 '/ home' 目錄'
    cd .. 返回上一級目錄
    cd ../.. 返回上兩級目錄
    cd 進入個人的主目錄
    cd ~user1 進入個人的主目錄
    cd - 返回上次所在的目錄
    pwd 顯示工作路徑
    ls 查看目錄中的文件
    ls -F 查看目錄中的文件
    ls -l 顯示文件和目錄的詳細資料
    ls -a 顯示隱藏文件
    ls *[0-9]* 顯示包含數字的文件名和目錄名
    tree 顯示文件和目錄由根目錄開始的樹形結構(1)
    lstree 顯示文件和目錄由根目錄開始的樹形結構(2)
    mkdir dir1 創(chuàng)建一個叫做 'dir1' 的目錄'
    mkdir dir1 dir2 同時創(chuàng)建兩個目錄
    mkdir -p /tmp/dir1/dir2 創(chuàng)建一個目錄樹
    rm -f file1 刪除一個叫做 'file1' 的文件'
    rmdir dir1 刪除一個叫做 'dir1' 的目錄'
    rm -rf dir1 刪除一個叫做 'dir1' 的目錄并同時刪除其內容
    rm -rf dir1 dir2 同時刪除兩個目錄及它們的內容
    mv dir1 new_dir 重命名/移動 一個目錄
    cp file1 file2 復制一個文件
    cp dir/* . 復制一個目錄下的所有文件到當前工作目錄
    cp -a /tmp/dir1 . 復制一個目錄到當前工作目錄
    cp -a dir1 dir2 復制一個目錄
    ln -s file1 lnk1 創(chuàng)建一個指向文件或目錄的軟鏈接
    ln file1 lnk1 創(chuàng)建一個指向文件或目錄的物理鏈接
    touch -t 0712250000 file1 修改一個文件或目錄的時間戳 - (YYMMDDhhmm)
    file file1 outputs the mime type of the file as text
    iconv -l 列出已知的編碼
    iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
    find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)

     

    文件搜索
    find / -name file1 從 '/' 開始進入根文件系統(tǒng)搜索文件和目錄
    find / -user user1 搜索屬于用戶 'user1' 的文件和目錄
    find /home/user1 -name \*.bin 在目錄 '/ home/user1' 中搜索帶有'.bin' 結尾的文件
    find /usr/bin -type f -atime +100 搜索在過去100天內未被使用過的執(zhí)行文件
    find /usr/bin -type f -mtime -10 搜索在10天內被創(chuàng)建或者修改過的文件
    find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 結尾的文件并定義其權限
    find / -xdev -name \*.rpm 搜索以 '.rpm' 結尾的文件,忽略光驅、捷盤等可移動設備
    locate \*.ps 尋找以 '.ps' 結尾的文件 - 先運行 'updatedb' 命令
    whereis halt 顯示一個二進制文件、源碼或man的位置
    which halt 顯示一個二進制文件或可執(zhí)行文件的完整路徑

     

    掛載一個文件系統(tǒng)
    mount /dev/hda2 /mnt/hda2 掛載一個叫做hda2的盤 - 確定目錄 '/ mnt/hda2' 已經存在
    umount /dev/hda2 卸載一個叫做hda2的盤 - 先從掛載點 '/ mnt/hda2' 退出
    fuser -km /mnt/hda2 當設備繁忙時強制卸載
    umount -n /mnt/hda2 運行卸載操作而不寫入 /etc/mtab 文件- 當文件為只讀或當磁盤寫滿時非常有用
    mount /dev/fd0 /mnt/floppy 掛載一個軟盤
    mount /dev/cdrom /mnt/cdrom 掛載一個cdrom或dvdrom
    mount /dev/hdc /mnt/cdrecorder 掛載一個cdrw或dvdrom
    mount /dev/hdb /mnt/cdrecorder 掛載一個cdrw或dvdrom
    mount -o loop file.iso /mnt/cdrom 掛載一個文件或ISO鏡像文件
    mount -t vfat /dev/hda5 /mnt/hda5 掛載一個Windows FAT32文件系統(tǒng)
    mount /dev/sda1 /mnt/usbdisk 掛載一個usb 捷盤或閃存設備
    mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 掛載一個windows網絡共享

     

    磁盤空間
    df -h 顯示已經掛載的分區(qū)列表
    ls -lSr |more 以尺寸大小排列文件和目錄
    du -sh dir1 估算目錄 'dir1' 已經使用的磁盤空間'
    du -sk * | sort -rn 以容量大小為依據依次顯示文件和目錄的大小
    rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小為依據依次顯示已安裝的rpm包所使用的空間 (fedora, redhat類系統(tǒng))
    dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小為依據顯示已安裝的deb包所使用的空間 (ubuntu, debian類系統(tǒng))

    返回頂部索引 ^

    用戶和群組
    groupadd group_name 創(chuàng)建一個新用戶組
    groupdel group_name 刪除一個用戶組
    groupmod -n new_group_name old_group_name 重命名一個用戶組
    useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 創(chuàng)建一個屬于 "admin" 用戶組的用戶
    useradd user1 創(chuàng)建一個新用戶
    userdel -r user1 刪除一個用戶 ( '-r' 排除主目錄)
    usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用戶屬性
    passwd 修改口令
    passwd user1 修改一個用戶的口令 (只允許root執(zhí)行)
    chage -E 2005-12-31 user1 設置用戶口令的失效期限
    pwck 檢查 '/etc/passwd' 的文件格式和語法修正以及存在的用戶
    grpck 檢查 '/etc/passwd' 的文件格式和語法修正以及存在的群組
    newgrp group_name 登陸進一個新的群組以改變新創(chuàng)建文件的預設群組

    返回頂部索引 ^

    文件的權限 - 使用 "+" 設置權限,使用 "-" 用于取消
    ls -lh 顯示權限
    ls /tmp | pr -T5 -W$COLUMNS 將終端劃分成5欄顯示
    chmod ugo+rwx directory1 設置目錄的所有人(u)、群組(g)以及其他人(o)以讀(r )、寫(w)和執(zhí)行(x)的權限
    chmod go-rwx directory1 刪除群組(g)與其他人(o)對目錄的讀寫執(zhí)行權限
    chown user1 file1 改變一個文件的所有人屬性
    chown -R user1 directory1 改變一個目錄的所有人屬性并同時改變改目錄下所有文件的屬性
    chgrp group1 file1 改變文件的群組
    chown user1:group1 file1 改變一個文件的所有人和群組屬性
    find / -perm -u+s 羅列一個系統(tǒng)中所有使用了SUID控制的文件
    chmod u+s /bin/file1 設置一個二進制文件的 SUID 位 - 運行該文件的用戶也被賦予和所有者同樣的權限
    chmod u-s /bin/file1 禁用一個二進制文件的 SUID位
    chmod g+s /home/public 設置一個目錄的SGID 位 - 類似SUID ,不過這是針對目錄的
    chmod g-s /home/public 禁用一個目錄的 SGID 位
    chmod o+t /home/public 設置一個文件的 STIKY 位 - 只允許合法所有人刪除文件
    chmod o-t /home/public 禁用一個目錄的 STIKY 位

    返回頂部索引 ^

    文件的特殊屬性 - 使用 "+" 設置權限,使用 "-" 用于取消
    chattr +a file1 只允許以追加方式讀寫文件
    chattr +c file1 允許這個文件能被內核自動壓縮/解壓
    chattr +d file1 在進行文件系統(tǒng)備份時,dump程序將忽略這個文件
    chattr +i file1 設置成不可變的文件,不能被刪除、修改、重命名或者鏈接
    chattr +s file1 允許一個文件被安全地刪除
    chattr +S file1 一旦應用程序對這個文件執(zhí)行了寫操作,使系統(tǒng)立刻把修改的結果寫到磁盤
    chattr +u file1 若文件被刪除,系統(tǒng)會允許你在以后恢復這個被刪除的文件
    lsattr 顯示特殊的屬性

    返回頂部索引 ^

    打包和壓縮文件
    bunzip2 file1.bz2 解壓一個叫做 'file1.bz2'的文件
    bzip2 file1 壓縮一個叫做 'file1' 的文件
    gunzip file1.gz 解壓一個叫做 'file1.gz'的文件
    gzip file1 壓縮一個叫做 'file1'的文件
    gzip -9 file1 最大程度壓縮
    rar a file1.rar test_file 創(chuàng)建一個叫做 'file1.rar' 的包
    rar a file1.rar file1 file2 dir1 同時壓縮 'file1', 'file2' 以及目錄 'dir1'
    rar x file1.rar 解壓rar包
    unrar x file1.rar 解壓rar包
    tar -cvf archive.tar file1 創(chuàng)建一個非壓縮的 tarball
    tar -cvf archive.tar file1 file2 dir1 創(chuàng)建一個包含了 'file1', 'file2' 以及 'dir1'的檔案文件
    tar -tf archive.tar 顯示一個包中的內容
    tar -xvf archive.tar 釋放一個包
    tar -xvf archive.tar -C /tmp 將壓縮包釋放到 /tmp目錄下
    tar -cvfj archive.tar.bz2 dir1 創(chuàng)建一個bzip2格式的壓縮包
    tar -xvfj archive.tar.bz2 解壓一個bzip2格式的壓縮包
    tar -cvfz archive.tar.gz dir1 創(chuàng)建一個gzip格式的壓縮包
    tar -xvfz archive.tar.gz 解壓一個gzip格式的壓縮包
    zip file1.zip file1 創(chuàng)建一個zip格式的壓縮包
    zip -r file1.zip file1 file2 dir1 將幾個文件和目錄同時壓縮成一個zip格式的壓縮包
    unzip file1.zip 解壓一個zip格式壓縮包

    返回頂部索引 ^

    RPM 包 - (Fedora, Redhat及類似系統(tǒng))
    rpm -ivh package.rpm 安裝一個rpm包
    rpm -ivh --nodeeps package.rpm 安裝一個rpm包而忽略依賴關系警告
    rpm -U package.rpm 更新一個rpm包但不改變其配置文件
    rpm -F package.rpm 更新一個確定已經安裝的rpm包
    rpm -e package_name.rpm 刪除一個rpm包
    rpm -qa 顯示系統(tǒng)中所有已經安裝的rpm包
    rpm -qa | grep httpd 顯示所有名稱中包含 "httpd" 字樣的rpm包
    rpm -qi package_name 獲取一個已安裝包的特殊信息
    rpm -qg "System Environment/Daemons" 顯示一個組件的rpm包
    rpm -ql package_name 顯示一個已經安裝的rpm包提供的文件列表
    rpm -qc package_name 顯示一個已經安裝的rpm包提供的配置文件列表
    rpm -q package_name --whatrequires 顯示與一個rpm包存在依賴關系的列表
    rpm -q package_name --whatprovides 顯示一個rpm包所占的體積
    rpm -q package_name --scripts 顯示在安裝/刪除期間所執(zhí)行的腳本l
    rpm -q package_name --changelog 顯示一個rpm包的修改歷史
    rpm -qf /etc/httpd/conf/httpd.conf 確認所給的文件由哪個rpm包所提供
    rpm -qp package.rpm -l 顯示由一個尚未安裝的rpm包提供的文件列表
    rpm --import /media/cdrom/RPM-GPG-KEY 導入公鑰數字證書
    rpm --checksig package.rpm 確認一個rpm包的完整性
    rpm -qa gpg-pubkey 確認已安裝的所有rpm包的完整性
    rpm -V package_name 檢查文件尺寸、 許可、類型、所有者、群組、MD5檢查以及最后修改時間
    rpm -Va 檢查系統(tǒng)中所有已安裝的rpm包- 小心使用
    rpm -Vp package.rpm 確認一個rpm包還未安裝
    rpm2cpio package.rpm | cpio --extract --make-directories *bin* 從一個rpm包運行可執(zhí)行文件
    rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 從一個rpm源碼安裝一個構建好的包
    rpmbuild --rebuild package_name.src.rpm 從一個rpm源碼構建一個 rpm 包

    返回頂部索引 ^

    YUM 軟件包升級器 - (Fedora, RedHat及類似系統(tǒng))
    yum install package_name 下載并安裝一個rpm包
    yum localinstall package_name.rpm 將安裝一個rpm包,使用你自己的軟件倉庫為你解決所有依賴關系
    yum update package_name.rpm 更新當前系統(tǒng)中所有安裝的rpm包
    yum update package_name 更新一個rpm包
    yum remove package_name 刪除一個rpm包
    yum list 列出當前系統(tǒng)中安裝的所有包
    yum search package_name 在rpm倉庫中搜尋軟件包
    yum clean packages 清理rpm緩存刪除下載的包
    yum clean headers 刪除所有頭文件
    yum clean all 刪除所有緩存的包和頭文件

    返回頂部索引 ^

    DEB 包 (Debian, Ubuntu 以及類似系統(tǒng))
    dpkg -i package.deb 安裝/更新一個 deb 包
    dpkg -r package_name 從系統(tǒng)刪除一個 deb 包
    dpkg -l 顯示系統(tǒng)中所有已經安裝的 deb 包
    dpkg -l | grep httpd 顯示所有名稱中包含 "httpd" 字樣的deb包
    dpkg -s package_name 獲得已經安裝在系統(tǒng)中一個特殊包的信息
    dpkg -L package_name 顯示系統(tǒng)中已經安裝的一個deb包所提供的文件列表
    dpkg --contents package.deb 顯示尚未安裝的一個包所提供的文件列表
    dpkg -S /bin/ping 確認所給的文件由哪個deb包提供

    返回頂部索引 ^

    APT 軟件工具 (Debian, Ubuntu 以及類似系統(tǒng))
    apt-get install package_name 安裝/更新一個 deb 包
    apt-cdrom install package_name 從光盤安裝/更新一個 deb 包
    apt-get update 升級列表中的軟件包
    apt-get upgrade 升級所有已安裝的軟件
    apt-get remove package_name 從系統(tǒng)刪除一個deb包
    apt-get check 確認依賴的軟件倉庫正確
    apt-get clean 從下載的軟件包中清理緩存
    apt-cache search searched-package 返回包含所要搜索字符串的軟件包名稱

    返回頂部索引 ^

    查看文件內容
    cat file1 從第一個字節(jié)開始正向查看文件的內容
    tac file1 從最后一行開始反向查看一個文件的內容
    more file1 查看一個長文件的內容
    less file1 類似于 'more' 命令,但是它允許在文件中和正向操作一樣的反向操作
    head -2 file1 查看一個文件的前兩行
    tail -2 file1 查看一個文件的最后兩行
    tail -f /var/log/messages 實時查看被添加到一個文件中的內容

    返回頂部索引 ^

    文本處理
    cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
    cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一個文件的詳細說明文本,并將簡介寫入一個新文件中
    cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一個文件的詳細說明文本,并將簡介寫入一個已有的文件中
    grep Aug /var/log/messages 在文件 '/var/log/messages'中查找關鍵詞"Aug"
    grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"開始的詞匯
    grep [0-9] /var/log/messages 選擇 '/var/log/messages' 文件中所有包含數字的行
    grep Aug -R /var/log/* 在目錄 '/var/log' 及隨后的目錄中搜索字符串"Aug"
    sed 's/stringa1/stringa2/g' example.txt 將example.txt文件中的 "string1" 替換成 "string2"
    sed '/^$/d' example.txt 從example.txt文件中刪除所有空白行
    sed '/ *#/d; /^$/d' example.txt 從example.txt文件中刪除所有注釋和空白行
    echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下單元格內容
    sed -e '1d' result.txt 從文件example.txt 中排除第一行
    sed -n '/stringa1/p' 查看只包含詞匯 "string1"的行
    sed -e 's/ *$//' example.txt 刪除每一行最后的空白字符
    sed -e 's/stringa1//g' example.txt 從文檔中只刪除詞匯 "string1" 并保留剩余全部
    sed -n '1,5p;5q' example.txt 查看從第一行到第5行內容
    sed -n '5p;5q' example.txt 查看第5行
    sed -e 's/00*/0/g' example.txt 用單個零替換多個零
    cat -n file1 標示文件的行數
    cat example.txt | awk 'NR%2==1' 刪除example.txt文件中的所有偶數行
    echo a b c | awk '{print $1}' 查看一行第一欄
    echo a b c | awk '{print $1,$3}' 查看一行的第一和第三欄
    paste file1 file2 合并兩個文件或兩欄的內容
    paste -d '+' file1 file2 合并兩個文件或兩欄的內容,中間用"+"區(qū)分
    sort file1 file2 排序兩個文件的內容
    sort file1 file2 | uniq 取出兩個文件的并集(重復的行只保留一份)
    sort file1 file2 | uniq -u 刪除交集,留下其他的行
    sort file1 file2 | uniq -d 取出兩個文件的交集(只留下同時存在于兩個文件中的文件)
    comm -1 file1 file2 比較兩個文件的內容只刪除 'file1' 所包含的內容
    comm -2 file1 file2 比較兩個文件的內容只刪除 'file2' 所包含的內容
    comm -3 file1 file2 比較兩個文件的內容只刪除兩個文件共有的部分

    返回頂部索引 ^


    字符設置和文件格式轉換
    dos2unix filedos.txt fileunix.txt 將一個文本文件的格式從MSDOS轉換成UNIX
    unix2dos fileunix.txt filedos.txt 將一個文本文件的格式從UNIX轉換成MSDOS
    recode ..HTML < page.txt > page.html 將一個文本文件轉換成html
    recode -l | more 顯示所有允許的轉換格式

    返回頂部索引 ^

    文件系統(tǒng)分析
    badblocks -v /dev/hda1 檢查磁盤hda1上的壞磁塊
    fsck /dev/hda1 修復/檢查hda1磁盤上linux文件系統(tǒng)的完整性
    fsck.ext2 /dev/hda1 修復/檢查hda1磁盤上ext2文件系統(tǒng)的完整性
    e2fsck /dev/hda1 修復/檢查hda1磁盤上ext2文件系統(tǒng)的完整性
    e2fsck -j /dev/hda1 修復/檢查hda1磁盤上ext3文件系統(tǒng)的完整性
    fsck.ext3 /dev/hda1 修復/檢查hda1磁盤上ext3文件系統(tǒng)的完整性
    fsck.vfat /dev/hda1 修復/檢查hda1磁盤上fat文件系統(tǒng)的完整性
    fsck.msdos /dev/hda1 修復/檢查hda1磁盤上dos文件系統(tǒng)的完整性
    dosfsck /dev/hda1 修復/檢查hda1磁盤上dos文件系統(tǒng)的完整性

    返回頂部索引 ^

    初始化一個文件系統(tǒng)
    mkfs /dev/hda1 在hda1分區(qū)創(chuàng)建一個文件系統(tǒng)
    mke2fs /dev/hda1 在hda1分區(qū)創(chuàng)建一個linux ext2的文件系統(tǒng)
    mke2fs -j /dev/hda1 在hda1分區(qū)創(chuàng)建一個linux ext3(日志型)的文件系統(tǒng)
    mkfs -t vfat 32 -F /dev/hda1 創(chuàng)建一個 FAT32 文件系統(tǒng)
    fdformat -n /dev/fd0 格式化一個軟盤
    mkswap /dev/hda3 創(chuàng)建一個swap文件系統(tǒng)

    返回頂部索引 ^

    SWAP文件系統(tǒng)
    mkswap /dev/hda3 創(chuàng)建一個swap文件系統(tǒng)
    swapon /dev/hda3 啟用一個新的swap文件系統(tǒng)
    swapon /dev/hda2 /dev/hdb3 啟用兩個swap分區(qū)

    返回頂部索引 ^

    備份
    dump -0aj -f /tmp/home0.bak /home 制作一個 '/home' 目錄的完整備份
    dump -1aj -f /tmp/home0.bak /home 制作一個 '/home' 目錄的交互式備份
    restore -if /tmp/home0.bak 還原一個交互式備份
    rsync -rogpav --delete /home /tmp 同步兩邊的目錄
    rsync -rogpav -e ssh --delete /home ip_address:/tmp 通過SSH通道rsync
    rsync -az -e ssh --delete ip_addr:/home/public /home/local 通過ssh和壓縮將一個遠程目錄同步到本地目錄
    rsync -az -e ssh --delete /home/local ip_addr:/home/public 通過ssh和壓縮將本地目錄同步到遠程目錄
    dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通過ssh在遠程主機上執(zhí)行一次備份本地磁盤的操作
    dd if=/dev/sda of=/tmp/file1 備份磁盤內容到一個文件
    tar -Puf backup.tar /home/user 執(zhí)行一次對 '/home/user' 目錄的交互式備份操作
    ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通過ssh在遠程目錄中復制一個目錄內容
    ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通過ssh在遠程目錄中復制一個本地目錄
    tar cf - . | (cd /tmp/backup ; tar xf - ) 本地將一個目錄復制到另一個地方,保留原有權限及鏈接
    find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 從一個目錄查找并復制所有以 '.txt' 結尾的文件到另一個目錄
    find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 結尾的文件并做成一個bzip包
    dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一個將 MBR (Master Boot Record)內容復制到軟盤的動作
    dd if=/dev/fd0 of=/dev/hda bs=512 count=1 從已經保存到軟盤的備份中恢復MBR內容

    返回頂部索引 ^

    光盤
    cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一個可復寫的光盤內容
    mkisofs /dev/cdrom > cd.iso 在磁盤上創(chuàng)建一個光盤的iso鏡像文件
    mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盤上創(chuàng)建一個壓縮了的光盤iso鏡像文件
    mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 創(chuàng)建一個目錄的iso鏡像文件
    cdrecord -v dev=/dev/cdrom cd.iso 刻錄一個ISO鏡像文件
    gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻錄一個壓縮了的ISO鏡像文件
    mount -o loop cd.iso /mnt/iso 掛載一個ISO鏡像文件
    cd-paranoia -B 從一個CD光盤轉錄音軌到 wav 文件中
    cd-paranoia -- "-3" 從一個CD光盤轉錄音軌到 wav 文件中(參數-3)
    cdrecord --scanbus 掃描總線以識別scsi通道
    dd if=/dev/hdc | md5sum 校驗一個設備的md5sum編碼,例如一張 CD

    返回頂部索引 ^

    網絡 - (以太網和WIFI無線)
    ifconfig eth0 顯示一個以太網卡的配置
    ifup eth0 啟用一個 'eth0' 網絡設備
    ifdown eth0 禁用一個 'eth0' 網絡設備
    ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
    ifconfig eth0 promisc 設置 'eth0' 成混雜模式以嗅探數據包 (sniffing)
    dhclient eth0 以dhcp模式啟用 'eth0'
    route -n show routing table
    route add -net 0/0 gw IP_Gateway configura default gateway
    route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16'
    route del 0/0 gw IP_gateway remove static route
    echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing
    hostname show hostname of system
    host www.example.com lookup hostname to resolve name to ip address and viceversa(1)
    nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2)
    ip link show show link status of all interfaces
    mii-tool eth0 show link status of 'eth0'
    ethtool eth0 show statistics of network card 'eth0'
    netstat -tup show all active network connections and their PID
    netstat -tupl show all network services listening on the system and their PID
    tcpdump tcp port 80 show all HTTP traffic
    iwlist scan show wireless networks
    iwconfig eth1 show configuration of a wireless network card
    hostname show hostname
    host www.example.com lookup hostname to resolve name to ip address and viceversa
    nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
    whois www.example.com lookup on Whois database

    GO TOP INDEX ^
    Microsoft Windows networks (SAMBA)
    nbtscan ip_addr netbios name resolution
    nmblookup -A ip_addr netbios name resolution
    smbclient -L ip_addr/hostname show remote shares of a windows host
    smbget -Rr smb://ip_addr/share like wget can download files from a host windows via smb
    mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share mount a windows network share

     

    posted @ 2013-09-09 18:30 yuhaibo736 閱讀(818) | 評論 (0)編輯 收藏

    手工建庫后出現(xiàn)ORA-06553:PLS-213:Standard包不可訪問 問題,在網上查下了資料解決了!

    ORACLE數據庫,在一次意外操作中,使得ORACLE數據庫出現(xiàn)故障,提示:ORA-06553:PLS-213:Standard包不可訪問。一般都是由于操作不當引起的,如:刪除某一用戶權限、刪除某一數據等等。下面把我總結出來的處理經驗公布如下:

    另外說幾點:網上很多人的博客雖然也有說明此問題的解決方法,但都比較專業(yè),沒有一些操作經驗的根本看不懂,也不知道如何操作,往往使讀者更糊涂。

    首先,本文測試平臺:windows 2003,oracle 9i

    我們的目標:執(zhí)行catalog.sql和catproc.sql重建數據字典。

    1.點擊左下角的“開始”--運行 輸入 sqlplus /nolog

    2.使用“超級管理員”(sys)的賬戶和密碼 進入你的系統(tǒng),命令如下:

    sql > connect sys/你的密碼@你的數據庫 as sysdba

    如果提示正確登錄,則已經成功一半了。如果沒有成功登錄,則參考是否忘記密碼,忘記密碼的補救不在本文的范圍,涉及到的請自行參考資料。

    3. SQL>@D:\oracle\ora90\rdbms\admin\catalog.sql

    4. SQL>@D:\oracle\ora90\rdbms\admin\CATPROC.SQL

    5. SQL>@D:\oracle\ora90\rdbms\admin\DBMSSUTIL.SQL

    6. SQL>ALTER PACKAGE STANDARD COMPILE;

    7. SQL>ALTER PACKAGE DBMS_STANDARD COMPILE;

    8. SQL>SHUTDOWN ABOUT;

    9. SQL>STARTUP;

    參考:(一般不用,如果恢復成功。)

    @ORACLE_BASE\ORACLE_HOME\rdbms\admin\utlrp.sql

    posted @ 2013-09-09 18:29 yuhaibo736 閱讀(995) | 評論 (0)編輯 收藏

    webservice的原理及概念

    1 webservice

    所謂webservice就是定義了一套標準的調用過程:

    a 服務器首先用一套標準的方法向外界描述它所提供的服務的內容,就屬于WSDL

    b 客戶端需要以一種標準的協(xié)議來調用此服務,這屬于SOAP.

    c 服務提供者將服務內容放在一個公共的網址讓大家查詢,就屬于UDDI.

    2 命名空間

    命名空間其主要目的通過加一個命名屬性,使名稱保持唯一性。WSDL有大量的使用命名空間的地方。本質上WSDL是一個XML文件,作為一個XML文件,為了區(qū)別同名的元素,就需要采用命名空間的概念。

    3 WSDL的本質:服務內容的標準化描述

    WSDL的全稱是web service Description Language,是一種基于XML格式的關于web服務的描述語言。其主要目的在于web service的提供者將自己的web服務的所有相關內容,如所提供的服務的傳輸方式,服務方法接口,接口參數,服務路徑等,生成相應的完全文檔,發(fā)布給使用者。使用者可以通過這個WSDL文檔,創(chuàng)建相應的SOAP請求消息,通過HTTP傳遞給webservice提供者;web服務在完成服務請求后,將SOAP返回消息傳回請求者,服務請求者再根據WSDL文檔將SOAP返回消息解析成自己能夠理解的內容。

    4 SOAP的本質:標準的傳輸協(xié)議

    SOAP是web service的標準通信協(xié)議,SOAP為simple object access protocoll的縮寫,簡單對象訪問協(xié)議. 它是一種標準化的傳輸消息的XML消息格式。

    5 UDDI的本質:服務的公共網址

    將web service進行UDDI注冊發(fā)布,UDDI是一種創(chuàng)建注冊表服務的規(guī)范,以便大家將自己的web service進行注冊發(fā)布供使用者查找.然而當服務提供者想將自己的web service向全世界公布,以便外部找到其服務時,那么服務提供者可以將自己的web service注冊到相應的UDDI商用注冊網站,目前全球有IBM等4家UDDI商用注冊網站。因為WSDL文件中已經給定了web service的地址URI,外部可以直接通過WSDL提供的URI進行相應的web service調用。所以UDDI并不是一個必需的web service組件,服務方完全可以不進行UDDI的注冊。

    posted @ 2013-04-23 11:17 yuhaibo736 閱讀(258) | 評論 (0)編輯 收藏

    java處理word已經存在很多種方法了,但是用起來都不是那么方便,而且不太靈活,而使用xml的方法可以做到非常靈活,你可以先建好模板,然后往里面填數,模板怎么建,填出來的效果就是怎么樣的。首先說說word和xml的關系,每個word它都對應著一個xml文件,也就是說你修改了xml,對應的word文件也就跟著修改了。通過word的保存功能可以將一個word文件保存為xml文件,該文件雖然是.xml格式的,但是直接雙擊打開的話還是使用word打開,所以你只能用txt將它打開,用txt打開之后將里面的一句話:<?mso-application progid="Word.Document"?>去掉,然后保存,接著就可以雙擊直接打開了,這樣使用的就是IE打開的,你這樣就可以查看里面的節(jié)點具體的構造。

    最上面的主節(jié)點是<w:wordDocument>(如果不是的話,相信你將word文件保存成xml的時候使用的是07word,選擇的是:word xml文檔(*.xml),你可以選擇word 2003 xml文檔(*.xml)試試);該主節(jié)點下面有大致8個節(jié)點,其中我們要操作的就是<w:body>節(jié)點,該節(jié)點是word的正文節(jié)點,其他的節(jié)點沒有去研究;<w:body>下面包含的節(jié)點可能會有:<w:p>段落節(jié)點、<w:tbl>表格節(jié)點。

    接著要做的就是在java程序中,使用dom來解析編輯xml文件,這里貼出一些代碼來供大家參考:

     

    public Document loadXML(String filename){//////////加載xml文件

    Document document = null; 

       try{

       DocumentBuilderFactory   factory = DocumentBuilderFactory.newInstance();    

           DocumentBuilder builder=factory.newDocumentBuilder();    

           document=builder.parse(new File(filename));    

           document.normalize(); 

       }catch (Exception ex){

           ex.printStackTrace(); 

       }   

       return document; 

    }

     

    public boolean doc2XmlFile(Document document,File targetFile){ ///////回寫xml文件

    boolean flag = true; 

       try{

       TransformerFactory tFactory = TransformerFactory.newInstance();    

           Transformer transformer = tFactory.newTransformer();  

           DOMSource source = new DOMSource(document);  

           StreamResult result = new StreamResult(targetFile.toURI().getPath());

           transformer.transform(source, result);  

       }catch(Exception ex){ 

           flag = false; 

           ex.printStackTrace(); 

       } 

       return flag;       

    }

    String void function(){///////////程序入口

     

    String rootPath=ServletActionContext.getServletContext().getRealPath("/excelTemplate")+"\\";

    try{

    Document document=loadXML(rootPath+"projectModel.xml");

    Element root = document.getDocumentElement();

    NodeList rootList=root.getChildNodes();

    Node bodyNode=null;///////w:body

    for(int i=0;i<rootList.getLength();i++){////////找到<w:body>節(jié)點

    bodyNode=rootList.item(i);

    if("w:body".equals(bodyNode.getNodeName())){

    break;

    }

    }

    NodeList nodeList=bodyNode.getChildNodes();

    for(int i=0;i<nodeList.getLength();i++){

    Node node=nodeList.item(i);

    if("w:tbl".equals(node.getNodeName())){

    dealWithTableNode(document,node);

    }else if("w:p".equals(node.getNodeName())){

    dealWithWPNode(document,node);

    }

     

    }

    File destFile = File.createTempFile("project", ".xml");

    doc2XmlFile(document,destFile);///////回寫

    inputStream = new FileInputStream(destFile);/////////生成流,用于下載

    fileName=URLEncoder.encode(project.getProjectName(),"utf-8")+".doc";

    }catch(Exception e){

    e.printStackTrace();

    }

     

    }

    注意:

    1、在解析編輯xml文件的時候一定好看好節(jié)點的位置,比如一般的文本內容的話可能是在<w:p>節(jié)點下的<w:r>節(jié)點下的<w:t>里設置,使用的是getTextContent()方法來獲取它的內容,setTextContent()來設置它的參數

    2、對于圖片如何插入呢?首先最好在模板中插入一張圖片,主要用于定下圖片的那些格式,然后圖片必須用java轉成base64的字符串,這里也提供一個方法:

     

    private String toBASE64codeFile(File file){

    String codeString="";

    try{

    FileInputStream fis=new FileInputStream(file);

    BASE64Encoder encoder=new BASE64Encoder();

    byte[] b=new byte[228];

    int count=-1,n=0;

    while((count=fis.read(b))!=-1){

    codeString+=encoder.encode(b);

    }

    return codeString;

    }catch(Exception e){

    e.printStackTrace();

    return "";

    }

    }

    然后找到<w:pict>節(jié)點:一般如果圖片是在table里的話,該節(jié)點就是在<w:tbl>-<w:tr>-<w:tc>-<w:p>-<w:r>節(jié)點下面,不在table里的話就是:<w:p>-<w:r>,建議仿照用IE打開的xml對照一下。然后將該節(jié)點下的<w:binData>的內容置成你所要插入的圖片的base64碼即可。

    posted @ 2013-03-06 13:30 yuhaibo736 閱讀(613) | 評論 (0)編輯 收藏

    將幾個word文件合并到一個word文件,需要下載jacob-1.17-M2.zip,將壓縮文件內的jacob-1.17-M2-x64.dll放到windows/system32下,將jacob.jar放到項目中
    public static void main(String[] args) {
       List list  = new ArrayList();
       String file1= "D:\\file1.doc";
       String file2= "D:\\file2.doc";
       String file3= "D:\\file3.doc";
       list.add(file1);
       list.add(file2);
       list.add(file3);
       uniteDoc(list,"d:\\file.doc");
     }
     public static void uniteDoc(List fileList, String savepaths) {
      if (fileList.size() == 0 || fileList == null) {
       return;
      }
      //打開word
      ActiveXComponent app = new ActiveXComponent("Word.Application");//啟動word
      try {
       // 設置word不可見
       app.setProperty("Visible", new Variant(false));
       //獲得documents對象
       Object docs = app.getProperty("Documents").toDispatch();
       //打開第一個文件
       Object doc = Dispatch
                    .invoke(
                            (Dispatch) docs,
                            "Open",
                            Dispatch.Method,
                            new Object[] { (String) fileList.get(0),
                                    new Variant(false), new Variant(true) },
                            new int[3]).toDispatch();
       //追加文件
       for (int i = 1; i < fileList.size(); i++) {
        Dispatch.invoke(app.getProperty("Selection").toDispatch(),
                        "insertFile", Dispatch.Method, new Object[] {
                                (String) fileList.get(i), "",
                                new Variant(false), new Variant(false),
                                new Variant(false) }, new int[3]);
       }
       //保存新的word文件
       Dispatch.invoke((Dispatch) doc, "SaveAs", Dispatch.Method,
                    new Object[] { savepaths, new Variant(1) }, new int[3]);
       Variant f = new Variant(false);
       Dispatch.call((Dispatch) doc, "Close", f);
      } catch (Exception e) {
       throw new RuntimeException("合并word文件出錯.原因:" + e);
      } finally {
       app.invoke("Quit", new Variant[] {});
      }
     }


    posted @ 2013-03-06 13:20 yuhaibo736 閱讀(1242) | 評論 (0)編輯 收藏


    package com.cbd.dk.test;

    import java.util.ListIterator;
    import java.util.Stack;

    public class Test {

     private String src;

     public Test(String src) {
      this.src = src;
     }
     public double getResult() {
      String postfix = getPostfix();
      Stack<String> stk = new Stack<String>();
      //System.out.println(postfix);
      String parts[] = postfix.split(" +");
      double result=0;
      for(int i=0; i<parts.length; i++){
       char tmp = parts[i].charAt(0);
       if(!isOperator(tmp)){
        stk.push(parts[i]);
       }else{
        double a = Double.parseDouble(stk.pop());
        double b = Double.parseDouble(stk.pop());
        result = calculate(b,a,tmp);
        stk.push(String.valueOf(result));
       }
      }
      return result;
     }


     /**
      * test if the character is an operator,such +,-,*,/
      * @param op  the character to test
      * @return  true if op is an operator otherwise false
      */
     private boolean isOperator(char op){
      return (op=='+'||op=='-'||op=='*'||op=='/');
     }


     /**
      * calculate an expression such (a op b)
      * @param a  number 1
      * @param b  number 2
      * @param op the operator
      * @return  (double)(a op b)
      */
     public double calculate(double a, double b, char op) {
      switch (op) {
       case '+':
        return a + b;
       case '-':
        return a - b;
       case '*':
        return a * b;
       case '/':
        return a / b;
      }
      return -1;
     }


     /**
      * convert the suffix to postfix
      * @return the postfix as a string
      */
     private String getPostfix() {
      Stack<String> stk = new Stack<String>();
      String postfix = new String();
      char op;
      int i = 0;
      while (i < src.length()) {
       if (Character.isDigit(src.charAt(i))||src.charAt(i)=='.') {
        postfix += " ";
        do {
         postfix += src.charAt(i++);
        } while ((i < src.length()) && (Character.isDigit(src.charAt(i))));
        postfix += " ";
       }else {
        switch (op = src.charAt(i++)) {
         case '(':
          stk.push("(");
          break;
         case ')':
          while (stk.peek() != "(") {
           String tmp = stk.pop();
           postfix += tmp;
           if(tmp.length()==1 && isOperator(tmp.charAt(0)))
            postfix += " ";
          }
          stk.pop();
          postfix += " ";
          break;
         case '+':
         case '-':
          while ((!stk.empty()) && (stk.peek() != "(")) {
           postfix += stk.pop()+" ";
          }
          stk.push(new Character(op).toString());
          break;
         case '*':
         case '/':
          while ((!stk.empty()) && ((stk.peek() == "*") || (stk.peek() == "/"))) {
           postfix += stk.pop()+" ";
          }
          stk.push(new Character(op).toString());
          break;
        }
       }
      }
      ListIterator it = stk.listIterator(stk.size());
      while (it.hasPrevious())
       postfix += it.previous() + " ";
      return postfix.trim().replaceAll(" +\\.",".");
     }

     /**
      * main function
      * @param args
      */
     public static void main(String args[]) {
      //System.out.println(new Test("((1.5+6.000)*9+9.36)*(8-8*8+8*7)").getResult());
      System.out.println(new Test("(2+(3*2)/2)").getResult());
     }
    }

    posted @ 2012-12-11 16:24 yuhaibo736 閱讀(1134) | 評論 (0)編輯 收藏

    WITH CTE AS
    (
    SELECT OBJ_VW_ID,NODE_CODE ,P_NODE_CODE,NODE_TYP ,NODE_CAP,OBJ_VW_ENG_NAME,SN,ICON_TYP,rn=cast(NODE_CODE  as varchar(max)),level = 1 FROM DSK_OBJ_VW_DISP  WHERE NODE_CODE in (select NODE_CODE from DSK_OBJ_VW_DISP where P_NODE_CODE='2')
    UNION ALL
    SELECT T.OBJ_VW_ID,T.NODE_CODE,T.P_NODE_CODE,T.NODE_TYP,T.NODE_CAP,T.OBJ_VW_ENG_NAME,T.SN,T.ICON_TYP,rn=rn+cast(T.NODE_CODE AS VARCHAR(MAX)), level=level+1 FROM DSK_OBJ_VW_DISP T,CTE WHERE CTE.NODE_CODE=T.P_NODE_CODE
    )
    SELECT OBJ_VW_ID,NODE_CODE ,P_NODE_CODE,NODE_TYP,NODE_CAP,OBJ_VW_ENG_NAME,SN,ICON_TYP,rn,level FROM CTE  ORDER BY rn

    posted @ 2012-10-23 15:04 yuhaibo736 閱讀(722) | 評論 (0)編輯 收藏

    package test;

    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.commons.lang3.StringUtils;

    public class TestStringUtils {
     
     public static void main(String[] args) {
      // 空字符串檢查
      String t1_1 = "";
      String t1_2 = "\n\n\t";
      String t1_3 = null;
      String t1_4 = "Test";
      System.out.println("t1_1 blank? " + StringUtils.isBlank(t1_1));
      System.out.println("t1_2 blank? " + StringUtils.isBlank(t1_2));
      System.out.println("t1_3 blank? " + StringUtils.isBlank(t1_3));
      System.out.println("t1_4 blank? " + StringUtils.isBlank(t1_4));
      // 清除空白字符
      String t2_1 = "\t";
      String t2_2 = "  A  Test  ";
      String t2_3 = null;
      System.out.println("t2_1 trimToNull: " + StringUtils.trimToNull(t2_1));
      System.out.println("t2_2 trimToNull: " + StringUtils.trimToNull(t2_2));
      System.out.println("t2_3 trimToNull: " + StringUtils.trimToNull(t2_3));
      System.out.println("t2_1 trim: " + StringUtils.trim(t2_1));
      System.out.println("t2_2 trim: " + StringUtils.trim(t2_2));
      System.out.println("t2_3 trim: " + StringUtils.trim(t2_3));
      // 取得字符串的縮寫
      String t3_1 = "This is a test of the abbreviation.";
      String t3_2 = "Test";
      System.out.println(StringUtils.abbreviate(t3_1, 15));
      System.out.println(StringUtils.abbreviate(t3_1, 5, 15));
      System.out.println(StringUtils.abbreviate(t3_2, 10));
      // 劈分字符串
      String t4_1 = "A b,c.d|e";
      String t4_2 = "Pharmacy, basketball funky";
      String[] array1 = StringUtils.split(t4_1, " ,.|");
      String[] array2 = StringUtils.split(t4_2, " ,", 2);
      System.out.println(ArrayUtils.toString(array1));
      System.out.println(ArrayUtils.toString(array2));
      // 查找嵌套字符串
      String t5_1 = "ABC1234ABC4567";
      System.out.println(StringUtils.substringBetween(t5_1, "1234", "4567"));
      System.out.println(StringUtils.substringBetween(t5_1, "12345", "4567"));
      // 去除尾部換行符
      String t6_1 = "Hello\n";
      System.out.println(StringUtils.chomp(t6_1));
      String t6_2 = "Another test\r\n";
      System.out.println(StringUtils.chomp(t6_2));
      // 重復字符串
      System.out.println(StringUtils.repeat("*", 10));
      System.out.println(StringUtils.repeat("China ", 5));
      // 顛倒字符串
      System.out.println(StringUtils.reverse("ABCDE"));
      // 判斷字符串內容的類型
      String t7_1 = "Virginia";
      System.out.println("Is state number? " + StringUtils.isNumeric(t7_1));// 全由數字組成
      System.out.println("Is state alpha? " + StringUtils.isAlpha(t7_1));// 全由字母組成
      System.out.println("Is state alphanumeric? " + StringUtils.isAlphanumeric(t7_1));// 全由數字或數字組成
      System.out.println("Is state alphaspace? " + StringUtils.isAlphaSpace(t7_1));// 全由字母或空格組成
      // 取得某字符串在另一字符串中出現(xiàn)的次數
      System.out.println(StringUtils.countMatches("Chinese People", "e"));
      // 部分截取字符串
      String t8_1 = " 25 * (30,40) [50,60] | 30";
      System.out.print("N0: " + StringUtils.substringBeforeLast(t8_1, "*"));
      System.out.print(", N1: " + StringUtils.substringBetween(t8_1, "(", ","));
      System.out.print(", N2: " + StringUtils.substringBetween(t8_1, ",", ")"));
      System.out.print(", N3: " + StringUtils.substringBetween(t8_1, "[", ","));
      System.out.print(", N4: " + StringUtils.substringBetween(t8_1, ",", "]"));
      System.out.print(", N5: " + StringUtils.substringAfterLast(t8_1, "|"));
     }

    }

    posted @ 2012-08-30 11:02 yuhaibo736 閱讀(573) | 評論 (0)編輯 收藏

    依賴包 json-lib-2.2.3-jdk13.jar、dom4j-1.6.1.jar

     

    package com.shine.framework.core.util;
    import java.io.ByteArrayOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import net.sf.json.JSON;
    import net.sf.json.JSONSerializer;
    import net.sf.json.xml.XMLSerializer;
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.XMLWriter;
    /**
    * common xml conver utility
    *
    * @author viruscodecn@gmail.com
    * @version Framework 2010.10.26
    */
    public class XmlConverUtil {
    /**
    * map to xml xml <node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node>
    *
    * @param map
    * @return
    */
    public static String maptoXml(Map map) {
    Document document = DocumentHelper.createDocument();
    Element nodeElement = document.addElement("node");
    for (Object obj : map.keySet()) {
    Element keyElement = nodeElement.addElement("key");
    keyElement.addAttribute("label", String.valueOf(obj));
    keyElement.setText(String.valueOf(map.get(obj)));
    }
    return doc2String(document);
    }
    /**
    * list to xml xml <nodes><node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node><node><key
    * label="key1">value1</key><key
    * label="key2">value2</key>......</node></nodes>
    *
    * @param list
    * @return
    */
    public static String listtoXml(List list) {
    Document document = DocumentHelper.createDocument();
    Element nodesElement = document.addElement("nodes");
    for (Object o : list) {
    Element nodeElement = nodesElement.addElement("node");
    for (Object obj : ((Map) o).keySet()) {
    Element keyElement = nodeElement.addElement("key");
    keyElement.addAttribute("label", String.valueOf(obj));
    keyElement.setText(String.valueOf(((Map) o).get(obj)));
    }
    }
    return doc2String(document);
    }
    /**
    * json to xml {"node":{"key":{"@label":"key1","#text":"value1"}}} conver
    * <o><node class="object"><key class="object"
    * label="key1">value1</key></node></o>
    *
    * @param json
    * @return
    */
    public static String jsontoXml(String json) {
    try {
    XMLSerializer serializer = new XMLSerializer();
    JSON jsonObject = JSONSerializer.toJSON(json);
    return serializer.write(jsonObject);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * xml to map xml <node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node>
    *
    * @param xml
    * @return
    */
    public static Map xmltoMap(String xml) {
    try {
    Map map = new HashMap();
    Document document = DocumentHelper.parseText(xml);
    Element nodeElement = document.getRootElement();
    List node = nodeElement.elements();
    for (Iterator it = node.iterator(); it.hasNext();) {
    Element elm = (Element) it.next();
    map.put(elm.attributeValue("label"), elm.getText());
    elm = null;
    }
    node = null;
    nodeElement = null;
    document = null;
    return map;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * xml to list xml <nodes><node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node><node><key
    * label="key1">value1</key><key
    * label="key2">value2</key>......</node></nodes>
    *
    * @param xml
    * @return
    */
    public static List xmltoList(String xml) {
    try {
    List<Map> list = new ArrayList<Map>();
    Document document = DocumentHelper.parseText(xml);
    Element nodesElement = document.getRootElement();
    List nodes = nodesElement.elements();
    for (Iterator its = nodes.iterator(); its.hasNext();) {
    Element nodeElement = (Element) its.next();
    Map map = xmltoMap(nodeElement.asXML());
    list.add(map);
    map = null;
    }
    nodes = null;
    nodesElement = null;
    document = null;
    return list;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * xml to json <node><key label="key1">value1</key></node> 轉化為
    * {"key":{"@label":"key1","#text":"value1"}}
    *
    * @param xml
    * @return
    */
    public static String xmltoJson(String xml) {
    XMLSerializer xmlSerializer = new XMLSerializer();
    return xmlSerializer.read(xml).toString();
    }
    /**
    *
    * @param document
    * @return
    */
    public static String doc2String(Document document) {
    String s = "";
    try {
    // 使用輸出流來進行轉化
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    // 使用UTF-8編碼
    OutputFormat format = new OutputFormat(" ", true, "UTF-8");
    XMLWriter writer = new XMLWriter(out, format);
    writer.write(document);
    s = out.toString("UTF-8");
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return s;
    }
    public static void main(String args[]) {
    XmlConverUtil util = new XmlConverUtil();
    String xml = "{/"node/":{/"key/":{/"@lable/":/"key1/",/"#text/":/"value1/"}}}";
    System.out.println(util.jsontoXml(xml));
    }
    }

    posted @ 2012-08-28 15:16 yuhaibo736 閱讀(2018) | 評論 (0)編輯 收藏

    commons-beanutils-1.8.0.jar不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean
    commons-collections.jar 不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap
    commons-lang-2.4.jar不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
    commons-logging-1.1.1.jar不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    ezmorph-1.0.4.jar不加這個包
    java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher
    json-lib-2.3-jdk15.jar不加這個包
    java.lang.NoClassDefFoundError: net/sf/json/JSONObject
    相應jar包可到網上下載!
    實例:
    import java.util.ArrayList;
    import java.util.List;

    import net.sf.json.JSONArray;

    public class JsonTest {

    /**
    * @param args
    */
    public static void main(String[] args) throws Exception{
    boolean[] boolArray = new boolean[]{true,false,true}; 
    JSONArray jsonArray = JSONArray.fromObject( boolArray ); 
    System.out.println( jsonArray );

    List list = new ArrayList(); 
    list.add( "first" ); 
    list.add( "second" ); 
    JSONArray jsonArray2 = JSONArray.fromObject( list ); 
    System.out.println( jsonArray2 );
    }
    }

    posted @ 2012-08-15 14:04 yuhaibo736 閱讀(4684) | 評論 (2)編輯 收藏

      1.將Image圖像文件存入到數據庫中 我們知道數據庫里的Image類型的數據是"二進制數據",因此必須將圖像文件轉換成字節(jié)數組才能存入數據庫中。

      //根據文件名(完全路徑)

      public byte[] SetImageToByteArray(string fileName)

      { FileStream fs = new FileStream(fileName, FileMode.Open);

      int streamLength = (int)fs.Length; byte[] image = new byte[streamLength];

      fs.Read(image, 0, streamLength);

      fs.Close();

      return image; }

      //另外,在ASP.NET中通過FileUpload控件得到的圖像文件可以通過以下方法

      public byte[]

      SetImageToByteArray(FileUpload FileUpload1)

      { Stream stream = FileUpload1.PostedFile.InputStream;

      byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];

      stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);

      stream.Close();

      return photo;

      }

      2.從SQL Server數據庫讀取Image類型的數據,并轉換成bytes[]或Image圖像文件

      //要使用SqlDataReader要加載using System.Data.SqlClient命名空間

      //將數據庫中的Image類型轉換成byte[] public byte[] SetImage(SqlDataReader reader)

      { return (byte[])reader["Image"];//Image為數據庫中存放Image類型字段 }

      //將byte[]轉換成Image圖像類型 //加載以下命名空間using System.Drawing;/using System.IO;

      using System.Data.SqlClient;*/ public Image SetByteToImage(byte[] mybyte)

      { Image image; MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);

      image = Image.FromStream(mymemorystream);

      return image;

      }

    posted @ 2012-08-14 13:07 yuhaibo736 閱讀(317) | 評論 (0)編輯 收藏

    如果大家在ORACLE里面用慣了Sequence,要在SqlServer里實現(xiàn)Sequence,就會發(fā)現(xiàn)沒有現(xiàn)成的Sequence對象可以Create了。那應該怎么辦呢?

    當然這點小問題是難不倒我們程序員的,“max+1啊”,有人會說這樣的方式。是的,這種方式實現(xiàn)起來也比較簡單。當然你也許還會說,最Sql的方式是采用identity列,自增的方式去增加就ok了。但是這樣的列如果要實現(xiàn)“YYYYMMDD”+“部門編號(如ZX)”+Sequence值 (例如:20100707ZX000002)的格式就不行了。還是老老實實用存儲過程來取得一個Sequence值吧,使用起來也就隨心所欲了。

     

    網上常見的一個存儲過程為 為當前庫所有用到Sequence建一張表,譬如“AllSequence”,內含四個字段【名字,起點值,遞增值,當前值】,創(chuàng)建Sequence的時候就創(chuàng)建一條記錄,獲取Sequence的時候就從對應行的當前值按遞增值增加得到。

     

    在并發(fā)性請求不那么高的系統(tǒng)里,這種過程是沒有問題的。但是并發(fā)性請求一旦處于某個量級以后,這個過程常常會遇到問題。

     

    以下為一個改進方法,適合于高吞吐量的訪問請求,比如每秒數千次的請求:

    復制代碼
    -- 假定要給T_0101001創(chuàng)建一個Sequence

    -- 創(chuàng)建表SeqT_0101001
    create table SeqT_0101001(

          
    -- ID列為自增列
          SeqID int identity(1,1primary key,

          
    -- Sequence值
          SeqVal varchar(1)
    )

    -- 創(chuàng)建從SeqT_0101001表獲取最新Sequence值的存儲過程
    create procedure P_GetNewSeqVal_SeqT_0101001
    as
    begin
          
    -- 聲明新Sequence值變量
          declare @NewSeqValue int

          
    -- 設置插入、刪除操作后的條數顯示取消
          set NOCOUNT ON

          
    -- 插入新值到SeqT_0101001表
          insert into SeqT_0101001 (SeqVal) values ('a')   

          
    -- 設置新Sequence值為插入到SeqT_0101001表的標識列內的最后一個標識值  
          set @NewSeqValue = scope_identity()   

          --如果組合的Sequence值<999999999(大于的話數值會溢出),如:“YYYY”+5位的Sequence值(201019988),可以采用下面的方式來實現(xiàn)
          --set @NewSeqValue = Convert(char(4),Getdate(),112) + right('00000'+CAST(scope_identity() AS varchar(5)),5)
          --這樣直接Print @NewSeqVal 就可以得到類似“201019988”的Sequence值

          
    -- 刪除SeqT_0101001表(不顯示被鎖行)
          delete from SeqT_0101001 WITH (READPAST)

    -- 返回新Sequence值
    return @NewSeqValue

    end

    --使用Sequence
    Declare @NewSeqVal int
    Exec @NewSeqVal =  P_GetNewSeqVal_SeqT_0101001
    Print @NewSeqVal
    Print Convert(char(8),Getdate(),112) +'ZX'+ right('000000'+CAST(@NewSeqVal AS varchar(5)),6)
    復制代碼

     


    要獲取剛才我們提到的 “20100707ZX000002”這種格式的話,下面這樣就可以了
    Print Convert(char(8),Getdate(),112) +'ZX'+ right('000000'+CAST(@NewSeqVal AS varchar(5)),6)



    缺點:不能直接在非存儲過程的select的語句中直接使用。

    信息來源:http://www.cnblogs.com/heekui/archive/2008/07/24/1250842.html

    posted @ 2012-08-06 14:48 yuhaibo736 閱讀(1111) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲av无码专区在线观看亚| 在线看片v免费观看视频777| 亚洲Av永久无码精品黑人| 亚洲精品中文字幕乱码影院| 精品国产日韩亚洲一区| 四虎影视精品永久免费| 在线免费观看色片| 一本岛高清v不卡免费一三区| 成人影片一区免费观看| 成人精品视频99在线观看免费| 无码一区二区三区亚洲人妻| 成人区精品一区二区不卡亚洲| 亚洲午夜成激人情在线影院| 亚洲国产天堂在线观看| 久久久亚洲AV波多野结衣| 久久久久久a亚洲欧洲aⅴ| 国产亚洲精品一品区99热| 亚洲国产精品无码av| 亚洲视频在线免费观看| 亚洲伦理一区二区| 亚洲色图综合网站| 亚洲一区二区三区在线观看蜜桃| 亚洲大尺码专区影院| 亚洲欧美国产国产一区二区三区| 亚洲精品日韩一区二区小说| 亚洲中文字幕日本无线码| 亚洲aⅴ天堂av天堂无码麻豆| 黄网站色视频免费看无下截 | 免费看无码自慰一区二区| 午夜视频免费成人| 又黄又大又爽免费视频| 国产精品亚洲精品日韩已方| 亚洲精品无码不卡在线播HE| 久久久久亚洲精品成人网小说| 亚洲国产美女福利直播秀一区二区 | 国内外成人免费视频| 亚洲日韩欧洲无码av夜夜摸| 亚洲视频欧洲视频| 粉色视频成年免费人15次| 无码A级毛片免费视频内谢| 日韩a在线观看免费观看|