分類目錄歸檔:Ruby on Rails

太噁心了– rubygems安裝gem需要使用代理服務器了

換了一台電腦,想用rubygems重新安裝rails,但一直遇到各種如問題:

sudo gem install -v=2.3.9 rails
Password:
ERROR:  Could not find a valid gem 'rails' (= 2.3.9) in any repository
ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    too many connection resets (http://production.s3.rubygems.org/latest_specs.4.8.gz)

ERROR: While executing gem ... (Gem::DependencyError)
  Unable to resolve dependencies: rails requires activesupport (= 3.0.5), actionpack (= 3.0.5), activerecord (= 3.0.5), activeresource (= 3.0.5), actionmailer (= 3.0.5), railties (= 3.0.5), bundler (~> 1.0)

google了半天(期間google中短NNN次),才明天了現在使用rubygems 安裝gem也得開代理了。。。

要使用加了代理的命令:

sudo gem install rails -p http://127.0.0.1:8118

現在rubygems好像只支持http代理。 如果你使用的是socks代理,可以通過Privoxy(支持linux和mac)這個軟件來搞一個http代理 通道, 詳細參看這個教程

發表在 Ruby on Rails | 標籤為 , , , | 一條評論

使用Unicorn替代Mongrel作為Ruby on Rails的服務器

先前的開發的Ruby on Rails網站使用的服務程序是Mongrel + Nginx, 現在用了Rails 3, 發現Mongrel對它有兼容問題, 所以要換一個。 雖然現在Phusion Passenger大行其道, 但使用前要重新編譯Nginx。 為了避免重新安裝nginx,我找到mongrel的替代品Unicorn。 沒想到unicorn的設置非常方便。 我記錄在這裡供大家參考:

安裝unicorn:

sudo gem install unicorn

創建網站配置文件(myproject是項目名稱):
繼續閱讀

發表在 Ruby on Rails, 站長文檔 | 標籤為 , , , , | 一條評論

[BUG] cross-thread violation on rb_gc()

今天在mac os x leopard上安裝typo時遇到
[BUG] cross-thread violation on rb_gc()
錯誤.
google了一下, 發下有可能是因為系統上安裝了多個版本的ruby 引起的. 我的mac上的確有多個ruby: 一個是leopard原帶的, 另一個是自己用macport安裝的. 但是系統原帶的ruby1.8.6已經在清理硬盤空間時給刪除了, 文件快捷鏈接也都換了, 使用ruby -v也顯示是1.8.7版的信息.
全系統搜索了一下, 竟然發現系統上還有個
/System/Library/Frameworks/Ruby.framework/Versions/Current/usr
裡面帶有ruby文件.
將它去除, 改成一個文件快捷鏈接到自己安裝的那個ruby文件那裡, 問題解決了.

發表在 Ruby on Rails | 標籤為 , | 一條評論

怎樣看本地ruby gem的rDoc文檔

在本地查看rDoc文檔其實很簡單, 只要運行:
gem server
你就可以用瀏覽器通過 http://localhost:8808/ 網址查看所有已經安裝的ruby gem的rDoc文檔了.

發表在 Ruby on Rails | 標籤為 , | 留下評論

ruby中10進制和16進制的轉換

16進制到10進制:
>> "B0A0".hex
=> 45216

>> "B0A0".to_i(16)
=> 45216
10進制到16進制:
>> 45216.to_s(16)
=> "b0a0"

發表在 Ruby on Rails | 留下評論

Ruby中如何複製對象 (deep clone)

用Ruby複製一個對象(object)也許沒有你想像的那麼容易. 今天我google了半天, 做個總結吧.
先從最簡單的開始, b = a 是複製嗎? 看代碼說話:
>> a= [0,[1,2]]
>> b=a
>> b[0]=88
>> b[1][0]=99
>> b 
=> [88, [99, 2]]
>> a 
=> [88, [99, 2]]
從上面代碼發現, 一但修改b, 原來的a也同時被改變了. 甚至:

>> b.equal?(a)
=> true
原來b跟a根本就是同一個object, 只是馬甲不一樣罷了. 所以b = a不是複製.
那 b = a.dup呢?? 還是看代碼:
>> a= [0,[1,2]]
>> b=a.dup
>> b[0]=88
>> b[1][0]=99
>> b
=> [88, [99, 2]]
>> a
=> [0, [99, 2]]
情況似乎有所好轉, 在修改b後, a還是有一部分被修改了.(0沒有變,但原來的1變成了99).
所以dup有時候是複製(如在Array只有一級時), 但有時不是複製哦.
再來一個, b = a.clone呢? 上代碼:
>> a= [0,[1,2]]
>> b=a.clone
>> b[0]=88
>> b[1][0]=99
>> b
=> [88, [99, 2]]
>> a
=> [0, [99, 2]]
情況幾乎跟dup一模一樣. 所以clone也不一定可以相信哦!
原來ruby中的dup和clone都是shallow複製, 只針對object的第一級屬性.
汗, 難道在Ruby中沒有辦法複製對像嗎? 也不完全是, 看這個:
>> a= [0,[1,2]]
>> b=Marshal.load(Marshal.dump(a))
>> b[0]=88
>> b[1][0]=99
>> b
=> [88, [99, 2]]
>> a= [0,[1,2]]
=> [0, [1, 2]]
修改b後a沒有被改變!!! 似乎終於成功找到複製的辦法了!!!
為什麼要加"似乎"呢? 因為有些object是不能被Marshal.dump的.如:
>> t=Object.new
>> def t.test; puts ‘test’ end
>> Marshal.dump(t)
TypeError: singleton can’t be dumped
    from (irb):59:in `dump’
    from (irb):59
更完善的複製方案可以考慮給ruby增加一個deep clone功能, 可以參考以下鏈接:
http://d.hatena.ne.jp/pegacorn/20070417/1176817721
http://www.artima.com/forums/flat.jsp?forum=123&thread=40913
好了, 複製這個小問題, 沒想到也能引出這麼長的文章來, 沒想到吧?

發表在 Ruby on Rails | 留下評論

用Benchmark測試不同ruby代碼的運行速度

如果比較功能相同的幾組代碼的運行速度, 可以使用ruby語言里的Benchmark模塊.
(開始前 設置中文環境, $KCODE = ‘u’)
比如, 連接兩個字串, 如:
str1 = "中國"
str2 = "一定強!!!"

可以使用+
?> str1 + str2
=> "中國一定強!!!"
也可使用
>> "#{str1}#{str2}"
=> "中國一定強!!!"
還可以使用<<
>> str1 << str2
=> "中國一定強!!!"
(注意這種方法會改變str1的值,
>> str1
=> "中國一定強!!!")

如果想要知道這三種方法哪一個速度更快, 就可以使用Benchmark比較.
先定義三個不同的方法:

def joined_by_plus(str_a, str_b)
    500000.times do; str_a.dup + str_b; end
end

def joined_by_uniting(str_a, str_b)
    500000.times do; "#{str_a.dup}#{str_b}"; end
end

def joined_by_adding(str_a, str_b)
    500000.times do; str_a.dup << str_b; end
end

因為這三種方法速度都很快, 比較一次的時間很難分出上下, 所以每種方法都做500000次.
因為<< 會改變變量, 所以在第三個方法中使用了str_a.dup, 備份出一個str_a來測試, 其它二個方法雖然從理論上不須要這個dup, 但為了時間上的公平, 也給它們加上了.

下面是測試代碼:
require ‘benchmark’

Benchmark.bmbm(10) do |t|
  t.report(‘加號連接’) { joined_by_plus(str1, str2) }
  t.report(‘放進引號’) { joined_by_uniting(str1, str2)}
  t.report(‘使用<<’) { joined_by_adding(str1, str2)}
end

bmbm是Benchmark的測試方法, 這是雙重測試, 用來提高精確度. 裡面參數10用來調節標籤在結果里的顯示佔位寬度, 不對結果產生影響.
report(‘加號連接’)里的參數是為相應測試的標籤名, 用來區別測試結果.

下面就是結果:

Rehearsal ————————————————
加號連接   1.800000   0.580000   2.380000 (  2.435614)
放進引號   2.080000   0.590000   2.670000 (  2.706669)
使用<<       2.000000   0.580000   2.580000 (  2.635540)
————————————— total: 7.630000sec

                   user     system      total        real
加號連接   1.810000   0.600000   2.410000 (  2.476613)
放進引號   2.050000   0.600000   2.650000 (  2.656080)
使用<<       1.960000   0.600000   2.560000 (  2.567434)

因為使用了bmbm方式, 所以會有兩個結果, 第一個是演習結果, 第二個是真實結果.  如果使用bm方法, 將只會有一組結果.
結果有user時間, 系統時間, 總時間和實際花費的時間. 單位為秒.

從結果可以看出, 使用+連接兩個字串時速度最快, 而放進引號的方法最慢. 不過從結果也可以看出即使進行500000執行的結果也相差在0.3秒之內, 平時換用問題不大.

看來不是這一次, 希望下次你在自己的Benchmark試驗中, 會發現給你的程序帶來巨大速度提供的代碼.

發表在 Ruby on Rails | 留下評論

用ruby語言以句子為單位拆分一個字串

目標, 用ruby語言以句子為單位拆分一個字串. 如:
給出字串:
s="這是一個句子,另一個句子.一個新句子!難道這不是另一個句子嗎?"
將它分拆為:
 ["這是一個句子,"], ["另一個句子."], ["一個新句子!"], ["難道這不是另一個句子嗎?"]
樣式.
測試前將ruby的$KCODE環境變量設置為’u', 啟動UTF8編碼支持中文.
$KCODE=’u’
嘗試1:
>> s.split(/\.|,|\?|\!/)
=> ["這是一個句子", "另一個句子", "一個新句子", "難道這不是另一個句子嗎"]
等同於:
>> s.split(/[.,!?]/)
=> ["這是一個句子", "另一個句子", "一個新句子", "難道這不是另一個句子嗎"]
雖然分開了句子, 但失去了標點.

>> s.split(/([.,!?])/)
=> ["這是一個句子", ",", "另一個句子", ".", "一個新句子", "!", "難道這不是另一個句子嗎", "?"]
用括號將正則組成一組, 標點出來了, 但和句子是分開的.

改用scan
>> s.scan /.+?[.,?!]/
=> ["這是一個句子,"], ["另一個句子."], ["一個新句子!"], ["難道這不是另一個句子嗎?"]
成功了!!

如果一定要這樣:
>> s.scan(/(.+?(\.|\?|\!))/).collect{|p|p[0]}
=> ["這是一個句子,另一個句子.", "一個新句子!", "難道這不是另一個句子嗎?"]
也是可行的.

發表在 Ruby on Rails | 留下評論

Rails string字符串相關轉換

總結字串轉變到其它與它相關的object的方法. 在這裡整理分享一下, 希望能幫助到你.

變量相關
讀取

instance_variable_get("@name")     #返回@name值

設置

instance_variable_set("@name", "三國演義") #@name =  "三國演義"

method相關
string到method名
send

book.send("name") #返回 book.name值

注意: book.send("name") = "三國演義" 會出錯.
但可以:

book.send("name=", "三國演義") #book.name = "三國演義"

單複數轉化
string複數化
pluralize
可用於生成table_name

"country".pluralize #=> "countries"

string單數化
singularize
和上面的相反

"posts".singularize #=> "post"

table和class相關

將表格名轉成class名
classify

"blog_pictures".classify #=> "BlogPicture"

轉成table_name(和上面的相反)
tableize

"BlogPicture".tableize #=> "blog_pictures"

將class名轉成class
constantize

"Country".constantize #=> Country

可以將classify和constantize聯用將string轉成class model

"books".classify.constantize.find_by_name("三國演義")
#=> Book.find_by_name("三國演義")
發表在 Ruby on Rails | 留下評論

半semantic, 數據的價值和數據顯示

讓機器讀懂之前先讓人讀懂!
出發點?
 數據的價值不一, 因此不應該用同樣的方式顯示這些數據.
 
價值?
價值針對不同個體應該是不一樣的, 有條件最好做到面向不同個體(根據IP地址, 性別, 年齡, 歷史記錄), 如果做不到就盡量力求滿足最大群體.

數據怎樣的價值?
有用?/沒有用?
重要?/不重要?
要緊?/不要緊?

不同的顯示?
文字:字體, 字體大小, 顏色, 底色… 直接改用圖標?
位置,:左上角?  扔到最下面?

方案
數據和顯示的對接
數據輸出時附帶顯示模式信息, 對準備好的view pattern直接對接
out => (data, view_options)
@title, @content, @sidebar, @item.name, @item.content 變量名直接附帶意義

比rails更rails
使用統一的column名, 如name, content…
使用統一的變量名, 如@title, @item…
使用統一的view patterns, 如用來顯示列表的index頁面, 換到哪個model一樣使用.
使用統一的view 局部pattern(最簡單, google, wikipedia化, 實用, 可以指出數據的重要性, 美觀不是第一的, 美觀還費帶寬和美工), 如可以重複使用的list顯示pattern, comments顯示pattern….

發表在 Ruby on Rails, 信息處理 | 留下評論