Rails三兩事 A website introduce you ruby&rails and technology news.

6Oct/091

Heroku is a great host for RoR. But still has some problems

Heroku的簡便,其實也造就了他的問題.
因為不是第一次被人推薦了,所以就去官網上看看.
不過,看了就覺得並不是太想用.
除了價格昂貴,再來就是他的優點,其實也是缺點.

Heroku的優點是兩面刃

由於你只要註冊好Heroku,然後 :
sudo gem install heroku
heroku create yourapp

當你要建好專案要上傳 :
git push heroku
就上傳好了

當要做些工作,比如migrate :

heroku domains:add yourdomain.com  #(加網域名,應該是加到DNS?)
heroku rake db:migrate
heroku bundles:capture

可是,他的方便也是不便.
我是不太喜歡一直和Host方溝通,比較喜歡一次就擁有很多自主權.
所以,當有問題,我該寫信去???

問題1, 如果想增加sub domain? 更改MX records,CName,etc...?
問題2, 原先配置為Thin+Nginx. 若想改用其他?
問題3, 目前尚未支援Custom SSL.
問題4, 太貴....
問題5, 還沒想到. 如果你有解答,歡迎討論互動.

就像Xdite說的,在我看來,現在還是Project比較適合. 若要Production,太貴,也不太適合.

--後記 :
初碰Heroku可能面臨問題.
Q : Install?
A : $>sudo gem install heroku

Q : Create?
A : $>git init
$>heroku create

Q : Upload?
A : $>git push heroku YouBranchName(master)

Q : See?
A : $>heroku open

Q : No ssh public key found in /root/.ssh/id_[rd]sa.pub. You may want to specify the full path to the keyfile.
A : ssh-keygen -t rsa

Q : Move Database?
A : $>sudo gem install taps
$>heroku db:push

Q : Rename App?
A : $>git remote rm heroku
$>git remote add git@heroku.com:YOURAPPNAME.git

Q : Manage Custom Gems?
A : 1. Create a file ".gems" under folder
2. Add "yourgem --version x.x.x --source xxxxxxxx" (ex : geokit --version '>=1.5.0' )
Each Gem one line.
3. "git commit -a" & "git push heroku xxx"

5Oct/090

Textmate on Ubuntu9.04 – Gedit

寫Ruby, RoR的工具首推Textmate是毋庸置疑.
在Ubuntu上並沒有Textmate,但有替代方案 : Gedit (TextEditor).
Gedit是內建的, 如果你是9.04版本. 那麼更不需要安裝甚麼太多外掛.
其他的還有Theme,讓你的配色更好看.
還有自己遇到的一些問題. 希望有幫助.

Gedit Plugins

這些是網路上建議的外掛 :
Snippets - 點我下載 (9.04內建)
File Browser - 點我下載 (9.04內建)
Class Browser - 點我下載
Quick Highlight Mode - 點我下載
Word completion - 點我下載
Snap Open - 點我下載

也可以輸入下面指令,直接裝好一些熱門套件.

sudo add-apt-repository ppa:ubuntu-on-rails; sudo apt-get update; sudo apt-get install gedit-plugins gedit-gmate

下載完&解壓縮以後,在9.04下,全都丟到 /usr/lib/gedit-2/plugins 即可.
或是可以丟在某個資料夾內,然後開Gedit. Edit > Preferences > Font & Colors > Add
然後選你的檔案一個個加入.

一些讓你的Gedit看起來像Textmate的 Theme :

官方來源 :

下載DarkMate

(官方圖好像也掛了?)
下載Desert

(Gedit官方圖片掛了,有人有圖片煩傳給我,或告知. 感謝.)
下載Textmate

另外還有五個一組的Theme包. 下載請點我
分別有 :
Cobalt

Darkmacs

IDLE

Slush and Poppies

Twilight

其他來源 :

下載Tinge


下載 LightMate

如果還不夠,這裡還有更多. (部份重複)
Download them from GitHub

Gedit Highlight

再來就是設定一些ror檔案的highlight支援.
直接copy,然後貼在console下.

wget http://grigio.org/files/x-rhtml.xml; sudo mv x-rhtml.xml /usr/share/mime/packages
wget http://grigio.org/files/rhtml.lang;  sudo mv rhtml.lang /usr/share/gtksourceview-1.0/language-specs/

惱人的RoR檔案Highlight問題

在安裝的過程中我自己遇到一個問題,就是erb顯示不正確.
你可以透過下列操作來修正.erb的highlight問題.

Console下輸入

sudo nano /usr/share/gtksourceview-2.0/language-specs/ruby.lang

找到
<property name="globs">*.rb</property>
修改成
<property name="globs">*.rb;*.rake;*.rjs</property>
然後存檔離開.

再輸入

sudo nano /usr/share/gtksourceview-2.0/language-specs/html.lang

找到
<property name="globs">*..html;*.htm</property>
修改成
<property name="globs">*.html;*.htm;*.erb;*.rhtml</property>
存檔離開.
再開啟Gedit,就應該顯示正常了. :D

--參考資料 :
RubyBuntu -4- Make gedit better than any IDE ;)
Extend Gedit with amazing plugins
http://rorblog.techcfl.com/2008/04/19/erb-syntax-highlighting-in-gedit/
把Gedit打造為Linux下的Textmate
Textmate-like Gedit in few steps
HOWTO: add support for .rhtml, .html.erb, .rjs, .rxml, .builder
Textmate 官方首頁

4Oct/092

Rails on Ubuntu 9.04 Installtion

由於在Ubuntu下安裝Rails是一件有點煩的事,還要ln, 而且有時候有lib相依問題.
不是單純 apt-get install ruby rails 就可以.
所以就把自己安裝的經驗寫下來,下次自己安裝方便,而也可以分享.

打開Console輸入,這樣安裝包含了 Ruby, IRB, RdoC, Mysql, Sqlite, Sqlite3, 以及Libs , Dev

sudo apt-get install ruby irb rdoc libopenssl-ruby mysql-server sqlite3 sqlite libsqlite3-ruby libsqlite-ruby libmysql-ruby ruby1.8-dev

到官方下載 Rails Gem 這篇文章時,Gem為1.3.5版,點我下載1.3.5.tgz.
將之解壓縮並在Console cd到資料夾下

ruby setup.rb

再修正9.04下的安裝路徑連結錯誤

ln /usr/bin/gem1.8 /usr/bin/gem

安裝Rails

gem install rails

安裝Rake 及 Mongrel

sudo apt-get install rake mongrel

打完收工,Done!!

完成之後,可以再參考這篇Textmate on Ubuntu - Gedit

6Mar/090

Ruby的Metaprogramming

對一個程式新手來說,什麼是Metaprogramming? 一定非常疑惑.
而對Metaprogramming而言,Ruby是一個非常好的選擇.
但,但底什麼是Metaprogramming?
查字典,你查不到Metaprogramming. 於是將Meta和Programming分開查.
你查到了類似 "超越...之前" 和 "程式語言",但這看的懂才怪.
於是你又上wiki,英文看不懂看中文, 中文寫"元編程". 靠,這不是對岸的用詞嗎?
搞老半天你還是不懂,你想哭,想放棄了.

其實Meta programming就是在 程式碼中製造(產生)程式碼, 或說 用 code寫code.
相信大家都聽過物件導向,物件導向提倡的就是 模組化,繼承,等功能.
這些功能都只為了幾個目地 : 讓東西可以重覆使用. (個人認為還有好管理,因為將功能模組化了)
這樣一來,你便不需要一而再再而三的重覆編寫已有的功能.

但人們是懶惰的,於是讓"程式碼自動產生",連寫都不想寫的想法產生,這就是Meta programming.

以Ruby而言,簡單的範例如下 :

class Dog
  attr :leg,true
end
Tom=Dog.new
Tom.leg    #=>nil
Tom.leg=4 #=>4
Tom.leg    #=>4

讓我們先再看另一個範例

class Dog
end

%w(Won Wonwon Au Uuuu).each do |name|
  Dog.class_eval <<-HERE
    def #{name}()
      p 'Dog bark:  #{name.upcase}!'
    end
  HERE
end

Tom = Dog.new
Tom.Won
Tom.Wonwon
Tom.Au
Tom.Uuuu

第二個範例的顯示是Dog bark: WON! ....以此類推.

第一二個範例都顯示了只以簡單的幾行就建立出一些重覆性的函式.
第一個範例attr是內建的,當你attr,後面加true屬性,它會為你自動建立一個getter以及一個setter.
第二個範例則是以字串陣列的形式,將名稱傳入HERE文件,並透過eval將它實體化.

兩個範例應該很快的顯示了Ruby為何被稱為適合Metaprogramming了.

--延伸閱讀
關於Meta programming
Digging into Ruby Symbols
Seeing Metaclasses Clearly
An Exercise in Metaprogramming with Ruby - ' Metaprogramming Intro '

關於Eval
Evaluation Options in Ruby

6Mar/091

關於RUBY :Symbol的定義

對於初學RUBY的人,不管是新手或有程式底子,也許多少都會對Symbol的功用感到疑惑吧,而我也是那麼一個.
翻了很多文章,在網路上的高手解釋之後,我多少大概瞭解SYMBOL的功用.
打開command line輸入ri Symbol看看它的解釋.

Symbol objects represent names and some strings inside the Ruby interpreter. They are generated using the :name and :"string" literals syntax, and by the various to_sym methods. The same Symbol object will be created for a given name or string for the duration of a program’s execution, regardless of the context or meaning of that name. Thus if Fred is a constant in one context, a method in another, and a class in a third, the Symbol :Fred will be the same object in all three contexts.

這段解釋定義了Symbol為一個呈現"name"與"string"的object.

再看看ri所提供的Symbol範例 :

module One
  class Fred
  end
  $f1=:Fred
end
module Two
  Fred=1
  $f2=:Fred
end

def Fred()
end

$f3=:Fred
$f1.id #=>2514190
$f2.id #=>2514190
$f3.id #=>2514190

以上面這段程式看起來,不管f1,f2,f3都指向同一個物件.
這解釋了第一個特性,每個SYMBOL都只具一個實體,"唯一性"

再來,打開irb輸入下面代碼,讓我們看看它與字串的關係.

a= :str
b= "str"
a[0]        #=> undefined method [] for :str:Symbol
b[0]        #=> 115
a.to_s[0] #=> 115
a.size      #=> undefined method size for :str:Symbol

由上面的範例,我們可以知道Symbol跟String是不一樣的.
儘管我們可以將它to_s轉為String後再進行修改,但我們無法對Symbol直接修改.
(不過.... 在Ruby 1.9已經將Symbol加入了各種String的功能,如size,length甚至是Regexp, =~ ,所以Symbol和String是越來越像了.)

那麼,Symbol到底是幹麻的?
其實大多數人拿它來當Hash的key,或是name, identifier.
也許因為效能比較好,它是唯一性的. 再加上你不管到哪都是指向同一個物件,有點類似c指標.
而且1.9以後可以直接對Symbol作操作,更提高了Symbol的功能.
Symbol的用法,如同之前所說,如果你還有其他用法或見解,請一定要告訴我,大家一起進步.

--延伸閱讀
Digging into Ruby Symbols
Yet Another Blog about Ruby Symbols
Symbols, Strings, Methods, and Variables
Symbols Are Not Immutable Strings