Spakit: A SPA Rails plugin

Spakit 源自 registrano.comMassage,是一個可以讓你將現成的網站輕鬆轉換成 SPA (single page application) 的 Rails Plugin。只需在 view 中換用 Spakit helper,不需要更動 controller code,就可將超連結和表單送出變成 Ajax 送出並更新頁面。

spakit 目前放在 github,另外也包成 gem,安裝方式如下:

 gem install spakit
 cd /your_rails_app/vendor/plugin
 gem unpack spakit
 mv spakit-0.9.0 spakit

並且 rename 成 spakit。裝好之後,首先建立一個 Spakit 專用的 Layout,一個簡單的範例如下:

# /view/layouts/spakit.rhtml
<p><%= flash[:notice] %></p>
<%= yield %>

接著就可以使用 Spakit 專用的 helpers,目前有 spakit_link_to, spakit_form_for 和 spakit_form_tag 三種可以使用,用法如下:

spakit_link_to 'new person', :url => new_person_path
spakit_form_for @person, :url => people_path

如此按下連結或送出表單後,Spakit 就會送出 Ajax request(i.e. prototype’s Ajax.Updater ),然後將回傳的 HTML 結果更新到#content 區塊。

如果你想要支援 Ajax 的 Histroy Bookmarks,建議可以採用 Really Simple History(RSH) library 來處理瀏覽器的上一頁下一頁問題,這部份的範例程式附在 plugin 的 README (使用到 jquery library,好心人有空可以幫忙寫 prototype version)。

P.S. 這篇文的英文版在 Handlino’s blog

如何寫出有效率的 Ruby Code

又來推薦 PDF 武功秘笈, Writing Efficient Ruby Code

Ruby 是個很慢的語言,但有些作法應用得當,還是會有不錯的改善。不過要知道程式碼的可讀性跟執行效率有時候是衝突的,這點還需拿捏,尤其 software life cycle 一開始可讀性比較重要。有句最佳化的經典名言一定要引一下:

未成年就這麼優,是一切邪惡的根源
Premature optimization is the root of all evil

這裡紀錄一些看到有趣的事情,PDF 裡有更詳盡的 example code。

閱讀全文〈如何寫出有效率的 Ruby Code〉

新年快樂: Blog is back

硬碟 crash 之後,因為工作忙也就暫時沒管。這幾天試著把硬碟接起來救救看,還蠻慘的幾乎讀不到什麼,只好用手邊一個多月前的資料庫備份來重建,除了留言五月份之後的都不見了 :<。WP Theme 也重挑新的。

前幾天過了25歲生日,這個年紀還蠻令人害怕的,已經不能說是小孩了。回顧今年,畢業後就沒打算念研究所,如願地把補充兵當完,然後繼續投入這個從大一就開始接觸的網路軟體業,百家爭鳴熱熱鬧鬧的一行。

這幾個月很少寫部落格,都在忙著開發 Registrano,真槍實彈的用 RESTful Rails 2.0 寫 code,幾個月下來也已經能自在地應用 REST 概念(還有踩到不少 Rails edge 鐵路地雷… XD),也寫了幾個 plugins 近期準備釋出。2008 將至,目前的計畫將以四月的 OSDC.tw 為一個大 milestone,把 Registrano 做到理想中的 Software as a Service 程度,希望能藉此經驗投出一個 Modern Rails2 Development – The Registrano Way 議程。

Textmate with SVNMate

推薦個 Textmate 超棒 plugin: SVNMate,這是一套 TortoiseSVN-like Interface for TextMate,讓每個檔案會有個小小的 icon 來表示目前的 SVN 狀態,非常方便。
下載執行就會裝好了,進入 Textmate 的 Preferences 可以換喜歡的 icon 樣式。
一般來說,簡單的操作我會用 Textmate 內建的 alt+shift+A 來操作,不過 commit 東西一多的話,我會改用 svnX。
by the way, winson 介紹的 Visor 也棒極了,樂。

Mac 安裝軟體 Part 2

承上一篇,把後來裝的軟體也列出來:

  • Growl 好玩的自動提示,可以吃其他應用軟體的訊息。
  • Parallels Desktop *: 可跑 Windows 的厲害軟體
    • Office 2007 : Mac 版的 Microsoft Office 用不習慣
  • NetNewsWire *: RSS Reader, 用這個就不想用 Web 版的 Reader 了。
  • OmniWeb * : Webkit based Browser,喜歡他的 Tab 在左邊 改用 Safari 4 了
  • iWork * : 主要要用 Keynote 做投影片,08新版的 Number 也還不錯用適合簡單的試算表。
  • Koolclip: 紀錄下你每次的複製文字 或 Jumpcut 更輕量
  • Onyx: System/Disk 整理工具
  • Colloquy: IRC client,當 server 上的 irssi 不能用的時候的替代軟體
  • Panic Transmit*: Mac 上超棒的FTP軟體
  • Panic CODA*: 可以遠端操作的多功能網頁編輯器
  • PEMDAS: 超棒的 dashboard 的計算機,本來內建的難用死了。
  • Screenshop Plus : 螢幕抓圖的 dashboard 工具,簡單又好用
  • Nally: 終於可以在 Mac 上好好打 BBS 了… m_m
  • Navicat* : 專業的 MySQL 軟體,如果你有舊版本MySQL的編碼問題無法順利dump出來,可以試試。

另外 MacOS 10.5 Leopard 也在用了,雖然大體上跟 Tiger 差別不大。不過我覺得最讚的是搭配 Spaces 虛擬桌面功能,可以把整個 Windows XP 開全螢幕到一個 Space,非常方便切換。而 Finder 超強預覽功能跟 Dock 支援文件夾也不錯用。Time Machine 也推薦使用,我本來都一直懶得備份,現在只要把外接硬碟接上一切就自動了。

推薦 Rails Code Review PDF

Update: 原作者有摘要在 Massive List of Rails Development Tips一文

推薦 peedcode.com 上的 Rails Code Review PDF,廢話不多蠻實用的,一路看下來馬上學到好幾招跟不錯的工具,簡單走訪一下:

Store Sessions in the Database

用 ActiveRecord 存 Sessions 在 AWDwR 第二版都已經變成入門範例了,不過這裡提供的 Rake code 不錯用,幫你清除資料庫中過期兩週的Sessions 。

Use Custom Configuration Files

別把 config 統統扔到 environment.rb,可以拆成獨立的 YAML 檔案。也因此可以不必將 production mode 才用到的設定檔(如API密碼等)丟進 repository, 搭配 Capistrano 在 deploy 的時候從複製過來就可以了,

Use Constants for Repeated Strings

Keep Time in UTC

一開始就用 UTC 當預設時區

Don’t Loop Around ActiveRecord

ActiveRecord 跑迴圈的時候小心產生一筆一筆 SQL queries 啊,請愛用 :include 一次就把(子)資料讀出來,而不是一筆筆去捅資料庫。甚至直接寫點 SQL conditions,目標是讓 SQL query 一次即可。若要用 :select 請搭配 :join。

Beware of Binary Fields

若欄位有 Binary data,用 find 時請務必愛用 :select 只讀出必要欄位。另外也建議使用 with_scope method 或 scope_out plugin

Cache Your Reports

Store Country Lists

別用 Rails 內建的 country_select,自己寫 Model才有彈性。

Avoid Bloated Controllers

RESTful 對 controller 的建議: 別塞太多 action 在一個 controller 裡。

Keep Your Controllers and Views Skinny

實在是 Rails 的原罪: 因為 ActiveRecord 提供很多好用的 method,所以我們習慣把 code 塞到 controller 甚至 view 裡。正確的作法應該盡量重構至 Model 中 (例如有複雜參數的 find ),有可讀性、可測試(model unit testing)跟好的MVC。請看這篇經典文章 Skinny Controller, Fat Model。這裡作者又在推薦了一次 with_scope

Don’t Store Objects in the Session

別這樣做 session[:user]=user,你的memory很快用完,而且session資料跟db資料不一致,請用 session[:user_id] = user.id。真要存 object 請裝 Memcached 吧。

Avoid Heavy Response Processing

耗用時間的操作請用 queuing system,入門方法可用 rake 跟 crob 自動執行,進階有 BackgroundRB, Amazon’s SQS 等。可以試試 acts_as_state_machine 這個 plugin 來設計自己的排程系統。

Use ActiveRecord Mailing

寄送大量郵件,介紹 ar_mailer plugin

Monitor Your Servers

最基本的 exception_notification plugin 是 production mode 必裝,一旦發生例外會寄信告知你。作者還介紹了一堆工具。

Don’t Cut Costs on Hardware

Test-Drive

The Rest of the List

  • 使用 database indexes
  • Profile your code: ruby-prof gem
  • 不一定要裝大的 ImageMagicK,有小巧的 mini-magick 或 image_science 就可以縮圖了。
  • 使用 attr_protected 來保護重要欄位
  • Automate deployment: 使用 Capistrano or Vlad