2014年11月15日 星期六

production環境上 也能直接顯示css js的變動

production環境上 也能直接顯示css js的變動

因為人因需求 需要直接修改production環境的css檔
因此先修改production.rb的設定
rails s -e production
# Code is not reloaded between requests.
# config.cache_classes = true
   config.cache_classes = false

# Disable Rails's static asset server (Apache or nginx will already do this).
  #config.serve_static_assets = false
  config.serve_static_assets = true

# Do not fallback to assets pipeline if a precompiled asset is missed.
  # config.assets.compile = false
  config.assets.compile = true

# Generate digests for assets URLs.
  #config.assets.digest = true
  config.assets.digest = false

2014年10月29日 星期三

GIT 常用指令

http://homeserver.com.tw/2013/09/24/git-%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4/


注意事項

由 project/.git/config 可知: (若有更多, 亦可由此得知)
  • origin(remote) 是 Repository 的版本
  • master(branch) 是 local 端, 正在修改的版本
平常沒事不要去動到 origin, 如果動到, 可用 git reset –hard 回覆到沒修改的狀態.

Git 新增檔案

  • git add . # 將資料先暫存到 staging area, add 之後再新增的資料, 於此次 commit 不會含在裡面.
  • git add filename
  • git add modify-file # 修改過的檔案, 也要 add. (不然 commit 要加上 -a 的參數)
  • git add -u # 只加修改過的檔案, 新增的檔案不加入.
  • git add -i # 進入互動模式

Git 刪除檔案

  • git rm filename

Git 修改檔名、搬移目錄

  • git mv filename new-filename

Git status 看目前的狀態

  • git status # 看目前檔案的狀態

Git Commit

  • git commit
  • git commit -m ‘commit message’
  • git commit -a -m ‘commit -message’ # 將所有修改過得檔案都 commit, 但是 新增的檔案 還是得要先 add.
  • git commit -a -v # -v 可以看到檔案哪些內容有被更改, -a 把所有修改的檔案都 commit

Git 產生新的 branch

  • git branch # 列出目前有多少 branch
  • git branch new-branch # 產生新的 branch (名稱: new-branch), 若沒有特別指定, 會由目前所在的 branch / master 直接複製一份.
  • git branch new-branch master # 由 master 產生新的 branch(new-branch)
  • git branch new-branch v1 # 由 tag(v1) 產生新的 branch(new-branch)
  • git branch -d new-branch # 刪除 new-branch
  • git branch -D new-branch # 強制刪除 new-branch
  • git checkout -b new-branch test # 產生新的 branch, 並同時切換過去 new-branch
  • # 與 remote repository 有關
  • git branch -r # 列出所有 Repository branch
  • git branch -a # 列出所有 branch

Git checkout 切換 branch

  • git checkout branch-name # 切換到 branch-name
  • git checkout master # 切換到 master
  • git checkout -b new-branch master # 從 master 建立新的 new-branch, 並同時切換過去 new-branch
  • git checkout -b newbranch # 由現在的環境為基礎, 建立新的 branch
  • git checkout -b newbranch origin # 於 origin 的基礎, 建立新的 branch
  • git checkout filename # 還原檔案到 Repository 狀態
  • git checkout HEAD . # 將所有檔案都 checkout 出來(最後一次 commit 的版本), 注意, 若有修改的檔案都會被還原到上一版. (git checkout -f 亦可)
  • git checkout xxxx . # 將所有檔案都 checkout 出來(xxxx commit 的版本, xxxx 是 commit 的編號前四碼), 注意, 若有修改的檔案都會被還原到上一版.
  • git checkout — * # 恢復到上一次 Commit 的狀態(* 改成檔名, 就可以只恢復那個檔案)

Git diff

  • git diff master # 與 Master 有哪些資料不同
  • git diff –cached # 比較 staging area 跟本來的 Repository
  • git diff tag1 tag2 # tag1, 與 tag2 的 diff
  • git diff tag1:file1 tag2:file2 # tag1, 與 tag2 的 file1, file2 的 diff
  • git diff # 比較 目前位置 與 staging area
  • git diff –cached # 比較 staging area 與 Repository 差異
  • git diff HEAD # 比較目前位置 與 Repository 差別
  • git diff new-branch # 比較目前位置 與 branch(new-branch) 的差別
  • git diff –stat

Git Tag

  • git tag v1 ebff # log 是 commit ebff810c461ad1924fc422fd1d01db23d858773b 的內容, 設定簡短好記得 Tag: v1
  • git tag 中文 ebff # tag 也可以下中文, 任何文字都可以
  • git tag -d 中文 # 把 tag=中文 刪掉

Git log

  • git log # 將所有 log 秀出
  • git log –all # 秀出所有的 log (含 branch)
  • git log -p # 將所有 log 和修改過得檔案內容列出
  • git log -p filename # 將此檔案的 commit log 和 修改檔案內容差異部份列出
  • git log –name-only # 列出此次 log 有哪些檔案被修改
  • git log –stat –summary # 查每個版本間的更動檔案和行數
  • git log filename # 這個檔案的所有 log
  • git log directory # 這個目錄的所有 log
  • git log -S’foo()’ # log 裡面有 foo() 這字串的.
  • git log –no-merges # 不要秀出 merge 的 log
  • git log –since="2 weeks ago" # 最後這 2週的 log
  • git log –pretty=oneline # 秀 log 的方式
  • git log –pretty=short # 秀 log 的方式
  • git log –pretty=format:’%h was %an, %ar, message: %s’
  • git log –pretty=format:’%h : %s’ –graph # 會有簡單的文字圖形化, 分支等.
  • git log –pretty=format:’%h : %s’ –topo-order –graph # 依照主分支排序
  • git log –pretty=format:’%h : %s’ –date-order –graph # 依照時間排序

Git show

  • git show ebff # 查 log 是 commit ebff810c461ad1924fc422fd1d01db23d858773b 的內容
  • git show v1 # 查 tag:v1 的修改內容
  • git show v1:test.txt # 查 tag:v1 的 test.txt 檔案修改內容
  • git show HEAD # 此版本修改的資料
  • git show HEAD^ # 前一版修改的資料
  • git show HEAD^^ # 前前一版修改的資料
  • git show HEAD~4 # 前前前前一版修改的資料

Git reset 還原

  • git reset –hard HEAD # 還原到最前面
  • git reset –hard HEAD~3
  • git reset –soft HEAD~3
  • git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)

Git grep

  • git grep “te" v1 # 查 v1 是否有 “te" 的字串
  • git grep “te" # 查現在版本是否有 “te" 的字串

Git stash 暫存

  • git stash # 丟進暫存區
  • git stash list # 列出所有暫存區的資料
  • git stash pop # 取出最新的一筆, 並移除.
  • git stash apply # 取出最新的一筆 stash 暫存資料. 但是 stash 資料不移除
  • git stash clear # 把 stash 都清掉

Git merge 合併

  • Straight merge 預設的合併模式,會有全部的被合併的 branch commits 記錄加上一個 merge-commit,看線圖會有兩條 Parents 線,並保留所有 commit log。
  • Squashed commit 壓縮成只有一個 merge-commit,不會有被合併的 log。SVN 的 merge 即是如此。
  • cherry-pick 只合併指定的 commit
  • rebase 變更 branch 的分支點:找到要合併的兩個 branch 的共同的祖先,然後先只用要被 merge 的 branch 來 commit 一遍,然後再用目前 branch 再 commit 上去。這方式僅適合還沒分享給別人的 local branch,因為等於砍掉重練 commit log。
指令操作
  • git merge <branch_name> # 合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
  • git merge –squash <branch_name> # 將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
  • git cherry-pick 321d76f # 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。

Git blame

  • git blame filename # 關於此檔案的所有 commit 紀錄

Git 還原已被刪除的檔案

  • git ls-files -d # 查看已刪除的檔案
  • git ls-files -d | xargs git checkout — # 將已刪除的檔案還原

Git 維護

  • git gc # 整理前和整理後的差異, 可由: git count-objects 看到.
  • git fsck –full

Git revert 資料還原

  • git revert HEAD # 回到前一次 commit 的狀態
  • git revert HEAD^ # 回到前前一次 commit 的狀態
  • git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)
  • git checkout filename # 從 unstaging 狀態回到最初 Repository 的檔案(檔案內容變回修改前)

Git Rollback 還原到上一版

  • git reset –soft HEAD^
  • 編輯 + git add filename
  • git commit -m ‘rollback’
以下與 遠端 Repository 相關

Git remote 維護遠端檔案

  • git remote
  • git remote add new-branch http://git.example.com.tw/project.git # 增加遠端 Repository 的 branch(origin -> project)
  • git remote show # 秀出現在有多少 Repository
  • git remote rm new-branch # 刪掉
  • git remote update # 更新所有 Repository branch
  • git branch -r # 列出所有 Repository branch

抓取 / 切換 Repository 的 branch

  • git fetch origin
  • git checkout –track -b reps-branch origin/reps-branch # 抓取 reps-branch, 並將此 branch 建立於 local 的 reps-branch

刪除 Repository 的 branch

  • git push origin :heads/reps-branch

2014年10月26日 星期日

Symbol#to_proc

class Symbol
  def to_proc
    Proc.new { |obj, *args| obj.send(self, *args) }
  end
end

2014年8月12日 星期二

mac終端機指令

1. Control + L 可以清除螢幕
2. Control + A 可以將游標跳到行首
3. Control + E 可以將由游標跳到行尾
4. Control + W 可以刪掉一個詞
5. Control + U 可以刪除一行
6. Control + R 可以快速完成曾經輸入過的命令

2014年8月9日 星期六

call create! with a block

call create! with a block

def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["user_info"]["name"]
    end
  end
This is useful as it allows us to modify the new user before it’s saved to the database and because it returns the new user

2014年7月20日 星期日

git 常用指令

學習網站



git checkout --track -b  develop origin/develop

tig

git rebase HEAD^

git reset
git revert

git fetch

git pull —rebase

git tag

git rebase

origin(remote) 是 Repository 的版本
master(branch) 是 local 端, 正在修改的版本

Git 產生新的 branch

git branch # 列出目前有多少 branch
git branch -d new-branch # 刪除 new-branch
git branch new-branch # 產生新的 branch (名稱: new-branch), 若沒有特別指定, 會由目前所在的 branch / master 直接複製一份.

Git checkout 切換 branch

git checkout branch-name # 切換到 branch-name

Git reset 還原

git reset --hard HEAD # 還原到最前面
git reset --hard HEAD~3
git reset --soft HEAD~3
git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)

遠端 Repository 相關

Git remote 維護遠端檔案

git remote
git remote add new-branch http://git.example.com.tw/project.git # 增加遠端 Repository 的 branch(origin -> project)
git remote show # 秀出現在有多少 Repository
git remote rm new-branch # 刪掉
git remote update # 更新所有 Repository branch
git branch -r # 列出所有 Repository branch

去拉遠端最新的分支與同步

git fetch -p

把本機的develop跟遠端最新的develop同步

git pull origin develop

把本機的XX分支推上遠端

git push origin XX分支名XX(如果遠端沒有XX分支的話,那就用幫建一個,如果有的話,就會被蓋過去)

Git 還原已被刪除的檔案

  • git ls-files -d # 查看已刪除的檔案
  • git ls-files -d | xargs git checkout -- # 將已刪除的檔案還原

2014年7月19日 星期六

ruby . array.all , bsearch


data.select { |h| h[:sex] == sex}.all? { |a| a[:age] > age_is_greater_than }
先select出來 再用all來找出是否全部符合條件
all?() public
Passes each element of the collection to the given block. The method returns true if the block never returns false or nil. If the block is not given, Ruby adds an implicit block of {|obj| obj} (that is all? will return true only if none of the collection members are false or nil.)
bsearch
ary = [0, 4, 7, 10, 12]
# try to find v such that 4 <= v < 8
ary.bsearch {|x| 1 - x / 4 } #=> 4 or 7
# try to find v such that 8 <= v < 10
ary.bsearch {|x| 4 - x / 2 } #=> nil
我簡單的理解成當要用binary search來找array時 如何設計條件
要找出4 <= v < 8的 就是條件中{|x| 1 - x / 4 } x的範圍為多少時 結果為0
In find-any mode (this behaves like libc’s bsearch(3)), the block must return a number, and there must be two indices i and j (0 <= i <= j <= ary.size) so that:
the block returns a positive number for ary if 0 <= k < i,
the block returns zero for ary if i <= k < j, and
the block returns a negative number for ary if j <= k < ary.size.
Under this condition, this method returns any element whose index is within i…j. If i is equal to j (i.e., there is no element that satisfies the block), this method returns nil.

2014年7月1日 星期二

devise omniauth-fb carrierwave 登入


安裝 gem
/Gemfile
gem "devise" gem "omniauth-facebook"
設定 devise
/config/initializiers/devise.rb
config.omniauth :facebook, Settings.story.fb_app_id, Settings.story.fb_secret, {:provider_ignores_state => true}
add the omniauthable model to the devise method in our User model.
/app/models/user.rb
class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :omniauthable, :recoverable, :rememberable, :trackable, :validatable end
如此會產生兩個routes
user_omniauth_authorize
GET|POST /users/auth/:provider(.:format) omniauth_callbacks#passthru {:provider=>/facebook/}
user_omniauth_callback GET|POST /users/auth/:action/callback(.:format) omniauth_callbacks#(?-mix:facebook)
建立一個omniauth_callbacks的controller來處理以上的這些資訊
設定
/routes.rb
devise_for :users, controllers: {omniauth_callbacks: "omniauth_callbacks"}
/app/controllers/omniauth_callbacks_controller.rb
1 class OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 3 def all 4 user = User.from_omniauth(request.env["omniauth.auth"]) 5 if user.persisted? 6 sign_in_and_redirect user, notice: "Signed in!" 7 else 8 session["devise.user_attributes"] = user.attributes 9 redirect_to new_user_registration_url 10 end 11 end 12 13 alias_method :facebook, :all 14 end
user要多增加欄位來存provider和uid
增加上述的from_omniauth
/app/models/user.rb
19 def self.from_omniauth(auth) 20 where(auth.slice(:provider, :uid)).first_or_create do |user| 21 user.provider = auth.provider 22 user.uid = auth.uid 23 user.email = auth.info.email 24 user.name = auth.info.name 25 user.remote_image_url = auth.info.image.gsub('http://','https://') 26 end 27 end
增加new_with_session
/app/models/user.rb
29 def self.new_with_session(params, session) 30 if session["devise.user_attributes"] 31 new(session["devise.user_attributes"], without_protection: true) do |user| 32 user.attributes = params 33 user.valid? 34 end 35 else 36 super 37 end 38 end
password_required?
/app/models/user.rb
40 def update_with_password(params, *options) 41 if encrypted_password.blank? 42 update_attributes(params, *options) 43 else 44 super 45 end 46 end 47 48 def password_required? 49 super && provider.blank? 50 end 51 52 def email_required? 53 super && provider.blank? 54 end

2014年6月15日 星期日

CarrierWave & rmagick


CarrierWave provides a generator called uploader to do this to which we pass the name we want to give our uploader, in this case image.
$ rails generate uploader Avatar
加欄位
$ rails g migration add_avatar_to_users avatar:string
Open your model file and mount the uploader
class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
end

resize

class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  process :resize_to_fit => [800, 800]

  version :thumb do
    process :resize_to_fill => [200,200]
  end
end

2014年6月13日 星期五

Mustache Template with Nested Array of Objects

情境:使用者點選按贊的人數時 顯示出按贊的人是誰
view: ajax 送js
contoller處理
def likedPeople
  @post = Post.find(params[:post_id] 
    respond_to do |format|
    format.js
  end
end
之後到likedPeople.js.erb
  2 var template = $('#template').html();
  3 Mustache.parse(template);   // optional, speeds up future uses
  4
  5 var arr = <%= safe(@post.liked_people.to_json) %> ;
  6
  7 var rendered = Mustache.render(template, {rows: arr})
  8
  9 $('#target').html(rendered);
先將@post.liked_people.to_js 再送到Mustache裡面去
但由於其內容是Nested Array of Objects
所以再加個
  7 var rendered = Mustache.render(template, {rows: arr})
來處理
template 就處理每個row
  3 <script id="template" type="x-tmpl-mustache">
  4   <ul class="list-like-group">
  5     {{#rows}}
  6     <li class="list-like-group-item" >
  7       <img class="like-author-photo" src="{{image.url}}" />
  8       <a href="/users/{{id}}/posts">
  9         {{name}}
 10       </a>
 11     </li>
 12     {{/rows}}
 13   </ul>
 14 </script>