2010年12月29日星期三

gVim使用技巧:排版命令

1. 在Normal模式下,输入“>>”表示右移一个tab位,相似的,按“<<”左移。
2. 命令模式下,输入 le 表示该行左对齐,相似的,输入ri表示右对齐。居中对齐就是ce。这三个命令分别是left和right,center的头两个字母,比较利于记忆
3. gqq 命令,在本行进行段落重排。
4. gqQ命令,在全文段落重拍

2010年12月28日星期二

gVim使用技巧:基本操作

  找了很久的文本编辑器,最后发现vim才是最好用的。打算开始一步步踏踏实实的学习如何使用vim,因为工作用的Windows,所以下载了个gVim来用。以下是一些使用技巧:
  1. 如何打开文件:直接把文件拖到gVim的编辑区或者在命令模式下输入“tabnew 文件名”,按tab键可以自动补全,然后回车即可。也可以显示命令菜单,然后点击“打开”来打开一个文件。
  2. 光标移动:在Normal模式下,hjkl分别代表左下上右。gg回到文件开头,G$回到文件末尾。w跳过一个词,并且停留在词开头;e跳过一个词,并且停留在词结尾。i在光标前插入,I在行首插入。a在光标后插入,A在行尾插入。^ 键回到行首,$ 键回到行尾(类似正则表达式的首尾)。输入数字+G或者数字+gg可以跳到指定的行。
  3. 文本编辑:
  1) 复制&粘贴: 采用y命令组合来实现复制。例如
    yy 表示复制一行
    y$ 表示复制从光标到行尾
    y^ 表示复制从光标到行首
  采用p命令来实现粘贴。在要粘贴的地方直接按p,即可实现粘贴功能。
  2) 查找:采用/或者?来进行查找,支持正则表达式。/ 为从上到下查找,? 为从下到上查找。查找到的结果会自动高亮。如果要移动到下一个查找到的目标,则按n键。移动到上一个查找到的目标按N键。
  3)替换:采用s命令来进行替换。在正常模式下,按:进入命令模式,输入“%s/old/new”,其中,%表示全文替换,将所有找到的old用new来替换。为了保险起见,可以输入“%s/old/new/c”,c参数表示confirm,替换之前会进行一次确认。如果不指定范围,默认替换发生在光标所在的行。
  4)删除:在正常模式下使用x命令进行删除单个字符。可以指定数字或者和光标移动命令组合使用。比如5x表示删除从光标开始的5个字符。可以使用dd来快速删除一行记录。dw删除一个词。
  4. 保存文件:在命令模式下输入w表示保存(write),可以组合命令,比如qw表示保存且退出。

2010年12月14日星期二

JRockit和Hotspot进行Heap Dump的参数

最新版的JRockit(R28,2010年4月)版本已经支持OOM时将堆内存转储出来,供离线分析使用了。使用的参数跟Sun的JDK类似,通过指定如下的JVM参数运行即可:
-XX:+HeapDumpOnOutOfMemoryError: Enables generation of Java heap dumps on out-of-memory errors
-XX:+HeapDumpOnCtrlBreak: Enables generation of Java heap dumps on pressing Ctrl-Break.
第一个参数是OOM时自动转储,第二个参数是在控制台按Ctrl+Break转储。
注意这个参数和使用jrcmd里面的print_threads,oom_diagnose之类的命令是不同的,后者产生的是标准的文本文件,供人阅读分析的。Heap Dump文件是二进制文件,可以使用MAT一类的离线分析工具来分析系统中可能存在的内存泄漏问题。

2010年12月7日星期二

Nginx反向代理配置

步骤如下:
1. 下载安装Nginx
2. 修改Nginx的配置文件nginx.conf,加入以下配置:
location /rc {
proxy_pass http://destHost:80/rc;
proxy_redirect default;
}
当请求本机Nginx监听端口时,Nginx会将该请求代理至目标服务器,由此实现反向代理和负载均衡。
3. 如果客户端至服务器中有Hessian请求时,需要修改Hessian请求参数,否则会导致Nginx抛出411异常,如下:
com.caucho.hessian.client.HessianConnectionException: 411:java.io.IOException: Server returned HTTP response code: 411 for URL:http://xxxx/xxx/xxxService
解决该问题的方法是关闭Hessian向服务端请求时的分块数据传送(chunked post),可以通过设置Hessian的客户端代理类的方式进行,具体如下:
proxyFactory.setChunkedPost(false);
这样就能解决Hessian应用走Nginx反向代理的异常。详细的说明可参见这里

Apache反向代理配置


  Apache的反向代理设置较为简单,按以下步骤进行即可:
1. 下载安装apache http server
2. 安装
3. 编辑apache_install_directory/conf/httpd.conf文件:
  1)开启加载反向代理模块,即取消一下两行配置代码的注释:
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
  2)增加如下配置:
 1 <IfModule mod_proxy.c>
 2 ProxyRequests off
 3 <Proxy *>
 4    Order deny,allow
 5    Allow from all
 6 </Proxy>
 7 ProxyPass /rc http://target_host:port/rc
 8 ProxyPassReverse /rc http://target_host:port/rc
 9 </IfModule>
10 
将Proxy开启,其中ProxyPass为反向代理主要配置,当请求本机监听的端口,且URL为rc时,Apache将会去目标服务器(destHost)请求,从而代理该请求。ProxyPassReverse配置为Apache 调整HTTP重定向回应中LocationContent-LocationURI头里的URL。
代理的配置详细参数可参见这里
4. 如果请求量比较大,则考虑关闭apache的访问日志,否则该日志增长过快,且影响性能,在httpd.conf里面注释掉配置项:
    #CustomLog "logs/access.log" common
6. 如果是Windows系统,则可能会因为防火墙和杀毒软件的关系,导致apache报以下的异常:
(OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
造成该问题的原因是因为Apache使用了Windows的一个封装方法,加入以下配置消除该异常:

Win32DisableAcceptEx
ThreadsPerChild 250
MaxRequestsPerChild 0

7. 如果出现 Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting 的提示,则考虑增加ThreadsPerChil (子进程的线程数)值。

2010年8月10日星期二

解决连接Oracle时出现的异常

异常现象如下:
java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169870336)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:334)
    at oracle.jdbc.ttc7.TTC7Protocol.handleIOException(TTC7Protocol.java:3695)
    at oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:352)
    at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:362)
    at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:536)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:328)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
 ...
原因一般为jdbc连接URL里面填写了错误的sid,查看sid方法如下:
select INSTANCE_NAME from v$instance;
然后填写正确的sid即可。

2010年8月1日星期日

[转]我的幸福生活从国家统计局的报告开始

  原文链接见: http://www.haoyou.name/7446.html
  这可不是我瞎掰,是国家统计局告诉我的。人家说了,全国城镇居民半年的工资收入就达到了一万多块,我就是全国城镇居民之一,也就是说我半年的工资收入已经达到了一万多块。
另外,国家统计局还告诉我,我的“人均”住房面积已经达到了二十六平方米,照此算来,我们家已经拥有了一套一百多平方米的宽敞住宅了。此外,我还有一千多美元的人均GDP收入,而物价上涨幅度非常低,还不到5%。
您说这生活能不幸福吗?但是,经过一番仔细研究,我又惊奇地发现,除了这些之外,我还有不少“隐形收入”。比如:
我拥有0.11辆汽车。
我每年出国旅游0.02次。
我每天上酒店用餐0.13次。
我每年能到电影院看美国大片0.17场。
我拥有欧洲著名品牌时装0.28件。
我拥有纯血统赛马0.05匹。
我还拥有0.0001艘游艇。
我还拥有0.07个情妇。
我还拥有足有我巴掌那么大的一块高尔夫球场
…… …… …… …… …… ……
除此之外,还有很多,实在无法一一列举。拥有了这一切,我自然而然地就会过上幸福的生活,我每天的生活是这样的:
在一个阳光明媚的上午,我离开了我们家那座一百多平米的豪宅,穿着我那0.28件欧洲品牌时装,带上了我那0.07个情妇,坐上了我那0.11辆汽 车,风驰电掣地行驶在宽阔的马路上。我们来到了我所拥有的那块巴掌大小的高尔夫球场,在绿草如茵的球场上,我和那0.07个情妇尽情地撒欢、追逐。
我们玩得十分尽兴,临近中午,我看了一眼手腕上戴的那0.0003块“江诗丹顿”手表,决定去吃饭。我的情儿拿起了她那0.004个“路易威登”手提包,和我又上了那0.11辆汽车,来到了大酒店,我们一同在这里吃了0.13顿生猛海鲜。
吃完饭,我们又驱车来到了洗浴中心,在那里洗了0.09次桑拿。洗完澡之后,我们商量起了那0.02次出国旅游应该到哪个国家才好。我那0.07个 情妇想去巴黎,而我想去柬埔寨,我们吵了起来。我一怒之下,一脚踹碎了我那0.0003块“江诗丹顿”手表,我的情儿也在火头上一甩手扔掉了她那 0.004个“路易威登”手提包。于是,我们不欢而散,就此分道扬镳。
这时,我醒悟了:千好万好还是不如自己的老婆孩子好啊!于是,我开着那0.11辆汽车立刻回家。到了家里,我牵出了我那0.05匹纯血统赛马,我们一家三口兴高采烈地骑在高头大马上,直奔海滨而去。
到了海边,我们弃马登舟,坐上了我那0.0001艘豪华游艇,我们在大海上尽情驰骋,好不开心。直到夕阳西下,我们才依依不舍地上岸。
这,就是我一天的“人均”生活。大家说,我的生活是多么的幸福啊!

2010年7月27日星期二

一个奇怪的BUG

   今天在工作中碰到一个奇怪的BUG,客户端通过RMI远程调用一个服务时抛异常,日志如下:
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [ http://xxx/xxxService]; nested exception is java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.util.RandomAccessSubList
    at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:211)
    at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:144)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
   ......
看日志应该是有一个类未实现序列化接口导致的,浏览了代码,也没发现有什么异常的。然后就开始跟踪这个类:RandomAccessSubList, 终于发现ArrayList实例在调用subList方式是,返回的就是这个类,代码如下(AbstractList.java):
    public List<E> subList(int fromIndex, int toIndex) {
        return (this instanceof RandomAccess ?
                new RandomAccessSubList<E>(this, fromIndex, toIndex) :
                new SubList<E>(this, fromIndex, toIndex));
    }
显然就是类RandomAccessSubList未实现序列化接口,由此得到一个写RMI服务需要注意的地方:返回对象不能包含通过调用subList方法得到的结果,否则会抛出该异常。为了避免这个缺陷,有两种方法:
1. 通过hessian等远程调用方式绕开RMI
2. 不直接调用subList,实现一个自己的类似方法即可。

2010年5月11日星期二

Spring事务配置的五种方式

转载自:http://www.blogjava.net/robbie/archive/2009/04/05/264003.htm 
    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉 Spring的事务配置只要把思路理清,还是比较好掌握的。
    总结如下:
    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪 种配置方式,一般变化的只是代理机制这部分。
    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。
    具体如下图:


    根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
    第一种方式:每个Bean都有一个代理
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context
="http://www.springframework.org/schema/context"
    xmlns:aop
="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>

   
<bean id="sessionFactory" 
            class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
       
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
       
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
   
bean> 

   
 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
   
   

   
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
   
   
<bean id="userDao" 
        class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
          
 
          
<property name="transactionManager" ref="transactionManager" />    
       
<property name="target" ref="userDaoTarget" /> 
        
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
       
 
       
<property name="transactionAttributes"> 
           
<props> 
               
<prop key="*">PROPAGATION_REQUIREDprop>
           
props> 
       
property> 
   
bean> 
beans>
    第二种方式:所有Bean共享一个代理基类
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context
="http://www.springframework.org/schema/context"
    xmlns:aop
="http://www.springframework.org/schema/aop"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>

   
<bean id="sessionFactory" 
            class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
       
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
       
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
   
bean> 

   
 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
   
   
<bean id="transactionBase" 
            class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
            lazy-init
="true" abstract="true"> 
       
 
       
<property name="transactionManager" ref="transactionManager" /> 
       
 
       
<property name="transactionAttributes"> 
           
<props> 
               
<prop key="*">PROPAGATION_REQUIREDprop> 
           
props> 
       
property> 
   
bean>   
  
   

   
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
   
   
<bean id="userDao" parent="transactionBase" > 
       
<property name="target" ref="userDaoTarget" />  
   
bean>
beans>
第三种方式:使用拦截器
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context
="http://www.springframework.org/schema/context"
    xmlns:aop
="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>

   
<bean id="sessionFactory" 
            class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
       
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
       
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
   
bean> 

   
 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
  
   
<bean id="transactionInterceptor" 
        class
="org.springframework.transaction.interceptor.TransactionInterceptor"> 
       
<property name="transactionManager" ref="transactionManager" /> 
       
 
       
<property name="transactionAttributes"> 
           
<props> 
               
<prop key="*">PROPAGATION_REQUIREDprop> 
           
props> 
       
property> 
   
bean>
     
   
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
       
<property name="beanNames"> 
           
<list> 
               
<value>*Daovalue>
            list> 
       
property> 
       
<property name="interceptorNames"> 
           
<list> 
               
<value>transactionInterceptorvalue> 
           
list> 
       
property> 
   
bean> 
 
   

   
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
beans>
第四种方式:使用tx标签配置的拦截器
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context
="http://www.springframework.org/schema/context"
    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.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>

   
<context:annotation-config />
   
<context:component-scan base-package="com.bluesky" />

   
<bean id="sessionFactory" 
            class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
       
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
       
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
   
bean> 

   
 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>

   
<tx:advice id="txAdvice" transaction-manager="transactionManager">
       
<tx:attributes>
           
<tx:method name="*" propagation="REQUIRED" />
       
tx:attributes>
   
tx:advice>
   
   
<aop:config>
       
<aop:pointcut id="interceptorPointCuts"
            expression
="execution(* com.bluesky.spring.dao.*.*(..))" />
       
<aop:advisor advice-ref="txAdvice"
            pointcut-ref
="interceptorPointCuts" />       
   
aop:config>     
beans>
第五种方式:全注解

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context
="http://www.springframework.org/schema/context"
    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.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>

   
<context:annotation-config />
   
<context:component-scan base-package="com.bluesky" />

   
<tx:annotation-driven transaction-manager="transactionManager"/>

   
<bean id="sessionFactory" 
            class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
       
<property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
       
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
   
bean> 

   
 
   
<bean id="transactionManager"
        class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
       
<property name="sessionFactory" ref="sessionFactory" />
   
bean>
   
beans>
此时在DAO上需加上@Transactional注解,如下:
package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component(
"userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

   
public List<User> listUsers() {
       
return this.getSession().createQuery("from User").list();
    }
   
   
}

2010年4月1日星期四

海鸥之歌

海鸥之 歌
     

灰蓝色的海洋上暮色苍黄,

一艘船驶行着穿越波浪,
满载着带有镣链的囚犯,
去向某个不可知道的地方。

囚徒们沉默着凝望天末,
深陷的眼睛里闪着火光,
破碎的衣衫上沾遍血迹,
枯瘠的胸膛上布满鞭伤。

船啊!你将停泊在哪个海港?
你要把我们往哪儿流放?
反正有一点总是同样,
哪儿也不会多些希望!

我们犯下了什么罪过?
杀人?放火?黑夜里强抢?
什么都不是——只有一桩,
我们把自由释成空气和食粮。

暴君用刀剑和棍棒审判我们,
因为他怕自由象怕火一样;
他害怕一旦我们找到了自由,
他的宝座就会摇晃,他就要遭殃!

昂起头来啊!兄弟们用不着懊丧,
囚禁、迫害、侮辱……那又有何妨?
我们是殉道者,光荣的囚犯,
这镣链是我们骄傲的勋章。

* * * * *

一个苍白的青年倚着桅樯,
仿佛已支不住镣链的重量,
他动也不动像一尊塑像,
只有眼晴星星般在发亮。

梦想什么呢?年轻的伙伴!
是想着千百里外的家乡?
是想着白发飘萧的老母?
是想着温柔情重的姑娘?

别再想了吧!别再去多想,
一切都已被剥夺得精光。
我们没有未来,我们没有幻想,
甚至不知道明天见不见太阳。

荒凉的海岛,阴暗的牢房,
一小时比一年更加漫长,
活着,锁链伴了呼吸的节奏起落,
死去,也还要带着镣链一起埋葬。

* * * * *
我想家乡么,也许是,
自小我在它怀中成长,
它甘芳的奶水将我哺养,
每当我闭上了双目遥想,
鼻端就泛起了乡土的芳香。

我想妈妈么,也许是,
妈妈头发上十年风霜,
忧患的皱纹刻满在面庞,
不孝的孩儿此去无返日,
老人家怕已痛断了肝肠!

我想爱人么,也许是,
我想她,我心中的仙女,
我们共有过多少美满的时光,
怎奈那无情棒生隔成两下,
要想见除非是梦魂归乡。

我到底在想什么,我这颗叛逆的
不平静的心,它是如此刚强,
尽管它已经流血滴滴,遍是创伤,
它依然叫着“自由”,用它全部的力量。

自由!我的心叫道:自由!
充满它的是对于自由的想望……
象濒于窒息的人呼求空气,
象即将渴死的人奔赴水浆。
象枯死的绿草渴望雨滴,
象萎黄的树木近向太阳,
象幼儿的乳母唤叫孩子,
象离母的婴孩索要亲娘。

我宁愿被放逐到穷山僻野,
宁愿在天幔下四处流浪,
宁愿去住在狐狸的洞里,
把清风当被,黄土当床。
宁愿去捡掘松子和野菜,
跟飞鸟们吃一样的食粮,
我宁愿牺牲一切甚至生命,
只要自由这瑰宝在我的身旁,
我宁愿让满腔沸腾的鲜血,
洒上那冰冷的枯瘠的土地,
宁愿把前途、爱情、幸福,
一起抛向这无限的波浪。
只要我的血象沥青一样,
铺平自由来到人间的道路,
我不惜把一切能够献出的东西,
完完全全地献作她自由的牲羊。

多少世纪,多少年代啊,自由!
人们追寻你像黑夜里追求太阳。
父亲在屠刀的闪光里微笑倒下,
儿子又默默地继承父亲的希望。
钢刀已经被牺牲者的筋骨磕钝,
铁锈也已经被囚徒们的皮肉磨光。
多难的土地啊,浸润着血泪,
山般高的白骨砌堆成狱墙,
埋葬的坟墓里多少死尸张着两眼,
为的是没能看见你,自由的曙光。
你究竟在哪里?自由!你需要多少代价?
为什么你竟象影子那么虚妄?
永远是恐怖的镣铐的暗影,
永远是张着虎口而狞笑的牢房,
永远是人对他们同类的迫害,
永远是专制——屠杀——暴政的灾殃。
不,你存在,自由啊!我相信你存在!
因为总是有了实体才造成影象,
怎么能够相信千百年来
最受到尊敬的高贵的名字,
只不过是一道虚幻的虹光。
那一天啊自由,你来到人间,
带着自信的微笑高举起臂膀,
于是地面上所有的锁链一齐断裂,
囚犯们从狱底里站起来欢呼解放!
哪一天啊,千百万为你牺牲的死者,
都会在地底下尽情纵声欢唱。
这声音将震撼山岳和河流,
深深地撼动大地的胸膛。
而那些带着最后的创伤的尸体,
他们睁开的双眼也会慢慢闭上。
那一天,我要狂欢,让嗓子喊得嘶哑,
不管我是埋在地下还是站在地上,
不管我是活人还是在死者的行列里,
我的歌永远为你——自由而唱。

* * * * *
远远地出现了一个黑点,
年青人睁大眼对它凝望,
听见谁轻声说:是一个岛,
他的心便猛然撞击胸膛。

海岛啊!你是个什么地方?
也许你不过是海鸥的栈房,
也许你荒僻没有人迹,
也许你常淹没在海的波浪。
但是这一切又算得什么?!
只要你没有禁锢自由的狱墙,
只要你没有束缚心灵的枷锁,
对于我来说你就是天堂。
勇敢的黑眼睛燃烧着光芒,
他走前一步,镣铐叮当作响,
暗暗地目测着水上的距离,
对自由的渴望给了他力量。

我能够游过去么?能还是不?
也许押送者的枪弹会把我追上,
也许沉重的镣铐会把我拖下水底,
也许大海的波浪会叫我身丧海浪,
我能游到那里么?能还是不?
我要试一试——不管会怎么样!
宁可做逃犯葬身在海底,
也强似在囚禁中憔悴地死亡。
不管付出什么代价,在我死去之前,
也得要吸一口自由的空气,
即使我有三十次生命的权利,
我也只会全都献到神圣的自由祭坛上。

别了,乡土和母亲!别了,爱我的你!
我的祝福将长和你们依傍。
别了,失败的战友!别了,不屈的伙伴!
你们是多么英勇又多么善良,
可惜我只能用眼睛和心拥抱你们,
愿你们活得高傲死得坚强!

别了,谁知道也许这就是永别,
但是我没法——为了追踪我们的理想。
啊!自由,宇宙间最最贵重的名字,
只要找到你,我们的一切牺牲,
便都获得了光荣的补偿…….

* * * * *
他握紧双拳一声响亮,
迸断的镣铐落在甲板上,
他象飞燕般纵到栏边,
深深吸口气投进了海洋。

枪弹追赶着他的行程,
波浪也卷着他死死不放,
那个黑点却还是那么遥远,
他只是奋力地泅向前方。

海风啊!为什么兴啸狂号?
海浪啊!为什么这样激荡?
臂膊象灌了铅那么沉重,
年青的逃犯用尽了力量。

最后一次努力浮上水面,
把自由的空气吸满了肺脏,
马上,一个大浪吞没了他,
从此他再没能游出水上。

押送者停止了活靶射击,
追捕的小艇也收起双桨。
难友们化石般凝视水面,
无声地哀悼壮烈的死亡。

……年青的伙伴,我们的兄弟,
难道你已经真葬身海洋?
难道我们再听不见你激情爽朗的声音?
再看不见你坚定果决的面庞?
难道我们再不能和你在一起战斗,
为争取自由的理想献出力量?
海浪啊,那么高那么凉,
我们的心却象火炭一样!
听啊!我们年青的兄弟,
悲壮的挽歌发自我们的心房:
记得你,无畏的英烈的形象,
记得你,为自由献身的榜样,
记得你啊,我们最最勇敢的战士,
在一场力量悬殊的战斗中,
你从容自若地迎接了死亡。
海浪啊,请抚慰我们年青的兄弟,
海风啊,把我们的挽歌散到四方,
象春风带着万千颗种子,
散向万千颗爱自由的心房…….

* * * * *
那是什么——囚人们且莫悲伤,
看啊!就在年轻人沉默的地方,
一只雪白的海鸥飞出了波浪,
展开宽阔的翅膀冲风翱翔。

就是他,我们不屈的斗士,
他冲进死亡去战胜了死亡,
残留的锁链已沉埋在海底,
如今啊,他自由得象风一样。

啊!海鸥!啊!英勇的叛徒,
他将在死者中蒙受荣光,
他的灵魂已经化为自由——
万里晴空下到处是家乡!

关于JAX-WS、JAXB、CXF之间的关系

1. JAX-WS2.0是一个JAVA API规范
2. JAXB是一个XML和对象之间绑定实现规范
3. CXF实现了JAX-WS2.0

2010年3月28日星期日

我的读书笔记-把时间当做朋友

初读本文,有醍醐灌顶之感,也颇有相见恨晚之意。关于兴趣的说法,是自己内心深处一直回避的。实际的情况是 ,因为做得不够好,没有从工作上获得足够的别人的尊重与认同,没有获得足够的满足感,所以我逐渐对从事的工作丧失了兴趣,并且形成了恶性循环:越没有兴趣就越不想学,越不学就越没有能够拿的出手的东西来获得别人的重视与认可,然后就日益的丧失兴趣。必须药打破这个循环,从自我提高做起。
  大脑太活跃 太易受外界干扰:对策,自己控制自己的大脑,而不是它控制你!
    做事情不够执着,成功的人方法没有共同点,但是都很执着,都很专注。
    做事情要有长远的眼光,推迟满足自己。

2010年3月26日星期五

能搜到ChinaNet信号的可以免费无线上网

能搜到ChinaNet信号的可以免费无线上网

刚搬了家,发现电脑的无线网络列表里面有个叫ChinaNet的无线网络,没有加密,但是连接上后打开浏览器却自动跳转到了电信的登录页面,要求输入帐号密码认证后才能上网。

  于是随便ping了个域名,发现可以解析成IP,但是无法ping通。这说明DNS通信是正常的,这说明还有一条秘密通道为我们开放着!我赶紧设置了下LoopcVPN的端口,一测果真能连上VPN服务器上网。

  为什么通过LoopcVPN软件就可以通过ChinaNet无线局域网免费上网呢?原来ChinaNet无线局域网使用的是DHCP+Web技术进行用户身份认证,该认证方式工作在应用层,为了实现在浏览器地址栏输入任意网址跳转到认证入口的功能,必须开放DNS端口(UDP 53)及Web端口(TCP 80)。可能是由于管理员的疏忽,某些认证系统并没有限制客户端访问DNS的IP地址,因此未经过认证的客户端是可以正常访问服务器的UDP 53端口的,而LoopcVPN软件恰好使用的是UDP 53端口,使得客户端能通过它实现代理上网。

  基于上面的道理,不仅仅是ChinaNet,包括CMCC无线局域网在某些地方也有这个配置上的漏洞,同样可以使用LoopcVPN来代理上网,当然一些不知名的小宽带公司有此漏洞也很正常。

2010年1月8日星期五

django框架学习笔记之四:URL映射和模板

django的模板语言与JSP和ASP类型,都是HTML中嵌入代码的方式,而且都是用<% %>来包含代码。django的模板语言没有jsp那么强大,在jsp中嵌入的java代码几乎能做任何事,相较之下django的模板语言功能要弱很多。因为二者的初衷不一样,django的设计思想估计还是尽可能的让表现层与业务层分割得更干净吧,不要在页面上嵌太多的业务逻辑。
django另一优秀的地方就是其url映射,相当的简洁和强大,用起来有一种很舒服的感觉。
下面的注册和登录考虑采用extjs+python的方式来展现,这样的话可能用到django模板语言的地方就会少很多了。
通过修改工程的urls.py脚本来实现url映射的处理。