A Month in Rails
Master-slave
Why I am not using Masochism for my master-slave setups and why monkey-patching isn’t the only solution
Password security
Securely store passwords with bcrypt-ruby; now compatible with JRuby and Ruby 1.9
A rails plugin to store a collection of boolean attributes in a single ActiveRecord column as a bit field.
把boolean 欄位用一個integer column 取代
flag_shih_tzu
security model
acts_as_lockbox for your Rails Models
2009年9月22日 星期二
Observational: Better Observers for ActiveRecord
Observational: Better Observers for ActiveRecord
一個比較好的observer
1. 老地方, 可是寄信基本上這應該不干 User 的事, 所以把它搬走
2. 把它搬到 observer 裡, 可是如果很多地方都要寄信, 就很麻煩, 要多一堆file
3. 所以就搬到寄信的地方 然後由它observe 看起來合情合理
一個比較好的observer
1. 老地方, 可是寄信基本上這應該不干 User 的事, 所以把它搬走
2. 把它搬到 observer 裡, 可是如果很多地方都要寄信, 就很麻煩, 要多一堆file
3. 所以就搬到寄信的地方 然後由它observe 看起來合情合理
cookie, session and request object
* Cookie物件
Cookie物件會藉由瀏覽器所提供Cookie功能,將資訊記錄在用戶端電腦裡面,也就是利用Cookie物件來紀錄判斷某個使用者是否曾經進入本網站,當瀏覽者離線,Cookie物件資料紀錄仍然存在用戶端電腦.(當瀏覽器停用cookie設定,此功能就會失效)
Session物件:紀錄Session中的各種描述資訊與邏輯關係,和Cookie不同的是Session可以儲存任意的物件.
Session處理過程:
當伺服器皆收用戶發送的請求後,ROR就會尋找一用戶Session ID,如果沒有該用戶Session ID,會立即建立一個Session,並且分配Session ID,同時同Cookie形式將Session ID保存到用戶瀏覽器上面.之後ROR會根據Session ID來找到保存在伺服器端的Session資料,並且利用Session物件來對Session做各種操作.
* request物件:應用於使用者各種請求,它允許開發者透過某些方法來請求資訊.
常用方法:
1.delete? (用於確定是否為一個刪除操作要求)
2.get? (用於確定是否為一個GET的請求)
3.post? (用於確定是否為一個POST請求)
4.host (用於取得使用者主機的IP位置)
5.protocol(用於確定請求的協議類型)
6.env (用於取得環境變數的資訊)
Cookie物件會藉由瀏覽器所提供Cookie功能,將資訊記錄在用戶端電腦裡面,也就是利用Cookie物件來紀錄判斷某個使用者是否曾經進入本網站,當瀏覽者離線,Cookie物件資料紀錄仍然存在用戶端電腦.(當瀏覽器停用cookie設定,此功能就會失效)
Session物件:紀錄Session中的各種描述資訊與邏輯關係,和Cookie不同的是Session可以儲存任意的物件.
Session處理過程:
當伺服器皆收用戶發送的請求後,ROR就會尋找一用戶Session ID,如果沒有該用戶Session ID,會立即建立一個Session,並且分配Session ID,同時同Cookie形式將Session ID保存到用戶瀏覽器上面.之後ROR會根據Session ID來找到保存在伺服器端的Session資料,並且利用Session物件來對Session做各種操作.
* request物件:應用於使用者各種請求,它允許開發者透過某些方法來請求資訊.
常用方法:
1.delete? (用於確定是否為一個刪除操作要求)
2.get? (用於確定是否為一個GET的請求)
3.post? (用於確定是否為一個POST請求)
4.host (用於取得使用者主機的IP位置)
5.protocol(用於確定請求的協議類型)
6.env (用於取得環境變數的資訊)
cron job 跑rake
How to Schedule a Ruby on Rails Rake Task Via Cron
*/5 * * * * cd /var/www/apps/rails_app/ && /usr/local/bin/rake RAILS_ENV=production rake_task:goes_here
注意它是用 /usr/local/bin/rake
*/5 * * * * cd /var/www/apps/rails_app/ && /usr/local/bin/rake RAILS_ENV=production rake_task:goes_here
注意它是用 /usr/local/bin/rake
2009年9月15日 星期二
git memo
Git 版本控制系統 (1)
Git 版本控制系統(2) 開 branch 分支和操作遠端 repo.
Git 原始碼管理
使用Git與Github管理軟體開發專案
git add . 加入所有檔案,包括所有還沒有被追蹤(untracked)的檔案
git add -i 進入互動模式,你甚至可以只 Add 檔案裡面其中的一段程式碼到 staging area 去(稱作patch)
git add -u 只加更新的檔案,不加入還沒有追蹤的檔案 (跟 git commit -a 涵蓋的範圍相同)
git commit -m "blah" 如果沒加 -m 的話, 會開編輯器輸入 commit log (可以在.gitconfig中設定編輯器)
git commit -a -m "foobar" 全部修改的檔案都 add 後 commit 出去 (不包括 untracked 的新檔案)
git commit -v 會開編輯器加上 diff 註解
git rm foobar 刪除
git mv old_file new_file 改檔名
git diff 是比較 working tree 跟 staging area
git diff --cached 是比較 staging area 跟本來的 repo.
git diff HEAD 是比較 working tree 跟本來的 repo.
git reset HEAD filename 會從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)
git checkout filename 會從 unstaging 狀態回到最初 repo. 的檔案(檔案內容變回修改前)
git branch 建立本地 local branch
git branch -m 改名字 (如果有同名會失敗,改用 -M 可以強制覆蓋)
git branch 列出目前有那些 branch 以及目前在那個 branch
git checkout 切換 branch (注意到如果你有檔案修改了卻還沒 commit,會不能切換 branch,解法稍後會談)
git checkout -b () 本地建立 branch 並立即 checkout 切換過去
git branch -d 刪除 local branch
git merge 合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
git merge --squash 將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
git cherry-pick 321d76f 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。
git push 預設的遠端是 origin,並且會將所有有和 remote 有對應的 local branch 都 push 上去。如果要把新的 local branch push 上去,需要下 git push origin 指令。
如果今天tom的test repo有了新的變更,告訴billy,billy要將變更merge到自己的repo中,可以在本地端輸入
git pull git://github.com/tom/test.git
pull這個指令其實涵蓋了fetch(將變更複製回來)以及merge。
因此經過merge後,tom的變更就加入到billy的repo囉!
另外版本控制系統的branch功能也很有意思,若您的程式碼同時要修改bug,又要加入新功能,可以fork出一個branch,一個專門修bug,一個專門加入新功能,等到穩定後再來merge
git branch bug_fix #建立branch,名為bug_fix
git checkout bug_fix #切換到bug_fix這個branch
git checkout master #換為主要的repo
git merge bug_fix #把bug_fix這個branch和現在的branch合併
若有branch在remote,想要查看並checkout出來
git branch -r #查看遠端branch
git checkout -b bug_fix_local bug_fix_remote #把本機端切換為遠端的bug_fix_remote branch,並命名為bug_fix_local
還有其他可以觀看repo狀態的工具
git log #可以查看每次commit的改變
git diff #可以查看最近一次改變的內容,加上參數可以看其他的改變,並互相比較
git show #可以看某次的變更
Git 版本控制系統(2) 開 branch 分支和操作遠端 repo.
Git 原始碼管理
使用Git與Github管理軟體開發專案
git add . 加入所有檔案,包括所有還沒有被追蹤(untracked)的檔案
git add -i 進入互動模式,你甚至可以只 Add 檔案裡面其中的一段程式碼到 staging area 去(稱作patch)
git add -u 只加更新的檔案,不加入還沒有追蹤的檔案 (跟 git commit -a 涵蓋的範圍相同)
git commit -m "blah" 如果沒加 -m 的話, 會開編輯器輸入 commit log (可以在.gitconfig中設定編輯器)
git commit -a -m "foobar" 全部修改的檔案都 add 後 commit 出去 (不包括 untracked 的新檔案)
git commit -v 會開編輯器加上 diff 註解
git rm foobar 刪除
git mv old_file new_file 改檔名
git diff 是比較 working tree 跟 staging area
git diff --cached 是比較 staging area 跟本來的 repo.
git diff HEAD 是比較 working tree 跟本來的 repo.
git reset HEAD filename 會從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)
git checkout filename 會從 unstaging 狀態回到最初 repo. 的檔案(檔案內容變回修改前)
git branch
git branch -m
git branch 列出目前有那些 branch 以及目前在那個 branch
git checkout
git checkout -b
git branch -d
git merge
git merge --squash
git cherry-pick 321d76f 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。
git push 預設的遠端是 origin,並且會將所有有和 remote 有對應的 local branch 都 push 上去。如果要把新的 local branch push 上去,需要下 git push origin
如果今天tom的test repo有了新的變更,告訴billy,billy要將變更merge到自己的repo中,可以在本地端輸入
git pull git://github.com/tom/test.git
pull這個指令其實涵蓋了fetch(將變更複製回來)以及merge。
因此經過merge後,tom的變更就加入到billy的repo囉!
另外版本控制系統的branch功能也很有意思,若您的程式碼同時要修改bug,又要加入新功能,可以fork出一個branch,一個專門修bug,一個專門加入新功能,等到穩定後再來merge
git branch bug_fix #建立branch,名為bug_fix
git checkout bug_fix #切換到bug_fix這個branch
git checkout master #換為主要的repo
git merge bug_fix #把bug_fix這個branch和現在的branch合併
若有branch在remote,想要查看並checkout出來
git branch -r #查看遠端branch
git checkout -b bug_fix_local bug_fix_remote #把本機端切換為遠端的bug_fix_remote branch,並命名為bug_fix_local
還有其他可以觀看repo狀態的工具
git log #可以查看每次commit的改變
git diff #可以查看最近一次改變的內容,加上參數可以看其他的改變,並互相比較
git show #可以看某次的變更
2009年9月14日 星期一
如何設計有效的佈局?
如何設計有效的佈局?
將任務相關的重要信息要直接表現在控件上。用戶更傾向於關注交互控件上的標籤,而不是輔助型的靜態文本。
* 以8px為橫向柵格單位,頁面所有元素寬度都可以是2的倍數,包括圖片和版塊寬度,這樣可以在一定程度上加快頁面(特別是對於J-PEG圖片)的渲染速度(基於計算機內部二進制的運算機制)。其在擴展和兼容性上也有一定優勢。
* 在阿里巴巴中文站中,佈局間距的最小單位為8px,佈局區塊採用32px(8px*4)和24(8px*3)兩種粒度單位,分別組成以下兩種可實現的柵格系統:
在綜合考慮當下主流分辨率情況、瀏覽器外觀對顯示空間的佔用、人機工程學中對水平視角和聚焦範圍的規定以及8px單位等多種因素後,我們認為960px是一個相對更加合理的頁面寬度。在阿里巴巴中文網站中,推薦使用定寬960px的頁面,去除左右各4px的邊距,中間的可視寬度為952px。
將任務相關的重要信息要直接表現在控件上。用戶更傾向於關注交互控件上的標籤,而不是輔助型的靜態文本。
* 以8px為橫向柵格單位,頁面所有元素寬度都可以是2的倍數,包括圖片和版塊寬度,這樣可以在一定程度上加快頁面(特別是對於J-PEG圖片)的渲染速度(基於計算機內部二進制的運算機制)。其在擴展和兼容性上也有一定優勢。
* 在阿里巴巴中文站中,佈局間距的最小單位為8px,佈局區塊採用32px(8px*4)和24(8px*3)兩種粒度單位,分別組成以下兩種可實現的柵格系統:
在綜合考慮當下主流分辨率情況、瀏覽器外觀對顯示空間的佔用、人機工程學中對水平視角和聚焦範圍的規定以及8px單位等多種因素後,我們認為960px是一個相對更加合理的頁面寬度。在阿里巴巴中文網站中,推薦使用定寬960px的頁面,去除左右各4px的邊距,中間的可視寬度為952px。
網頁編碼問題 與 META
一個常用又不知道是做什麼用的 META 設定
正確來說,這段 META 是定義「網頁送出的編碼字集」,而不是用來定義「該網頁應該顯示的字集」!
關於各瀏覽器對網頁與文字編碼的處理規則研究整理
當你的網頁編碼為 Big5 字集,但你需要表單送出時用 GB2312 字集送出的話,就可以利用以下步驟完成此任務:
1. 伺服器回應網頁要求時明確指定瀏覽器應顯示的字集
Response.ContentType = "text/html; charset=big5";
2. 在網頁 HTML 中加入 META 標籤,明確指定 Content-Type 與字集
<[meta http-equiv="Content-Type" content="text/html; charset=gb2312" /]>
正確來說,這段 META 是定義「網頁送出的編碼字集」,而不是用來定義「該網頁應該顯示的字集」!
關於各瀏覽器對網頁與文字編碼的處理規則研究整理
當你的網頁編碼為 Big5 字集,但你需要表單送出時用 GB2312 字集送出的話,就可以利用以下步驟完成此任務:
1. 伺服器回應網頁要求時明確指定瀏覽器應顯示的字集
Response.ContentType = "text/html; charset=big5";
2. 在網頁 HTML 中加入 META 標籤,明確指定 Content-Type 與字集
<[meta http-equiv="Content-Type" content="text/html; charset=gb2312" /]>
訂閱:
文章 (Atom)