Archive for October, 2008

this.uid = this.uid;

this.uid = this.uid;

這是甚麼爛Code呀…基本上,拿著這句Code去見工,被踢出門口是理所當然的事。在公司寫這句Code,被老細炒魷魚也是很自然的事。

但這句神奇的Code解決了我的問題,簡直匪夷所思!

Page Flow

我用了Tapestry 5.0.14這個Framework。Tapestry很強調一件事,就是當進行Form POST之後Server會Response一個Statue Code 302,使Browser對自己進行Redirect。這樣做的原因是防止Ugly URL以及避免User進行Refresh Page時會重新做多一次Form POST的動作。

而Tapestry呢,每個Page都會有一堆Local variable,Life Cycle是一個HTTP Request。所以,基本上再進行Form POST到另一個Page後再來一個302 Redirect,那堆要POST過去的value是會死掉的(即Life Cycle完結)。

Tapestry對於Life Cycle的問題是以@Persist去解決的。對一個variable加上@Persist,就是說延長其Life Cycle直至永久,加上@Persist(”flash”)就是可以生存兩個HTTP Request,很明顯就是為了要把Form Data從一個Page帶到另一個Page去的(Form POST + 302 Redirect = 2 HTTP Request)。至於@Persist(”cookie”)等就不作討論。

前言完,而如圖中所見,現在我有一堆Object在Page A的Scope內。我希望由Page A進行Form POST到Page B,再由Page B Form POST回到Page A後,那堆Object還在。(注意︰中間過程那堆Object的Life Cycle有否完結我並不在乎,只要到最後那堆Object還是那堆value就好)

主要可以用Client-side或者Server-side的去解決︰

  • Client-side
    • Form hidden field︰這是最常見亦最可行的方案。把那堆Object在Page B的Form裏用hidden field記好,然後再POST回Page A。不過首先那堆Object能否Serialize是首個問題(在我的情況是可以的,不過會費一番功夫…),其次假如那堆Object是Dynamic(每次的Object數目、Type都不一樣)那也有一番麻煩。但總之是可以解決問題的方法。
    • Cookie︰根本不用考慮。首先同樣會有Serialize的麻煩(雖然@Persist(”cookie”)的話好像可以把麻煩丟給Tapestry),其次我們無從得知那堆Object的容量有多大。總沒可能有10Mb的Cookie吧?加上Cookie這種隨意被User改動的東西基本上不能100%信任的,個人認為。
    • HTTP GET Parameter︰就是把整個Object放進URL裏。同樣有Serialize的麻煩,加上Ugly URL、URLencode等等麻煩…更容易被User改動,還有某些Browser對URL長度有限制,不作考慮。
  • Server-side
    • Server-side-session︰就是@Persist了。由於@Persist(”flash”)在進行(2)302後早就死掉了,在(3)Form POST時根本幫不上忙。使用@Persist連把Object pass過Page B也不用,是最簡單的解決問題方法。只不過,他的Life Cycle是優點也是缺點︰他不會自己死!簡單點說就是要人手去控制那堆Object的Life Cycle(總不能一直Persist吧!?),在複雜的System下還真是叫救命。加上User有些Action是Out of system control的,例如Browser refresh、手動輸入URL等等,要一併Handle的話,well…

最可行的方法似乎就是Form hidden field了吧。不過我還是死心不息的想搞Server-side-session。其實@Persist(”flash”)本來是最好的選擇,因為他自己會死掉嘛,如果@Persist(”flash”)能夠生存三個HTTP Request就好了,一切的麻煩都可以解決。在(1)Form POST時的Object在(3)Form POST回去時還在,而且自行在Page B死亡,真好。

逆轉思考︰要控制variable何時死實在麻煩,但要控制一個variable在何時應該繼續生存,似乎就簡單多了。

又再細想︰@Persist(”flash”)的Life Cycle是兩個HTTP Request,然而是怎麼開始計算的呢?在這裏我就做了一個假設︰從variable被Assign value那一刻開始,variable可以生存兩個HTTP Request。

這就有趣了,所以我在(1)Form POST完結後加上了一句爛Code︰

@Persist("flash")
private Integer uid;
...
this.uid = this.uid;

結果這個uid成功地由Page A pass過Page B,並且成功生存至(3)Form POST並在(4)302 Redirect中pass回Page A。這句爛Code的作用,就是令variable的壽命延長,達到簡單解決問題的效果。

好神奇!

Comments

困Lift與使用者介面

昨晚在旺角的稻香吃火鍋,不幸地困Lift,被營救出來時還被職員罵我們亂按云云,真是莫名其妙。

右邊這幅老土到爆的圖就是那電梯的使用者介面的大概樣子。相信大家都不能不同意,這個使用者介面實在太簡單了吧。

就當是我們這群乘電梯的使用者亂按好了,細想一下,如果在一個只有有限輸入的使用者介面上亂按也會造成系統錯誤(就是困Lift了),那麼這究竟是使用者的問題呢,還是設計者的問題?

簡單的介面,就是要易用,對象就是一群Dummy User,亦即猴子也懂得使用。試想猴子又怎麼會懂得何謂亂按呢?這好像在嬰兒玩具中放進手槍,然後責罵嬰兒胡亂選擇玩具一樣的笨。

話又說回來,我們可以常常看到電影中的政府國防機構裏,總會有一個很大的紅色按鈕,按下不外乎就是發射導彈,又或者是基地自爆之類的。好方便!我個人的感想是︰

  • 十年也未必會發射一次導彈,百年也未必會自爆!這種使用率極不頻密的功能,要那麼方麼幹甚麼?
  • 要發射導彈又或者是自爆,總要有一大堆複雜的設定才對,一個紅按鈕就能做到這麼神奇的功能嗎?導彈要射向哪裏?基地幾秒後自爆?如果是有額外的設定介面的話,那這個紅按鈕的作用又是甚麼呢?
  • 簡單的介面就是要易用,對象通常都是比較沒那麼聰明的。難道政府高級機關入全都是白痴嗎…
  • 回歸主旨,這個簡單的紅按鈕,如何群免使用者亂按的問題?(這個紅按鈕的吊詭情況跟電梯內有一個「困Lift」的按鈕一樣的詭異)如果說使用者都是一群很Advanced的用家,那麼又為了甚麼而設計一個簡單易用但又無法做設定的紅按鈕呢?

畫公仔懶得畫出腸了。每天都在設計UI的人當然會明白這簡單的道理(真的很簡單,我自己也猶豫寫不寫這篇文章)。當然,簡單易用(User-friendliness)也不一定只能做一些簡單的工作,不過,一定有取捨。另外,既然是簡單易用,那就對Robustness要有很高的要求才行,不然就只是在設計一個易用的介面去摧毁系統而已。

想要用一個紅按鈕就能精確對某地點進行定位,並完美地通過各項最後檢查,然後自行倒數發射導彈,還能夠防止任何錯誤輸入,這在現階段來說,我想還是一個痴人說夢話的夢想。

當然,我舉的例子也太極端了。

Comments

Dilbert x Banker

此為Dilbert於07年八月廿二日的漫畫,非常應景…所以抽來改一下。

第一格不用改了,因為原文用字十分正。

Comments

如果雷曼可以用公帑賠,咁我強迫金有冇人會賠?

中新網10月8日電 香港《大公報》今日在“要聞”欄目報導稱,港府早前建議銀行按市值回購雷曼迷你債券,但此舉被大部分雷曼苦主齊聲反對,要求得到全數的賠償

香港民建聯7日約見300名苦主,聆聽意見,並同時提出新建議,促請特區政府動用40億元,填補在銀行回購迷你債券時出現的差額,使雷曼苦主取回應得的資產。民建聯同時提出共四項建議,並承諾將向特區政府施壓,以協助受影響的投資者取回原有資產。

又係一群受道德沖昏頭腦既人。

之前汶川地震又係咁,政府自作主張撥款100億去賑災。喂,老細,D錢我有份既,你有冇問過我先呢?

「咁既情況你都反對捐錢賑災?你無人性!你唔係人!」呢D就叫受道德沖昏頭腦。道德大過天,就唔理處理事件對或錯,總之我做呢件事既動機係出於善心,你反對,即係同道德搞對抗!

而家我無話唔肯捐,問題係出係你既處事手法,你拎我D錢去捐之前有冇問過我先?正如你係銀行做定期,佢有朝一日同你講話你D存款全部拎哂去做善事,你又會點諗?

我同意雷曼苦主係好可憐,而且我假設佢地100%都係受人欺騙,全部都係唔貪心既人,非常值得同情。我亦都唔想討論話投資要自己承受風險既責任感問題,總之佢地好抵幫啦。

咁都未答到點解要用公帑賠番畀你喎?

冤有頭債有主,你俾人呃點解會係叫大家賠番畀你?銀行唔肯賠,而政府好蝦D所以就屈政府呀?民建聯,你抽錯水。你要做既係繼續要求銀行賠償,而唔係屈政府去補差價!銀行呃你,叫民建聯幫你去告銀行囉?政府應該做既係幫你追討賠償,而唔係政府自己去賠償!

講到呃,強迫金就真係呃啦!定哂法律每個月叫大家交筆錢出黎,畀班專家去管,點知而家遇上金融海嘯渣都無剩,呢度又有冇得賠?政府用法律黎打劫我喎?我每個月唔交錢會犯法架喎?但我眼見金融海嘯都要倒錢落海?呢單係政府屈我既,係咪更加應該賠?我輸打贏要?強迫金真係名副其實既「焗賭」喎,我無得唔供架喎?

整個總結,廢事誤會我無良無同情心︰

  • 雷曼苦主好可憐,抵幫;
  • 民建聯討好巿民用錯方法,唔敢向銀行追討而去恰政府;
  • 政府你應該做既係幫苦主向銀行追討,唔係直接賠償了事。

Comments (6)

JSON-Tree的Bookmarklet

早幾天在寫json-tree的Ubiquity的時候,當時心想其實Ubiquity並不是那麼普及,而json-tree又不用call甚麼WebService,要更方便用的話,寫Bookmarklet其實更好。

於是就著手把Ubiquity改成Bookmarklet,那些Escape還真是麻煩透了,不過總算成功。

JSON-Tree <= 這個就是了

不妨到這裏找些例子試試看,很簡單的,把JSON用Browser開出來,再用那個Bookmarklet就可以了。

測試過對Firefox3、Firefox2、IE7都Support(對Firefox3會做一些特別處理…因為一些Display Style只有Firefox3才有),也分別Support text/javascript及text/plain的Content-type(哦…是有點不同的,至於application/json就有點愛莫能助了…)。

不過呢,假如JSON內有亂碼,又或者有整張沒有Escape的HTML在JSON data內的話現在是不Support的,這要注意。努力地尋求解決方法中…

Comments

MoliUbiquity 20081007

名字有點長,考慮把MoliUbiquity改成MoliUbi算了。

也申請了一個SubDomain叫ubi.shawtim.com,但我很懶,只是把它Redirect到原來的那版而已…

今次的改動以及一些感想︰

  • 對之前的HTML String parsing形式的Data extraction方法其實極度反感。之前這麼做的原因是因為Ubiquity的那個Preview window是沒有HTMLDocumentObject的,想用jQuery做Selection也不行。近來才後知後覺地知道有CmdUtils.getHiddenWindow()這東西,這東西是有HTMLDocumentObject的。於是全部Data extraction都改成jQuery形式了…
  • 對於json-format那個Script決定重寫,call WebService去做是很簡單,可是沒有必要,因為並非Data extraction。再說,沒有WebService的話是快很多的,而且Format的形式也可以在自己的控制範圍之內。
  • 其實我想說json-format那個Script我是不會用的了…因為另外寫了一個json-tree的Script。json-tree做到的比json-format更多,Support對JSON object內每一個Array/Object的Collapse/Expand,對理解整個JSON object更有效。json-format的原意也是想看清楚整個JSON object吧?
  • 為了更方便用,json-formatjson-tree的Input是這樣用的︰在任何HTML上Select一堆JSON text(會做Validation,如果不是JSON會告訴你的),然後Run Script就可以了。如果沒有Select任何東西的話,Script會自動把現在HTML上的text都當成JSON(當然會Validate)。這樣做是方便愛直接看WebService return的JSON的那些人,連Ctrl+A Select都省回了。

MoliUbiquity



Comments

現代的袁崇煥

明代名將袁崇煥,民族大英雄,一代政治、軍事家。一生忠君愛國,最後卻以「通虜謀叛」之名被處以磔刑。磔刑,就是凌遲。「劊子手割一塊肉,百姓付錢,取之生食。頃間肉已沽清。再開膛出五臟,截寸而沽。百姓買得,和燒酒生吞,血流齒頰」當時百姓誤以為袁崇煥通敵賣國對其恨之入骨,而將他的血肉一塊塊割下來吞食。

與凌遲之痛相比,被所愛的國家、所愛的人的啖肉之痛,我不知道袁崇煥覺得那種痛楚比較慘烈。袁崇煥,絕對是個可敬的悲劇人物。

尤幸袁崇煥並非生於這個年代、這個地方。在這裏,正義不得伸張。當你為國家為民族為每一個你所愛的人伸張正義,抱打不平時,無奈地,你所愛的,還未受皇太極的反間計,就已經主動地啖你的肉,飲你的血。動輒更冠上罪名,使你獲得一生臭名含恨而死,連靈魂都不得安息。沒有人會報答你,而你所付出的代價,極大。大得不能承受。

也許只有像袁崇煥那樣的英烈人物才能無懼地伸張正義抱打不平,如我之流就只敢含淚而吞聲。我不知道這是一個怎麼樣的社會,竟然可以如此地歪曲是非、道德錯亂。如果這個局面是有位邪魔一手造成的話,那麼這位邪魔的心計,實在可怕得難以想像。

這位邪魔最可怕的地方在於自發性的白色恐怖。只要有人偶有表達對邪魔的不滿,民眾便會迫使其成為袁崇煥。要麼就是踏上被所愛之人啖肉飲血的路;要麼就是忍氣吞聲被冠上「無膽、立場不堅定」的懦夫之名。這比起納粹的蓋世太保秘密警察,不是更勝一籌嗎?

執筆至此我自己也覺得很痛心。然而我又哪有資格呢?我敢說每個人自己也曾對愛自己的人啖過肉飲過血。電視上的民主鬥士、街頭見義勇為的良好巿民、身邊的多年朋友、愛錫自己的父母。你自問沒有做過嗎?

救救每一個袁崇煥,好嗎?

Comments

恐怖!核突!Food Court阿姐驚人舉動!

今朝落去Food Court食早餐,係收銀Counter前面駭然見到有隻大甲由反左肚,郁下郁下係度典地…

於是我指住隻甲由係度怪叫啦,有個執緊碗既阿姐就笑笑口咁走埋黎問我︰「見到咩呀?」然後佢二話不說…

火速將甲由一野捉起掉入佢堆碗碟度!!!!!

哇!!我指住堆碗碟係度尖叫,執碗阿姐就衝左入廚房…

然後Counter阿姐就講左句令人好囧既說話︰「車,我都唔驚既。

唔知點解我又會坐低食早餐。期間執碗阿姐不斷地「安慰」我︰「無事既掉左喇無事既…」

Comments (2)

整頓紀律?

某朋友謂,其前公司有位員工,是該公司唯一一名Game Designer,很多事情都只有他一個人知道。

話說這名員工請了數天的假,而老闆在這幾天忽然有問題要問,欲尋人而不果。

於是,老闆為整頓紀律,將這名員工開除!

世上膠人還真是何其多啊…

Comments

八娼‧九儒‧十丐

有讀歷史都知道,元代時漢人被分為十流︰一官二吏三僧四道五醫六工七匠八娼九儒十丐。

九儒,也就是說讀書人比娼妓的地位更低,只比乞丐的地位高一點而已。當中當然不乏政治因素,但其時對學術風氣的注重,可見一斑。

時至今日,九儒還是九儒。讀書人的出路是甚麼?簡單,九儒之前是甚麼?八娼。放棄你的尊嚴,老老實實地做鴨去吧。做著自己不喜歡做的事而收到報酬,這不是做鴨是甚麼?

堅持自己的尊嚴,決不出賣自己?很好,九儒之後是甚麼?十丐。乞食去吧。

Comments