Ruby Tuesday 2008 歲末場 開始報名

各位喜愛 Ruby 的朋友們,Ruby Tuesday 復出首場開始報名囉,詳細資料請前往報名網頁,時間地點是 2008/12/23(二) PM7~9 台北市蛙咖啡。

這次的題目非常難得,godfat 介紹的 Rubinius 和 contagious 介紹的 Merb 都是 Ruby 社群中非常看好其發展的兩套 Open Source Projects,相信可以帶給大家不一樣的視野跟想法。

RESTful Rails 入門開課 (自由軟體技術教學工作坊)

Update(2008/12/12): 上課的網頁在這裡 ihower.tw/course/rails.html,投影片在這裡

感謝 OSSF 自由軟體技術教學工作坊 的邀請,下週四我會在台北開一堂 Ruby on Rails 稍微進階一點的上機實做課程(主辦人不忘提醒我這是推廣教學課程,盡量簡單一點),詳細內容請參考課程介紹

  • 如果從未寫過 Ruby,建議可以看看Ruby Programming Language 網站的 Get Started 部份,或是 Learn to Program,大概了解一下語法。
  • 如果從未接觸過 Ruby on Rails,建議可以一起報名參加另一堂 Ruby on Rails 導覽 (講師不是我,不過內容應該比較簡單)。
  • 如果您有看過、簡單用過 Rails,但是對於 Rails 2 開始採用的 RESTful 設計不明瞭(例如為什麼Rails一代的 scaffold 用的好好的,但是升級二代之後的 scaffold 就看不懂了?為什麼照市面上的Rails書打範例都是地雷沒辦法執行?因為市面上的中文書都太舊了沒講 Rails2 啊。),建議可以來聽聽看。
  • 如果這份投影片的內容您已經會了,就不用來佔人位子囉。

Ruby Tuesday Returns 開始報名

各位喜愛 Ruby 的朋友們,Ruby Tuesday 復出首場開始報名囉,詳細資料請前往報名網頁,時間地點是 2008/11/25(二) PM7~9 台北市果子咖啡。

嚷嚷說要重辦 Ruby Tuesday 好久了,因為覺得辦活動挺麻煩的,所以一直都只是嘴上說說…. XD
直到兩個禮拜前布丁大人去買了 ruby.tw 這個響當當的網址,在 hlb 跟 gugod 聯手凹(鼓勵?)的情況下,就決定衝了。

首先是要找講者,沒想到還蠻順利的 :p 賣一下人情就把三位講者拖下水了(?) 其實大家都非常樂見能有一個社群活動可以分享技術、聯絡感情,所以都二話不說就答應了,甚至還說可以贊助活動費用(怎麼好意思呢,都已經沒有講者車馬費了XD),真是超級感謝。

lukhnos 將會分享他們公司如何使用 Ruby script 來取代一些 shell script 的工作。tsechingho 會介紹及比較 substructspree 這兩套 Rails E-Commerce 平台。contagious 則是講解 DataMapper 這套比 ActiveRecord 厲害的 ORM 工具,同時他也預約了下一場 Ruby Tuesday 會繼續介紹 DataMapper 的好夥伴 Merb web framework。

Ruby Taiwan 第一次辦社群活動,請各位舊雨新知多多捧場囉,我們會出沒在 IRC freenode #ruby.tw 頻道,歡迎多多指教。

MerbCamp 2008

身歷其境的看了兩天的 MerbCamp,主辦單位提供的 Webcast 非常流暢,幾乎沒有 delay。(怎麼會這麼厲害呢?! 我連 youtube 或 Y! Live 沒有不 delay 的啊…orz),讓我在家就可以參加地球另一端的研討會,真是棒極了。(雖然英文聽的哩哩落落,不過還是很爽。It’s free!)

主辦單位也在 IRC 上開了 #merbcamp 頻道,講者們似乎也都在上面,隨時都有一些 link 丟出來可以看看,有什麼問題也可在上面提出(例如: webcast 沒聲音或沒影像等轉撥問題反應)、講者QA時間也可以從 IRC 上面問,主辦單位會幫你問講者,非常有參與性。

以下整理自我在twitter的簡短 Merb 心得:

  • Merb router’s defer_to method is awesome!! # keep routing logic in the route, even authentication.
  • merb slice use 100% public API of merb core, not like rails engine broke with each rails upgrade. :)
  • MerbAuth’s “strategy” looks good to support multiple login methods(password, open id…etc) in the same app.
  • Although merb is ORM-agnostic and JavaScript library agnostic, but everybody loves DataMapper and JQuery ;)
  • Merb team will not implement RJS. RJS sucks!
  • It seems that Merb::Plugins is very different from rails plugins: Merb has hooks and public/stable API ;)
  • Merb really hates monkeypatching and alias_method_chain.
  • Rails has no public/private/plugin API, every method is API. That’s why rails developer must use monkeypatching and alias_method_chain.
  • Ruby is not slow! merb is faster than PHP (frameworks). see benchmark.

也有人做了詳細的筆記:MerbCamp Day1, MerbCamp Day2,最後一場 Keynote 的 Merb Performance Benchmarks 特別有意思:Merb without template 與 pure PHP 平分秋色,Merb with template 就大勝 CodeIgniter 和 CakePHP 這兩套 PHP web framework 了….. XD 找了一下這幾套的 benchmarks 比較,發現連 Rails 還不算太慢麻,比 Zend Framework 跟 CakePHP 都還快上不少,所以比較起來應該是 Static >> PHP > Merb >> CodeIgniter > Rails >> Zend Framework >> CakePHP。

投影片大部分在 slideshare 上可以下載的到。同時間 Merb 也將發佈 1.0 RC (即 0.9.9) 版本,所有 API 都將定下來(Merb team 非常強調保證他們的 public API will be stable and backwards compatibility for 1.x,我想大家都被 Rails 一升級就有 plugin 會爛掉非常感冒),相信在過不久就會有越來越多的文件可以看(目前還很缺啊!),是個不錯的進場時機。

物件導向程式的九個體操練習

最近在翻 The ThoughtWorks Anthology(知名軟體顧問公司 Thoughtworks 出的文集),裡面有篇 Object Calisthenics 蠻有意思的。

好的物件導向設計很難,我們都很同意何謂好的設計原則:高內聚力(cohesion)、低耦合(loose coupling)、不重複程式(Don’t Repeat Yourselp)、封裝(encapsulation)、可測試性、易閱讀性等等,但是實際寫的時候卻不容易化身為一行行的程式碼。這篇作者列了九條規則,並建議你練習寫個千行程式嚴格遵守看看,用以改善你的OO實作能力。

初次看到這九條時覺得有點誇張,但其實濃縮了不少OO想法在裡面,如果有閱讀過重構或物件導向設計原則等概念,應該能夠聯想到很多東西,挺有趣的。

1. 每個函式裡面只能有一層縮排,如果需要多一層,請多寫一個 method 去呼叫。

這個規則其實就是要求嚴格遵守 Compose Method:將邏輯操作轉換為細目等級相同的步驟,避免過深的邏輯而無法迅速了解,相信大家應該都有看(寫)過M型程式吧 :p

2. 不要使用到 else 這個關鍵字。

避免寫出複雜的 nested conditional 程式。不論是”重構“或是”重構-向範式前進“這兩本書,都有很多篇幅花在討論如何簡化條件邏輯,作法包括

a. 重構一書提到的 Replace Nested Conditional with Guard Clauses 方式,直接使用 return 返回,不要再 else 了。

b. 請愛用 Ternary Operator:也就是 boolean-expression ? expr1 : expr2。很多簡單的 if else 都可以用 Ternary Operator 簡化到一行一目了然。舉個 Ruby code 例子:


if ( is_something )
"foo"
else
"bar"
end

如果改成三重操作子就俐落多了:

( is_something )? "foo" : "bar"

另外初心者也常寫出根本不需要 if else 的情況:

def is_foobar
if ( a > 0 )
return true
else
return false
end
end

其實只需要這樣就可以了:

def is_foobar
( a > 0 )
end

c. 第三招要先念點書,請善用物件導向的多型(polymorphism)能力,請參考設計模式的 Strategy pattern 或重構的 Replace Conditional with Polymorphism

閱讀全文〈物件導向程式的九個體操練習〉