sidekiq
是一套可以用來實作 background job 的 gemresque
一樣,sidekiq
是以 redis 做為 Message Queue
來運作…
本教學所使用的版本是 2.12.1
1
|
|
設定 redis
關於 redis 安裝可參考 http://pm.5fpro.com/projects/public-wiki/wiki/Redis
1 2 3 4 5 6 7 |
|
定義 worker
1 2 3 4 5 6 7 |
|
啟動 worker (-c 代表 concurrency worker 數)
1
|
|
把工作丟到 queue 裡
1
|
|
這時若有啟動 worker 就會從 redis 把工作抓下來執行
直接丟到 queue 裡
1
|
|
也可以以 instance 丟
1 2 |
|
延遲至某短時間後再讓 worker 執行
1
|
|
延遲至某個時間點再給 worker 執行
1
|
|
1 2 |
|
1 2 3 |
|
web console 想要綁 devise 登入 (假設 scoep 為 member 且 .is_admin
必須為 true )
(更多可參考 https://github.com/mperham/sidekiq/wiki/Monitoring)
1 2 3 4 5 6 7 |
|
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 |
|
上述設定也可透過 gem venus
完成
1
|
|
S3
後,可能會需要透過 cross-domain
存取 (例如 web font)S3
bucket 的 CORS
設定達成
開啟後如同以下內容設定即可開放 GET
的跨網域存取
1 2 3 4 5 6 7 8 |
|
如果要開放其他 HTTP method…
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 |
|
本文所採用的 gem 版本
1 2 |
|
這裡的 production.rb
是針對 rails_env=production
,而非 capistrano 中 multistage 的 production
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
(也可以把上述檔案放在 config/unicorn.rb
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 |
|
done!
bundle exec unicorn
Go to http://localhost:8080
從 Demo 頁 可了解到 Swagger 不僅僅提供 API 的規格資訊,也提供互動介面讓開發者可以直接輸入參數進行測試。
亦支援 GET & POST 以外的 http method (PUT、DELETE)。
Demo 頁面的 source code 在 Github 上。也可以參考 wordnik 的 官方正式 API 文件 。
API 文件內容完全是透過 ajax 取得 JSON data 產生的,因此必須提供 server 吐出符合 Swagger 文件中所定義的 JSON 格式,讓前端網頁能夠生成 API 文件的介面。
在 Swagger 文件中所定義的物件有:
doc
: 代表整份 API 文件 (規格文件)resource
: API 文件下的分類目錄 (規格文件)api
: 每一條 REST Request (規格文件)parameter
: api
下的每個參數 (規格文件)model
: 自訂的 return data type (規格文件)鑿於定義相當繁多且複雜,Swagger 本身有提供部分語言的 API 文件生成後台 (Ruby 開發者可選擇 sinatra),讓開發者能夠花最少的時間開始使用 Swagger。
但筆者仍覺得 Swagger 使開發者進入狀況的門檻仍高,因此花了點時間以 rails app 開發 Swagger json data 的管理後台生成 swagger API 文件,提供後台的 web 操作介面來產生 Swagger 的 API 文件。
Github: https://github.com/marsz/swagger-rails
Demo: http://swagger.5fpro.com/
功能特色:
doc
resource
可排序讓我們 step by step 來建立 API 文件吧。
範例是小弟在早期自己寫的 API,用來提供台灣縣市鄉鎮的資料庫。
doc
,內容如下:doc
後,系統會提供你 API 實測時的網址格式resource
(圖略), resource
可以用來當做是管理許多 API 的目錄api
: 選擇 http method 和 pathparameter type
為 path
的參數 (如圖),名稱和大括號內對應model
的定義,可在 doc 頁找到,這裡的定義與否不會影響文件的正常顯示,有定義的話文件也會顯示出來,內容也就更完整囉目前的 swagger-rails 仍有許多待增加的功能:
最後附上筆者目前正式對外開放的 API 文件給各位參考:
筆者目前透過自己蓋的 swagger-rails
用於內部溝通居多,不論在 mobile app 開發或跨語言的資料傳遞,透過 Swagger 介面的 API 實測功能,使用者很快就可以了解每條 API 的取用方式與資料格式,大大減少了溝通的成本。
Swagger 參考資料:
]]>1
|
|
redis
升級,每次透過 capistrano
佈署後,連線 server 都會噴出 “Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.” 的錯誤訊息。
原因在於 redis
的 client gem。
因此必須在每次 passenger restart 後,也讓 redis client 進行重啓。可參考以下,必須於 initializer 或 application.rb 中執行。
1 2 3 4 5 6 7 |
|
除了 redis
之外,其他透過 redis 應用的 gem 也都會有類似的問題,例如 resque
、redis-store
、redis-object
、sidekiq
等。
~/.zshrc
或 ~/bashrc
1
|
|
之後 merge –no-ff 的指令就都會預設用 auto message 做 commit 啦
如果想要強制編輯時,可以用 –edit 參數
1
|
|
respond_to
可用來 return 指定的 format 供 JS 取用 API 資料server 端的 action
1 2 3 4 5 6 7 8 9 |
|
client 端的 javascript
1 2 3 |
|
結果: IE9 以下不 work,其他瀏覽器沒問題(生氣)
解決此問題的方法必須例用 jquery jsonp callback 的方式達到目的即可
因此 server 端的 response 的 content-type 必須是 javascript (見 此圖)
server 端寫法
1 2 3 4 5 6 7 8 9 10 |
|
client 端的 javascript
1 2 3 |
|
搞定!!!
server 端其他寫法的補充:
開啟 cross-domain 的 ajax request
1
|
|
開啟 cache-control 為 public:
1
|
|
鑿於在許多專案中,總是為了要安裝某些 gem 而必須再回去翻寫過專案中的 code 或上官網找範例 code 做 copy/paste + 修改,於是我決定寫一個 generator 來設定這些常用的 gem,僅需要如同 rails composor 一樣回答一些問題就可以把所有的設定弄到好。
因此 venus 因應而生
安裝: https://rubygems.org/gems/venus
源碼: https://github.com/marsz/venus
以下逐一介紹各個指令
rails generate venus:init
專案初始化設定,例如移除 public/index.html,安裝必要的 gem 例如分頁用的 kminari
,剛 new 好的 rails 專案適合執行此指令。
rails generate venus:mysql
設定 mysql,包含從 Gemfile
安裝 mysql2,設定 database.yml
以及 database.yml.example
,最後再將 config/database.yml
加到 .gitignore 中。
rails generate venus:paginate
單獨安裝分頁用的 gem - kminari
,也會問你要不要產生客製化的 view 出來。
rails generate venus:simple_form
view 使用 form 必備的 simple_form,預設會產生 bootstrap wrapper 的設定檔。也會詢問是否要順便安裝 nested_form,安裝 nested_form 需要在 js 中 require gem 裡面包好的 JS,所以也會詢問 require code 和 example code 要放的檔案路徑。
rails generate venus:settingslogic
gem - settingslogic
。可以將多個 yml 的設定檔放在此 gem 所讀取的 yaml 下,使其能夠容易管理。此 generator 同時也會產生 .example 檔以及加入 .yml 到 .gitignore 下。
rails generate venus:rspec
安裝並且設定 rspec
,並且移除 test 目錄,在 config/application.rb
中設定 generate controller 時,不自動產生 assets files 和 helper。
rails generate venus:devise
安裝並且設定 scope 為 user 的 devise gem。
rails generate venus:omniauth
會先檢查是否有安裝 settingslogic 以及 devise,然後再安裝 omniauth,過程中會詢問 facebook / twitter / github 登入的安裝與否。
rails generate venus:redis
安裝並且設定 redis client gem redis-rb 。
rails generate venus:aws
安裝並且設定 Amazon 官方的 ruby client 。過程中會先檢查 settingslogic,並且將 api key 和 secret 存到其中。最後也會詢問否需要順便安裝 Amazon Simple Email Service (SES),用來發 email。
rails generate venus:carrierwave
安裝並且設定 carrierwave,其中包含 rmagick 進行縮圖,以及 fog 將檔案上傳至S3。過程中會安裝 aws-sdk,所以也會順便詢問 SES 的設定 :p。最後會產生一個 venus_uploader.rb
做為範例。
rails generate venus:jqueryui
安裝 jquery ui 的 gem。其中會詢問是否要安裝 datepicker,包含產生 trigger 用的 js 範例 code。gem 的 參考連結 => https://github.com/joliss/jquery-ui-rails。 (若有要安裝 datepicker 的話,也會詢問語系)
rails generate venus:chosen
安裝 chosen-rails 並且提供 trigger chosen 的範例 js code。
rails generate venus:bootstrap
安裝 twitter bootstrap
,包含 gem 設定、 assets require,最後產生範例 layout 檔於 app/views/layouts/
下。內建提供 unicorn admin 的版型套用,蓋後台超爽 XD
對於此 gem 未來將會逐漸加入我自己寫的 best practice :p 也望各位大大能不吝指教或回報 bug :D
MAC OS 請先安裝 brew
1
|
|
若無法順利安裝可至 graphviz for MAC OS download 頁面下載對應的系統,直接打開 finder 以 window 介面安裝
1
|
|
1 2 3 |
|
1
|
|
1
|
|
生成的 ERD 會在專案目錄下的 erd.pdf
]]>1
|
|
1 2 3 4 5 6 |
|
access_key_id
和 secret_access_key
可至 AWS Security Credentials 查看
host
則是目標 region 所對應的 endpoint,對應表可至 https://github.com/garnaat/missingcloud/blob/master/aws.json#L372 查看
養成好習慣, 請勿將 yaml 檔 commit 進去…
1
|
|
1 2 3 4 5 6 7 8 |
|
1 2 |
|
1 2 |
|
1 2 |
|
1 2 |
|
1 2 |
|
1 2 3 4 5 6 |
|
註: .foo .bar { .... }
代表一個 selector
stackoverflow
也有相關問題: http://bit.ly/QiuvNC
由於 twitter boostrap
以及其應用外掛的流行,要破 4096 個 selector 是輕而易舉的事,要測試你所使用的瀏覽器有沒有支援超過,可以看這個網頁,若顯示的背景為紅色代表不支援,綠色表示沒問題。
解決此問題最快的辦法就是把 css 分檔案就行了,rails 的 assets precompile 的 css 中若混雜著 bootstrap 之類的套件就會很容易超過此限制,只要把這些不會被修改的套件掛上 CDN 或分不同檔案 precompile 就可以處理了。
]]>html
的 <head>
裡面加上
1 2 3 |
|
參考來源: http://stackoverflow.com/questions/4759818/how-to-hide-the-address-bar-of-a-webpage-in-android
]]>1
|
|
參考連結: http://stackoverflow.com/questions/4824829/finding-the-session-id-in-rails-3
]]>rake db:migrate
- 執行 db/migrate 中還沒跑過的 migrations
rake db:migrate VERSION=12341234
- 針對設定的 migrations 版本執行
rake db:migrate:redo
- 重跑目前最新的 migration
rake db:migrate:redo STEP=3
- 重跑目前最新的三個 migration
rake db:rollback
- 還原跑過最新的 migration
rake db:rollback STEP=3
- 還原跑過最新三個的 migration
rake db:create
- 建立 database
rake db:drop
- 刪除整個 database
rake db:schema:dump
- 從目前 database 中實際的 schema 建立 db/schema.rb
rake db:schema:load
- 從 db/schema.rb 中把 schema 建立到 databse 中
rake db:structure:dump
- 從目前 database 中實際的 schema 輸出到 db/structure.sql
rake db:reset
- 合體的 task ( db:drop => db:create => db:schema:load)
另外安裝了 yaml_db
後,可以透過以下兩個指令把資料庫的資料做 export/import (不包含 schema)
rake db:data:dump
- 把資料輸出到 db/data.yml
rake db:data:load
- 把資料從 db/data.yml 輸入到 database 中
layout
檔 (views/layouts) 的命名是不能亂來的 ~XD參考: https://gist.github.com/1207002
以下視個人喜好而定:
上方選單 -> Sublime Text 2 -> Preferences -> Key Bindings Default
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 |
|
ubuntu
的話可以用
1
|
|
shell link,編輯 ~/.bashrc
或 ~/.zshrc
(看你用的是哪一個 shell)
1
|
|
command + ,
出現的檔案
1 2 3 4 5 6 7 8 |
|
(PS: 年紀大了所以用字體 size 用 18 XD)
(PS2: tab 設定隨個人/公司喜好)
用於快速安裝其他 package 的好工具
參考 http://wbond.net/sublime_packages/package_control/installation
ctrl+` 開啟 command line 後輸入:
1
|
|
重啟 sublime, command+shift+p
輸入 install 看到 Package Control: Install Package
即可透過此功能安裝其他 package
package control
command+shift+p
輸入 install
選 Package Control: Install Package
sass
選第一個安裝即可2.
, 鍵入 haml
選第一個安裝即可package control
command+shift+p
輸入 install
選 Package Control: Install Package
erb snippets
選第一個安裝即可參考官方文件 有快速 block template 可產生。
例如在 .erb 檔中,打 er
然後再按 tab
鍵就會生成 <% %>
。
參考 官方作法
利用 origin
參數即可在 open id 驗證後進行 redirect
1
|
|
1 2 3 |
|
若 devise
中已經透過 application_controller.rb 的 after_sign_in_path_for
處理登入後的 redirect 時,則可以透過 request.env['omniauth.origin']
取得 origin 參數的內容。
1 2 3 |
|
Devise
加上 Omniauth
(或其他 Open ID 登入機制) 時,資料庫的密碼欄位可能會需要為空值,因此可在 user 的 model 中覆寫 password_required?
(為 public method) 即可。
1 2 3 |
|
該範例之邏輯為,有 facebook id 時密碼欄位可為空值。
]]>一般我們認為創意之所以會有,乃是來自於 1. 靈光乍現
2. 置身領域之外的旁觀者
,
事實上這兩點都是不太正確的。任何突破性的創意產生之前,都是當事者下了多年的苦工後才有的。研究人員找出五百多首作曲,來自於個作曲家的第一部成名作或曠世巨作,發現其中只有三件作品是在作曲家職涯的前十年完成,而這三件作品完成的時間也是在第八年和第九年。而這樣的數據足以說明前述的 十年法則
。
在十年法則的漫長時間下,創作者做的活動大多是吸取專精知識,這些活動絕對是該領域密集而且深度的薰陶,即使沒有指導者,創新者本身也股強烈的動力,盡可能的學習與該領域相關的事物。
其實我們可以從現代科技中發現,這些創新都是既有事物的改良和延伸,透過卓越的洞見得以實現。如果不是因為了解過去的成就,這些創新肯定不可能實現。因此我們可確定靈光乍現是來自多時的思索和研究
,絕非偶然、也不是無中生有。
刻意練習不是輕鬆的過程,沒有熱情支持難以持續。因此創新者本身是熱切接受自身領域的薰陶,以及其相關的深度知識。
只要是組織 (2人以上) 都離不開文化的議題,而文化變革必須從上位者本身做起,只要公司的”長”字輩認為公司文化沒問題,它就永遠不可能改變。
組織想要有所創新,就得讓其中的每個人都了解哪種創新最有價值,有了方向才能夠進行深度的心智模型建立、投入大量心力,領導者在這裡扮演重要角色。
當組織內的每個人都被注入動機以及明確方向時,接下來需要注意的就是給予發揮空間,刻意練習強調的是自發性,組織在此要扮演推手的角色,而非造成限制。
身為網路工作者,又是工程師。在讀完本書後,小弟首先做的就是調整作息~XD 一改平日睡到十點後才醒來的習慣,想辦法在早上擠出 1~2 小時做最困難的工作 (通常都是 coding 或 debug),我設定給自己的關鍵指標就是開發所花的時間: 每天早上這 1~2 小時能完成多少工作。
在這樣的過程中剛開始是很痛苦,其實早起感覺都沒睡飽,注意力也難以集中,但震盪期大概持續一個月左右就適應了。習慣後慢慢發現另一個重要的指標: 專注力,程式開發是很注重當下的專心度,因此開始用一些方式提高專注力,關掉手機以及電腦的各種通知等,用高度的感知以及後設認知檢視自己在這段時間內的專注力是否有提昇。
有了一定程度的專注力後,又發現了另一個指標: 英文資料理解速度。程式開發遇到問題經常要上孤狗,而資料多半是英文,因此能夠花越少的時間孤狗,相對就能夠花越多時間在開發上,效率自然會提昇。
如此循環進行,發現不斷找到新的評估指標,然後持續提昇。目前小弟正在磨練的另一項技能是養成寫 blog 的習慣,將自己曾經解決的問題以及累積的知識得以文件保存,除此之外,身為工程師仍有許多能力必須提昇,例如和別人溝通時是否能以最精簡的方式傳達,專案執行前的目標設定是否足夠嚴謹、達成率是否足夠等。刻意練習概念所帶給我的,是變得更了解這些技能學習過程的運作原理,進而更能掌握自己各方面能力的提升。
]]>