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)
アプリ毎に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 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 すると
こんな感じになる。
なんとなーくでつくってみたけど思ってた以上に便利かも!