PIXNET Logo登入

Kalin的部落格

跳到主文

歡迎光臨Kalin在痞客邦的小天地

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 2月 11 週六 200607:45
  • 十二生肖的由來

  從前中國人常用十二生肖來計算年歲。大家都知道,十二生肖是:鼠,牛,虎,兔,龍,蛇,馬,羊,猴,雞,狗,豬。那麼為什麼會有十二生肖呢?
  相傳在上古時代,人們都不曉得計算年月的方法,於是就去請玉皇大帝幫忙。玉皇大帝覺得動物和人們關係最密切,如果用十二種動物來做年份的名字,人們一定最容易記得。
  不過,地上的動物這麼多,要如何選出十二種動物來呢?玉皇大帝就決定再自己生日那一天,舉行一次動物渡河比賽。最先到達終點的十二種動物就被選出來,名列十二生肖。
  當比賽的消息公佈之後,所有的動物都紛紛討論起來,希望能贏得這場賽跑。
  那時候,貓和老鼠是最要好的朋友,他們吃在一起,睡在一起,親熱得形影不離。
  老鼠說:「我很想跑在前頭,列名十二生肖中,可是我身子又小,又不大會游泳,怎麼辦呢?」
 貓說:「既然我們身子小,跑不快,就應該動身得早。我知道水牛平常天不亮就起身了。到那一天,我們請水牛叫醒我們,也許就可以跑在前面了。」
  老鼠拍手跳起來說:「吱吱,好極了,就這樣辦!」
  到了玉皇大帝生日那天,天還沒亮,雞也還沒啼呢,和善的水牛就來把老鼠和貓叫醒了,水牛笑咪咪的說:「看你們迷迷糊糊的樣子,不如爬到我背上來,我載你們一塊兒走吧!」
  老鼠和貓就卷伏在溫暖又寬大的牛背上,舒舒服服的又睡了一覺。當他們醒過來的時候,天才剛剛亮,卻已經到了河邊了。貓兒在牛背上伸了一個大大的懶腰,高興的說:「過了何,馬上就是目的地了。看來,我們三個是跑在最前面啦。」
  「是啊。你出的主意真好。」老鼠口裡這麼說,心裡卻在盤算:「跑在前頭是不錯的了,不過,要怎麼才能跑在水牛和貓前面,得到第一名呢?」
  自私又狡猾的老鼠,想出了一個壞主意。
  當水牛游到河中間的時候,老鼠假心假意的靠近貓,親親熱熱的說:「貓哥哥,我們就快到河邊了,你看看,四周的風景多美啊!」
  「真的,好美喔!」貓果真四處張望。
  就在這個時候,老鼠狠心的用力一推,貓沒有坐穩,「撲通」就摔到河裡了。
  「嘿嘿.....」老鼠忍不住笑出聲來。
  大水牛發現背上的重量減輕了,回頭一看,卻發現許多動物都在陸續過河,他便趕緊加快速度,沒有注意貓掉到水裡,而狡猾的老鼠早已經偷偷鑽入大水牛的耳朵裡去了。
  大水牛很快的過河了。眼看就要得到第一名,心裡正高興著。突然,從他的耳朵裡跳出一團黑黑的東西。大水牛愣住了,停下腳步,仔細一看。「啊,原來是老鼠。」老鼠卻一溜煙似的往前跑。等大水牛看明白了,老鼠早就跑到終點,得到第一名。
  玉皇大帝看老鼠最先到達,感到奇怪,便問:「老鼠,你不會游泳,又跑不快,怎麼會最先到達呢?」
  老鼠得意洋洋的回答說:「我雖小,可是頭腦聰明,當然得第一囉!」玉皇大帝聽了點點頭。
  一眨眼,大水牛也到了,得到第二名。不過他一直對老鼠「哞,哞」的叫,很不高興的樣子。
  不一會兒,老虎一身濕淋淋的跑過來,很自信的吼:「我是第一名吧?」
  「不,我才是第一,你光靠力氣沒有用啊!要像我......」老鼠很不客氣的回答,於是老虎和老鼠就吵起架來。
  突然間,天邊捲起一陣狂風,一隻巨龍從天空降下來,就在龍快到終點的時候,突然一隻蹦蹦跳跳的小兔子,飛快的跑到玉皇大帝前,得到第四名。
  原來,兔子也不會游泳,是踏在別的動物身上跳過河的。而龍呢?他會飛,應該最早到的啊!玉皇大帝便好奇的問他為什麼會晚到。
  「我本來可以很早到的,可是我到東邊去降了一場雨才趕來,所以就耽誤了時間。」龍是專門負責天上降雨的動物,責任感也特別強,他很認真的回答玉皇大帝。
  一會兒之後,他們聽到一陣馬蹄聲,看到上揚起許多灰塵,隱約中看到馬,羊,猴子,雞和狗拼命的跑著。馬跑在最前面,眼看就快要達到終點了。突然,他聽到一個聲音。「我來了,我先到了。」草叢裡鑽出一條大蛇。
  大蛇來了引起一陣混亂,老鼠和兔子害怕的躲起來。大蛇平常最喜歡吃老鼠和兔子,今天卻很有禮貌的說:「今天我是特地來參加動物渡河比賽的,放心吧,我不會吃你們的。」
  「嘶---」馬一到就高興的亂叫。「我得第幾名?」
  「第七名啊!算你運氣不錯。」老鼠搶著回答。
  不久,老山羊,猴子和大公雞分別到了。
  「哎,你們三個怎麼會一起來啊?」老鼠問。
  老山羊慢吞吞的說:「我們在河邊撿到一塊木頭,坐在上面,互相照顧著過河。」
  「汪,汪,汪」調皮的狗也來了。其實他早該到了,因為貪玩,在河裡洗澡,耽誤了時間,最後只得到第十一名。
  比賽快要結束了,已經到達的動物,都想看最後一名是誰。大家伸長了脖子四處張望。過了好一會兒,聽到豬叫的聲音。奇怪,平日最懶的豬怎麼也來了?
  「是不是有好吃的東西啊?」豬喘著氣問。
  大家聽了,都捧著肚子哈哈大笑,說道:「真是一個貪吃的傢伙!」
  雖然如此,豬還是得到第十二名。
  玉皇大帝於是鄭重的宣佈比賽的結果:「十二生肖的排名是:鼠,牛,虎,兔,龍,蛇.....」
  話沒說完,貓急急忙忙的趕到了。他全身溼透,一附很狼狽的樣子。他一來就趕緊問:「我得第幾名?我得第幾名?」
  玉皇大帝和善的說:「你來晚了,什麼名都沒有。」
  貓一聽,氣的不得了,大叫:「都是可惡的老鼠害的,我要吃掉他。」說著便伸出利爪。玉皇大帝連忙阻止,可是貓哪裡忍得下這口氣,不顧一切向老鼠衝過去。老鼠知道自己對不起貓,又慚愧又害怕,吱吱叫著,直往玉皇大帝椅子下鑽。
  老鼠雖然在比賽中贏了,列入十二生肖的第一名,不過,他卻提心吊膽,隨時怕貓來找他報仇。從此以後,老鼠一看到貓的影子,就沒命的逃,甚至大白天也躲在洞裡不趕出來,這就是做了虧心事的報應了。
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(2) 人氣(10)

  • 個人分類:生活
▲top
  • 12月 13 週二 200512:10
  • My fxxking Beans


水! 被爛蘿菠說又臭又長的 beans, 在歷經 2 個 projects, 終於有點規模了, 
 
http://stuweb2.cmp.uea.ac.uk/a048683-jsp/beans_docs_kalin/
 
 
雖然還有很多 bugs, 但是孩是迫不及待地搶先推出 Beta 版.
 
 
 
ps: 原來在 MSN space, fxxking 是被禁止的字. 真是 Fxxking!
 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(3) 人氣(7)

  • 個人分類:Java
▲top
  • 12月 10 週六 200512:31
  • This is a war! (口水篇)


 week 12 有三個 groupg project 要 demo.
 
 
這兩週過的不是人的生活, 睡醒了就是趕程式, report , meeting... 甚至跟老師回報學校 server 上的限制. 與當初來英國前想要的生活完全不同! 現在的我像極了小老鼠, 不同的是, 它有滾輪, 我沒有. 我有的是: (房間 - Lab).
 
 
這過程中, 最痛苦的其實不是系統的開發, 而是文件的撰寫, 哈! 這點還是我的老問題.
 
/*******************************************
 **************** 這段是口水 ****************
馬的! 別遑論 system report (這是一定要的), 一堆拉哩拉雜的什麼 scenario, use case, clas diagram, eer, persisten object description, low-fi & hi-fi prototype, work diary, evaluation... 真他媽的爛羅菠! 就只愛看文件, 不愛看我的 code 跟 api!! 然後就只會挑小毛病, 什麼畫面描述不夠清楚, 他媽的! 你是不會看系統給的 guide feedback 喔! 靠! 也別跟我說畫面用了太多的 table,  不適合對盲人使用者使用, 操! 林背只有這樣短短的時間, 而且全部功能都出來了, 也沒有 bug, 別跟我雞蛋裡挑骨頭...
********************************************/ 
 
 
呼~ 一口氣把這學期的怨氣都吐出來的感覺.......真是爽爽爽爽爽! 
 
 
換個角度想, 或許學習正式, 標準化的專案開發流程比研究技術是更重要的. 畢竟這是打地基, 而這也是我欠缺的.
 
 
 
Ps: 電話裡聽到家人的關心 (媽, 記得電話前面要加國碼44啦~), 感覺真棒! & 謝謝 Tina 一直陪著我, 鼓勵我. 現在, 快完成第二個 project 了, 再撐一下!!  
(Sabrina, Ysanne, Jamie 這段時間給你們很多的壓力, 不好意思喔~)
 
http://stuweb4.cmp.uea.ac.uk/a048683-jsp/
 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(1) 人氣(23)

  • 個人分類:Study in UEA
▲top
  • 12月 07 週三 200508:05
  • Yi na ba yu ddia (朋友你好嗎)

 Yi na ba yu ddia(朋友你好嗎)
作詞:陳建年 作曲:陳建年 編曲:陳建年/鄭捷任 合唱:小陸/永龍/宏豪
Yi na ba yu ddia Yi na ba yu ddia nangu aliang
Yi na ba yu ddia Yi na ba yu ddia nangu wawaddiyang
Hei~ maseben ganu(多麼想念著你)
Hei~ addi gabaluyi gu(從沒忘記過你)
好久不見對你的思念 從不曾改變
嘿~ 好好保重自己
嘿~ 等你回來相聚
多麼期待會有那一天 看到你容顏
真情 將你我心相連 不管距離多遙遠
真情 讓你我不埋怨 就算地老天荒 一樣珍惜到永遠
------------
"Yi na ba yu ddia"是卑南族"你好嗎"的意思,看見好朋友時一
句親切的"Yi na ba yu ddia"足以替代很多用中文熱情表達時,
給人有點肉麻又無聊的語句。
釣魚是我最大的嗜好,釣魚時我絕對不會去想任何事物。不過這
首歌倒還真的是釣魚時的創作的,很自然的就寫了出來,就和往
常生活一樣。
此外,年前認識了一位日本朋友TAKAYA,到北海道演唱時還特別
唱給他聽,TAKAYA還認真的學唱了起來,這是一件很快樂的回憶
。最近聽說TAKAYA得了C型肝炎,希望透過這首歌,能夠捎給他
一份遙遠的祝福;「祝你早日康復,TAKAYA。」
 
(陳建年)
 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(26)

  • 個人分類:Music
▲top
  • 11月 25 週五 200505:34
  • 雪雪雪!!!


下雪了耶!! 哇哈哈~ 果然氣象報告沒騙人,
哈! 生平的第一場雪, 好爽~~
 
 
http://kalin.no-ip.org/webdav/vedio/my_first_snow-1.wmv
 
http://kalin.no-ip.org/webdav/vedio/my_first_snow-2.wmv
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(2) 人氣(7)

  • 個人分類:生活
▲top
  • 11月 06 週日 200508:41
  • 煙火


今晚 Zhao 找我去看煙火,
哈~ 還不錯, 只是時間短了點, 不像台灣一放就是很久, 可能因為是私人的吧?
小孩子應該都玩的蠻開心的.
而且聽 Zhao 說, 幾乎全 Norwich 的人都會來, 果然擠的要死.
 
而且我發現喔, 不管到哪裡, 都會有野台秀耶...
就是主持人盡說些冷笑話, 哈!
 
今天的錢帶不夠, 不知道要門票, 還有很多遊樂設施,
不然我今天一定狠狠給它花個20磅玩個爽~ 然後抱隻大熊回家...
 
 
這兩個禮拜很累, 希望下禮拜以後能找出比較有效率的方法.
能把功課作好, 也可以學到東西的方法.
 
 
下面就是今晚的片段:
 
煙火 01, 煙火 02, 煙火 03, 煙火 04, 煙火 05, 煙火 06, 樂團表演.




 

ps: 順便附上之前剛到 Norwich 時, 在 city centre 拍的德國街頭藝人的表演.

 

 

 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(8)

  • 個人分類:娛樂
▲top
  • 10月 23 週日 200510:00
  • Megadeth, Ashes in Your Mouth



高中的時候開始接觸搖滾樂, 買的第一個專輯就是Megadeth 的 Youthanasia,

記得那時我的淺綠制服裡就是 youthanasia 的骷髏黑 T-shirt.

更特地將 CD 轉成錄音帶,放在姊夫給我的隨身聽裡,

邊走邊聽, 晚自習聽, 搭火車聽, 睡覺也聽.

 

我很佩服 Megadeth 的演奏技巧與默契, 

尤其 Dave Mustaine 超賤的聲音,

那聲音就像一把利刃一樣, 狠狠地往我的心窩劃下去,

還有 Dave Mustaine 跟Marty Friedman 的雙吉他互飆!

總是期待著 Friedman 飆完後, Mustaine 會怎麼回應, 然後兩人怎麼合奏

甚至聽了9999遍以後, 還是帶著第一次的驚奇.

(奇怪~ 怎麼看到9999就想到邰正宵...)

幹! 反正這種的爽快, 即便是 Thrash Metal 的老大團: Metallica, 也望塵莫及的啦!

 

當今晚聽他們演唱會專輯 Rude Awakening 時,

帶來的痛快感更是讓我的腎上腺素急速分泌.

(完全不想看 W3C 的什麼WMI... ㄟ嗨~)

這次的演出不僅幾乎沒有破綻,  而且還比一般專輯更猛.

這感覺怎麼說呢....?

不僅僅是個人的人琴合一了, 人與人的搭配, guitar, bass, drum 的搭配都完全融合成一體了. 

就像小時候會看的卡通: 百獸王!

當五獅合一的時候, 沒人可以檔~

哈哈!

 


特別愛這首 Ashes in Your Mouth,

尤其是這段:

If you’re fighting to live
It’s o.k. to die!
The answer to your question is...
Welcome to tomorrow!

 

每每聽這首歌, 我都超期待這段的!

因為我知道.... 一 Welcome to tomorrow 後, 接著... 就是他媽的爽啊!

 

 

 

 

 

Ashes in Your Mouth

 

People have round shoulders from fairing heavy loads.
And the soldiers liberate them, laying mines along their roads.
Sorrow paid for valor is too much to recall
Of the countless corpses piled up along the wailing wall.
Melting down all metals, turning plows and shears to swords,
Shun words of the bible, we need implements of war.
Chalklines and red puddles of those who have been slain
Destiny, that crooked schemer, says the dead shall rise again
/chorus/
Where do we go from here?
And should we really care?
The end is finally here,
God have mercy!
Now we’ve rewritten history
The one thing we’ve found out,
Sweet taste of vindication,
It turns to ashes in your mouth.
/chorus/
If you’re fighting to live
It’s o.k. to die!
The answer to your question is...
Welcome to tomorrow!
Where do we go from here?
God have mercy!
/chorus/

 

 

 

 

rock n' roll never dies!

 

 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(13)

  • 個人分類:Music
▲top
  • 10月 18 週二 200511:27
  • 實踐01: 引數以 by value 方式傳遞, 而非以 by reference 方式傳遞

import java.awt.Point;
class PassByValue
{
 public static void modifyPoint(Point pt, int j, String str)
 {
  j = 15; // <- ? have to check primitive type.
  
  str = "def";
  /*************************************************************************************
   * 產生了一個 String 型態的 "def" 物件, 並將它的 reference 給 str,
   * 所以替換了 str 原本的 reference
  ************************************************************************************/

  pt.setLocation(5,5);
  /*************************************************************************************
   * 替換了 Point p reference, 但也因為用了"."這個 operator, 它會 dereference,
   * 所以它也改變了本身 object 的 value.
  ***********************************************************************************/

  
  //pt = new Point(5,5); //只修改了 Point pt 的 reference
  System.out.println("During modifyPoint: pt = "+pt+", j = "+j+", str = "+str);
 }
 public static void main(String[] args)
 {
  Point p = new Point(0,0);
  /*************************************************************************************
   * 1. new Point(0,0) <- 在記憶體產生了 Point 物件, 且是 Point 型態, 同時產生了 reference
   * 2. Point p <- 一個名為 p 的空間, 其型態為 Point,
   * 3. "=" 這個 operator  將 Point(0,0) 的 reference 放到了 p 裡面,
   *    所以就可以利用 p 裡的 reference 來找到這個物件.
  *************************************************************************************/

  int i = 10;
  String s = new String("abc");
  System.out.println("Before modifyingPoint: p = "+p+", i = "+i+", s = "+s);
  modifyPoint(p,i,s);
  System.out.println("Before modifyingPoint: p = "+p+", i = "+i+", s = "+s);
 }
}
 
---------- java ----------
Before modifyingPoint: p = java.awt.Point[x=0,y=0], i = 10, s = abc
During modifyPoint: pt = java.awt.Point[x=5,y=5], j = 15, str = def
Before modifyingPoint: p = java.awt.Point[x=5,y=5], i = 10, s = abc
Normal Termination
輸出完成 (耗費 0 秒)。

 
(Kalin 讀後心得)
進入 modifyPoint() 時, 引數傳遞了 object reference 的 copy, 以 by value 的方式傳遞.
當程式離開了 modifyPoint(), 重新回到 main() 後, str 已離開了自己的 scope, 且沒有人指向 "def" 這個  object 了, 所以 str 有機會被回收, 而 s 還是沿用當初的 reference, 指向 "abc" 這個 object. 嘔~靠背! Java沒有指向, ㄟ~ 真難解釋耶. 反正 primitive type 就是傳送真正的 value, object 就是傳送位元值.
 
argument 永遠是傳遞 object reference 的 copy, 也就是複製物件的參考變數的位元值.
PS: 哈! 但是其實不是永遠, 如果是 remote object, 則是傳遞 object 的 copy.
 
一年半前, 看到這個題目, 向吳老師請教, 我還是搞不懂, 困惑了一年多的時間.
現在因為學習 ejb 的因緣際會下, 回頭再看這個問題, 終於有點感覺了.
我真是嫩啊... 希望下一次更有感覺的時間會 < 1.5 year
 
 
Reference : Practical Java, JavaWorld
 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(5)

  • 個人分類:Practical Java
▲top
  • 10月 18 週二 200510:43
  • EJ B 架構


當撰寫用戶端來存取 bean 的時候, 這個客戶可能是在本地(Local), 或是遠端(Remote). 一個本地的客戶表示它和這個 bean 執行在相同的 heap. 換句話說, 這個 bean 跟用戶端都存在相同的 heap 裡. 不過這是對entity bean 或是在某些非常特殊的情況下才會用 local 用戶端.
 
Java 參照(reference)所保有的位元值, 一但離開了正在運行的 JVM 後就不具有任何意義了. 換句話說, 如果你是一個物件並且手上握有另一個物件的 reference, 那麼這個物件必須跟你坐落在相同的 heap.
 
Java RMI (Remote Method Invocation) 藉由給予用戶端一個 proxy 物件: stub, 來扮演客戶與遠端物件之媒介代理, 來解決上述的問題. stub 處理了所有跟遠端物件間地低階網路通訊細節, 包括 sockets 和 streams.
 
藉由 RMI, 用戶端物件就好像是執行一個遠端的方法呼叫一樣, 但是實際上發生的事情是在呼叫跟用戶端運行在相同 heap 裡的 stub 的 method.

RMI 的目標是要促使網路的透通性(transparency), 基於這個目標, 在 server 端接收 socket 連線的腳色就是 skeleton, 它跟用戶端的 stub 是互相配對的(早期是, 但是現再不一定).
 


# 透過 remote object 的 method 傳遞一個 local 的 object:
 
所有的遠端方法都必須宣告 java.rmi.RemoteException, 所以除了 RemoteException 以外, remote method 的呼叫跟 local method 的呼叫其實沒什麼兩樣.
 
1. 用戶端只是呼叫 local 的stub(坐落在相同的heap), 然後 stub 必須打包所有的引數(透過一種 marshalling 的程序), 同時經由 socket 連線到 server, 再將它們送到 output stream.
 
2. 而 skeleton 得處理 stub 傳來的 streams, 卸包參數, 並決定該做的事情, 接著呼叫 remote object(現在變成 local object)的 method.
 
3. skeleton 打包回傳值並將之傳給stub, 並將回傳值以正常, 普通的格式交付給 client.
 
為了要在網路上可以傳遞參數與回傳值, 它們必須是 Shippable, 而 shippable 必須是:
* primitive type.
* Serializable object.
* primitive type 或 Serializable object 的 Array 或是 collection.
* remote object.
 
Q: Java 傳遞物件的方式是, 傳遞一份 object reference 的 copy, 而不是 object 的 copy. 所以在 remote object 的 method 的呼叫上, 這不是不具意義的嗎? 因為 reference 的是另一個 heap 上的東西.
 
A: 是沒錯, 正常的來說, Java 的 argument 是以 by value 的方式而非 by reference 的方式傳遞. 也就是傳遞 object reference 的 copy, 也就是傳遞 object reference 的 copy 的 value. 但是, 如果遠端方法必須有一個 object type 的 argument, 則該 argument 是以這個 object 本身的完整副本被傳遞出去. 所以對於遠端的呼叫, Java 是以 object 的 copy 傳遞物件, 而非 obejct reference 的 copy. 但是前提是這個 object 是一個可以續列化的物件. 所以它必須 implements java.io.Serializable 這個 interface.
 
 
/********************************************
  * Client 的 code
  *******************************************/
 try
 {
  Dog fido = new Dog();
  //這時傳遞的是真正 Dog object 的 copy
  remoteStub.trainPet(fido);
 }
 catch (RemoteException rex)
 {
  rex.printStackTrace();
 }
 /********************************************
  * Server 的 code
  *******************************************/
 void trainPet(Dog arg){}
 
 
1. Client 對  stub 呼叫 trainPet(fido), 傳遞 Dog object reference 的 copy. //實際上只有一個 Dog object.
 
2. stub 製造一個 Serializable object copy, 並透過網路將這個 copy 給 server 的 skeleton.
 
3. skeleton deserialize 傳來的 argument, 在 remote 的 heap 裡製造一個新的 Dog object. //這時的 Dog 跟在 client 的 Dog object 是一樣的.
 
4. skeleton 呼叫 remote object 的 method, 傳遞一個新的 Dog object reference 的 copy. 
 
 


# 透過 remote object method 傳遞一個 remote object:
 
Java 實際傳送的是 remote object 的 stub, 換句話說, 在 runtime 時, remote object 還是待在原地, 只是透過網路傳送它的 stub. 一個 remote object reference 指的是 remote reference 的 stub. 如果 client 擁有一個 remote object reference, 它便擁有該 stub 的 local reference, 同時, 該 stub 可以跟 remote  object 溝通.
 
/********************************************
  * Client 的 code
  *******************************************/
 try
 {
  //我不確定是不是用 remoteStub.getCustomer() 這樣寫, 只是將感覺寫出來, 以後要 check
  remoteStub.getCustomer();
 }
 catch (RemoteException rex)
 {
  rex.printStackTrace();
 }
 /********************************************
  * Server 的 code
  *******************************************/
 public class Customer
 {
 };
 public class A
 {
  Customer c = new Customer();
  public getCustomer()
  {
   return Customer();
  }
 };
 
1. client 透過 stub A invoke remote object A 的 getCustomer().
 
2. remote object A 回傳一個 Customer object reference 的 copy, 接著 skeleton 將它置換成(同時 serialize) remote object Customer 的 stub, 然後將 Customer  stub 回傳給 client.
 
3. Customer stub 在 client 被 deserialize, 同時 client 得到指向這個新的 Customer stub 的 local reference copy.
 
 


 
Q: client 怎麼知道有哪些方法可以呼叫?? stub 怎麼知道 remote object 提供哪些方法?
 
Before Answer: 如果 stub 要假裝是 remote object, 它就必須提供跟 remote object 相同的方法.
 
A: 一個 interface. 這是所有分散環境下, 所有方法必須讓 client 看的見的管道. 這個 interface 稱為商業邏輯介面, 因為它有 client 想要呼叫的商業邏輯方法. 在技術上一個 remote object 的商業邏輯界面必須是一個遠端介面. so.. 它必須遵循:
1. 繼承java.rmi.Remote
2. 每個 method 必須宣告 java.rmi.RemoteException
3. 引數和回傳值必須是可以傳遞的.
 
import java.rmi.*;
public interface DiceRoller extends Remote
{
 public int rollDice() throws RemoteException;
}
 


 
# 在 EJB, remote object 是 EJBObject 而非 bean!
EJBObject 永遠是 bean 的 guard. 所以 EJBObject 實作 remote business logic interface, 並接收 remote invocation. 一旦呼叫達到 EJBObject, server 便介入其中提供所有的服務, such as 安全控管(client 有被授權可以呼叫這個方法嗎?), 交易(這個呼叫是現在交易的一部份, 還是要啟動一個另一個交易?), 存續(在執行這個方法前, 這個 bean 還需要從 db 載入任何資訊嗎?)
 
所以說, stub 跟 EJBObject 皆 implements remote business logic object, 但是裡面卻沒內容. 而 bean 雖然沒有去 implements remote business logic object, 但是它卻有真正 business logic 的功能.
 





 

# 在 EJB, 這個 remote business logic interface 稱為  component interface. 是用來公開商業邏輯方法給用戶端的地方.

 

跟一般 remote interface 不同之處, 就是 component interface extends EJBObject, 不是直接 extends Remote.

 

1. interface java.rmi.Remote 是一個沒有定義方法的 interface.

2. interface EJBObject extends Remote. 所以 EJBObject 是一個 remote interface, 並存有一些 method.

3. component interface extends EJBObject, 所以它除了也是一個 remote interface 以外, 也有了 EJBObject 的 methods, 更重要的是! 它本身定義了 business logic methods 可供 client 使用.

 

1. javax.ejb.EnterpriseBean 是一個沒有定義方法的 interface

2. interface SessionBean extends EnterpriseBean, 併存在若干方法.

3. bean extends SessionBean, 除了接收了 SessionBean 的方法外, 並定義了與實作了 business logic methods.

 

component interface 與 bean 有相同的 method, 但 bean 並沒有去 implements component interface. 因為 bean 從不會被期望它是一個 remote object, 也不該是.

 

server 會幫我們知道 bean, component interface 跟 EJBObject 的關連, 並確保 component interface 與 bean class 有相吻合的 methods.

 

Q: 那到底是誰去 implements component interface 呢?

A: 是 container! container 除了會 implements component interface 外, 還會 implements 產生一個 EJBObject class, 並提供一個與 EJBObject 配合的 stub class. 但是真正的 business logic methods 是落在 bean 裡面的, 而 EJBObject class 只是一個 remote object, 一個 guard. 它唯一的工作回應 client 的 invocation(透過 stub), 攔截 client 對 bean 的呼叫, 然後交由 container 或 server 來處理.

 





 

# Home: 每一個 session bean 跟 entity bean 都有搭配一個 Home.

 

Message-driven bean 不需要 Home, 因為 message-driven bean 不提供用戶端視野, 也就是說, client 無法得到 Message-driven bean 的 reference.

 

Home 的主要任務: 交出一個 component interface 的 reference. 每個 bean 都有自己的 Home, 同時 Home 負責所有該 bean 的 instance. 例如: 如果 deploy 一個 ShoppingCart 的 Session bean, container 將會產生一個 ShoppingCart bean 的 Home class. 這個 Home class 將會處理所有 ShoppingCart bean 的 instance, 換言之, 如果有兩千個 client 都要有自己的 ShoppingCart bean 的 reference(這代表一個指向 ShoppingCart bean 的 component interface), 而唯一一個 ShoppingCart 的 Home 將會提供所有的 reference. 所以不管 Home class 交出了多少的 EJBObject 和 stub, Home 都只有一個(一個 bean, 一個 Home).

 

ps: 但 client 從未得到 bean 的 reference, client 得到的是 EJBObject 的 reference.

 

# 取得和使用 AdviceBean 的 Home

1. AdviceBean 已經 deploy, 同時 server 產生了 AdviceBean 的 Home class, 並將它註冊到 JNDI.

2. 用戶端使用註冊的名稱"Advisor"到 JNDI 查詢 Home. =>lookup("Advisor");

3. JNDI 回傳 remote Home stub.

4. client 藉由 create() 來跟 Home 要求一個 component interface 的 reference. 也就是 client 想要建立一個 bean, 同時取回 bean 的 EJBObject 的 stub.

5. 這時透過了server 的 service, bean 被建立了.

6. EJBObject 也被建立出來, 同時它的 stub 被送回 client.

7. client 透過 EJBObject 的 stub(一個元件介面)呼叫 bean 的商業邏輯方法.

8. client 可以丟掉它的 Home stub, 如果它不想再存取更多的 AdviceBean, 但它仍可以繼續呼叫 component interface 的 method.

 

 

# 誰負責做什麼?

 

Bean Provider:

1. component interface (extends javax.ejb.EJBObject)

2. bean class (implement javax.ejb.SessionBean 或 javax.ejb.EntityBean)

3. Home interface (extends javax.ejb.EJBHome)

 

Container:

1. EJBObject class (implements component interface)

2. EJBObject stub class (implements component interface, 並知道如何跟 EJBObject class 對話)

3. Home class (implements Home interface)

4. Home stub class (implements Home interface, 並知道如何跟 Home class 對話)

 





# client 分享 Home, 也分享 Entity Bean.

 

對於這個 bean(例如 CustomerBean), 每一個 client 都它自己的且唯一的 Home reference.

 

但是如果兩個 client "同時"都試圖存取相同的 Customer(F. Smith #420), 這麼一來:

1. 除了兩個 client 都會有相同的 Home reference, 分享了 Home, 在 client 端也有自己的 Home stub(目前有兩個 Home stub).

2. 相同的, 兩個 client 也都會有相同的 EJBObject 的參照, 也就是 F. Smith #420 的 EJBObject, 因此分享了 EJBObject, 而一個 EJBObject 對應了 F. Smith #420 這個 bean, 所以也分享了 bean. 但是跟 Home stub 一樣, 在兩個 client 裡, 都分別有自己的 EJBObject stub.

 

 

# client 分享 Home, 但不分享 Session Bean

 

當 client 在執行 business logic method 時, 一個 Session Bean 使屬於該 client 的, 一個 Session Bean 的 client 能夠被確保市執行這個 bean method 時的唯一 client.

 

# 建立一個 Stateful Session Bean

1. client 取得一個 Home class stub 後, 呼叫 Home stub 的 create().

2. Home stub 將 create() 的呼叫送給 remote Home class.

3. Container 介入並提供服務.

4. bean 被實體化.

5. EJBObject class 跟 EJBObject class stub 也被實體化.

6. Home stub 回傳給 client EJBObject class stub.

 

# 建立一個 Stateless Session Bean

1. client 取得一個 Home class stub 後, 呼叫 Home stub 的 create().

2. Home stub 將 create() 的呼叫傳給 remote Home class.

3. Container 介入並提供服務.

4. bean 被實體化, 但是只待在 bean pool 裡! (等如果 client 對 EJBObject stub 呼叫 method, 它只會出來服務)

5. EJBObject class 跟 EJBObject class stub 也被實體化, 但是 EJBObject 並沒有跟 bean 有任何關聯! 所以說, 真正被呼叫method 前, Stateless Session Bean 不需要這個保鏢.

6. Home stub 回傳給 client EJBObject class stub.

 

ps: client 呼叫 Home stub 的 create(), 並不表示 Stateless Session bean 會跟 EJBObject 同時被建立出來. 這完全是取決於 container.

 

* Stateless Session bean 較具有延展性 (scalable)

client 不會分享 EJBObject, 但是相同的 bean 卻可以服務多個 EJBObject, 只不過"不是"同時發生, 也就是說, 一個 business logic method 的呼叫中, 一次只能處理一個客戶. bean 會從 pool 出來處理一個 client 的呼叫, 然後又跳回去 pool, 一直重複此動作.

 





 

# Message-driven bean 不需要有用戶端視野, 也就是它們沒有 interface(沒有 Home interface, 也沒有 compoent interface).

 

1. client 傳送一個訊息到一個JMS (Java Message Service).

2. JMS 將訊息傳給 container.

3. container 從 pool 裡抓出一個 Message-driven bean.

4. Container 藉由呼叫這個 bean 的 MessageListener interface 的 onMessage(), 將訊息傳給這個 Message-driven bean.

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference : Head First EJBtm scbcd 專業認證指南 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(214)

  • 個人分類:EJB
▲top
  • 10月 16 週日 200506:27
  • 陳綺貞, 華麗的冒險, Self


Self
詞/曲:陳綺貞
 
幾次悔過  掩埋狂妄的惡魔
感覺卻好像毀棄善良的自我
幾次 脆弱 掩飾 不甘的示弱
這就是我
再說 我也不特別可望永久
其實我也無法忠於單一感受
靜止了 沉溺了 無聲的滅絕
暈眩
是我拒絕你已清醒的雙眼
是我招喚你眼底的錯覺
就讓我用力砸毀輕聲的諾言
擁抱瞬間
是我用真實的編造了謊言
也是我用殘破的猜測這世界
就讓我回應你已失序的狂野
虛偽瞬間
是我
幾次悔過  掩埋狂妄的惡魔
這感覺卻好像毀棄善良的自我
靜止了 沉溺了 無聲的滅絕
退怯
是我拒絕你已清醒的雙眼
是我招喚你眼底的錯覺
就讓我用力砸毀輕聲的諾言
擁抱瞬間
是我用真實的編造了謊言
就算我用殘破的猜測這世界
再一次回應你已失序的狂野
我們表演
是我用真實的編造了謊言
就算我用殘破的證實這世界
再一次讓我嚐盡犯錯的甜美
甜美瞬間
是你帶我經過純潔的瞬間
無悔無邪 
 
我覺得這是陳綺貞最好聽的一張專輯!
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(2) 人氣(5)

  • 個人分類:Music
▲top
12»

自訂側欄

自訂側欄

個人資訊

Kalin
暱稱:
Kalin
分類:
不設分類
好友:
累積中
地區:

熱門文章

  • (10)十二生肖的由來
  • (7)My fxxking Beans
  • (23)This is a war! (口水篇)
  • (26)Yi na ba yu ddia (朋友你好嗎)
  • (7)雪雪雪!!!
  • (8)煙火
  • (5)陳綺貞, 華麗的冒險, Self
  • (13)Megadeth, Ashes in Your Mouth
  • (5)實踐01: 引數以 by value 方式傳遞, 而非以 by reference 方式傳遞
  • (214)EJ B 架構

文章分類

  • 心情筆記 (1)
  • 腦筋急轉彎 (1)
  • EJB (2)
  • Practical Java (1)
  • 娛樂 (1)
  • Music (4)
  • Study in UEA (1)
  • Java (3)
  • 生活 (2)
  • 未分類文章 (1)

最新文章

  • 十二生肖的由來
  • My fxxking Beans
  • This is a war! (口水篇)
  • Yi na ba yu ddia (朋友你好嗎)
  • 雪雪雪!!!
  • 煙火
  • Megadeth, Ashes in Your Mouth
  • 實踐01: 引數以 by value 方式傳遞, 而非以 by reference 方式傳遞
  • EJ B 架構
  • 陳綺貞, 華麗的冒險, Self

動態訂閱

文章精選

文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: