E81086713E446D36F62B2AA2A3502B5EB155

          Java雜家

          雜七雜八。。。一家之言

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks

          #

          **
           
          * Demonstrate KMP algorithm in Java
           
          *
           
          *
           
          */
          public class KMP {
              
              
              
          public static int indexOf(String target,String pattern)
              {
                  
          int pLen=pattern.length();
                  
          int tLen=target.length();
                  
                  
          //the fail function
                  int failFunc[]=new int[pLen];
                  
                  failFunc[
          0]=-1;
                  
                  
          //build fail function
                  for(int i=1;i<pLen;i++)
                  {
                      
          int j=failFunc[i-1];
                      
          while(pattern.charAt(i)!=pattern.charAt(j+1)&&j>=0)
                      {
                          
          //recursion 
                          j=failFunc[j];
                      }
                      
          if(pattern.charAt(i)==pattern.charAt(j+1))
                      {
                          failFunc[i]
          =j+1;
                      }
                      
          else 
                      {
                          failFunc[i]
          =-1;
                      }
                  }

                  
          int pPos=0,tPos=0;
                  
                  
          while(tPos<tLen&&pPos<pLen)
                  {
                      
          if(target.charAt(tPos)==pattern.charAt(pPos))
                      {
                          
          //match ,then do forward
                          tPos++;
                          pPos
          ++;
                      }
                      
          else if(pPos==0)
                      {
                          
          //target go forward
                          tPos++;
                      }
                      
          else
                      {
                          
          //target postion don't change,pattern go back  
                          pPos=failFunc[pPos-1]+1;
                      }
                  }
                  
                  
          if(pPos<pLen)return -1;
                  
          else return tPos-pLen;
                  
                  
                  
              }

          }

          posted @ 2007-07-10 18:19 DoubleH 閱讀(541) | 評論 (0)編輯 收藏

          這兩天看了兩個項目,都是用Java編寫的操作系統。
          1)JNode.org
          2)JSysos
          兩者都是可以用Java來寫驅動的。

          前者幾乎全是Java源文件99%以上,少量的匯編語言,沒有C代碼。寫的很是賞心悅目。匯編語言編譯器使用的是Nasm,語法很清晰。
          可惜很容易就沒內存了,據使用懷疑是GC沒有很好的實現。在調用Java方法的時候采用即時編譯成匯編指令,
          這樣性能不會很理想。


          后者是C+java的方式,先把class編譯成匯編代碼,然后一塊鏈接。少量的匯編代碼,內存管理使用CPP.
          這種方式應該性能優于前者。這個系統里面沒有Java虛擬機,操作系統用Java語言寫而已。既利用了Java的優雅語法,又不損失性能,個人更看好這種方式的Java OS

          話說回來,操作系統設計已經好久沒有創新了,使用Java不失為一個好主意。利用Java的天生的安全性,寫出來的操作系統應該不會像現在的操作系統一樣病毒橫生,期待他們的成功!



          posted @ 2007-05-27 15:41 DoubleH 閱讀(1962) | 評論 (2)編輯 收藏

          1)DJGPP v203
          2)Nasm 0.98.39
          3)gcc args:
          gcc -Wall -O -fomit-frame-pointer -nostdinc -fno-builtin

          4)link.ld
          ld -T link.ld
          OUTPUT_FORMAT("binary")
          ENTRY(start)
          phys = 0x00100000;
          SECTIONS
          {
            .text phys : AT(phys) {
              code = .;
              *(.text)
              *(.rodata)
              . = ALIGN(4096);
            }
            .data : AT(phys + (data - code))
            {
              data = .;
              *(.data)
              . = ALIGN(4096);
            }
            .bss : AT(phys + (bss - code))
            {
              bss = .;
              *(.bss)
              . = ALIGN(4096);
            }
            end = .;
          }
          5)Bootable CD
          mkisofs -R -b boot/grub/eltorito.s2 -no-emul-boot     -boot-load-size 4 -boot-info-table -o yovnos.iso iso

          posted @ 2007-05-26 14:25 DoubleH 閱讀(345) | 評論 (0)編輯 收藏

               摘要: 考慮這樣一個使用場景,假如要查看所有進入weblogic上請求的(注意不是訪問某個特定web app的)一些請求頭是否設置,如果沒有設置則返回以定制的頁面.否則正常處理.這么一個簡單的需求在Tomcat下是很容易實現的,但是在weblogic下就比較奢侈了.你可能想到weblogic中:1)weblogic.security.net.ConnectionFilter但是在ConnectionFil...  閱讀全文
          posted @ 2007-04-03 22:48 DoubleH 閱讀(7972) | 評論 (2)編輯 收藏

               摘要: JDK中java.util.Timer類的調度是嚴重依賴系統當前時間的。  閱讀全文
          posted @ 2007-03-17 10:40 DoubleH 閱讀(2188) | 評論 (3)編輯 收藏

               摘要: 支持Native Splash Screen了!  閱讀全文
          posted @ 2007-03-04 00:53 DoubleH 閱讀(2339) | 評論 (8)編輯 收藏

          利用春節的閑暇,開發了一款Java轉EXE文件的工具。
          之前曾經用過一款開源的工具Jsmooth,發現生成的EXE文件通過改名還是可以看見class文件,這一點很不爽,所以自己做了一款,改進這個不足。特性列表:
          1)生成EXE文件,安全發布你的Java程序,防止反編譯
          2)不用設置Classpath了,把依賴的jar包,安全的包含在生成的文件里。(All In One,:-)
          3)支持程序的圖標(Icon)文件設置,使用.ico文件。
          4) 可選帶控制臺或不帶控制臺,并設置控制臺的標題。

          TODO Features:

          1)增加Native Splash Screen
          2)提供本地接口供Java程序使用,比如注冊表訪問,可以在Java代碼里
          使用PlatformAPI.readRegistryKey()本地方法,而PlatformAPI在生成的EXE里內置,并且不再需要另外的DLL文件.(我叫它:Mixing Java Class and JNI DLL files in EXE).
          3)國際化,現在好多參數都只考慮ASCII.

          下載:
          Java2exe_0.0.1.zip
          posted @ 2007-02-25 16:11 DoubleH 閱讀(4067) | 評論 (23)編輯 收藏

          今天發現JDK1.4中的sun.misc.BASE64Encoder有兩個問題
          1)編碼的字節較長時,encode出來的字符竄會在中間插入\n\r
          比如
          編碼"中華人名共和國 呵呵呵呵呵呵呵呵呵呵呵呵呵中華人名共和國 呵呵呵呵呵呵呵呵呵呵呵呵呵"
          生成的字符竄居然有兩行,中間多了回車換行符。
          2)效率較差(見后面的比較)

          下面是我的實現:
          ?1?/**
          ?2??*?@author?yovn
          ?3??*?
          ?4??*/
          ?5?public?class?BASE64Encoder?{
          ?6?
          ?7?????private?static?char[]?codec_table?=?{?'A',?'B',?'C',?'D',?'E',?'F',?'G',
          ?8?????????????'H',?'I',?'J',?'K',?'L',?'M',?'N',?'O',?'P',?'Q',?'R',?'S',?'T',
          ?9?????????????'U',?'V',?'W',?'X',?'Y',?'Z',?'a',?'b',?'c',?'d',?'e',?'f',?'g',
          10?????????????'h',?'i',?'j',?'k',?'l',?'m',?'n',?'o',?'p',?'q',?'r',?'s',?'t',
          11?????????????'u',?'v',?'w',?'x',?'y',?'z',?'0',?'1',?'2',?'3',?'4',?'5',?'6',
          12?????????????'7',?'8',?'9',?'+',?'/'?};
          13?
          14?????public?BASE64Encoder()?{
          15?
          16?????}
          17?
          18?????public?String?encode(byte[]?a)?{
          19?????????int?totalBits?=?a.length?*?8;
          20?????????int?nn?=?totalBits?%?6;
          21?????????int?curPos?=?0;//?process?bits
          22?????????StringBuffer?toReturn?=?new?StringBuffer();
          23?????????while?(curPos?<?totalBits)?{
          24?????????????int?bytePos?=?curPos?/?8;
          25?????????????switch?(curPos?%?8)?{
          26?????????????case?0:
          27?????????????????toReturn.append(codec_table[(a[bytePos]?&?0xfc)?>>?2]);
          28?????????????????break;
          29?????????????case?2:
          30?
          31?????????????????toReturn.append(codec_table[(a[bytePos]?&?0x3f)]);
          32?????????????????break;
          33?????????????case?4:
          34?????????????????if?(bytePos?==?a.length?-?1)?{
          35?????????????????????toReturn
          36?????????????????????????????.append(codec_table[((a[bytePos]?&?0x0f)?<<?2)?&?0x3f]);
          37?????????????????}?else?{
          38?????????????????????int?pos?=?(((a[bytePos]?&?0x0f)?<<?2)?|?((a[bytePos?+?1]?&?0xc0)?>>?6))?&?0x3f;
          39?????????????????????toReturn.append(codec_table[pos]);
          40?????????????????}
          41?????????????????break;
          42?????????????case?6:
          43?????????????????if?(bytePos?==?a.length?-?1)?{
          44?????????????????????toReturn
          45?????????????????????????????.append(codec_table[((a[bytePos]?&?0x03)?<<?4)?&?0x3f]);
          46?????????????????}?else?{
          47?????????????????????int?pos?=?(((a[bytePos]?&?0x03)?<<?4)?|?((a[bytePos?+?1]?&?0xf0)?>>?4))?&?0x3f;
          48?????????????????????toReturn.append(codec_table[pos]);
          49?????????????????}
          50?????????????????break;
          51?????????????default:
          52?????????????????//never?hanppen
          53?????????????????break;
          54?????????????}
          55?????????????curPos+=6;
          56?????????}
          57?????????if(nn==2)
          58?????????{
          59?????????????toReturn.append("==");
          60?????????}
          61?????????else?if(nn==4)
          62?????????{
          63?????????????toReturn.append("=");
          64?????????}
          65?????????return?toReturn.toString();
          66?
          67?????}
          68?
          69?}

          這樣運行一個測試程序
          ?1?public?static?void?main(String[]?args)?throws?Exception?{
          ?2?????????
          ?3?
          ?4?????????BASE64Encoder?encoder=new?BASE64Encoder();
          ?5?????????sun.misc.BASE64Encoder?sunEncoder=new?sun.misc.BASE64Encoder();
          ?6?????????byte[]?testBytes=new?byte[1024*1024*2];
          ?7?????????long?start=System.currentTimeMillis();
          ?8?????????for(int?i=0;i<10;i++)
          ?9?????????{
          10?????????????sunEncoder.encode(testBytes);
          11?????????}
          12?????????
          13?????????System.out.println("[sun?encoder]use?time?:"+(System.currentTimeMillis()-start));
          14?????????start=System.currentTimeMillis();
          15?????????for(int?i=0;i<10;i++)
          16?????????{
          17?????????????encoder.encode(testBytes);
          18?????????}
          19?????????
          20?????????System.out.println("[our?encoder]use?time?:"+(System.currentTimeMillis()-start));
          21?
          22?????}

          出來的結果是:
          [sun encoder]use time :4844
          [our encoder]use time :2609
          差不多慢一倍。


          posted @ 2007-01-31 17:03 DoubleH 閱讀(6591) | 評論 (6)編輯 收藏

          (感覺BlogJava很有人氣,就把原來寫在msn space上的也轉過來)

          通常在Spring發布Hession,RMI等,是非常方便的,

          但是要發布SOAP類型的WebService則要依賴一個獨立的Servlet容器(如Tomcat+Axis),

          這種Webservice一般還有別的配置文件,比如web.xml,wsdd文件等等
          。有時侯,你可能想一臺機器上只部署一個Http Soap Service
          ,這種場合你可能不希望安裝一個類似Tomcat的容器,
          你更希望發布的時候就是一個服務程序,該程序啟動則提供WebService.這篇文章描述一種解決方案。
          開發環境:
          Spring 1.2.6
          XFire 1.0
          Jetty 4.2.1
          方案描述:我們可以通過XFire的編程接口來創建WebService并嵌入一個HttpServer,
          從而來做到在一個獨立應用程序中發布Http Service
          ?1//?Create?an?XFire?Service
          ?2????????ObjectServiceFactory?serviceFactory?=?new?ObjectServiceFactory();
          ?3????????Service?service?=?serviceFactory.create(Echo.class);
          ?4????????service.setInvoker(new?BeanInvoker(new?EchoImpl()));
          ?5????????//?Register?the?service?in?the?ServiceRegistry
          ?6????????XFire?xfire?=?XFireFactory.newInstance().getXFire();
          ?7????????xfire.getServiceRegistry().register(service);
          ?8????????//?Start?the?HTTP?server
          ?9????????XFireHttpServer?server?=?new?XFireHttpServer();
          10????????server.setPort(8191);
          11????????server.start();

          這樣的話,如果發布多個WebSerice則要依次顯式的創建 XFire Service,然后再一一注冊,

          這樣顯然是不夠優雅的。

          我們想要讓開發者在Spring配置文件中指定要發布為WebService的POJOs,

          然后載入Spring環境就自動發布為webservice,而不需要跟 XFire API打交道。

          首先,我們想要一個BeanFacory,能把一個pojo裝配成XFire Service

          ?1?/**
          ?2??*?
          ?3??*/
          ?4?package?com.yovn.ws.xfire.example;
          ?5?
          ?6?import?org.codehaus.xfire.service.Service;
          ?7?import?org.codehaus.xfire.service.binding.BeanInvoker;
          ?8?import?org.codehaus.xfire.service.binding.ObjectServiceFactory;
          ?9?import?org.springframework.beans.factory.FactoryBean;
          10?
          11?/**
          12??*?@author?new
          13??*
          14??*/
          15?public?class?XFireServiceFactoryBean?implements?FactoryBean
          16?{
          17?
          18?????
          19?????
          20?????
          21?????private?Class?serviceClass;
          22?????
          23?????
          24?????private?Object?target;
          25?????
          26?????
          27?????private?Service?service;
          28?????
          29?????
          30?????private?final?ObjectServiceFactory?sf=new?ObjectServiceFactory();
          31?????
          32?????/**
          33??????*?
          34??????*/
          35?????public?XFireServiceFactoryBean()
          36?????{
          37?????????
          38?????}
          39?
          40?????/*?(non-Javadoc)
          41??????*?@see?org.springframework.beans.factory.FactoryBean#getObject()
          42??????*/
          43?????public?Object?getObject()?throws?Exception
          44?????{
          45?????????if(service==null)
          46?????????{
          47?????????????service=sf.create(serviceClass);
          48?????????????service.setInvoker(new?BeanInvoker(target));
          49?????????}
          50?????????return?service;
          51?????}
          52?
          53?????/*?(non-Javadoc)
          54??????*?@see?org.springframework.beans.factory.FactoryBean#getObjectType()
          55??????*/
          56?????public?Class?getObjectType()
          57?????{
          58?????????
          59?????????return?Service.class;
          60?????}
          61?
          62?????/*?(non-Javadoc)
          63??????*?@see?org.springframework.beans.factory.FactoryBean#isSingleton()
          64??????*/
          65?????public?boolean?isSingleton()
          66?????{
          67?????????return?true;
          68?????}
          69?
          70?????public?void?setServiceClass(Class?serviceClass)
          71?????{
          72?????????this.serviceClass?=?serviceClass;
          73?????}
          74?
          75?????public?void?setTarget(Object?target)
          76?????{
          77?????????this.target?=?target;
          78?????}
          79?
          80?}
          81?

          這樣我們可以通過Spring來裝配一個pojo,

          下一步我們要在Spring容器載入時候注冊XFire Service,

          并啟動一個嵌入的Http Server,我們可以借助Spring的ApplicationListener來實現

          ?1?/**
          ?2??*?
          ?3??*/
          ?4?package?com.yovn.ws.xfire.example;
          ?5?
          ?6?
          ?7?import?org.apache.commons.logging.Log;
          ?8?import?org.apache.commons.logging.LogFactory;
          ?9?import?org.codehaus.xfire.XFire;
          10?import?org.codehaus.xfire.XFireFactory;
          11?import?org.codehaus.xfire.server.http.XFireHttpServer;
          12?import?org.codehaus.xfire.service.Service;
          13?import?org.codehaus.xfire.service.ServiceRegistry;
          14?import?org.springframework.context.ApplicationContext;
          15?import?org.springframework.context.ApplicationEvent;
          16?import?org.springframework.context.ApplicationListener;
          17?import?org.springframework.context.event.ContextClosedEvent;
          18?import?org.springframework.context.event.ContextRefreshedEvent;
          19?
          20?/**
          21??*?@author?new
          22??*?
          23??*/
          24?public?class?XFireServiceStarter?implements?ApplicationListener
          25?{
          26?
          27?????private?int?port?=?80;
          28?
          29?????private?XFireHttpServer?server;
          30?????private?final?Log?logger=LogFactory.getLog(getClass().getName());
          31?
          32?????public?void?setPort(int?port)
          33?????{
          34?????????this.port?=?port;
          35?????}
          36?
          37?????public?void?onApplicationEvent(ApplicationEvent?event)
          38?????{
          39?????????try
          40?????????{
          41?????????????if?(event?instanceof?ContextRefreshedEvent)
          42?????????????{
          43?
          44?????????????????if?(server?!=?null)
          45?????????????????{
          46?
          47?????????????????????server.stop();
          48?????????????????????logger.info("xfire?server?stopped");
          49?
          50?????????????????}
          51?????????????????registerService((ApplicationContext)event.getSource());
          52?????????????????server?=?new?XFireHttpServer();
          53?????????????????server.setPort(port);
          54?????????????????server.start();
          55?????????????????logger.info("xfire?server?started");
          56?
          57?????????????}?else?if?(event?instanceof?ContextClosedEvent)
          58?????????????{
          59??????????????????if(server!=null)
          60??????????????????{
          61??????????????????????server.stop();
          62??????????????????????logger.info("xfire?server?stopped");
          63??????????????????}
          64??????????????????
          65?????????????}
          66?
          67?????????}?catch?(Exception?e)
          68?????????{
          69?????????????logger.error("process?event?"+event+"?error",e);
          70?????????}
          71?
          72?????}
          73?
          74?????private?void?registerService(ApplicationContext?context)
          75?????{
          76?????????XFire?xfire=XFireFactory.newInstance().getXFire();
          77?????????ServiceRegistry?registry=xfire.getServiceRegistry();
          78?????????String?names[]=context.getBeanNamesForType(Service.class);
          79?????????
          80?????????for(int?i=0;i<names.length;i++)
          81?????????{
          82?????????????Service?service=(Service)context.getBean(names[i]);
          83?????????????registry.register(service);
          84?????????????logger.info("register?service:"+service.getName());
          85?????????}
          86?????????
          87?????}
          88?
          89?}
          90?

          Ok,我們完成基礎的代碼,下面試著發布一個簡單的WebServie
          1?package?com.yovn.ws.xfire.example;
          2?
          3?public?interface?Add
          4?{
          5?????int?add(int?a,int?b);
          6?
          7?}
          該接口的實現如下
          ?1?package?com.yovn.ws.xfire.example;
          ?2?
          ?3?public?class?AddImpl?implements?Add
          ?4?{
          ?5?
          ?6?????public?int?add(int?a,?int?b)
          ?7?????{
          ?8?????????
          ?9?????????return?a+b;
          10?????}
          11?
          12?}

          這是一個簡單功能的POJO,下面我們在Spring中裝配起來
          ?1?<?xml?version="1.0"?encoding="UTF-8"?>
          ?2?<!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">
          ?3?<beans>
          ?4?????<bean?id="addService"?class="com.yovn.ws.xfire.example.XFireServiceFactoryBean">
          ?5?????????<property?name="serviceClass"?value="com.yovn.ws.xfire.example.Add"/>
          ?6?????????<property?name="target"?ref="adder"/>
          ?7?????</bean>
          ?8?????
          ?9?????<bean?id="adder"?class="com.yovn.ws.xfire.example.AddImpl"/>
          10?????<bean?id="xfireStarter"?class="com.yovn.ws.xfire.example.XFireServiceStarter">
          11????????<property?name="port"?value="80"/>
          12?????</bean>
          13?</beans>

          好了,我們完成了,只要載入這個xml初始化一個Spring ApplicationContext,一個名叫Add的webservice就發布了。你可以通過訪問http://localhost/Add?wsdl來獲得webservice的詳細描述!
          posted @ 2007-01-07 17:55 DoubleH 閱讀(5685) | 評論 (4)編輯 收藏

          周末完善了注入代碼的封裝庫
          1)支持指定多個注入的classpath,可以為jar文件,也可為目錄。
          2)?? 支持從指定JVM 卸載,從而可以多次注入/卸載
          3)卸載時同時也將把注入的線程以及從子線程停止。

          新的API如下

          public ?? static ? synchronized ? void ?attachJarToVM(String?pid,String[]?classpaths,String?mainCls) throws ?AttachException;

          public ? static ? synchronized ? boolean ?detachFromVM(String?pid);

          可從這里下載:http://www.aygfsteel.com/Files/javacap/VMAttach_20060107.zip

          posted @ 2007-01-07 16:49 DoubleH 閱讀(1381) | 評論 (2)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 斗六市| 新宁县| 信丰县| 叶城县| 连平县| 凉城县| 浪卡子县| 博白县| 南陵县| 林周县| 绥芬河市| 汝南县| 梓潼县| 化州市| 凤山市| 通道| 马尔康县| 德昌县| 绩溪县| 雅江县| 潍坊市| 桐庐县| 玛曲县| 江安县| 嘉祥县| 河曲县| 渭源县| 新泰市| 阜新市| 香格里拉县| 新田县| 和顺县| 邹平县| 北辰区| 浦城县| 高唐县| 万州区| 精河县| 阿勒泰市| 灯塔市| 新乐市|