題目有點怪,但其實是常常在做的選擇題
比如說在求學的時候
教學內容超過所能負載的quota時, 基於不太靈光的腦袋及有限的能力
有兩個選項在面前出現:
(A)把考試的重要性降低,努力去增強該領域的實力
或者
(B)選擇對考試方針最佳化,衝高分數;
當然有一種是完全不在意的放棄,那就不在討論的內容之內了
選擇 (B)的人往往是由於一些外在的因素,比如申請國外學校時,成績好比較吃香等等;而選擇(A) 的人可能是想要對自已有個交代。也許在「自已想知道」和「老師覺得重要」的範圍交集不大的時候,在分數上就沒那麼漂亮了。
入社會之後,也有類似的選項
比如做到一個專案,你可以(A)用一些「專案小技巧生存術」搞出一個不太能用的系統收到高額利潤;也可以(B)稍微誠意一點,自已不賺那麼多,可是做出的系統對客戶有貢獻。嗯,不過選(A)或選(B)常常是身不由己,這點做過專案的人應該會知道。
當然同樣的選項也會出現在研究單位
(A) 要做當然做最好的,對於爛爛的conference 不在意
(B) 衝點數,對於一些明顯的爛地方不在意
嗯…感覺上要選(A) 還需要一點勇氣,那種被罵「笨蛋」也毫不在意的勇氣
在(A) 與 (B) 之間做出明確的選擇,真的不太容易,一方面想要對得起自已,另一方面又想在體制裏獲得好處的想法真是矛盾啊…不過,最差最差的底限是不要一面罵體制笨,一面又想撈,那是最笨的(怎麼…會有一種穿心的感覺 @@)
2007年12月29日 星期六
2007年12月12日 星期三
好書推 - 窮人也可以建出具有 scalability 的網站 !
2007年12月5日 星期三
2007年10月31日 星期三
冬眠之神和lucene 的合體~~
我們用Hibernate 管理資料Persist到資料庫的工作;我們用 Lucene 來建立全文檢索的index 讓大家來進行複雜的搜尋。有沒有想過,當這兩種動作合為一體的時候有多麼好用?當你新增、刪除、改一個 entity的時候,可以不用再煩惱資料庫和Index間的sync問題;當使用者進行全文檢索的時候,不用再手撈一份資料庫的資料?
Hibernate-search 就是這麼好用的工具,programmer 只要用annotation設定要建全文索引的index ,並且在hibernate的設定檔設定好建索引的實體目錄、還有insert/update/delete的listener (一般使用hibernate 內建的就夠了) 讚喔 ~
Hibernate-search 就是這麼好用的工具,programmer 只要用annotation設定要建全文索引的index ,並且在hibernate的設定檔設定好建索引的實體目錄、還有insert/update/delete的listener (一般使用hibernate 內建的就夠了) 讚喔 ~
2007年10月9日 星期二
JXTA 殺人事件
為了準備這學期分散式系統的作業,最近在study JXTA這個peer 2 peer的套件;本來是為了貪圖開發上的便利(say, JAVA),選擇這個套件做為開發的基礎,但是遇到許多想不到的困難…有點暈倒。
首先,JXTA的開發者資源不是很多,雖然tutorial code和programming guide 都有,但討論的群組不是很熱烈。一旦有困難,真的會無語問蒼天…
第二,如果你抱著「求人不如求已」的心態,下載了它的source code 來研究,會發現「咦?是安怎連compile 都有問題啊?」然後翻翻討論區,會有一篇十分隱秘的文章叫你去download nightly build. 當你照作之後,終於理智斷線在trace 的時候,行號和source code 對不起來的那一瞬間…(等於,前面做的全是白工…),真的configuration management 做得有夠隨便="=, 該檢討一下了。
罵歸罵啦,其實JXTA也有它的優點。如果看過其它的p2p套件,就會知道JXTA的2.5 版其實在物件的架構上十分優美,開發者可以很清楚的從high level的模型對應到API 的使用,這是不得不讚揚一下的地方。不過,你要不是它社群裏的insider, 開發時要準備一公升的血吐一吐…不然就是回歸2.4版那種醜醜的,但相對較穩定的版本…
首先,JXTA的開發者資源不是很多,雖然tutorial code和programming guide 都有,但討論的群組不是很熱烈。一旦有困難,真的會無語問蒼天…
第二,如果你抱著「求人不如求已」的心態,下載了它的source code 來研究,會發現「咦?是安怎連compile 都有問題啊?」然後翻翻討論區,會有一篇十分隱秘的文章叫你去download nightly build. 當你照作之後,終於理智斷線在trace 的時候,行號和source code 對不起來的那一瞬間…(等於,前面做的全是白工…),真的configuration management 做得有夠隨便="=, 該檢討一下了。
罵歸罵啦,其實JXTA也有它的優點。如果看過其它的p2p套件,就會知道JXTA的2.5 版其實在物件的架構上十分優美,開發者可以很清楚的從high level的模型對應到API 的使用,這是不得不讚揚一下的地方。不過,你要不是它社群裏的insider, 開發時要準備一公升的血吐一吐…不然就是回歸2.4版那種醜醜的,但相對較穩定的版本…
2007年9月30日 星期日
這位 this, 你是那來的?
javascript的this是一個十分動態的東西,要小心的使用
例如:
function foo(){
this.varA = "haha";
function bar(){
alert(this.varA);
}
}
var myFoo = new foo();
然後 html 裏讓一個 div onclick之後觸發 foo.bar()....:
如果真的click 下去,alert 出來不會是"haha"會是undefined,神奇吧。原因是當下的this已經不是我們預想的foo,而是div啦…
這種事真的蠻討厭的。一不小心就會忘記,不然就是要變成…
function foo(){
this.varA = "haha";
var me = this;
function bar(){
alert(me.varA);
}
}
結果就會是正確的…
為什麼? 不要問我…="=
例如:
function foo(){
this.varA = "haha";
function bar(){
alert(this.varA);
}
}
var myFoo = new foo();
然後 html 裏讓一個 div onclick之後觸發 foo.bar()....:
如果真的click 下去,alert 出來不會是"haha"會是undefined,神奇吧。原因是當下的this已經不是我們預想的foo,而是div啦…
這種事真的蠻討厭的。一不小心就會忘記,不然就是要變成…
function foo(){
this.varA = "haha";
var me = this;
function bar(){
alert(me.varA);
}
}
結果就會是正確的…
為什麼? 不要問我…="=
2007年9月13日 星期四
偵測memory leak
完全靠人腦偵測memory leak 是一種非人的行為,絕對會起笑
這次要和legacy code 的memory leak 打架,眼看著工作管理員上的記憶體使用量直衝雲霄,實在是給它有點沒力。
找到了 Visual Leak Detector ,同樣的,安裝和食用都很方便,照它的readme 裝好以debug 模式編譯,再用啟動debug;跑完後會出一份很清楚的報表,包括那裏leak, stack trace等等,很方便。
PS 以上是使用Visual C++ 6.0
這次要和legacy code 的memory leak 打架,眼看著工作管理員上的記憶體使用量直衝雲霄,實在是給它有點沒力。
找到了 Visual Leak Detector ,同樣的,安裝和食用都很方便,照它的readme 裝好以debug 模式編譯,再用啟動debug;跑完後會出一份很清楚的報表,包括那裏leak, stack trace等等,很方便。
PS 以上是使用Visual C++ 6.0
2007年9月3日 星期一
2007年8月28日 星期二
javascript & HTML - 近日小記
(1) 傳值、傳址鬼打牆
在重新開始復習C++的傳值、傳址的當兒,沒想到也在js 裏遇到這種問題
code長這樣:
for (var i=0; i< max; i++){
elements[i].onclick = function(){
alert(i);
}
}
那當你點下element[0]的時候,到底會alert啥咪?答案是 ... max。而且不管click element[1], element[2]...答案都相同!因為匿名function註冊的寫法是傳址的效果。
寫成這樣:
function clickHandle(i){
elements[i].onclick = alert(i);
}
for (var i=0; i< max; i++){
clickHandle(i);
}
就會沒事,因為傳進function裏的值是類似傳值的效果…鬼打牆的數小時....
(2) textarea 包textarea ....
是不行的,我可能是公司裏最後一個知道的人Orz.....
在重新開始復習C++的傳值、傳址的當兒,沒想到也在js 裏遇到這種問題
code長這樣:
for (var i=0; i< max; i++){
elements[i].onclick = function(){
alert(i);
}
}
那當你點下element[0]的時候,到底會alert啥咪?答案是 ... max。而且不管click element[1], element[2]...答案都相同!因為匿名function註冊的寫法是傳址的效果。
寫成這樣:
function clickHandle(i){
elements[i].onclick = alert(i);
}
for (var i=0; i< max; i++){
clickHandle(i);
}
就會沒事,因為傳進function裏的值是類似傳值的效果…鬼打牆的數小時....
(2) textarea 包textarea ....
是不行的,我可能是公司裏最後一個知道的人Orz.....
2007年8月17日 星期五
iGoogle - Google Gadget -關於小工具的二三事~
前陣子看到iGoogle 在徵選google gadget,試圖炒熱小工具的開發,讓我也好奇的看了看小工具到底為何物。
小工具需要三種角色合作:
(1)平台及規範
(2)小工具開發者及網路資源
(3)終端使用者
(1)中的平台負責parse合於小工具規範實作出的小工具,忠實的將小工具呈現在終端使用者的入口網頁上,它可以不用知道小工具的全部內容及邏輯,小工具和平台的溝通全透過規範中訂定的方法。(特別提一下:技術上的層面而言,分為inline , html,及 url,後兩者是透過iframe include的,看起來沒問題;而inline則是產生直接內嵌在平台中的html裏的code<--不知這種的有沒有安全性的問題哩…從它的規格裏看不太出來~ )
(2) 小工具開發者遵循規範開發自已的小工具,並且把它放在網際網路上
(3) 終端使用者從任何的管道知道(2)開發出的好用的小工具,再在平台上自訂自已喜愛的小工具;
基本上google 自已也提供了一些好用的library ,讓小工具可以很快的做出炫技效果,如拖拉等等… 總而言之蠻有趣的
喵媽自已也寫了一個參加徵選,雖然比較於其它javascript 魔人來說很遜色,不過倒底也是自已會愛用的東西,來野人獻曝一下~
http://gadgetshopping.googlecode.com/
svn/trunk/shoppingwindow/testEbay.xml
這是個ebay的shopping cart,可以自訂關鍵字跨國搜尋,並將有興趣的item放到shopping cart裏。其實如果做yahoo拍或露天拍應該更實用,但是它沒有公開的api,喵媽又懶得手趴html code,作罷,拿ebay來展示一下概念就是。
親朋好友們有興趣加一下囉,並且請不吝提供意見喔~
小工具需要三種角色合作:
(1)平台及規範
(2)小工具開發者及網路資源
(3)終端使用者
(1)中的平台負責parse合於小工具規範實作出的小工具,忠實的將小工具呈現在終端使用者的入口網頁上,它可以不用知道小工具的全部內容及邏輯,小工具和平台的溝通全透過規範中訂定的方法。(特別提一下:技術上的層面而言,分為inline , html,及 url,後兩者是透過iframe include的,看起來沒問題;而inline則是產生直接內嵌在平台中的html裏的code<--不知這種的有沒有安全性的問題哩…從它的規格裏看不太出來~ )
(2) 小工具開發者遵循規範開發自已的小工具,並且把它放在網際網路上
(3) 終端使用者從任何的管道知道(2)開發出的好用的小工具,再在平台上自訂自已喜愛的小工具;
基本上google 自已也提供了一些好用的library ,讓小工具可以很快的做出炫技效果,如拖拉等等… 總而言之蠻有趣的
喵媽自已也寫了一個參加徵選,雖然比較於其它javascript 魔人來說很遜色,不過倒底也是自已會愛用的東西,來野人獻曝一下~
http://gadgetshopping.googlecode.com/
svn/trunk/shoppingwindow/testEbay.xml
這是個ebay的shopping cart,可以自訂關鍵字跨國搜尋,並將有興趣的item放到shopping cart裏。其實如果做yahoo拍或露天拍應該更實用,但是它沒有公開的api,喵媽又懶得手趴html code,作罷,拿ebay來展示一下概念就是。
親朋好友們有興趣加一下囉,並且請不吝提供意見喔~
2007年8月9日 星期四
Test driven development with C++
比想像中難一點,可能是被eclipse寵壞了吧…
Test driven的精神在於測試先行,搭配"frequent" refactoring,慢慢隨各種use case 的增加讓整個系統一點一點長大。
首先找測試工具:
cppunit - 以VC 6.0編好即可配合開發,在安裝和食用上十分方便;不過要命的是,C++裏testcase都要靠main跑;所以要配合撰寫不同的build流程,開發時build testcase 的main, production時build真的main (如果有的話)
第二 - frequent refactor:
用了tomato配合VC 6.0 開發,不過由於C++語法較強大(複雜)的關係吧,refactor的功能十分有限,頂多換換名字、抽一抽method ,其它還是要手動來,真累。
還有一些東西待摸索,希望快點適應C++的開發
Test driven的精神在於測試先行,搭配"frequent" refactoring,慢慢隨各種use case 的增加讓整個系統一點一點長大。
首先找測試工具:
cppunit - 以VC 6.0編好即可配合開發,在安裝和食用上十分方便;不過要命的是,C++裏testcase都要靠main跑;所以要配合撰寫不同的build流程,開發時build testcase 的main, production時build真的main (如果有的話)
第二 - frequent refactor:
用了tomato配合VC 6.0 開發,不過由於C++語法較強大(複雜)的關係吧,refactor的功能十分有限,頂多換換名字、抽一抽method ,其它還是要手動來,真累。
還有一些東西待摸索,希望快點適應C++的開發
2007年8月1日 星期三
這不是很簡單嗎 ?....Auto Complete.....@@
Auto Complete - 在 text input 打字,系統幫忙(以 ajax) 從系統撈資料補字的功能。
現在在各大網站上都十分常見,最近我們也要自已開發一個。
乍聽之下,會覺得… "不是很簡單嗎"? 只要在text input bind keyup 事件,就可以在key up 的同時,送出 ajax call 去後端撈資料,送回來後畫在一個黏在text input 下面的div 裏 - 結束。
不過,實作之後,發現總是有怪怪的現象,比如,回應速度不均 - 網路delay jitter 有差;或者補的字和你打的字無關 - Ajax (Asynchronous) 不同步的回應。等等小細節,卻會讓auto complete這個功能變得十分難用。到了一種沒有比有好的悲慘地步。
後來採用 scriptaculous這個js 的套件來幫忙,總算順多了。仔細來看看這個套件怎麼做的? - 其實也很簡單,就是每隔固定的時間,比如0.5 秒之類的,先比對text input 裏的資料有沒有改動,有則去後端撈資料,沒有則不做事;並且,猜測它應該有處理不同步回應的問題,因為記下了「上一個 query」,也可以判斷拿到手的非同步回應是不是過時的。
嗯,總之,寫這種 ajax 的東西,絕對要考慮網路延遲和非同步的問題,這是和以往做 server side 技術不同的地方。
現在在各大網站上都十分常見,最近我們也要自已開發一個。
乍聽之下,會覺得… "不是很簡單嗎"? 只要在text input bind keyup 事件,就可以在key up 的同時,送出 ajax call 去後端撈資料,送回來後畫在一個黏在text input 下面的div 裏 - 結束。
不過,實作之後,發現總是有怪怪的現象,比如,回應速度不均 - 網路delay jitter 有差;或者補的字和你打的字無關 - Ajax (Asynchronous) 不同步的回應。等等小細節,卻會讓auto complete這個功能變得十分難用。到了一種沒有比有好的悲慘地步。
後來採用 scriptaculous這個js 的套件來幫忙,總算順多了。仔細來看看這個套件怎麼做的? - 其實也很簡單,就是每隔固定的時間,比如0.5 秒之類的,先比對text input 裏的資料有沒有改動,有則去後端撈資料,沒有則不做事;並且,猜測它應該有處理不同步回應的問題,因為記下了「上一個 query」,也可以判斷拿到手的非同步回應是不是過時的。
嗯,總之,寫這種 ajax 的東西,絕對要考慮網路延遲和非同步的問題,這是和以往做 server side 技術不同的地方。
2007年7月16日 星期一
拖拖拉拉的google map
Google Map最近在亞洲的地圖資料有了長足的進步(前陣子幾乎是一片空白的狀態),很多和台灣島民日常生活相關的應用終於也可以架在上面玩一玩了。
除了地圖資料外,Google Map 2 的API也越來越成熟囉! 加入了很多新的功能。比如你可以把一個marker 以拖拉的方式在地圖上移動,((這可是一些drag and drop maniac 夢中的功能~))並且事件的註冊模型也很漂亮,每個 marker都可以註冊自已對事件的handle。msn map可要加油些囉 !
不過,Google的地圖還是有點「工程師」…這點msn map可是大大的贏。
除了地圖資料外,Google Map 2 的API也越來越成熟囉! 加入了很多新的功能。比如你可以把一個marker 以拖拉的方式在地圖上移動,((這可是一些drag and drop maniac 夢中的功能~))並且事件的註冊模型也很漂亮,每個 marker都可以註冊自已對事件的handle。msn map可要加油些囉 !
不過,Google的地圖還是有點「工程師」…這點msn map可是大大的贏。
2007年7月5日 星期四
build請你不要fail~ - selenium
如果你採用的是最夯的iterative 開發生命週期,
那專案經理最大的惡夢之一很有可能就是一個iteration結束後,build 卻因為重大的defect而不能用。((這真是慘,如果你的build是星期五出的,很有可能星期六日還要來加班 …所以建議大家把出build 時間挪到星期四或星期一= =+))
iteratively 開發最大的特點在於,需求是一直一直往上加的。但是,你開發了新的功能,或修了 舊的defect,測試卻是需要測試「所有的」功能。因為沒有人敢保證在加新功能的時候,對於舊功能是毫髮無傷的。所以,測試人員的工作只會隨著功能的增加而越來越繁重。如果這個系統十分大,用人工來執行測試到最後真的會測到哭出來。所以,自動測試是iteratively開發的王道。
回到web2.0的應用系統,如果我們想要做網頁程式的自動測試,就需要有一個工具可以來模擬測試人員在測試網頁時的行為,並能夠進行驗證,最最重要的是,它的錄製、修改成本絕對不能太高 - 因為我們要接受一件事實,世界上沒有不變的需求((而且通常是變很大)); 如果每一次的改變,都必需大費週章重新錄製角本,那可能會比人工測試還要慘歐 ~
最近亂逛又看到 selenium 這個工具,覺得十分的不錯。除了它可以鬆錄製測試角本(有selenium IDE, 是FF的plugin)之外,因為它的指令十分簡單,所以修改看來也不是個問題。
讓我印象最深刻的是,它的selector 十分活,你可以指定 element id, XPath(找XPath), 或是用 document.getElementById...這種寫法來取得要click, focus (有許多 command供君選擇)的元件,也可以assert裏面的值。還可以將錄好的角本轉成java unit test整合於 CI(Continuous Integration)上面十分方便。在 firefox 錄好的角本,動動手腳一樣可以在 IE跑,所以也可以跨瀏覽器測試。
不過,有一些功能,像上傳檔案,就沒法子測。(原因尚未參透); 而FF不支援的modal dialog 也無法在FF 錄製,要另外再寫囉。
不過這樣的自動測試面臨的另一個問題是,流程上該怎麼安排? 你需要一個乾淨的資料庫,從頭開始insert資料、驗証資料,還是你只想確保頁面不爛,功能可看 ? 或你有更大的野心 - 把頁面的整合測試納入 CI管控 ? 不同的practice提供的保證不一樣,所付出的成本也不同,只能說看情況選擇最適合自已的囉 ~
那專案經理最大的惡夢之一很有可能就是一個iteration結束後,build 卻因為重大的defect而不能用。((這真是慘,如果你的build是星期五出的,很有可能星期六日還要來加班 …所以建議大家把出build 時間挪到星期四或星期一= =+))
iteratively 開發最大的特點在於,需求是一直一直往上加的。但是,你開發了新的功能,或修了 舊的defect,測試卻是需要測試「所有的」功能。因為沒有人敢保證在加新功能的時候,對於舊功能是毫髮無傷的。所以,測試人員的工作只會隨著功能的增加而越來越繁重。如果這個系統十分大,用人工來執行測試到最後真的會測到哭出來。所以,自動測試是iteratively開發的王道。
回到web2.0的應用系統,如果我們想要做網頁程式的自動測試,就需要有一個工具可以來模擬測試人員在測試網頁時的行為,並能夠進行驗證,最最重要的是,它的錄製、修改成本絕對不能太高 - 因為我們要接受一件事實,世界上沒有不變的需求((而且通常是變很大)); 如果每一次的改變,都必需大費週章重新錄製角本,那可能會比人工測試還要慘歐 ~
最近亂逛又看到 selenium 這個工具,覺得十分的不錯。除了它可以鬆錄製測試角本(有selenium IDE, 是FF的plugin)之外,因為它的指令十分簡單,所以修改看來也不是個問題。
讓我印象最深刻的是,它的selector 十分活,你可以指定 element id, XPath(找XPath), 或是用 document.getElementById...這種寫法來取得要click, focus (有許多 command供君選擇)的元件,也可以assert裏面的值。還可以將錄好的角本轉成java unit test整合於 CI(Continuous Integration)上面十分方便。在 firefox 錄好的角本,動動手腳一樣可以在 IE跑,所以也可以跨瀏覽器測試。
不過,有一些功能,像上傳檔案,就沒法子測。(原因尚未參透); 而FF不支援的modal dialog 也無法在FF 錄製,要另外再寫囉。
不過這樣的自動測試面臨的另一個問題是,流程上該怎麼安排? 你需要一個乾淨的資料庫,從頭開始insert資料、驗証資料,還是你只想確保頁面不爛,功能可看 ? 或你有更大的野心 - 把頁面的整合測試納入 CI管控 ? 不同的practice提供的保證不一樣,所付出的成本也不同,只能說看情況選擇最適合自已的囉 ~
2007年6月23日 星期六
超瞎消費事件
不知道是商家把消費者當丁丁,還是本人有歐巴桑的偏執狂?
Case 1 MXD's hair XX店
大熱天想把頭髮剪短圖個涼快的喵 vs 染髮魔人設計師
喵:我想剪短
設計師:不行!你的頭髮不適合剪短
喵:那打薄應該OK吧?
設計師:不行!你的頭髮也不適合打薄
喵:(暈)那你想怎麼弄?
設計師:我想染…
喵:(怒)........你想我不想 = =
雙方僵持.....
((最後在喵的堅持下,設計師沒有染成;
但是,在設計師的堅持下,喵的頭髮也沒有剪短/打薄 =口=
所以白白花了7百多大洋,三星期後再去別的地方剪了一次))
Case 2 新X三越 地下美食街
黃金鼠點了玉子鰻魚飯,
那是一種以鰻魚為主,和蛋一起弄成像親子飯的東西,為了讓大家容易了解,找了下圖做為圖示。
出菜的時候發現
「咦,怎麼只有鰻魚沒有蛋(玉子)?」
櫃台阿姨:
「啥咪! 你要蛋喔? 蛋沒有了耶!」
之後…阿姨做了一件令人匪夷所思的事......
>>竟然從隔壁的簡餐店拿了 菜脯蛋 ,放在鰻魚飯裏<<
嗯.......阿姨,你真是太威了!
Case 1 MXD's hair XX店
大熱天想把頭髮剪短圖個涼快的喵 vs 染髮魔人設計師
喵:我想剪短
設計師:不行!你的頭髮不適合剪短
喵:那打薄應該OK吧?
設計師:不行!你的頭髮也不適合打薄
喵:(暈)那你想怎麼弄?
設計師:我想染…
喵:(怒)........你想我不想 = =
雙方僵持.....
((最後在喵的堅持下,設計師沒有染成;
但是,在設計師的堅持下,喵的頭髮也沒有剪短/打薄 =口=
所以白白花了7百多大洋,三星期後再去別的地方剪了一次))
Case 2 新X三越 地下美食街
黃金鼠點了玉子鰻魚飯,
那是一種以鰻魚為主,和蛋一起弄成像親子飯的東西,為了讓大家容易了解,找了下圖做為圖示。
出菜的時候發現
「咦,怎麼只有鰻魚沒有蛋(玉子)?」
櫃台阿姨:
「啥咪! 你要蛋喔? 蛋沒有了耶!」
之後…阿姨做了一件令人匪夷所思的事......
>>竟然從隔壁的簡餐店拿了 菜脯蛋 ,放在鰻魚飯裏<<
嗯.......阿姨,你真是太威了!
2007年6月12日 星期二
2007年6月5日 星期二
HyperGraph
學校的data mining 專案裏希望能用Association Rule建起關鍵詞與關鍵詞間的"Concept Space"
簡單來說就是詞與詞間的相關度啦;如果一次看一堆詞就是個Graph的資料結構
不過點子好也要有個夠炫的presentation layer ~
這裡有個好工具可以把抽象的"Concept Space"視覺化
http://hypergraph.sourceforge.net/
聽說這個套件的演算法 - 魚眼顯示來的 已經被Patent起來啦
在商業上受到什麼限制還要再查(好像是賣到美國就不行的樣@@, 因為是美國專利)
使用方法很簡單,只照它的DTD規範定義的語法做好XML餵給它就OK了,彈性很大,在這個專案裏是做成Applet, 可以設定style 及link 等等,由此可以進一步和頁面的javascript 打交道,十分好用~
2007年5月13日 星期日
神奇的 Maven
雖然之前做過一陣子的軟體流程改善,但自從進入校園以後,對於軟體開發應用工具的涉獵持續了約莫一年的空白狀態。
日前因為公司同事的input, 看到了Maven這個工具,真的有些驚豔之感!
簡而言之,它是Apache 的Open Source 專案拿來管理專案的軟體。由於Apache開發的專案算是規模不小,加上要統合分散於世界各地的自由軟體開發人員並非易事,累積在專案管理上的Know how自是不含糊。由這些Know how集成所誕生的軟體就是Maven。
到底 Maven有什麼特別的地方呢? 先來看看沒有 Maven 之前我們是怎麼做事的…
如果你用過 Ant,那你一定不陌生其中的運作流程,它可以compile, test, deploy專案,以及幫忙做其它拉拉雜雜的事。Ant當時之所以成為一顆閃亮的星星,是因為它把在作業系統上一的些操作抽象化出來:比如拷貝、刪除檔案、下javac compile, 在Junit 的framework下跑testcase 等等,變成單單靠設定XML檔加上超級簡單的指令 - ant (或再加上task)即可運作得清潔溜溜。
Maven之所以令人驚豔之處則是,它抽象化了專案開發中更高階的邏輯,你需要做的事情是,設定3rd Party或其它內部專案與你的專案的相依性及一些必要的屬性; 加上指定 test, compile, package, install等等"Phase"裏應該做的事之後,即可簡單俐落的運作。(上述阿里阿咂在Maven的術語中叫做Project Object Management. 是Maven的Heart and Soul~(笑))。如果還有其它配合的工具:比如Archiva, Continuum...等等,即可以做到真正自動化的Repository Management及持續性整合(Continuous Integration)
好吧,說完好話之後,也要反過來看看,Maven的一些缺點:
(1) 要理解它所抽象化出來的專案開發邏輯,有一定的門檻
(2) 許多配合的應用工具,甚至都沒有到1.0版XD
(3) 它的設定蠻煩的
要用Maven管理專案的時候,要想好你的專案需要的是什麼?要怎麼規劃最適合團隊的流程?這是最重要的地方。這也是將問題(1) 打通之後才能做得好的事。
(2), (3) 則是要靠人的測試了,有時(2)會反過來影響流程的設計, (畢竟穩定的開發工具才是開發團隊之福。)而(3)...久久才設定一次,雖然那一次足以令人吐血,不過設定得好的話,大家都會用得笑哈哈~(不過私以為應該可以寫一個wizard讓設定這碼子事變簡單些)
不過雖然說了一缸子的Maven好,要補上一點,敝人還是堅持,能用shell簡單做的事,不輕易用Ant, 能用Ant簡單做的事,不輕易用Maven。這是懶人的偏見和堅持,沒有什麼理論基礎就是了
日前因為公司同事的input, 看到了Maven這個工具,真的有些驚豔之感!
簡而言之,它是Apache 的Open Source 專案拿來管理專案的軟體。由於Apache開發的專案算是規模不小,加上要統合分散於世界各地的自由軟體開發人員並非易事,累積在專案管理上的Know how自是不含糊。由這些Know how集成所誕生的軟體就是Maven。
到底 Maven有什麼特別的地方呢? 先來看看沒有 Maven 之前我們是怎麼做事的…
如果你用過 Ant,那你一定不陌生其中的運作流程,它可以compile, test, deploy專案,以及幫忙做其它拉拉雜雜的事。Ant當時之所以成為一顆閃亮的星星,是因為它把在作業系統上一的些操作抽象化出來:比如拷貝、刪除檔案、下javac compile, 在Junit 的framework下跑testcase 等等,變成單單靠設定XML檔加上超級簡單的指令 - ant (或再加上task)即可運作得清潔溜溜。
Maven之所以令人驚豔之處則是,它抽象化了專案開發中更高階的邏輯,你需要做的事情是,設定3rd Party或其它內部專案與你的專案的相依性及一些必要的屬性; 加上指定 test, compile, package, install等等"Phase"裏應該做的事之後,即可簡單俐落的運作。(上述阿里阿咂在Maven的術語中叫做Project Object Management. 是Maven的Heart and Soul~(笑))。如果還有其它配合的工具:比如Archiva, Continuum...等等,即可以做到真正自動化的Repository Management及持續性整合(Continuous Integration)
好吧,說完好話之後,也要反過來看看,Maven的一些缺點:
(1) 要理解它所抽象化出來的專案開發邏輯,有一定的門檻
(2) 許多配合的應用工具,甚至都沒有到1.0版XD
(3) 它的設定蠻煩的
要用Maven管理專案的時候,要想好你的專案需要的是什麼?要怎麼規劃最適合團隊的流程?這是最重要的地方。這也是將問題(1) 打通之後才能做得好的事。
(2), (3) 則是要靠人的測試了,有時(2)會反過來影響流程的設計, (畢竟穩定的開發工具才是開發團隊之福。)而(3)...久久才設定一次,雖然那一次足以令人吐血,不過設定得好的話,大家都會用得笑哈哈~(不過私以為應該可以寫一個wizard讓設定這碼子事變簡單些)
不過雖然說了一缸子的Maven好,要補上一點,敝人還是堅持,能用shell簡單做的事,不輕易用Ant, 能用Ant簡單做的事,不輕易用Maven。這是懶人的偏見和堅持,沒有什麼理論基礎就是了
2007年5月2日 星期三
悶…
nickname of cat tail on msn: "願你日子久久長長 所有困難迎刃而解"
case 1:
友L: 這是寫給你女兒的話?
cat tail: 不是,是WOW 德來尼npc的口頭禪
友L: .............................
cat tail:期末到了不能打很悶,以資緬懷
友L: .............................
case 2:
友I: 這暱稱聽起來怨氣好重…
cat tail: 啥 這是充滿祝福的德來尼語啊…
友I: 我還以為你在以反諷法緬懷你的前老闆
cat tail:(^^!)..........
case 1:
友L: 這是寫給你女兒的話?
cat tail: 不是,是WOW 德來尼npc的口頭禪
友L: .............................
cat tail:期末到了不能打很悶,以資緬懷
友L: .............................
case 2:
友I: 這暱稱聽起來怨氣好重…
cat tail: 啥 這是充滿祝福的德來尼語啊…
友I: 我還以為你在以反諷法緬懷你的前老闆
cat tail:(^^!)..........
2007年4月21日 星期六
2007年4月16日 星期一
2007年4月8日 星期日
2007年4月5日 星期四
881 Vaio~
用了三年半的Vaio終於退休了
上週因為在喵家的爭執中被當成炮灰摔落後,就一直怪怪的
不但骨架歪歪的,PCMCIA介面也讀不到東西@@
但畢竟不愧是Vaio,還是可以拿來coding 沒問題
真正讓它可以退休的竟然是一個跳電
一下子搞到它硬碟壽終正寢
也讓尾巴下定決心讓接替的小白正式上場
回想起來,這台電腦真的陪伴尾巴好長一段時間
也有不少可歌可泣的經歷
包括
(1) tipo無頭公案之神通on site,
(2) 熱血之CMMI level 3 assessment,
(3) ICM專案之新竹走透透與土城驚魂記,
(4) 溫馨的坐月子中心的死礦冒險
(5) 一整個意外的博班入學
(6) 操死人不償命中央社專案
想起來這三年半真是做了不少事,也經歷了人生很大的轉折
要謝謝Vaio的一路相伴…
也為接手的小白說一聲加油
上週因為在喵家的爭執中被當成炮灰摔落後,就一直怪怪的
不但骨架歪歪的,PCMCIA介面也讀不到東西@@
但畢竟不愧是Vaio,還是可以拿來coding 沒問題
真正讓它可以退休的竟然是一個跳電
一下子搞到它硬碟壽終正寢
也讓尾巴下定決心讓接替的小白正式上場
回想起來,這台電腦真的陪伴尾巴好長一段時間
也有不少可歌可泣的經歷
包括
(1) tipo無頭公案之神通on site,
(2) 熱血之CMMI level 3 assessment,
(3) ICM專案之新竹走透透與土城驚魂記,
(4) 溫馨的坐月子中心的死礦冒險
(5) 一整個意外的博班入學
(6) 操死人不償命中央社專案
想起來這三年半真是做了不少事,也經歷了人生很大的轉折
要謝謝Vaio的一路相伴…
也為接手的小白說一聲加油
2007年3月8日 星期四
Hacking msn MAP api 之 我不要 zoom-in!!
手上的AP架在msn map api 上頭
開發的過程中不得已要和一些細微的地方打架
比如...zoom-in, 我們希望zoom-in level是fix 的
但是無法控制map一碰到dbclick或滑鼠捲動就自動zoom-in的衝動 囧
MSN map api無法讓你有地方將zoom-in 取消
怎麼半?打開map api的source code後
發現註冊在double click和wheel的事件也是private method.
亦即在外頭無法detach event ...
修改它的source code又怕違法
最後想出一個 怪招
確定它的event handle model是bubble up之後
將map div 下的子節點全load 出來,註冊double click及wheel事件為canclebubble=true....
這個解法是絕對依賴msn api吐出的dom 結構
一旦改版很有可能就不work了,或是會影響到其它的功能也未可知
不過有價值的部份是canclebubble up也可以拿來這樣用。雖然acess 不到map 內部的private method. 但是仍然可由這種方法讓它不執行....
開發的過程中不得已要和一些細微的地方打架
比如...zoom-in, 我們希望zoom-in level是fix 的
但是無法控制map一碰到dbclick或滑鼠捲動就自動zoom-in的衝動 囧
MSN map api無法讓你有地方將zoom-in 取消
怎麼半?打開map api的source code後
發現註冊在double click和wheel的事件也是private method.
亦即在外頭無法detach event ...
修改它的source code又怕違法
最後想出一個 怪招
確定它的event handle model是bubble up之後
將map div 下的子節點全load 出來,註冊double click及wheel事件為canclebubble=true....
這個解法是絕對依賴msn api吐出的dom 結構
一旦改版很有可能就不work了,或是會影響到其它的功能也未可知
不過有價值的部份是canclebubble up也可以拿來這樣用。雖然acess 不到map 內部的private method. 但是仍然可由這種方法讓它不執行....
資安小記
趁著回公司做教育訓練的機會,把資安課本又走了一遍
對於Certification Authority(CA)在PKI中的角色又有了新的認識囉…(可喜可賀)
PKI裏,需要 CA(Certification Authority), Certificate signed from CA, Software and protocol.
CA 除了扮演Certificate 發行者的角色外,更重要的是,由於在行政上會對持有Certificate 的個體進行查核,所以對於「有品牌」的CA 簽過的Certificate , 我們持相信的態度。
windows 裏內建一些CA 大家的certificate,用來驗証這些我們平常透過網路與它人交換的簽章
除此之外,你也可以去「相信」其它CA:只要你匯入它們的憑証即可
這裡 可以體驗mutual authentication using SSL under PKI 的 everything (當然,相當程度的簡化...)
對於Certification Authority(CA)在PKI中的角色又有了新的認識囉…(可喜可賀)
PKI裏,需要 CA(Certification Authority), Certificate signed from CA, Software and protocol.
CA 除了扮演Certificate 發行者的角色外,更重要的是,由於在行政上會對持有Certificate 的個體進行查核,所以對於「有品牌」的CA 簽過的Certificate , 我們持相信的態度。
windows 裏內建一些CA 大家的certificate,用來驗証這些我們平常透過網路與它人交換的簽章
除此之外,你也可以去「相信」其它CA:只要你匯入它們的憑証即可
這裡 可以體驗mutual authentication using SSL under PKI 的 everything (當然,相當程度的簡化...)
2007年3月2日 星期五
Hibernate 的 Enum...
列舉..在此不贅述, 不過如果想用Type Safe 的方式把列舉物件用Hibernate 存起來
在3.0可有了新花樣
由於彈性不夠,PersistantEnum 已被打入冷宮
新歡為 UserType
實作UserType 只要定義好列舉物件與實際被Persist 的值(如:1, 2, 3 或 "cat", "dog"...之類)的關係
就可以開工了
UserType for persisting Typesafe Enumerations
在3.0可有了新花樣
由於彈性不夠,PersistantEnum 已被打入冷宮
新歡為 UserType
實作UserType 只要定義好列舉物件與實際被Persist 的值(如:1, 2, 3 或 "cat", "dog"...之類)的關係
就可以開工了
UserType for persisting Typesafe Enumerations
2007年2月9日 星期五
java script 裏 model與view 分離的實現
http://trimpath.com/project/wiki/JavaScriptTemplates
(實作的時候發現在JSP裏竟然不work?
No no....
在控制字串前加個跳脫符號就行囉~ Ex: \${a.b})
(實作的時候發現在JSP裏竟然不work?
No no....
在控制字串前加個跳脫符號就行囉~ Ex: \${a.b})
2007年2月6日 星期二
好書推
本來瞧不太起它的封面(設計得有點大陸廉價書的味道),
一翻之下發現的確是好書
介紹在這裏
http://webnews.giga.net.tw/article//tw.bbs.soc.hsinchu/75904
這裏是試讀版
http://www.learntus.com.tw/download/expr_in_sw_dev--read_n_buy.pdf
作者分享實戰的經驗,十分寶貴
一翻之下發現的確是好書
介紹在這裏
http://webnews.giga.net.tw/article//tw.bbs.soc.hsinchu/75904
這裏是試讀版
http://www.learntus.com.tw/download/expr_in_sw_dev--read_n_buy.pdf
作者分享實戰的經驗,十分寶貴
2007年2月5日 星期一
Information Security Note
上學期資安課程的整理
略過加密演算法過於理論的部份,來看看一個資安系統在技術上可能牽涉的範疇有那些?
(1) Firewall: packing filtering, stateful inspection, application-level gateway, and circuit-gateway.
(2) Encryption, decryption and authentication based on IP Level: IPSec
(3) Encryption, decryption:(provides confidentaility)
symmetric cipher,such as DES, AES;
public key based cipher, such as RSA, eclipse.
(4) Message Authentication:(provides authentication)
MAC, hashcode.
(5) Digital Signature:(provides non-repudiation)
RSA+hashcode, DSA...
(6) Key Distribution Center.(KDC)
the architecture of distributing keys. The key distributed must be genuine.
期未報告是一個web based secure purchase system. 包含幾個模組
(1) key management
(2) digital signature
(3) encryption and decryption
Key points:
Symmetric cipher performs much better than public key based cipher!
Due to we cannot transmit private key over network, (2)&(3) is done by Applet.(only (1) is done by the web server component, because only public keys are managed by server.)
If we want to do mutual authentication, it probably can be done by the existing mechanism built in ap server. (ie. tomcat)
Implementation:
JCE
略過加密演算法過於理論的部份,來看看一個資安系統在技術上可能牽涉的範疇有那些?
(1) Firewall: packing filtering, stateful inspection, application-level gateway, and circuit-gateway.
(2) Encryption, decryption and authentication based on IP Level: IPSec
(3) Encryption, decryption:(provides confidentaility)
symmetric cipher,such as DES, AES;
public key based cipher, such as RSA, eclipse.
(4) Message Authentication:(provides authentication)
MAC, hashcode.
(5) Digital Signature:(provides non-repudiation)
RSA+hashcode, DSA...
(6) Key Distribution Center.(KDC)
the architecture of distributing keys. The key distributed must be genuine.
期未報告是一個web based secure purchase system. 包含幾個模組
(1) key management
(2) digital signature
(3) encryption and decryption
Key points:
Symmetric cipher performs much better than public key based cipher!
Due to we cannot transmit private key over network, (2)&(3) is done by Applet.(only (1) is done by the web server component, because only public keys are managed by server.)
If we want to do mutual authentication, it probably can be done by the existing mechanism built in ap server. (ie. tomcat)
Implementation:
JCE
2007年1月30日 星期二
K論文之自言自語
CHARM: frequent item sets
PrefixSpan:frequent sequence
CloSpan:Closed frequent sequence
BIDE:Closed frequent sequence with more efficeint pruning method.
mining frequent sequences vs. mining frequent item sets
frequent sequence mining has to take ordering of items into consideration. It's more comlicated than frequent item sets mining
PrefixSpan vs. CloSpan
With similar data structure, which is prefix search tree, expands the frequent sequence along the prefix tree.
BUT! CloSpan mines only "Closed" sequence, which means no super sequence with same support. Based on this characteristic, Clospan can prun the search tree more efficiently than prefixspan. (i.e. s1 c s2, and with the same size of projected database, means the subtree of s1 and s2 is exactly same.)
CloSpan vs. BIDE
Both use prefix search tree. But BIDE needs no candicate and filtering process. It uses forward extension event checking and backward extension event checking to exam if a sequence is closed. And uses backscan, a more aggressive pruning method than clospan, to prun the search tree.
why we say backscan is more aggressive? because it needs not to exam the previous mined sequence. Intead, it exams only within current projected database.
PrefixSpan:frequent sequence
CloSpan:Closed frequent sequence
BIDE:Closed frequent sequence with more efficeint pruning method.
mining frequent sequences vs. mining frequent item sets
frequent sequence mining has to take ordering of items into consideration. It's more comlicated than frequent item sets mining
PrefixSpan vs. CloSpan
With similar data structure, which is prefix search tree, expands the frequent sequence along the prefix tree.
BUT! CloSpan mines only "Closed" sequence, which means no super sequence with same support. Based on this characteristic, Clospan can prun the search tree more efficiently than prefixspan. (i.e. s1 c s2, and with the same size of projected database, means the subtree of s1 and s2 is exactly same.)
CloSpan vs. BIDE
Both use prefix search tree. But BIDE needs no candicate and filtering process. It uses forward extension event checking and backward extension event checking to exam if a sequence is closed. And uses backscan, a more aggressive pruning method than clospan, to prun the search tree.
why we say backscan is more aggressive? because it needs not to exam the previous mined sequence. Intead, it exams only within current projected database.
2007年1月29日 星期一
js 之邊走邊接case
javascript 這種語言真的超活
var obj = new Object();
obj[methodname] = function mymethod(){;}
然後...
obj.methodname();
等同於執行 mymethod(這樣也行=口=)
你可以把function由此法動態的attach到任一物件上。
這個寫法用來實作事件的註冊超級乾淨
因為有種情形是,你希望你的物件在某種情況下,例如 新增、刪除、修改
能做一些事,來反應物件的改變,但是這些事是啥事則希望能夠動態指定
這時code 的長像就像這樣
function myobj(){
var myobjhandler = new Object();
this.registerEvent = function(event, handle){
myobjhandler[event] = handle;
}
...........
this.fireevent = function (){
myobjhandler.event();
}
}
var obj = new Object();
obj[methodname] = function mymethod(){;}
然後...
obj.methodname();
等同於執行 mymethod(這樣也行=口=)
你可以把function由此法動態的attach到任一物件上。
這個寫法用來實作事件的註冊超級乾淨
因為有種情形是,你希望你的物件在某種情況下,例如 新增、刪除、修改
能做一些事,來反應物件的改變,但是這些事是啥事則希望能夠動態指定
這時code 的長像就像這樣
function myobj(){
var myobjhandler = new Object();
this.registerEvent = function(event, handle){
myobjhandler[event] = handle;
}
...........
this.fireevent = function (){
myobjhandler.event();
}
}
2007年1月26日 星期五
2007年1月24日 星期三
Java Script 的你與我
目前手上的AP有個迷人(磨人)的特性,就是
Js有邏輯, 而html的頁面操作是與Js的邏輯是相關的
大家討論後,為了把物件的責任切清楚,設計上用了很多callback
怎麼說?
就是在html裏埋了一些 js 的 function
function updateHtml(){
//去和Dom打架
}
然後把這個function註冊到後端物件去跑...
比如
function runUpdateHtml(callback){
//先和邏輯打架
callback(); //再更新頁面
}
這麼一來html端的邏輯和後端的邏輯就可以切得比較乾淨了^0^
Js有邏輯, 而html的頁面操作是與Js的邏輯是相關的
大家討論後,為了把物件的責任切清楚,設計上用了很多callback
怎麼說?
就是在html裏埋了一些 js 的 function
function updateHtml(){
//去和Dom打架
}
然後把這個function註冊到後端物件去跑...
比如
function runUpdateHtml(callback){
//先和邏輯打架
callback(); //再更新頁面
}
這麼一來html端的邏輯和後端的邏輯就可以切得比較乾淨了^0^
socket socket socket
最近的網路作業要寫一個Instant Messaging Server
其中令人頭大的一點,就是要做容錯處理
當Client 連上來立即斷線,或呆呆的啥都不幹時
Server 要把它們踹開,服務其它嗷嗷待哺的Clients
經過詢問Guru 後
決定三種解法
將socket 讀取變成 Non-blocking mode (via fcntl)
int flags = fcntl(*new_con, F_GETFL, 0);
fcntl(*new_con, F_SETFL, flagsO_NONBLOCK);
再搭配計時器
設定socket 的recieve timeout
setsockopt(servSockFD,SOL_SOCKET,SO_RCVTIMEO,&timeval,sizeof(timeoutVal));
動都不動... =口=
經過Guru開釋,發現以下資訊
SO_RCVTIMEO and SO_SNDTIMEO
Specify the sending or receiving timeouts until reporting an
error. They are fixed to a protocol specific setting in Linux
and cannot be read or written. Their functionality can be emu-
lated using alarm(2) or setitimer(2).
總之就是咧 linux 不給改socket 的 SO_RCVTIMEO, 建議自已用select 做polling...當下決定棄城而逃
Blocking mode 的讀取配合另開thread 的計時器
OK, 這純粹是因為Blocking mode效能優於Non-blocking mode, 所以只是想想,倒沒有真的實作。
最後尾巴是理所當然、偷懶的用了第一種解法,不過怎麼看 select + polling 才是王道!改天應該要來研究一下
其中令人頭大的一點,就是要做容錯處理
當Client 連上來立即斷線,或呆呆的啥都不幹時
Server 要把它們踹開,服務其它嗷嗷待哺的Clients
經過詢問Guru 後
決定三種解法
將socket 讀取變成 Non-blocking mode (via fcntl)
int flags = fcntl(*new_con, F_GETFL, 0);
fcntl(*new_con, F_SETFL, flagsO_NONBLOCK);
再搭配計時器
設定socket 的recieve timeout
setsockopt(servSockFD,SOL_SOCKET,SO_RCVTIMEO,&timeval,sizeof(timeoutVal));
動都不動... =口=
經過Guru開釋,發現以下資訊
SO_RCVTIMEO and SO_SNDTIMEO
Specify the sending or receiving timeouts until reporting an
error. They are fixed to a protocol specific setting in Linux
and cannot be read or written. Their functionality can be emu-
lated using alarm(2) or setitimer(2).
總之就是咧 linux 不給改socket 的 SO_RCVTIMEO, 建議自已用select 做polling...當下決定棄城而逃
Blocking mode 的讀取配合另開thread 的計時器
OK, 這純粹是因為Blocking mode效能優於Non-blocking mode, 所以只是想想,倒沒有真的實作。
最後尾巴是理所當然、偷懶的用了第一種解法,不過怎麼看 select + polling 才是王道!改天應該要來研究一下
ajax 同步選項
在Ajax 的實作裏,異步一直是吸引人的特點
但有的時候,同步的操作在維護整體邏輯的正確性上比較容易
If your application needs to be compatible only with IE ...
Ajax call的同步模式,可以使用
req.open("GET", url,false);
不過有個傷腦筋的問題,false 的選項在Firefox裏是不支援的!
而且,另一個隱微但傷腦筋的地方是
在callback 裏被調整的變數直到下一個"新的" function call之前,都不會更新
所以目前的解法是
在callback把一缸子要一起解決的邏輯給run完(就當成是一個transaction一般看待)!
好吧...既然AP附在瀏覽器上 就也只好在屋簷下低頭
不過還是覺得Ajax 雖然開放了異步的便利性,但還是應該提供傳統的同步實作啊啊啊....
但有的時候,同步的操作在維護整體邏輯的正確性上比較容易
If your application needs to be compatible only with IE ...
Ajax call的同步模式,可以使用
req.open("GET", url,false);
不過有個傷腦筋的問題,false 的選項在Firefox裏是不支援的!
而且,另一個隱微但傷腦筋的地方是
在callback 裏被調整的變數直到下一個"新的" function call之前,都不會更新
所以目前的解法是
在callback把一缸子要一起解決的邏輯給run完(就當成是一個transaction一般看待)!
好吧...既然AP附在瀏覽器上 就也只好在屋簷下低頭
不過還是覺得Ajax 雖然開放了異步的便利性,但還是應該提供傳統的同步實作啊啊啊....
訂閱:
文章 (Atom)