Vlad the Deployer #3

by winson, 3 months ago.

當您在程式中提供小人頭圖像上傳功能時,搭配Vlad the Deployer八成會出問題,因為Vlad the Deployer會從SVN下載新的版本,並把舊版本整個換掉,亦即使用者的個人圖像統統會消失。

為解決這問題,我們可以善用Vlad the Deployer的語法,首先要做的就是把原先上傳到Rails public目錄的圖檔整個搬移到Web server的目錄下:

mv /your_rails_app/public/user /var/www/user
接著修改該目錄的權限:
sudo chmod -R mongrel:mongrel /var/www/user

於是,我們可以在Vlad the Deployer的設定檔中,增加一個新的Remote task,負責幾件事情:
  • 砍掉空的圖像目錄
  • 做symbolic link連到/var/www/user

請在您的deploy.rb檔案中,加入以下語法:

namespace :vlad do
  def sudo(command)
    run [sudo_cmd, sudo_flags, command].join(' ')
  end

  desc "Setup user photos." 
  remote_task :setup_photo do
    user_path = "#{current_path}/public/user" 
    sudo "rm -r #{user_path}" 
    sudo "ln -s /var/www/user #{user_path}" 
  end
end
這個setup_photo要做的就是,每當遠端程式更新完畢之後,處理一些圖檔目錄相關的動作,於是往後更新版本,都可以保留使用者上傳的所有個人圖像。


  • Posted in Rails, on Sunday, April 06, 2008, at 12:29 AM.

Vlad the Deployer #2

by winson, 4 months ago.

Vlad the Deployer這玩意兒簡單又好用,就算有一百台主機分散在全世界,我想透過它來部署、更新系統也是輕而易舉。

但是在實務操作面,還是有幾個問題:

第一、它預設使用Apache,那麼頗受好評的輕量級網頁伺服器lighttpd怎麼辦呢?

第二、它預設執行環境為Production,那麼我要如何在Development環境下跑呢?

第三、每一台主機位址都不同,要在哪裡設定呢?

最簡單的方式是用namespace,如下:

namespace :macmini do
  task :settings do
    set :domain,      "tw.myrails.com" 
    set :rails_env,   "development" 
    set :web_command, "/etc/init.d/lighttpd" 
  end

  setup_tasks
end

namespace :macpro do
  task :settings do
    set :domain,    "us.myrails.com" 
    set :rails_env, "production" 
  end

  setup_tasks
end
看到沒?上述三個疑問一下解決掉,包括不同主機位置、不同執行環境與不同的網頁伺服器!!


  • Posted in Rails, on Saturday, March 08, 2008, at 07:36 AM.

Rails ReCAPTCHA Plugin

by winson, 4 months ago.

什麼是CAPTCHA呢?

CAPTCHA是”Completely Automated Public Turing test to tell Computers and Humans Apart”的縮寫,那是一種用來區別使用者是人還是電腦的方式,一般都是產生圖形,讓使用者輸入圖形所代表的文字並加以驗證,主要用途是防止電腦程式灌票,或防止電腦程式登錄大量帳號或灌入大量廣告留言等。

那麼,如何在Rails底下做到CAPTCHA的機制呢?其實解決方式還滿多的,但我個人選擇外掛,通常有幾項要求:

  • 不會有系統安全方面的問題
  • 程式碼必須漂亮簡單
  • 對人類有益

我看過有人推薦Simple Captcha,但我覺得這是最爛的選擇,而且在Ruby On Rails Security Guide一文中也不推薦使用。


  • Posted in Rails, on Sunday, February 24, 2008, at 07:04 AM.

A fast and very simple Ruby web server

by winson, 6 months ago.

就在Mongrel主力開發者Zed Shaw宣佈從此以後退出Ruby界,決定不問世事、金盆洗手之後,一套號稱比Mongrel、甚至Event-drive Mongrel更快的Ruby web server出現了,那就是Thin

Thin的安裝相當簡單:

sudo gem install thin
也可以搭配Rails使用,只要切換到Rails專案目錄下,然後輸入:
thin start
如果要在背景執行,他的指令跟Mongrel差不多:
thin start -d -p 80 -c /your_rails_dir -P /your_rails_dir/log/thin.pid
跟Mongrel比較起來速度快是不用說,但Thin並未內建cluster,需搭配Merbgod才能夠做到cluster。

最後,祝Zed一路好走。


  • Posted in Rails, on Saturday, January 05, 2008, at 10:09 PM.

Upgrade to Rails 2.0.2

by winson, 6 months ago.

Rails向來以無痛開發、無痛升級著稱,透過gem來安裝Rails無論升級或移除都很簡便;萬一還是不放心,可以先裝到vender目錄下試試。雖然沒什麼大問題,不過還是有些小地方須注意:

有些報告指出,可能因為gem版本的問題導致無法安裝新版Rails。

新版gem最大的優點是,以往安裝gem需要加上-include-dependencies選項,以便同時安裝相關的gem,現在已經變成預設指令了,也就是說只需要輸入

sudo gem install xxx
就已經含有—include-dependencies選項,真是方便的很。


  • Posted in Rails, on Thursday, December 20, 2007, at 07:32 PM.

Homebrew Immutable Attribute

by winson, 7 months ago.

最近寫點小程式,客戶拜託我其中某個table不要用Rails內建的key,這不是新增一個key就好的問題,而是要用指定的格式當key。

好,從設計的角度來看,格式如何先不管,這個key的值除了生成的那一刻之外,往後都不可隨意變更,不只從view無法變更,甚至要防止程式不小心修改到,這才有資格作為一個key。

先看Rails是否內建防止某個欄位遭到修改的保護機制。這時候,第一個想到的自然是attr_protected:


  • Posted in Rails, on Saturday, November 24, 2007, at 07:38 PM.

RSpec On Rails

by winson, 7 months ago.

每一位程式員都討厭測試,相較於寫程式時那種解題的快感,測試簡直百般無聊。那麼,為什麼要測試?目的是為了程式碼的品質,品質不單單是測試人員的事,那是程式員基本的責任。

測試等於是一種背書,證明程式的任何環節毫無問題;測試可以帶給程式員信心,所以只要是我寫的程式,我就願意負責,而且我一定會對我寫的程式感到驕傲!!

先看看為何要用RSpec來進行測試,難道在Rails裡頭用他基本的unit test來作不行嗎?當然可以,只是測試的風格不同而已,但我認為風格很重要,風格可以改造想法,而想法可以改造程式!!


  • Posted in Rails, on Monday, November 19, 2007, at 07:19 PM.

Vlad the Deployer

by winson, 8 months ago.

Ruby on Rails對全世界最大的貢獻不在於產生多少容易維護的程式碼,而在於把簡潔易用的觀念深植人心。

因為程式員透過簡單易用的Ruby on Rails開發各種程式,於是創造出Twitter、Radiant、Mephisto等傑出的應用,而Vlad the Deployer則是另一個強調簡單易用的傑出工具。

相較於威力強大的Capistrano,Vlad the Deployer是一套極為簡單的自動化部署工具,特別是當您使用Mongrel, Apache, Subversion環境時,更是輕鬆愉快。

那麼,Vlad the Deployer可以幫助我們做什麼?


  • Posted in Rails, on Tuesday, November 06, 2007, at 09:28 PM.

Rails 1.2.4

by winson, 9 months ago.

十月初,Rails終於發佈小改版升級到1.2.4,距離上次1.2.3發佈也經過半年了。

這次1.2.4升級幅度並不大,主要是一些安全修正

在Rails環境底下,如果一切都是透過gem安裝的話,版本升級其實是相當簡單的事情:

gem update rails

基本上,gem的設計相當貼心,舊版本的寶石都會一一保留下來,這就是為什麼在gem list清單看到的寶石,都有好幾個不同版本的原因。

萬一您一時手癢升級,卻導致某些外掛模組無法運作的話,那該怎麼辦呢?要移除也是非常簡單的事情:

gem uninstall rails
這時候,您的Rails就會以上個版本,也就是1.2.3來運作,絲毫不會影響系統的任何功能。


  • Posted in Rails, on Thursday, October 11, 2007, at 07:42 PM.

Design Patterns

by winson, 10 months ago.

還記得當年捧著設計模式聖經挑燈夜戰的心路歷程嗎?還記得當年學設計模式的目的嗎?還記得設計模式告訴我們什麼嗎?喔,我差點忘了,他的特點是:
  • 重複使用設計過的軟體元件
  • 快速解決問題
  • 促進良好溝通
無論抱持什麼樣的目的,設計模式要做的就是用一致的解法,解決軟體設計上重複出現的問題,其實還是老話一句,不要重新發明輪子。

但,真的是這樣嗎?真的不用重新發明輪子嗎?有沒有想過設計模式真的有解決問題嗎?有沒有想過設計模式帶來的問題,其實多過他所解決的問題?


  • Posted in Rails, on Tuesday, September 11, 2007, at 12:40 AM.