2014年5月18日 星期日

after_create vs after_commit


  • after_commit  

就是資料庫已經commit之後執行 , 所以如果執行after_commit失敗的話 之前commit的也不會rollback , 因為after_commit transaction 結束了

也就是資料確定進去了所以after_commit 用在一些背景執行之類,寄信什麼的

  • after_create 
        是已經產生但還沒commit 執行 ,執行after_create失敗的話 ,還可以rollback


     所以兩者使用的時機

  • after_commit
        例如寄信,因為寄信動作發了,也不可能在取消,所以也不需要什麼rollback了
  • after_create
        如果這個動作還是再做db的動作 在transcation裡面 如果他失敗了 他會取消 就整個rollback

tmux 256色 設定

最近發生了在vim上面有256色

但是若在tmux上開vim卻沒有256色了 , 是因為在tmux上面沒有

所以在tmux上也是要設定

主要是在.tmux.conf加上這行就可以了
  • set -g terminal-overrides 'xterm:colors=256'






link_to , simple_form_for , two models

link_to  或者是 simple_form_for 後面有時候皆兩個model

  • <%= link_to "New Comment", [:new, @commentable, :comment] %></p>
  • simple_form_for [@post, @comment]

因此查了一下文件 了解其原理





2014年5月11日 星期日

HTTP Caching

HTTP Caching
http://railscasts.com/episodes/321-http-caching?view=asciicast

這篇來講說在rails 上實作HTTP Caching的機制

首先可以用 curl這個命令來看到說request後respond了什麼
terminal
$ curl -I http://localhost:3000/
HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "d3132af4f574ff53eb69e6fa5523fe2a"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 2cb31eeec2b1beda8e1342f8caa90acd
X-Runtime: 0.018216
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
Date: Fri, 03 Feb 2012 21:09:22 GMT
Connection: Keep-Alive
Set-Cookie: _store_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJWQ2N2U5MGEwMWZhNGU4ZTI2NzIxOTYxOWE1ODYyNzcxBjsAVEkiEF9j

這邊要看的有幾個
1.Etag
2.Last-Modified
3.Cache-Control
Cache-Control: max-age=0, private, must-revalidate

程式碼
可透過fresh_when來設定





fresh_when does a couple of things 
1.checks the Etag matches or not
2.If matches : send a 304 Not Modified response instead of rendering the actual template

3.If not matches , the page will rendered as normal

Rack:cache -->This is known as a reverse proxy cache or gateway cache
rails 已經自動將他包進來在production環境
如果你要在development上使用
/config/environments/development.rb
config.action_controller.perform_caching = true

如果是敏感性資料時
可以設定當目前為public時 不要顯現
/app/views/layouts/application.html.erb
<%= csrf_meta_tag unless response.cache_control[:public] %>

rails.vim

rails.vim

:R   -> navigation command
:RV file_name  -> vertical split
:RS file_name -> horizontal split
:RT file_name -> open the file in a new tab

:Rview or Rvi  -> views
:Rcontroller or Rco ->controllers
:Rmodel or Rmo -> models


:A -> gives you the “alternate” file for your currently file . 

:gf

(ctrl+w) w切換分頁 , (ctrl+w) h,j,k,l 

(ctrl+p) : ctrlp.vim

2014年5月9日 星期五

Caching Tutorial

https://www.mnot.net/cache_docs/

Kinds of Web Caches

  • browser caches
  • proxy caches
  • gateway caches


how to control caches

  • html meta tags -> easy to use , but aren’t very effective . only honored by a few browser caches , not proxy caches
  • http headers -> give you a lot of control over how both browser caches and proxies handle your representations . 


HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT Server: Apache/1.3.3 (Unix) Cache-Control: max-age=3600, must-revalidate Expires: Fri, 30 Oct 1998 14:19:41 GMT Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT ETag: "3e86-410-3596fbbc" Content-Length: 1040 Content-Type: text/html

Controlling Freshness with the Expires HTTP Header

  • Expires -> it has some limitations , because there’s a date involved , clocks must be synchronized
  • easy to forget that you’ve set some content to expire at a particular time


Cache-Control HTTP Headers

Useful Cache-Control response headers include:
  • max-age = [seconds]
  • s-maxage = [seconds]


Tips for Building a Cache-Aware Site

  • Use URLS consistently
  • Use common library of images and other elements
  • Make caches store images and pages that don’t change often by using Cache-Control:max-age header with a large value
  • Make caches recognize regularly 
  • If a resource changes , change its name
  • don’t change files unnecessarily
  • Use cookies only where necessary
  • Minimize use of SSL

Writing Cache-Aware Scripts

  • only write file that have changed
  • set an age-related header for as far in the future as practical  -> max-age
  • parsing the HTTP headers : If-Modified-Since ,  304 Not Modified
  • don’t use POST unless it’s appropriate .
  • don’t embed user-specific information in the URL unless the content is unique to that user
  • Don’t count on all request from a user coming from the same host
  • Generate Content-Length response headers



Adding an Environment

一般當我們產生rails專案時 會自動幫我們產生三個環境的設定
development , test , production
裡面都有些不同的設定
例如像是config.cache_classes
在production.rb上 就設定為 true =>(means that the app’s classes won’t be reloaded between requests for performance reasons)
在development.rb上就設定為false =>(reloaded automatically by every request)

所以其實我們就可以自己客製一個環境staging.rb
touch config/environments/staging.rb  
看你要用什麼設定 例如你想要類似跟production類似 就將他複製一份 在修改幾個你要的參數

之後也要對應修改其他的設定檔案 例如是database.yml
要在加一份
staging:
  adapter: sqlite3
  database: db/staging.sqlite3
  pool: 5
  timeout: 5000

之後若要用你客製化的環境來運行你的專案時 用 -e 這個參數
rails s -e staging

console
rails c staging

homebrew

homebrew 是在mac上的套件管理工具

安裝方式
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
Homebrew 會將 packages 安裝在他們自己的目錄,然後把檔案 symlink 到 /usr/local 下。Homebrew 不會把檔案放在預設路徑之外的地方,因此可以在任何位置使用 Homebrew 安裝程式。

brew search 搜尋套件
brew info 查詢套件資訊
brew list 你已經安裝了哪些套件
brew update 更新
brew install 安裝套件