EragonJ – A humble navigator

About EragonJ | About this blog

Archive for February, 2010

[PHP] Shark – 整合性 plurk bot

leave a comment

圖 from here



這是我最近一直在做的東西,也許是因為之前「JaceJu」的那堂課讓我對物件導向的模式有點嚮往,所以就試著用用看物件導向的概念在這次的專案下,先來介紹一下這個玩具吧:


一開始我是看到朋友們一直在討論plurk bot這個玩具,所以就想說來做個什麼(其實我就是一個很怪的人,我很多做出來的小玩具都是因為看到人家的討論串才開始做的,而這次也不例外XD),因此就想打造一個整合性的plurk bot,而不是只為了特定功能而實作的東西。我想可能也是受到Hax4理念的刺激,為了製作出讓人家覺得有趣又好玩的東西,所以我們必需把最麻煩的部分都實現並封裝起來,就算使用者不是一個程式設計師(我也不是XD),也能夠輕易的上手,這就是我的想法。


實作的部分,因為我是在PHP下做的,所以就沿用官方認可的php-plurk-api,用他們已經實作好的API去和官方做溝通,這真的是省事很多,這樣我就不用自己刻一個爛爛的介面來用了,也提昇了穩定度。因此整個Shark class是直接繼承它的類別,再設計新的骨架在其之上,一來我可以開心的使用API,連第三層的使用者也能輕易的使用(繼承真的是很神,更神的是所有在plur-api下的Method都是protected的,大家都可以開心用XD),所以這樣一來我沒有破壞到它原始的架構,反而再多建了一些我想做的東西讓大家玩,這樣真酷!


講這麼多,快點上我在Github上的Shark專案把相關的核心抓下來玩玩看吧,忘了說,我本意是想讓大家都可以輕易做像是「小籤籤」的plurk bot,可以自動回覆一些特定資訊,而一些設定的細節就麻煩去看我寫好的說明啦,如果對這個專案有什麼建議的話,麻煩直接回信到我的信箱並在主旨打「About: Shark」,我就會盡快回覆你的。

感謝你的觀看XD。

δ 目前Shark有改版的資料並徵求有志之士來寫好玩的規則,請看站內的另一篇文
δ 整個專案是相容於php_plurk_api 1.4,但是目前最新是1.4.2版,這點要注意一下。

Written by EragonJ

February 7th, 2010 at 2:53 pm

Posted in PHP

Tagged with , , , ,

[Ruby] 8th word

leave a comment

不知道自己還會持續寫多久,雖然自己內心有千百個不願意學Ruby(就是單純不想而已,那個Fu不對),不過我還是會繼續加油的。就當作翻譯書吧XD…

現在要再延續上次講的equality。如果還有點印象的話,應該是談到「==」operator吧,既然有正就有反,當然有「!= (Not equal)」啦,書上說,只要原先的「==」operator有被定義的話,那麼這個operator就是把它的值做invert的動作,true←→false那個值互換,所以這在Ruby1.9之前,Ruby會自動把這個operator給你使用for free!!(前提是你有定義好其「==」的動作),而在Ruby1.9之後,類別可以自己定義自己的「!=」operator來達到自己想要的效果。

有時候很該死的就是會出現很多相似的Method,這真的是很煩,因為要了解他們之間那極度細微的差異,不過也不能怪誰,因為那是別人規範好的= =…

3.8.5.3 The eql? method

「eql?」是一個不做type conversion的Method,來看一下他和「==」的差別:

原來如此呀,恩恩…

3.8.5.5 The =~ operator

這就酷了,看到這個就想起RE的日子,YES,這就是用在做Pattern matching的operator,被定義在String和Regexp的類別下,不過書上也說了這其實和equality沒有什麼太大的關係,只不是有個「=」就把它放在這邊XD,所以只要記得這是拿來做Regular Expression用的就好了,來個小例子,其他深入的後面再談:

3.8.6 Object Order

這邊有一個好玩的東西叫做物件的排序,哇靠這是啥?我原本也不知道它想幹嘛,不過看一下書後就了解許多了。通常每個類別都會定義「==」來了解equality,而有些類別,還會定義「排序」。什麼意思咧,假設有BC兩個都是A類別的實體,我們可以定義說它那兩個實體是「相等」,還是B比C小。原本我看到這都傻眼了,這是什麼鳥,完全看不懂呀,但是它下面提到了「Number」這個類別就是一個很明顯的例子,整個一下子就通了!!!

怎麼說呢?因為萬物皆OO的Ruby,其實「數字(123)」個別都是一個物件呀,而我們的數字可以比大小,就代表在某些類別下是可以比大小的,因此在某一方面來說就是做了一個排序的動作,這樣子是不是就很好了解了!?

所以如果我們要在Ruby做「排序」這件事情的話,就要使用「<=>」這個operator。「A<=>B」代表說,如果AB就會回傳1。來看個例子:

但是因為這個Operator不太直覺,所以類別都會再include「Comparable」模組來做混入(mixin),而它定義了這幾個operator如下:

下面這個是我在說明內找到的一個還蠻容易看懂的範例,可以參考一下他是怎麼做到的:

另外有一點雖然前面提過了,但是還是要注意一下,那就是Comparable模組沒有定義「!=」,不過Ruby會自動幫我們先做「==」的動作再把結果Invert,所以就免擔心啦。

最後要是書上提到的一個NaN的情況(0/0的時候),而比較的結果就請看一下Code啦:

這邊來了一個問題,為什麼「nan.euqal?(nan)」的結果是True??沒錯,因為他們兩個都是指向同一個object,所以結果為真,這邊要注意一下!!

BTW,通常「==」會被覆寫掉,但是「Aobj.equal?(Bobj)」是不應該在子類別被覆寫的,這是說明上面特別強調的一點,還要再注意一下!!

就是這樣,這篇就先到這啦,我要來去玩了XD~

Written by EragonJ

February 3rd, 2010 at 7:18 pm

Posted in Ruby

Tagged with , , , , ,

[Git] Personal Configuration

leave a comment

設定個人Info

設定在Terminal所顯示的顏色(這個很好用)

出處

Written by EragonJ

February 3rd, 2010 at 4:34 pm

Posted in Git

Tagged with , , ,

[ZeroJudge] p001 Minesweeper

leave a comment

最近又開始覺得很無聊,所以要回去寫題目來練習,剛好就拿ZJ2的Minesweeper來小試一下,

點我看題目

這個題目就是要實作簡單版的採地雷(概念上),所以還蠻有趣的XD。

P.S. 我發現我之前寫ACM的文章都是用code tag包起來,但是只要沒有相對應的Css來搭配就真的是什麼都顯示不出來,有夠給他難看的…我晚點再來把他們都放上gist!

Written by EragonJ

February 2nd, 2010 at 2:37 pm

Posted in ACM

Tagged with , , , , ,

[Ruby] 7th place

leave a comment

3.8.4 Object Class and Object Type

在這一大堆的Object下,要找到其所屬的類別還真的是有點麻煩,特別是我們又不知道有哪些類別的時候= =,所以還好萬物階OO的Ruby有提供了幾個Method來用,如果先前有留心例子的話應該都有看過了,不過沒關係,再看一下吧:

酷哦,有看到的就賺到了,因為這邊除了Object#class這個Method外,還提到了Class#superclass這個Method,可以用串接的方式一直串下去,找到階層架構下最項層的Class直到nil。

但是在Ruby1.9下就有點不一樣了,Object在階層架構下不再是Root的角色(如上例):

True,Object上面還有一個叫做BasicObject的parent class,再上去才是nil,這和Ruby1.8有點不一樣,可能要注意一下。這在後面的7.3還會有更詳細的說明,就先丟者吧XD

所以要判斷一個Object的類別就可以這樣做啦:

當然也還有另一個選擇:

當然,如果要再進階一點,你還可以這樣玩:

大概了解了一下那些函式的玩法,這邊又提到一個「===」運算子可以代替「is_a?」這個Method,所以上面有用到該Method的都可以改成「===」來玩,在這邊有說到,不要了解該Object的類別,我們只要知道有哪些Method可以用就好了(暫時),要不然我們應該會陷入鬼影追追追的Loop吧XD。

另外如果我們想要知道該Object有沒有那個Method的話,可以這樣子測試:

3.8.5 Object Equality

講完了一堆霧沙沙的Method,也只有等哪天真的要測試的時候會比較有用,不過就先記下來自己研究吧XD(懶人),在這邊要來討論一下比較Object的一些相同性。

3.8.5.1 The equal? method

這個「equal?」的Method是被定義在Object這個類別下,用來測試兩個值是不是參考到同一個Object用的,對於兩個不同的Object的話,就會回傳False,來看VCR:

OH,MY,這個真是個經典的例子,如果在前面幾章的地方,我們有討論到字面上去宣告一個Object會產生的情形,就是每一個值都會參考到不同的Object,而這邊就是再次使用了這個例子來做說明,讓我們知道雖然兩個Object都叫做「Ruby」,但是其實是代表不同的「Ruby」,所以B、C都參考到了同一個「Ruby」,而A則參考到了另外一個,也就是為什麼一個euqal?的結果為False,另一個卻是True的原因了。

不過我們也可以用「==」來做到相同的事,只要A.object_id == b.object_id就可以啦,因為先前提到的,每個Object都會被授與一個Unique的Object Id,不知道大家還記不記得XD,還好我還沒忘記咧,差點就要被你們唬爛過去了QQ。

好啦,先玩到這邊,晚點再來寫別的內容,大家快去吃東西吧XD。

Written by EragonJ

February 2nd, 2010 at 2:24 pm

Posted in Ruby

Tagged with , , , , , , , ,