Ruby Kaigai 2009 日本行 (非關Ruby部份)

大概是6月中才下定決心要去 RubyKaigi 吧。因為是第一次出國,而且又是獨自一人參加會議,周遭的人都覺得挺冒險的 :p 好在有熟東京朋友剛好也要去辦事,有個照應就還蠻順利適應環境的,複雜的東京地鐵真是超級方便。

第一天 7/15

早上10點的 JAL 班機,飛了三個小時到日本成田機場,也就是當地時間2點多到達成田機場。3點多搭上 Skyliner 京成電鐵坐了一個小時到達上野,先把行李丟到飯店後,就去六本木逛街了,像是最有名的 六本木 Hills。

六本木

第二天 7/16

淺草

早上先去逛了淺草寺,在雷門拍了照跟買了土產人形燒,不過淺草寺在整修,整間廟被鷹架圍住。逛了附近的犬印鞄製作所買包包。中午去了表參道逛最有名的表參道Hills,螺旋向下的走廊真厲害。

下午的行程自己去涉谷搭東急東橫線到日吉的慶應大學找高中同學,到日本聊MSN才發現他剛好也來日本做短期研究,也很巧他的學長也來日本自由行,所以就約了一起同行。先是學校逛了一圈,就又繼續坐到終點站元町,往上走到山頂看了海景,接著逛了幾家山手西洋館繼續走到港區未來,剛好碰到橫濱開港150週年,有特別的展場可以逛。最後去日本最高樓 Landmark Plaza,吃了銀座天國的動飯。搭超快電梯到頂樓看橫濱海港夜景。

慶應大學

第三天 7/17 (RubyKaigi 第一天)

築地市場

會議是下午才開始,所以早上先去逛了築地市場,買了有名的玉子燒來吃。

RubyKaigi Day1

終於抵達會場了 :D

第四天 7/18 (RubyKaigi 第二天)

晚上吃了在日本算是非常便宜的吉野家,然後逛了秋葉原,不過沒做什麼功課。有很多 3C 店很好逛,也有漫畫等很多,很多還提供免稅專門樓層可以買。回程反倒買了日本的低中價衣服王者 UNUQLO,日幣990很便宜呢 :p

第五天 7/19 (RubyKaigi 第三天)

晚上去了去了銀座伊東堂,可是竟然 PM7 就關門了,只逛了一下下。去了Apple直營店玩了 iphone 3GS。又去 UNIQLO 買了 $990 的衣服給女朋友… XD 最後回上野飯店附近吃了握壽司套餐。

上野的握壽司

第六天 7/20

一整天安排逛街行程,先去了上野的 UNIQLO 跟松板屋百貨公司。然後下午去了涉谷,接著去新宿。真是超級好逛街的地方,走起來很舒服,不像台灣一堆車烏煙瘴氣。

涉谷

第七天 7/21 (最後一天)

因為錢花的差不多了,只好安排不花錢的行程 :p 去了附近的上野公園,本來想逛博物館,沒想到全部公休… :/

上野恩賜公園

在成田機場的免稅店買了一堆巧克力,把最後的日幣花的乾乾淨淨 XD 晚上七點的飛機返回台北。

Ruby Tuesday 六月場

這個月的 Ruby Tuesday 又來啦!

活動時間:2009/6/30(週二)晚上七點到九點。
活動地點:台北市 典藏咖啡館(民權店)

報名請前往活動網頁,這次的講題是:

xdite: Sinatra: a DSL for quickly creating web-applications in Ruby.
gugod: Cucumber+webrat: Rails integration test

Sinatra 是一套非常有趣的小型 web framework,以其獨到的優雅 DSL 語法聞名,非常適合 tiny web application 開發。而 Cucumber 是一套將測試工作轉化成透過 parsing story-based 純文字來執行,好處是有一份讓非程式設計師閱讀的良好規格文件,同時也可以透過這種方式讓測試程式能自然地 reuse。webrat 則是一套 Acceptance Testing 工具,用以改善及補強 Rails 內建的 integration testing API,另一個好處是它還可以搭配 Selenium 或 Watir 實際打開瀏覽器來做 JavaScript 測試。

兩位講者都有豐富的使用及開發經驗,期待這次的分享 :)

BTW,我決定參加今年在日本的 RubyKaigi2009目前還有票的樣子,有興趣的朋友快衝吧 又賣光啦… XD

Mac 推薦軟體 (2009)

Update(2010/5/11):請參閱最新的 Mac 推薦軟體 (2010)

最近公司又勸敗一位同事採購 Mac 電腦(再一次和多全員Mac化),於是又再一次需要 Mac 推薦安裝軟體,說著說著又整理了一份 2009 年版:(加 * 的是付費軟體)

  • OpenVanillaYahoo! KeyKey: 必備的中文輸入法
  • Safari 4: 用來用去還是我最順手的瀏覽器,另外推薦 safari140 這個 Twitter extension 和 click to flash 這個 plugin 可以讓網頁上的 Flash 要點了才載入。
  • SubEthaEdit * 協同編輯器,若同事也都用 Mac 超級推薦,可以多人同時(即時)編輯一份文件。當做一般文字編輯也非常順手。
  • iWork* : 包含投影片 Keynote、試算表 Numbers、文件編輯 Pages 三套軟體,也可以拿來開 Microsoft Excel、Word 也大多都可以順利開出來。
  • The Hit List*: 大方好用的 Todo 管理軟體
  • LittlleSnapper*: 抓網頁或螢幕的 screenshot 並加以管理、加註。
  • Skitch: 螢幕抓圖工具,更棒的這可以直接網路分享,非常方便可以當做溝通工具。
  • Snapz Pro X*: 錄製 screencast 的軟體,也可以抓 screenshot。
  • Parallels Desktop * 或 VMware Fusion*: 可以在 Mac 上跑其他作業系統,最常見的被迫需求情境是 Windows + IE 瀏覽器。
  • Koolclip: 可以紀錄下你每次的複製文字 或 Jumpcut 更輕量
  • QuickSilver: 鍵盤快速啟動應用程式的好物
  • LaunchBar* : 也是可以透過鍵盤就快速啟動應用程式,它的搜尋比 QuickSilver 聰明,更棒的是他有複製貼上記錄功能(就不用再裝上述的Koolclip或Jumpcut了)
  • VLC 放影片
  • PerianFlip4Mac WMV 可以讓 QuickTime 支援更多播放格式
  • Pixelmator*: 影像編輯軟體,功能類似 Photoshop,但不用這麼貴… XD
  • Burn: 燒錄軟體
  • chicken of the VNC: VNC client
  • Adobe Reader
  • KKBOX*: 聽正版音樂,有出 Mac 版就甘心。
  • iTunes: 搭配 iPhone 或 iPod 的必備軟體

網路相關

  • NetNewsWire *: RSS Reader,快又穩,當訂閱的 feed 很多的時候比起其他 Web 版的 Reader 好用很多。
  • Nally: Mac 上最棒的 BBS 軟體
  • Panic Transmit*: Mac 上超棒的FTP軟體,好操作介面佳,還支援 Amazon S3。
  • Cyberduck: 這則是免錢的 FTP/SFTP client
  • Tweetie: Twitter 的桌面軟體,我會特別需要桌面版的 Twitter 軟體是因為我有多個帳號需求。
  • Colloquy: IRC client,當 server 上的 irssi 不能用的時候的替代軟體
  • Adium: 整合msn/gtalk等的IM
  • Skype: 喂喂
  • Microsoft Messenger: 有時候 Adium 會秀斗沒辦法登入 MSN
  • Remote Desktop Connection: 可以連接 Windows 桌面
  • Dropbox: 可以在不同電腦間共享檔案,蠻方便簡單好用的服務。

系統管理

  • AppZapper*: 反安裝軟體,可以清比較乾淨
  • CandyBar*: 可以換系統 Icon
  • iStat menus: 換掉內建的日期顯示
  • Growl 好玩的自動提示,可以吃其他應用軟體的訊息。
  • smcFanControl 手動控制風扇
  • MacFusion/MacFUSE: 可將FTP/SFTP等網路資源掛載成磁碟
  • Onyx: System/Disk 檢查整理工具,其他類似的還有 MainMenu, Cocktail
  • Monolingual: 砍沒用的語系檔案跟 Power PC Binary 檔案,大約可以省5G
  • OmniDiskSweeper: 磁碟清理工具,可以很方便地找出到底哪個檔案跟目錄是最佔空間
  • coconutBattery: 電池狀態查詢跟紀錄

程式開發

  • iTerm: 支援多 Tab 的 Terminal,我主要拿來做 SSH 登入
  • Visor: 把 Mac 內建的 Terminal 改成透過熱鍵即可呼叫出來,我主要拿來下程式開發中的各種 script 指令
  • MacPorts: command line 愛好者必備,和 FreeBSD 的 Ports 系統類似。MacPorts 還需要裝 Apple 的 Xcode,如果需要 compile source,也會需要裝 Xcode。
  • Textmate * Rails Developer 都會有的一套編輯器,請進一步參考推薦安裝Plugins
  • GitX: Git GUI
  • svnX : Subversion 的免錢 GUI
  • Sequel Pro: MySQL 的 GUI
  • Navicat* : 比較專業的 MySQL GUI,覺得最方便的是支援 SSH 登入遠端操作資料庫(畢竟很少情況會開 3306 Port 可以遠端連線),另外處理編碼也很聰明,印象中很少看到出現亂碼。如果你有舊版本MySQL的編碼問題無法順利dump出來,可以試試。

網頁設計

Dashboard

用 Mac 快兩年了,發現其實有不少好用軟體是需要付費買的(當然,都可以找到免費的替代軟體,只是可能介面跟使用性沒這麼好而已),所以請不吝支持正版軟體囉,其中有些是跟著一年一度的 MacHeist Bundle 一起買的,所以還算便宜 :p

BTW,竟然沒有一套 AIR application,裝過的用一用都不好用,結論是還是 Native UI 的最好。

Building Web Interface On Rails @Ruby Tuesday 投影片

這次的 Ruby Tuesday 花了不少時間在準備 example code 跟釋出兩個 plugins,放在 Github 上:

BTW,Ruby Tuesday 的投影片我們都有請講者放到 slideshare 了,包括這次 kevin 的 Streaming Service on Flex and Rails :)

Git 版本控制系統(2) 開 branch 分支和操作遠端 repo.

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

用 Git 就是要愛用 Branch 啊,Branch 很好用,開 Branch 不用錢。開 Branch 的情境除了在上一篇中提到因應產品 release 需求的 stable/production branch 之外,其他開 branch 情況有:

  • 帶有實驗性質的變更,例如想改寫新的演算法、重構程式碼等
  • 新功能 feature 開發
  • Bug fixes,你可能需要做些實驗才知道到底怎麼修

這些事情都可以先在本地開 local branch 做,而不需要立即 Push 分享給別人。


git branch <new_branch_name> 建立本地 local branch
git branch -m <old_name> <new_name> 改名字 (如果有同名會失敗,改用 -M 可以強制覆蓋)
git branch 列出目前有那些 branch 以及目前在那個 branch
git checkout <branch_name> 切換 branch (注意到如果你有檔案修改了卻還沒 commit,會不能切換 branch,解法稍後會談)
git checkout -b <new_branch_name> (<from_branch_name>) 本地建立 branch 並立即 checkout 切換過去
git branch -d <branch_name> 刪除 local branch

開 Branch 最大的好處除了可以不影響 stable 和其他分支版本的開發,另一個超棒的地方是”你可以決定 Merge 的方式”。Git 的 Merge 方式可以分成四種:

  • Straight merge 預設的合併模式,會有全部的被合併的 branch commits 記錄加上一個 merge-commit,看線圖會有兩條 Parents 線,並保留所有 commit log。
  • Squashed commit 壓縮成只有一個 merge-commit,不會有被合併的 log。SVN 的 merge 即是如此。
  • cherry-pick 只合併指定的 commit
  • rebase 變更 branch 的分支點:將目前 branch 的 commits,一個個重新重新 apply (或叫做patch) 到要被 rebase 的 branch 上。例如在 A branch rebase B branch,就會把原本分支點之後所有的 A commits 記錄,重新在 B branch 上再 commit 一遍,這時新分支點變成 B branch 的最新的 commit。這方式僅適合還沒分享給別人的 local branch,因為等於砍掉重練目前 branch 的 commits 記錄。

其中 rebase 比較難理解在下一篇有圖解。


git merge <branch_name> 合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
git merge --squash <branch_name> 將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
git cherry-pick 321d76f 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。

使用 merge 可能會有部分程式碼會 conflict 衝突:簡單的情況只要編輯檔案處理 <<<< ===== >>>>> 即可,然後重新 add 到 staging area 並 commit (沒有像 SVN 的 resolve 指令)。複雜一點的可以再用 git mergetool 選檔案合併的 GUI 工具 (OS X 下面可以用 opendiff, linux 可以用 kdiff3 ),處理好後 git commit。

一旦 merge 好了,git branch -d <branch_name> 可以刪除 branch。但如果要刪除的 branch 還沒有合併,就會有錯誤訊息。如果真的要強制刪除可以用 -D

Git 的 working tree 是從 SVN 換過來一個不習慣的地方,因為它只是一個工作暫存區,在切換 Branch 時就會整個換掉。也因為如此,如果有檔案有修改還沒有 commit 出去,切換 branch 時就會出現 error 不能切換 (除非是新的 untracking 檔案),例如有修改還沒 add 會出現 error: Entry ‘ooxx’ not uptodate. Cannot merge. 有修改且已經add(還沒ci)會出現 error: Entry ‘ooxx’ would be overwritten by merge. Cannot merge.

最理想的處理當然是事情剛好做到一個段落,把東西 commit 出去才切換 branch 做事。不過事情總有臨時,如果要換 branch 的暫時的解決方式是使用 git stash 會先把修改暫存下來,要回復則執行 git stash pop。下一篇等你學會 git reset 之後,你會發現就算把還沒完成的東西 commit 也不會怎麼樣,只要還沒 push 出去一切 commit 紀錄都是可以改的。

Remote repo. 操作

首先要認識的是 Protocol,像在 Github 上面看自己的 Project,會有分 Public Clone URL 跟 Your Clone URL,這有什麼差?

  • 這種的是使用 Git 自己的 prototol,優點是速度快,但是沒有認證機制,只適合 read only (port:9418)
  • git@github.com/ihower/project.git 這種的是使用 SSH,可以有認證(SSH key)
  • Git 也可以透過 HTTPS 的方式,不過速度較慢,比較適合對 firewall 有限制的情況

其中 Github 就是同時用 SSH + Git protocol,兼顧認證需求及速度。


git clone <remote_address>
git checkout --track -b foobar origin/foobar 將遠端的 branch checkout 回來並建立一個新的 local branch,加上 --track 表示你之後還要pull、push回去,所以請 Git 記住對應關係。
git pull (<local_branch_name> origin/<remote_branch_name>) 去遠端 fetch 新版並 merge 進 local branch
git push 將 local branch 的 commit 紀錄更新到遠端

git pull 要注意的是,如果別人在你上次 pull 之後有 push 新東西上去(也就是說跟你的 branch 產生分岔了),此時有兩種情況: 一是 Git 可以順利 auto merge 的話,git 會自動多一次 merge commit,這也就為什麼常常 log 會跑出 Merge branch ‘master’ of git@foobar.com。二是如果有 conflict,這時候就需要你手動處理然後 commit。話說如果覺得這種 local branch 和 remote branch 的 merge commit log 很煩,建議可以改使用 git pull –rebase 指令來變成 fast-forward 形式 (就會變得像 svn up,而不會有 merge commit log)。rebase 的意思可能要下一篇才會詳細說明的清楚,簡單的說(?),就是先砍掉 local branch 分岔點之後自己的 commit,然後把遠端的 commit 先一個個 apply 進來,最後再把自己的 commit 再 apply 進去 (如果有 conflict 會中途停下來,等你修好才會繼續 apply),如此一來看線圖就會變成一條線而已,也就沒有所謂 merge 這個動作了。

git push 預設的遠端是 origin,並且會將所有有和 remote 有對應的 local branch 都 push 上去。如果要把新的 local branch push 上去,需要下 git push origin <local_vranch_name> 指令。

git push 也可能會失敗,例如出現 ! [rejected] master -> master (non-fast forward),這個 non-fast forward 的意思是你的 parent commit 和遠端的不相同,也就是線圖有分岔,需要先 pull 回來處理好 merge 才能 push 上去。

fast-forward 在 Git 是一種 merge 術語,當 B branch (例如一個 local branch) 是從 A branch (例如一個 remote branch) 的最新版(HEAD)分支出來的,那當 A 要把 B merge 進來時,因為 B 的 parent commit 是 A 的 HEAD,所以這兩個 branch 唯一的差異就是 B 後來的 commit 而已,而不會有任何 conflict。所以實際上的動作只要把 A 的 HEAD 改成 B 的 HEAD 就好了,線圖上這兩個 branch 根本是同一條線,此謂 fast-forward。

其他操作還有:


git fetch 把遠端的 branch 更新下載回來,但不會 merge 到 local branch
git branch -r 顯示 local 有追蹤的遠端 branch。注意到你不能直接修改這個 remote branch,一定要用一個 local branch 對應它。
git remote show origin 顯示遠端 server 的 branch
git remote add foobar git:// 可以新增別的 repo. 位置,於是 pull 的時候就可以指定要從哪一個遠端更新回來。
git push origin :foobar 刪除遠端的 branch

因為遠端的操作指令比較雜,所以也有人寫了 git_remote_branch 來簡化操作。