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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

        越來越覺的JRuby是個很有前途的項目,結合Ruby的性感語法和java極其豐富的類庫,況且有團隊持續不斷地修正bug、改進性能,這樣的玩意完全有成為“少男殺手”的潛質。JRuby wiki上列出了性能優化的四條建議:
    1、調優編譯器,JRuby早就棄暗投明跟隨XRuby走上了編譯這條牛B的道路,將Ruby Script編譯成字節碼,因此這個環節是斷斷不能忽略的。
    兩種編譯方式:
    AOT模式:直接生成class文件,脫了Ruby這層皮,咱就是人見人“愛”的java了。
    JIT模式:充分利用成熟的jit技術,咱不全脫,朦朧美才是真的美。默認從0.9.9版本開始就是開啟的,關閉的話(要我說還不如全脫)
    jruby -J-Djruby.jit.enabled=false


    2、關閉ObjectSpace
    ObjectSpace是Ruby用來操作所有運行時對象的模塊,這個功能相當牛x。這個的實現在c ruby里是比較容易的,但是對于JRuby代價就比較昂貴了,其實就大部分情況下你基本用不到這個東東,那么最好就是關閉它,JRuby提供了
    jruby -J-Djruby.objectspace.enabled=false
    選項來關閉它。

    3、開啟線程池
    我們知道,在c ruby中的線程是綠色的輕量級線程,因此運行時就動不動開個百來十個“線程”跑一跑充下款爺;然而在JRuby中,線程的實現那可是實打實的本地線程(也就是Ruby線程與java線程一比一),你這么動不動上百個線程那不慢才怪了。因此JRuby提供了線程池選項,運行時盡可能地滿足你的要求開線程,但是當短命的Ruby線程重復創建的時候,這些線程將被復用,這在大多數情況下能提高性能表現,特別是在每次調用都啟動一個線程的情況下。不過具體效果還是要測試的實際數據說話。
    jruby -J-Djruby.thread.pooling=true


    4、使用Java "server"模式虛擬機,地球淫都知道
    jruby -J-server myscript.rb

    5、盡量使用最新的jdk,在我的測試中,jdk6跑jruby是效率最高的。

    posted @ 2008-01-31 18:58 dennis 閱讀(4418) | 評論 (1)編輯 收藏

    class BitStruct
      
    def self.list(name,element)
        module_eval 
    <<-HERE
          rest :body
          
    def #{name.to_s}=(elist)
             e=Object.const_get(:#{element})
             if elist.respond_to? :each and elist.respond_to? :[] and elist[0].is_a? e
                elist.each{ 
    |value| self.body+=value}
             elsif elist.is_a? e
                self.body
    =elist
             
    else
                
    raise ArgumentError,elist.to_s<<" is not a #{element}",caller
             end
          end
          
    def #{name.to_s}
             result=[]
             e
    =Object.const_get(:#{element})
             size=e.new.size
             num
    =self.body.size/size-1
             
    for i in 0..num
                result[i]
    =e.new(self.body[i*size,size])
             end
             result
          end
        HERE
      end
    end
    利用Ruby的動態特性,很容易就達到了,使用的話:

    class A <BitStruct
       unsigned :id,
    32
    end
    class B<BitStruct
       list :aList,A
    end
    alist
    =[]
    for i in 0..10
      a
    =A.new
      a.id
    =i
      alist.unshift a
    end
    b
    =B.new
    b.aList
    =alist
    b.aList.each{
    |e| puts e.id}

    posted @ 2008-01-27 15:53 dennis 閱讀(363) | 評論 (0)編輯 收藏

        分析二進制協議或者存取二進制文件是個很常見的需求,Ruby的IO提供了對二進制的讀操作,但是寫入卻只提供字符。并且讀的操作也比較笨拙,例如,在c里面的話,我們一般是定義個struct,然后:

    fread(record, sizeof(record), 1, stream);

    在java里,也是比較容易,特別是nio引入了ByteBuffer之后就更方便了。Ruby的話,我得自己確定讀多少個字節,并自己“組裝”成原始數據,這顯然太麻煩了,幸好,我們有bit-struct :)
        到主頁下載,解壓之后參照README安裝下就OK了。使用的話,也是先定義結構,然后new就行了:
    require 'bit-struct'
    class Message < BitStruct
        signed :msg_length,
    32
        
    char   :type,24
        signed :uid,
    32
        unsigned :cmd,
    16
        rest  :body
    end
    msg
    =Message.new
    file.read(msg)
    p msg.inspect

    bit-struct支持float,char,unsigned,signed,text,pad,nest,oct,hex,其中nest用于聲明一個嵌套結構,例如:
    class Sub < BitStruct
        unsigned :x,    
    8
     end

    class A < BitStruct
        nest    :n,  Sub
    end

    = A.new
    p a  
    # ==> #<A n=#<Sub x=0>>

    如果你看下源碼的話,會發現BitStruct繼承String類,因此IO可以直接將BitStruct寫入文件,內部自動幫你處理轉換細節。

    posted @ 2008-01-25 18:56 dennis 閱讀(1676) | 評論 (0)編輯 收藏

    天涯上的牛人真多



    posted @ 2008-01-22 14:12 dennis 閱讀(437) | 評論 (0)編輯 收藏

        我從來就不是很安分的人,來福州兩個月了,在star-net也干了兩個月,最后還是經不住誘惑決定去廣州了。原因?怎么說呢,在福州的工作沒有我想象中的有趣,做的東西都是比較事務性,或者說沒有激起我的熱情。不過對于在福建的來說,star-net應該還是很好的選擇。提辭職對于公司來說挺突然的,不過我做事情從來都是仔細考慮過后才會決定的,如果沒有想好就提的話難免讓人以為我在要挾什么的。廣州那邊其實很早就聯系了,因為mryufeng老大在那,他幫我推薦了下,很感激老大。說起來跟mryufeng老大認識還通過javaeye,在javaeye上真認識了不少人。去廣州的話,很有可能是做服務器開發,主要是java,可能用到cpp、erlang、腳本語言等等,可以說是混合性比較強的工作,不過也有可能去做web開發,這塊畢竟是我一直在做的。還是希望能跳出web這個領域,我的興趣還是在并發和服務器上。
        明天晚上坐長途班車出發,后天一早到廣州,準備投靠一哥們,這哥們還是大學時玩網絡游戲認識的。在游戲里很投緣,這廝一個人從唐山跑到廣州混了兩年了,而且混的挺好,不得不讓我佩服。先去投靠他幾天,然后慢慢找房子,14號就正式去上班了。去了潛心好好干,好好向公司里的老大們學習,畢竟是我最感興趣的領域啊,機會難得。

    posted @ 2008-01-11 15:58 dennis 閱讀(621) | 評論 (3)編輯 收藏

        smartclient是一個企業級的ajax框架,包括非常出色的UI庫、工具庫和客戶端服務端數據綁定等功能。smartclient本來是一個商業產品, 2007年11月7號才以LGPL協議開源。除了一些所見即所得的構建工具和企業級的可選組件外,其他都開源了。這個記的javaeye和infoq都有報道。
        在接觸smartclient以前,我還沒有使用過類似的ajax ui庫,比如現在很火的ext。smartclient給我的第一印象是非常漂亮的ui效果,有興趣可以去它的官方demo看看。smartclient的demo和文檔做的非常出色,入手開發也非常容易。
    第一步:下載LGPL版本,并解壓縮
    第二步:運行解壓后目錄下的\SmartClient_60_LGPL\smartclientSDK\start_embedded_server.bat,SDK自帶了一個內嵌的tomcat
    第三步:訪問 http://localhost:8080

    你將見到:


    這些demo本身就是用smartclient制作的。開發過程中你需要做就是查看examples和文檔中的reference(api文檔),基本沒有解決不了的問題。

    人見人愛的Hello World例子:
    isc.Label.create({
        height: 
    50,
        styleName: 
    "helloWorldText",
        padding: 
    4,
        backgroundColor: 
    "#ffffd0",
        align: 
    "center",
        valign: 
    "center",
        wrap: 
    false,
        showEdges: 
    true,
        showShadow: 
    true,
        contents: 
    "Hello world!"
    })

    效果:


        smartclient除了完整的UI組件,還包括豐富的動態效果庫以及可選的皮膚等高級主題,不再展開了,畢竟貼圖是在是挺麻煩的事情:)還不如有興趣的自己翻demo。說了這么多優點,那么缺點是啥?你可能猜到了,性能!所有js UI庫無法避免的問題,不過我沒有其他UI庫的使用經驗,倒是不能給出個比較數據。我們寫的東西的性能也只是堪堪能夠接受。
       smartclient跟dwr可以說是天生一對,smartclient UI組件的數據源可以是xml也可以是json,如果采用json做交換格式,可以與dwr無縫結合,真正實現One Page,One Application(我們就是這樣做的^_^)。






    posted @ 2008-01-08 15:48 dennis 閱讀(7493) | 評論 (1)編輯 收藏

        《編程珠璣》第一章第一題就相當的精彩,做個筆記。題目如下:
    輸入:   一個包含n個正整數的文件,每個正整數小于n,n等于10的7次方(一千萬)。并且文件內的正整數沒有重復和關聯數據。

    輸出:  輸入整數的升序排列
     
    約束: 限制在1M左右內存,充足的磁盤空間

        假設整數占32位,1M內存可以存儲大概250000個整數,第一個方法就是采用基于磁盤的合并排序算法,第二個辦法就是將0-9999999切割成40個區間,分40次掃描(10000000/250000),每次讀入250000個在一個區間的整數,并在內存中使用快速排序。書中提出的第三個解決辦法是采用bitmap(或者稱為bit vector)來表示所有數據集合(注意到條件,數據沒有重復),這樣就可以一次性將數據讀入內存,減少了掃描次數。算法的偽代碼如下:
    階段1:初始化一個空集合
         for i=[0,n)
               bit[i]=0;
    階段2:讀入數據i,并設置bit[i]=1
        for each i in the input file
               bit[i]=1;
    階段3:輸出排序的結果
       for i=[0,n)
              if bit[i]==1
                  write i on the output file

    這個算法的時間復雜度在O(n),用c語言寫的版本可以在10秒內完成任務!c語言的源碼在該書主頁上有,這里給一個java的測試版,加上我的理解注釋:

    /**
     * Created by IntelliJ IDEA.
     * User: zhuangxd
     * Date: 2008-1-7
     * Time: 14:30:44
     
    */
    public class BitSortTest {
        
    private static final int BITSPERWORD = 32;  //整數位數
        private static final int SHIFT = 5;
        
    private static final int MASK = 0x1F;  //5位遮蔽 0B11111
        private static final int N = 10000000;
        
    //用int數組來模擬位數組,總計(1 + N / BITSPERWORD)*BITSPERWORD位,足以容納N
        private static int[] a = new int[(1 + N / BITSPERWORD)];

        
    public static void main(String[] args) {
            bitsort(
    new int[]{11002100009999456778902});
        }

        
    public static void bitsort(int[] array) {
            
    for (int i = 0; i < N; i++)
                clr(i);   
    //位數組所有位清0
            for (int i = 0; i < array.length; i++)
                set(array[i]);  
    //階段2
            for (int i = 0; i < N; i++)
                
    if (test(i))
                    System.out.println(i);
        }

        
    //置a[i>>SHIFT]的第(i & MASK)位為1,也就是位數組的第i位為1
        public static void set(int i) {
            a[i 
    >> SHIFT] |= (1 << (i & MASK));
        }

        
    //置a[i>>SHIFT]的第(i & MASK)位為0,也就是位數組的第i位為0
        public static void clr(int i) {
            a[i 
    >> SHIFT] &= ~(1 << (i & MASK));
        }

        
    //測試位數組的第i位是否為1
        public static boolean test(int i) {
            
    return (a[i >> SHIFT] & (1 << (i & MASK))) == (1 << (i & MASK));
        }
    }



    posted @ 2008-01-07 15:30 dennis 閱讀(3784) | 評論 (3)編輯 收藏

        提取swf文件元信息、壓縮swf、解壓swf都可以處理,來自于http://www.brooksandrus.com/blog/category/java/,或者直接這里下載。

    一個小例子:
             SWFHeader header = new SWFHeader("G:\\mplayer\\test.swf");
            System.out.println(
    "signature:   " + header.getSignature());
            System.out.println(
    "version:     " + header.getVersion());
            System.out.println(
    "compression: " + header.getCompressionType());
            System.out.println(
    "size:        " + header.getSize());
            System.out.println(
    "nbits:       " + header.getNbits());
            System.out.println(
    "xmax:        " + header.getXmax());
            System.out.println(
    "ymax:        " + header.getYmax());
            System.out.println(
    "width:       " + header.getWidth());
            System.out.println(
    "height:      " + header.getHeight());
            System.out.println(
    "frameRate:   " + header.getFrameRate());
            System.out.println(
    "frameCount:  " + header.getFrameCount());
     
    壓縮、解壓縮,需要注意生成的文件將覆蓋原文件:
    //壓縮
    SWFCompressor compressor=new SWFCompressor("G:\\mplayer\\test.swf");
    //解壓縮
    SWFDecompressor decompressor=new SWFDecompressor("G:\\mplayer\\test.swf");




    posted @ 2008-01-04 11:46 dennis 閱讀(3016) | 評論 (3)編輯 收藏

    update:2008-05-05,POI已經可以處理這個需求:
    package net.rubyeye.test;

    import java.io.FileOutputStream;

    import org.apache.poi.hslf.HSLFSlideShow;
    import org.apache.poi.hslf.model.Picture;
    import org.apache.poi.hslf.usermodel.PictureData;
    import org.apache.poi.hslf.usermodel.SlideShow;

    public class PPTToImageConverter {
        
    public static void main(String[] args) throws Exception {
            SlideShow ppt 
    = new SlideShow(new HSLFSlideShow("D:/test.ppt"));

            
    // extract all pictures contained in the presentation
            PictureData[] pdata = ppt.getPictureData();
            
    for (int i = 0; i < pdata.length; i++) {
                PictureData pict 
    = pdata[i];

                
    // picture data
                byte[] data = pict.getData();

                
    int type = pict.getType();
                String ext;
                
    switch (type) {
                
    case Picture.JPEG:
                    ext 
    = ".jpg";
                    
    break;
                
    case Picture.PNG:
                    ext 
    = ".png";
                    
    break;
                
    case Picture.WMF:
                    ext 
    = ".wmf";
                    
    break;
                
    case Picture.EMF:
                    ext 
    = ".emf";
                    
    break;
                
    case Picture.PICT:
                    ext 
    = ".pict";
                    
    break;
                
    default:
                    
    continue;
                }
                FileOutputStream out 
    = new FileOutputStream("D:/test/pict_" + i + ext);
                out.write(data);
                out.close();

            }
        }
    }

       原文:
       小結下最近做的東西吧。因為是做一個素材管理的東西,因此需要處理各種各樣的素材,音頻、視頻、圖片、pdf、ppt等等。遇到一個需求就是將PPT轉成圖片組,google一下,在java里是可以jcom之類的開源庫實現,本質上都是通過jni調用office的COM接口來實現。我們就需要這么一個小功能,拖這么大個開源庫進來實在沒有必要。最后決定自己寫個動態鏈接庫,通過jni來調用。
        先寫工具類,
    public class PPTUtils {
        
    public PPTUtils() {
        }

        
    public static native void convertPPT2IMG(String pptFileName, String tmpDir);

     
       public static void loadLibrary() {//加載動態庫
            String dllFileName = "pptDll";
            
    try {
                String OsName 
    = System.getProperty("os.name");
                
    if (OsName.contains("Windows")) {
                    dllFileName 
    += ".dll";
                } 
    else {
                    dllFileName 
    += ".so";
                }
                
    //加載動態鏈接庫
                System.load(dllFileName);
             
            }
            
    catch (Exception e) {
             
    //   LOG.error("can not load " + dllFileName + ", " + e.getMessage());
                e.printStackTrace();
            }
         }
    }

        編譯一下,執行javah PPTUtils生成頭文件PPTUtils.h。接下來用vc寫個動態鏈接庫,記的將MSPPT.OLB(在office安裝目錄下)加入工程,新建一個ppt2img.cpp:
    #include "stdafx.h"
    #include 
    "PPTUtils.h"
    #include 
    "msppt.h"

    JNIEXPORT 
    void JNICALL Java_com_starnet_dmb_util_PPTUtils_convertPPT2IMG(JNIEnv *env,
          jclass clazz, jstring pptFileName, jstring tmpDir){
       
    //初始化com
        if (CoInitialize( NULL ) == E_INVALIDARG)
        {
           AfxMessageBox(_T(
    "初始化Com失敗!"));
           
    return;
        }  
        _Application   app;
        Presentations   prsts;
        _Presentation   prst;
        
    //jstring轉成char *
       const char *ppt;
       ppt 
    = env->GetStringUTFChars(pptFileName,0);
       
    const char *tmp;
       tmp
    =env->GetStringUTFChars(tmpDir,0);

       
    if(!app.CreateDispatch(_T("PowerPoint.Application"))){
          AfxMessageBox(_T(
    "初始化PowerPoint失敗!"));
           
    return;
       }
       prsts   
    =   app.GetPresentations();
       prst   
    =   prsts.Open(_T(ppt),false,false,false);
       prst.SaveAs(_T(tmp),
    17,false);
       app.ReleaseDispatch();
       app.Quit();
       env
    ->ReleaseStringUTFChars(pptFileName,ppt);
       env
    ->ReleaseStringUTFChars(tmpDir,tmp);
       CoUninitialize();
    }

    posted @ 2008-01-04 11:26 dennis 閱讀(4367) | 評論 (0)編輯 收藏

        挺久沒動筆寫blog了,換了新工作比較忙是一個原因。最近的工作是做一個素材管理的系統,其中有個要求做視頻預覽,將用戶上傳的視頻轉換并在網頁上預覽。在網頁上看視頻,現在大多數視頻網站都是采用flv流媒體文件,用flash做的播放器播放,我們也采用了這種方式。流程大概主要:用戶上傳文件->后臺轉換文件成flv格式->flv播放器調用flv文件。
        轉換視頻、音頻文件到flv格式可以使用mencoder或者ffmpeg,我們采用了mencoder,在linux上的安裝參考這里,安裝結束后記的設置環境變量:export LD_LIBRARY_PATH=/usr/local/lib:LD_LIBRARY_PATH
        java調用的話就是通過Process:
     Process process = runtime.exec(cmd);

    mencoder轉換視頻音頻成flv命令:
    mencoder 源文件 -o 目標文件.flv -of lavf    -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=400:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=200:-3 -ofps 12 -srate 22050

    取視頻元信息命令(視頻比特率、長寬等信息):
    mplayer -identify 文件名 -ao null -vo null -frames 0

    切割視頻命令:
    mencoder -ss 開始時間 -oac copy -ovc copy -endpos 終止時間 文件名 -o 目標文件名

        操作flv文件(給視頻打上信息、切割之類)可以采用flvtool2。
       
        需要注意的是通過java調用的話,一定要處理標準輸出和標準錯誤輸出,不然進程會掛在那結束不了,可以開個線程取處理。在網頁播放的話,可以考慮用這個播放器,具體參數看它的說明。最后一個問題,IE6的flash控件需要激活,這個問題的解決可以采用swfobject.js。
        有興趣的老大們可以考慮自己搭個“土豆網”,說不定哪天拿了風投.....浮云

    posted @ 2007-12-19 16:46 dennis 閱讀(7306) | 評論 (5)編輯 收藏

    僅列出標題
    共56頁: First 上一頁 30 31 32 33 34 35 36 37 38 下一頁 Last 
    主站蜘蛛池模板: 国产成人精品免费视频软件| 四虎最新永久免费视频| 波多野结衣免费视频观看| 亚洲日韩一区二区一无码| 国产成人A在线观看视频免费| 亚洲国产精品综合久久20| 最近2019中文免费字幕| 亚洲中文字幕久久精品无码A| 成人a免费α片在线视频网站| 亚洲色大成网站www永久网站| 日韩成人在线免费视频| 猫咪www免费人成网站| 久久精品国产亚洲7777| a级毛片在线视频免费观看| 亚洲AV成人精品网站在线播放 | 国产L精品国产亚洲区久久| 精品一区二区三区免费视频| 久久精品国产亚洲麻豆| 99免费视频观看| 亚洲另类无码专区首页| 2048亚洲精品国产| 无码人妻一区二区三区免费看| 亚洲成a人片在线观看中文app| 免费观看毛片视频| 人妖系列免费网站观看| 亚洲日本中文字幕| 天天看片天天爽_免费播放| 一级大黄美女免费播放| 久久久婷婷五月亚洲97号色| 女人毛片a级大学毛片免费| 一本到卡二卡三卡免费高| 亚洲成色在线影院| 午夜视频免费成人| a毛片在线看片免费| 国产亚洲精品影视在线| 中文字幕专区在线亚洲| 免费H网站在线观看的| 人与动性xxxxx免费| 亚洲一区二区三区精品视频| 亚洲五月午夜免费在线视频| 7m凹凸精品分类大全免费|