CarrierWaveのUploaderクラス単位でS3画像の有効期限を変更する

特定の Uploader クラス単位(レコード単位)で S3 画像の有効期限を儲けたい時の設定方法。

config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_credentials = {
    :provider              => "AWS",
    :aws_access_key_id     => "YOUR_ACCESS_KEY",
    :aws_secret_access_key => "YOUR_SECRET_KEY",
    :region                => "ap-northeast-1",
  }
  config.fog_directory = "YOUR_BUCKET_NAME"
  config.fog_public    = true # デフォルトは有効期限を設定しない
end

app/uploaders/foo_image_uploader.rb

class FooImageUploader < CarrierWave::Uploader::Base
  def initialize(*)
    super
    self.fog_public = false
    expiration = model.end_at ? model.end_at - Time.now : "デフォルトの有効秒数"
    self.fog_authenticated_url_expiration = expiration
  end

  process :resize_to_fit => [400, 300]

  # some code...
end

利用した Gem のバージョン

  • fog (1.12.1)
  • carrierwave (0.8.0)

Railsでsymfonyのコンポーネント機能を実現するCellsというgem

すごいニッチだけど PHP フレームワークsymfony 1.x 系の経験者で Rails をやりだした人のためにメモ。
symfonyコンポーネント機能みたいなのほしいなぁと思った時にぱっと探しだせなかったので。

http://cells.rubyforge.org/

公式サイトのサンプルをチラ見すればすんなり導入できるはず。
コンポーネント単位でちゃんとキャッシュもできるので便利。

アプリ毎にRails3のバージョンを指定してrails newするスクリプトをつくってみた

まだ Rails 始めたばっかで右も左も分かってないですが、
プロジェクト毎に rails3 のバージョンを変えれるようにしたくて

  • まず一時領域で rails3 自身を Bundler でインストールして
  • ↑でインストールした内容で rails new して
  • 一時領域を削除

みたいなことを毎回するの面倒そうだなと思ってスクリプトをつくってみた。
ついでにテストフレームワークを Test::Unit から RSpec に変更する処理も追加しといた。

#!/bin/sh

prj_path=$1 # プロジェクトルートのパス
prj_name=$2 # rails new で指定するアプリ名
rails_version=$3 # インストールしたい rails のバージョン

tmp_path=$1"/_tmp"
mkdir $tmp_path
cat << EOF > $tmp_path"/Gemfile" 
source :rubygems
gem "rails", "$rails_version"
EOF

# 一時ディレクトリでrailsプロジェクト生成
cd $tmp_path
bundle install --path vendor/bundle
bundle exec rails new $prj_name --skip-bundle -J -T

# 一時生成したrailsプロジェクトと一時生成でつくられたvendor/bundleをプロジェクトルートに移動
echo "mv "$tmp_path"/"$prj_name"/* "$tmp_path"/"$prj_name"/.??* "$prj_path | sh
echo "mv "$tmp_path"/vendor/bundle "$prj_path"/vendor/bundle" | sh
rm -rf $tmp_path

# .bundle/configファイル追加
mkdir -p $prj_path"/.bundle"
cat << EOF > $prj_path"/.bundle/config"
---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
BUNDLE_BIN: bin
EOF

# Gemfileにgem追加
cat << EOF >> $prj_path"/Gemfile"

group :test do
  gem 'rspec-rails'
end
EOF

# 改めて bundle install
cd $prj_path
bundle install

# config/application.rbにtest_frameworkの設定を追加
LF=$(printf '\\\012_')
LF=${LF%_}
sed -i -e 's/version\(.*\)/version\1'"$LF$LF"'    config.generators do |g|'"$LF"'      g.test_framework :rspec'"$LF"'    end/' config/application.rb

使い方は↑のシェルスクリプトrails-starter.sh みたいな感じの名前で保存して下記のように実行するだけです。

$ cd /path/to/working_directory
$ mkdir hoge
$ sh ~/bin/rails-starter.sh /path/to/working_directory/hoge hoge 3.2.12

git svn dcommit する前に差分を確認するためのエイリアス

ローカルでもろもろ作業を終えて git svn dcommit する前にリモートに上げる内容を最終確認したい。
git svn dcommit -n で dry-run しても差分のハッシュ値が出力されるだけでその内容を git diff コマンドに渡さないといけなくてメンドクサイのでエイリアスをつくった。

~/.gitconfig

.gitconfig に以下のエイリアスを追加するだけ

[alias]
    svn-diff = "!f() { git svn dcommit -n | grep diff | awk -F'diff-tree' -v opt=$@ '{print \"git diff \"opt\" \"$2}' | sh; }; f"

使い方

ローカルで git commit して git svn dcommit する前に

$ git svn-diff
diff --git a/foo/index.html b/foo/index.html
index 7c066ed..39b0975 100644
--- a/foo/index.html
+++ b/foo/index.html
@@ -211,6 +211,7 @@
-        変更前の情報
+        変更後の情報

git diff にオプションを渡せるようにしてあるので差分ファイル一覧を見たい時は、

$ git svn-diff --name-status
M       foo/index.html

git-svn で取り残されたリモートブランチを削除するスクリプトをつくった

ローカルは git(git-svn)、サーバ(リモート)は svn な構成で開発している時に、 外でブランチを削除した際にローカルで fetch とかして git branch -r してもリストに出続けてうざい。。
git svn fetch は存在しないブランチの削除まではしてくれないんすね。。

で、いつの間にか削除されたリモートブランチが大量に残ってしまっていちいち確認してチマチマ削除するのが面倒なのでスクリプトをつくってみた。
(実は削除するオプションとかあったらどうしよ。。。)

~/bin/git-svn-br-rm

パスが通ったところに git-svn-br-rm というファイルで下記シェルスクリプトを設置する

#!/bin/sh

repo_url=`git svn info | grep 'URL:' | awk '{print $2}' | perl -pi -e "s/(branches|trunk|tags).*/branches/g"`
svn_list=`svn list $repo_url | awk -F'/' '{print $1}'`;
git_list=`git br -r | grep -v 'trunk\|tags\/'`;

perl -e "@a=qw/ `echo $svn_list` /; @b=qw/ `echo $git_list` /; @diff=grep{!{map{\$_,1}@a}->{\$_}}@b; print join(\"\n\", @diff);" | \
    awk '{print "git branch -D -r "$1"\nrm -rf ./.git/svn/refs/remotes/"$1}'

使い方

$ cd path/to/git-svn-working-directory
$ git svn-br-rm
git branch -D -r dev-Foo-iss1234
rm -rf ./.git/svn/refs/remotes/dev-Foo-iss1234
git branch -D -r dev-Bar-iss777
rm -rf ./.git/svn/refs/remotes/dev-Bar-iss777

ビビりなので実行はせずに削除するコマンドを吐き出すだけです。
dry_run の意味も込めて。。
実行したい時はパイプで sh に渡せば OK

$ git svn-br-rm | sh

※tagsは基本消すことがないので対応してないです;-(

複数の svn リビジョンを git のハッシュ値に変換する git コマンドエイリアス

仕事でローカル開発は git(git-svn)、サーバ(リモート)は svn な構成が多いんですが svn のリビジョン番号でマージ依頼されるので svn のリビジョンを git のハッシュ値に変換するエイリアスをつくってみた。
引数にリビジョンを1つ指定するのがどっかに転がってたのでそれをカスタムして複数指定できるようにしただけですが。

~/.gitconfig

[alias]
    svn-ref = "!f() { ret=''; for rev in $@; do ret=${ret}' '`git log --grep "git-svn-id.*@${rev}" --pretty=%H;`; done; echo $ret; }; f"

使い方

$ cd /path/to/git-working-dir
$ git svn-ref 1234 7777
46f1a0bd5592a2f9244ca321b129902a06b53e03 5bada6ad649e470d86f4ebdbd1d31d5a80390452

git blame じゃなくて git praise を使う

svn は blame のエイリアスで praise が用意されてるのに git は blame オンリー。。
どうにかして git praise できるようにしたいなぁと思ってちょっと悩んだんだけど .gitconfig で praise = blame で独自にエイリアス追加してあげるだけであっさり解決ですね:-)

blame(非難)するよりpraise(賞賛)した方が気持ちよく開発できる!
チーム開発においてはこういうの何気に大事だと思う。

git stash に「気づかない」「忘れてた」を防ぐためにプロンプトで存在有無がわかるようにしてみた

Git で現在利用しているブランチ名をシェルのプロンプトに表示する記事はよく見かけるので設定してあったけど、git stash したのを忘れたままになっていることがちょくちょくあったので同様に stash されている情報もプロンプトに表示するようにしてみた。

設定方法(zshを利用)

~/.zshrc に下記内容を追記するだけ。

function git-prompt {
    local branch stash

    if  "$PWD" =~ '/\.git(/.*)?$' ; then
        return
    fi

    branch=$(basename "`git symbolic-ref HEAD 2> /dev/null`")
    if  -z $branch ; then
        return
    fi

    stash="`git stash list | awk -F':' '{print $1}' | tr '\n' ',' | sed 's/,$//g'`"
    if  -n $stash ; then
        stash=" %{\e[32m%}($stash)%{\e[00m%}"
    fi

    echo "%{\e[35m%}($branch)$stash%{\e[00m%} "
}

# プロンプトが表示されるたびにプロンプト文字列を再評価
setopt prompt_subst

# プロンプトの設定
PROMPT=$'`git-prompt`%{\e[33m%}%~%{\e[00m%}
%{\e[36m%}%n@%m$%{\e[00m%} '

実際に Git 管理下のディレクトリに cd すると

f:id:harunapple:20120215140655p:plain

こんな感じになる。
なんとなーくでつくってみたけど思ってた以上に便利かも!