Ruby Tuesday #9 講題更換及 #10 開催

這次很難得臨時邀請到即將前往日本慶應大學 W3C 擔任研究員的 Kenny 來跟我們分享語意網(Semantic Web)的現況、概論與鍵連資料(Linked Data)雲,所以臨時將 #9 我的 Rails Performance & Security 講題移到 Ruby Tuesday #10。

這裡的雲指的是這張圖,其中一個圈大概是一個RDF資料庫,連結就是跨domain的RDF的連結,這個架構可以把全部的資料庫們視為一個資料庫查詢,所以我們把這整個RDF Web稱為一個雲。

語意網的技術包括有RDF+SPARQL(RDF版的SQL)+RDFa+OWL+RIF,因為時間有限,講者會跟我們分享其中的概念總論,參考資料是講者老闆(Tim Berners-Lee,WWW 發明人) 在TED 2009的演講。當然,也會分享 RDFa on Rails 實作。

報名 #9 請前往: registrano.com/events/ruby-tuesday-9,時間是 2010/3/9 (二)

報名 #10 請前往: registrano.com/events/ruby-tuesday-10,時間是 2010/3/23 (二)

Ruby Tuesday #9 開始報名

Update(2010/2/28): Ruby Tuesday #9 講題更換及 #10 開催

Ruby Tuesday 聚會辦到第九次啦,這一次很難得由 Josh Moore 帶來 JRuby on the Google App Engine,終於找到人來講 JRuby 了,我特別好奇 JRuby 跟我們一般用的 MRI 到底用起來有什麼差別的地方。

另一場演講則是由我帶來 Rails Best Performance and Security Practices,這個題目從我在準備 Rails Best Practices 就肖想了,當時的重點著重在程式怎樣寫的容易擴充跟維護,所以有一些效能跟安全性的最佳實務只好忍痛割愛。這次趁與 OSSF 合作,就來準備這個題目。

時間: 2010/3/9(週二)晚上七點到九點半。

地點: 台北市 果子咖啡

報名網頁: registrano.com/events/ruby-tuesday-9

使用 git rebase 避免無謂的 merge

關於 Git 可以參考我的 Git 版本控制 課程資料

可以進一步參考 Git rebase 和 merge 合併操作示範錄影

git pull 預設的行為是將遠端的 repo. 與本地的 repo. 合併,這也是 DVCS 的初衷,將兩個 branch 合併。但是,很多時候會發生以下這種情形:

這是因為,我們團隊的開發模式是本地的 branch 和遠端的 branch 會同步地非常頻繁(通常就是同名稱的 branch,例如 master),這兩個 branch 幾乎是完全同步。這時候就會發現這些 merge 動作其實沒有必要,會造成線圖無謂的複雜。這時候,會推薦使用以下這個指令:

 git pull --rebase

加上 rebase 的意思是,會先 1.把本地 repo. 從上次 pull 之後的變更暫存起來 2. 回復到上次 pull 時的情況 3. 套用遠端的變更 4. 最後再套用剛暫存下來的本地變更。詳細說明可以參考 pull with rebase

畫圖說明一下好了:

假設合併前是這樣:

      D---E master
     /
A---B---C---F origin/master

使用 merge 合併後:

      D--------E  
     /          \
A---B---C---F----G   master, origin/master

如果是 rebase 的方式,就不會有 G 合併點:

A---B---C---F---D'---E'   master, origin/master

注意到,其中 D’, E’ 的 commit SHA 序號跟本來 D, E 是不同的,因為算是砍掉重新 commit 了。

你會問說,有 conflict 怎麼辦? rebase 跟 merge 類似,出現 conflict 一會暫停 rebase 動作,需要你手動修復後,然後才可以繼續動作。這也是 rebase 比 merge 複雜一點的地方:merge 如果發生 conflict,你只需要解決衝突一次,然後 commit 出去就完成了。而 rebase 的 conflict 可能會發生在上述步驟 4 的每一次重新套用上,所以可能需要解決衝突好幾次 (rebase 時所謂的解決衝突,其實是直接修改你之前的變更內容,所以上圖中變成 D’ 跟 E’ )。

所以到底何時該用 merge? 何時可以 rebase? 你可能心理也有答案了,如果你修改比較多,預期會有較多的 conflict,建議用 merge (不過,如果是多次大範圍的主題式修改,那是不是應該一開始就多開一個 branch 來做呢?)。如果修改範圍較小,不太預期有 conflict,則建議可以加上 rebase 參數。

如果想要把 rebase 當做 git pull 的預設值,可以在專案的 .git/config 加上


[branch "master"]
  remote = origin
  merge = refs/heads/master
  rebase = true

也可以直接加到 ~/.gitconfig 讓所有的 tracked branches 都自動套用這個設定:


[branch]  
  autosetuprebase = always

RubyConf Taiwan 2010 開始報名

疑?怎麼今年的 OSDC.TW 大會沒有任何 Ruby 場次? 這是因為今年我們 Ruby Taiwan 社群決定與 OSDC.TW 並行獨立出來一整天的 Ruby 議程啦,詳細內容及報名請前往 RubyConf Taiwan 網頁。

台灣的 Ruby 社群很小,但是我們的眼界跟志向不低。這是我們第一次舉辦國際性的 Ruby 程式語言研討會,講者群中包含了來自美國、日本以及大陸的朋友,相信可以帶給我們不同的視野及經驗。一天的議程安排地非常緊湊(也許明年可以來辦兩天了),真是非常興奮又期待。

身為活動主辦人,我要特別感謝 OSDC.TW 與我們分享了會場、EvenDesign 贊助了專業的網頁設計,以及 Handlino 贊助了網域名稱費用和提供 Registrano 報名網站。如果貴單位有意願贊助這項活動,歡迎與我們聯繫(2010@rubyconf.tw)。

Ruby on Rails 由淺入深課程(2/27,28) 開放報名

又要開課啦,由 中央研究院 資訊創新研究中心自由軟體鑄造場主辦的自由軟體技術分享工作坊—Ruby On Rails由淺入深課程。這是兩整天共 12hr 的上機實作課程,名額有限、完全免費。

活動名稱:自由軟體技術分享工作坊—Ruby On Rails由淺入深
活動時間:2010.02.27(六)/ 2010.02.28(日)
活動講者:ihower
報名首頁:whoswho.openfoundry.org/workshop.html
活動地點:台北市復興北路99號2樓 (恆逸教育訓練中心)

Rails3 和 Rails2 的 rails 指令如何都能運作?

裝了 Rails3 beta 之後啊,那個 rails 新建專案的指令就變成產生 Rails3 了,那要怎麼產生本來的 Rails2 版本呢? 今天 Ruby Tuesday 聚會有人問了我這個問題。

整理 Rails3 資料的時候就有看到解法,回答如下:

首先,如果還沒裝 Rails3,請先將本來 Rails2 版本的 rails 指令複製一份成 rails2 (可以打 which rails 可以找到位置,這個檔案跟 gems/rails-2.3.5/bin/rails 不一樣哩),然後將裡面的 version = “>= 0” 改成 version = “~> 2.0” 即可。之後執行 rails2 project_name 就可以產生 Rails2 版本的專案了。這個 rails2 的檔案長得如下(第一行的 ruby 位置你的可能跟我不一樣):


#!/usr/local/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it.
#
 
require 'rubygems'
 
version = "~> 2.0"
 
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
  version = $1
  ARGV.shift
end
 
gem 'rails', version
load Gem.bin_path('rails', 'rails', version)

如果你已經安裝了 Rails3,那 Rails3 的這個檔案跟 Rails2 的差異只在最後兩行而已。