7/17 (二) Ruby Tuesday: Rails Testing

Update: 今日的投影片在這裡,預計下回再來分享 BDD&Rspec,屆時會在講清楚 mock 的用法…:)

不小心被 lukhnos 拱了出來… :p 我要分享的主題是 Rails Testing,有時間的話,也打算提一下 RSpec,這是一套從 TDD (Test-Driven Development) 改進發展出來的 BDD (Behavor-Driven Development) 開發方式。

時間是晚上 8:00-10:00,地點沒錯的話會到新 opcafe,屆時也請大家分享一下寫 testing 的經驗吧… :)

用 Hpricot 來 parsing HTML

Update(2009): 新的 Ruby XML parsing 王道是 nokogiri 了 (via The State of XML Parsing in Ruby (Circa 2009))。

Hpricot 是個快又好用的 Ruby HTML parser,點子來源是 JQuery。它的兩大優點是 1.速度快,因為核心用C改寫了 2.好用的介面,你可以用CSS selectors,element IDs,tag types 等。

其它的優點還有可以吃 XML,可以吃 invaild 的 HTML,甚至可以更改 document 結構。

首先是安裝

gem install hpricot

基本用法

require 'rubygems'
require 'hpricot'
document = <<END
<ul>
<li>first item</li>
<li>second item</li>
</ul>
END
doc = Hpricot.parse(document)
(doc/'li').each do |item|
puts item.inner_html
end

出來的結果就是 first item 跟 second item 囉。其中 (doc/’li’) 意同 doc.search(‘li’),就是搜出 li 這個 tag。

進階用法

可跑 nested 迴圈,而除了 inner_html,也可以抓屬性值如 attributes[‘href’] 。我拿交大某站來練習一下:

require 'rubygems'
require 'hpricot'
require 'open-uri'
url = "http://www.pac.nctu.edu.tw/news/news_msg.php"
doc = Hpricot(open(url))
doc.search('table tr td div.tbCopy font').each do |item|
(item/'a').each do |nav|
puts nav.attributes['href']
puts nav.inner_html
end
end

心得是若 HTML 有好的結構,則 hpricot 可以快速走訪到你想要的位置。例如有設定 element IDs 或 class 的話,就可以用 doc.search(‘table#myid’) 或 doc.search(‘span.myclass’) 快速到位。

不過就算是如上述的老式HTML網站,要找 CSS selector 只要搭配服用 firefox extension Web Developer 也不難解決,點選 CSS > View Style Information 就可以看到路徑了。

RubyGems 簡介

RubyGems 是 Ruby 的 Package 管理系統,讓你輕易安裝及管理各種 Ruby programs/libraries。

你可以去 rubygems.org/pages/download 下載回來,執行 ruby setup.rb。在 Freebsd 下則可以進 /ports/devel/ruby-gems/make install 安裝。

gem -v 告訴你 RubyGems 的版本
gem update --system 升級你的RubyGems版本
gem install gemname 安裝某個套件
gem list 列出安裝的套件
gem list -r keyword 列出 RubyGems.org 上有此關鍵字的套件(可用regular expression)

你可以跑一遍 gem list -r > remote_gem_list.txt 來拿到全部的清單

不是所有的 gems 都用 Ruby 寫的,有用 C extensions 的會需要 C/C++ compiler。因此安裝的時候,會出現 ruby/mswin32,後者直接提供 binary gem。不過win32上還有是例外,需要要下載回來裝再執行某些動作,例如 gem install RMagick-win32-x.x.x-mswin32.gem 再 ruby postinstall.rb 云云,看README吧。

gem check --alien 檢查你安裝的套件有沒有壞掉或被修改過。
gem update gemname 更新最新版本
gem update 更新所有你安裝的Gems
gem install -v x.x.x gemname 安裝特定版本
gem uninstall gemname 反安裝

程式中要使用 library 的話,用法如下:

require 'rubygems'
gem 'gemname','>=1.0.0' # 若需要指定版本的話加這行
require 'gemname'

其中 gem 在更早的版本是寫 require_gem,新的 Rubygems 為了避免與 require 混淆已改名(一個是檢查版本,一個是真正引用,兩者不一樣),這也是因為新版 Rubygems 把 autorequire 的功能拿掉了。

Rails on Cygwin 之Mac-like開發環境

Update(2007/7/3): Midnight Blog 的 Rails on Cygwin #2Rails on Cygwin #1 這兩篇提供不需要 complie MySQL 的方法,值得一試。

Update(2007/5/12): 裝 Mongrel 也沒問題喔,比Webrick好用多了。記得選 ruby 版而不是 win32版。

主要是參考這篇 A Mac-esque Rails Development Environment on Windows,在 Windows上打造類似 Mac上的 Rails 開發環境。

1.裝 E-TextEditor

2.裝 cygwin,記得 Package 要有 Ruby、gcc跟make。之後忘了裝什麼沒關係,再跑一遍setup.exe就可以了。

3.裝 Console,一套有 tabs 可以切換不同視窗的 command prompt,除了可以跑 windows的cmd,當然也可以跑 cygwin的bash shell,還可以設定背景半透明喔。不知道為什麼版本很多,我是裝 Console-2.00b123-Beta 最沒問題。

裝好後在 Settings 新增一個 tab shell 執行 C:\cygwin\cygwin.bat 即可。

  1. 裝 Ruby Gems,下載 rubyforge.org/frs/?group_id=126&release_id=9501,解壓縮後執行 ruby setup.rb。 (注意這是給 cygwin 的,會裝在 /usr/下,跟你裝windows版Ruby在 C:/Ruby/是兩回事)

5.裝 Rails,gem install rails –include-dependencies

5.裝資料庫,complie 噩夢的開始…:p 我參考了 RailsonWindowsCygwin  跟 RailsOnWindowsCygwinWithSQLite3,把 source code 下載到 cygwin 上,然後 configure 跟 make,這可讓我小小的NB跑了好幾個鐘頭。

Sqlite3 比較沒問題(照著做即可)。MySQL的話非常神奇,雖然你真正是要用 MySQL windows 版(常駐成服務),但是為了在 Cygwin 上可以 work,你在 Cygwin 上也必須裝 (但不用啟動 mysql.server)。我碰到的問題是在 cygwin 中連 localhost 會連到 cygwin 的 MySQL 而不是 windows 的 MySQL,拜過G社大神後,找到的解法非常簡單,只要改連 127.0.0.1即可 (rails 的 database.yaml 把 localhost 改成 127.0.0.1 )。

至此大功告成,成功在 cygwin上執行 ruby script/server。最後乾脆把 Ruby for win32 版也 uninstall了,聽說也許會有衝突(?)。

終於有顏色漂亮又有 auto-complete 的 unix shell ,再也不需要用難用的 windows cmd 啦…:)

Console

E-TextEditor 編輯器

 

最近開始要認真寫程式了,一直在找適合 Ruby on Rails 的 editor for windows,畢竟 notepad++ 實在是陽春了點,我又不喜歡肥大的IDE (aptana? Netbeans+JRuby?)。

本來年初很期待 intype,沒想竟然從年初到現在都沒什麼開發進度,連搜尋功能都沒有實在沒有辦法使用,真是等不及了呀。

前幾天hlb的提醒我才又重新試用 E-TextEditor。記得去年就有看過,不過那時候並沒有留下深刻印象,可能版本還太早…:p

anyway… 回到正題,裝起來之後發現還蠻不錯的,功能成熟多了(畢竟都開始賣錢了) : 有 Tab可以切換文件、可以開啟成 Project 有檔案列表、少不了的搜尋,當然還有重頭戲移植自TextMate 的 Bundles。

首頁的 screencast 介紹了一個蠻實用的功能: 按住 Ctrl 用滑鼠拉出好幾個區域,接著就可以同步修改這幾個地方(例如同時修改好幾處同樣名稱的變數超方便的),或是用 Alt 拉好幾列可以做同步輸入。

中文有點小問題,看是可以看,不過包中文的引號會小錯置,應該不成大礙。輸入也沒問題。

另外在裝好 E-TextEditor 後,有一些進階功能說要裝 cygwin (也可以不裝),anyway… 我就想試裝玩玩看吧,沒想到安裝噩夢(?)從此展開,又裝了好多東西,最後整個 Rails 都跑在 cygwin 了,真是棒極了,哈哈。(請待續集 Rails on cygwin)

最後,我也換了 Coding 的字型,一般預設是用 Courier New ,不過經由 ericsk 的介紹,我改裝 Consolas Font Pack for Microsoft Visual Studio 2005 這套試試,接著再把 E-TextEditor 的 theme 換成黑底的 blackboard。嘿嘿,質感好多了… :)

Etexteditor

Eric Sink 談小軟體公司的創業經營(續) Sales

呼,脫稿好久,終於把最後的 Part 4 整理好了。雖說是 Sales,其實都是在強調行銷 Marketing 的重要性。其中 Closing the Gap 這兩章同時也收錄在 Joel 的 Best Software Writing 1一書當中,也可以說是這本書最總結的部分,非常值得一讀。 閱讀全文〈Eric Sink 談小軟體公司的創業經營(續) Sales〉