2009年2月24日 星期二

Event driven與Exception架構很類似

Event driven其實跟我們熟悉的throw--catch很類似。

我們可以做個類比:


Event <--> Exception
它們都是這個架構的資訊攜帶者,自訂Event可以讓我們攜帶各種需要傳遞的物件,如同Exception可以攜帶各種錯誤訊息甚至錯誤物件往外傳播。
不同的地方在於,Exception的型態(type)決定了會被哪個catch抓到,而Event在initialization時必須給予一個事件代號,例如
new MouseEvent("click"),代表他是一個滑鼠的按鈕事件,當事件傳播出去後,只有指名要抓click代號的handler才能抓到此Event


dispatchEvent <--> throw
一樣都是將資訊向外傳播的方法,dispatchEvent是將Event傳播到UI元件的樹上,而throw是將Exception傳到call stack上。

例如 Window --> Form --> Button 的UI樹上,在Button上觸發的Event會一路傳到Form,再傳到Window上,若沒有UI有註冊聆聽此事件,Event會一路往外傳到最上層。Exception的傳遞非常類似,都是將Exception在function call stack上一路往外丟,沒有function實際catch時,就會丟給VM。


addEventListener <--> catch
攔截資訊的方法,catch指名要攔截哪個Exception,而addEventListener指名要攔截哪個Event,一樣的是攔截後Exception與Event原則上不會再往上(往外)傳播,除非使用者自己繼續throw Exception/dispatchEvent。


這兩種架構不一樣的地方在Exception有強制宣告的性質,若底層呼叫的method/function會throw某種VM無法處理的Exception,使用者必須自己寫處理方式,無論是繼續往上丟,或者自己寫try catch block處理,但是Event沒有此限制,因此若一個物件會dispatch某種自訂Event,上層元件不必強制處理此Event。

2009年1月7日 星期三

ie4linux安裝在Ubuntu 8.10的要點

安裝ie4linux一直是很多Ubuntu user心中的痛,因為ie6很常用,但卻又很難安裝,WINE設定也是出了名麻煩。ie4linux提供了很方便的安裝方式,但是在update系統時,卻又常常不能運作,我這次花了幾個小時安裝,終於搞定,在這邊寫個check list讓大家安裝時參考。

1.將舊版ie4linux移除:ie4linux預設安裝在.ie4linux上,更新系統後,這個隱藏目錄要先移除掉,免得到時候安裝時沒權限把檔案更新或刪除。

2.更改程式碼:我目前用的ie4linux版本為2.0.99.1,此版本要安裝在中文語系的Ubuntu下必須改一下程式碼:
2.1:安裝目錄的lib/function.sh,大約9X行附近會看到:
$( wget -q -b -t 1 -T......
由於中文語系造成的bug,你必須將這行加個LC_ALL="C" ...,變成:
$( LC_ALL="C" wget -q -b -t 1 -T 5
才能順利下載檔案
2.2:lib/messages.txt中的:
cn . zhCN CN
tw . zhTW TW
要改成
zh cn zhCN CN
zh tw zhTW TW
簡單說就是將句點去掉,前面加上zh,我猜又是區碼設定的問題。

3.執行ie4linux安裝程式時,若是死在gtk的問題(換句話說,就是連圖形畫面都沒出來就死掉),那就用ie4linux --no-gui來啟動,這樣就能安裝成功了!

祝大家happy hacking!

2008年12月29日 星期一

jQuery Cascade 多重動態select

這次要介紹的是jQuery專門處理動態讀取select所用的plugin--jQuery cascade
一般來說有很多選擇表單有相依性,例如縣市->街道->鄉里這種多層次選單,選了縣市之後依照選擇的值去選街道的值。
在以前沒有aJax的時候只能用onChange重新讀取頁面這種方式來實行,這種方法需要更新整個頁面,會將選單其他部分填的值歸零,若不想歸零還要做過特殊處理,實在很麻煩,幾乎沒有實用性。
但是現在有了ajax之後,就能讓前後端通力合作,一起達到動態更新選單的方法。

cascade是一個專門處理動態變更select的jQuery plugin,中文資源可以找到很多詳細的安裝與使用方法,例如下面這兩篇:
台扣啵的研究日誌--[AJAX] jQuery的多重下拉式選單應用
我想 - 我是屬於海洋--jQuery.cascade + 多重關聯式選單

所以基本的使用方法就不贅述了。

而我想在這邊提醒的是,當使用者選擇母選單時,ajax會將此母選單的值以"val"這個名稱傳送給伺服器,因此伺服器應該抓的就是val這個值!千萬不要自己另外以其他名稱把母選單的值傳過去,伺服器根本不會接到值!
例如在jQuery.cascade + 多重關聯式選單這篇文章中的code:

ajax: {
//所需的後端處理頁面
url:'action.php',
//傳值至後端頁面
data:{ val: $('#myParentSelect').val() }
},

這樣寫有可能val會抓不到任何東西!
為啥呢?因為在cascade.ext的原始碼中,母選單的值已經被指定給val儲存了,其他想要抓到母選單值的動作都會抓不到任何值(或抓到一些奇怪的值),有可能是因為ajax事件發動時,母選單的值尚未改變,因此以jQuery的.val()函式是抓不到任何東西的!

上述這點在使用多重選單時一定要注意!要不然會花上超久的時間抓bug。

2008年12月21日 星期日

jQuery--wysiwyg editor


這次要介紹的是jQuery專門用來強化textarea的外掛插件--wysiwyg editor(所見即所得編輯器)

這個編輯器的好處是大小特小,全部(程式、圖、CSS)加起來大概才13K,適合在高流量或需要對文字作簡單編輯的地方使用:

使用方法:
1.首先在html文本加入textarea:


<textarea name="context" cols="50" rows="10" id="context">
內文
</textarea>

2.在同一個html下引入所需的script與CSS(總共需要jquery.js, jquery.wysiwyg.js, jquery.wysiwyg.css):

<!-- jQuery引擎-->
<script src="jquery/jquery.js" type="text/javascript"></script>
<!-- 強化textarea編輯能力的jQuery外掛--> 
<script language="javascript" src="jquery/jquery.wysiwyg.js"></script>
<link href="jquery/jquery.wysiwyg.css" rel="stylesheet" type="text/css">


3.在網頁中將該textarea套入此plugin:

<script language="javascript">
$(document).ready(function(){
//把id為context的tag綁定wysiwyg編輯器!
$('#context').wysiwyg();
});
</script>

很簡單吧!

2008年12月20日 星期六

退伍之後......

退伍之後找工作,在找工作的時候接了幾個案子賺生活費,這些案子無一例外都是以我不熟的PHP來寫或改(畢竟Appserv一裝起來就能跑PHP,如果不是特別指明,我還真不想裝Tomcat),為了惡補PHP,就找了本Dreamweaver+PHP+AJAX的書來看,邊看邊寫。

Dreamweaver對Programmer有用的地方在於已經瞭解html,css,javascript的人而言,要學PHP非常快,許多常用的功能(資料庫連線,產生報表,存取權限)都可以用拉的拉出來,以後想要自己手造程式時可以參考這些拉出來的元件,實在很方便。但是他的缺點就是每一頁都要從頭動手拉,因為Dreamweaver只有code gen功能,要重構得自己慢慢來,所以我漸漸開始停用Dreamweaver的code gen功能,轉而開始尋找好用的MVC或template framework來架構自己的核心元件(畢竟我不想每次寫一個新功能就要從頭開始拉存取權限、資料庫連線這些routine)。

經由Jamez大哥推薦,我開始使用smarty這個template架構來寫網站,當然一開始是從樂多blog的這篇文章起頭,買書自己一步一步學起來的,雖然不是完整的MVC架構,例如PHPMVC,但是因為做一些基本東西很快,學習曲線比MVC framework平緩,用來應急還是蠻不錯的。

做著做著,smarty也熟了,就開始找一些其他的技術,以當作壓箱寶。目前網頁伺服技術中,最夯的應該就是AJAX技術了,在畢業前雖然也有啃過ajax in action,但是由於當時無法克服HttpXMLRequest這麼底層的東西,還有那一點也沒有美感的javascript code,只好投降。

後來,幾天前終於在PTT的AJAX版上終於找到了我喜愛的AJAX技術--jQuery!

jQuery是一個發揮jacascript身為functional language潛能的強大語言,幾乎在我碩士學歷期間學到的functional language技巧全都能用上,光是$()這個list comprehension特色就讓我愛不釋手,更不用說到處都有callback function這個在functional language中非常基本的技巧了,所以我馬上就栽進這個好玩的東西中,替我的case增加許多特效與ajax功能,jQuery能實踐非常多以前只能用flash來模擬的效果,在這個網頁中,展示了jQuery UI這個集合大部分常用視覺特效,光是看到tabs(分頁瀏覽,支援ajax式讀入子網頁)與datepicker(按下文字輸入區,自動跳出日曆讓妳選擇日期)兩個東西,就值得投資時間在jQuery上了!

關於jQuery的入門,可以看這篇
我自己是去買了本Learning jQuery中文版來自習。
有視覺plugin需求時會到這個大陸網站找適合的範例。

我也會在這裡網站不定期把自己用過的jQuery plugins整理起來,把目前超級混亂的jQuery plugin列出一個我自己的常用表格,免得以後要一直找來找去。

2008年10月19日 星期日

Ubuntu 8.10倒數!




終於,等待了許久的Ubuntu 8.10終於要釋出了,這版本的Ubuntu主要改進許多桌面應用的地方,下載點有:

Asia


這版本主要的軟體改進有:

GNOME 2.24:分頁式瀏覽的Nautilus,File Roller支援更多壓縮格式。

X.org 7.4:支援安全模式進入視窗介面,目前不支援nVidia的官方驅動程式,所以嘗鮮者只能安裝開源碼版本的驅動程式。

Linux Kernel 2.6.27:改進許多Bug的核心。

Encrypted private directory:在Home目錄中支援了自動加密目錄。

Guest session:不需密碼登入的特殊帳戶。

Network Manager 0.7:全系統通用設定,3G通訊管理,PPP/PPPOE管理,路由管理。

Samba 3.2

PAM:一種特殊的安全認證架構,常常接觸Linux認證授權機制的人應該對這東西很熟吧,原本在SELinux才能看到的安全架構,Ubuntu也納入了。

Totem BBC plugin:讓Totem可以直接收視BBC的免費網路節目。

期待8.10的正式發行!

2008年9月6日 星期六

退伍後的方向

自從我去年(2007)十一月入伍後,終於要在今年十月中退伍了,在退伍之後,企鵝幫魚魚幫兔終於要回復正常運作了!

在我回到社會上後,對於Ubuntu的關注將持續,而對於虛擬化技術VirtualBox的演進也會繼續,除此之外將會不定期地撰寫文章,記錄我所在研究的Java企業級技術或架構,希望有一天能將之集結成完整的系列文章!

以下是之後這個網站將繼續關注的主題:

  1. Ubuntu的最新消息
  2. VirtualBox以及其他虛擬化技術的現況
  3. Hibernate技術的心得系列文章
  4. Struts 2以及JSF的系列介紹文章
  5. ajax技術的最新消息,以及jQuery的好用plugins介紹
請各位舊雨新知多多指教!

2008年8月22日 星期五

Diablo 3 遊戲畫面!

期待了這麼多年,DIABLO 3終於有了確實的消息了!


第一部份
觀察重點:

  1. 攻擊時畫面的震動與地形地物的回應(石頭掉落,地表破裂)
  2. 特殊攻擊波及建物時會有地形效果,例如6:30時,攻擊牆壁讓牆倒塌壓死一堆小兵!
  3. 扁死小兵時,小兵的死法會依照物理計算飛向不同方向,甚至掛在一些背景建物上,例如在第二層扁飛小兵時,小兵會直接噴到一樓去!


第二部分
觀察重點:
  1. 男女野蠻人出現!男女叢林巫醫出現!
  2. 7:30開始的打小王鏡頭十分刺激!沒想到打個小王可以這麼有魄力 O_O

太屌啦!除了聲光效果的加強外,運用物理運算來計算破壞物品的機制也做得不輸一流FPS遊戲!
除此之外,舊有職業的延續也是一大賣點,光看野蠻人多了衝鋒與直線破壞波的技巧就夠讓人血脈賁張的。

期待更進一步的消息!
(希望可以做到破壞80%景物的超級遊戲! 自從仙劍戰鬥畫面可以把地形弄得亂七八糟之後,我就愛上破壞背景這件事了!)

Better Gmail 2

Better Gmail 2,這是一個簡單的Firefox 3小插件,主要用來增加Gmail的面版顯示與配置,我個人對於它的Gmail Redesigned這個skin非常欣賞,所以就忍不住下載下來囉,請各位有興趣的版眾也可以下載來玩玩看喔。