wonderer's program

everything will be better
posts - 19, comments - 6, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2007年3月31日

去SA面试的时候,面试官问我平时用Java的什么数据结构,答曰:Vector。又问:哪有用过其他的的吗?例如List和Map之类的。答曰:甚少。(自己汗一个,没水平)既然不会就要学习啦。

翻开《Java学习笔记》,里面对对象容器的描述不错。

1. ArrayList和LinkedList

ArrayList使用了数组结构实现List的数据。所以ArraryList用来快速定位对象是非常有效率的。但是如果要对ArraryList中间插入或者删除,效率会非常低。

LinkedList使用链表来实现的List。所以跟ArrayList相反,LinkedList对于插入和删除是非常有优势,反之对于快速定位,是LinkedList的弱项。

1)ArrayListDemo

public class ArrayListDemo {
    public static void main(String[] args) {
        
        //用Scanner类,可以轻松获得commander的输入
        Scanner scanner = new Scanner(System.in);
        
        List<String> list = new ArrayList<String>();
        
        //在控制台输入,quit退出
        while(true) {
            System.out.print("Rokey@console# ");
            String input = scanner.next();
            if(input.equals("quit")) {
                break;
            }
            list.add(input);
        }
        
        System.out.print("显示输入:");
        
        //使用5.0的foreach功能对List进行遍历
        for(String s:list) {
            //5.0的类C的输出格式
            System.out.printf("%s ",s);
        }
    }
}

输出:

Rokey@console# 一二三
Rokey@console# 三二一
Rokey@console# quit
显示输入:一二三 三二一 

 

2)用LinkedList实现的一个字符串栈

/**
 *
 * @author Rokey
 * 用LinkedList构建一个字符栈,先进先出
 */
public class StringStack {

    private LinkedList<String> linkList;

    public StringStack() {
        linkList = new LinkedList<String>();
    }

    public void push(String s) {
        //将元素加入链表第一个位置
        linkList.addFirst(s);
    }

    public String pop() {
        //删除链表第一个元素,并返回
        return linkList.removeFirst();
    }

    public String top() {
        //返回链表第一个元素,但并不删除
        return linkList.getFirst();
    }

    public boolean isEmpty() {
        //检查链表是否为空
        return linkList.isEmpty();
    }
}
public class StringStackDemo {

    public static void main(String[] args) {

        //用Scanner类,可以轻松获得commander的输入
        Scanner scanner = new Scanner(System.in);

        StringStack stack = new StringStack();

        //在控制台输入,quit退出
        while (true) {
            System.out.print("Rokey@console# ");
            String input = scanner.next();
            if (input.equals("quit")) {
                break;
            }
            stack.push(input);
        }

        System.out.print("显示输入:");
        //使用5.0的foreach功能对List进行遍历
        
        while(!stack.isEmpty()) {
            //5.0的类C的输出格式
            System.out.printf("%s ", stack.pop());
        }
    }
}

输出:

Rokey@console# 一二三
Rokey@console# 三二一
Rokey@console# quit
显示输入:三二一 一二三 

posted @ 2007-12-27 23:05 wonderer 阅读(3070) | 评论 (0)编辑 收藏

OYM中的任务中,有一项对文件内容的检查挺有意思的,就是要检查字符是否是全角的,例如“GY”(not“GY”),并且把这些字符改为半角的。
想起了在研发中心的一个朋友的抱怨:“昨天写了一整天的程序,发到广大教务处那边居然说不能用,然后亲自跑了一躺,发现不是我的程序有问题,是那边的人输入个全角字符,搜半角的字符,当然不行了”
恩,Betty写的需求真有意思,考虑的问题很周全,是一个很厉害的项目经理。如果从输入这里解决了字符是否是半角的,那么,以后的情况就容易解决很多了。恩,网上搜了一下资料,查了一下书,得出了以下代码:
public void testChar() {
  String s1 
= "123";
  String s2 
= "abc";
  String s3 
= "123abc";
  System.out.println(s1);
  System.out.println(s2);
  System.out.println(s3);
  
for (int i = 0; i < s1.length(); i++) {
   
int j = s1.charAt(i);
   
if (j > 256) {
    
int temp = j - 65248;
    
if (temp >= 0) {
     System.out.print((
char)j+"-->:" + (char) temp);
    } 
else {
      System.out.print((
char) j);
    }
   } 
else {
    System.out.print((
char) j);
   }
  }
  System.out.println();
  
  
for (int i = 0; i < s2.length(); i++) {
   
int j = s2.charAt(i);
   
if (j > 256) {
    
int temp = j - 65248;
    
if (temp >= 0) {
     System.out.print((
char)j+"-->:" + (char) temp);
    } 
else {
     System.out.print((
char) j);
    }
   } 
else {
    System.out.print ((
char) j);
   }
  }
  System.out.println();
  
  
for (int i = 0; i < s3.length(); i++) {
   
int j = s3.charAt(i);
   
if (j > 256) {
    
int temp = j - 65248;
    
if (temp >= 0) {
      System.out.print((
char)j+"-->:" + (char) temp);
    } 
else {
     System.out.print((
char) j);
    }
   } 
else {
    System.out.print((
char) j);
   }
  }
  System.out.println();
 
 }
输出的结果如下:
123
-->ab-->bc--c
123a
-->ab-->bc--c


posted @ 2007-12-23 16:46 wonderer 阅读(1917) | 评论 (3)编辑 收藏

OYM的任务中,有个要求,上传一个Excel文件,检查他的内容是否合法,并返回信息。

今天想了一下,第一个要解决的问题就是上传一个Excel文件,上传文件的组件到挺多的,网上一搜,就有一大堆教程,但是现在并不是要上传一个文件到服务器以作存储之用,而是要上传一个文件到内存里,以Java的数据结构存储起来,并检查,把合乎要求的数据写到数据库里。所以在网上的一大堆上传文件的组件并不合用。于是又想自己写,思路就是从客户端那里获取一个InputStream,然后就对这个InputStream做一系列的检查。代码如下:

ServletInputStream sis =  request.getInputStream();
InputStreamReader isr = new InputStreamReader(sis);
             
int ch;
while((ch = isr.read()) != -1 ) {          
   out.println((char)ch);
}
             
System.out.flush();

结果的出去就是如下(输出东西写到页面):

-----------------------------7d7ea23120550 
Content-Disposition: form-data; name="file1"; 
filename="C:\Documents and Settings\Administrator\桌面\test.txt" 
Content-Type: text/plain 
my name is Rokey.Rokey。我的名字叫Rokey. 
-----------------------------7d7ea23120550 Content-Disposition: form-data; 
name="Submit" 上传 -----------------------------7d7ea23120550--
很明显,这里只有
my name is Rokey.Rokey。我的名字叫Rokey.

对我有用,这个也正是我的文件里面的内容,其它的都是关于这些form的其它信息。对我这个程序是没有用的。如果这里写下去的话,还要我去分析那些是数据,哪些是form的参数。好,到现在为止,我已经打消了自己写的念头了。我想,那些组件都可以把上传文件封装得那么好,能不能利用那些库,抽出文件的IO流,让我操作呢?

于是,就开始对O'Reilly的上传组件cos.jar的API看,看到里面有这么一段。

public class MultipartParser
extends java.lang.Object
A utility class to handle multipart/form-data requests, the kind of requests that support file uploads. This class uses a "pull" model where the reading of incoming files and parameters is controlled by the client code, which allows incoming files to be stored into any OutputStream. If you wish to use an API which resembles HttpServletRequest, use the "push" model MultipartRequest instead. It's an easy-to-use wrapper around this class.

This class can receive arbitrarily large files (up to an artificial limit you can set), and fairly efficiently too. It cannot handle nested data (multipart content within multipart content). It can now with the latest release handle internationalized content (such as non Latin-1 filenames).

It also optionally includes enhanced buffering and Content-Length limitation. Buffering is only required if your servlet container is poorly implemented (many are, including Tomcat 3.2), but it is generally recommended because it will make a slow servlet container a lot faster, and will only make a fast servlet container a little slower. Content-Length limiting is usually only required if you find that your servlet is hanging trying to read the input stram from the POST, and it is similarly recommended because it only has a minimal impact on performance.

而且里面的API已经封装程我想象得到的情况了。于是,我就觉得这样我就可以完成我的功能了。于是,就写了以下代码:

MultipartParser mp = new MultipartParser(request, 10 * 1024 * 1024);
Part part;
while ((part = mp.readNextPart()) != null) {
      if (part.isParam()) {
          // it's a parameter part
          ParamPart paramPart = (ParamPart) part;
          //out.println("param: name=" + name + "; value=" + value);
      } else if (part.isFile()) {
          FilePart filePart = (FilePart) part;
          InputStream is = filePart.getInputStream();
          InputStreamReader isr = new InputStreamReader(is);

          int ch;
          while ((ch = isr.read()) != -1) {

              out.print((char) ch);
          }

          System.out.flush();
          isr.close();
          is.close();
      }
}
               

出去结果如下:

my name is Rokey.Rokey。
我的名字叫Rokey.
到现在,已经可以把这个流封装成一个文件流,送给Excel的组件去处理了。

posted @ 2007-12-23 00:52 wonderer 阅读(1438) | 评论 (0)编辑 收藏

     摘要: 什么是IOC呢,在网上搜到了一非常有意思的讲解。IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。 下面我们以几个例子来说明什么是IoC 假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个B...  阅读全文

posted @ 2007-10-28 16:50 wonderer 阅读(674) | 评论 (0)编辑 收藏

Buffloa里的传递参数的编码是GBK。

buffalo.switchPart('body',url,false);如果url中包含汉字,是采用GBK编码的。在不改变tomcat的配置文件的情况下,在目标页面里获得url参数的正确方法是

   1: String name = new String(request.getParameter("name").getBytes(
   2:             "ISO8859-1"), "GBK");

注意,如果这里用utf-8作为编码的转换的话,会出现乱码。

posted @ 2007-10-26 16:41 wonderer 阅读(420) | 评论 (0)编辑 收藏

最近在准备考试系统的开发,碰到了 request.getParameter乱码的问题。跟林彬讨论了一下,还是觉得用老方法管用。

如果是post的话,可以通过设置filter的方法来解决。

如果是get或者是超链接的话,以前是通过设置tomcat的配置文件server.xml来解决的,但这样不好,并不是所有的项目,我们都可以修改到服务器的tomcat的配置文件。具体代码如下:

   1: Connector port="8080" maxHttpHeaderSize="8192"
   2:                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
   3:                enableLookups="false" redirectPort="8443" acceptCount="100"
   4:                connectionTimeout="20000" disableUploadTimeout="true" uRIEncoding="gbk"/>

还是觉得老方法管用,只是有点麻烦:

   1: String id=new String(request.getParameter("id").getBytes("ISO8859-1"),"UTF-8");
   2: String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");

posted @ 2007-10-25 23:23 wonderer 阅读(13425) | 评论 (1)编辑 收藏

电脑搬回了宿舍,破解了校园网,多人公用一条宽带。要一个主机拨号。ip总不免要设来设去,总是要手工改,很麻烦,于是上网查了查,写了个改ip的bat文件。内容如下:

1: netsh interface ip set address name="本地连接" source=static addr=192.168.0.39

mask=255.255.255.0 gateway=192.168.0.1 gwmetric=1

   2: netsh interface ip set dns name = "本地连接" source = static addr = 202.116.128.1
   3: netsh interface ip add dns name = "本地连接" addr = 202.116.128.2

posted @ 2007-09-11 17:25 wonderer 阅读(2056) | 评论 (1)编辑 收藏

在写HTML中,并不是&nbsp才会产生一个空格。<td>hello (间隔一个空格)</td>输出的数据是: hello+一个空格.如果是对这数据进行修改然后再写回到数据库的话,这样就会产生错误。

如下写法是会错误的,

image

造成的结果是 image  仔细留意会发现运通后面多了一个空格

必须改成一下写法:

image 

注意</td>跟前面是没有空格的。这样运行结果就会是这样的image ,是没有空格的。

posted @ 2007-08-03 10:32 wonderer 阅读(665) | 评论 (0)编辑 收藏

     摘要: 写了个Spring的DAO入门例子。 DAO的接口 1: package dataSourceDemo; 2:   3: public interface IUserDAO { 4: public void insert(User user); 5: public User find(Integer id); 6:   7: } ...  阅读全文

posted @ 2007-07-18 14:04 wonderer 阅读(487) | 评论 (0)编辑 收藏

首先要导入包

1:Spring支持包:spring.jar , commons-logging.jar

2: JUnit支持包: JUnit.jar

image

建立Bean类,

   1: package refBeanDemo;
   2:  
   3: import java.util.Date;
   4:  
   5: public class HelloBean {
   6:     private String helloWorld;
   7:     private Date date;
   8:     public Date getDate() {
   9:         return date;
  10:     }
  11:     public void setDate(Date date) {
  12:         this.date = date;
  13:     }
  14:     public String getHelloWorld() {
  15:         return helloWorld;
  16:     }
  17:     public void setHelloWorld(String helloWorld) {
  18:         this.helloWorld = helloWorld;
  19:     }
  20:     
  21: }

 

建立配置文件,和在里面进行注入

   1: <?xml version="1.0" encoding="UTF-8"?>
   2: <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "../resources/spring-beans-2.0.dtd" >
   3: <beans>
   4:     <bean id="dateBean" class="java.util.Date"></bean>
   5:     
   6:     <bean id="helloBean" class="refBeanDemo.HelloBean">
   7:         <property name="helloWorld">
   8:             <value>你好,世界</value>
   9:         </property>
  10:         <property name="date" ref="dateBean"></property>
  11:     </bean>
  12: </beans>

写JUnit进行测试,方便管理,把JUnit的东东放到test包里。

   1: package refBeanDemo;
   2:  
   3: import org.springframework.context.ApplicationContext;
   4: import org.springframework.context.support.ClassPathXmlApplicationContext;
   5:  
   6: import junit.framework.TestCase;
   7:  
   8: public class TestRefBeanDemo extends TestCase {
   9:     private ApplicationContext context;
  10:  
  11:     public void setUp() {
  12:         context = new ClassPathXmlApplicationContext("refBeanDemo/NewFile.xml");
  13:     }
  14:  
  15:     public void testSpring() {
  16:         HelloBean helloBean = (HelloBean)context.getBean("helloBean");
  17:         System.out.println(helloBean.getDate());
  18:         assertEquals("你好,世界", helloBean.getHelloWorld());
  19:         
  20:     }
  21: }

 

运行JUnit测试

image

测试成功。类的分布如下:

image

image

posted @ 2007-07-18 11:12 wonderer 阅读(1347) | 评论 (0)编辑 收藏

ARP地址欺骗类病毒(以下简称ARP病毒)是一类特殊的病毒,该病毒一般属于木马(Trojan)病毒,不具备主动传播的特性,不会自我复制。但是由于其发作的时候会向全网发送伪造的ARP数据包,干扰全网的运行,因此它的危害比一些蠕虫还要严重得多。

二、ARP病毒发作时的现象

网络掉线,但网络连接正常,内网的部分PC机不能上网,或者所有电脑不能上网,无法打开网页或打开网页慢,局域网时断时续并且网速较慢等。

三、ARP病毒原理

3.1 网络模型简介

众所周知,按照OSI (Open Systems Interconnection Reference Model 开放系统互联参考模型) 的观点,可将网络系统划分为7层结构,每一个层次上运行着不同的协议和服务,并且上下层之间互相配合,完成网络数据交换的功能,如图1:

1106901

图1 OSI网络体系模型

然而,OSI的模型仅仅是一个参考模型,并不是实际网络中应用的模型。实际上应用最广泛的商用网络模型即TCP/IP体系模型,将网络划分为四层,每一个层次上也运行着不同的协议和服务,如图2。

1106903

图2 TCP/IP四层体系模型及其配套协议

上图中,蓝色字体表示该层的名称,绿色字表示运行在该层上的协议。由图2可见,我们即将要讨论的ARP协议,就是工作在网际层上的协议。

3.2 ARP协议简介


我们大家都知道,在局域网中,一台主机要和另一台主机进行通信,必须要知道目标主机 的IP地址,但是最终负责在局域网中传送数据的网卡等物理设备是不识别IP地址的,只能识别其硬件地址即MAC地址。MAC地址是48位的,通常表示为 12个16进制数,每2个16进制数之间用“-”或者冒号隔开,如:00-0B-2F-13-1A-11就是一个MAC地址。每一块网卡都有其全球唯一的 MAC地址,网卡之间发送数据,只能根据对方网卡的MAC地址进行发送,这时就需要一个将高层数据包中的IP地址转换成低层MAC地址的协议,而这个重要 的任务将由ARP协议完成。

ARP全称为Address Resolution Protocol,地址解析协议。所谓“地址解析”就是主机在发送数据包前将目标主机IP地址转换成目标主机MAC地址的过程。ARP协议的基本功能就是 通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。 这时就涉及到一个问题,一个局域网中的电脑少则几台,多则上百台,这么多的电脑之间,如何能准确的记住对方电脑网卡的MAC地址,以便数据的发送呢?这就 涉及到了另外一个概念,ARP缓存表。在局域网的任何一台主机中,都有一个ARP缓存表,该表中保存这网络中各个电脑的IP地址和MAC地址的对照关系。 当这台主机向同局域网中另外的主机发送数据的时候,会根据ARP缓存表里的对应关系进行发送。

下面,我们用一个模拟的局域网环境,来说明ARP欺骗的过程。

3.3 ARP欺骗过程


假设一个只有三台电脑组成的局域网,该局域网由交换机(Switch)连接。其中一 个电脑名叫A,代表攻击方;一台电脑叫S,代表源主机,即发送数据的电脑;令一台电脑名叫D,代表目的主机,即接收数据的电脑。这三台电脑的IP地址分别 为192.168.0.2,192.168.0.3,192.168.0.4。MAC地址分别为MAC_A,MAC_S,MAC_D。其网络拓扑环境如图 3。

1106905

图3 网络拓扑

现在,S电脑要给D电脑发送数据了,在S电脑内部,上层的TCP和UDP的数据包已经传送到 了最底层的网络接口层,数据包即将要发送出去,但这时还不知道目的主机D电脑的MAC地址MAC_D。这时候,S电脑要先查询自身的ARP缓存表,查看里 面是否有192.168.0.4这台电脑的MAC地址,如果有,那很好办,就将 封装在数据包的外面。直接发送出去即可。如果没有,这时S电脑要向全网络发送一个ARP广播包,大声询问:“我的IP是192.168.0.3,硬件地址 是MAC_S,我想知道IP地址为192.168.0.4的主机的硬件地址是多少?” 这时,全网络的电脑都收到该ARP广播包了,包括A电脑和D电脑。A电脑一看其要查询的IP地址不是自己的,就将该数据包丢弃不予理会。而D电脑一看IP 地址是自己的,则回答S电脑:“我的IP地址是192.168.0.4,我的硬件地址是MAC_D”需要注意的是,这条信息是单独回答的,即D电脑单独向 S电脑发送的,并非刚才的广播。现在S电脑已经知道目的电脑D的MAC地址了,它可以将要发送的数据包上贴上目的地址MAC_D,发送出去了。同时它还会 动态更新自身的ARP缓存表,将192.168.0.4-MAC_D这一条记录添加进去,这样,等S电脑下次再给D电脑发送数据的时候,就不用大声询问发 送ARP广播包了。这就是正常情况下的数据包发送过程。

这样的机制看上去很完美,似乎整个局域网也天下太平,相安无事。但是,上述数据发 送机制有一个致命的缺陷,即它是建立在对局域网中电脑全部信任的基础上的,也就是说它的假设前提是:无论局域网中那台电脑,其发送的ARP数据包都是正确 的。那么这样就很危险了!因为局域网中并非所有的电脑都安分守己,往往有非法者的存在。比如在上述数据发送中,当S电脑向全网询问“我想知道IP地址为 192.168.0.4的主机的硬件地址是多少?”后,D电脑也回应了自己的正确MAC地址。但是当此时,一向沉默寡言的A电脑也回话了:“我的IP地址 是192.168.0.4,我的硬件地址是MAC_A” ,注意,此时它竟然冒充自己是D电脑的IP地址,而MAC地址竟然写成自己的!由于A电脑不停地发送这样的应答数据包,本来S电脑的ARP缓存表中已经保 存了正确的记录:192.168.0.4-MAC_D,但是由于A电脑的不停应答,这时S电脑并不知道A电脑发送的数据包是伪造的,导致S电脑又重新动态 更新自身的ARP缓存表,这回记录成:192.168.0.4-MAC_A,很显然,这是一个错误的记录(这步也叫ARP缓存表中毒),这样就导致以后凡 是S电脑要发送给D电脑,也就是IP地址为192.168.0.4这台主机的数据,都将会发送给MAC地址为MAC_A的主机,这样,在光天化日之下,A 电脑竟然劫持了由S电脑发送给D电脑的数据!这就是ARP欺骗的过程。

如果A这台电脑再做的“过分”一些,它不冒充D电脑,而是冒充网关,那后果会怎么 样呢?我们大家都知道,如果一个局域网中的电脑要连接外网,也就是登陆互联网的时候,都要经过局域网中的网关转发一下,所有收发的数据都要先经过网关,再 由网关发向互联网。在局域网中,网关的IP地址一般为192.168.0.1。如果A这台电脑向全网不停的发送ARP欺骗广播,大声说:“我的IP地址是 192.168.0.1,我的硬件地址是MAC_A”这时局域网中的其它电脑并没有察觉到什么,因为局域网通信的前提条件是信任任何电脑发送的ARP广播 包。这样局域网中的其它电脑都会更新自身的ARP缓存表,记录下192.168.0.1-MAC_A这样的记录,这样,当它们发送给网关,也就是IP地址 为192.168.0.1这台电脑的数据,结果都会发送到MAC_A这台电脑中!这样,A电脑就将会监听整个局域网发送给互联网的数据包!

实际上,这种病毒早就出现过,这就是ARP地址欺骗类病毒。一些传奇木马 (Trojan/PSW.LMir)具有这样的特性,该木马一般通过传奇外挂、网页木马等方式使局域网中的某台电脑中毒,这样中毒电脑便可嗅探到整个局域 网发送的所有数据包,该木马破解了《传奇》游戏的数据包加密算法,通过截获局域网中的数据包,分析数据包中的用户隐私信息,盗取用户的游戏帐号和密码。在 解析这些封包之后,再将它们发送到真正的网关。这样的病毒有一个令网吧游戏玩家闻之色变的名字:“传奇网吧杀手” !

四、ARP病毒新的表现形式


由于现在的网络游戏数据包在发送过程中,均已采用了强悍的加密算法,因此这类ARP 病毒在解密数据包的时候遇到了很大的难度。现在又新出现了一种ARP病毒,与以前的一样的是,该类ARP病毒也是向全网发送伪造的ARP欺骗广播,自身伪 装成网关。但区别是,它着重的不是对网络游戏数据包的解密,而是对于HTTP请求访问的修改。

HTTP是应用层的协议,主要是用于WEB网页访问。还是以上面的局域网环境举 例,如果局域网中一台电脑S要请求某个网站页面,如想请求www.sina.com.cn这个网页,这台电脑会先向网关发送HTTP请求,说:“我想登陆 www.sina.com.cn网页,请你将这个网页下载下来,并发送给我。”这样,网关就会将www.sina.com.cn页面下载下来,并发送给S 电脑。这时,如果A这台电脑通过向全网发送伪造的ARP欺骗广播,自身伪装成网关,成为一台ARP中毒电脑的话,这样当S电脑请求WEB网页时,A电脑先 是“好心好意”地将这个页面下载下来,然后发送给S电脑,但是它在返回给S电脑时,会向其中插入恶意网址连接!该恶意网址连接会利用MS06-014和 MS07-017等多种系统漏洞,向S电脑种植木马病毒!同样,如果D电脑也是请求WEB页面访问,A电脑同样也会给D电脑返回带毒的网页,这样,如果一 个局域网中存在这样的ARP病毒电脑的话,顷刻间,整个网段的电脑将会全部中毒!沦为黑客手中的僵尸电脑!

案例:


某企业用户反映,其内部局域网用户无论访问那个网站,KV杀毒软件均报病毒:Exploit.ANIfile.o 。

在经过对该局域网分析之后,发现该局域网中有ARP病毒电脑导致其它电脑访问网页 时,返回的网页带毒,并且该带毒网页通过MS06-014和MS07-017漏洞给电脑植入一个木马下载器,而该木马下载器又会下载10多个恶性网游木 马,可以盗取包括魔兽世界,传奇世界,征途,梦幻西游,边锋游戏在内的多款网络游戏的帐号和密码,对网络游戏玩家的游戏装备造成了极大的损失。被ARP病 毒电脑篡改的网页如图4。

1108133

图4 被ARP病毒插入的恶意网址连接

从图4中可以看出,局域网中存在这样的ARP病毒电脑之后,其它客户机无论访问什么网页,当返回该网页时,都会被插入一条恶意网址连接,如果用户没有打过相应的系统补丁,就会感染木马病毒。

五、ARP病毒电脑的定位方法


下面,又有了一个新的课题摆在我们面前:如何能够快速检测定位出局域网中的ARP病毒电脑?

面对着局域网中成百台电脑,一个一个地检测显然不是好办法。其实我们只要利用ARP 病毒的基本原理:发送伪造的ARP欺骗广播,中毒电脑自身伪装成网关的特性,就可以快速锁定中毒电脑。可以设想用程序来实现以下功能:在网络正常的时候, 牢牢记住正确网关的IP地址和MAC地址,并且实时监控着来自全网的ARP数据包,当发现有某个ARP数据包广播,其IP地址是正确网关的IP地址,但是 其MAC地址竟然是其它电脑的MAC地址的时候,这时,无疑是发生了ARP欺骗。对此可疑MAC地址报警,在根据网络正常时候的IP-MAC地址对照表查 询该电脑,定位出其IP地址,这样就定位出中毒电脑了。下面详细说一下几种不同的检测ARP中毒电脑的方法。

5.1 命令行法


这种方法比较简便,不利用第三方工具,利用系统自带的ARP命令即可完成。上文已经 说过,当局域网中发生ARP欺骗的时候,ARP病毒电脑会向全网不停地发送ARP欺骗广播,这时局域网中的其它电脑就会动态更新自身的ARP缓存表,将网 关的MAC地址记录成ARP病毒电脑的MAC地址,这时候我们只要在其它受影响的电脑中查询一下当前网关的MAC地址,就知道中毒电脑的MAC地址了,查 询命令为 ARP -a,需要在cmd命令提示行下输入。输入后的返回信息如下:

Internet Address      Physical Address        Type

192.168.0.1 00-50-56-e6-49-56 dynamic

这时,由于这个电脑的ARP表是错误的记录,因此,该MAC地址不是真正网关的MAC地址, 而是中毒电脑的MAC地址!这时,再根据网络正常时,全网的IP—MAC地址对照表,查找中毒电脑的IP地址就可以了。由此可见,在网络正常的时候,保存 一个全网电脑的IP—MAC地址对照表是多么的重要。可以使用nbtscan 工具扫描全网段的IP地址和MAC地址,保存下来,以备后用。

5.2 工具软件法


现在网上有很多ARP病毒定位工具,其中做得较好的是Anti ARP Sniffer(现在已更名为ARP防火墙),下面我就演示一下使用Anti ARP Sniffer这个工具软件来定位ARP中毒电脑。

首先打开Anti ARP Sniffer 软件,输入网关的IP地址之后,再点击红色框内的“枚举MAC”按钮,即可获得正确网关的MAC地址,如图5。

1109953

图5 输入网关IP地址后,枚举MAC

接着点击“自动保护”按钮,即可保护当前网卡与网关的正常通信。如图6。

1109955

图6 点击自动保护按钮

当局域网中存在ARP欺骗时,该数据包会被Anti ARP Sniffer记录,该软件会以气泡的形式报警。如图7。

1109957

图7 Anti ARP Sniffer 的拦截记录

这时,我们再根据欺骗机的MAC地址,对比查找全网的IP-MAC地址对照表,即可快速定位出中毒电脑。

5.3 Sniffer 抓包嗅探法

当局域网中有ARP病毒欺骗时,往往伴随着大量的ARP欺骗广播数据包,这时,流量检测机制应该能够很好的检测出网络的异常举动,此时Ethereal 这样的抓包工具就能派上用场。如图8。

1109959

图8 用Ethereal抓包工具定位出ARP中毒电脑

从图8中的红色框内的信息可以看出,192.168.0.109 这台电脑正向全网发送大量的ARP广播包,一般的讲,局域网中有电脑发送ARP广播包的情况是存在的,但是如果不停的大量发送,就很可疑了。而这台192.168.0.109 电脑正是一个ARP中毒电脑。

以上三种方法有时需要结合使用,互相印证,这样可以快速准确的将ARP中毒电脑定位出来。

七、ARP病毒的网络免疫措施


由于ARP病毒的种种网络特性,可以采用一些技术手段进行网络中ARP病毒欺骗数据包免疫。即便网络中有ARP中毒电脑,在发送欺骗的ARP数据包,其它电脑也不会修改自身的ARP缓存表,数据包始终发送给正确的网关,用的比较多的办法是“双向绑定法” 。

双向绑定法,顾名思义,就是要在两端绑定IP-MAC地址,其中一端是在路由器中, 把所有PC的IP-MAC输入到一个静态表中,这叫路由器IP-MAC绑定。令一端是局域网中的每个客户机,在客户端设置网关的静态ARP信息,这叫PC 机IP-MAC绑定。客户机中的设置方法如下:

新建记事本,输入如下命令:

arp -d
arp -s 192.168.0.1 00-e0-4c-8c-9a-47

其中,“arp –d” 命令是清空当前的ARP缓存表,而“arp -s 192.168.0.1 00-e0-4c-8c-9a-47 ”命令则是将正确网关的IP地址和MAC地址绑定起来,将这个批处理文件放到系统的启动目录中,可以实现每次开机自运行,这一步叫做“固化arp表” 。

“双向绑定法”一般在网吧里面应用的居多。

除此之外,很多交换机和路由器厂商也推出了各自的防御ARP病毒的软硬产品,如:华 为的H3C AR 18-6X 系列全千兆以太网路由器就可以实现局域网中的ARP病毒免疫,该路由器提供MAC和IP地址绑定功能,可以根据用户的配置,在特定的IP地址和MAC地址 之间形成关联关系。对于声称从这个IP地址发送的报文,如果其MAC地址不是指定关系对中的地址,路由器将予以丢弃,是避免IP地址假冒攻击的一种方式。

八、ARP病毒KV解决方案

针对ARP病毒日益猖獗的情况,江民科技推出了整体解决方案:

1.KV杀毒软件每周7天不间断升级病毒库,单机版网络版同步升级,实时拦截来自网络上的各种ARP病毒。

2.针对局域网用户,建议统一部署KV网络版杀毒软件,KV网络版具有全网统一升级病毒库,统一全网杀毒的强大功能,可以彻底查杀来自局域网中的ARP病毒。

3.“KV未知病毒扫描”功能可以识别出绝大多数ARP病毒,KV未知病毒扫描程序采用独特的行为判定技术,可以彻底检测出本机中已知和未知的ARP病毒,协助网络管理员快速清除ARP病毒。

4.特针对企业用户,提供“ARP病毒应急响应服务” ,江民科技网络安全工程师可以上门处理企业用户内网中的ARP病毒,确保快速恢复企业网络的数据通讯安全。

5.KV新版防火墙特增加了ARP病毒防御功能,可以拦截来自局域网中的ARP欺骗数据包,保护本机联网安全。设置界面如图11。

1112749

图11 KV新版防火墙增加了ARP攻击防护功能

KV新版防火墙增加了ARP攻击防护功能,该功能使用方法也很简单,安装完KV防火墙之后, 点击“设置”按钮,然后勾选“启用攻击防护功能” ,再点击“自动检测本机网络设置” ,程序就会自动获得本机和网关的IP地址和MAC地址,然后点击确定即可。KV防火墙就会实时检测来自网络中的ARP数据包,发现有异常的数据包欺骗,就 会予以拦截,保障本机网络通信安全。

九、关于ARP病毒的网络安全建议

1.在网络正常时候保存好全网的IP—MAC地址对照表,这样在查找ARP中毒电脑时很方便。

2.都全网的电脑都打上MS06-014和MS07-017这两个补丁,包括所有的客户端和服务器,以免感染网页木马。

3.部署网络流量检测设备,时刻监视全网的ARP广播包,查看其MAC地址是否正确。

4.做好IP—MAC地址的绑定工作,对于从这个IP地址发送的报文,如果其MAC地址不是指定关系对中的地址,予以丢弃。

5.部署网络版的杀毒软件,定期升级病毒库,定期全网杀毒。

posted @ 2007-06-22 21:11 wonderer 阅读(268) | 评论 (0)编辑 收藏

找到SQLServer的安装目录,我的是"E:\Program Files\Microsoft SQL Server",在Binn里找到文件"sqlservr.exe",就可以查看版本了。

image

以下是版本号的对照:

SQL Server Versions
@Version SQL Server Version Released
6.50.201 SQL Server 6.5 RTM
6.50.213 SQL Server 6.5 with Service Pack 1
6.50.240 SQL Server 6.5 with Service Pack 2
6.50.258 SQL Server 6.5 with Service Pack 3
6.50.281 SQL Server 6.5 with Service Pack 4
6.50.415 SQL Server 6.5 with Service Pack 5
6.50.416 SQL Server 6.5 with Service Pack 5a
7.00.623 SQL Server 7.0 / MSDE 1.0 RTM
7.00.699 SQL Server 7.0 SP1 July 1999
7.00.842 SQL Server 7.0 SP2 March 20th, 2000
7.00.961 SQL Server 7.0 SP3 December 15th, 2000
7.00.1063 SQL Server 7.0 SP4
8.00.194 SQL Server 2000 RTM
8.00.384 SQL Server 2000 SP1
8.00.534 SQL Server 2000 SP2 November 30th, 2001
8.00.760 SQL Server 2000 SP3
8.00.2039 SQL Server 2000 SP4

posted @ 2007-06-02 21:53 wonderer 阅读(1703) | 评论 (0)编辑 收藏

在subversion的配置文件 svnserve.con 中,默认的配置都说的很清楚。可是在配置的时候,却没有看清楚。一天,一个小组的成员说他检出他项目的时候可以不输入密码的,但是项目的源码却不可以对外公开的。于是,才发觉到这个问题。

后来发现问题出现在

anon-access = read

这里,配置文件里说的很清楚的

### These options control access to the repository for unauthenticated
### and authenticated users. Valid values are "write", "read",
### and "none". The sample settings below are the defaults.
#anon-access = read
#auth-access = write

默认的是匿名可读的,现只要添加

anon-access = none

就可以了

posted @ 2007-04-16 21:40 wonderer 阅读(210) | 评论 (0)编辑 收藏

自渎文件

Exceclsior JET for windows
v4.5
请先阅读我
* 大致浏览

-JET 优化
-JET 运行
-安装工具包
*系统需求

*快速开始

*界面工具

-Excelsior JET Launcher
-JET 控制面板
-jetPackII
-JET 安装
-开发者资源

*大概
Excelsior JET 是一套完全为了优化运行的工具包,是用java编程语言写的可配置和可运行的程序.
Excelsior JET 产品包括了 JET优化程序,是一个完全的 java SE 5.0 的运行和安装程序工具包.
JET 优化程序能够将你的 class格式或者jar格式的文件转化成 开发者的x86(IA-32)的机器码.这样,
您就能够得到windows或者Linux的运行效果极好的原生代码.
另外,产生的原生代码具有高度的反编译和反修改能力.
JET运行程序包括了sun公司的java2 API的许可并同时提供了所有java的特性,例如垃圾回收机制(garbage colletion).
JET 优化程序和运行程序保证在java标准版本5.0(j2sdk 5.0)下正常运行.
如果你想要把你的应用程序分发给一定数量的用户,你可以使用安装工具包来准备一个包括已经优化过的程序和一个JET Excelsior的运行引擎.您的客户就可以简单地安装这个包就可以开始使用您的程序.一些多余的软件的安装,例如JRE,不是最终客户的系统的必须.

JET 优化程序
------------
JET优化程序会在程序开始运行之前把java的.class文件和.jar文件转换成开发者系统的高效的本地代码,直接运行在硬件上.
优化程序使用了很多很普遍使用在传统C/C++和FORTRAN编译器里的优化技巧.为了解决java的执行效率问题,JET优化程序是注入使用了内嵌虚拟方法,安全可移除普遍存在的同步和栈里分配对象的优雅的(state-of-the art)优化来做出来的.

你可以在JET的控制面板上来用优化程序,一个图形界面的向导的,为了你更快地建立您的项目文件和转换你的程序为高效的可执行程序(请参考下面"图形界面工具"的环节)

JET运行时间(runtime不知道是不是这样翻译)
--------------------------------------
JET运行环境是一个彻底的java虚拟机.但有一点特别,它包括了一个即时编译器(JIT)来装载和运行标准的java字节码文件.和其他虚拟机的关键的分别是JET运行环境可以同时工作在java的字节码文件和JET优化程序产生的原生文件.例如,一个JET编译的程序(.exe)可以装载以.jar形式的文件为java插件程序.

如果你使用的程序是使用插件的,装载它们回耗费一些时间.为了减少这些时间,你可以在JET运行时间里打开你的JIT缓存.这样一来,用JIT编译器产生的原生代码就会保留在JIT的缓存力并会在后来的程序启动时重新使用.欲知详情,请参考JET用户指南的"混合编译模块"("mixed compilation model").

包装程序包
---------

为了提供快速的包装程序,Excelsior JET包括了包装程序(JetPackII),也是一个图形向导.通过它,你可以准备一个包括你的优化的java程序和一个JET的运行时间.

基本的部署程序都是尽量简单的.这个产生的包,例如,一个本身包括了目录,能复制到目标系统.一个在没有解压环境都能点击就运行的系统.你可以简单的整合这些包为任何一个安装程序(NSIS和InstallShield或其他).

包装程序能直接产生一个自解压的安装程序.也就是说,用它产生的安装程序,既可以是无人值的安装,也可以是GUI界面的安装.

在GUI模式下,安装程序会通过安装过程处理允许用户来指定诸如目文件夹,快捷键,开始菜单等等的安装设置.你也可以把安装界面设置成一个飞出的窗口,用户协议和把安装程序显示为英语,德语,法语,俄罗斯语或者日本语,看你的喜好和系统的当地设置.欲知详情,请参考JET用户指南的"开发自动设置"("Deployment automation" ).

请把你的回执提交到java@excelsior-usa.com.

系统要求
操作系统:
windows版本的Excelsior JET 4.5已经在以下系统通过了JCK(Java SE compliance)的测试:
Windows 2000 Professional,
Windows 2000 Server,
Windows 2003 Server,
Windows XP Professional

CPU: Intel Pentium III或800MHZ同等级或更高

内存: 384或以上

硬盘空间: 420MB以上

------------------------------------------------------------------------------------------
详细清单在以下网址:

http://www.excelsior-usa.com/jetsysreq.html

posted @ 2007-03-31 16:25 wonderer 阅读(385) | 评论 (0)编辑 收藏

把 Borland Turbo c 的源代码移植到GNU gcc

内容
TurboC 的大概内容
TurboC为何而生??
其他方法(Alternate Approaches, 不知道是不是这样翻译)
TurboC的特点与不足
下载和安装TurboC
未来的计划
为什么要用这么可爱的logo呢?

TurboC的大概内容

TurboC是一个可连接的库同时也是一大堆C语言的头文件,是为了更容易地在GNU gcc,也就是在类Unix系统上,编译那些用原来在Turbo C编译器编译的MS-DOS系统的C语言的源文件,概括如下:
通过Turbo C的conio.x里的ncurses的实现
通过Turbo C的graphics.h里的Xlib的实现
一些其他的函数和为了方便的节省时间的特征
一种克服了Turbo C和GUN gcc的整型数据类型差异的方法
但不管怎么说,这也不是一个完美的解决方案,但是你会发现它还是有用的.你可以在它相关的早期的发展阶段找到graphics.h的帮助.
TurboC遵于GNU的LGPL协议(Lesser General Public License).

TurboC为何而生??

我写过很多基于MS-DOS的用Borland公司的Turbo C 2.0编译器编译的程序.当由于爱好的原因,我想把其中一些代码以自由软件的形式存在,我便想到了把这些代码发布在GPL下,是MS-DOS的代码,慢慢的把它们转换成类Unix系统的代码.很明显,预先直接的去转换(MS-DOS--> *nix)是一件很耗时的工作.而且渐渐的,我遇到了困难,因为发布一个别人无法理解其源代码的的软件并不是一件好事.而我最喜欢的发布开源的频道fleshmeat不"吃"MS-DOS,因此它很文雅的拒绝了我的MS-DOS项目.
很显然,现在的需要是更底层的,然后我就想到了我可以提供合适兼容的Turbo C的库和头文件,这样,把Turbo C的源码引到类Unix系统就会简单得多.也就是说,提供旧版本的MS-DOS的类Unix版本是一件相对容易很多的事情.但究竟这个容易去到哪儿,跟你要引进的程序的很多东西都有关.

其他方法(Alternate Approaches, 不知道是不是这样翻译)

对于conio.h的功能,你可以考虑使用pablo Vidal的UConio的库来代替.但是我没有使用过,所以无法说出其好长与不足,不过它肯定提供比TurboC提供一个少得多的Conio的功能的子集.而且它也会要求你更大范围的修改你的源代码.
Borland公司已经有了(或许会提供)一个Linux版本的C++编译器,这样的话,它的nature,价格和这个编译器的目标工作平台将是一个谜.一种假设(象Kylix)就是它将基于wine的,所以它只可以工作在x86的系统上面.但是,如果它包括了在TurboC上实现的库,那样,老实说,他提供了一种更简单的的方法来把你Turbo C的源代码引入到Linux上,但如果这样的话,它将会是非常庞大的.对我自己来说,尽管已经是一个很久的borland公司的用户了,但我还是非常希望用GNU gcc来编译我的程序.
对于graphics.h的功能,有一个Csaba Biegl, Michael Goffioul, and Hartmut Schirmer的GRX库.直到graphics.h的功能还有一点还没写完的时候,我才发现了这个库,因此我还没来得及很充分的测试它.它的目标是要成为一个多平台的2D图像库.它的官网没有宣传(甚至没有提到)与Turbo C的兼容性.然而,它只包括了非常少量的与Turbo C同名(当然还有相同功能)的功能.
当然,如果你只是感兴趣在类Unix系统上运行你的程序,同时也反对把其他程序引到类Unix系统上,那你也可以在linux版本的DOS emulators 下运行你已经存在的程序.DOS emulation使用了 dosemu 和 freedos ,在x86系统上工作得非常好,同时 bochs 和 freedos在非x86类Unix系统上工作的也不错(但可能有点慢).

TurboC的特点与不足

特点
TurboC 提供了Turbo C的conio.h头文件控制台的大部分功能,与相关的ncurses的功能一一对应.(当然,除了scanf之外的conio.h的功能都有提供)
TurboC提供了Turbo C的graphics.h头文件"BGI"的大部分功能.到目前为止(2002 06 08),除了临时缺乏stroked-font的支持,这些特点的实现已经完成的很彻底了.
TurboC提供了这些丢失的功能诸如strupr和strlwr的功能的很少的东西,
请确认可提供的方法的完整列表:

不足
请参考bugs和issues的完整列表.到目前为止,这个库文件只是我在特定的我写的Turbo C的程序所需要的那么完整,随着我引入的我以前的程序到类Unix 系统的多起来,TurboC的库大概才会愈来愈完整.到目前为止,本质上conio.h的支持已经完整了,除了显示文本外,graphics.h的支持也本质上完整了.
在已经引进的程序里,除非你使用了xterm,要不然文本控制台的窗口指挥逻辑上自动调好尺寸,并不会physically地去调整.如果你用了诸如KDE控制台之类的其他控制台,用户必须人为地去调整了.
Borland的Turbo C是16位的编译器,但是我目标的GNU gcc编译器是32位的,结果产生了整型的数据类型的差异.TurboC用宏的方法处理了(但愿)更普遍的情况.没有处理的情况会在编译的时候报错,用户必须手动去修改.在用户的页面会被详细介绍.
用基于诸如 getcha, cprintf或其他的控制台来混合基于流的功能(如 getchar, printf,其他),很可能会不工作.你也可以浏览usage page.

下载并安装TurboC
下载源代码
*Most-current development code (20040218) TurboC-dev.tar.gz
20020602 snapshot TurboC-20020602.tar.gz
20020419 snapshot TurboC-20020419.tar.gz
20020418 snapshot TurboC-20020418.tar.gz
20020323 snapshot TurboC-20020323.tar.gz
20020317 snapshot TurboC-20020317.tar.gz
20020312 snapshot TurboC-20020312.tar.gz

tarball里包括了一个教TurboC-source的文件夹,你可以简单的在这个目录下用make来编译库.但必须是GNU gcc或者用gmake(例如在FreeBSD或Mac下)来编译(提示,在FreeGSD下,你要编辑makefile和注释/反注释开头的若干行,你会很容易看到的),我已经检验了最近释出的snapshot(不是开发者的snapshot)并在以下系统测试了程序:
Linux Intel 'x86 (SuSE 8.0)
Linux PowerPC (SuSE 7.3)
FreeBSD (4.5)
(早期的TurboC的库好像在FreeBSD上工作的效果不怎么好,请升级到20020420的版本,并且在运行引入的程序的时候按照下面的步骤).最近释出的snapshot只在SuSE8.2上测试过.
把这个库(libTurboC.a and libTurboCu.a)放在你系统放库的地方--通常在 /usr/lib.把所有的头文件放到它应该放的地方--通常是 /usr/include.又或者,你也可以添加它们的链接到这些目录.又或者,把它们放到你喜欢的地方,然后在gcc里用参数 -L和-I来连接它们.
在我的系统,我是这么做的.
cd ~
tar -xzvf TurboC-dev.tar.gz
cd TurboC-source
... 编辑FreeBSD的makefile ...
make (or gmake)
su
ln -s *.h /usr/include
ln -s libTurboC.a /usr/lib
exit
你会发现(例如,在FreeBSD)如果你在你引入的程序力#include了TurboC的头文件,你的编译器会报错:标识符链接太深(symbolic links being "too deep").如果是这样的话,你可以把上边的ln命令的参数"-s"去掉.
另外,编译Makefile当然会假定X-window系统的头文件和库;如果这个假定是错的话,你就要你的编译器加上参数"-L"和/或者"-I"来调整.X-window系统必须编译全部的库,或者你要运行你的程序,如果你要用到graphics.h的功能.如果你不打算使用这些功能,你可以通过编辑Makefile和去掉编译器参数的"-DWITH_X"在没有X的系统上引入和编译你的程序.

未来的计划

嗯,很明显这种项目是没什么前途的,它的计划只不过是从一个古老的编译器里引入它的代码.然而,我还是会在我这个项目里根据需要增加一些特性的.我不会浪费精力去写一些没有在我Turbo C程序力出现过的功能的,但如果你自己已经写了而又告诉了我,我是很乐意加进去的(把荣辱加给你).
当然,很希望你能把TurboC的bug返回给我,(当然在这之前,去看看Buglist有没有这个问题),我会尽力去改正它们的.

为什么要用这么可爱的logo呢?

这是一幅姐妹在谈话的图片,画家Lynn Rothan的杰作.我试图表达的意思是,它表现了很相似的c编译器 Borland Turbo C和GUN gcc的关系.当然拉,lynn有他自己的意思.请参考他的网站.

posted @ 2007-03-31 16:23 wonderer 阅读(1404) | 评论 (1)编辑 收藏

Getting start with Derby

version 10.2
来自http://db.apache.org/derby
翻译by wonderer http://www.blogjava.net/wonderer

内容

版权收有
Derby的介绍
部署选项
系统要求
Derby的库
安装并且用Derby来工作
安装Derby
设置你的环境变量
使用Derby工具和启动系列工具
使用工具 sysinfo
运行 ij
设置类路径(classpath)
有经验的JDBC用户的快速指南
Derby能运行的环境
嵌入式的环境
客户/服务端的环境
能用的驱动器
数据库连接URL
文档协定
术语
SQL语法
技术协定

Derby的库和脚本:全部参考目录
Derby提供的库
不是由Derby提供的库
Derby已有的脚本

商标

版权所有
我翻译技术文档,这个就不翻译了, ^<>^

Derby的介绍
欢迎来到Derby的世界,Derby是一个基于Java(TM)和SQL的关系数据库管理系统(RDBMS),这一部分是介绍 Derby的.
部署选项
你可以用很多不同的方法来部署Derby
你部署的选项包括:
-单用户嵌入式的java应用程序.因为不需要管理并同时可以工作跟应用程序工作在同一个虚拟机 上,Derby对于最终用户可以说是几乎透明的.
-多用户的嵌入式程序,例如网络服务器,一个应用程序服务器,或一个共享的开放环境.
-服务器框架的嵌入式.你可以用网络客户端驱动器或者服务端驱动器,以使用网络服务.

系统要求
Derby是一个完全用java开发的数据库引擎.它可以运行在任意一个Java虚拟机里(JVM).

Derby的库
Derby的库包括了Derby指南和API参考
Derby开发者指南
描述了Derby对所有部署的共同的功能和特征,例如Derby的JDBC和SQL的细节,部署Derby应用程序,安全, 和其他高级特性.

Derby参考指南
指明了Derby是集成了SQL语言的.同时也提供了Derby的JDBC和JTA执行,关键字,系统表,属性,和SQL异常 的参考信息.
调较Derby
介绍了怎样通过属性来配置和调较Derby,并提供了属性的参考信息.同时也提供了性能提示,一个性能的 深入讨论,一个Derby最优化的信息.

Derby工具指南
一个用derby工具(例如ij,和其他一些如import/export更高级的工具,和数据库类装载器)来工作的指

Derby服务器和管理指南
这个指南的第一部分讨论了配置服务器,怎样来编客户端程序,和数据库的管理.
另外,一些系统可能需要例如备份数据库这样的管理.这些任务依赖于一些服务器框架,但也是单独的多 用户的大型系统.

指南的第二部分讨论了如备份和调试死锁的管理问题.

Derby API 文档
有所有Derby公开类文件自动产生.(没有提供JDBC的API). 如果要更详细的信息,请参考Derby参考指南.

安装并且用Derby来工作
如果你是一个Derby和JDBC的新手,这一部分会帮助你使用这个产品.如果你是一个有经验的JDBC程序员, 请看有经验的JDBC用户的快速指南.

安装Derby
要安装Derby,你必须先从Derby的网站下载Derby的zip或者tar包.
用你的浏览器输入以下网址http://db.apache.org/derby/derby_downloads.html 这个下载页面提供了若干个Derby的发行版本,包括了版本快照和稳定版本二进制发行版本.你也可以找到教你用subversion来获得最新源码的信息.

发行版本有:
--二进制发行版包括了代码,示例程序和文档.已经优化了的jar文档在lib目录下
--lib发行版本包括了优化程序,部署Derby的最小jar的集合.
--lib-debug发行版本包括了调试Derby和报告问题的有用的最大集合.
--src发行版本包括了要来产生上面三个发行版的源文件.

这个指南假定你会下载二进制发行版的.
解压下载的包,之后有以下几个子目录:
--demo包括了示例程序
--bin包括了运行和设置环境的代码
--javadoc包括了有源代码生产的aip文档
--doc包括了Derby文档
--lib包括了Derby的jar文件

设置你的环境变量

posted @ 2007-03-31 16:20 wonderer 阅读(1079) | 评论 (0)编辑 收藏

刚才电脑怪怪的,以前就老师抱怨这个杀毒软件不行,于是下了个新版的mac,居然还不用付钱,只用邮箱注册个账号就ok.于是一装,杀了不少毒,激动之余,心理有一点凉凉的感觉.等我再打开qq,不妥,怎么弹出个打开方式?再试试其他程序,还是这个打开方式,不觉心理打了个寒颤(以前我们班的女生遇到这个问题,"请"我帮她解决,我什么都没说,就塞个启动盘,重装....._)我不是这么想不开,要重装吧,汗一个......

在网上搜了一下,居然搜到了结果,试了一下.天啊,我的exe啊,终于回来了.哇哈哈,人品好啊!

现把解决方法记下,下次不用这么怕:

这个问题一般是由于病毒引起的文件关联被修改。

可修改注册表解决:

  1. 先将Windows目录下的注册表编辑器“Regedit.exe”改为“Regedit.com”, 然后运行它,依次找到HKEY_CLASSES_ROOT\exefile\shell\open\command, 双击“默认”字符串,将其数值改为“"%1" %*”就可以了。
  2. 另外也可以在DOS(有改名为cmd)下运行“ftype exefile=%1 %*”或“assoc .exe=exefile”命令 也可以恢复EXE文件的关联

posted @ 2007-03-31 16:13 wonderer 阅读(196) | 评论 (0)编辑 收藏

实验室最近装了个subversion的服务器,操作系统采用了ubuntu server,没有安装desktop,鬼叫老师才给个128的内存。一路安装过来,非常顺利。

    sudo apt-get subversion

然后就可以用svnadmin create project来创建项目了。之后修改passwd和svnserve.cnf文件都没有什么难度。不过发现ubuntu server没有redhat的chkconf指令(不过我也不懂这个指令是怎样工作的)。尝试过在/etc/init.d/rc3.d/里做链接。不过不成功,可能是我的文件链接有问题,找遍了ubuntu论坛,没有找到答案。最后,只能通过/etc/rc.local来达到我的目的了。

rc.local在是系统启动后就执行,也就是说你没有登陆前就执行了

rc.local脚本只是一个在各运行级别里到rc.d目录的rc.local脚本的软链接而已,编号最大,所以被rc脚本执行时在各运行级别的初始化末尾进行。
在rc.local里设置的最好是系统级别而非用户级别的,因为启动脚本的初始化与用户无关(启动脚本初始化完成后,才进入用户登录界面)。与用户相关的最好设置shell的配置文件如~/.bash_profile

posted @ 2007-03-31 16:05 wonderer 阅读(1450) | 评论 (0)编辑 收藏

前几天,blogspot又被封了。妈的,偌大一个google,居然会遇到这样的问题。天啊,我只是想找个地方记记我的工作心得而已。

既然如此,算,想找msn space,又看不爽它那么大的一条广告,我晕,幸好blogjava对writer的支持得很好,而且我这里的速度也还可以,于是决定在这了。

晕。

posted @ 2007-03-31 14:35 wonderer 阅读(124) | 评论 (0)编辑 收藏