2010年1月27日星期三

[note]jQuery操作下拉框

    $('select').change(function(){ //事件发生
        jQuery('option:selected', this).each(function() {
            if (this.value == "NORMAL")
                jQuery(".amsTime").hide();
            else
                jQuery(".amsTime").show();
        });
    }); 

[转]Spring包详解

转自:http://www.javaeye.com/topic/578460

spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试, 正式应用系统中是用不得这些类的。
  除了spring.jar文件,Spring还包括有其它13个独立的jar包,各自包含着对应的Spring组件,用户可以根据自己的需要来选择组合自己的jar包,而不必引入整个spring.jar的所有类文件。

(1) spring-core.jar
这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。

(2) spring-beans.jar
这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及spring- beans.jar文件就可以了。

(3) spring-aop.jar
这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。


(4) spring-context.jar
  这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类。


(5) spring-dao.jar
  这个jar文件包含Spring DAO、Spring Transaction进行数据访问的所有类。为了使用声明型事务支持,还需在自己的应用里包含spring-aop.jar。


(6) spring-hibernate.jar
  这个jar文件包含Spring对Hibernate 2及Hibernate 3进行封装的所有类。


(7) spring-jdbc.jar
  这个jar文件包含对Spring对JDBC数据访问进行封装的所有类。


(8) spring-orm.jar
  这个jar文件包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar里的类,用这个包时你需要同时包含spring-dao.jar包。


(9) spring-remoting.jar
  这个jar文件包含支持EJB、JMS、远程调用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的类。


(10) spring-support.jar
  这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类。


(11) spring-web.jar
  这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。


(12) spring-webmvc.jar
  这个jar文件包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、 XSLT相关类。当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。


(13) spring-mock.jar
  这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,这样测试就更加简单。模拟HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便的。


  如何选择这些发布包,决定选用哪些发布包其实相当简单。如果你正在构建Web应用并将全程使用Spring,那么最好就使用单个全部的 spring.jar文件;如果你的应用仅仅用到简单的Inversion of Control / Dependency Injection(IoC/DI)容器,那么只需spring-core.jar与spring-beans.jar即可;如果你对发布的大小要求很 高,那么就得精挑细选了,只取包含自己所需特性的jar文件了。采用独立的发布包你可以避免包含自己的应用不需要的全部类。当然你可以采用其它的一些工具 来设法令整个应用包变小,节省空间的重点在于准确地找出自己所需的Spring依赖类,然后合并所需的类与包就可以了。Eclispe有个插件叫 ClassPath Helper可以帮你找找所依赖的类。


Spring包依赖说明:
1) spring-core.jar需commons-collections.jar,spring-core.jar是以下其它各个的基本。
2) spring-beans.jar需spring-core.jar,cglib-nodep-2.1_3.jar
3) spring-aop.jar需spring-core.jar,spring-beans.jar,cglib-nodep-2.1_3.jar,aopalliance.jar
4) spring-context.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,commons-collections.jar,aopalliance.jar
5) spring-dao.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring-context.jar
6) spring-jdbc.jar需spring-core.jar,spring-beans.jar,spring-dao.jar
7) spring-web.jar需spring-core.jar,spring-beans.jar,spring-context.jar
8) spring-webmvc.jar需spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar
9) spring -hibernate.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-jdbc.jar,spring-orm.jar,spring-web.jar,spring-webmvc.jar
10) spring-orm.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-jdbc.jar,spring-web.jar,spring-webmvc.jar
11) spring -remoting.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-context.jar,spring-web.jar,spring-webmvc.jar
12) spring-support.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jar
13) spring-mock.jar需spring-core.jar,spring-beans.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jar

2010年1月24日星期日

[转]正则表达式中的非捕获组(none-captrue group)

转自:http://www.cnblogs.com/tmrcp/archive/2009/07/20/1527077.html

捕获组(capturing group)是把多个字符当作一个单元对待的一种方式。通过把字符括在括号内创建捕获组。例如,正则表达式(dog)创建包含字母“d”、“o”和“g” 的一个组。输入字符串和捕获组匹配的那一部分将被保存在内存中,以便以后通过反向引用再次使用。

而非捕获组就是输入字符串和捕获组匹配的那一部分将不被保存在内存中。这有什么用呢?当然是能够节省内存了,下面具体说下非捕获组里的那8个Special constructs(下面的内容大部分是我摘抄论坛上一个叫“火龙果”兄弟的回贴,然后再加上些我自己的理解):

 

以 (? 开头的都是非捕获组,都是不进行捕获的。

(?:XXX) 这个比较常用,在不需要捕获时可以替换 (XXX),比如:


匹配 June 和 July 可以写成:
Ju(ne|ly)

也可以写成
Ju(?:ne|ly)

前者会把 ( ) 内的在匹配后保留在内存中,而后者不会。

以 (? 开头,) 结尾的都称为非捕获组,在匹配完成后在内存中不保留匹配到的字符。


(?:X)

    X 作为非捕获组
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,
仅仅作为分组。
比如:要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配
123 后会保留在内存中,便于反向引用,而 (?:123) 在匹配完后则不会保留,区别仅在于此。

[note][精品]Javascript编程中的陷阱

今天看jQuery源码的时候发现了一个以前不知道的问题,代码如下
(function() {
slice=Array.prototype.slice;
jQuery.prototype = {
......
    slice: function() {
        return this.pushStack( slice.apply( this, arguments ),
            "slice", slice.call(arguments).join(",") );
    },
......
}
})();

当时怎么都看不明白为什么要递归slice方法,其实此处的slice方法是数组的slice方法。
仔细分析代码jQuery.prototype被赋值为一个对象,这个对象有slice方法,此方法内部是直接调用slice,而非this.slice
Javascript与Java不同的是它不会将slice看成是this.slice,而会从作用域链里查找slice。作用域与语法作用域是一样的。
故首先是到本函数的作用域未找到定义,然后到整个函数
(function() {
})();
的作用域找到了Array.prototype.slice方法。这样就容易理解了。
显然jQuery.prototype={...}不是一个语法作用域。

2010年1月23日星期六

[转]Javascript的正则表达式中的子式

今天看jQuery源码的时候看到了如下代码:

quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/;

if ( typeof selector === "string" ) {
            // Are we dealing with HTML string or an ID?
            match = quickExpr.exec( selector );

            // Verify a match, and that no context was specified for #id
            if ( match && (match[1] || !context) ) {
......
}
else {
......
}
}

查资料知道了:http://www.w3school.com.cn/js/jsref_exec_regexp.asp
上面的正则表达式中的子式有两个“<[\w\W]+>”和“[\w-]+”。它们都用小括号包围,分别代表了html标签和id两种输入情况。
而match[1]存在时则是html的标签,match[2]存在时则是id。

2010年1月22日星期五

【译】【精品】Javascript载入过程的优化手段

英文原文:http://www.phpied.com/javascript-loading-strategies/

Javascript有一个许多人都不知道的黑暗面。它导致了浏览器停止执行工作指导script被下载,解析和执行。它为什么会导致这个问题呢?

好问题!在我解答之前,我需要解释下浏览器是如何构建一个页面的。浏览器做的第一件事是从服务器接收一个HTML文档来在内存中建立一个DOM对象。当浏览器在将HTML转换成DOM时,它一定会的遇到一些额外依赖的引用,如CSS文档和图像。每当此时,它会向服务器请求那个依赖文档。它不需要等待一个被加载完成后再加载另一个,它会发起尽可能多的请求。这样,页面会一次一个节点的构建并且当依赖下载完成后加载到正确的位置。当遇到Javascript的依赖时一切都被搞糟了!当遭遇Javascript时,浏览器会停止构建BOM并且等待文件下载完毕。一旦接受到之后,它解析并执行它。只有一切完成之后浏览才会继续构建DOM。我怀疑这是为了给脚本提供一个尽可能稳定的DOM。如果在脚本执行的时候DOM还在不停的变化,事情就会变糟了。总之,在浏览器无法构建DOM的这段时间是由script的大小和复杂度决定的。

想象下在<head>里面载入一个200k的Javascript文档。假设这个文档不仅巨大而且计算复杂需要花费一个半秒来完成。那么在这一两秒中内,页面会一直空着知道下载和计算完成。访问者必须要容忍一个半秒的等待。考虑到大部分人不会花费平均每个页面几秒的时间在一个页面上,而且那时一个全部白屏的页面。

Reduce
压缩
如何解决这个问题?方法之一是也所JS文件的大小!现在有很多的压缩JS文件的软件。如JSmin,YUI Compressor等等。

Defer延迟
一旦你确保文件尽可能的小了,下一步呢?让在JS下载时文件页面不是白屏。你可以不将<script>标签放到<head>里面,相反你可以放到<body>里面。<script>标签之前的html会被加载,这样访问者就不会看到白屏了,而会看到<script>标签之前的内容。

Go Async异步方法
另一个方法就是使用异步执行的方法来获取JS脚本。你可以用Javascript来向DOM中插入<script>标签,这样浏览器会异步的获取标签指示的JS文件。唯一难以确定的是你不知道什么时候脚本下载并且解析执行完毕,不过你可以使用回调函数的方法来实现。很多的JS库提供了这种方法。但是如果你想自己完成这些工作,就需要应对浏览器之间的差异性了。

Be Lazy
延迟运算(分为解析与执行)
有的时候你所需要的JS文件并非一定被执行了,如页面导航的JS。如果访问者不使用导航而是直接点击了链接那么它就不需要一开始就解析和执行导航的JS代码。这种情况你就可以不用在导航时直接直接执行,您也可以先下载这些JS代码,然后再执行。当然还有其他方法:http://lifesinger.org/blog/2010/01/the-deferred-evaluation-of-yui3/

Bite Size
上面的方法中你仍旧需要先加载一些核心的JS组件然后才能实现。如果这个核心组件也很庞大但我们只用到了很少的功能,那怎么办?那你可以自己试着提炼出你需要的功能。

2010年1月21日星期四

【转】【JavaBug】java的Integer比较

转自:http://jessdy.javaeye.com/blog/174011
首先:
Java代码
  1. public static void main(String []args) {  
  2.      Integer a = 100;  
  3.      Integer b = 100;  
  4.      System.out.println(a==b);   //true  
  5.    }  

Java代码
  1. public static void main(String []args) {  
  2.      Integer a = 200;  
  3.      Integer b = 200;  
  4.      System.out.println(a==b);   //false  
  5.    }  

原因:
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
Java代码
  1. public static Integer valueOf(int i) {   
  2. final int offset = 128;   
  3. if (i >= -128 && i <= 127) { // must cache   
  4. return IntegerCache.cache[i + offset];   
  5. }   
  6. return new Integer(i);   
  7. }   


Java代码
  1. private static class IntegerCache {   
  2. private IntegerCache(){}   
  3. static final Integer cache[] = new Integer[-(-128) + 127 + 1];   
  4. static {   
  5. for(int i = 0; i < cache.length; i++)   
  6. cache = new Integer(i - 128);   
  7. }   
  8. }   

这边是java为了提高效率,初始化了-128--127之间的整数对象
所以在赋值在这个范围内都是同一个对象。
再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
Java代码
  1. public static void main(String []args) {  
  2.     Integer a = 100;  
  3.     Integer b = a;  
  4.     a++;  
  5.     System.out.println(a==b);  
  6. }  

打印就是false
对于127--128没有多大关系,但是在这范围之外就影响性能了吧

2010年1月20日星期三

[转]log4j与sl4j教程

Log4j教程
1、 Log4j是什么?
  Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧:
http://jakarta.apache.org/log4j

2、Log4j的概念
   Log4j中有三个主要的组件,它们分别是
Logger、Appender和Layout,Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远 存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。
   Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如
console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。
   Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。
   Log4j中将要输出的Log信息定义了5种级别,依次为DEBUG、INFO、WARN、ERROR和FATAL,当输出时,只有级别高过配置中规定的 级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码,这点实在是方便啊。

3、Log4j的配置文件
  虽然可以不用配置文件,而在程序中实现配置,但这种方法在如今的系统开发中显然是不可取的,能采用配置文件的地方一定一定要用配置文件。Log4j支持两 种格式的配置文件:XML格式和Java的property格式,本人更喜欢后者,首先看一个简单的例子吧,如下:

  log4j.rootLogger=debug, stdout, R
  log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

  # Pattern to output the caller's file name and line number.
  log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

  log4j.appender.R=org.apache.log4j.RollingFileAppender
  log4j.appender.R.File=example.log
  log4j.appender.R.MaxFileSize=
100KB

  # Keep one backup file
  log4j.appender.R.MaxBackupIndex=1

  log4j.appender.R.layout=org.apache.log4j.PatternLayout
  log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n         

  首先,是设置root,格式为 log4j.rootLogger=[level],appenderName, ...,其中level就是设置需要输出信息的级别,后面是appender的输出的目的地,appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 配置日志信息输出目的地Appender,其语法为
  log4j.appender.appenderName = fully.qualified.name.of.appender.class
  log4j.appender.appenderName.option1 = value1
  ...
  log4j.appender.appenderName.option = valueN

Log4j提供的appender有以下几种:
  org.apache.log4j.ConsoleAppender(控制台)
  org.apache.log4j.FileAppender(文件)
  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置日志信息的格式(布局),其语法为:
  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
  log4j.appender.appenderName.layout.option1 = value1
  ....
  log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下几种:
  org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

   %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  %r 输出自应用启动到输出该log信息耗费的毫秒数
  %c 输出所属的类目,通常就是所在类的全名
  %t 输出产生该日志事件的线程名
  %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:
2002年10月18日 22:10:28,921
  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)



4、Log4j在程序中的使用

  要在自己的程序中使用Log4j,首先需要将commons-logging.jar和logging-log4j-1.2.9.jar导入到构建路径 中。然后再将log4j.properties放到src根目录下。这样就可以在程序中使用log4j了。在类中使用log4j,
首先声明一个静态变量 Logger logger=Logger.getLog("classname");现在就可以使用了,用法如下:logger.debug("debug message")或者logger.info("info message"),看下面一个小例子:

  import com.foo.Bar;
  import org.apache.log4j.Logger;
  import org.apache.log4j.PropertyConfigurator;
  public class MyApp {
    static Logger logger = Logger.getLogger(MyApp.class.getName());
    public static void main(String[] args) {
      // BasicConfigurator replaced with PropertyConfigurator.
      PropertyConfigurator.configure(args[0]);
      logger.info("Entering application.");
      Bar bar = new Bar();
      bar.doIt();
      logger.info("Exiting application.");
    }
  }

SL4J教程

一、介绍:
简单日记门面(simple logging Facade for java)SLF4J是为各种loging APIs提供一个简单统一的
接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以
选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现
来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。在SLF4J发行版本中包含了几个
jar包,如slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-log4j13.jar,
slf4j-jdk14.jar and slf4j-jcl.jar通过这些jar文件可以使编译期与具体的实现脱离。或者说可以
灵活的切换
二、官方站点
官方的网站:http://www.slf4j.org/manual.html
三、为何使用slf4j?
我们在开发过程中可能使用各种log,每个Log有不同的风格、布局,如果想灵活的切换那么slf4j是比较好的
选择。
四、如何使用slf4j
下边一段程序是经典的使用slf4j的方法.

 

import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
public   class  Wombat  {
    
final  Logger logger  =  LoggerFactory.getLogger(Wombat. class );
    Integer t;
    Integer oldT;
    
public   void  setTemperature(Integer temperature)  {
        oldT 
=  t;
        t 
=  temperature;
        logger.error(
" Temperature set to {}. Old temperature was {}. " , t, oldT);
        
if  (temperature.intValue()  >   50 {
            logger.info(
" Temperature has risen above 50 degrees. " );
        }

    }

    
public   static   void  main(String[] args)  {
        Wombat wombat 
=   new  Wombat();
        wombat.setTemperature(
1 );
        wombat.setTemperature(
55 );
    }

}


下边介绍一下运行上边程序的过程。
1,编译上边的程序,需要classpath中加入slf4j-api-1.4.1.jar文件
2,运行时,需要classpath中加上slf4j-simple-1.4.1.jar
运行得到结果:
----------------------------
0 [main] ERROR Wombat - Temperature set to 1. Old temperature was null.
0 [main] ERROR Wombat - Temperature set to 55. Old temperature was 1.
0 [main] INFO Wombat - Temperature has risen above 50 degrees.
这个是simple log风格,

3,切换:如果想切换到jdk14的log的风格,只需要把slf4j-simple-1.4.1.jar
从classpath中移除,同时classpath中加入slj4j-jdk14-1.4.1.jar
这时的运行结果:
---------------------------------------------------
2007-7-9 10:40:15 Wombat setTemperature
严重: Temperature set to 1. Old temperature was null.
2007-7-9 10:40:16 Wombat setTemperature
严重: Temperature set to 55. Old temperature was 1.
2007-7-9 10:40:16 Wombat setTemperature
信息: Temperature has risen above 50 degrees.
已经变成jdk14的log风格了。
4,再次切换到log4j
同样移除slj4j-jdk14-1.4.1.jar,加入slf4j-log4j12-1.4.1.jar,同时加入log4j-1.2.x.jar
加入log4j.properties。得到显示结果:
---------------------------------------
10:42:27,328 ERROR Wombat: Temperature set to 1. Old temperature was null.
10:42:27,328 ERROR Wombat: Temperature set to 55. Old temperature was 1.
10:42:27,328  INFO Wombat: Temperature has risen above 50 degrees.
在不同的风格中切换只需要在部署期切换类库就可以了,和开发时无关。


2010年1月11日星期一

[note]Get方式传参的编码问题

        对于get方法来说,都是把数据串联在请求的url后面作为参数,url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器。URL encode的过程就是把部分的url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的 字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。
        了解了URL encode的过程,我们能看到2个很重要的问题,
  • 第一:需要URL encode的字符一般都是非ASCII的字符,所以都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成 的;
  • 第二:URL encode到底按照那种编码方式对字符编码?不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8, 完成了URL encode的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。

2010年1月9日星期六

[note]测试项目地址

最近学Java学的越来越深,发现自己对Java的了解少的可怜.....

学Java的时候除了将自己的心得写成文章发到blog之外,我还写了不少的测试用demo。今天为了同步公司和家里两个地方的demo,申请了google code的svn。这样方便多了。
SVN地址是:svn checkout http://mmlearnjava.googlecode.com/svn/trunk/ mmlearnjava-read-only
项目地址:http://code.google.com/p/mmlearnjava/

2010年1月5日星期二

[搞笑]唐僧写给悟空的考研信

悟空:听说你又要考研了,你总是一会儿一个想法,上次在王母娘娘的蟠桃Salon上碰见你的时候你不是说不考研吗?而且还说考研这种恶俗的事情你不 会做,弄的当时在场的几个刚刚考上研的仙童很没面子。看你,又变卦了不是?不过,师傅听说你要考研还是很高兴的,毕竟能在学历上多上一个档次对你的发展是 只有好处没有坏处的嘛!而且你也看到了,现在西天这边大家都在考研,你能认清形势,师傅替你高兴。按理来说,凭你在取经时候的贡献,应该能保的,都是你跟 上面的关系总是处不好,当时上面给我们取经小组一共两个保研名额,我想就按贡献大小给你和八戒。报上去后,上面对你的意见大得很,尤其东海龙王对你意见最 大,说你当年借了他的定海神针到现在还不还。就光这一条我就没有发言权了,你说现在取经完都 300年了,你还拿个那棒子有什么用?就是有用续借也总要打个招呼嘛,你不打招呼人家怎么知道你要用,打招呼给人家人家是不会不给你续借的嘛……有借有 还,再借不难。

好了,又扯远了。还是说你保研的事,龙王后来上下活动了一下,最后你的名额就给小白龙了,虽然你没有保上有点遗憾,但给小白龙也总算是落到我们小组内了, 况且白龙马没有功劳有苦劳,给了也就给了。再说八戒,人家上面关系处理的好,报上去基本没怎么讨论就通过了,面试也放得很松。而且八戒的导师也不错,是文 殊菩萨。现在人间也都重教育,所以文殊菩萨的香火很旺,经费自然就多,今年报她那里的人最多。你什么都好,就是在神际关系上总是处理不好,八戒这点就是比 你强。你看同是一个师傅带出来的,人家八戒现在都研究生毕业开始带研究生了(听说今年第一年招生,可能比较好考,你要不就考八戒那吧)。而你现在才考, 唉!

我也给你介绍一下我最近的研究情况吧,这也是我给你写信的主要目的,其实我是很希望你考我这里的,我现在就需要你这样的学生,保过来的几个动手能力 太差,还不听话,就知道月底问我要钱。我最近也刚评了博士点,从明年起也可以带博士了,你要是考我这里我给你一个直博的名额,省得到时候再考博。我最近主 要研究的课题是"佛界是否应该顺应人间宗教市场的崇拜趋势"。你已经很久没来西天了,你不知道,我这个课题还是很热的,如来很重视,上次开会如来还问我课 题的进展情况。我不是刚才跟你说了,人间现在重视教育,你看,文殊的身价就上去了,重视经济,道教的财神爷人气就很旺。

所以现在佛界也对这个问题重视起来了,还形成了以观音为首的"保守派"和以108罗汉为首的"革新派"之争。保守派认为佛界应该重修行重参悟,不要 盲从人间崇拜的大溜,应该引导众生慈悲向善,而不是一味地迎合大众的口味。而"革新派"认为佛界也应该讲市场规律,如果人们都不信佛了,我们从哪里来供 奉,从哪里来香火?

所以如来给我拨了些经费,让我成立个课题组,对这个问题进行调研。我个人是颇同意"革新派"的(如来听口气也是向着革新派),时代不同了,佛界也要 与时俱进嘛。最近也取得了一些研究成果,我认为应该新设四大菩萨�"吉托菩萨"(主管GRE、 TOLLF考试)、"亨通菩萨"(司官运)、"济财菩萨"(相当于财神爷)和"高就菩萨"(主管就业)。我又扯远了,好了悟空,废话我也不多说了,我还是 希望你能考我这里,你聪明,又肯动,我这个课题还得多往人间跑,我觉的你很合适,你要愿意的话,过两天来我这里,我给你划划重点,专业课的题是我出的。至 于公共课,出题的几个罗汉我都很熟,给你问一下"重点"也可以,免得你去报什么"冲刺班",还不是他们几个在那里讲?好了,废话我不多说了,你好好准备一 下吧