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

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

如何使用 memcached 做快取

關於 memcached,雖然可以找到一些基本
,DK大神也有點到一些進階議題,不過最近看了 Using memcached PDF 之後才真正學到了不少實戰技巧跟如何設計快取的概念。以下是一些零散的筆記:

裝好之後,基本的啟動方式是

*
memcached -l 127.0.0.1 -P 11211 -m 128 -d for deamon
* memcached -l 127.0.0.1 -P 11211 -m 128 -vv for development debug

memcached 是一套 Name-Value Pair(NVP) 分散式記憶體快取系統,Key 的長度被限制在 250 characters,儲存的資料不能超過 1 megabyte。如果資料會超過 1mb,可以考慮使用壓縮工具,例如在 Rails 2.1 裡就內建了 ActiveSupport::Cache::CompressedMemCacheStore。

除了 memcached server,不同程式語言都有自己的 memcache client library 工具提供更方便的介面。一個基本的任務就是使用 Hashing algorithm 根據 Key 來決定該去存取一台 memcached server (如果有超過一台的 memcached server 的話)。Ruby 的 client 目前檯面上有幾套 1. memcache-client 2. fiveruns fork 版 memcache-client,針對 Hasing 的部份用C改寫了 3. 使用 libmemcached 的超快 memcached

有趣的是,不需要 client library,memcached 是可以直接 telnet 127.0.0.1 11211 的。telnet 之後打 stats 可以得到一些統計資料,除了目前共有多少筆資料跟共用多少空間之外,重要的有 cmd_get 跟 cmd_hits,就可以得出 cache hit ratio,這個數字應該努力到九成以上。另外還有你的 cmd_set 應該超過 cmd_get,

其他的 memcached 標準操作有 SET (新增或是更新一個值)、ADD(只有在該key不存在時,才會新增快取資料成功)、REPLACE(只有在該key已經存在時,才會更新資料成功)、GET(拿快取資料)。

在考慮使用 memcached 前,要知道它不是你系統中唯一的 cache,HTML 的整頁快取應該用 Web server、純 SQL query result 可以用 MySQL 內建 Query Cache,設定很簡單,效果很不錯 (Cache Performance Comparison。我自己的心得是很多時候你想要快取的物件其實並不是一個 SQL query 就可以搞定的,而是多個 SQL query 才計算出來,這時候去做純快取 SQL query result 我個人覺得也許不是很有意義,Rails 這部份就有人實做了query_memcached。。

另外要注意的是 memcached 並不是 persistent data store,只要一關掉 memcached server,裡面的資料就會通通不見,如果要拿來儲存 session authentication 資料要特別小心。

寫 memcached 程式的第一個問題是找出什麼資料需要快取? 一個常見的問題是我該快取 HTML fragment 還是純資料結構? 如果你操作介面只有一處用到,我們可以只快取 HTML fragment 即可,不然其實規模稍大的網站其實兩者都可以快取起來。

撰寫使用 memcached 程式的基本模式就是,先查看有沒有 key-value,有就把快取資料讀出來,沒有就運算結果後存到 memcached sever。這部份算是簡單的。真正困難的事情有兩件:一是清除過期的快取資料(expire),二是Key的命名。
閱讀全文〈如何使用 memcached 做快取〉