《美国数学月刊》登载了一个有趣的数学问题:3名男子参加一个以气球为目标的投镖游戏。每个人都用飞镖攻击另外2个人的气球,气球被戳破的要出局,最后幸存的是胜者。
3名选手水平不一,在固定标靶的测试中,老大10投8中,命中率80%。老二和老三的命中率分别为60%和40%。现在,3个人一起角逐,谁最有可能获胜?
答案看似简单,投得准的会取胜。而实际上,一开场,每个人都希望先把另外2个对手中的强者灭掉,自己才安全,下面的比赛也轻松。于是,老大专攻老二,老二、老三就攻老大,结果,水平最高的老大最易出局,水平最差的老三最安全!
老大自然不会那么蠢,他会游说老二:“我们合伙把老三那小子灭了,这样,你我胜率都高!”
但是,老二会这样想老大:“你想得美!若我们灭了老三,然后对打,我还不是处在劣势?”
老大和老二的合作有了裂痕。
耶鲁大学煺研究所的经济学教授马丁·苏比克,讨论过另一种策略:“老大会对老二保持一种威慑:‘我不攻击你,你也别攻击我,否则,我将不顾一切地回击你!’这样一来,就会造成新的局面。老二岂肯善罢甘休,也会以同样的方式威胁老三,那么,三人的胜率又是……”
若2个男人比赛,问题再简单不过;若多出1人,问题就复杂了许多倍。
摒弃复杂的数学和社会问题,还原为一些简单的生活道理:面对一个强者,弱者只能接受失败;面对一群强者,弱者反而有了更多的周旋空间。
posted @
2008-08-09 16:19 x.matthew 阅读(610) |
评论 (3) |
编辑 收藏
摘要: 今天在DZone网站看到发布两个新的笔记帮助卡片,下载看一下感觉很不错,所以推荐给大家。不过除了今天要推荐的 Design Patterns和GlassFish以外,DZone RefCards还有很多不错的学习笔记卡片可供下载,有兴趣的朋友可以去官网下载。
阅读全文
posted @
2008-07-18 12:58 x.matthew 阅读(1455) |
评论 (4) |
编辑 收藏
摘要: 声明:本博客属作者原创,如果任何网站转载本文,请注明作者及引用来源,谢谢合作!
关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍。如果不清楚的,那只能等我把single sign on这块整理出来后再了解了。当然去cas官方网站也是有很多的文章进行介绍。cas官网http://www.ja-sig.org...
阅读全文
posted @
2008-07-09 22:44 x.matthew 阅读(31753) |
评论 (13) |
编辑 收藏
摘要: 推荐一本使用Java开源工具实践XP经验的书籍,书名有点长
Java-Tools-for-Extreme-Programming-Mastering-Open-Source-Tools-Including-Ant-JUnit-and-Cactus
全书包括三大部分
1. 介绍敏捷开发的概念。包括原则和最佳实践。
2. 开源工具的介绍。涵盖的工具应用有自动化构建,持续集成,自动化测试(功能和压力性能),部署以及代码重构等。
3. API介绍。从编程方面来剖析这些开源工具是如何工作的。
阅读全文
posted @
2008-07-08 21:17 x.matthew 阅读(1575) |
评论 (5) |
编辑 收藏
摘要: Eclipse官方网站已经正式宣布 Eclipse 3.4发布,代号为ganymede (Ganymede (英语发音"GAN uh meed")为最大的木星已知卫星,也是第七颗发现的木星卫星,在伽利略发现的卫星中离木星第三近)。
阅读全文
posted @
2008-06-25 15:22 x.matthew 阅读(3503) |
评论 (5) |
编辑 收藏
摘要: Eclipse官方网站已经正式宣布 Eclipse 3.4的发布日期为2008年6月25日
阅读全文
posted @
2008-06-23 20:01 x.matthew 阅读(2240) |
评论 (2) |
编辑 收藏
期待了好久,firefox3.0已经正式发布了,官方地址及下载链接:
http://www.mozilla.com/en-US/firefox/
本人下载后简单尝试了一下,感觉速度上有提升,而且导航栏的自动完成功能用起来很舒服。
有一点需要注意的事,如果是从firefox2.0直接升级到3.0需要注意一点,就是firefox的插件版本兼容问题。
我就发现firebug插件就存在版本的兼容问题,firebug是针对 firefox2和firefox3分别开发的,所以如果升级完后,会发布原来的firebug插件未被识别,解决办法就是
重新下载一下插件并安装。
接下来的时间会更新的尝试一下firefox3,也希望能与大家交流一下使用感觉。
Good Luck!
Your Matthew!
posted @
2008-06-19 10:10 x.matthew 阅读(1158) |
评论 (0) |
编辑 收藏
交朋友的11个技巧
交朋友有很多方法,我们有很多人也自觉不自觉地有很多交朋友的技巧,有些人甚至有交往朋友的原则。但是很多人是用朴素的方法与人交往,或者不自觉地运用或者不运用一些技巧。这里我和大家分享的11个小技巧,供大家社交参考。
——聊天聊点长远的事。我们一般与人在一起聊天的时候,除了鸡毛蒜皮,家长里短的事情之外,我们要让人觉得有一点远见,有在考虑未来的事情,自己是一个可以有长期交往价值的人。让人感到你是有长远考虑的人才增加人们与你建立鸡毛蒜皮以外关系的空间。
——交往一些眼前无用的人。有地位有资源的人谁都想去交往,但是在人家眼里你可能都不算一根葱。那些从还看不出谁长谁短的时代发展的同学关系却在后来成
为了很长久的社会支撑。我们要把一部分精力放在帮助这些现在没有很多功用的人,从而为未来积累真正的价值。实际上那些只交往有用朋友的人看起来更象小人。
——注意社交的差异性。有的人说我从没有公务员的朋友,或者从来没有教授的朋友,没有做投资股票这些方面的朋友,那么我要有意识的去这些人可能较多出现的场合、讲座、活动中去交往这些朋友。假如我要交往一个投资界的朋友的话,说不定在投资讲座的时候可以交到这个人。
——不要随便给人家承诺。如果承诺的话是指100%可以做到的,你可以不承诺,可能面子上抹不开。我有一个规矩第一我不借人钱,亲戚朋友只有一个例外,
你们生了大病我都会帮助的,我承诺做到的都能做到,我说不借的就不借。清晰的承诺可以减少你的麻烦,也可以让其他人知道怎么和你打交道。
——
接近不知道或不喜欢的知识或人士。在这个不知道里面,你可能会发现这些人事其实才是我非常喜欢的。有时你还要接触一些不喜欢的人和知识——中学,高中包括
到大学是我们人生最开放的时候,一个很重要的原因,是中小学到大学的时候我们学到很多知识是不得不学的。等到我们工作以后,老得快的一个重要原因是因为只
选择自己喜欢的东西,从而变得十分偏执。所以如果你选10本书,你选三本你不喜欢的书,七本是你喜欢的。如果你能这样坚持,你将对未来保持开放心态。
——在没事的时候联络老朋友。大家打招呼,说有事来找我,而社交的规矩是没事情的时候找人才能积累情感与彼此的粘合度,有事找人是用人,没事找人是情感投资。我们要更多在没有事情的时候给人电话、吃饭、聚会与旅行。
——做成本低但让人感觉到你的关心的事。过中秋买三千块钱的月饼,这个不见得有必要,而今天这个时代还能手写信,所以你过一个节给你30个朋友一人写一
个小短信的话,比你那个肉麻的印的卡片要好。所以你哪怕用最朴素的方法报告一下你的情况,也比转一个人家已经收到过的定制短信好。
——组织聚会扩大关系。一家人老公有老公的朋友,太太有太太的朋友,小孩子有小孩子的朋友,如果大家的朋友带朋友一起聚会,就可以把社交关系扩大很多倍,而且还发展了与家人可共享的友谊关系,增加了共同的话题,也在有事情的时候制造了可以与大家都说得上话的人力资源。
——关心自己给人的第一形象。现在大家不像以往,交往机会多了,但其实人们很难有第二次交往,大部分人连一次见面的机会都不会有,我们在超级市场推着一
个货车,选东西的时候很多东西不认真看的,顺手这么一拿,扫一眼就可以判断,而我们现在人际社交中间很多不是扫一眼就可以判断的。所以为什么像我们面试
啊,会议啊,论坛啊,你要认真的考虑我的形象怎么样?第一要吸引人们的注意力,第二个人们对我的注意力是正面的。要充分注意形象的修饰。
——
一定要用名片。人初次见面后需有一个沟通的链接,名片就充当这样一个作用。假如今天是龙永图在这边做演讲,你说龙先生我们能不能换一个名片,他会说不好意
思我今天没有带名片,这是他的亏欠,因为他没有给你名片。大家在名片上也不要印手机号,你在他面前写下了一个号码,你写这个东西的姿态表明你对他另眼相
看。
——与朋友一起做公益。我们这些朋友我们除了互相帮忙之外,很重要一点就是把我们的友谊和关系用在帮助第三人和第四人方面。在这一种交往
中间因为你帮助了他们,所以新的得到帮助的人对你还是负有社会债务的,更重要的是使得我们能够体验到那种帮助其他人,服务于其他人,为更多人创造价值这个
中间的乐趣。还不会减少原来的友情。
Good Luck!
Yours Matthew!
posted @
2008-06-13 19:24 x.matthew 阅读(419) |
评论 (2) |
编辑 收藏
关于endpoint配置补充
endpoint配置相对比较灵活,下面再来看一个例子:
<endpoint input-channel="inputChannel"
default-output-channel="outputChannel"
handler-ref="helloService"
handler-method="sayHello"/>
<beans:bean id="helloService" class="org.springframework.integration.samples.helloworld.HelloService"/>
1 public class HelloService {
2
3 public String sayHello(String name) {
4 return "Hello " + name;
5 }
6 }
上面这个例子就演示了把 HelloService配置成一个MessageEndpoint组件,消息从"inputChannel"队列接收后,
调用HelloService.sayHello方法,等sayHello方法返回后,根据default-output-channel="outputChannel"的配置
把返回的结果保存到message.payload属性后发送给"outputChannel"队列
也可改成Annotation的方式,配置方法如下:
<annotation-driven/>
<message-bus auto-create-channels="true"/>
<context:component-scan base-package="org.springframework.integration.samples.helloworld"/>
<beans:bean id="helloService" class="org.springframework.integration.samples.helloworld.HelloService"/>
1 @MessageEndpoint(input="inputChannel", defaultOutput="outputChannel")
2 public class HelloService {
3
4 @Handler
5 public String sayHello(String name) {
6 return "Hello " + name;
7 }
8 }
设置并发操作属性
xml配置:
<endpoint input-channel="exampleChannel" handler-ref="exampleHandler"/>
<!-- 设置并发设置 core核心线程数 max最大线程数 queue-capacity 队列最大消息数 keep-alive idle线程生命时间-->
<concurrency core="5" max="25" queue-capacity="20" keep-alive="120"/>
</endpoint>
annotation配置
1 @MessageEndpoint(input="fooChannel")
2 @Concurrency(coreSize=5, maxSize=20, queueCapacity=20, keepAliveSeconds=120)
3 public class FooService {
4
5 @Handler
6 public void bar(Foo foo) {
7
8 }
9 }
下面总结一下常见的annotation的使用方法
@MessageEndpoint
它表示处理消息对象的终端节点。一般与其它的元数据标记一起使用。
下面会具体介绍与该元数据标记一起使用的其它标识的使用方法。
@MessageEndpoint源代码:
1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 @Component
6 public @interface MessageEndpoint {
7
8 String input() default ""; //接收消息的队列名称
9 String defaultOutput() default ""; //默认发送消息的队列名称(只有在不设置@Router情况下才有效)
10 int pollPeriod() default 0; //发送消息的轮循时间间隔(只有在不设置@Router情况下才有效)
11 }
@Handler
消息回调处理的方法。与@MessageEndpoint一起配置
(只限M3版,M4以及后续版本可以单独使用,具体使用方法还要等具体的实现出来),收到input队列的消息后,回调@Handler标识的方法
回调方法的参数类型必须与message.payload属性类型相同
注:如果回调方法有返回值, 则回调方法处理完成后,会将返回值设置到message.payload属性后,
发送消息到@MessageEndpoint的defaultOutput队列。如果defaultOutput没有设定,则将抛出异常。
@Handler源代码:
1 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 public @interface Handler {
6
7 }
下面的例子演示了,从"channel1"队列接收消息后由@Handler标记的方法处理。消息的payload属性值的类型必须与方法的参数类型相同
1 @MessageEndpoint(input="channel1")
2 public class FooService {
3
4 @Handler
5 public void bar(Foo foo) {
6
7 }
8 }
@Polled
必须与@MessageEndPoint 一起使用。但也可以与@Router,@Splitter标识配合使用,后面再分别举例说明。
@Polled 用于开启一个轮循的方式调用方法的功能
它有三个参数:
period: 轮循时间间隔(单位:微秒) 默认为 1000
initialDelay: 轮循延迟时间(单位:微秒) 默认为0
fixedRate: 默认为false
@Polled 源代码
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 public @interface Polled {
6 int period() default 1000;
7 long initialDelay() default PollingSchedule.DEFAULT_INITIAL_DELAY;
8 boolean fixedRate() default PollingSchedule.DEFAULT_FIXED_RATE;
9
10 }
下面来看几个例子:
例子1:
1 @MessageEndpoint(defaultOutput="outputChannel")
2 public class Counter {
3
4 private AtomicInteger count = new AtomicInteger();
5
6 @Polled(period=3000)
7 public int getNumber() {
8 return count.incrementAndGet();
9 }
10 }
这个例子功能是,MessageBus启动后,由@Polled标记 每3秒触发getNumber方法,当getNumber方法返回后,
把返回值设置到message.payload属性后,发送到outputChannel队列中。
例子2:
1 @MessageEndpoint
2 public class Counter {
3
4 private AtomicInteger count = new AtomicInteger();
5
6 @Polled(period=3000)
7 public int getNumber() {
8 return count.incrementAndGet();
9 }
10
11 @Router
12 public String resolveChannel(int i) {
13 if (i % 2 == 0) {
14 return "even";
15 }
16 return "odd";
17 }
18 }
这个例子功能是,MessageBus启动后,由@Polled标记 每3秒触发getNumber方法, 当getNumber方法返回后,
由于resolveChannel方法设置了@Router 标识,则把有getNumber方法返回值都会传给resolveChannel方法,最后
会根据方法的返回值(即队列名称) (@Router标记功能),把消息发到even队列或是odd队列
注:如果@MessageEndpoint类中,在方法上标记了@Router标记后,@MessageEndpoint的defaultOutput就变成无效了。
@Splitter
必须与@MessageEndPoint 一起使用。
该元数据标识用于分解消息内容,它所在的方法的返回值必须是一个集合(collection).如果集合元素不是Message类型
但发送时,自动把集合中的元素对象保存到Message.payload属性后发送。集合中有多少个元素,则会发送多少次消息。
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Handler
5 public @interface Splitter {
6 String channel(); //消息发送的队列名
7 }
下面两个例子实现效果是一样的
例子1
1 @MessageEndpoint(input="inputChannel")
2 public class HelloService {
3
4 @Splitter(channel="outputChannel")
5 public List<String> sayHello(String name) {
6 String s = "Hello " + name;
7 List<String> list = new ArrayList<String>();
8 list.add(s);
9 return list;
10 }
11 }
12
例子2
1 @MessageEndpoint(input="inputChannel")
2 public class HelloService {
3
4 @Splitter(channel="outputChannel")
5 public List<Message> sayHello(String name) {
6 String s = "Hello " + name;
7 List<Message> list = new ArrayList<Message>();
8 Message message = new GenericMessage<String>(s);
9 list.add(message);
10 return list;
11 }
12 }
@Router
消息队列路由功能。 必须与@MessageEndPoint 一起使用。
它所在的方法的返回值类型必须是MessageChannle或是String(channel name)类型
具体的例子参考上面。
@Publisher
必须与@MessageEndPoint 一起使用。
说明:@Publisher 标识是根据 after-returning 切面的AOP 在方面返回值时,发送消息到指定消息队列 .
下面的例子:说明 foo方法调用后,返回值会发送到fooChannel消息队列
1 @Publisher(channel="fooChannel")
2 public String foo() {
3 return "bar";
4 }
@Subscriber
必须与@MessageEndPoint 一起使用。
接收指定队列的消息内容。它实现的异步的消息监听事件。
一旦有消息接收到,则会根据message.payload 值作为参数,回调@Subscriber 标识标记的方法
1 @Subscriber(channel="fooChannel")
2 public void log(String foo) {
3 System.out.println(foo);
4 }
Good Luck!
Yours Matthew!
2008年4月24日
posted @
2008-05-28 21:38 x.matthew 阅读(1986) |
评论 (1) |
编辑 收藏
摘要: The Cafe Sample(小卖部订餐例子)
小卖部有一个订饮料服务,客户可以通过订单来订购所需要饮料。小卖部提供两种咖啡饮料
LATTE(拿铁咖啡)和MOCHA(摩卡咖啡)。每种又都分冷饮和热饮
整个流程如下:
&nb...
阅读全文
posted @
2008-05-28 11:49 x.matthew 阅读(8614) |
评论 (6) |
编辑 收藏