<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye博客</title>
    <description>Java博客,Ruby on Rails博客,AJAX博客,Agile博客 -- JavaEye做最棒的软件开发交流社区</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>软件智力面试题</title>
        <author>lvbo744</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lvbo744.javaeye.com">lvbo744</a>&nbsp;
          链接：<a href="http://lvbo744.javaeye.com/blog/237856" style="color:red;">http://lvbo744.javaeye.com/blog/237856</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>第一组<br />　　1.烧一根不均匀的绳，从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子，问如何用烧绳的方法来计时一个小时十五分钟呢?<br /><br />　　2.你有一桶果冻，其中有黄色、绿色、红色三种，闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?<br /><br />　　3.如果你有无穷多的水，一个3公升的提捅，一个5公升的提捅，两只提捅形状上下都不均匀，问你如何才能准确称出4公升的水?<br /><br />　　4.一个岔路口分别通向诚实国和说谎国。来了两个人，已知一个是诚实国的，另一个是说谎国的。诚实国永远说实话，说谎国永远说谎话。现在你要去说谎国，但不知道应该走哪条路，需要问这两个人。请问应该怎么问?<br /><br />　　5.12个球一个天平，现知道只有一个和其它的重量不同，问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重，所以需要仔细考虑)<br /><br />　　6.在9个点上画10条直线，要求每条直线上至少有三个点?<br /><br />　　7.在一天的24小时之中，时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?<br /><br />　　8.怎么样种植4棵树木，使其中任意两棵树的距离相等?<br /><br />　　第二组<br /><br />　　1.为什么下水道的盖子是圆的?<br /><br />　　2.中国有多少辆汽车?<br /><br />　　3.将汽车钥匙插入车门，向哪个方向旋转就可以打开车锁?<br /><br />　　4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个，你会去掉哪一个，为什么?<br /><br />　　5.多少个加油站才能满足中国的所有汽车?<br /><br />　　6.想象你站在镜子前，请问，为什么镜子中的影象可以颠倒左右，却不能颠倒上下?<br /><br />　　7.为什么在任何旅馆里，你打开热水，热水都会瞬间倾泻而出?<br /><br />　　8.你怎样将Excel的用法解释给你的奶奶听?<br /><br />　　9.你怎样重新改进和设计一个ATM银行自动取款机?<br /><br />　　10.如果你不得不重新学习一种新的计算机语言，你打算怎样着手来开始?<br /><br />　　11.如果你的生涯规划中打算在5年内受到奖励，那获取该项奖励的动机是什么?观众是谁?<br /><br />　　12.如果微软告诉你，我们打算投资五百万美元来启动你的投资计划，你将开始什么样商业计划?为什么?<br /><br />　　13.如果你能够将全世界的电脑厂商集合在一个办公室里，然后告诉他们将被强迫做一件事，那件事将是什么?　<br /><br /><br /><br />第三组<br /><br />　　1.你让工人为你工作7天，回报是一根金条，这个金条平分成相连的7段，你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断，你如何给你的工人付费?<br /><br />　　2.有一辆火车以每小时15公里的速度离开北京直奔广州，同时另一辆火车每小时20公里的速度从广州开往北京。如果有一只鸟，以30公里每小时的速度和两辆火车同时启动，从北京出发，碰到另一辆车后就向相反的方向返回去飞，就这样依次在两辆火车之间来回地飞，直到两辆火车相遇。请问，这只鸟共飞行了多长的距离?<br /><br />　　3.你有四个装药丸的罐子，每个药丸都有一定的重量，被污染的药丸是没被污染的药丸的重量+1。只称量一次，如何判断哪个罐子的药被污染了?<br /><br />　　4.门外三个开关分别对应室内三盏灯，线路良好，在门外控制开关时候不能看到室内灯的情况，现在只允许进门一次，确定开关和灯的对应关系?<br /><br />　　5.人民币为什么只有1、2、5、10的面值?<br /><br />　　6.你有两个罐子以及50个红色弹球和50个蓝色弹球，随机选出一个罐子，&nbsp;随机选出一个弹球放入罐子，怎么给出红色弹球最大的选中机会?在你的计划里，得到红球的几率是多少?<br /><br />　　7.给你两颗6面色子，可以在它们各个面上刻上0-9任意一个数字，要求能够用它们拼出任意一年中的日期数值<br /><br />　　第四组<br /><br />　　第一题&nbsp;.&nbsp;五个海盗抢到了100颗宝石，每一颗都一样大小和价值连城。他们决定这么分：<br /><br />　　抽签决定自己的号码(1、2、3、4、5)<br /><br />　　首先，由1号提出分配方案，然后大家表决，当且仅当超过半数的人同意时，按照他的方案<br /><br />　　进行分配，否则将被扔进大海喂鲨鱼<br /><br />　　如果1号死后，再由2号提出分配方案，然后剩下的4人进行表决，当且仅当超过半数的人同<br /><br />　　意时，按照他的方案进行分配，否则将被扔入大海喂鲨鱼<br /><br />　　依此类推<br /><br />　　条件：每个海盗都是很聪明的人，都能很理智地做出判断，从而做出选择。<br /><br />　　问题：第一个海盗提出怎样的分配方案才能使自己的收益最大化?<br /><br />　　第二题&nbsp;.&nbsp;一道关于飞机加油的问题，已知：<br /><br />　　每个飞机只有一个油箱，<br /><br />　　飞机之间可以相互加油(注意是相互，没有加油机)<br /><br />　　一箱油可供一架飞机绕地球飞半圈，<br /><br />　　问题：<br /><br />　　为使至少一架飞机绕地球一圈回到起飞时的飞机场，至少需要出动几架飞机?(所有飞机从同一机场起飞，而且必须安全返回机场，不允许中途降落，中间没有飞机场)第三题.&nbsp;汽车加油问题<br /><br />　　一辆载油500升的汽车从A开往1000公里外的B，已知汽车每公里耗油量为1升，A处有无穷多的油，其他任何地点都没有油，但该车可以在任何地点存放油以备中转，问从A到B最少需要多少油<br /><br />　　第四题.&nbsp;掷杯问题<br /><br />　　一种杯子，若在第N层被摔破，则在任何比N高的楼层均会破，若在第M层不破，则在任何比M低的楼层均会破，给你两个这样的杯子，让你在100层高的楼层中测试，要求用最少的测试次数找出恰巧会使杯子破碎的楼层。<br /><br />　　第五题.&nbsp;推理游戏<br /><br />　　教授选出两个从2到9的数，把它们的和告诉学生甲，把它们的积告诉学生乙，让他们轮流猜这两个数<br /><br />　　甲说：&ldquo;我猜不出&rdquo;<br /><br />　　乙说：&ldquo;我猜不出&rdquo;<br /><br />　　甲说：&ldquo;我猜到了&rdquo;<br /><br />　　乙说：&ldquo;我也猜到了&rdquo;<br /><br />　　问这两个数是多少<br /><br />　　第六题.&nbsp;病狗问题<br /><br />　　一个住宅区内有100户人家，每户人家养一条狗，每天傍晚大家都在同一个地方遛狗。已知这些狗中有一部分病狗，由于某种原因，狗的主人无法判断自己的狗是否是病狗，却能够分辨其他的狗是否有病，现在，上级传来通知，要求住户处决这些病狗，并且不允许指认他人的狗是病狗(就是只能判断自己的)，过了7天之后，所有的病狗都被处决了，问，一共有几只病狗?为什么?<br /><br />　　第七题.&nbsp;U2合唱团在17分钟内得赶到演唱会场，途中必需跨过一座桥，四个人从桥的同一端出发，你得帮助他们到达另一端，天色很暗，而他们只有一只手电筒。一次同时最多可以有两人一起过桥，而过桥的时候必须持有手电筒，所以就得有人把手电筒带来带去，来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同，若两人同行则以较慢者的速度为准。BONO需花1分钟过桥,EDGE需花2分钟过桥,ADAM需花5分钟过桥,LARRY需花10分钟过桥,他们要如何在17分钟内过桥呢?<br /><br />　　第八题.&nbsp;监狱里有100个房间，每个房间内有一囚犯。一天，监狱长说，你们狱房外有一电灯，你们在放风时可以控制这个电灯(熄或亮)。每天只能有一个人出来放风，并且防风是随机的。如果在有限时间内，你们中的某人能对我说：&ldquo;我敢保证，现在每个人都已经至少放过一次风了。&rdquo;我就放了你们!问囚犯们要采取什么策略才能被监狱长放掉?如果采用了这种策略，大致多久他们可以被释放?<br /><br /><br /><br />第五组<br /><br />　　1.某手机厂家由于设计失误，有可能造成电池寿命比原来设计的寿命短一半(不是冲放电时间)，解决方案就是免费更换电池或给50元购买该厂家新手机的折换券。请给所有已购买的用户写信告诉解决方案。<br /><br />　　2.一高层领导在参观某博物馆时，向博物馆馆员小王要了一块明代的城砖作为纪念，按国家规定，任何人不得将博物馆收藏品变为私有。博物馆馆长需要如何写信给这位领导，将城砖取回。<br /><br />　　3.营业员小姐由于工作失误，将2万元的笔记本电脑以1.2万元错卖给李先生，王小姐的经理怎么写信给李先生试图将钱要回来?<br /><br />　　4.给你一款新研制的手机，如果你是测试组的组长，你会如何测试?<br /><br />　　5.如何为函数int&nbsp;atoi(const&nbsp;char&nbsp;*&nbsp;pstr)编写测试向量?<br /><br />　　第六组<br /><br />　　1.链表和数组的区别在哪里?<br /><br />　　2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?<br /><br />　　3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?<br /><br />　　4.请编写能直接实现char&nbsp;*&nbsp;strcpy(char&nbsp;*&nbsp;pstrDest,const&nbsp;char&nbsp;*&nbsp;pstrSource)函数功能的代码。<br /><br />　　5.编写反转字符串的程序，要求优化速度、优化空间。<br /><br />　　6.在链表里如何发现循环链接?<br /><br />　　7.给出洗牌的一个算法，并将洗好的牌存储在一个整形数组里。<br /><br />　　8.写一个函数，检查字符是否是整数，如果是，返回其整数值。(或者：怎样只用4行代码<br /><br />　　9.给出一个函数来输出一个字符串的所有排列。<br /><br />　　10.请编写实现void&nbsp;*&nbsp;malloc(int)内存分配函数功能一样的代码。<br /><br />　　11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。<br /><br />　　12.怎样编写一个程序，把一个有序整数数组放到二叉树中?<br /><br />　　13.怎样从顶部开始逐层打印二叉树结点数据?请编程。<br /><br />　　14.怎样把一个链表掉个顺序(也就是反序，注意链表的边界条件并考虑空链表)?&nbsp;--<br /><br />　　15.请编写能直接实现int&nbsp;atoi(const&nbsp;char&nbsp;*&nbsp;pstr)函数功能的代码</p>
          <br/>
          <span style="color:red;">
            <a href="http://lvbo744.javaeye.com/blog/237856#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 11:18:51 +0800</pubDate>
        <link>http://lvbo744.javaeye.com/blog/237856</link>
        <guid>http://lvbo744.javaeye.com/blog/237856</guid>
      </item>
      <item>
        <title>成为JAVA高手需要多长时间？ </title>
        <author>ZL58</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zl58.javaeye.com">ZL58</a>&nbsp;
          链接：<a href="http://zl58.javaeye.com/blog/237850" style="color:red;">http://zl58.javaeye.com/blog/237850</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          其实这个是因人而已的，但是成为真正的高手即使悟性再高也是需要至少两年的时间。<br /><br />第一是因为JAVA的类库非常的庞大，作为高手对于里面的常用类应该是非常熟悉的，而且应该是比较熟悉JDK的类库的设计思想和结构。<br /><br />第二是因为java的扩展比较多，概念也非常的多，作为高手，对于JAVA相关的其它概念虽然不能都很清楚，但是至少应该知道是什么，是处理哪个领域的问题的。<br /><br />第三是因为有很多工具需要熟悉。由于JAVA到目前为止还没有一个完整的工具标准，因此需要学习很多工具和类库的使用，这个也是一个非常耗时间的过程。<br /><br />第四是作为真正的高手，不能进行系统设计怎么能称为高手呢？这样最起码要掌握面向对象设计，然后需要学习设计模式以及重构，以及更高层次的面向组件的设计或者面向服务的设计，而这些不通过两年的学习和实践也是不可能的。
          <br/>
          <span style="color:red;">
            <a href="http://zl58.javaeye.com/blog/237850#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 10:55:19 +0800</pubDate>
        <link>http://zl58.javaeye.com/blog/237850</link>
        <guid>http://zl58.javaeye.com/blog/237850</guid>
      </item>
      <item>
        <title>内存异步及JMS异步框架实现</title>
        <author>jwin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jwin.javaeye.com">jwin</a>&nbsp;
          链接：<a href="http://jwin.javaeye.com/blog/237847" style="color:red;">http://jwin.javaeye.com/blog/237847</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般来说，对于那些处理时间比较长，需要马上响应并且做成异步后不会影响其它流程的做成异步。比如用户注册成功后发邮件给用户，这个可以在用户注册成功后马上返回，而不需要等到邮件发送成功才返回。异步有二种方式：内存异步和JMS异步。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 内存异步即把要处理的请求放到内存队列中，然后由多个线程去消费。这种方式性能比较高，但是会存在请求丢失和内存溢出的风险。比如服务器突然down机，那么队列中未处理完的请求就会丢失；如果请求处理时间太长，并且请求一直在增加，即生产者速度要大于消费者速度时，就存在内存溢出的风险。这种适合对数据丢失不敏感，并且生产者速度要小于消费者速度的场合。</p>
<p>&nbsp;&nbsp;&nbsp; JMS异步即把要处理的请求先持久化到数据库，然后多个线程去消费。这种方式性能相对来说要慢一些，但是不会出现请求丢失和内存溢出的情况。这种适合不允许数据丢失，请求处理时间比较长的场合。</p>
<p>&nbsp;</p>
<p>异步框架，使用元数据和AOP的方式，将内存异步和JMS异步统一起来。</p>
<pre name="code" class="java">package com.konceptusa.infinet.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 方法异步
 * @author Jwin
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target( {ElementType.METHOD })
@Documented
public @interface Async
{
	//异步队列名称,默认为类名.方法名
	String queueName() default "";
	//消费者线程数
	int threadCount() default 10;
	//队列报警值，仅对内存异步有效
	int warningQueueSize() default 100;
	//是否使用jms异步，默认为内存异步
	boolean jmsAsync() default false;
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="java">package com.konceptusa.infinet.imsupport.aop;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.jms.ConnectionFactory;
import javax.jms.Queue;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.listener.DefaultMessageListenerContainer;

import com.konceptusa.framework.asyn.AsynCallInfo;
import com.konceptusa.framework.asyn.jms.AsynExecuteMessageListener;
import com.konceptusa.framework.core.jmsservice.ObjectMessageSenderImpl;
import com.konceptusa.framework.core.jmsservice.SendMessageFailedException;
import com.konceptusa.infinet.annotation.Async;

/**
 * 异步AOP
 * @author Jwin
 *
 */
public class AsyncInterceptor implements DisposableBean
{
	private final static Log LOG = LogFactory.getLog(AsyncInterceptor.class);
	private Map&lt;String, ThreadPoolExecutor&gt; executorMap = new HashMap&lt;String, ThreadPoolExecutor&gt;();
	private Map&lt;String, ObjectMessageSenderImpl&gt; messageSenderMap = new HashMap&lt;String, ObjectMessageSenderImpl&gt;();
	private Map&lt;String, DefaultMessageListenerContainer&gt; listerContainerMap = new HashMap&lt;String, DefaultMessageListenerContainer&gt;();
	private ConnectionFactory connectionFactory;
	public Object async(final ProceedingJoinPoint pjp, Async async) throws Throwable
	{
		if(!async.jmsAsync())
		{
			memAsync(pjp, async);			
		}
		else
		{
			jmsAsync(pjp,async);
		}
		return null;
	}
	
	private void jmsAsync(ProceedingJoinPoint pjp, Async async)
	{
		ObjectMessageSenderImpl objectMessageSender = null;
		String queueName = getQueueName(pjp, async);
		synchronized (messageSenderMap)
		{
			objectMessageSender = messageSenderMap.get(queueName);
			if(objectMessageSender == null)
			{
				LOG.info("init jms queueName " + queueName + " thread count " + async.threadCount() );
				objectMessageSender = new ObjectMessageSenderImpl();
				Queue queue = new ActiveMQQueue(queueName);
				JmsTemplate jmsTemplate = new JmsTemplate();
				jmsTemplate.setConnectionFactory(connectionFactory);
				jmsTemplate.setDefaultDestination(queue);
				objectMessageSender.setJmsTemplate(jmsTemplate);
				messageSenderMap.put(queueName, objectMessageSender);
				DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer();
				defaultMessageListenerContainer.setConcurrentConsumers(async.threadCount());
				defaultMessageListenerContainer.setConnectionFactory(connectionFactory);
				defaultMessageListenerContainer.setDestination(queue);
				defaultMessageListenerContainer.setCacheLevelName("CACHE_CONSUMER");
				defaultMessageListenerContainer.setMaxMessagesPerTask(20);
				AsynExecuteMessageListener messageListener = new AsynExecuteMessageListener();
				messageListener.setTarget(pjp.getTarget());
				defaultMessageListenerContainer.setMessageListener(messageListener);
				defaultMessageListenerContainer.afterPropertiesSet();
				listerContainerMap.put(queueName, defaultMessageListenerContainer);
			}			
		}
		AsynCallInfo asynCallInfo = new AsynCallInfo(pjp.getSignature().getName(),pjp.getArgs());
		objectMessageSender.asynSendMessage(asynCallInfo);
	}

	private String getQueueName(ProceedingJoinPoint pjp, Async async)
	{
		String queueName = async.queueName();
		//如果没有指定队列名，则以 类名.方法名 为队列名
		if(StringUtils.isBlank(queueName))
		{
			queueName = pjp.getTarget().getClass().getSimpleName() + "." + pjp.getSignature().getName();
		}
		return queueName;
	}
	private void memAsync(final ProceedingJoinPoint pjp, Async async)
	{
		ThreadPoolExecutor executor = null;
		final String queueName = getQueueName(pjp, async);
		synchronized (executorMap)
		{
			executor = executorMap.get(queueName);
			if(executor == null)
			{
				LOG.info("init mem queueName " + queueName + " thread count " + async.threadCount() + " warning queue size " + async.warningQueueSize());
				executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(async.threadCount());
				executorMap.put(queueName, executor);
			}
		}
		Thread thread = new Thread(){
			@Override
			public void run()
			{
				try
				{
					pjp.proceed();
				} catch (Throwable e)
				{
					LOG.error("async call fail", e);
				}
			}
		};
		executor.execute(thread);
		int size = executor.getQueue().size();
		if( size &gt;= async.warningQueueSize())
		{
			LOG.warn("queueName " + queueName + " exceeds warning queue size " + async.warningQueueSize() + " current size " + size);
		}
	}
	public void destroy() throws Exception
	{
		for(String key : executorMap.keySet())
		{			
			LOG.info("destroy mem queue " + key);
			ThreadPoolExecutor executor = executorMap.get(key);
			executor.shutdown();
			executor.awaitTermination(2, TimeUnit.SECONDS);
		}
		for(String key : listerContainerMap.keySet())
		{			
			LOG.info("destroy jms queue " + key);
			DefaultMessageListenerContainer container = listerContainerMap.get(key);
			container.destroy();
		}
		executorMap.clear();
		listerContainerMap.clear();
	}
	public void setConnectionFactory(ConnectionFactory jmsConnectionFactory)
	{
		this.connectionFactory = jmsConnectionFactory;
	}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>对需要异步的方法加入@Aysnc 即可实现异步</p>
<p>&nbsp;</p>
<p>内存异步</p>
<pre name="code" class="java">	@Async
	public String memAsyncFind(Long userid)
	{
		System.out.println("mem asyncFind userid " + userid);
		return userid.toString();
	} 
</pre>
<p>&nbsp;</p>
<p>JMS异步</p>
<pre name="code" class="java">	@Async(jmsAsync=true)
	public String jmsAsyncFind(Long userid)
	{
		System.out.println("jms asyncFind userid " + userid);
		return userid.toString();
	} 
</pre>
<p>&nbsp;</p>
<p>AOP配置</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
   "
	default-autowire="byName"&gt;
 	&lt;bean id="asyncInterceptor"
		class="com.konceptusa.infinet.imsupport.aop.AsyncInterceptor"&gt;
	&lt;/bean&gt;
	
	&lt;aop:config&gt;
		&lt;aop:pointcut id="asyncPointcut"
				expression="execution(* com.konceptusa.infinet.test.service..*.*(..)) and @annotation(async)" /&gt;
		&lt;aop:aspect id="asyncAspect" ref="asyncInterceptor"&gt;
			&lt;aop:around method="async" pointcut-ref="asyncPointcut" /&gt;
		&lt;/aop:aspect&gt;
	&lt;/aop:config&gt;	
	
&lt;/beans&gt;
</pre>
<p>Activemq配置&nbsp;</p>
<pre name="code" class="xml">&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:amq="http://activemq.org/config/1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.org/config/1.0 http://activemq.apache.org/schema/activemq-core.xsd
  http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd"&gt;

	&lt;broker xmlns="http://activemq.org/config/1.0" brokerName="test"
		dataDirectory="${activemq.data}/data/test"&gt;
		&lt;persistenceAdapter&gt;
			&lt;journaledJDBC journalLogFiles="10"
				dataDirectory="${activemq.data}/persistence"
				dataSource="#activemq-ds" createTablesOnStartup="true"
				useDatabaseLock="false" /&gt;
		&lt;/persistenceAdapter&gt;

		&lt;systemUsage&gt;
			&lt;systemUsage&gt;
				&lt;memoryUsage&gt;
					&lt;memoryUsage limit="100 mb"
						percentUsageMinDelta="20" /&gt;
				&lt;/memoryUsage&gt;
				&lt;storeUsage&gt;
					&lt;storeUsage limit="1 gb" /&gt;
				&lt;/storeUsage&gt;
			&lt;/systemUsage&gt;
		&lt;/systemUsage&gt;
	&lt;/broker&gt;

	&lt;bean id="activemq-ds"
		class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close"&gt;
		&lt;property name="driverClass" value="${database.driverName.mq}" /&gt;
		&lt;property name="jdbcUrl" value="${database.url.mq}" /&gt;
		&lt;property name="user" value="${database.user.mq}" /&gt;
		&lt;property name="password" value="${database.password.mq}" /&gt;
		&lt;property name="initialPoolSize" value="${database.initialSize}" /&gt;
		&lt;property name="minPoolSize" value="${database.initialSize}" /&gt;
		&lt;property name="maxPoolSize" value="${database.maxActive}" /&gt;
		&lt;property name="maxIdleTime" value="${database.maxIdleTime}" /&gt;
		&lt;property name="acquireIncrement" value="${database.acquireIncrement}" /&gt;
		&lt;property name="numHelperThreads" value="${database.numHelperThreads}" /&gt;
		&lt;property name="automaticTestTable"
			value="${database.automaticTestTable}" /&gt;
		&lt;property name="maxStatements" value="${database.maxStatements}" /&gt;
		&lt;property name="maxStatementsPerConnection"
			value="${database.maxStatementsPerConnection}" /&gt;
		&lt;property name="idleConnectionTestPeriod"
			value="${database.idleConnectionTestPeriod}" /&gt;
	&lt;/bean&gt;

	&lt;connectionFactory xmlns="http://activemq.org/config/1.0"
		id="jmsConnectionFactory" brokerURL="vm://test" /&gt;

	&lt;bean id="connectionFactory"
		class="org.springframework.jms.connection.SingleConnectionFactory"&gt;
		&lt;property name="targetConnectionFactory"
			ref="jmsConnectionFactory" /&gt;
	&lt;/bean&gt;
&lt;/beans&gt;
 
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jwin.javaeye.com/blog/237847#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 10:43:55 +0800</pubDate>
        <link>http://jwin.javaeye.com/blog/237847</link>
        <guid>http://jwin.javaeye.com/blog/237847</guid>
      </item>
      <item>
        <title>提交表单同时上传文件(小结)</title>
        <author>birch</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://birch.javaeye.com">birch</a>&nbsp;
          链接：<a href="http://birch.javaeye.com/blog/237846" style="color:red;">http://birch.javaeye.com/blog/237846</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天,在做项目的时候遇到了个问题,事实上是一个不起眼的小错误,可是当时我和一个伙伴就此郁闷了半天.我们做的是一个表单提交同时上传文件的功能,测试的时候虽然提交成功,数据写进了数据库,文件也成功上传了,可是我的CPU(哈哈还是双核的哦)使用率由百分之十几一下就涨到百分之六十多,而且一直维持在这个状态下.如果再一次提交表单,CPU的使用率百分百全被占用了,这时我不得不关掉Tomcat服务器,CPU的使用率才恢愎到正常的水平.其实我在前天做这个功能测试的时候是没有出现这种情况的,昨天为了完善一下表单的校验,在原来那个JSP页面上加了一段javascript表单的校验代码如下:<br />&lt; script  type="text/javascript" ><br />			function checkTeacher(){<br />				if (document.form1.teacherId.value=="") {<br />					alert("请输入登陆名！");<br />					document.form1.teacherId.focus();<br />					<br />				}<br />				else if (document.form1.name.value=="") {<br />					alert("请输入真实姓名！");<br />					document.form1.name.focus();<br />				}<br />				else if (document.form1.bDate.value=="") {<br />					alert("请输入出生日期！");<br />					document.form1.bDate.focus();<br />				}<br />				else if (document.form1.studs.value=="") {<br />					alert("请输入学历！");<br />					document.form1.studs.focus();<br />				}<br />				else if (document.form1.fun.value=="") {<br />					alert("请输入职称！");<br />					document.form1.fun.focus();<br />				}<br />				else if (document.form1.tel.value=="") {<br />					alert("请输入电话号码！");<br />					document.form1.tel.focus();<br />				}<br />				else if (document.form1.email.value=="") {<br />					alert("请输入E-Mail！");<br />					document.form1.email.focus();<br />				}<br />				else if (document.form1.File.value=="") {<br />					alert("请输入文件路径！");<br />					document.form1.File.focus();<br />				}<br />			    else{<br />				   document.form1.submit();<br />				}<br />			}<br />	&lt;/script>.<br />当时JSP页面的提交按钮标签属性是这样写的&lt;input type="submit" name="submit" value="提交" onclick="checkTeacher()">.接着我就开始了测试,一测试就出现了上面说的那个问题,而且更有趣的是有些表单的文本域,我故意不填值进去,然后提交了表单,当弹出了一个消息框之后,它居然还能提交成功(正常的话光标会定位到第一个出现空值的文本域里,同时会取消表单的提交),当然了也避免不了发生上面说的那种异常占用CPU的情况了.如果你有经验,或者遇到过类似的问题,也许在我写的代码里看到了一些疑点,但不知道你们有没有猜对呢,下面就让我一一揭开迷底吧,后来经过了好多次的疑点筛选和测试之后,我们把疑点定位到JSP页面的提交按钮标签属性上,最后修改为这样:&lt;input type="button" name="bnt" value="提交" onclick="checkTeacher()">.哈哈终于成功啦,就在那一刻我们俩异口同声的说了一句---"不会吧!".然后开心的笑了!有时候感觉写程序会很累,因为一天到晚对着电脑,然而还是那么的心甘情愿.当每次看自己写的程序成功跑起来的时候,我想作为每个程序员都会非常享受其中,它能让你顿时信心加百,同时内心也会有一种说不出的满足感,也许这就是程序的魅力所在吧,分享到止告一段落,接着会陆续有来,只要我还在这一行里奋斗,同时也希望能看到你们的感受与我分享.
          <br/>
          <span style="color:red;">
            <a href="http://birch.javaeye.com/blog/237846#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 10:26:05 +0800</pubDate>
        <link>http://birch.javaeye.com/blog/237846</link>
        <guid>http://birch.javaeye.com/blog/237846</guid>
      </item>
      <item>
        <title>Oracle服务OracleDBConsoleorcl启动失败解决方案</title>
        <author>oxidy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oxidy.javaeye.com">oxidy</a>&nbsp;
          链接：<a href="http://oxidy.javaeye.com/blog/237838" style="color:red;">http://oxidy.javaeye.com/blog/237838</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 14px; font-family: Georgia; color: #666666;">OracleDBConsole服务不能启动，访问&ldquo;http://机器名：1158/em&rdquo;不能进入EM界面，系统事件查看器里面记录&ldquo;</span>
<span style="font-size: 14px; font-family: Georgia;"><span style="color: #ff0000;">Agent process exited abnormally during initialization.</span>
</span>
<span style="font-size: 14px; font-family: Georgia; color: #666666;">&rdquo;</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: 14px; font-family: Georgia; color: #666666;">网上解决Oracle服务不能启动最多的做法是修改host文件，即%ORACLE HOME%\db_1\NETWORK\ADMIN\listener.ora文件，修改其中的HOST=***，listener.ora文件中的HOST =***与</span>
<span style="font-size: 14px; font-family: Georgia;"><span style="color: #0000ff;"><span style="font-weight: bold;">系统属性--》计算机名选项卡</span>
</span>
</span>
<span style="font-size: 14px; font-family: Georgia; color: #666666;">中显示的&ldquo;</span>
<span style="font-size: 14px; font-family: Georgia;"><span style="color: #0000ff;">完整的计算机名称：dsideal-db</span>
</span>
<span style="font-size: 14px; font-family: Georgia; color: #666666;">&rdquo;保持一致，即<span style="color: #ff6600;">将***更改为dsideal-db</span>
，重启计算机，再尝试启动OralceDBConsole服务，发现服务能正常启动，故障排除。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: 14px; font-family: Georgia; color: #666666;">listener.ora文件内容如下：</span>
</p>
<p>&nbsp;</p>
<p># listener.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />
# Generated by Oracle configuration tools.<br />
<br />
SID_LIST_LISTENER =<br />
&nbsp; (SID_LIST =<br />
&nbsp;&nbsp;&nbsp; (SID_DESC =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_NAME = PLSExtProc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE_HOME = <span style="color: #0000ff;">C:\oracle\product\10.2.0\db_1</span>
)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PROGRAM = extproc)<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )<br />
<br />
LISTENER =<br />
&nbsp; (DESCRIPTION_LIST =<br />
&nbsp;&nbsp;&nbsp; (DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = <span style="color: #0000ff;">dsideal-db</span>
)(PORT = <span style="color: #0000ff;">1521</span>
))#完整的计算机名称；端口号<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )</p>
          <br/>
          <span style="color:red;">
            <a href="http://oxidy.javaeye.com/blog/237838#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 10:09:35 +0800</pubDate>
        <link>http://oxidy.javaeye.com/blog/237838</link>
        <guid>http://oxidy.javaeye.com/blog/237838</guid>
      </item>
      <item>
        <title>LINQ与DLR的Expression tree（1）：简介LINQ Expression tree</title>
        <author>RednaxelaFX</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rednaxelafx.javaeye.com">RednaxelaFX</a>&nbsp;
          链接：<a href="http://rednaxelafx.javaeye.com/blog/237822" style="color:red;">http://rednaxelafx.javaeye.com/blog/237822</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          （Disclaimer：如果需要转载请先与我联系；文中图片请不要直接链接）<br /><br />以前在这边也发过关于LINQ的帖，不过并没有涉及比较深入的部分。之前的这篇：<a href="http://rednaxelafx.javaeye.com/blog/182762" target="_blank">使用lambda expression来动态获取delegate，然后用Cecil注入代码（1）</a>并不是没有下文了，而是在短短的时间内情况发生了许多变化，使得一些原本的想法有机会以更简单的方式来完成。接下来的一段时间我会发一些与LINQ、DLR等相关的帖，探讨它们与动态代码生成、动态类型代码等的关系，也将会继续讨论通过它们来进行依赖注入的话题。<br /><br />关于这个“树”的叫法……LINQ里的表达式树有官方文档就叫Expression tree，但DLR中相应的语法树却没有什么固定的正式叫法，有时候叫做DLR AST，有时候叫DLR tree。本文（以及接下来的文章）都将使用DLR tree来称呼DLR中的语法树。<br /><br /><strong><span style="font-size: medium">LINQ与Expression tree</span></strong><br /><br />那么，先简单的说明LINQ与Expression tree的关系。LINQ（Language-INtegrated Query）是.NET Framework 3.5新引入的技术，使得对数据集合的操作能够以统一的API实现。其中，.NET Framework自带的LINQ实现有LINQ-to-Objects、LINQ-to-DataSet、LINQ-to-SQL、LINQ-to-XML等实现。它依赖于.NET Framework 3.5引入的另外几项技术，包括扩展方法（extension method）、lambda表达式（lambda expression）、匿名类型（anonymous type）、自动实现的属性（auto-implemented property）、局部变量类型推导（local variable type inference）等。表达式树（Expression tree）则是LINQ本身的重要组成部分之一。<br /><br />引用<a href="http://msdn.microsoft.com/zh-cn/library/bb882636.aspx" target="_blank">中文MSDN上的文档</a>：<br /><div class="quote_title">引用</div><div class="quote_div">语言集成查询 (LINQ)<br /><strong><span style="font-size: medium">LINQ 中的表达式目录树</span></strong><br />在 LINQ 中，表达式目录树用于表示针对数据源的结构化查询，这些数据源实现 <a href="http://msdn.microsoft.com/zh-cn/library/bb351562.aspx" target="_blank">IQueryable&lt;T></a>。例如，LINQ to SQL 提供程序实现 <a href="http://msdn.microsoft.com/zh-cn/library/bb351562.aspx" target="_blank">IQueryable&lt;T></a> 接口，用于查询关系数据存储。C# 和 Visual Basic 编译器会将针对此类数据源的查询编译为代码，该代码在运行时将生成一个表达式目录树。然后，查询提供程序可以遍历表达式目录树数据结构，并将其转换为适合于数据源的查询语言。<br /><br />表达式目录树还可以用在 LINQ 中，用于表示分配给类型为 <a href="http://msdn.microsoft.com/zh-cn/library/bb335710.aspx" target="_blank">Expression&lt;TDelegate></a> 的变量的 Lambda 表达式。<br /><br />表达式目录树还可用于创建动态 LINQ 查询。有关更多信息，请参见<a href="http://msdn.microsoft.com/zh-cn/library/bb882637.aspx" target="_blank">如何：使用表达式目录树来生成动态查询</a>。如果要生成 LINQ 提供程序，您也可以使用表达式目录树。有关更多信息，请参见<a href="http://msdn.microsoft.com/zh-cn/library/bb546158.aspx" target="_blank">演练：创建 IQueryable LINQ 提供程序</a>。</div><br />（啊哈，原来微软官方的文档是把Expression tree翻译为“表达式目录树”的啊，以前还一直不知道呢。总之我还是继续用英文标识避免歧义。）<br /><br /><strong><span style="font-size: medium">Expression tree、委托与lambda表达式</span></strong><br /><br /><strong>委托（delegate）与lambda表达式</strong><br /><br />了解过C# 3.0的新特性的话应该知道，在C# 3.0中新引入了一个语法结构，称为lambda expression（lambda表达式/匿名函数）。对此尚不了解的也可以到MSDN上看看，<a href="http://msdn.microsoft.com/zh-cn/library/bb397687.aspx" target="_blank">Lambda表达式</a>。Lambda表达式既可以赋值给一个委托（delegate）类型，例如Action、Func等系列的内建委托类型；也可以赋值给Expression&lt;TDelegate>类型，例如以下lambda表达式：<br /><pre name="code" class="c#">x => -x</pre><br />当它被直接赋值给Func&lt;int, int>类型的变量时，C#编译器会将它的内容编译为一个静态方法，并创建一个对应类型的引用赋值给变量。也就是说，对于<br /><pre name="code" class="c#">static class Program {
    static void Main( string[ ] args ) {
        Func&lt;int, int> negateFunc = x => -x;
    }
}</pre><br />C#编译器会编译为类似下面的代码：<br /><pre name="code" class="c#">internal static class Program
    [CompilerGenerated]
    private static int &lt;Main>b__0( int x ) {
        return -x;
    }

    private static void Main( string[ ] args ) {
        Func&lt;int, int> negateFunc = new Func&lt;int, int>( &lt;Main>b__0 );
    }
}</pre><br />（实际上还涉及到缓存那个委托，这里省略掉了。<span style="color: darkred">另外，之所以会编译为一个静态方法是因为这个lambda表达式没有使用任何“自由变量”，也就是既不是参数或局部变量也不是类的成员的变量。在现有的C#编译器实现中，如果一个匿名函数使用了“this”，那么对应生成的方法会是成员方法；如果使用了其它自由变量的话则会生成一个私有内部类来存放匿名函数所使用到的自由变量，并在这个内部类里生成匿名函数对应的方法。</span>这里作为例子选择了最简单的情况来介绍。）<br /><br />如此将一个lambda表达式编译为一个实际的函数后，其中的MSIL字节码可以为CLR所理解并执行。这样就足够实现in-memory query了，例如LINQ-to-Objects、LINQ-to-DataSet等。但其它平台无法理解MSIL，要对函数进行分析然后执行就会十分困难。例如说，如果想让一个lambda表达式在SQL Server上执行，该如何让SQL Server也理解它呢？<br /><br /><strong>Expression tree与lambda表达式</strong><br /><br />MSIL之所以不便于分析是因为它将原本是树状结构的程序代码转换为了线性结构，损失了一些信息，主要是损失了程序代码的“结构性”，更接近于底层而降低了抽象程度。<br />我们知道，程序源代码对应着具体语法树（concrete syntax tree），每个叶节点对应着代码里的一个词素，其上则是各种语法结构，如表达式、语句、声明、定义等。抽象语法树（abstract syntax tree，AST）则在具体语法树的基础上将一些诸如关键字、括号等冗余信息去掉，让树更加整洁，便于分析而不损失任何有用的信息。<br /><br />前面那个简单的lambda表达式，其对应的具体语法树如下图：<br /><img src="http://rednaxelafx.javaeye.com/upload/picture/pic/21377/33aca5bd-bab4-3758-b1ac-eeff7a3937ea.png" /><br />（<span style="color: indigo">Expression到Unary Expression中间的虚线表示中间省略了许多层。从Expression到最后的id，中间包括expression -> non-assignment-expression -> conditional-expression -> null-coalescing-expression -> conditional-or-expression -> conditional-and-expression -> inclusive-or-expression -> exclusive-or-expression -> and-expression -> equality-expression -> relational-expression -> additive-expression -> multiplicative-expression -> unary-expression -> <strong>-</strong> unary-expression -> primary-expression -> primary-no-array-creation-expression -> simple-name -> identifier。要是画到图上太乱了……</span>）<br />由于具体语法树忠实的对应着原本的语法定义中的各种语法结构，这棵具体语法树中不但含有用于标识lambda表达式的箭头（“=>”），用于标识取反的一元表达式的负号（“-”），还有一堆中间为了表示表达式优先级而设置的层次（也就是省略掉的部分）。这样的语法树上有着太多的冗余信息，原本很简单的代码却变成了复杂的语法树，反而不便于分析和使用了。<br /><br />既然知道这个表达式一定是一个lambda表达式，那个箭头就可以去掉；得知方法体是一个取反的一元表达式之后，负号也可以去掉；用于表示中间层次的表达式层次也全部可以去掉。将冗余信息抽取掉之后，可以得到一个等价的抽象语法树（AST）：<br /><img src="http://rednaxelafx.javaeye.com/upload/picture/pic/21379/7cafcdc4-6b38-3810-992c-42897c56cae6.png" /><br /><br />很好，这样简单多了，而且实际有用的语法结构都保留了下来。这个AST实际上就与LINQ Expression tree的结构对应上了：<br /><pre name="code" class="java">LambdaExpression
    UnaryExpression (body; negation)
        ParameterExpression ("x")
    ParameterExpression (parameter; "x")</pre><br /><br />换言之，回到代码上，如果像下面这段代码把lambda表达式“x => -x”赋值给一个Expression&lt;Func&lt;int,int>>类型的变量：<br /><pre name="code" class="c#">using System;
using System.Linq.Expressions;

static class Program {
    static void Main( string[ ] args ) {
        Expression&lt;Func&lt;int, int>> negateExpr = x => -x;

        Func&lt;int, int> negateFunc = negateExpr.Compile( );

        Console.WriteLine( negateFunc( 1 ) );
    }
}</pre><br />编译器会检测到赋值目标是Expression&lt;TDelegate>，于是并不直接生成其对应的静态方法的MSIL，而是生成创建Expression tree的代码。在C#编译器的帮助下，上面的代码完全等价于以下版本：<br /><pre name="code" class="c#">using System;
using System.Linq.Expressions;

static class Program {
    static void Main( string[ ] args ) {
        ParameterExpression param = Expression.Parameter(typeof(int), "x");
        Expression&lt;Func&lt;int, int>> negateExpr =
            Expression.Lambda&lt;Func&lt;int, int>>(
                Expression.Negate( param ),
                new ParameterExpression[ ] { param } );

        Func&lt;int, int> negateFunc = negateExpr.Compile( );

        Console.WriteLine( negateFunc( 1 ) );
    }
}</pre><br />留意到第二个版本中是如何手工创建Expression tree的，只有这一步不同而已；将expression tree编译为委托类型，然后调用委托的部分是完全一样的。<br /><br />LINQ的Expression&lt;TDelegate>与其对应的TDelegate委托类型之间的关系是：<br />1、同一个lambda表达式既可以赋值给Expression&lt;TDelegate>类型的变量也可以赋值给TDelegate类型的委托变量；<br />2、一个Expression&lt;TDelegate>可以通过调用其Compile&lt;TDelegate>()转换为一个TDelegate类型的委托（反之则不行）。<br /><br /><strong><span style="font-size: medium">创建Expression tree的节点</span></strong><br /><br />简单介绍过LINQ中的Expression tree的概念后，让我们来讨论一下这棵树里面的节点该如何创建。LINQ Expression tree中的节点一般是通过System.Linq.Expression.Expression这个类上的工厂方法来创建的。包括以下的一些方法：<br />（方法名：返回值）<br /><pre name="code" class="java">Add                : BinaryExpression
AddChecked         : BinaryExpression
And                : BinaryExpression
AndAlso            : BinaryExpression
ArrayIndex         : BinaryExpression
ArrayLength        : UnaryExpression
Call               : MethodCallExpression
Coalesce           : BinaryExpression
Condition          : ConditionalExpression
Constant           : ConstantExpression
Convert            : UnaryExpression
ConvertChecked     : UnaryExpression
Divide             : BinaryExpression
Equal              : BinaryExpression
ExclusiveOr        : BinaryExpression
Field              : MemberExpression
GreaterThan        : BinaryExpression
GreaterThanOrEqual : BinaryExpression
Invoke             : InvocationExpression
Lambda             : Expression&lt;TDelegate>
LeftShift          : BinaryExpression
LessThan           : BinaryExpression
LessThanOrEqual    : BinaryExpression
ListInit           : ListInitExpression
MakeBinary         : BinaryExpression
MakeMemberAccess   : MemberExpression
MakeUnary          : UnaryExpression
MemberInit         : MemberInitExpression
Modulo             : BinaryExpression
Multiply           : BinaryExpression
MultiplyChecked    : BinaryExpression
Negate             : UnaryExpression
NegateChecked      : UnaryExpression
New                : NewExpression
NewArrayBounds     : NewArrayExpression
NewArrayInit       : NewArrayExpression
Not                : UnaryExpression
NotEqual           : BinaryExpression
Or                 : BinaryExpression
OrElse             : BinaryExpression
Parameter          : ParameterExpression
Power              : BinaryExpression
Property           : MemberExpression
PropertyOrField    : MemberExpression
Quote              : UnaryExpression
RightShift         : BinaryExpression
Subtract           : BinaryExpression
SubtractChecked    : BinaryExpression
TypeAs             : UnaryExpression
TypeIs             : TypeBinaryExpression
UnaryPlus          : UnaryExpression</pre><br />上述列表中每个名字其实对应着一组重载，参数不同，但返回值的类型是一样的。<br />这些工厂方法对应的类的层次结构是：<br /><pre name="code" class="java">System.Object
  System.Linq.Expressions.Expression
    System.Linq.Expressions.BinaryExpression
    System.Linq.Expressions.ConditionalExpression
    System.Linq.Expressions.ConstantExpression
    System.Linq.Expressions.InvocationExpression
    System.Linq.Expressions.LambdaExpression
      System.Linq.Expressions.Expression&lt;TDelegate>
    System.Linq.Expressions.MemberExpression
    System.Linq.Expressions.MethodCallExpression
    System.Linq.Expressions.NewExpression
    System.Linq.Expressions.NewArrayExpression
    System.Linq.Expressions.MemberInitExpression
    System.Linq.Expressions.ListInitExpression
    System.Linq.Expressions.ParameterExpression
    System.Linq.Expressions.TypeBinaryExpression
    System.Linq.Expressions.UnaryExpression</pre><br />观察可得知，LINQ Expression tree中的类只能用于表现表达式，而无法表现“更大”的语法结构，例如赋值表达式、一般语句等。这是LINQ v1的一个重要限制，也是为什么C# 3.0的规范里明确提到一个能赋值给Expressin&lt;TDelegate>类型的lambda表达式的方法体只能是一个表达式，而不能是一个代码块——代码块无法通过LINQ v1里的Expression tree表示。同时也值得注意的是，LINQ Expression tree本质上是一棵静态类型的树——所有节点所表示的类型都能够在编译时确定。这一点在后面提到DLR时会再展开讨论。<br /><br /><br />一棵Expession tree在创建后就不可再改变。假如某个程序接收一棵Expression tree为参数，然后仅仅是用于生成别的形式的代码（例如SQL语句），那么这个不可改变性不会有什么影响。但如果一个程序想对一棵Expression tree进行修改该怎么办呢？解决方法是从来源的Expression tree复制出一棵新的树，在复制过程中根据自己的需要选择是直接复制原有节点还是创建修改了的节点。MSDN上有一个例子解释了如何实现这种需求，<a href="http://msdn.microsoft.com/zh-cn/library/bb546136.aspx" target="_blank">如何：修改表达式目录树</a>。<br /><br />更详细的LINQ Expression tree的讨论留待以后再说。下一篇将简单介绍DLR的状况，以及它与LINQ Expression tree的关系。<br /><br />===========================================================================<br /><br />文中的两幅树状图是用<a href="http://www.graphviz.org/" target="_blank">Graphviz</a>的dot来绘制的，代码如下：<br />cst.dot:<br /><pre name="code" class="java">digraph ExpressionTree {

node [fontsize=12, fontcolor=blue, font=Courier, shape=box]

 // node declarations
 lambda [label="Lambda Expression"]
 
 anoFuncSig [label="Anonymous Function\nSignature"]
 arrow [label="=>"]
 anoFuncBody [label="Anonymous Function\nBody"]
 
 impFuncSig [label="Implicit Anonymous\nFunction Signature"]
 expr [label="Expression"]
 
 impParam [label="Implicit Anonymous\nFunction Parameter"]
 uexpr1 [label="Unary Expression"]
 
 neg [label="-"]
 uexpr2 [label="Unary Expression"]
 
 id [label="Identifier:\nx"]
 
 simpName [label="Simple Name:\nx"]
 
 // relations

 lambda -> anoFuncSig
 lambda -> arrow
 lambda -> anoFuncBody
 
 {rank=same; anoFuncSig arrow anoFuncBody }
 
 anoFuncSig -> impFuncSig
 anoFuncBody -> expr
 
 {rank=same; impFuncSig expr }
 
 impFuncSig -> impParam
 expr -> uexpr1 [style=dashed]

 {rank=same; impParam uexpr1 }

 impParam -> id
 uexpr1 -> neg
 uexpr1 -> uexpr2
 
 {rank=same; id neg uexpr2 }
 
 uexpr2 -> simpName
}</pre><br />ast.dot:<br /><pre name="code" class="java">digraph ExpressionTree {

node [fontsize=12, fontcolor=blue, font=Courier, shape=box]
edge [fontsize=10, fontcolor=purple]
 // node declarations
 lambda [label="Lambda Expression"]
 
 param [label="Parameter:\nx"]
 body [label="Unary Expression\n(Negation)"]
 
 param2 [label="Simple Name:\nx"]
 
 // relations

 lambda -> param [label="Signature"]
 lambda -> body [label="Body"]
 
 {rank=same; param body }
 
 body -> param2
 param -> param2 [label="(same node)", fontsize=8, style=dashed, dir=both]
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://rednaxelafx.javaeye.com/blog/237822#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 05:17:21 +0800</pubDate>
        <link>http://rednaxelafx.javaeye.com/blog/237822</link>
        <guid>http://rednaxelafx.javaeye.com/blog/237822</guid>
      </item>
      <item>
        <title>java package的设计原则</title>
        <author>dennis_zane</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dennis-zane.javaeye.com">dennis_zane</a>&nbsp;
          链接：<a href="http://dennis-zane.javaeye.com/blog/237809" style="color:red;">http://dennis-zane.javaeye.com/blog/237809</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 典型的J2EE项目，package的设计有成熟的套路可循，如分为domain、dao、service、action等等，职责已经分解的比较单一和
清晰，循环依赖这样的情况出现并不多。而在一般的java项目，如服务器程序、客户端程序和通用性框架的开发中，包的设计并没有套路可循，毕竟由于应用和
业务种类的不同，想得出通用性的设计套路是不大可能的。这时候遵循一些原则比之生搬硬套更为重要。在《敏捷软件开发》一书中对包的设计有深入的讨论，虽然
针对的是发布的二进制包而言，但是对于java
package的设计同样有借鉴意义，如对包的内聚性、可重用性、稳定性的强调，对于依赖的探讨，这些都是比较笼统的概念，不是那么直观，需要在实际运用
中认真归纳和重构，向这些原则靠拢。<br />
&nbsp;&nbsp;
我所想到一个比较直观的方法就是：对于一个包的描述，你是否能用一句简明扼要的话概括，也就是包的功能或者说介绍能否做到简明扼要，这是衡量一个包的设计
是否合理的最简单的方法。如果可以，显然这个包的内聚性很好，所有的类都服务于一个目的，从而带来了重用的可能(其实我对重用性并不感冒，除了工具类之外真正能重用的东西少之又少，内聚性才是需要关注的）；反之，这个包可能承担了太多的职责或者依
赖过多，仔细的重构和分离是需要做的。包的设计同样要遵循接口分离的原则，将接口与实现隔离在不同的包之中，客户程序就不会知道具体的实现，并且也保证了
实现对接口的单向依赖。当然，这时就需要引入工厂类、插件或者IOC容器来负责实例化实现类。</p>
          <br/>
          <span style="color:red;">
            <a href="http://dennis-zane.javaeye.com/blog/237809#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 00:15:55 +0800</pubDate>
        <link>http://dennis-zane.javaeye.com/blog/237809</link>
        <guid>http://dennis-zane.javaeye.com/blog/237809</guid>
      </item>
      <item>
        <title>内网呆了一周，一些奇怪的问题记录下。。</title>
        <author>lin_style</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lin-style.javaeye.com">lin_style</a>&nbsp;
          链接：<a href="http://lin-style.javaeye.com/blog/237788" style="color:red;">http://lin-style.javaeye.com/blog/237788</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内网呆了一周，一些奇怪的问题记录下。。<br /><br />这个是很久以前的<br />协议是SNMP，用户经常报告说程序把把机器端口搞关闭了。<br />抓下包，发现有时候因为时延没设置好，一下发了两个请求包。在这间隔，一个session已经关闭，返回对方一条<br />ICMP不可达端口错误。 今天偶尔看资料才知道，一些XTI接口对这条信息有反映，<br />导致端口暂时的不可用<br /><br />用原始套接字开发SYN扫描，在recvfrom时我没用select检测。因为这个时候是对<br />所有的数据包进行抓取，也不会延时多久。只是简单加了个信号eagin判断。奇怪<br />的问题出现了，代码如下<br />for(;;)<br />{<br />   recvfrom<br />   <br />   //在这个过程中，如果没有cout这个输出函数，程序挂住<br />   //需要手工输入一个字符才能结束。。百思不解<br />   //最后加了个select才解决。但是原因还是没搞明白<br />   //或者该把描述符值打出来看看，是不是变成1了。<br /><br />}<br /><br /><br />还是SNMP协议<br />测试一个IP，返回一条错误的消息(bad value, nosuchname等)，接收的套接字过select，但是<br />在recvfrom时挂死。如果是正确的包则正确接收<br />抓包发现有返回该错误的数据包。接收的low值正常值最后判定数据根本没到达计算机端口。因为抓包只是在链路层工作。<br /><br /><br />将套接字设成非阻塞，之前一直用select。果然可行<br />只好把原因定在返回一个SNMP错误包时，被交换或者防火墙的策略劫持掉了<br />因为电信的这些规则非常严格，虽然没什么指向性。但是包确实没有到达
          <br/>
          <span style="color:red;">
            <a href="http://lin-style.javaeye.com/blog/237788#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 22:17:41 +0800</pubDate>
        <link>http://lin-style.javaeye.com/blog/237788</link>
        <guid>http://lin-style.javaeye.com/blog/237788</guid>
      </item>
      <item>
        <title>csdn英雄会上海站素描</title>
        <author>medic</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://medic.javaeye.com">medic</a>&nbsp;
          链接：<a href="http://medic.javaeye.com/blog/237787" style="color:red;">http://medic.javaeye.com/blog/237787</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上海的交通不咋地，到底会场讲座已经开始，Ivar 博士正在讲软件开发的话题，并不是日程表上所谓的新趋势，其实是纠正年轻开发人员和团队一些常见的误区。<br /><br />庞升东上来讲互联网创业，真的毫无内容，谈的也不是创业，而是资本家开工厂的故事，几个合伙人很有钱，买了一个小网站，买了一个域名，然后用高薪挖人，进行大生产。<br /><br />芮祥麟头衔蛮吓人，讲座都是废话，不表了。<br /><br />google的张智威只是来买一下他们的opensocial，鼓吹所有的网站都把数据交给google，让他们来分析用户行为，我靠，想的倒是挺美的<br /><br />电梯演讲时间最无厘头，演讲者以为是给一个机会展示自己，来吸引vc的眼光。结果糟糕的表述、急切的心态和没有太多创意的项目，成了凑数的环节。<br /><br /><br />网络英雄论坛，找了几个网上的牛人到现场。早说了网上大牛千万不要到前台来做访谈，那个沉默和无聊不用说，台上的人还自得其乐，阿朱还对自己的网名津津乐道，谁关心啊？有点自恋了。回到网上，该干嘛干嘛，做你的网络英雄，不要抛头露面，是为忠告。<br /><br />CTO论坛稍微有点意思，有些话细细品味还是很有借鉴意义。<br /><br />创业论坛也是垃圾时间，刘主持文章写的好，话还是不会说，几个创业者也是一通乱说，唯一要顶一下的是批周鸿祎的人（忘了是谁了），大意是周鸿祎没钱的时候，和他睡一个床上，有了钱，说要见一面，周只给他1分钟<br />××××××××××××××××××××××××××××××××××<br /><br />花絮：<br /><br />csdn号称中03年开始就办这个会，而且也出动了不少人，但是明显还是有点混乱，到中午了，一堆人强餐券。<br /><br />赞助商的展位也太简陋了吧，要是我，另开不要那些展位。<br /><br />在如此无聊的会议上，叽歪的短信和网络互动平台倒变得唯一的亮点了，可能是现场的人都认为无聊的时间灌水是最好的选择吧。<br /><br />总结：<br /><br />来了很多技术牛人，没讲任何技术话题<br />技术创业的人被忽悠的没有方向了<br />午餐还凑合就是没水喝
          <br/>
          <span style="color:red;">
            <a href="http://medic.javaeye.com/blog/237787#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 22:15:29 +0800</pubDate>
        <link>http://medic.javaeye.com/blog/237787</link>
        <guid>http://medic.javaeye.com/blog/237787</guid>
      </item>
      <item>
        <title>路径问题的总结</title>
        <author>夜行者</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shaolong.javaeye.com">夜行者</a>&nbsp;
          链接：<a href="http://shaolong.javaeye.com/blog/237786" style="color:red;">http://shaolong.javaeye.com/blog/237786</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一.路径分为:绝对路径和相对路径两种,在出现目录叫多,并且层次嵌套的较深的时候,确实是一个比较让人烦恼的问题.希望对看到这篇文章的朋友有说帮助和启发.不足之处需要多多给出你的宝贵意见<br /><br />绝对路径<br />---如:http://XXXXXXX<br />相对路径<br />---相对于Web服务器路径<br />---相对于Web应用程序路径<br />---相对于当前路径<br /><br />         WebApp --------------------------相对与服务器路径<br />          --myweb  ----------------------web应用服务器路径<br />            --servlet1<br />            --myjsp.jsp<br /><br />二.<br /><span style="color: olive">form表单<br />/：相对于Web服务器路径<br />无/:相对于当前路径<br />response.sendRedirect:<br />/：相对于Web服务器路径<br />无/:相对于当前路径<br />注：路径为重定向后和路径<br />Servlet配置文件<br />/：相对于Web应用程序路径<br />request.getRequestDispatcher<br />/：相对于Web应用程序路径<br />无/：相对于当前路径<br />注：跳转后路径为跳转前的路径，即路径未发生变化<br />getServletContext().getRequestDispatcher<br />/:相对于Web应用程序路径<br />注：必须以/开头<br />注：跳转后路径为跳转前的路径，即路径未发生变化</span><br /><br />三.理解web.xml和html中/的含义<br />    i.如果是web.xml中的“/”，将定位到http://localhost:8080/oa/位置  注释: oa 为项目名称<br />    ii.如果是html中的“/”，将定位到http://localhost:8080/
          <br/>
          <span style="color:red;">
            <a href="http://shaolong.javaeye.com/blog/237786#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 22:05:31 +0800</pubDate>
        <link>http://shaolong.javaeye.com/blog/237786</link>
        <guid>http://shaolong.javaeye.com/blog/237786</guid>
      </item>
      <item>
        <title>google chrome，抄袭之王</title>
        <author>feng19</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://feng19.javaeye.com">feng19</a>&nbsp;
          链接：<a href="http://feng19.javaeye.com/blog/237772" style="color:red;">http://feng19.javaeye.com/blog/237772</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">　　google chrome出世，亿人欢呼，惊叹赞美之词不绝于网。为了传承发扬阴阳和谐的传统，这里就不得不揭揭chrome的老底啦。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　先看chrome这个名字，用过firefox扩展的人都知道是ff里的一个协议名。看到这个名字，就让我觉得chrome用的是ff的技术。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　再看他的logo，有腾讯QQ的意思哟，这是最早提出的抄袭嫌疑。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　用用chrome的地址栏，这个Omnibox实际就是Awesome Bar的翻版，用过firefox3，不会对这个Omnibox感到稀奇。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　最委屈的是ie了，对别人那是抄袭，对ie就可说是抢劫了。你转到chrome的&ldquo;高级选项&rdquo;，点击&ldquo;更改代理设置&rdquo;，弹出来的是ie浏览器的&ldquo;Internet属性&rdquo;的对话框。这才知道google chrome的拿来能力之强。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　渲染引擎是webkit，开源的，拿得理直气壮。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　再来看看google chrome还剩下些什么？界面设计，赞一下，很不错的。v8引擎也很牛。gears也很强。再也没什么说的了。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　可见，软件开发、搞创新重要的是敢于拿来，善于拿来 。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-size: small;">　　有报道说，这google chrome是十年磨一剑，我是不信的，擦鞋的永远不会少。我看到的是：google chrome东拼西凑，摩登上场。</span>
</p>
<p>&nbsp;</p>
<p>
<span style="font-size: small;">　　注：本文纯属游戏兼炒作，google fans不要太认真了，正经点的见<a href="http://blog.getooo.cn/google_chrome_fire_who.html">chrome 冲着谁。</a>
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://feng19.javaeye.com/blog/237772#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 21:06:44 +0800</pubDate>
        <link>http://feng19.javaeye.com/blog/237772</link>
        <guid>http://feng19.javaeye.com/blog/237772</guid>
      </item>
      <item>
        <title>JSF验证信息中文化</title>
        <author>chinahgf</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chinahgf.javaeye.com">chinahgf</a>&nbsp;
          链接：<a href="http://chinahgf.javaeye.com/blog/237768" style="color:red;">http://chinahgf.javaeye.com/blog/237768</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JSF1.0、1.1jar包当中，组件验证信息、出错信息没有中文化处理，可以按如下进行，添加支持中文化。<br /><br />1：先把jsf-impl.jar包javax\faces下面的Messages.properties文件拖放一个出来到桌面上。 <br /><br />2：将拖放出来的Messages.properties文件改名为:Messages_zh_CN.properties文件。 <br /><br />3：接下来对Messages_zh_CN.properties文件需要中文化的信息进行处理，然后native2ascii即可。<br /><br />4：将Messages_zh_CN.properties文件拖入到jsf-impl.jar包javax\faces下面。<br /><br />5：将刚才处理过的jsf-impl.jar替换原有的jsf-impl.jar包即可完成JSF验证信息中文化问题。<br /> 这篇文章是我在网上看到的，我以前测试过了，可以使用。
          <br/>
          <span style="color:red;">
            <a href="http://chinahgf.javaeye.com/blog/237768#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 20:43:10 +0800</pubDate>
        <link>http://chinahgf.javaeye.com/blog/237768</link>
        <guid>http://chinahgf.javaeye.com/blog/237768</guid>
      </item>
      <item>
        <title>线程随笔-测试sleep</title>
        <author>浴盆儿</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cobain-peng-163-com.javaeye.com">浴盆儿</a>&nbsp;
          链接：<a href="http://cobain-peng-163-com.javaeye.com/blog/237766" style="color:red;">http://cobain-peng-163-com.javaeye.com/blog/237766</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">package test.Thread;

import java.util.Date;

public class testSleep {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread1 t1 = new Thread1();
		t1.start();
		for (int i = 1; i &lt; 5; i++) {
			System.out.println("main thread times :" + i);
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
				System.out.println("main thread is interrupted");
			}
		}
		t1.interrupt();
	}
}

class Thread1 extends Thread {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			System.out.println("this is Thread1  " + new Date());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
				System.out.println("Thread1 is Interrupted");
				return;
			}
		}
	}

}</pre>
<p><span style="color: #ff6600;">&nbsp;The result:</span></p>
<p>&nbsp;</p>
<p>main thread times :1<br />this is Thread1&nbsp; Fri Sep 05 20:38:25 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:27 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:28 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:29 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:30 CST 2008<br />main thread times :2<br />this is Thread1&nbsp; Fri Sep 05 20:38:31 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:32 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:33 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:34 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:35 CST 2008<br />main thread times :3<br />this is Thread1&nbsp; Fri Sep 05 20:38:36 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:37 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:38 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:39 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:40 CST 2008<br />main thread times :4<br />this is Thread1&nbsp; Fri Sep 05 20:38:41 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:42 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:43 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:44 CST 2008<br />this is Thread1&nbsp; Fri Sep 05 20:38:45 CST 2008<br />Thread1 is Interrupted</p>
          <br/>
          <span style="color:red;">
            <a href="http://cobain-peng-163-com.javaeye.com/blog/237766#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 20:42:42 +0800</pubDate>
        <link>http://cobain-peng-163-com.javaeye.com/blog/237766</link>
        <guid>http://cobain-peng-163-com.javaeye.com/blog/237766</guid>
      </item>
      <item>
        <title>Eclipse3.4 加速</title>
        <author>lggege</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lggege.javaeye.com">lggege</a>&nbsp;
          链接：<a href="http://lggege.javaeye.com/blog/237754" style="color:red;">http://lggege.javaeye.com/blog/237754</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我用的环境是: eclipse-jee-ganymede-win32.zip.<br />这几天一直在捣腾环境, 被它害死了, 动不动整个Eclipse就白掉, 什么也用不了, 得了点心得. 贴下.<br /><br /><strong>1. 加大Eclipse运行可用最大内存数</strong><br />具体操作: 修改位于eclipse目录下的eclipse.ini, 将-Xmx512m调高, 我的改成了-Xmx768m<br />效果: 不祥.<br /><br /><strong>2. 减少Eclipse启动后自动启动的插件</strong><br />具体操作: 在Preferences -> General -> StartUp and Shutdown:<br />   将Plug-ins activated on startup的项目不要的去掉, 很多Mylyn等我就没用到,去掉了.<br /><br />效果: 启动Eclipse后,会有Initialing Java Tools的滚动条,会发现快了很多.<br /><br /><strong>3. 减少编译需要验证的项目,提升编译速度</strong><br />具体操作: 在Preferences -> Validataion <br />   将无关的Validator去掉, 比如: 我就将和我无关的JPA, JSP, WS 都去掉了.<br /><br />效果: 编译项目时,Eclipse跑的Validator项目少了, 确实快了.<br /><br /><strong>4. 关掉自动编译</strong><br />具体操作: Project -> Build Automatically<br />效果: 在代码修改保存后,不会启动自动编译.<br /><br /><strong>5. 在Clean的时候,要注意选项</strong><br />具体操作: Project -> Clean<br />    注意: 在最下面有: Build the entire workspace<br />                    和 Build Only the selected Projects<br />         要根据自己情况勾选, 因为是默认选择编译整个工作区.<br /><br /><strong>6. 轻手轻脚</strong><br />慢慢操作, 莫急, 机器卡住了耐心等就好.<br />在Eclipse工作正欢的时候,请不要去惊扰它,非要去操作界面的话,先用鼠标在你要点击的控件上试试,看看控件是否活着,否则不要去打扰它. 等吧.<br /><br />目前也就这么点心得, 被Eclipse卡到闷死, 发现 <strong>轻手轻脚</strong> 才是王道...
          <br/>
          <span style="color:red;">
            <a href="http://lggege.javaeye.com/blog/237754#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 18:55:26 +0800</pubDate>
        <link>http://lggege.javaeye.com/blog/237754</link>
        <guid>http://lggege.javaeye.com/blog/237754</guid>
      </item>
      <item>
        <title>JDBC批处理使用起来要小心</title>
        <author>xly_971223</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xuliangyong.javaeye.com">xly_971223</a>&nbsp;
          链接：<a href="http://xuliangyong.javaeye.com/blog/237728" style="color:red;">http://xuliangyong.javaeye.com/blog/237728</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看下面的方法<br /><pre name="code" class="java">Connection conn = getConnection();
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
			Random r = new Random();
			for(int i = 0; i &lt; 1000; i++){
				ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
				ps.setString(2, String.valueOf(r.nextInt()));
				ps.executeUpdate();
				<span style="color: red">conn.commit(); //每次都提交</span>
			}
			
		} catch (SQLException e) {
			conn.rollback();
			throw e;
		}finally{
			ps.close();
			conn.close();
		}</pre><br />循环每次都开启一个事务 插入一千条数据 耗时 29078 ms<br /><pre name="code" class="java">Connection conn = getConnection();
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
			Random r = new Random();
			for(int i = 0; i &lt; 1000; i++){
				ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
				ps.setString(2, String.valueOf(r.nextInt()));
				ps.executeUpdate();
				
			}
			conn.commit(); //只提交一次
		} catch (SQLException e) {
			conn.rollback();
			throw e;
		}finally{
			ps.close();
			conn.close();
		}</pre><br />只开启一次事务  耗时 703 ms<br />但这不是推荐用法，jdbc有一个批处理方法 专门处理这种批量操作的 ps.addBatch();<br /><br /><pre name="code" class="java">Connection conn = getConnection();
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
			Random r = new Random();
			for(int i = 0; i &lt; 1000; i++){
				ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
				ps.setString(2, String.valueOf(r.nextInt()));
				ps.addBatch();//加入批处理
				//ps.executeUpdate();不能与addBatch（）同时用
				
			}
			int[] results = ps.executeBatch();//执行批处理
			conn.commit();
		} catch (SQLException e) {
			conn.rollback();
			throw e;
		}finally{
			ps.close();
			conn.close();
		}</pre><br /><br />批处理方式 耗时 781 ms<br /><br />跟只开启一次事务效率差不多<br /><br />这里要着重指出addBatch()和executeUpdate()不要同时用否则会导致记录插入两次<br />本来1000条记录 会插入2000条，本人在开始就翻了这个错误<br /><br />第一种方法与第二 三种方法性能差别达 40倍 看来事务真是性能杀手啊 能少开尽量少开啦
          <br/>
          <span style="color:red;">
            <a href="http://xuliangyong.javaeye.com/blog/237728#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 17:36:15 +0800</pubDate>
        <link>http://xuliangyong.javaeye.com/blog/237728</link>
        <guid>http://xuliangyong.javaeye.com/blog/237728</guid>
      </item>
      <item>
        <title>阅读技巧</title>
        <author>samuelray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://samuelray.javaeye.com">samuelray</a>&nbsp;
          链接：<a href="http://samuelray.javaeye.com/blog/237718" style="color:red;">http://samuelray.javaeye.com/blog/237718</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体;">读书这么多年</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">近年才开始慢慢体会到阅读技巧的重要性</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">也许人越是到老越珍惜时间</span><span lang="EN-US"><span style="font-family: Courier New;">?!</span></span><span style="font-family: 宋体;">我还没那么老吧</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">时间对每个人都是公平的</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">不公平的是每个人对待时间的态度</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">拥有一些阅读技巧也许会改变你对时间的态度</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">选择性阅读</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">首先当然是要选择正确的书籍</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">通常一些好书中总会提到其他的一些好书</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">而且是呈倍数关系</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">这是一种简单的办法</span><span lang="EN-US"><span style="font-family: Courier New;">.Amazon</span></span><span style="font-family: 宋体;">是另一种选择</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">优秀的书籍总是不乏赞美的</span><span lang="EN-US"><span style="font-family: Courier New;">Review,</span></span><span style="font-family: 宋体;">尤其那些重量级人物的点评</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">其次是选择正确的章节阅读</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">一本好书</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">也许会有不适合阅读的章节</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">果断地舍弃</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">再经典的书籍也不一定全全部内容都值得读的</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">可能其中讲的部分内容你已经非常熟悉</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">或者其它的好书已经就此内容展开更深入的探讨</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">反之亦然</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">一本烂书也许有你需要的东西</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">阅读那部分有价值的章节就行了</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">不过</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">这一点慎重</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">尤其是现在烂书泛滥的年代</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">关注目录</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">目录会告诉你作者写作本书的基本思路和线条</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">包括了广度和深度</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">同时也更容易从更高层面理解作者的意图</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">分类阅读</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">也许你的阅读涉猎范围很广</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">分类阅读就非常重要</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">将阅读范围分成三到五类</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">对每一类有一个简单明确的定义</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">内容所占的比重</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">时间所占的比重</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">适合在什么场合阅读等</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">接下来就是把这些原则应用起来</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">稳定的阅读量</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">每周都保持稳定的阅读量</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">使阅读成为你的终生伴侣</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">现在的社会</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">信息量太大</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">获取的手段太多</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">但是书籍的阅读是无可替代的</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">太多的人浮于事</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">造成整个行业的浮躁</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">书中自有黄金屋</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">书中自有颜如玉</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">适度的笔记</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">经典的</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">或精彩的</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">或有趣的</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">或深刻的语句</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">把它们记录下来</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">然后一有时间就反复回味</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">你会受益无穷</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">难以理解的</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">或者有待商榷的也记下来</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">寻找适当的时间</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">方式</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">与适当的人讨论</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">不要试图记下整本书的标题</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">那没有任何意义</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">有效利用书签</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">书签是个好东西</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">可以让你专注于阅读本身</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">而不是每次放下书的时候都要记住下次阅读正确开始的地方</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">拿起书的时候都要想想上次读到哪里了</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">这实在是件辛苦事</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">书签能很好地解决这个问题</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">同时阅读多本书</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">同时读几本同一主题的书会让你更容易理解任何一本书的内容</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">另一方面</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">如果专业书籍的内容难度太大</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">同时阅读一些相对容易理解的书籍会让你的阅读量和阅读效率保持平衡</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">还有另一层原因</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">在不同的环境里阅读不同的主题可能会最大限度地提高阅读效率</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span><span style="font-family: 宋体;">在床上</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">电脑前</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">沙发上</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">旅行中</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">工作的间隙等等</span><span lang="EN-US"><span style="font-family: Courier New;">,</span></span><span style="font-family: 宋体;">都可以选择合适的主题来阅读</span><span lang="EN-US"><span style="font-family: Courier New;">.</span></span></span></p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">如果你有什么好的阅读技巧</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &quot;Courier New&quot;; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">,</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">不妨与大家一起分享一下</span><span lang="EN-US" style="font-size: 10.5pt; font-family: &quot;Courier New&quot;; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">.</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://samuelray.javaeye.com/blog/237718#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 17:21:21 +0800</pubDate>
        <link>http://samuelray.javaeye.com/blog/237718</link>
        <guid>http://samuelray.javaeye.com/blog/237718</guid>
      </item>
      <item>
        <title>ex.组合树型纬度</title>
        <author>wulonely</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wulonely.javaeye.com">wulonely</a>&nbsp;
          链接：<a href="http://wulonely.javaeye.com/blog/237713" style="color:red;">http://wulonely.javaeye.com/blog/237713</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>业务背景 <br /><br />以财政业务数据为例，财政业务数据具有多样化的纬度和度量，以便财政人员对资金的管理和监察； <br /><br />纬度：功能科目－树状、经济科目－树状、机构－树状、经费类型－树状、资金来源－树状、主管岗位－普通序列、拨款时间－日期型 等； <br /><br />度量：指标金额、下达金额、已拨金额、使用金额、记账金额 等； 组合树型纬度从上面的纬度来看，大部分是树状的纬度，且财政要求的分析纬度通常都是多个纬度的组合，一般的分析工具要解决这个问题通常会在数据抽取阶段组合出用户所需的纬度来供用户使用，但这样带来的主要问题有：无法适应用户日渐变化的需求 和 难于维护日渐增加的组合纬度。童式魔方通过让用户自由设计纬度并在分析时生成组合纬度很好的解决了上面的问题，那下面看看童式魔方是怎么组合树状纬度。设计界面： <br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.1.JPG" height="456" alt="4.1" width="571" /><br />图4.1 <br /><br />从上图可见，设计界面的右方是放着可提供给用户设计的纬度和度量，这些信息是由维护人员在cube定义阶段设置好的；界面的左方是用户设计后的结果，对于二维的数据分析提供了行设计纬度和列设计纬度。那么下来我们表4.1为例子来做一个分析报表； <br /><br /><br />主管岗位 <br />经费类型 <br /><br />资金来源 <br /><br />机构 <br /><br />功能科目 <br /><br />经济科目 <br /><br /><br />表4.1 <br /><br />表4.1的列表头是由 机构 挂 功能科目 挂 经济科目 组合而成；行表头是由主管岗位 挂 资金来源 后，并 经费类型 组合而成。行列纬度可分别设计，互不干系；先设计列纬度，点击&ldquo;列设计纬度&rdquo;标签，再点击新增可见纬度设置界面，如下图： <br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.2.JPG" height="480" alt="4.2" width="589" /><br />图4.2 <br /><br />在纬度设置界面有四种纬度可使用，这里只需使用普通纬度，选择一个机构纬度，并输入这个树状纬度的开始级别和结束级别，点击确定后即可得到一个设计纬度；由于是在机构下挂功能科目，所以下一个设计纬度需设置成机构的子节点，先点击机构节点在点击新增按钮，即可再次打开纬度设置界面，下面的操作同上，那么最后得到的结果如下图： <br /><br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.3.JPG" height="480" alt="4.3" width="591" /><br />图4.3 <br /><br />对于行设计纬度是由 主管岗位 挂 资金来源 后，并 经费类型 组合而成，与列有所不同，在第一级有两个同级的节点，但对于设计纬度必须有一个根节点，所以这里需手工加一个根节点，再把主管岗位和经费类型并在这个根节点之下。得到的结果如下图： <br /><br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.4.JPG" height="480" alt="4.4" width="592" /><br />图4.4 <br /><br />在行列纬度都设计好后，即可点击分析按钮来查看最终格式和分析结果，行列表头均可展开后收回，并支持定向筛选； <br /><br />列表头的结果如下图： <br /><br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.5.JPG" height="448" alt="4.5" width="640" /><br />图4.5 <br /><br />行表头结果如下图： <br /><br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.6.JPG" height="76" alt="4.6" width="640" /><br />图4.6 <br /><br />总体结果如下图： <br /><br /><br /><img src="http://blog.bicubes.com/gallery/227/previews-med/4.7.JPG" height="389" alt="4.7" width="640" /><br />图4.7 <br /></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://wulonely.javaeye.com/blog/237713#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 17:17:15 +0800</pubDate>
        <link>http://wulonely.javaeye.com/blog/237713</link>
        <guid>http://wulonely.javaeye.com/blog/237713</guid>
      </item>
      <item>
        <title>别把jdk装到program files下?</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/237696" style="color:red;">http://rmn190.javaeye.com/blog/237696</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>
<p>&nbsp;&nbsp; 这些天遇到一个问题, 也就引出了本博客里的标题.&nbsp;</p>
<p style="padding-left: 30px;">&nbsp;</p>
<p>&nbsp;&nbsp; &nbsp;问题是这样的. &nbsp;一个Java程序要启动两个java进程A和B,第一个进程A是按正常的启动方式进行的,这里边没什么问题;第二个进程B是在进程A里通过调用Runtime.getRuntime().exec(mCmd, mEnv, mDir)的形式启动的. 问题就出在传的参数mCmd上了, 这个mCmd的值是从一个xml文件里读来的, 这个xml的内容大致如下:</p>
<p>&nbsp;</p>
<p><span style="white-space: pre;">	</span>&lt;app name="WP" cmd="C:\<span style="color: #ff0000;">Program Files</span>\Java\jdk1.6.0_07\bin\java -server -XX:+UseConcMarkSweepGC -...." /&gt;</p>
<p>&nbsp;</p>
<p><span style="white-space: pre;">	</span>这样执行exec方法时,JVM就报无法执行"C:\Program Files\Java\jdk1.6.0_07\bin\java"所指向的命令了, 原因很简单Windows没法找到没引号的"Program Files"文件夹,它会在空格处断开的.</p>
<p>&nbsp;</p>
<p><span style="white-space: pre;">	</span>这个怎么办?&nbsp;</p>
<p>&nbsp;</p>
<p><span style="white-space: pre;">	</span>我试着给Program Files加了单引号,还是不行,windows仍然不认.</p>
<p><span style="white-space: pre;">	</span>想给Program Files文件夹改名,可windows又不让!</p>
<p><span style="white-space: pre;">	</span>..............</p>
<p>&nbsp;</p>
<p><span style="white-space: pre;">	</span>无奈了,只能在C盘根目录下另又装了一个JDK.</p>
</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</p>
<p>&nbsp;</p>
<p><span style="white-space: pre;">	</span>难道真的不要把JDK装到program files下吗?</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/237696#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 16:43:14 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/237696</link>
        <guid>http://rmn190.javaeye.com/blog/237696</guid>
      </item>
      <item>
        <title>滚动条样式</title>
        <author>liudaoru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liudaoru.javaeye.com">liudaoru</a>&nbsp;
          链接：<a href="http://liudaoru.javaeye.com/blog/237663" style="color:red;">http://liudaoru.javaeye.com/blog/237663</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>前段时间写的滚动条样式的css代码段，备忘。。。。</p>
<p>-----------------------</p>
<pre name="code" class="html">/* 滚动条样式 */
.light-scroll {
	scrollbar-face-color : #fafafa;
	scrollbar-3dlight-color : #c0c0c0;
	scrollbar-base-color : #fff;
	scrollbar-arrow-color : #c0c0c0;
	scrollbar-shadow-color : #c0c0c0;
	scrollbar-darkshadow-color :#fff;
}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://liudaoru.javaeye.com/blog/237663#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 15:53:21 +0800</pubDate>
        <link>http://liudaoru.javaeye.com/blog/237663</link>
        <guid>http://liudaoru.javaeye.com/blog/237663</guid>
      </item>
      <item>
        <title>发现一个问题:迅雷,google与百度</title>
        <author>sech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sech.javaeye.com">sech</a>&nbsp;
          链接：<a href="http://sech.javaeye.com/blog/237641" style="color:red;">http://sech.javaeye.com/blog/237641</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>不是迅雷与google已经携手了,并且前段时间也发现用迅雷的gougou搜索电影,使用的是google的引擎,搜索的结果都是googe提供的.</p>
<p>但现在发现用gougou搜索电影,使用的引擎竟然是baidu的,搜索的结果也是baidu提供的,并且gougou的广告被firefox报&quot;位于 un.so.gougou.com 的站点已经被报告为攻击网站&quot;的错误,查看&quot;为何组织此站&quot;的说明页面是google提供的.</p>
<p>难道迅雷和google发生了什么问题吗?</p>
<p>不明白...<img src="../../images/smiles/icon_sad.gif" alt="" />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://sech.javaeye.com/blog/237641#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 15:32:28 +0800</pubDate>
        <link>http://sech.javaeye.com/blog/237641</link>
        <guid>http://sech.javaeye.com/blog/237641</guid>
      </item>
      <item>
        <title>返回JS对象的类型</title>
        <author>cpu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cpu.javaeye.com">cpu</a>&nbsp;
          链接：<a href="http://cpu.javaeye.com/blog/237636" style="color:red;">http://cpu.javaeye.com/blog/237636</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>返回JS对象的类型</p>
<p>&nbsp;</p>
<p>function objectType(obj)<br />
{<br />
<br />
&nbsp; var constructor = (String)(obj.constructor);<br />
&nbsp; var tokens = constructor.split(&quot; &quot;);<br />
<br />
&nbsp; for(var i=0; i&lt;tokens.length; i++)<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; if(tokens[i].indexOf(&quot;function&quot;) != -1)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var end = tokens[i+1].indexOf(&quot;(&quot;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(end == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(tokens[i+1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(tokens[i+1].substring(0, end));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
<br />
}// END objectType<br />
<br />
alert(objectType( 'I am a string'));&nbsp;&nbsp;&nbsp;&nbsp; //string<br />
alert(objectType(true));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //boolean<br />
alert(objectType(100));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //number</p>
          <br/>
          <span style="color:red;">
            <a href="http://cpu.javaeye.com/blog/237636#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 15:26:15 +0800</pubDate>
        <link>http://cpu.javaeye.com/blog/237636</link>
        <guid>http://cpu.javaeye.com/blog/237636</guid>
      </item>
      <item>
        <title>struts2在耦合servlet api下测试Action的异常问题</title>
        <author>bruce0508</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bruce0508.javaeye.com">bruce0508</a>&nbsp;
          链接：<a href="http://bruce0508.javaeye.com/blog/237620" style="color:red;">http://bruce0508.javaeye.com/blog/237620</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          环境：spring+struts2,使用了spring-struts2-plugin进行集成，正常启动服务器是ok的。但是我在做单元测试时发现了问。<br />我的struts2 Action中必须直接使用servlet request。代码如下：<br /><pre name="code" class="java">
String url =  "http://localhost:8080/dealer/list";
String classes = new HttpUtil(ServletActionContext.getRequest().post(url));
</pre><br /><br />JUnit代码如下：<br /><pre name="code" class="java">
InvList action = new InvListAction();
assertEquals(ActionSupport.SUCCESS,action.execute());
</pre><br />问题出在这：我刚开始直接让testCase集成jnit的TestCase，debug时在Action类的new HttpUtil直接抛出了nullPoiter异常。想了想原因应该是测试类无法取得request对象。<br />后来用了struts2-junit-plugin，让testCase继承了StrutsTestCase。其他代码全部不变。这次debug时抛出了异常：<br />nothing will work until WebApplicationContextUtil returns a valid ApplicationContext.<br />you may need to add the following to web.xml:<br /><pre name="code" class="java">
&lt;listen>
   &lt;listened-class>org.springframework.web.context.ContextLoaderListened&lt;/listened-class>
&lt;/listener>
</pre><br />很奇怪，这个listener我是加在web.xml的，而且正常启动服务器都可以访问spring的bean的，证明配置是ok的。<br />有谁有使用过StrutsTestCase这个类测试request response的经验的请指教！
          <br/>
          <span style="color:red;">
            <a href="http://bruce0508.javaeye.com/blog/237620#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 15:07:18 +0800</pubDate>
        <link>http://bruce0508.javaeye.com/blog/237620</link>
        <guid>http://bruce0508.javaeye.com/blog/237620</guid>
      </item>
      <item>
        <title>java 实现IP进制转换，IP进制与十进制互相转换</title>
        <author>yymmiinngg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yymmiinngg.javaeye.com">yymmiinngg</a>&nbsp;
          链接：<a href="http://yymmiinngg.javaeye.com/blog/237597" style="color:red;">http://yymmiinngg.javaeye.com/blog/237597</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>请看代码：</p>
<pre name="code" class="java">/**
 * IP进制转换工具
 * 
 * @author YM
 */
public class IpConvert {

	/**
	 * 将IP进制(如:192.168.1.1)转换成十进制(如:3232235777)
	 * 
	 * @param ip
	 * @return
	 */
	public static long getIp10(String ip) {
		long ip10 = 0;
		String[] ss = ip.trim().split(&quot;\\.&quot;);
		for (int i = 0; i &lt; 4; i++) {
			ip10 += Math.pow(256, 3 - i) * Integer.parseInt(ss[i]);
		}

		return ip10;
	}

	/**
	 * 将十进制(如:3232235777)IP转换成IP进制(如:192.168.1.1)
	 * 
	 * @param ip10
	 * @return
	 */
	public static String getIp(long ip10) {
		String ip = &quot;&quot;;
		long temp = 0;

		for (int i = 3; i &gt;= 0; i--) {
			temp = ip10 / (long) Math.pow(256, i) % 256;
			if (i == 3) {
				ip = ip + temp;
			} else {
				ip = ip + &quot;.&quot; + temp;
			}
		}

		return ip;
	}

	public static void main(String[] args) {
		System.out.println(getIp10(&quot;192.168.1.1&quot;));
		System.out.println(getIp(getIp10(&quot;192.168.1.1&quot;)));
	}
}
</pre>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://yymmiinngg.javaeye.com/blog/237597#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri