当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

#

package com.heyang;

/**
 * 双色球摇奖
 * 
@author: 何杨(heyang78@gmail.com)
 * @date: 2009-2-20-下午10:52:55
 
*/

public class DoubleColorBall{
    
public static void main(String[] args){
        
int[] ballNumbers=getSevenNumbers();
        
        
for(int i:ballNumbers){
            System.out.print(i
+",");
        }

    }

    
    
/**
     * 得到七个随机数数组
     * 
@return
     
*/

    
public static int[] getSevenNumbers(){
        
final int arrLength=7;
        
int[] arr=new int[arrLength];
        
        
// 前六个从1-33中选取,如有重复再取一次
        do{
            
for(int i=0;i<=arrLength-2;i++){
                arr[i]
=getIntgerBetween(33,1);
            }

        }
while(hasDuplicatedItem(arr));
        
        
// 最后一个从1-15中选取
        arr[6]=getIntgerBetween(15,1);
        
        
return arr;
    }

    
    
/**
     * 位图法判断整形数组是否存在重复
     * 
@param arr
     * 
@return
     
*/

    
public static boolean hasDuplicatedItem(int[] arr){
        
// 找出数组中最大值
        int max=arr[0];
        
int min=max;
        
for(int i:arr){
            
if(max<i){
                max
=i;
            }

            
if(min>i){
                min
=i;
            }

        }

        
        
int[] newArr=new int[max-min+1];
        
for(int i:arr){
            
int index=i-min;
            
            
if(newArr[index]==0){
                
// 以前未在此位置存值
                newArr[index]=1;
            }

            
else{
                
// 以前已经在此位置存值
                return true;
            }

        }
    
        
        
return false;
    }


    
    
/**
     * 取得max与min之间的一个随机整数,包括min和max两值
     * 
@param max
     * 
@param min
     * 
@return
     
*/

    
public static int getIntgerBetween(int max,int min){
        
int interval=max-min;        
        
        
return (int)Math.round((Math.random()*interval))+min;
    }

}
posted @ 2009-02-21 07:23 何杨 阅读(287) | 评论 (0)编辑 收藏

 

package com.heyang;

/**
 * 概率法求PI
 * 
@author: 何杨(heyang78@gmail.com)
 * @date: 2009-2-19-下午07:08:57
 
*/

public class FindPie{
    
public static void main(String[] args){
        
int count=100;
        
double simuPie;
        
        
do{
            simuPie
=getPie(count);
            count
+=10;
        }
while(isEquslPie(simuPie)==false);
          
        System.out.println(
"当数量为"+count+"时按概率法得到的Pi="+simuPie+"接近圆周率"+Math.PI);
    }
    
    
    
public static double getPie(int count){
        
int countIntheCorcle=0;
        
        
for(int i=0;i<count;i++){
            
double x=Math.random()-0.5;
            
double y=Math.random()-0.5;
            
            
if(Math.sqrt(x*x+y*y)<0.5){
                countIntheCorcle
++;
            }

        }

               
        
return (double)(4.0d*countIntheCorcle/count);
    }

    
    
public static boolean isEquslPie(double simuPie){
        
return isEqual(simuPie,Math.PI);
    }

    
    
private static boolean isEqual(double a,double b){
        
final double epsilon=0.000001;
        
        
return Math.abs(a-b)<epsilon;
    }

}

结果:
当数量为98150时按概率法得到的Pi=3.141593641736295接近圆周率3.141592653589793
posted @ 2009-02-19 17:32 何杨 阅读(272) | 评论 (0)编辑 收藏

HttpUnit网址:http://httpunit.sourceforge.net

要在工程中使用HttpUnit,需要下载httpunit1.7.0.zip包,并把其中lib及jars目录中的包加载到工程中。

连接网页并取得网页文本示例:
// 打开一个Web会话,WebConversation的实例模拟一个Web浏览器,用来请求一个Web资源
        WebConversation wc=new WebConversation();
        
        
// 向网址http://www.baidu.com发出请求
        WebRequest req=new GetMethodWebRequest("http://www.baidu.com");
        
        
try {
            
// 获得http://www.baidu.com的响应
            WebResponse resp=wc.getResponse(req);
            
            
// 打印表示整个Web页面的字符串
            System.out.println(resp.getText());
            
            
// resp.getDOM()方法返回一个表示整个Web页面的XML文档
            
// resp.getForms()方法返回Web页面的中的表单数组
            
// resp.getTables()方法返回Web页面的中的表格数组
            
// resp.getLinks()方法返回Web页面的中的链接数组
            
// resp.getImages()方法返回Web页面的中的图片数组
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 catch (SAXException e) {
            e.printStackTrace();
        }

模拟在百度输入“金融危机”并取得查询结果的例子:
WebConversation wc=new WebConversation();
        
        WebRequest request
=new GetMethodWebRequest("http://www.baidu.com");
        
try {
            WebResponse response
=wc.getResponse(request);
            
            
// 取得Web页面中第一个Form
            WebForm form=response.getForms()[0];
            request
=form.getRequest();
            
            
// 设置查询主题为"金融危机“,wd是查询文本框的name
            request.setParameter("wd""金融危机");
            
            
// 取得并在控制台打印响应
            response=wc.getResponse(request);
            System.out.println(response.getText());
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 catch (SAXException e) {
            e.printStackTrace();
        }


posted @ 2009-02-17 15:08 何杨 阅读(400) | 评论 (0)编辑 收藏

在数据库操作中,一项事务是由一条或者多条表达式所组成的一个不可分割的工作单元。
事务必须遵循ACID原则,即:
原子性(Atomicity):事务必须完全执行或者完全不执行,任何任务失败都将导致整个事务回滚。
一致性(Consistency):指原始数据库的完整性,事务系统通过确保事务是原子性,隔离性和持续性来实现一致性。
隔离性(Isolation):事物的执行必须不受其它进程或者事务的干扰。
持续性(Durabilty):意味着所有事务过程中的数据更改在事务成功之前必须写入某些物理介质,确保系统崩溃时数据更改不会丢失。

JDBC事务管理

JDBC中引入一批语句对事务进行支持,它们是:
Connection.setAutoCommit(True or fasle);设置事务是否自动提交,它的参数缺省是true.要进行事务处理的话,参数应该设置为false.
Connection.commit():从setAutoCommit语句开始,到commit语句之间算作一个数据库事务,其中的数据库操作要么全成功要么全失败.所有在调用commit方法之前的SQL语句都可以被回滚,然而,一旦commit()方法被调用,执行过的SQL语句就不能再回滚.
Rollback():事务回滚,如果事务中有一个步骤出现错误,那么调用这个方法将使数据库恢复到执行事务之前的状态,这样,事务的原子性就得到了保证.

下面是使用事务处理的例程:

Connection conn=null;
Statement statement
=null;

try{
  Class.forName(
"org.gjt.mm.mysql.Driver");
  conn
=DriverManager.getConnection("jdbc:mysql://127.0.0.1/test""root""hy");
  statement
=conn.createStatement();
  
  conn.setAutoCommit(
false);            
  
int changeCount1=statement.executeUpdate(" update employee set salary=salary-10000 where NAME='郭德纲' ");
  
int changeCount2=statement.executeUpdate(" update employee set salary=salary+10000 where NAME='于谦'  ");
        
  
if(changeCount1==1 && changeCount2==1){
    conn.commit();
  }

  
else{
    conn.rollback();
  }

}

catch(SQLException se){
  
try{
    conn.rollback();
  }

  
catch(Exception ex){
    ex.printStackTrace();
  }

}


JDBC事务管理的问题

以上事务处理代码是以数据库的记录为核心来考虑的,即使用Java代码通过JDBC和SQL语句直接操作数据库中的记录,这种传统方式在现代程序中已经不多见,现代程序多把记录归纳成领域对象,然后使用领域对象对应的DAO来完成领域对象与数据库之间的交互。除了DAO层外,其它层次不与数据库发生联系。因此,上面的直接使用JDBC进行事务处理就不适用了,试想AccountService中有一个方法执行两个帐户之间的转账,这个方法要具备事务功能必须绕过DAO层书写底层的JDBC代码,这是层次明晰纪律严明的系统所不能接受的,好在我们有Spring的事务处理可以帮我们摆脱两难境地。

使用Spring进行事务处理

Spring对程序控制事务管理的支持和EJB有很大不同,EJB的事务管理和JTA密不可分,而Spring使用了一种回调机制,把真实的食物实现从事务代码中抽象出来。实际上Spring的事务管理甚至不需要JTA,它也可以使用持久化机制本身多提供的事务管理支持。下面就是使用JDBC作为应用的持久化机制的事务管理示例代码:

首先,在上下文定义文件中写入JDBC事务管理器的bean定义。

<bean id="transactionManager"
 class
="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 
<property name="dataSource">
  
<ref bean="dataSource" />
 
</property>
</bean>


它需要一个数据源的支持,数据源定义示例如下:

<bean id="dataSource"
 class
="org.springframework.jdbc.datasource.DriverManagerDataSource">
 
<property name="driverClassName"
  value
="org.gjt.mm.mysql.Driver">
 
</property>
 
<property name="url" value="jdbc:mysql://127.0.0.1/test">
 
</property>
 
<property name="username" value="root"></property>
 
<property name="password" value="hy"></property>
</bean>

 

JDBC事务管理器会作为事务管理模板的一个属性注入进入。

<bean id="transactionTemplate"
 class
="org.springframework.transaction.support.TransactionTemplate">
 
<property name="transactionManager">
  
<ref bean="transactionManager" />
 
</property>
</bean>

 

而事务管理模板又作为一个属性注入到AccountService中。

<bean id="accountService"
 class
="com.heyang.service.AccountService">
 
<property name="dao" ref="accountDao"/> 
 
<property name="table" value="SpringTransaction_Account"/>
 
<property name="transactionTemplate">
  
<ref bean="transactionTemplate" />
 
</property>
</bean>

 

到这里,在transactionTemplate的帮助下,AccountService就具备了事务处理功能,下面转账函数的具体代码:

public void transfer(final Account from,final Account to,final int count){
 transactionTemplate.execute(
  
new TransactionCallback(){
   
public Object doInTransaction(TransactionStatus ts){
    
try{
     
if(count>from.getCount()){
      
throw new Exception("转出的帐户"+from+"余额不足");
     }

     
     
if(count>5000){
      
throw new Exception("转出的金额超过了中纪委限定的额度5000");
     }

     
     
// 转出帐户减去转账金额
     from.setCount(from.getCount()-count);
     update(from);
     
     
// 转入帐户加上转账金额
     to.setCount(to.getCount()+count);
     update(to);
    }

    
catch(Exception ex){
     ex.printStackTrace();
     
// 出现任何异常即回滚
     ts.setRollbackOnly();
    }

    
    
// 如果成功,事务被提交
    return null;
   }

  }

 );
}


以上代码中,执行转账的业务代码放在try块中,如果全部代码执行成功,事务将会被提交;如果如下任何异常,事务会被回滚,出现异常前的任何修改点将被恢复到初始状态。

下面是模拟转账的具体代码:

ApplicationContext context=new ClassPathXmlApplicationContext("appCtx.xml");

AccountService service
=(AccountService)context.getBean("accountService"); 

// 准备测试数据
/* 建表语句如下
 * create table SpringTransaction_Account(
     id INTEGER(10) primary key not null , 
     name VARCHAR(255), 
     count INTEGER(255) 
  ) 
*/

//Account andy=new Account("andy",3000);
//service.create(andy);  
//Account bill=new Account("bill",5000);
//service.create(bill); 

// 从数据库取得帐户Andy,11是其ID
Account andy=service.getAccount("11");
Account bill
=service.getAccount("12");

// 从Andy帐户转出4000给Bill,如果Andy帐户余额低于4000将不会通过事务处理
service.transfer(andy, bill, 4000);

// 从Andy帐户转出1000给Bill,如果Andy帐户余额低于1000将不会通过事务处理
service.transfer(andy, bill, 1000);

// 从Bill帐户转出5500给Andy,因为转账额度大于中纪委规定的5000因此不会通过事务处理
service.transfer(bill, andy, 5500);


以上就是使用Spring进行事务管理的主要流程,根据应用的持久化机制的不同,Spring还提供了HibernateTransactionManger,JdoTransactionManger,OjbTransactionManger,JtaTransactionManger等事务管理器供用户选择,修改一下上面的transactionManager配置部分即可。

本例中使用到的代码下载:
http://www.blogjava.net/Files/heyang/SpringTransaction.rar

如果使用Hibernate作为程序持久介质请下载:
http://www.blogjava.net/Files/heyang/SpringHibernateTransaction.rar

posted @ 2009-02-13 10:54 何杨 阅读(1094) | 评论 (0)编辑 收藏

     摘要: 我们知道,在Struts1.x中,大致的内部处理流程是这样的:ActionServlet作为中央处理器,它配置在Web.xml中,接受所有*.do的请求,然后解析URI,得到*.do中的*部分,即path,然后根据path在struts-config.xml中找到具体处理业务的Action以及与之配套的ActionForm和ActionForward,再根据Action的type用Java反射机制生成Action的实例进行具体业务处理,如果Action有ActionForm也会用反射机制生成form传递到函数execute中,该函数返回一个ActionForward对象给ActionServlet,如果它不是空,ActionServlet会从中取出URl进行页面跳转,否则不采取行动。

实际上,要抛开Struts框架,自己实现这样一套流程并不很困难,利用Servlet,正则表达式,XML解析,反射和BeanUtils的相关知识就能实现一个。这样不但能巩固相关知识点的掌握,也能对Struts框架有进一步的理解。下面就是我按自己的理解完成的Struts内部流程的具体实现,事  阅读全文
posted @ 2009-02-12 15:12 何杨 阅读(3962) | 评论 (1)编辑 收藏

     摘要: 如果数组中重复元素少,比较符合正态分布,那么这种方法还是比较高效的。  阅读全文
posted @ 2009-02-11 08:56 何杨 阅读(1555) | 评论 (0)编辑 收藏

package com.heyang;

/**
 * 诸葛亮要派出五虎上将中的三员执行任务,请列出所有可能的组合
 * 
@author 何杨(heyang78@gmail.com)
 *
 * 
@since 2009-2-11 上午08:29:25
 * 
@version 1.00
 
*/

public class Combiner {
    
static char[] arr={'','','','',''};

    
public static void main(String[] args) {
        
int[] arr = new int[3];
        combine(
53, arr);
    }


    
public static void combine(int total, int chooseCount, int selectedArr[]) {
        
for (int i = total; i >= chooseCount; i--){
            selectedArr[chooseCount 
- 1= i - 1;
            
            
if (chooseCount > 1){
                combine(i 
- 1, chooseCount - 1, selectedArr);
            }

            
else 
            
{
                
for (int j = selectedArr.length - 1; j >= 0; j--{
                    System.out.print(arr[selectedArr[j]] 
+ ",");
                }

                System.out.println();
            }

        }

    }

}


结果:
 1黄,马,赵,
 2黄,马,张,
 3黄,马,关,
 4黄,赵,张,
 5黄,赵,关,
 6黄,张,关,
 7马,赵,张,
 8马,赵,关,
 9马,张,关,
10赵,张,关,

排列代码:
package com.heyang;

/**
 * 全排列代码
 * 赵钱孙李四人排队,求所有排队方案
 * 
 * 
@author 何杨(heyang78@gmail.com)
 *
 * 
@since 2009-2-11 下午01:26:45
 * 
@version 1.00
 
*/

public class Permutation{
    
public static void main(String[] args){
        Character[] arr
={'','','',''};
        permutation(arr,
0,arr.length);
    }

    
    
public static void permutation(Object[] arr,int start,int end){
        
if(start<end+1){
            permutation(arr,start
+1,end);
            
            
for(int i=start+1;i<end;i++){
                Object temp;
                
                temp
=arr[start];
                arr[start]
=arr[i];
                arr[i]
=temp;
                
                permutation(arr,start
+1,end);
                
                temp
=arr[i];
                arr[i]
=arr[start];
                arr[start]
=temp;
            }

        }

        
else{
            
for(int i=0;i<end;i++){
                System.out.print(arr[i]);
            }

            System.out.print(
"\n");
        }

    }

}


排列结果:
 1赵钱孙李
 2赵钱李孙
 3赵孙钱李
 4赵孙李钱
 5赵李孙钱
 6赵李钱孙
 7钱赵孙李
 8钱赵李孙
 9钱孙赵李
10钱孙李赵
11钱李孙赵
12钱李赵孙
13孙钱赵李
14孙钱李赵
15孙赵钱李
16孙赵李钱
17孙李赵钱
18孙李钱赵
19李钱孙赵
20李钱赵孙
21李孙钱赵
22李孙赵钱
23李赵孙钱
24李赵钱孙
posted @ 2009-02-11 08:32 何杨 阅读(264) | 评论 (0)编辑 收藏

“文无第一,武无第二”,技术人员如果相遇和后者相似,不是你压过他,就是他压过你,哪怕是一星半点。即使是客套也会招来对方的轻蔑,就像在擂台上,没说的,直接开打吧。
 

你在为谁而“玩”?

一)成长的寓言:做一棵永远成长的苹果树

  一棵苹果树,终于结果了。

  第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走,自己得到1个。“哈哈,去年我得到了10%,今年得到20%!翻了一番。”这棵苹果树心理平衡了。

  但是,它还可以这样:继续成长。譬如,第二年,它结了100个果子,被拿走90个,自己得到10个。

  很可能,它被拿走99个,自己得到1个。但没关系,它还可以继续成长,第三年结1000个果子……

  其实,得到多少果子不是最重要的。最重要的是,苹果树在成长!等苹果树长成参天大树的时候,那些曾阻碍它成长的力量都会微弱到可以忽略。真的,不要太在乎果子,成长是最重要的。

  【心理点评】你是不是一个已自断经脉的打工族?

  刚开始工作的时候,你才华横溢,意气风发,相信“天生我才必有用”。但现实很快敲了你几个闷棍,或许,你为单位做了大贡献没人重视;或许,只得到口头重视但却得不到实惠;或许……总之,你觉得就像那棵苹果树,结出的果子自己只享受到了很小一部分,与你的期望相差甚远。

  于是,你愤怒、你懊恼、你牢骚满腹……最终,你决定不再那么努力,让自己的所做去匹配自己的所得。几年过去后,你一反省,发现现在的你,已经没有刚工作时的激情和才华了。

  “老了,成熟了。”我们习惯这样自嘲。但实质是,你已停止成长了。

  这样的故事,在我们身边比比皆是。

  之所以犯这种错误,是因为我们忘记生命是一个历程,是一个整体,我们觉得自己已经成长过了,现在是到该结果子的时候了。我们太过于在乎一时的得失,而忘记了成长才是最重要的。

  好在,这不是金庸小说里的自断经脉。我们随时可以放弃这样做,继续走向成长之路。

  切记:如果你是一个打工族,遇到了不懂管理、野蛮管理或错误管理的上司或企业文化,那么,提醒自己一下,千万不要因为激愤和满腹牢骚而自断经脉。不论遇到什么事情,都要做一棵永远成长的苹果树,因为你的成长永远比每个月拿多少钱重要

  (二)动机的寓言:孩子在为谁而玩

  一群孩子在一位老人家门前嬉闹,叫声连天。几天过去,老人难以忍受。

  于是,他出来给了每个孩子25美分,对他们说:“你们让这儿变得很热闹,我觉得自己年轻了不少,这点钱表示谢意。”

  孩子们很高兴,第二天仍然来了,一如既往地嬉闹。老人再出来,给了每个孩子15美分。他解释说,自己没有收入,只能少给一些。15美分也还可以吧,孩子仍然兴高采烈地走了。

  第三天,老人只给了每个孩子5美分。

  孩子们勃然大怒,“一天才5美分,知不知道我们多辛苦!”他们向老人发誓,他们再也不会为他玩了!

  【心理点评】你在为谁而“玩”

  这个寓言是苹果树寓言的更深一层的答案:苹果树为什么会自断经脉,因为它不是为自己而“玩”。

  人的动机分两种:内部动机和外部动机。如果按照内部动机去行动,我们就是自己的主人。如果驱使我们的是外部动机,我们就会被外部因素所左右,成为它的奴隶。  

        在这个寓言中,老人的算计很简单,他将孩子们的内部动机“为自己快乐而玩”变成了外部动机“为得到美分而玩”,而他操纵着美分这个外部因素,所以也操纵了孩子们的行为。寓言中的老人,像不像是你的老板、上司?而美分,像不像是你的工资、奖金等各种各样的外部奖励?

  如将外部评价当作参考坐标,我们的情绪就很容易出现波动。因为,外部因素我们控制不了,它很容易偏离我们的内部期望,让我们不满,让我们牢骚满腹。不满和牢骚等负性情绪让我们痛苦,为了减少痛苦,我们就只好降低内部期望,最常见的方法就是减少工作的努力程度。

  一个人之所以会形成外部评价体系,最主要的原因是父母喜欢控制他。父母太喜欢使用口头奖惩、物质奖惩等控制孩子,而不去理会孩子自己的动机。久而久之,孩子就忘记了自己的原初动机,做什么都很在乎外部的评价。上学时,他忘记了学习的原初动机---好奇心和学习的快乐;工作后,他又忘记了工作的原初动机---成长的快乐,上司的评价和收入的起伏成了他工作的最大快乐和痛苦的源头。

  切记:外部评价系统经常是一种家族遗传,但你完全可以打破它,从现在开始培育自己的内部评价体系,让学习和工作变成“为自己而玩”。

  (三)规划的寓言:把一张纸折叠51次

  想象一下,你手里有一张足够大的白纸。现在,你的任务是,把它折叠51次。那么,它有多高?

  一个冰箱?一层楼?或者一栋摩天大厦那么高?不是,差太多了,这个厚度超过了地球和太阳之间的距离。

  【心理点评】

  到现在,我拿这个寓言问过十几个人了,只有两个人说,这可能是一个想象不到的高度,而其他人想到的最高的高度也就是一栋摩天大厦那么高。

  折叠51次的高度如此恐怖,但如果仅仅是将51张白纸叠在一起呢?

  这个对比让不少人感到震撼。因为没有方向、缺乏规划的人生,就像是将51张白纸简单叠在一起。今天做做这个,明天做做那个,每次努力之间并没有一个联系。这样一来,哪怕每个工作都做得非常出色,它们对你的整个人生来说也不过是简单的叠加而已。

  当然,人生比这个寓言更复杂一些。有些人,一生认定一个简单的方向而坚定地做下去,他们的人生最后达到了别人不可企及的高度。譬如,我一个朋友的人生方向是英语,他花了十数年努力,仅单词的记忆量就达到了十几万之多,在这一点上达到了一般人无法企及的高度。

  也有些人,他们的人生方向也很明确,譬如开公司做老板,这样,他们就需要很多技能???专业技能、管理技能、沟通技能、决策技能等等。他们可能会在一开始尝试做做这个,又尝试做做那个,没有一样是特别精通的,但最后,开公司做老板的这个方向将以前的这些看似零散的努力统合到一起,这也是一种复杂的人生折叠,而不是简单的叠加。

  切记:看得见的力量比看不见的力量更有用

  现在,流行从看不见的地方寻找答案,譬如潜能开发,譬如成功学,以为我们的人生要靠一些奇迹才能得救。但是,在我看来,东莞恒缘心理咨询中心的咨询师毛正强说得更正确,“通过规划利用好现有的能力远比挖掘所谓的潜能更重要。”

  (四)逃避的寓言:小猫逃开影子的招数

  “影子真讨厌!”小猫汤姆和托比都这样想,“我们一定要摆脱它。”

  然而,无论走到哪里,汤姆和托比发现,只要一出现阳光,它们就会看到令它们抓狂的自己的影子。

  不过,汤姆和托比最后终于都找到了各自的解决办法。汤姆的方法是,永远闭着眼睛。托比的办法则是,永远待在其他东西的阴影里。

  【心理点评】

  这个寓言说明,一个小的心理问题是如何变成更大的心理问题的。

  可以说,一切心理问题都源自对事实的扭曲。什么事实呢?主要就是那些令我们痛苦的负性事件。

  因为痛苦的体验,我们不愿意去面对这个负性事件。但是,一旦发生过,这样的负性事件就注定要伴随我们一生,我们能做的,最多不过是将它们压抑到潜意识中去,这就是所谓的忘记。

  但是,它们在潜意识中仍然会一如既往地发挥作用。并且,哪怕我们对事实遗忘得再厉害,这些事实所伴随的痛苦仍然会袭击我们,让我们莫名其妙地伤心难过,而且无法抑制。这种疼痛让我们进一步努力去逃避。

  发展到最后,通常的解决办法就是这两个:要么,我们像小猫汤姆一样,彻底扭曲自己的体验,对生命中所有重要的负性事实都视而不见;要么,我们像小猫托比一样,干脆投靠痛苦,把自己的所有事情都搞得非常糟糕,既然一切都那么糟糕,那个让自己最伤心的原初事件就不是那么疼了。

  白云心理医院的咨询师李凌说,99%的吸毒者有过痛苦的遭遇。他们之所以吸毒,是为了让自己逃避这些痛苦。这就像是躲进阴影里,痛苦的事实是一个魔鬼,为了躲避这个魔鬼,干脆把自己卖给更大的魔鬼。

  还有很多酗酒的成人,他们有过一个酗酒而暴虐的老爸,挨过老爸的不少折磨。为了忘记这个痛苦,他们学会了同样的方法。

  除了这些看得见的错误方法外,我们人类还发明了无数种形形色色的方法去逃避痛苦,弗洛伊德将这些方式称为心理防御机制。太痛苦的时候,这些防御机制是必要的,但糟糕的是,如果心理防御机制对事实扭曲得太厉害,它会带出更多的心理问题,譬如强迫症、社交焦虑症、多重人格,甚至精神分裂症等。

  真正抵达健康的方法只有一个--直面痛苦。直面痛苦的人会从痛苦中得到许多意想不到的收获,它们最终会变成当事人的生命财富。

  切记:阴影和光明一样,都是人生的财富。

  一个最重要的心理规律是,无论多么痛苦的事情,你都是逃不掉的。你只能去勇敢地面对它,化解它,超越它,最后和它达成和解。如果你自己暂时缺乏力量,你可以寻找帮助,寻找亲友的帮助,或寻找专业的帮助,让你信任的人陪着你一起去面对这些痛苦的事情。

  美国心理学家罗杰斯曾是最孤独的人,但当他面对这个事实并化解后,他成了真正的人际关系大师;美国心理学家弗兰克有一个暴虐而酗酒的继父和一个糟糕的母亲,但当他挑战这个事实并最终从心中原谅了父母后,他成了治疗这方面问题的专家;日本心理学家森田正马曾是严重的神经症患者,但他通过挑战这个事实并最终发明出了森田疗法……他们生命中最痛苦的事实最后都变成了他们最重要的财富。你,一样也可以做到。

  (五)行动的寓言--螃蟹、猫头鹰和蝙蝠

  螃蟹、猫头鹰和蝙蝠去上恶习补习班。数年过后,它们都顺利毕业并获得博士学位。不过,螃蟹仍横行,猫头鹰仍白天睡觉晚上活动,蝙蝠仍倒悬。

  【心理点评】

  这是黄永玉大师的一个寓言故事,它的寓意很简单:行动比知识重要

  用到心理健康中,这个寓言也发人深省。

  心理学的知识堪称博大精深。但是,再多再好的心理学知识也不能自动帮助一个人变得更健康。其实,我知道的一些学过多年心理学的人士,他们学心理学的目的之一就是要治自己,但学了这么多年以后,他们的问题依旧。

  之所以出现这种情况,一个很重要的原因是,他们没有身体力行,那样知识就只是遥远的知识,知识并没有化成他们自己的生命体验。

  我的一个喜欢心理学的朋友,曾被多名心理学人士认为不敏感,不适合学心理学。但事实证明,这种揣测并不正确。他是不够敏感,但他有一个非常大的优点:知道一个好知识,就立即在自己的生命中去执行。这样一来,那些遥远的知识就变成了真切的生命体验,他不必“懂”太多,就可以帮助自己,并帮助很多人。

  如果说,高敏感度是一种天才素质,那么高行动力是更重要的天才素质。

  这个寓言还可以引申出另一种含义:不要太指望神秘的心理治疗的魔力。最重要的力量永远在你自己的身上,奥秘的知识、玄妙的潜能开发、炫目的成功学等等,都远不如你自己身上已有的力量重要。我们习惯去外面寻找答案,去别人那里寻找力量,结果忘记了力量就在自己身上。

  切记:别人的知识不能自动地拯救你

  如果一些连珠的妙语打动了你,如果一些文字或新信条启发了你。那么,这些别人的文字和经验都只是一个开始,更重要的是,你把你以为好的知识真正运用到你自己的生命中去。

  犹太哲学家马丁?布伯的这句话,我一直认为是最重要的:

  你必须自己开始。假如你自己不以积极的爱去深入生存,假如你不以自己的方式去为自己揭示生存的意义,那么对你来说,生存就将依然是没有意义的。  

      (六)放弃的寓言:蜜蜂与鲜花

  玫瑰花枯萎了,蜜蜂仍拼命吮吸,因为它以前从这朵花上吮吸过甜蜜。但是,现在在这朵花上,蜜蜂吮吸的是毒汁。

  蜜蜂知道这一点,因为毒汁苦涩,与以前的味道是天壤之别。于是,蜜蜂愤不过,它吸一口就抬起头来向整个世界抱怨,为什么味道变了?!

  终于有一天,不知道是什么原因,蜜蜂振动翅膀,飞高了一点。这时,它发现,枯萎的玫瑰花周围,处处是鲜花。

  【心理点评】

  这是关于爱情的寓言,是一位年轻的语文老师的真实感悟。

  有一段时间,她失恋了,很痛苦,一直想约我聊聊,希望我的心理学知识能给她一些帮助。我们一直约时间,但快两个月过去了,两人的时间总不能碰巧凑在一起。

  最后一次约她,她说:“谢谢!不用了,我想明白了。”

  原来,她刚从九寨沟回来。失恋的痛苦仍在纠缠她,让她神情恍惚,不能享受九寨沟的美丽。不经意的时候,她留意到一只小蜜蜂正在一朵鲜花上采蜜。那一刹那间,她脑子里电闪雷鸣般地出现了一句话:“枯萎的鲜花上,蜜蜂只能吮吸到毒汁。”

  当然,大自然中的小蜜蜂不会这么做,只有人类才这么傻,她这句话里的蜜蜂当然指她自己。这一刹那,她顿悟出了放弃的道理。以前,她想让我帮她走出来,但翅膀其实就长在她自己身上,她想飞就能飞。

  放弃并不容易,爱情中的放弃尤其令人痛苦。因为,爱情是对我们幼小时候的亲子关系的复制。幼小的孩子,无论从哪个方面看,都离不开爸爸妈妈。如果爸爸妈妈完全否定他,那对他来说就意味着死亡,这是终极的伤害和恐惧。我们多多少少都曾体验过被爸爸妈妈否定的痛苦和恐惧,所以,当爱情???这个亲子关系的复制品再一次让我们体验这种痛苦和恐惧时,我们的情绪很容易变得非常糟糕。

  不过,爱情和亲子关系相比,有一个巨大的差别:小时候,我们无能为力,一切都是父母说了算;但现在,我们长大了,我们有力量自己去选择自己的命运。可以说,童年时,我们是没有翅膀的小蜜蜂,但现在,我们有了一双强有力的翅膀了。

  但是,当深深地陷入爱情时,我们会回归童年,我们会忘记自己有一双可以飞翔的翅膀。等我们自己悟出这一点后,爱情就不再会是对亲子关系的自动复制,我们的爱情就获得了自由,就有了放弃的力量。

  切记:爱情是两个人的事情,两个完全平等的、有独立人格的人的事情。你可以努力,但不是说,你努力了就一定会有效果,因为另一个人,你并不能左右。

  所以,无论你多么在乎一次爱情,如果另一个人坚决要离开你,请尊重他的选择。

  并且,还要记得,你不再是童年,只能听凭痛苦的折磨。你已成人,你有一双强有力的翅膀,你完全可以飞出一个已经变成毒药的关系。

  (七)亲密的寓言:独一无二的玫瑰

  小王子有一个小小的星球,星球上忽然绽放了一朵娇艳的玫瑰花。以前,这个星球上只有一些无名的小花,小王子从来没有见过这么美丽的花,他爱上这朵玫瑰,细心地呵护她。

  那一段日子,他以为,这是一朵人世间唯一的花,只有他的星球上才有,其他的地方都不存在。

  然而,等他来到地球上,发现仅仅一个花园里就有5000朵完全一样的这种花朵。这时,他才知道,他有的只是一朵普通的花。

  一开始,这个发现,让小王子非常伤心。但最后,小王子明白,尽管世界上有无数朵玫瑰花,但他的星球上那朵,仍然是独一无二的,因为那朵玫瑰花,他浇灌过,给她罩过花罩,用屏风保护过,除过她身上的毛虫,还倾听过她的怨艾和自诩,聆听过她的沉默……一句话,他驯服了她,她也驯服了他,她是他独一无二的玫瑰。

  “正因为你为你的玫瑰花费了时间,这才使你的玫瑰变得如此重要。”一只被小王子驯服的狐狸对他说。

  【心理点评】

  这是法国名著《小王子》中一个有名的寓言故事,我曾读过十数遍,但仍然是直到2005年才明白这一点。

  面对着5000朵玫瑰花,小王子说:“你们很美,但你们是空虚的,没有人能为你们去死。”

  只有倾注了爱,亲密关系才有意义。但是,现在我们越来越流行空虚的“亲密关系”,最典型的就是因网络而泛滥的一夜情。

  我们急着去拥有。仿佛是,每多拥有过一朵玫瑰,自己的生命价值就多了一分。网络时代,拥有过数十名情人,已不再是太罕见的事情。但我所了解的这些滥情者,没有一个是不空虚的。他们并不享受关系,他们只享受征服。

  “征服欲望越强的人,对于关系的亲密度越没有兴趣。”广州白云心理医院的咨询师荣玮龄说,“没有拥有前,他们会想尽一切办法拉近关系的距离。但一旦拥有后,他们会迅速丧失对这个亲密关系的兴趣。征服欲望越强,丧失的速度越快。”

  对于这样的人,一个玫瑰园比起一朵独一无二的玫瑰花来,更有吸引力。

  然而,关系的美,正在乎两人的投入程度和被驯服程度。当两个人都自然而然地去投入,自然而然地被驯服后,关系就会变成人生养料,让一个人的生命变得更充盈、更美好。

  但是,无论多么亲密。小王子仍是小王子,玫瑰仍是玫瑰,他们仍然是两个个体。如果玫瑰不让小王子旅行,或者小王子旅行时非将玫瑰花带在身上,两者一定要黏在一起,关系就不再是享受,而会变成一个累赘。

  切记:一个既亲密而又相互独立的关系,胜于一千个一般的关系。这样的关系,会把我们从不可救药的孤独感中拯救出来,是我们生命中最重要的一种救赎。

  如果不曾体验过,你就无法知道这种关系的美.

posted @ 2009-02-09 22:51 何杨| 编辑 收藏

     摘要: 这应该是最后一次用字符串去分析解读SQL了,效果比上次要好些,但在函数和别名方面有点差强人意,再想前进一定要用到词法分析,语法树和表达式解析等,字符串解读差不多已经到极限了。 package com.sitinspring.common.sqlformatter2; /** *//**  * SQL整形器类  * @aut...  阅读全文
posted @ 2009-02-05 22:57 何杨 阅读(398) | 评论 (0)编辑 收藏

     摘要: 在函数和别名处理上还有些问题,但比上一版已经好一些了。现在单句多句都能整形了。   1原始的Sql为:   2select ( * )  from dual   3解析后的的Sql为:   4select   5 &...  阅读全文
posted @ 2009-02-05 16:19 何杨 阅读(554) | 评论 (0)编辑 收藏

仅列出标题
共28页: First 上一页 20 21 22 23 24 25 26 27 28 下一页