November 19, 2008 at 12:31 am
· Filed under IT Stuff
最近公司來了一個新的Part time鬼佬,寫JS的,近來幫我的大忙著手搞Rich Text Editor(RTE)。
今天他走來向我說了一句︰「(翻譯)這個RTE用Table做Layout不好。」(順帶一提,這RTE我沒有碰過)
為甚麼呢?「If a blind person views the site, the screen reader will say “table cell 1″ and then there is no data inside.」
我聽完呆了,囧。嘩,堅,連盲人也照顧在內,我完全壓根兒沒想過!當時的感覺簡直是窩囊極了!完全是自慚形穢,一副被收了皮的樣子…我輸了!
但話又說回來…盲人用甚麼RTE呀…還用Smilies…可以讀可以寫明明就已經是天官賜福…
真的被收皮了。
Permalink
October 21, 2008 at 1:13 am
· Filed under IT Stuff
this.uid = this.uid;
這是甚麼爛Code呀…基本上,拿著這句Code去見工,被踢出門口是理所當然的事。在公司寫這句Code,被老細炒魷魚也是很自然的事。
但這句神奇的Code解決了我的問題,簡直匪夷所思!
我用了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的壽命延長,達到簡單解決問題的效果。
好神奇!
Permalink
October 19, 2008 at 5:06 pm
· Filed under IT Stuff
昨晚在旺角的稻香吃火鍋,不幸地困Lift,被營救出來時還被職員罵我們亂按云云,真是莫名其妙。
右邊這幅老土到爆的圖就是那電梯的使用者介面的大概樣子。相信大家都不能不同意,這個使用者介面實在太簡單了吧。
就當是我們這群乘電梯的使用者亂按好了,細想一下,如果在一個只有有限輸入的使用者介面上亂按也會造成系統錯誤(就是困Lift了),那麼這究竟是使用者的問題呢,還是設計者的問題?
簡單的介面,就是要易用,對象就是一群Dummy User,亦即猴子也懂得使用。試想猴子又怎麼會懂得何謂亂按呢?這好像在嬰兒玩具中放進手槍,然後責罵嬰兒胡亂選擇玩具一樣的笨。
話又說回來,我們可以常常看到電影中的政府國防機構裏,總會有一個很大的紅色按鈕,按下不外乎就是發射導彈,又或者是基地自爆之類的。好方便!我個人的感想是︰
十年也未必會發射一次導彈,百年也未必會自爆!這種使用率極不頻密的功能,要那麼方麼幹甚麼?
要發射導彈又或者是自爆,總要有一大堆複雜的設定才對,一個紅按鈕就能做到這麼神奇的功能嗎?導彈要射向哪裏?基地幾秒後自爆?如果是有額外的設定介面的話,那這個紅按鈕的作用又是甚麼呢?
簡單的介面就是要易用,對象通常都是比較沒那麼聰明的。難道政府高級機關入全都是白痴嗎…
回歸主旨,這個簡單的紅按鈕,如何群免使用者亂按的問題?(這個紅按鈕的吊詭情況跟電梯內有一個「困Lift」的按鈕一樣的詭異)如果說使用者都是一群很Advanced的用家,那麼又為了甚麼而設計一個簡單易用但又無法做設定的紅按鈕呢?
畫公仔懶得畫出腸了。每天都在設計UI的人當然會明白這簡單的道理(真的很簡單,我自己也猶豫寫不寫這篇文章)。當然,簡單易用(User-friendliness)也不一定只能做一些簡單的工作,不過,一定有取捨。另外,既然是簡單易用,那就對Robustness要有很高的要求才行,不然就只是在設計一個易用的介面去摧毁系統而已。
想要用一個紅按鈕就能精確對某地點進行定位,並完美地通過各項最後檢查,然後自行倒數發射導彈,還能夠防止任何錯誤輸入,這在現階段來說,我想還是一個痴人說夢話的夢想。
當然,我舉的例子也太極端了。
Permalink
October 10, 2008 at 1:40 am
· Filed under Bookmarklet , IT Stuff
早幾天在寫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的,這要注意。努力地尋求解決方法中…
Permalink
October 7, 2008 at 7:56 pm
· Filed under Ubiquity , IT Stuff
名字有點長,考慮把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-format 及json-tree 的Input是這樣用的︰在任何HTML上Select一堆JSON text(會做Validation,如果不是JSON會告訴你的),然後Run Script就可以了。如果沒有Select任何東西的話,Script會自動把現在HTML上的text都當成JSON(當然會Validate)。這樣做是方便愛直接看WebService return的JSON的那些人,連Ctrl+A Select都省回了。
Permalink
September 25, 2008 at 10:07 pm
· Filed under IT Stuff
如果在Firefox3上安裝Skype extension for Firefox的話,Firefox3是會不時自動Reload的…煩得很…
話說,我足足忍受了兩個星期到了今天才決心徹底去找原因呢,真懶。
Permalink
September 25, 2008 at 5:22 pm
· Filed under IT Stuff
MPlayer循環隨機播放
以前提及過如何用一句Command去用MPlayer播歌︰
$ mplayer -loop 0 -shuffle *.mp3
這兩天不小心把這Command打錯成︰
$ mplayer *.mp3 -loop 0 -shuffle
結果呢,只要MPlayer播完排列上是最後一首歌的時候,MPlayer會不斷自我重複播這首歌。
試一下就可以發現,這跟-loop 0這個Parameter的位置有關,如果是放在Filename之後就會有怪事發生。而事實上MPlayer的Usage是︰
$ mplayer [options] [url|path/]filename
所以呢,MPlayer本身也不算有Bug,只是沒有Handle罷了。
我的MPlayer版本是1.0rc2-4.1.2。
Permalink
September 22, 2008 at 10:09 pm
· Filed under IT Stuff
基於多種Browser作Testing的關係,一直沒有把Firefox upgrade做Firefox3。可是近來由於Ubiquity的關係,忍不住還是upgrade了。
我是Firefox2跟Firefox3並存的(一起開也可以,只要用不同Profile就可以了,只不過我沒必要也懶得搞),而Firefox3在Linux上只有Tarball的安裝版本,沒有Package甚至RPM。而那個Tarball也不用build,extract後就是executable了。
我的運氣不好,我的Firefox3沒有Flash的Plugin,幾乎做不了工作。我是用Fedora7的,即使用YUM︰
$ yum install flash-plugin
沒有用。因為YUM並沒有真的把flash-plugin放進你的Firefox3裏去。解決方法是把libflashplayer.so這個檔案找出來,把它放到<FIREFOX3_DIR>/plugins/裏去,這就可以了。
Permalink
September 22, 2008 at 1:03 am
· Filed under Ubiquity , IT Stuff
早前自發性地為公司用Ubiquity做一些Integration,搞了一舊叫Obiquity的東西。理所當然地被束之高閣,大家都忙嘛,自己一頭熱也沒甚麼用。眼見近來同事們頻頻詢問有關JMeter的問題,本來想再為公司寫一些JMeter的Plugin,無奈未有明確的目標,還是搞回MoliUbiquity 的好。
進度還是很慢,只有四個Command︰hsi(查看恒指)、stock-quote(查看股價)、json-format(執靚JSON)、geoip(GeoIP tracing)。另外也加了多些Documentation及Metadata(有品的Developer…)。
會多些瀏覽相關Forum及Mailing list。話又說回來,在Wiki的Commands in the Wild 的那頁,怎麼有不少都很頹…有很多連Preview都沒有。個人認為Preview的功能在Ubiquity中是非常重要而且偉大的一環。難道連Developer本身也對Ubiquity不太重視?大家要努力啊。
Permalink
September 9, 2008 at 12:51 am
· Filed under IT Stuff
立法會選舉開票,資訊科技界功能組別IT膠人譚偉豪險勝香港互聯網協會會長莫乃光。
首先說一說譚博士此位仁兄。其人自稱為IT達人,為電子辭典快譯通的發明人。其經典節目《IT達人Talk》曾經一度令全港巿民震驚,「IT人無仔生」「IT潮語」,睇到O哂嘴(據聞當事人於當選即日刪除YouTube上之《IT達人Talk》),認真膠力無限。其人為了型的關係,更於選舉網頁上(開始時選舉網頁連政綱也沒有呢…)放上iPhone式樣設計的相框,後來被人發現侵犯了知識產權,轉了另一個電話型號。
還是實際一點,說回政綱。譚博士政綱,以「產業、創業、就業」為主,著政府成立乜乜成立物物。我告訴你,如果把譚博士政綱內的「IT」字樣全體Global replace成「土木工程」,一樣行得通。你明白我的意思嗎?這份政綱,根本就是一份官方Template,把Placeholder換上「IT」二字而已!這份無疑是一份政綱,卻絕不是一份資訊科技界的政綱! 從中我只嗅到各大財團有利可圖的味道,何利之有?推動這推動那,又搞甚麼工程,既然是跟足官方Template的政綱,各大財團又怎會無利可圖呢?
轉個頭來看看莫乃光的政綱︰「For ICT For Hong Kong」以3I’s 4C’s 4T’s為骨幹。3I’s指資訊自由(Information freedom)、資訊保安(Information Security)及資訊基建(Information infrastructure);4C’s指加強資訊科技政策的承擔(Commitment)、推動電子公共服務和公民參與(Civic access)、保護知識產權制度促進創意(Creativity) 及以科技支持環境保育(Conservation);4T’s指人才(Talent)、科技(Technology)、包容(Tolerance)和地理優勢(Territory Assets)。作為真正IT人,我還未細看內文,已經知道這才叫資訊科技業界的政綱呀譚膠人!當中尤為重要的是3I’s,亦是莫乃光很強調的一點。香港的IT競爭力有很大部分來自資訊自由及資訊保安,這兩點中國、新加坡、台灣等等地方絕對遠遠比不上。還記得淫照風波嗎?在警方IT低能的執法手段下,莫乃光就挺身指證那只會引起白色恐怖。譚先生,你當時除了抽水之外你還有做過甚麼?依閣下的政綱你又如何保障網民的網上安全?如何保障網民受莫須有之名被捕?
總括而言,譚的政綱是一份Template,停留於Web1.0的封建年代;莫的政綱則很明顯是IT界的政綱,是跟隨潮流而走的Web2.0(莫乃光甚至開放自己政綱成為維基網頁)。而當中最教我耀眼的,是莫的政綱可不止於照顧IT界別,而甚至於全體香港網民。這才叫人深深感受到IT的切身性及重要性,而不是去搞一些工程成立一些甚麼局做得到的。以快譯通的思維去搞Web2.0的IT,過時了。
現在譚先生當選了,還真是說句恭喜。我倒是想問︰
你口中指的IT人究竟是甚麼人?橫看豎看你說的那堆IT人都是電腦維修員之類的員工。不知道我等Computer Scientist算是你的IT界嗎?
老老實實,閣下的IT知識究竟有多少?我不知道,所以才問!閣下斷不會認為我看兩段《IT達人Talk》就會覺得閣下IT知識高明吧?
你究竟切切實實的能為IT界做些甚麼?或者說,我有甚麼著數?別叫我看政綱,我看不明白!
下次選舉,我入會拿個投票權好了。投票給誰也不要緊,至少,我沒有現在這麼遺憾。
Permalink