over 4 years ago

TL;DR : Rails 4 是一個溫和加強版的 Rails3,而且贈送了很多酷炫 feature,適合進場

上個月花了一點時間直接衝了 Rails 4.0beta1,利用 upgrade project 去熟悉整個 Rails4 新的架構。

若要我形容對於 Rails4 這次升級的感想的話,我會總結為兩句話 New Feature, Better Syntax

相較於 Rails 2 -> Rails 3 幾乎是個毀天滅地的重新大改寫(i.e. 不管是 Rails 本身,還是使用 Rails 開發的 project),Rails 3 -> Rails 4 的升級及變更內容顯得溫和許多。

Better Syntax

Rails 4 這次的改進,許多都是吵了多年以來的折衷方案、或者是許多開發者對如何設計,始終各自有 strong opinion 的主題,都找到 best practices 而被一槌定音了。或者是一些一直以來大家覺得老是被逼著這樣寫,非常智障的設計,也都被改掉了…

Routing

  • 讓 Routing 更安全:新增了以 http verb 為 syntax 的寫法,如 get/post
  • 支援 Rouring concern: 如果要幫不同的 resources 加上如同 :comments 這樣的 nested_resources 就不用一直再重複貼上

ActiveRecord

  • 強迫 scope 的寫法要全面改成 proc / lambda:避免 eager-evaluated 出現的問題。
  • Relation#not:以往要寫出 not 的查詢條件,寫法讓人哭笑不得。
  • Relation#none:以往撈不出集合,是 nil,要回傳 [] 空集合要自己作..
  • Relation#pluck:可以輕鬆只摘出某些欄位,以及要自己手下 select…
  • Relation#unscope:避免 default_scope + order 產生的排序問題。(因為下 except 無法閃過去)
  • update & update_columns:update 會觸發 callbacks, update_column 不會,但是 update_column 無法送多個 params,於是必須只好用 sneaky-save 這個 solution 繞過。現在 4 直接支援 update_columns

ActionController

  • before_filter 更名為 before_action:就是正名...
  • respond_to do |format| 拿掉 xml 以 json 取代:2013 年了,沒人再拿 xml 當 default API...

Security

  • 拿掉 attr_accessible,改用 strong_paraments:去年 Github 被打下的事情鬧很大,Rails 的安全策略重新被檢討,於是最後社群討論出採用 strong_parameters 得這個 best practices。

Other

  • 砍掉 public/index.html : 砍掉愚蠢的 publc/index.html,以往教 Rails 初學者第一課就是記得砍掉這個預設檔案,不然寫的東西都會看不到
  • add_flash_type :以往警告訊息只有 [:notice , :alert, :error ] 三種類型,但是自從有 bootstrap 之後。大家習慣使用的是 [:notice , :warning, :error]。要套版時要一直手加 , :flash => { :warning => "Oh no!" } 是很智障的事,Rails4 開放自定義 flash types。(P.S. 這是我提的...)
  • mem_cache_store 換成 dalli:自從 1.9 出了之後,原先的 :mem_cache_store (memcache-client)會撞到 utf8 問題,於是大家都改用 dalli 作為 backend cache,Rails 4 的 :mem_cache_store 預設將改為 dalli。

New Feature

  • Model Concern / Controller Cern: 重複用到的 method使用 Concern 複用
  • Turboklinks : 無痛自動 pjax。pjax 不難,只要你用 Rails4 …
  • Cache Digest: 採用 Russian Doll Cache Strategy,智能 cache 設計,以前多層 partial cache 的問題讓大家實在很頭大。
  • HTML5 input form helpers: 現在是 HTML5 的時代,開發時自然會使用很多 js plugin,如calendar plugin,但用傳統的 form object 去產生這些 field 實在很痛苦。Rails4 內建了 HTML5 input form helpers。
  • 採用 jbuilder 產生 json : 生 json 可以採用類似生 rss 的方式寫 builder,真是驚訝這個 feature 現在才出現 ….

結論

學 Rails4 最快的方式不是看書,因為總體而言,這次的升級並不是什麼大破壞。改良的 syntax 和好用的新 feature。反而應該會減少不少平常開發上的負擔。而學習 Rails4 最好的方式就是用勇敢在現有的 project 上,大方的開一個 rails4 branch 下去練習升。

不用花很多時間你就能感受到 Rails4 新 feature 帶來給你的好處…

// 警告:以上建議只針對 Senior Rails Developer。目前還有一些 gem 沒有 Rails4 版本。所以 project 升級有時候會遇到必須要自己 fork gem「手動升級/Hack」的狀況,不熟包 gem 者勿輕易嘗試。

這次內建的一些 feature,其實都還蠻有意思的,也許將來還會挑幾篇特別再寫幾篇文章...

資源

 
over 4 years ago

以後關於 Web 開發技術的東西,我會同步或 優先貼在 Rocodev官方 Blog 裡面。

裡面除了我的技術文章之外,也會有我們優秀同事所寫的一些技術文章,如 Sublime Text 2 Packages for Rails

歡迎訂閱! http://feeds.feedburner.com/rocodev

P.S. Rocodev Blog 裡的文章不一定會 100% 與這裡的 Blog 文章 100% sync。

SCSS 開發原則:禁用 @import 'compass'; 這篇我就沒有打算貼過來,所以建議各位兩邊都訂…

 
over 4 years ago

Rails4 在前天的 RailsConf 2013 釋出 Rails 4.0 RC1 了,這也表示大家應該可以進場了。

上個月在 Rails 4.0 beta1 時為了練手感,把手上的一個中小 production 專案,也上了 rails4 branch。

大概有幾個感想:

  • Upgrading to Rails4 這本書強烈建議要買,才 $15 USD,可以節省你不少 debug 時間。

  • 升 Rails4 建議不只開 branch,也用 rvm 開一個 gemset 出來作,因為 gem dependency 變更蠻多的。

  • rails4_upgrade 要裝。這個 gem 蠻好用的..可以幫你掃 dependency 問題。事實上 Rails3 升 Rails4 最討厭的是 gem dependency tree,因為 Rails 3 已經出太久了(幾乎快兩年了吧),很多 Gemfile 都強綁定 3 ,所以升 Gemfile 時會出現很多問題...

  • major gem,如 simple_form, devise, 幾乎都有 beta1 版,裝了就保證可以動。小的 gem 也幾乎都有 rails4 branch 可以 hotfix。(起碼我在 beta1 進場時遇到的問題就幾乎都有解,所以在 rc1 的狀況應該會更好)

  • 這次 Rails4 的改動,我個人的感想會是 Rails3 的 New Feature, Better syntax Version。如果平常 code 都寫的蠻漂亮(接口和封裝乾淨)的話,升級應該是沒有太痛才對。唯一讓人很煩的就是 gem dependency 解不完,還有牽扯到 scope 與 query 的部份幾乎都要重寫..:/ (目前是都還跳 warning 而已,但真要清 warning,如果 model 裡面 condition 很多,真的會清到手快斷...)

  • 有關於 New Feature 與 Better syntax 這個議題,我應該週末會寫一篇出來..

  • Rails project 的本體內容物是沒有改動太大,但大家拿來 build gem 的 internal API 改不少,這也難怪 Jose Valim 這一兩天也同步釋出了 Crafting Rails Applications (2nd edition): Expert Practices for Everyday Rails Development 第二版的 beta。我這幾天改 gem 要升 Rails4 也是中了一堆 api 變更的地雷…

  • 會逼大家都改 gem 的原因是因為是,連 migration api 都改了,所以只要提供產生 migration 的 gem 通通會逼要升 Rails4,真是個好招 -_- (連我只有兩個 commit 的 AutoFacebook gem 也不能倖免。解法在這裡

  • Obie Fernandez 前天也宣布了 Rails 聖經 The Rails 4 Way開始 beta。值得注意的是他這次是使用 Leanpub 釋出書籍的 beta,而非走 Informit 的 RoughCut 版本。

  • 為什麼我有時間測這些東西?好問題,我也不知道…明明最近就忙到快死了...orz

 
over 4 years ago

我寫的兩隻 gem bootstrap-helperboostrappers 目前都釋出 Rails4 版本了。

  • gem install bootstrap_helper -v 4.2.2.1
  • gem install bootstrappers -v 4.0.rc1

有任何問題,請回報到 Github 上的 issues 上。

Boostrappers 是針對我在 2013/03 月底測試 Rails 4.0.beta1 測出來的 solution 更換掉 gemset 的。目前應該是沒什麼大問題...

不過這次值得注意的是,Rails4 底層又換了不少 API,包括 generator 的 action 和 migration,所以為了 bnootstrappers 的升級,我被迫 release 了三隻 gem。

包括我之前寫的 AutoFacebook,也被迫出了一個 Rails4 版本。

  • gem install auto-facebook -v 0.1.rails4
 
over 4 years ago

最近公司頻道從 IRC 換到 Hipchat 上面,本來也想要把 Hubot 也一起搬過去的。

但是 Hubot 的安裝真是惡夢,光是 node.js 版本和 npm 之間的 dependencies 就可以搞死人。我們公司現在又沒有專職的 SA,工具蠻多都是我自己下海寫的....

最後想了一下,決定找一套在 ruby 下也很好開發的 hipchat bot framework。

最後找到這套 isis。因為敝公司 是 100% 靠 Ruby 吃飯的,所以瞬間就把寫 bot 的門檻拉到很低...

掛上 hipchat bot 的方式

因為 bot 是常駐在聊天室的,所以你必須要幫 bot 申請一個 hipchat 專用帳號。

hipchat:
  jid: DDDD_XXXXX@chat.hipchat.com
  name: Full Name
  password: <password>
  history: 3 # num of history fields to request
  rooms:
    - DDDD_room_name@conf.hipchat.com
    # - DDDD_second_room_name@conf.hipchat.com

Bot 走 Jabber 通訊協定。Jid 和 Romm 的資訊在 https://yourcompany.hipchat.com/account/xmpp

jid 格式 DDDD_XXXXX@chat.hipchat.com,room 格式 DDDD_room_name@conf.hipchat.com

開發 / 掛上 Plugin 方式

isis 的 plugin 撰寫很簡單。基本上只要到 lib/isis/plugins 多開一個 class 繼承 Isis::Plugin::Base,然後掛進 config.yml。
這樣就做好了...

Local 測試

bin/isis run 就可以把 bot 跑起來了。而若要背景常駐要跑 bin/isis start

Deployment

開發完畢推上 git 之後,要讓 bot 重開還要跑到 server 上跑 bin/isis restart。懶人如我當然覺得這很麻煩,所以我用 gitploy 和 Rake 檔寫了 autodeploy,跑 rake deploy 就會動了。

順便還參考 hipchat/hipchat-rb 的 deploy 檔,做了 deploy hook 掛在 bot 的 deploy rake 上,這樣起碼有人 deploy bot 時大家會知道,以免 bot 被搞爛了沒人發現...。

config/gitploy.rb https://gist.github.com/xdite/5424771

Rakefile https://gist.github.com/xdite/5424780

後記

昨天後續還寫了幾隻常用 bot,比如說「午餐吃什麼 bot」、「redmine #issue_number bot」、「網頁自動抓標題 bot」。

不過這不是重點,重點是 bot framework 架好之後,禮拜五晚上同事們竟然不睡覺,一直在惡搞這隻 bot 瘋狂加功能....XD

看起來 bot 的確可以玩出不少花樣啊...

 
over 4 years ago

這是一兩個禮拜前貼在 Facebook 牆上的心得。整理一下重貼在 Blog 上...

整理一下過去幾年的心得,如下:

JD 部分

寫清楚 Job Description

  • 寫清楚公司能提供什麼(薪資福利)
  • 希望對方已經有什麼經驗?(已具備什麼技術,什麼職位就寫什麼)。

不要徵超人

不要徵 「超人」。徵「超人」沒有意義。

這裡的超人若以 Web 界來比喻,就是你可能看到 JD 這樣寫「熟 Rails、熟 jQuery、熟 ORM、熟 API 設計、熟 OO Design、熟....」

若一個工作職缺,出現「超人」的內容。通常表示:

  • 這個公司只缺一個人,就是做到死的超人。Developer 不是笨蛋,看了也知道雇主想幹嘛…
  • 雇主不知道自己想徵什麼人。這對 Developer 來說也是危險訊號。

如果你不是這種心態,是認真想招到合適的人。那麼請把需求寫清楚。

  • 如果團隊用 Git 很深,那麼寫上「會使用 Git」。
  • 如果團隊用 Rails,那麼寫上「熟 Rails」。
  • 如果團隊用 Rails,願意收 junior,那麼寫上「具備 MVC 開發經驗」。

不要貪心寫得希望對方什麼條件都具備,這樣十之八九只會收到一堆充滿 BuzzWord (對方希望合你胃口嘛)的垃圾履歷,大大拖慢你篩寫出正確合適的候選人的速度。

必須要理解到一個現實,不是每個人一進公司,就有辦法馬上 pickup,寫一堆「熟OO」並沒有任何幫助。只要寫應徵此職位的「最低條件」即可。

舉例來說:因為如果對方不會 Git 你又不想 train 他 Git,你就要寫「會使用 Git」。如果你可以接受 train 對方 Git,只要寫「不害怕 Command Line」即可。不然寫一個「熟 Git」,雙方都不知道這到底是「熟」是要「熟」到什麼程度…

不要請對方直接寫信到 jobs@mycompany.com

通常這樣做的下場是,「你會覺得自己會收到一堆來亂的履歷」。這不是應徵者的錯,因為你沒告訴人家「你想看什麼樣的履歷」。

而且,不是人人都有辦法寫出「有重點」的履歷。

我建議的方式是乾脆設計一張表單,請對方照格式填。不需太制式,但你可以用這種方式引導對方把他自身的重點 highlight 出來。而且 fit 你的需求。

這樣可以節省你在看履歷時很多時間。

Appsumo 的 Noah Kagan 在 Learn Chief Sumo's Proven Automated Hiring Formula 也是用了類似的手段。只不過他做得接近自動化…

至於我們公司的 應徵表單,我是這樣設計的..

把招聘啟示貼在正確的地方

徵人公告只是一篇文章,你可以貼在任何地方。

但就我的經驗是,貼在你平常在混的社群裡就好,不要到處亂貼。高曝光率對招聘一點幫助都沒有。

怎麼說呢?這幾年下來,我發現共事過最棒的同事,或收過來看起來不錯的履歷。都是在社群裡面徵來的。不是在社群裡面原本就有見過面的,就是看我的 Blog 在徵才,寫信過來應徵的。再不然就是平常有在 Facebook follow 動態的人。

至於那些在其他地方看到徵才啟示寫過來的履歷。怎麼說呢?你真的會覺得他寫過來的東西「不合胃口」。

相信我,收到「很多」履歷,絕對也不是什麼好事...。因為最痛苦的往往不是你已經很忙了,卻招不到人。而是你已經很忙了,還要花上一堆時間過濾履歷;挑來面試的人,還瘋狂浪費你寶貴的時間…

Noah Kagan 在 Learn Chief Sumo's Proven Automated Hiring Formula 這篇其中的一個招聘技巧。也是建議不要到處亂貼,儘量把徵才啟示、通知放自己家產品的 Facebook Page 邊欄,或者是產品網站、產品通知信裡。

這些原本就認同你產品的人,有極大的機會 fit 公司 culture。而不是網路上的任意陌生人。

其他

這篇文章已經太長了。下次有空再來寫 interview…

 
over 4 years ago

一直以來( 5-6 年前開始..),我都是用 IRC 在管團隊的 Log 和通知。

這個習慣最早以來是跟前輩學習來的。這在比較強悍的技術團隊內部,幾乎是行之有年的標準 Convention。

( 可見 Flickr 著名的 10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
投影片 (P.52),不過他們大概 2006 年就開始這樣做了,這篇只是後來比較漂亮的整理...)。

當年 在 T 客邦,也是用 redmine + IRC bot 自己搞了一套。

把 Log 都打到 IRC 有很多好處。團隊成員去開會、或者暫時離開。回到電腦前,還是可以很快速的掌握剛剛發生了什麼事。再加上 issue tracking 或者是 system alert 其實是很洗信箱讓人容易分神的東西,所以我們把這些幾乎都搬到 IRC 上,建立出一個可以非同步但又高效率的合作開發模式。

不過這個模式還是有一些極限,所以最近在 survey 過後,最近我決定把 公司 整套 solution 搬到 Hipchat 上。

主要搬家原因

  1. 發現每個同事一進來都要教怎麼用 irssi + 工作站掛 irc,學習成本很高
  2. 公司聊天室是 skype, log 在 irc 上,開兩窗有點麻煩。加上 skype-bot 不是不能作,只是我覺得 skype-bot 很吵…
  3. 人員離職很麻煩,因為要把 irc room 的 key 和 info 整套換掉,無法作權限控管
  4. demo 給別人看 irc solution 時也很麻煩,因為對方一定看得到我們的 key ....
  5. 對 irc 訊息上色要試很久,對一般的 developer 門檻有點高
  6. irc log 多半要切到桌機才能看,沒有 mobile solution。

所以最後就整套就搬到 Hipchat 了。看起來大家現在是用的蠻習慣的。

Hipchat 的好處

  1. 主要是 Web Based,但有 iOS, Android, Mac, Windows, Linux client
  2. 有 group 和 permission control,踢人加人很方便
  3. API 整合,寫 bot 很容易
  4. 聊天行為與一般 IRC chat 蠻相近的
  5. 貼圖貼檔案貼 Link 很方便
  6. 一樣會存歷史紀錄,就算離線了,重新上線還是可以找 Log
  7. 很多主流系統整合支援( github, redmine, capistrano, airbrake….)
  8. 5 人以下現在是免費的方案…

Hipchat integration

我們目前是把目前的幾種 Log 都打到 hipchat 上

  1. Github (github 的 hook 支援 hipchat, pull request, push , merge 都會通知...)
  2. Capistrano Deploy http://blog.hipchat.com/tag/capistrano/
  3. Airbrake ( server error 通知系統, airbrake 支援 hipchat )
  4. Redmine (官方的 hipchat/redmine_hipchat 不好用,所以我自己改了一隻 rocodev/redmine_hipchat 出來)

之後還會掛更多東西上去…

 
over 4 years ago

Here are the reading marterials I recommend in 2013:

Basic

If you are new to Ruby / Rails world, I suggest you take following courses :

Learning Rails

Use following courses to build a simple application, like a "forum"

Basic web development

Intermediate Ruby on Rails

( If you are not familer with TDD with Ruby on Rails, these two books might be a good start)

UT on Rails is also a excellent learning material

Testing

Advanced web development

Refactoring Ruby / Rails code

Writing better Ruby code

Podcast / Journal of writing better Ruby/Rails code

Object-oriend Design in Ruby on Rails

Know Rails better

Guideline of writng Ruby / Rails code

Resources of latest Ruby

 
over 4 years ago

Github 今天上了新的 features: Contributions

在新的個人頁面可以看到過去一年自己 Commit 的軌跡...。

看了一下,我公開的 commit 有 923 次。

2012-public

含 Private repo (公司和自己的 side project),有 3363 次。

2012-private

另外一些之前整理在 FB 上的數據。2012 年,我:

  • 出國了四次
  • 去過了三個國家
  • 給了超過 10 場 talk
  • 完成了五個案子
  • opensource 了兩個熱門 gem
  • 拿了一個世界大獎
  • 開了一間公司
  • 開發了超過 10 個 Rails porject
  • 寫了超過 60 篇文章
  • 寫作了超過 30 萬字
  • 讀了超過 200 本書......

加上去年一整年 commit 的 3300 次。

到底哪來的這麼多時間啊?..orz

結論是,應該要來放個假了嗎?

 
over 4 years ago

Essential Rails Design Patterns
http://rails-101.logdown.com/books/3-essential-rails-pattern

限時特價 9.99USD

被大家嫌拖稿很久的本書,終於在 12/22 新增了接近 8 萬字,共 165 頁的內容。

Rails 101
http://rails-101.logdown.com/books/1-rails-101

限時特價 4.99 USD

( 籌備 Rails 4.0 版本中 ,到時候會寄出免費更新 )

特價到 2012/12/31 午夜為止。