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

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

以下示範如何將 https://ihower.localhost 導流進 localhost:3001。請把 ihower 換成你要的名稱。

1. 編輯 /etc/hosts

sudo vi /etc/hosts 加上

127.0.0.1       ihower.localhost

2. 產生自簽的 SSL key

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

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 啦。

MacBook Pro 2017 安裝軟體

用 Mac 十年啦,本來在用的 MBP Late 2012 本想再戰的,無奈硬體故障 Wi-Fi: No hardware installed + Bluetooth not available + 右邊整排 SD卡插槽、HDMI + USB 沒反應,有點慘啊,先買了一個外接 USB 網卡繼續用,但最杯具的是 App Store 無法登入更新,然後有些從 App Store 安裝的軟體就無法使用了,試了各種黑金塔招數(據說是要求 en0 必須是內建網卡)仍無法突破…. orz

於是只好認命入手新 MacBook Pro 2017 Touch Bar 了,拿到機器時還是預裝 Sierra,先升級 High Sierra。使用兩天的心得:

  • Touch Bar 有趣但沒用。本來有考慮買沒有 touch bar 的版本,但是看了比較 之後發現差別不只 Touch Bar 啊
  • 鍵盤是蠻不習慣,比 Apple 自己新出的藍芽外接鍵盤鍵程還短
  • 外殼的 Apple 沒燈了,讓我不確定蓋起來成功休眠了沒
  • 原本擔心的 USB-C 轉接器,買了 小米 USB-C 至 Mini DisplayPort
    多功能转接器
    小米 USB-C至HDMI多功能转接器 就解決了,聽說千萬不要買 Apple 自己出的 HDMI 轉接器超貴der
  • USB-C 真的會影響 Wi-fi 2.4GHz 啊,幾乎完全不能用會掉封包,一定要接有線網路…
  • 我算是淺度 Vim 使用者,這個 ESC 觸感很慘啊…… 如果深度用戶應該會想死…
  • 插頭沒有 MagSafe 接頭了…. 充電器的捲線設計也沒有了…. 可惜…

真的是很多小缺點,但是要升級 CPU、RAM、硬碟是硬需求啊,還是只能買新 MBP。

回到主題,這一篇趁重裝紀錄一下安裝了哪些 Apps:

閱讀全文〈MacBook Pro 2017 安裝軟體〉

A brief introduction to Machine Learning 投影片

這是我在今年 RubyConf China 2017 演講的投影片,錄影官方也釋出了在 Youtube。這場分享總結了這兩年業餘接觸機器學習的一些知識點和心得,希望能在 Ruby 圈推廣一下資料科學和機器領域,以及主流的 Python 工具鍊。同一天另一場還有一場關於機器學習的 姜鹏 – 金数据是如何鉴黄的 也講的非常好,介紹一個真實的應用案例,也推薦大家一看。

老實說,就像做 Web 用 Rails 很棒,做數據分析和機器學習,就是要用 Python 這套方案。這不代表整套 production code 都要從 Ruby 換成 Python ,就像 Apple 做機器學習的 Core ML 也是用 Python 方案作數據分析和機器學習訓練,在得到模型和參數後,實際運作的 production code 當然還是用 Apple 自家的 Swift 語言來進行預測。

另外,我覺得為什麼 Ruby 圈老是去黑 Python 呢?(的確,如果眼界只在做 Web 的話,我以前也是覺得學了 Ruby 就用不到 Python 了),我認為就培養個人技能來說,應該挑互補的,而不是挑做一樣的事。Python 可以做 A.I. 可以做數據分析,Ruby 有很好的 OO 物件導向設計,做應用程式非常適合,是可以互補的。反而例如去學 Elixir 跟用 Ruby 一樣是做 Web 開發,對個人的技能發展我認為是重疊的。

Tweets 整理 (2017 Q3)

2017/9

  • 2017-09-21 23:17 1. Python 是 Ruby 做 Data Science 最好的朋友 2. 透過 PyCall t.co/wbOpvsmP58 就可以調用 Pandas, seaborn, matplotlib, sciki… t.co/Bl37ZP7OfY
  • 2017-09-21 13:12 “科学式家|戴文渊:机器学习教科书的 7 大经典问题” t.co/b9zHC2xGeV # 神经网络不宜超过三层? 决策树不超过五层? 特征选择不超过一千个? 集成学习获得最好学习效果? 正样本和负样本均采样到1:1? 交叉验证是最好的测试方法? 过拟合一定不好?
  • 2017-09-17 17:27 @judithyhh 謝謝~~ ?
  • 2017-09-17 09:33 “Packing your Ruby application into a single executable” t.co/TThHLL6vLU 把 Ruby 專案打包成一個執行檔,支援 Mac/Windows/Linux,牛逼!
  • 2017-09-15 11:43 RT @peter_szilagyi: Two months in the work, but Geth 1.7.0 (Megara) is finally here! Faster, slimmer, Byzantium enabled! #Ethereum ;) t.co/GztSNeLbA2
  • 2017-09-06 11:58 Wi-Fi: No hardware installed + Bluetooth not available + SD卡插槽失能,是在提醒我該換 MacBook Pro 了嗎? # 已重置 NVRAM t.co/d0QOD7GlWr 還是沒用 :(
  • 2017-09-04 23:02 @cowboy_ryan 是 Ropsten test network 測試網絡啦,這裡的以太幣不值錢
  • 2017-09-01 11:47 每個想學怎麼用 geth 編譯智能合約的工程師好像都要踩一次這個雷啊 t.co/JGhEXlGB5A “eth_compilers, eth_compileSolidity are gone in go-ethereum 1.6.0”

2017/8

  • 2017-08-31 01:24 “Scalable Blockchain Infrastructure” t.co/Mx5ZR73sI2 # 1. 連 geth 或 parity 都不用裝了,發 HTTPS call 就好了 2. 為什麼背景圖用哥吉拉啊,是有一點點諧音啦… XD
  • 2017-08-30 02:33 ? mined potential block ? block reached canonical chain # 人生第一次挖到礦 # 挖了半小時拿到五顆以太幣 # 在 Ropsten test network 啦 # 真是太有趣了
  • 2017-08-29 22:13 在本機同步 Ethereum 或 Bitcoin 全節點的話,記得設定 Mac 的 TimeMachine 不要備份那些目錄啊 # TM 狂跑才想到這事
  • 2017-08-21 18:06 @jeffhung @number5 tig 太陽春啦
  • 2017-08-21 15:27 @number5 GitX 沒更新很久了….. 有bug沒人修啊
  • 2017-08-21 15:17 “Fork: a fast and friendly git client for Mac” t.co/wRbFIQo0LK # 看起來不錯,喜歡這種輕量級的
  • 2017-08-20 11:54 IBM 主推的 HyperLedger Fabric 區塊鏈跟它的智能合約是用 Go 語言寫的,然後官方安裝步驟是用 Docker 安裝,原來金融業也這麼潮了。
  • 2017-08-19 17:14 t.co/K12LueiFwV # 兩百行的 Node.js 區塊鏈簡單實作 1. 用 websocket 實作了 P2P 網絡 2. 用 express 做了 HTTP API 3. 可惜沒有實作共識系統,想看 PoW 機制
  • 2017-08-14 17:33 @hSATAC 快發一篇 LOGAN
  • 2017-08-07 21:35 “TodoMVC for the RealWorld” t.co/qMFcCguTFa # (任意前端框架 x 任意後端框架)的範例 app
  • 2017-08-05 23:25 RT @audreyt: 人們不再彼此相互信任,為什麼?我們怎麼改變這種情況?合作博弈論的互動講解手冊: t.co/gXKQ7LKOMP
  • 2017-08-04 10:36 RT @webmaxru: This day goes to #PWA history! Initial steps of #ServiceWorker in #Safari: t.co/WU4Uin6ZHP. Kudos to… t.co/VolDoNRo9O
  • 2017-08-04 01:39 記得你是何時加入 Twitter 的嗎?我記得!#我的Twitter週年紀念日 t.co/WyCkmOkq8d

2017/7

Git worktree: 同時開多個工作目錄

Git 的 worktree 是 Git 2.5 新增的功能,有點相見恨晚啊。

有在用 Git 的都知道如果工作目錄(working tree)修改到一半的話,是不能隨便切換 branch 的。解決方式是要麻是 git stash 先暫存起來,不然就是先暫時 commit 等會再 reset 回來。這都還好。

但是,還是會碰到一些需要同時處理不同 branch 的情況,例如想要同時修改或對照不同 branch,或是一邊跑測試一邊繼續寫code,甚至是想同時開發測試不同 branch 等等。這時候就得另外 clone 一個目錄,但這就是麻煩的開始,不同的 repo 目錄要怎麼同步最新的修改? 重新複製目錄? 先 git push 再 pull 一次? 總之就是有點繞啊。

git worktree 這個神奇的指令可以創造出另一個工作目錄,例如:

$ git worktree add -b hotfix ../hotfix master
Preparing ../hotfix (identifier hotfix)
HEAD is now at 46d363dc XXX

如此就會在上一層新建立一個 hotfix 目錄,並新建一個分支 hotfix。這種工作目錄叫做 linked working tree。

cd ../hotfix 就是一個乾淨從 master 分出來的 hotfix 分支,可以在這邊做事。最後 commit 完事之後,直接 rm -rf 砍掉這個 hotfix 目錄(放心,東西已經進 branch,這可以砍掉了),接著 git worktree prune 就會清除 linked working tree 記錄了。不清除也沒關係,三個月後也會自動清掉。

不過如果你把 linked working tree 放在會被移除的裝置上,例如外接硬碟上,這樣可能會不小心被 Git 清掉。這時候需要用 git worktree lock 指令。

最後,git worktree list 則會列出目前所有的工作目錄。

如何真正讓 Ruby Constants 常數無法被修改

大概翻了一下 Effective Ruby (中文原文),覺得其中第四個 Be Aware That Constants Are Mutable 有點意思,記錄下來。

在 Ruby 裡面大寫開頭的叫做常數,Ruby 開發者可能知道這個常數是可以被事後修改的,雖然會有警告啦,但是還是被修改到了,那有沒有辦法可以真正無法被修改呢? 原來要用 freeze,而且還需要點技巧。

讓我們看一下代碼:

閱讀全文〈如何真正讓 Ruby Constants 常數無法被修改〉