《美國數學月刊》登載了一個有趣的數學問題:3名男子參加一個以氣球為目標的投鏢游戲。每個人都用飛鏢攻擊另外2個人的氣球,氣球被戳破的要出局,最后幸存的是勝者。
3名選手水平不一,在固定標靶的測試中,老大10投8中,命中率80%。老二和老三的命中率分別為60%和40%。現在,3個人一起角逐,誰最有可能獲勝?
答案看似簡單,投得準的會取勝。而實際上,一開場,每個人都希望先把另外2個對手中的強者滅掉,自己才安全,下面的比賽也輕松。于是,老大專攻老二,老二、老三就攻老大,結果,水平最高的老大最易出局,水平最差的老三最安全!
老大自然不會那么蠢,他會游說老二:“我們合伙把老三那小子滅了,這樣,你我勝率都高!”
但是,老二會這樣想老大:“你想得美!若我們滅了老三,然后對打,我還不是處在劣勢?”
老大和老二的合作有了裂痕。
耶魯大學煺研究所的經濟學教授馬丁·蘇比克,討論過另一種策略:“老大會對老二保持一種威懾:‘我不攻擊你,你也別攻擊我,否則,我將不顧一切地回擊你!’這樣一來,就會造成新的局面。老二豈肯善罷甘休,也會以同樣的方式威脅老三,那么,三人的勝率又是……”
若2個男人比賽,問題再簡單不過;若多出1人,問題就復雜了許多倍。
摒棄復雜的數學和社會問題,還原為一些簡單的生活道理:面對一個強者,弱者只能接受失敗;面對一群強者,弱者反而有了更多的周旋空間。
posted @
2008-08-09 16:19 x.matthew 閱讀(626) |
評論 (3) |
編輯 收藏
摘要: 今天在DZone網站看到發布兩個新的筆記幫助卡片,下載看一下感覺很不錯,所以推薦給大家。不過除了今天要推薦的 Design Patterns和GlassFish以外,DZone RefCards還有很多不錯的學習筆記卡片可供下載,有興趣的朋友可以去官網下載。
閱讀全文
posted @
2008-07-18 12:58 x.matthew 閱讀(1467) |
評論 (4) |
編輯 收藏
摘要: 聲明:本博客屬作者原創,如果任何網站轉載本文,請注明作者及引用來源,謝謝合作!
關于Cas實現單點登入(single sing on)功能的文章在網上介紹的比較多,想必大家多多少少都已經有所了解,在此就不再做具體介紹。如果不清楚的,那只能等我把single sign on這塊整理出來后再了解了。當然去cas官方網站也是有很多的文章進行介紹。cas官網http://www.ja-sig.org...
閱讀全文
posted @
2008-07-09 22:44 x.matthew 閱讀(31805) |
評論 (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 閱讀(1584) |
評論 (5) |
編輯 收藏
摘要: Eclipse官方網站已經正式宣布 Eclipse 3.4發布,代號為ganymede (Ganymede (英語發音"GAN uh meed")為最大的木星已知衛星,也是第七顆發現的木星衛星,在伽利略發現的衛星中離木星第三近)。
閱讀全文
posted @
2008-06-25 15:22 x.matthew 閱讀(3515) |
評論 (5) |
編輯 收藏
摘要: Eclipse官方網站已經正式宣布 Eclipse 3.4的發布日期為2008年6月25日
閱讀全文
posted @
2008-06-23 20:01 x.matthew 閱讀(2251) |
評論 (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 閱讀(1163) |
評論 (0) |
編輯 收藏
交朋友的11個技巧
交朋友有很多方法,我們有很多人也自覺不自覺地有很多交朋友的技巧,有些人甚至有交往朋友的原則。但是很多人是用樸素的方法與人交往,或者不自覺地運用或者不運用一些技巧。這里我和大家分享的11個小技巧,供大家社交參考。
——聊天聊點長遠的事。我們一般與人在一起聊天的時候,除了雞毛蒜皮,家長里短的事情之外,我們要讓人覺得有一點遠見,有在考慮未來的事情,自己是一個可以有長期交往價值的人。讓人感到你是有長遠考慮的人才增加人們與你建立雞毛蒜皮以外關系的空間。
——交往一些眼前無用的人。有地位有資源的人誰都想去交往,但是在人家眼里你可能都不算一根蔥。那些從還看不出誰長誰短的時代發展的同學關系卻在后來成
為了很長久的社會支撐。我們要把一部分精力放在幫助這些現在沒有很多功用的人,從而為未來積累真正的價值。實際上那些只交往有用朋友的人看起來更象小人。
——注意社交的差異性。有的人說我從沒有公務員的朋友,或者從來沒有教授的朋友,沒有做投資股票這些方面的朋友,那么我要有意識的去這些人可能較多出現的場合、講座、活動中去交往這些朋友。假如我要交往一個投資界的朋友的話,說不定在投資講座的時候可以交到這個人。
——不要隨便給人家承諾。如果承諾的話是指100%可以做到的,你可以不承諾,可能面子上抹不開。我有一個規矩第一我不借人錢,親戚朋友只有一個例外,
你們生了大病我都會幫助的,我承諾做到的都能做到,我說不借的就不借。清晰的承諾可以減少你的麻煩,也可以讓其他人知道怎么和你打交道。
——
接近不知道或不喜歡的知識或人士。在這個不知道里面,你可能會發現這些人事其實才是我非常喜歡的。有時你還要接觸一些不喜歡的人和知識——中學,高中包括
到大學是我們人生最開放的時候,一個很重要的原因,是中小學到大學的時候我們學到很多知識是不得不學的。等到我們工作以后,老得快的一個重要原因是因為只
選擇自己喜歡的東西,從而變得十分偏執。所以如果你選10本書,你選三本你不喜歡的書,七本是你喜歡的。如果你能這樣堅持,你將對未來保持開放心態。
——在沒事的時候聯絡老朋友。大家打招呼,說有事來找我,而社交的規矩是沒事情的時候找人才能積累情感與彼此的粘合度,有事找人是用人,沒事找人是情感投資。我們要更多在沒有事情的時候給人電話、吃飯、聚會與旅行。
——做成本低但讓人感覺到你的關心的事。過中秋買三千塊錢的月餅,這個不見得有必要,而今天這個時代還能手寫信,所以你過一個節給你30個朋友一人寫一
個小短信的話,比你那個肉麻的印的卡片要好。所以你哪怕用最樸素的方法報告一下你的情況,也比轉一個人家已經收到過的定制短信好。
——組織聚會擴大關系。一家人老公有老公的朋友,太太有太太的朋友,小孩子有小孩子的朋友,如果大家的朋友帶朋友一起聚會,就可以把社交關系擴大很多倍,而且還發展了與家人可共享的友誼關系,增加了共同的話題,也在有事情的時候制造了可以與大家都說得上話的人力資源。
——關心自己給人的第一形象。現在大家不像以往,交往機會多了,但其實人們很難有第二次交往,大部分人連一次見面的機會都不會有,我們在超級市場推著一
個貨車,選東西的時候很多東西不認真看的,順手這么一拿,掃一眼就可以判斷,而我們現在人際社交中間很多不是掃一眼就可以判斷的。所以為什么像我們面試
啊,會議啊,論壇啊,你要認真的考慮我的形象怎么樣?第一要吸引人們的注意力,第二個人們對我的注意力是正面的。要充分注意形象的修飾。
——
一定要用名片。人初次見面后需有一個溝通的鏈接,名片就充當這樣一個作用。假如今天是龍永圖在這邊做演講,你說龍先生我們能不能換一個名片,他會說不好意
思我今天沒有帶名片,這是他的虧欠,因為他沒有給你名片。大家在名片上也不要印手機號,你在他面前寫下了一個號碼,你寫這個東西的姿態表明你對他另眼相
看。
——與朋友一起做公益。我們這些朋友我們除了互相幫忙之外,很重要一點就是把我們的友誼和關系用在幫助第三人和第四人方面。在這一種交往
中間因為你幫助了他們,所以新的得到幫助的人對你還是負有社會債務的,更重要的是使得我們能夠體驗到那種幫助其他人,服務于其他人,為更多人創造價值這個
中間的樂趣。還不會減少原來的友情。
Good Luck!
Yours Matthew!
posted @
2008-06-13 19:24 x.matthew 閱讀(433) |
評論 (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 閱讀(2006) |
評論 (1) |
編輯 收藏
摘要: The Cafe Sample(小賣部訂餐例子)
小賣部有一個訂飲料服務,客戶可以通過訂單來訂購所需要飲料。小賣部提供兩種咖啡飲料
LATTE(拿鐵咖啡)和MOCHA(摩卡咖啡)。每種又都分冷飲和熱飲
整個流程如下:
&nb...
閱讀全文
posted @
2008-05-28 11:49 x.matthew 閱讀(8645) |
評論 (6) |
編輯 收藏