E81086713E446D36F62B2AA2A3502B5EB155

Java杂家

杂七杂八。。。一家之言

BlogJava 首页 新随笔 联系 聚合 管理
  141 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 阅读(521) | 评论 (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 阅读(1949) | 评论 (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 阅读(320) | 评论 (0)编辑 收藏

     摘要: 考虑这样一个使用场景,假如要查看所有进入weblogic上请求的(注意不是访问某个特定web app的)一些请求头是否设置,如果没有设置则返回以定制的页面.否则正常处理.这么一个简单的需求在Tomcat下是很容易实现的,但是在weblogic下就比较奢侈了.你可能想到weblogic中:1)weblogic.security.net.ConnectionFilter但是在ConnectionFil...  阅读全文
posted @ 2007-04-03 22:48 DoubleH 阅读(7890) | 评论 (2)编辑 收藏

     摘要: JDK中java.util.Timer类的调度是严重依赖系统当前时间的。  阅读全文
posted @ 2007-03-17 10:40 DoubleH 阅读(2167) | 评论 (3)编辑 收藏

     摘要: 支持Native Splash Screen了!  阅读全文
posted @ 2007-03-04 00:53 DoubleH 阅读(2322) | 评论 (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 阅读(4039) | 评论 (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 阅读(6564) | 评论 (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 阅读(5674) | 评论 (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.blogjava.net/Files/javacap/VMAttach_20060107.zip

posted @ 2007-01-07 16:49 DoubleH 阅读(1360) | 评论 (2)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页