Archive for IT Stuff

IM bot個人體驗雜談

近來MSN強迫user upgrade…結果MSN hang的次數多了,真是混漲。所謂的upgrade原來又不過是一堆產品推廣,真是討人厭。

說遠了,其實想說說IM bot。IM bot是甚麼?IM即instant messenger(MSN就是其中之一);bot就是robot的意思。IM bot就是一個機械人,你跟它說話,它會作出相對的回應的。這些說話可以是一些閒聊(有一些閒聊專用的IM bot);可以是一些資訊搜尋類(問問題,它會答你);也可以是一些指令(例如Plurk有一個IM bot來接收指令的),諸如此類。

ICQ

從ICQ說起

ICQ!曾經一度大受歡迎的IM,但幾乎需要超過五分鐘啟動;contact超過400個就會當機,加上競爭對手相繼出現,基本上都被無情地淘汰了。

我人生第一個接觸的IM bot就是ICQ來的,說來大家一定不陌生,就是那種廣發咸網的那種煩人bot。有一天我手痕,對咸網bot的宣傳語句回應了回去,沒想到它竟然會繼續回答!我覺得好有趣,繼續跟它談話,發覺它的對答真是有板有眼,好神奇!在當時技術來說,這已經是非常了不起的bot AI了!要知道中文字多難啊,可以利用十多年前的技術對中文字作出回答,真驚人啊。

IM notification的觸發

早年偶然間看到Remember the Milk有一個IM notification的選項。Remember the Milk是一個管理工作的工具,當中的IM notification就是提醒你夠鐘工作了!我當時在想,這好易做啊,我也能夠做。於是便有自己做IM bot的想法。

IM RSS Reader - Anothr

在我真正想做IM bot的時候,我有過做RSS Reader的想法。就在此時竟被我看到Anothr。Anothr正正就是一個IM RSS Reader,還support MSN/Skype/Gtalk呢!當時心裏有氣,有種被搶先的感覺,決心也要做一個出來。雖然後來證明IM RSS Reader是失敗的…Anothr也收皮了…

MoliuSN出現

坦白說,IM bot在技術上不難,重點是可能性太大了。我就抱著「無聊試試看」的心情寫出了MoliuSN。這傢伙現時做到的主要都是資訊搜尋類型的,例如查股票(有段時間有即時報價的…)、中英翻譯、查看新聞等等…(當初是有RSS reader的,但其實那跟SPAM沒兩樣…)啊,其實自己覺得查股票跟中英翻譯還好用的啦,很方便。MoliuSN的重點是所有資訊都是來自公開的資源︰股票來自Yahoo!;中英翻譯來自Google;新聞來自各大報章。我只希望MoliuSN是一個方便使用者的平台,重點不在於其資訊而在其方便性。所以打工仔可以公然在辦公室查看自己喜愛的股票…

令人失望的Gtalk Translate

大約過了一年後Gtalk推出了GtalkTranslate。我當時心裏真是暗罵了一聲,「怎麼比我遲推出這麼多,比我做的還有點不如啊」甚至寫Blog罵它呢…

Plurk bot與IM bot

Plurk也有一個IM bot,叫Plurk Buddy。它的作用是notify你有人回覆過你的Plurk就會通知你,你也可以直接用Plurk Buddy去post Plurk,也可以下一些指令做一些個人設定之類的。

近來Plurk出現了一些Plurk bot,占卜啦、找youtube啦、post美女圖啦…我不知道它們是怎麼做的,但如果要我做的話一定是用IM bot去做,太易做了,寫一個IM bot去跟Plurk Buddy溝通就好了。原來還有這一招啊,Plurk提供了一個IM bot給你下指令,我就寫一個IM bot去下指令,變相就是一個Plurk bot了。值得參考。

一點點的小結

我還是覺得IM bot的可能性十分大,尤其在這個IM盛行的年代。我自己最起初的概念是,一個方便的平台,就像你的管家你的副官,你一言一語,一個指令,一個問題,你要做的事就解決了,你要問的問題就有答案了。不過後來又發現原來可能性可以有更多更多,就等時代來發掘了。

也談談IM client

看到Facebook的那個status的處理手法,其實不錯啊,share link、share video、share圖片,都只是在那裏輸入自動完成。IM client其實也可以這麼做啊,我send flickr給對方,直接就看到圖片怎麼樣?我send youtube給對方,直接在IM client裏播又怎麼樣?這些其實不難做啊?別老是讓MSN賣一些無謂的廣告,加一些無謂的function…

Comments

CPAN DateTime::TimeZone 好弱雞啊…

由於需要在Perl處理一些TimeZone的工作,考慮過一些系統存在的歷史因素,以及看看CPAN module的最後更新日期,最後選用了DateTime::TimeZone(其實沒得選,本來就在用)。看了一看,最新的release是2009年八月,還不錯嘛。這玩意兒聲稱自己支援Olson TimeZone(其實也只是lookup一個Olson Database而已),好,就看看你有多威。

在這裏我用「Etc/GMT0」來做實驗,不用說,即死。對,不是throw Error,是die。在OlsonDB.pm第155行裏頭可以看得清清楚楚︰假如不支援這個TimeZone的話,他會die

這裏我們清清楚楚的看到兩個問題︰
一、不支援「Etc/GMT0」,我們也可以假定部分其它的Olson TimeZone也不支援。
二、作為library實在不應該die。試想這是Java Library的話,我在Library裏頭有System.exit(0)你會覺得怎麼樣?die是可以catch的,但重點是不應該die

現在看看Catalog.pm。原來那些Olson TimeZone都儲在這裏…在這裏又發現了幾個問題︰
一、Zoneinfo還是放在/usr/share/zoneinfo/比較好吧?
二、很不完整,幾乎全部的ETC TimeZone也沒有,甚至連GMT也沒有!
三、我看了src code,又看了網頁…很驚訝的發現,兩條TimeZone support list竟然是不同的呀~的呀~的呀…

另外,不說我還真不知道,原來有個TimeZone Mideast/Riyadh89 (GMT+03:07),沒錯是GMT+03:07,或者更正確的說是GMT+03:07:04。這個時間是給Muslims用作計算麥加的natural sun time以作朝拜用的。原來如此原來如此。

Comments

IT膠人你唔出聲無人知你膠

行政長官立法會答問大會談話全文(五)
******************
(前略)

譚偉豪議員:多謝主席。主席,作為議員,我們有機會與特首直接溝通,直接發問。但是有很多市民,特別是互聯網界有很多網民,都是沒有機會直接與特首提問,令到他們常向我反映與特首有一定的距離,而他們真的很想爭取這個機會。我亦留意到,國際政治領袖如美國奧巴馬、我們國家主席和總理,也先後透過互聯網與市民作線上交流。我在此想問行政長官兩個問題,第一,不知特首會否有膽量,或者有沒有打算,召開行政長官網上答問大會,這是第一個問題。第二個問題,好多市民也很關心互聯網世界的發展,特別是今年年初推出的淫褻及不雅條例的諮詢。我亦想問特首,特首作為我們特區的特首,以及作為家長,你覺得應否對網絡世界加強監管。

行政長官:(可以不理)

譚偉豪議員:我想追問特首剛才說可以探討與網民在線上即時做答問,我不知特首有否這個能力,懂得網上語言,是要找秘書打,還是自己可以直接在網上與我們的網民溝通?

行政長官:你講的是用...Dialogue?

譚偉豪議員:用中文還是英文在網上直接與他們溝通?

行政長官:我現在日日都在用,日日都用,我不是這樣落後,我正在用。

(後略)

真係頂唔順IT膠人,真係要鬧一鬧。以下用廣東話,勿怪。

首先,居然想叫特首去召開網上答問大會?駛乜咁煩呀?你試下叫特首上高登逛個圈留個言咪知結果囉。黃子華講得好呀︰「想知特首夠唔夠民望連任?你叫特首求其搵個大型屋村入到兜一轉,如果可以無事走番出來,你連任喇!」

仲有呀,個網上搞個答問大會?個系統點得來先?睇死你政府野都唔慌會用街外web2.0既野架啦,咪又係自己寫。想寫幾多年?(特首早就換左人啦!)用幾多錢?經唔經得起一眾網民既QA考驗?我發現到個系統有bug,會唔會告我不誠實使用電腦?而且慌你唔會搞埋D和諧系統呀?我保證無一條問題係鬧特首既!因為統統和諧哂!

好啦,正經野講完,講膠野…

丫,我仲以為譚膠人係想問特首「你識唔識用網絡語言同網民溝通?」呢句好合理,雖然我唔知特首答咩,但譚膠人竟然原來係想問「你會用中文定英文?」

救命呀!!!!!而家做咩呀?封建時代呀?八股文取士?識中英文就識IT?識中英文就可以統紿香港呀?

「請問特首會點樣管治香港?」「你係咪問我會用咩政策呢?」「我問你用中文定英文呀!」

最後…特首最後答果個答案…我仲以為佢講緊霸王洗髮液添…

我現在日日都在用,日日都用,我不是這樣落後,我正在用。
起碼我用了很~舒服
現在每天還在用呢!
還給曾鈺成用!
來來來試試看!

Comments (2)

MSIE: Form-Enter-To-Submit

 MSIE Scary

作為Web Developer,support幾個Browser這些基本要求就不用說了。不過相信各位都很有同感的是,MSIE(尤其IE6)是一樣乞人憎的東西,真是WTF…

JavaScript、CSS就不用說了,近來遇到了Form-Enter-To-Submit的問題,還真是慨歎一句MSIE奇哉怪也。

Form-Enter-To-Submit,簡單點說就是在一張Form內的Text Field或Password Field按Enter來作Form Submit。如果Form內有幾個Submit Element的話(<input type="submit"/><input type="image"/>),一般Browser是會選擇Form內第一個Submit Element作Submit的。因此,假如要設定一個Default Submit Action的話,只需要很爛的簡簡單單放一個Hidden的Default Submit Element在Form內開頭的位置就好。

可是遇到我們偉大的MSIE就沒辦法了。經過細心測試,發現MSIE的Form-Enter-To-Submit有如此的情況︰

  • Form內只有一個Text/Password Field,不會把Submit Element Submit上去。
  • Submit Element不是User肉眼可見的,如加上display: noneoverflow: hiddenvisibility: hidden;甚至乎用position放到頁面以外的,鐵定不會Submit上去。(值得一提是Submit Element假如沒有高度及闊度,以及用一些iehacks的方法都算是「肉眼可見」的,不過有些Browser不支援這些東西,結果只會更煩而已)
  • Submit Element在Load Time不存在的(即後來用JavaScript加上去),不會Submit上去。

那麼何時會才把Submit Element Submit上去呢?如果有幾個Submit Element又會把哪個Submit上去呢?結論是︰

  • 當Form內有兩個或以上Text/Password Field,MSIE會把第一個Load Time存在而肉眼可見的Submit Element Submit上去。(說完也不知自己在說甚麼)

如果要硬來的話又怎麼辦?以下是我這個豬腦想出來的方法︰

  • Form內只有一個Text/Password Field,Submit Element只有一個︰加個無用的隱藏Text Field(不建議,好核突),又或者加個跟Submit Element的Name及Value一樣的Hidden Field就可以。
  • Form內只有一個Text/Password Field,Submit Element有幾個︰千萬不要用剛才加Hidden Field的那招,會令所有Submit都變成Default Submit Action的。唯有加個好核突的隱藏Text Field算了。
  • Submit Element有幾個,但Default Submit Element卻不是第一個︰只好將Default Submit Element強放做第一個,然後用CSS作排位。

以上解決方法都十分爛,沒法子,Frontend不是我專長…歡迎意見。

Comments (1)

盲人RTE

最近公司來了一個新的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…可以讀可以寫明明就已經是天官賜福…

真的被收皮了。

Comments

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

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

Firefox3與Skype extension不相容

如果在Firefox3上安裝Skype extension for Firefox的話,Firefox3是會不時自動Reload的…煩得很…

話說,我足足忍受了兩個星期到了今天才決心徹底去找原因呢,真懶。

Comments

« Previous entries