作者歸檔:船長

用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 | 留下評論

svnX出錯的解決辦法

svnX是蘋果上的svn圖形管理軟件, 下面是我總結的常見錯誤解決辦法.
1.導入一個已經被SVN管理過的文件夾, 這時要先刪除原有的svn記錄:
到新移入目錄的根目前執行:
find ./ -name ".svn" | xargs rm -Rf
2.用svnx刪除一個文件夾出現 has no URL 錯誤.
手動用命令刪除:
svn delete app/folder
svn commit -m ‘mission impossible’
3.覆蓋文件後出現commit錯誤
先拿開那個文件或文件夾, 執行delete文件/文件夾操作, 然後放入新文件/文件夾, 執行add操作
4.ignore已經被收錄的文件/文件夾
方法同上, 先移開這些文件/文件夾, 執行delete操作, 然後
svn propset svn:ignore "*" app/folder
svn commit -m ‘ignore!!!’
然後再移回舊文件.
另: 今天剛下載了蘋果上的另一個svn管理工具Versions beta, 還沒詳細試用, 不清楚效果.

發表在 信息處理 | 一條評論

GPS

就在超市口的一個拐角, 他靠着綠化欄半躺在地上. 破破爛爛的衣服一塊灰一塊黑. 領域內擺着一個變形了的搪瓷碗. 碗里零星地散着幾個硬幣.
剛吃完午飯的他一邊有節奏地上下晃着斜歪着的頭, 一邊哼着什麼. 顯然是那種很適合看女人大腿時哼着的東西.
蒼蠅不時落在他的腳上. 他已經不對蒼蠅動手了. 開始是討厭, 然後他慢慢同情起這些飛蟲起來, 認為這些蟲子大概也樣是無家可歸的. 但, 現在這種同情也慢慢地淡漠了. 生活就是殘酷的 — 也許這就是三天後他認為更成熟的想法…
三天了! 終於三天了… 他一邊感覺到一種解脫, 同時竟也感覺到一種懷念…
就在這時, 突然傳來一首"月亮之上". 是一條短信: "北, 200米, 光頭".
他立馬起身, 從身後掏出一手槍.
"他媽的北在哪裡???"他愣了2秒, 但隨即掏出一手機大小的設備, 中間是一個血紅的大箭頭, 箭頭上方是四個斗大的漢字– "他媽的北"!

發表在 某時雨集 | 留下評論

感古都許昌

悠悠今日水
依依古灞陵
梟雄揮劍去
閑雲卻長停

發表在 某時雨集 | 留下評論

崔顥《長干行》(其一)

君家何處住?
妾住在橫塘.
停船暫借問,
或恐是同鄉.

看來古代的美女很會泡帥哥啊…

發表在 詩詞精選 | 留下評論

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 | 留下評論

google走得遠 因為知道自己要去哪裡

用google很久了, 但最近看google map中的street view功能後, 我才明白什麼叫真實的google earth — google正在企圖將整個地球, 甚至宇宙數字化後裝入自己的服務器!!!
google的目標從來就很明確, 它要管理世界上的信息. 先是管理現成的, 已經數字化的網頁信息, 然後開始着手原來還沒有那麼數字化的圖書, 廣告, 視頻, 地圖… 現在是信息時代, 稱霸信息領域其實就是稱霸世界. 隨着網絡, 信息化的普及, 世界依靠數字信息聯繫成了一個整體, 人類生活和社會必會隨之變革, 有一天或會不在有國家或總統, 地球最高的權威也許就是google董事…
microsoft則是在不斷的變化, 先是做操作系統辦公軟件, 現在還一邊生產遊戲機和鍵盤, 一邊跟着google搞網絡.. 一心想要賺錢的當然有的會賺到大錢, 卻遠沒有一些一直埋頭做興緻的“事業”的賺錢來得瀟洒.
yahoo我不知道, 我只知道它有出色的歷史地位.
甚至因此可以不用過於關心後面大堆的跟風者, 因為有明確的目標, 只管走自己的路, 把自己想做的做到最好, 也許這也是google的想法.

發表在 信息處理, 成敗幾何 | 留下評論

半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, 信息處理 | 留下評論

成功:兩種途徑

這裡討論成功的兩種典型途徑, 為了功成名就, 希望大家耐心看完枯燥的本文.

討論之前也許我應該先說明一下"成功"的概念. 但我以為這有點多餘, 因為大凡活在世上的人都知道什麼是成功.

那我直接談成功的兩種典型途徑, 第一個是蓄意拼搏, 第二個是無心插柳.

先說第一個,簡單地說就是通過 目標-計劃-執行 實現的成功. 這是一個比較科學, 比較可操作的方法. 舉例來說明. 先立一個目標, 這裡對目標有幾個要求: 首先目標要可行, 要相信自己通過努力可以做到, 不要把目標定得太高, 但也不要太容易實現; 第二目標要明確, 比如要量化(賺30萬人民幣), 比如要有清楚的時限(2012年3月6日20點11分止); 第三要時刻想到這個目標, 想到這個目標實現後能給你帶來的好處, 這樣在做任何事件時都會潛移默化地做對這個目標有幫助的事. 現在有了目標, 下一步就是做計劃. 計劃怎樣實現目標, 比如在2012年前賺30萬, 先考慮一個大的實現方案, 比如開包子店, 然後把目標細分: 今天是2008年3月6日, 到實現目標還有整4年時間, 為了賺30萬, 四年分別賺2, 5, 10, 13萬元, 那就先計劃今年的2萬, 那今年頭一個月的目標就是把店搞起來, 那最近半個月的時間就做調查, 那明天就去選店址, 那晚上就查地圖… 就類似這樣的計劃, 總體上計划了四年, 但晚上的分工也出來了, 以後就每天邊照新的計划走, 邊制定/調整新的計劃.    目標-計劃-執行這個現在應該算比較成熟的成功模式了.有很多優秀的相關教程, 詳細大家可以參考Anthony Robbins的《Personal Power》教程和陳安之的成功學視頻教程. 經過四年的認真執行後, 你的銀行存款多了33萬元, 那你就成功了.

然後是第二種途徑, 簡單地說就是忘記成功, 做你喜歡做的事, 直到有一天別人說你成功了. 也舉個例子說明吧. 比如說你喜歡玩音樂, 你就整天玩吉它. 因為太喜歡了, 你加入了吉它俱樂部. 有一天你發現區上組織了一次比賽, 因為感興趣, 你參加了, 最後你用嫻熟的技能和激情的表演贏得了第二名. 兩年後同樣因為感興趣, 參加了大學生樂器比賽. 但你與冠軍再次失之交臂只得了複賽倒數第3名. 半年的沮喪後, 終於你的女朋友因受不起你的頹廢毅然離你而去. 此時你感覺一無所有. 音樂給你帶來太多的快樂和淚水, 你決心通過參加一次全國性的比賽來與它做一個了結. 如果被出局了就從此不再碰音樂, 並聽從你母親的話在畢業後去參加公務員考試…那個你走進決賽賽場的慢鏡頭終成為整部電影的轉折點. 你再次出來時掌聲淹沒了你激動的哽咽, 鮮花屏蔽了你失控的鼻涕. 最感人的是其實你的女朋友也偷偷地趕去了香港到現場觀看這個比賽, 此時她已經和你抱在一起. 當聽到很多記者問你是怎樣成功的時候, 你突然明白自己成功了. 你不但贏回了你的女友, 得到了3萬獎金, 而且為你的家人, 學校, 國家, 地球爭得了榮譽!

通過計劃, 或通過興趣都可以實現"成功". 但這是兩個很不一樣的過程, 甚至是兩個很不一樣的結果.
計劃模式總的來說偏理性, 計劃成功可操作性強, 這種成功很容易複製和再現, 而且只要目標選擇得適當, 努力執行後實現的機率比較高. 設定目標和做計劃比較好辦, 特別是設定目標, 可能會讓人感覺亢奮, 如果一心想着幾年後賺上幾千萬,甚至可能會帶來失眠這樣的副產品. 但最難的是執行. 伴着執行的雖然會是對目標的憧憬, 但更多的時候是一種責任感. 長久可能會感覺自己很累, 在成功的路上很孤獨… 因此要時常提醒自己, 提醒自己的目標, 並告訴自己要堅持.
通過興趣達到成功, 整個過程都很感性. 過程的操作細節幾乎沒有, "跟着感覺走"就可以了, 但最大的問題是"感覺會把你帶到哪裡去?"  如果你最終沒能在比賽中得到名次呢? 畢竟像電影主角一樣拿到第一名的只有一個, 更多的是其它的參賽者!!!

兩種途徑說完了, 但現在我又很想反問一下"什麼是成功呢?"
成功是一路艱辛地實現目標? 那人生是過程重要還是目標重要呢? 人生是過程的比例大還是目標的比例大呢? 又, 四年前的目標真的是四年後的今天你最想要的東西嗎????
或, 成功是得到世人的認同? 成功的界限是獎牌, 證書或職稱嗎? 那你快樂地撥動着你心愛的吉它的陽光透過窗戶的每個下午呢? 在得獎之前你是不是成功着的呢???
還是讀者你說的"成功的標準是汽車和洋房二奶"?
你真的明白什麼是成功嗎?

也許這個文章本身就是一個騙局, 為什麼計劃和興趣就不能並舉呢? 為什麼不讓你的成功即能聲名在外又使快快樂樂地度過每一天呢? 自己寫一篇第三種成功, 第三種途徑?

PS
其實這是我這幾天在考慮的文章. 結合感性和理性, 結合別人的看法和自己的感受, 讓自己在快樂的生活中, 有計劃地做自己感興趣的事, 慢慢地, 快樂地名利雙收. 哈哈哈

發表在 成敗幾何 | 4 條評論