分類
Rails

Responsible Rails 讀書摘要

斷斷續續看完了 Responsible Rails 這本小書,蠻喜歡這本書的主題,講 Production 上的實操問題。

可惜內容作者沒有完全寫完,裡面還留著很多 (TODO),不過還是有一些不錯的出錯倒站故事跟心得就是了。

一些摘要:

  1. 強調 Responsible Software Developer 的重要性
    1. 軟體開發的整個流程,到實際部署給 end-user 後,又是新的世界: 各種 bugs、意外倒站、DevOps 問題等等
    2. Say No! To regressions 以及要專業處理 bugs, failure 和各種意外
  2. Production 的意外處理
    1. 要立即讓相關人等知道情況
    2. 給出預估修復時間
    3. 事後 post-mortem 分析
  3. 對外的 integrations 要紀錄所有 input 和 output,有助於事後分析
    1. 除了 happy path,也要問客戶什麼是 business-critical failure paths,要重點處理
    2. 各種 Service 的 integration 要 fail fast, 要設定 timeout
  4. 關於 Domain Event (也適用於API設計) 小心修改、Mutable messages 是 anti-pattern、傳遞 generic attributes 也是 anti-pattern
  5. MySQL 要用 utf8_bin,這樣字串比較才會精準
  6. 網路相關的 integration 應該要考慮拆開或其他容錯處理,例如用 background job, 設定 timeout, 用 service object 包錯誤處理等
    1. 作者碰到的問題是 Elastic Search 因為 AWS 掛了,造成全站都掛。但理想上應該只影響 全文搜尋 就好
    2. 推薦讀 Release It! 這本書
  7. 推薦可用 feature flag 來做 高頻次的小變更部署,提早發現錯誤,要修復也快
  8. External JS 會拖慢 CI,在 capybara 裡面有設定可以關掉
  9. 記得加 DB indexes,作者有次跑 rake script 跑了 20hr,加了 index 後只要幾分鐘
    1. 寫 Script 顯示完成百分比沒用,建議多顯示每處理 1000 筆花了多久時間
  10. 小心套件升級: 可能會有 bug,若不急可以等等。即時是安全性升級也可能有 bug,可以多了解細節再決定要不要趕著升級。
  11. 刪除 production date 要萬分小心
    1. 不要刪
    2. 真的要刪,code 請同事幫忙 review
    3. 把資料搬到別處,而不是直接刪除
    4. 真的要刪,先手動備份
  12. 寫驗收測試降低 regression 可能性
  13. 要成為 responsible developer 必須了解 devOps

分類
Mac Rails

Nginx + SSL + HTTP/2 + Rails 在 Mac 本機開發設定

有一陣子 Rails 在本機開發流行 Pow,但是因為缺少維護問題多多,我個人是不太愛用。平常我也沒有需要一直開新專案,一個案子都做很久啊,所以偏好自己在 Mac 上安裝 Nginx 做 reverse-proxy 導流,而且還可以把 HTTP/2 打開加快靜態檔案下載速度,有 HTTPS 也才能測試一切正常,現在網站都全面上 SSL 加密連線了。

以下示範如何將 https://ihower.localhost 導流進 localhost:3001

1. 編輯 /etc/hosts

sudo vi /etc/hosts 加上

127.0.0.1       ihower.localhost

2. 產生自簽的 SSL key

以下指令參考自 https://localhost 這篇文章

cd; mkdir .ssl

openssl req -newkey rsa:2048 -x509 -nodes -keyout .ssl/ihower.key -new -out .ssl/ihower.crt -subj /CN=ihower.localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:ihower.localhost')) -sha256 -days 3650

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain .ssl/ihower.crt

這樣會產生 ihower.localhost 的 SSL key 放在 ~/.ssl/ 下,並且把這個 key 加入 Mac 的信任名單

3. 安裝和設定 Nginx

brew install nginx

編輯 /usr/local/etc/nginx/nginx.conf,新增一段:

server {
  listen 80;
  server_name ihower.localhost;
  root /Users/ihower/projects/ihower/public; # 你的 Rails 項目的 public 目錄

  listen 443 ssl http2; 
  ssl_certificate /Users/ihower/.ssl/ihower.crt;
  ssl_certificate_key /Users/ihower/.ssl/ihower.key;

  location / {
    proxy_pass http://localhost:3001;
    proxy_set_header  Host $host;
    proxy_set_header X-Forwarded-Host 'ihower.localhost';
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

重啟 Nginx

sudo brew services stop nginx
sudo brew services start nginx

4. 啟動 Rails 在 Port 3001

rails s -p 3001

當然,你用其他的 application server 例如 Node.js 跑在 Port 3001 都可以的

打開瀏覽器就前往 https://ihower.localhost 就有 SSL 又有 HTTP/2 啦。

分類
Rails Ruby

亞洲首次的 Ruby on Rails 年會 – Rails Pacific 大會 9/26-27

xdite 主辦的 Rails Pacific 年會即將於 9/26-27 展開,目前還在售票中。講師陣容很強大,看得出來是一場國際化導向的專業研討會,最近的技術研討會真是越來越專門啊。

小弟也受邀有一場 45 分鐘的演講,主題是 Exception Handling – Designing Robust Software 例外處理和強健的軟體設計。

In a perfect world, every method call succeeds, users enter correct data and resources are accessible always. But the real world is brutal and failures happen. You will be miserable if you fail to design your software for a production environment.

In this talk, I will explore how to design robust software, the exception handling mechanics of Ruby and Rails, bad smells and best practices of exception handling.

寫 Ruby on Rails 也好多年了,從初學到研究進階用法、從會動到寫的漂亮,最近比較多的痛苦體悟則是在 production 環境上的一堆鳥事考驗。希望這場 talk 可以分享一些 Ruby 例外處理的技巧和錯誤處理的策略,進而達到強健軟體的目的。

分類
Rails Ruby

RubyConf Taiwan 2014 售票開始

今年的 RubyConf Taiwan 日期是 4/25-26,地點在陽明大學,目前已經開放報名啦!!

本屆 RubyConf Taiwan 的邀請講者有:Rails Girls 社群創辦人 Linda Liukas 和 Terence Lee,她們將一同上台分享Rails Girls社群創辦經驗;Ruby 之父松本行弘先生與 Ruby 核心開發者笹田耕一先生是第二次在 RubyConf Taiwan 進行演講,展現他們對 Ruby 社群在台灣發展盛況的贊許與支持;還有 JRuby 的主要開發者 Charles Nutter;另外,以良葛格之名廣為人知的 Java 及 Python 語言的教育專家林信良先生也將發表主題演講;更有來自國內外的諸多程式好手分享心得與發現。本屆會議的內容精采可期,不容錯過。

摘錄自新聞稿

分類
Rails Ruby 日記

RubyConf Taiwan 2012 籌辦祕辛與心得

RubyConf Taiwan 2012 Opening & Closing from Wen-Tien Chang

這篇拖稿超久,堆在草稿大半年了,真是不好意思。跟往年 2010, 2011 一樣,還是要留個籌辦心得紀錄。聽眾版心得文可以看會後記錄

該怎麼描述這次的 RubyConf Taiwan 2012 呢,應該是超乎預期的成功吧。大體來說,除了 wifi 搞砸了之外,其他似乎都讓大家還蠻滿意的,特別是議程和食物 :)

分類
Rails Ruby

如何使用 pry 作為 Ruby debugger 進行除錯

很奇怪,ruby-debug 或是 ruby-debug19 常常有版本問題,甚至還有 fork 版本 debugger。都不知道哪個沒問題。

最近發現其實 pry gem 就可以作為 debugger 之用,本來還以為只是漂亮的 irb 取代品,沒想到功能這麼強大。作為 debugger 使用的方法很簡單,只要在程式裡加上:

binding.pry

這樣就會設下中斷點。例如在 rails console 或 rails server 中,就會停下來讓你可以進行檢查和除錯。

可是如果你有用 Rails 伺服器,例如 pow 或 passenger 的話,因為不在同一個 process,所以必須加裝 pry-remote gem。它利用 DRb 技巧讓另一個 process 可以亂入進行除錯,用法改成:

binging.remote_pry

接著在 command line 輸入 pry-remote 就可以進行除錯了。非常簡單好用。

其他 pry plugins 也可以裝一下,包括:1. pry-stack_explorer 輸入 show-stack 的話可以看到 call stack 2. pry-debugger 可以加上 step, next, finish 和 continue 的控制