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

Capistrano 自動化 deploy Rails

今天花了點時間在自己的 server(FreeBSD) 上試用 Capistrano,這是一套讓你在 local 透過 SSH 自動執行遠端任務的 deployment system,當然最常見的應用就是 deploying Rails applications 了。

老實說,第一次的設定還真讓我 try and error,尤其前一陣子剛出 Capistrano 2.0 版,變更了一些用法,所以很多舊範例就不敢用了,而官網上的文件也實在有點簡略說… ^^@ 其中關於 the “spin” script 的部份不甚解原理(?),最後的做法除了讓登入的帳號有 sudo 權限,也需要先手動登入執行第一次的啟動 sudo script/process/spin。

anyway… 還是照著 Getting Started 配著過時的 AWDwR 2nd. Chap 27 來做,值得注意的有

svn 的帳號密碼要這樣設定

set :scm_username, “username” # svn user name
set :scm_password, “password”

另外你應該不會把 database.yml 給 commit 出去,所以先建立好一份來做複製。

namespace :deploy do
desc “Create database.yml ”
task :after_update_code, :roles => [:web] do
db_config = “#{shared_path}/config/database.yml.production”
run “cp #{db_config} #{release_path}/config/database.yml;”
end
end

最後的成果是只要打 cap deploy,就會自動連到 server 上,執行 svn checkout 出最新版本,跑些客製的 script,然後重新 restart mongrel cluster。

為甚麼 Capistrano 這麼被重視呢? 這種 deploy 的過程,其實必定是個一再執行的過程(嗯,除非不需要再開發升級了),而且隨者時間演進,這個過程常常會有各種客製的 script 要執行,例如檔案變更/重新載入 config/清除 cache…etc

然而在發行新版本的時候,往往卻也是已經寫了好多程式,累的要命的時候,這時候一個已經自動化的 deploy process 就像甘霖露水,你不會想一個個手動執行那些複雜步驟的(而且萬一漏做了甚麼,都是無可預期的 disaster )。

Update(2007/9/1): 改在 Mac 上做 deploy,又卡關了好久:

把 /script/process/spin 的內容改成慣用的 mongrel_rails cluster::restart。

depoly.rb 中所有 run rake 的地方,多加完整 rake 路徑。以及 set :rake, “/opt/local/bin/rake”

我暫時沒有開 sudo 權限,所以 cap deploy 的最後一步 restart 會失敗,到這裡就只好手動囉。

Update(2007/9/4): 關於 sudo,應該再新增以下設定

set :use_sudo, false

至此應該一步 cap deploy 就可以搞定了… :)

Update(2007/9/5): 真是一天一牛步在修這個 script,請再加上環境變數 (因為 Capistrano 用 SSH 登入後並不會讀取你的環境變數啊~),還有 deploy:restart 也重寫過吧,不需要使用 /script/process/spin :

default_environment[“PATH”] = “/Users/ihower/bin:/opt/local/bin:/bin:/sbin:/usr/bin:/usr/sbin”

desc “Restart Mongrel”
task :restart, :roles => [:app] do
run <<-EOF
cd #{current_path} && mongrel_rails cluster::restart
EOF
end

至此終於一步 cap deploy 就可以搞定了(Mac)… :)

by the way…解釋一下架構,這邊是用 mongrel_rails cluster 跑在一群 ports 上(例如8000~8002),再搭配 Apache Proxy 機制把 HTTP request balance 到各個 mongrel 上。這是目前 deploy rails 最建議的 solution。

關於 apache settings 照抄 AWDwR 2nd. 的就可以 work 了,跑 cap deploy 的時候也不需要重開 apache,這兩個元件是獨立的。

TextMate tips

Update(2007/8/9): 從 Midnight Blog 得知一個跟 TextMate 相關的 Rails Plugin 叫 footnotes,功用是當頁面跑爛掉的時候,會自動在發生錯誤的檔名上加上超連結,點下去就自動開TextMate到那一行去,真是方便到了極點。

工欲善其事,必先利其器,花了點時間研究 TextMate Editor 有那些好用的快捷鍵跟功能:

  • 按 ESC 會有 autocomplete 的功能,他會搜尋該文件已經有的詞彙。
  • F1 收合程式區塊
  • Command+ option + [ 整塊自動縮排
  • Command + / 整塊加註解
  • Command + ` 切換不同Textmate視窗
  • snippets 功能,只要輸入特定關鍵字之後按 tab 就會出現整塊程式碼

走訪檔案

  • Command + T : 跳到特定檔案
  • Command + option + 右: 切換Tab
  • Command+ shift + T 跳到特定的method
  • Command + W 關閉 tab

走訪文件

  • Command + 右 到行尾
  • Command + 上 到頁頭
  • option + 上 跳段落
  • option + 下 跳頁
  • Command + F2 加註記點
  • F2 跳到註記點
  • Command + option + 1 或 2 或 3,會收合縮排層次

在 terminal 中也有支援 command-line 指令:

  • mate -h
  • mate . 打開整個目錄
  • mate app config lib test 打開特定目錄

另外讓我嚇到的是 subversion 的強力支援,只要按 ctrl+shift+A 就會出現快捷選單。本來以為只有簡單的功能,但其實還蠻強大的,commit/update都不成問題,而且可以很方便查到該檔案的log,看來可以減少使用 svnX 了…:p