Comments

在 Rails i18n 裡面可以用 relative path 像 t('.key') 這樣的 shortcut,不過這個 shortcut 吃得是 "#{ controller_path.tr('/', '.') }.#{ action_name }#{ key }"

今天碰到 controller 的 before action 裡面用 relative path 結果 locale yml 編到 before action 的 key,但真正會去 lookup 的是 action_name 而不是 before action 的 method name 所以就爆 missing 了。

萬一這個 before_action 之後多加幾個其他的 action 的話很容易就沒改到 locale yml 而爆錯誤,為了保險起見決定把他們都改成 absolute key path. 不過 controller 檔案非常多,所以要寫一隻程式把所有 before action 裡面有用到 relative path 的 t 撈出來。

一開始的想法是用 regex 速解,不過因為 controller 裡面的 t 還滿多的,然後我又很難判斷 before action method 的 scope,於是念頭一轉就直接改用 Ruby Parser 來做。

直接把 controller 檔案都讀進來,拿 AST 來抓 before actions,再去檢查這些 before action 是否有 call 到 relative keypath 的 t。用起來還滿方便的,效率也不差,一下子就寫完了。

程式碼放在 Github,不過這麼特定目的東西應該是無法重用,放著以後有需要的時候回來看一下。

最後就是…i18n 沒事還是不要用 relative key 比較好…散在 controller, helper, service 裡面到時要搬移 code 或者作 refactor 的時候就麻煩了。動態語言重構不像靜態語言這麼便利啊…。

Functional Reactive Programming

第一次聽到 Functional Reactive Programming(FRP) 是在今年新加坡的 RedDotRubyConf 2013 的最後一個 Session: Functional Reactive Programming in Ruby。那時一直無法理解這個主題,直到大約九月時碰到了 ReactiveCocoa 並開始在公司專案中使用,才對 FRP 開始有些感覺。

Functional Reactive Programming 就是 Functional Programming + Reactive Programming。 Functional Programming 大家應該比較熟悉,那什麼是 Reactive Programming 呢?最常看到的比喻就是像試算表一樣,你可以定義 C1 = A1 + B1 ,之後只要你更改了 A1B1 的值, C1 就會跟著改變。

光看這樣實在還是無法理解到底 FRP 是什麼,以及可以帶來什麼好處。這就是我今年六月剛聽到這個名詞時的感受。直到我開始使用 ReactiveCocoa(RAC)。

Read on →
Comments

這次去北京參加 RubyConfChina 2013 的來回飛機上,寫完了一個練習用的小專案:gosnake,很明顯就是用 Go 寫的貪食蛇。會挑貪食蛇來練習,是因為之前在 iOS Dev Bootcamp 參加 zonble 的 workshop,題目就是寫一個貪食蛇,覺得這個題目拿來練習真的是挺不錯的。

先來看看動起來的樣子:

程式本身很簡單,沒什麼好說的,倒是想紀錄一些開發上使用到的工具。

Read on →
Comments

之前說要寫一篇 Go 簡介…不過網路上 Go 的資料已經很豐富,把一些我喜歡 Go 的點記錄下來好了。

Go 是物件導向的語言嗎?是,也不是。

他沒有類別,也沒有繼承。我們來用實例來看看 Go 如何實現物件導向的特性。

Struct

有接觸過 c-like 語言的人應該都對 struct 不陌生,我們可以定義一組結構,裡面包含各種資料型態的變數。

舉例來說我們可以定義一個叫 Humanstruct

1
2
3
4
type Human struct {
  name string
  age int
}

然後我們就可以這樣來使用:

1
2
3
4
5
6
person := Human{"Ash", 18}
//或者
person := Human{name:"Ash", age:18}

person.name
person.age
Read on →
Comments

去年九月發過一篇開發 Golang 的 IDEs,不過現在我基本上都使用 vim 開發了, update 一下我現在的配置。所有資料都可以在我的 vimrc 找到。

插件

和之前一樣最主要還是靠 golang 官方 plugin 以及 gocode 這兩個,多加了一個 gotags 取代 ctags,這個超好用的。

由於 golang 官方 plugin 和 gocode 的 plugin 都沒有抽出單獨的 repo,不方便 vundle 或 pathogen 使用,所以我之前就有自己抽出方便安裝的 repo:

如果搭配 supertab 可以設 let g:SuperTabDefaultCompletionType = "context" 來 trigger gocode 自動補完。

gocode

Read on →
Comments

現在團隊使用 github 來作 code hosting, 利用 pull request 機制來做 code review。比以往自己架 gitosis 和 redmine 的方式更方便好用。

不過 programmer 天性懶惰,日子一久對於要開 github 網頁用滑鼠選 branch 發 pull request 的操作感到厭倦,能自動化的東西就懶得自己按按鈕啦!

使用 hub 就可以用 commandline 進行各種 github 的操作。

Read on →

剛好又開新專案了,來介紹一下 Xray-rails 與 tmux, vim 的整合。

Xray-rails 是一層 rack middleware,會 inject 你的 view 和 javascript 檔案,只要在開發模式按快速鍵 ⌘ + ⇧ + x 就會開啟一層 overlay,讓你很清楚的看出現在的畫面由哪些 view, partial, controller 生成,更方便的是只要一點畫面,即可在編輯器中開啟該檔案,大大降低 trace 程式碼的時間。

Xray-rails

Read on →

RSpec/Given

rspec-given 其實是這次去新加坡 RedDotRubyConf 聽 rake 的作者 jimweirich 介紹的。

乍看之下只是一個 syntax sugar,但實際用起來非常有幫助,可以有效的協助你寫出乾淨漂亮的測試。

rspec-given 提供了 Given, Then, When 三個關鍵字以及其他一些額外的功能。 Given 類似原本的 let,而 it 則拆成 ThenWhen

原本用 it 來寫測試,一個 it 裡面容易越寫愈多,越寫越肥,而且執行的程式碼和 assertion 混在一起,不容易閱讀。

Given 定義需要的東西、 When 寫實際執行的程式碼、 Then 放 assertion,這樣可以很方便、清楚的組織你的測試程式碼。

Read on →