HerokuでBambooStackからCedarStackに移行する
Herokuでずっと更新していないアプリをruby2.0に上げようとしたのだが、Gemfileに「ruby "2.0"」と書いてもpushするとbundle installでエラーが出る。調べてみると過去にHeorkuで作ったアプリはBambooStack上で動いていて、使用出来るRubyのバージョンが古いなどなどが原因だった。
なので、Ruby2.0を使えるCedarStackに移行しようと思ったのだがBambooStackからCedarStackへの移行ツールなどは用意されておらず、CedarStackにするには新しくアプリを作るしかなかった。旧アプリ→新アプリへのデータ移行作業をすればいいかと考えたのだけど、BambooStackで作ったアプリのURLは「http://appname.heroku.com/」だったものがCedarStackだと「http://appname.herokuapp.com/」で作られるらしい。独自ドメインを設定していないので、URLが変わってしまう。これでは移行できない・・・と思ったが、アプリ名さえ同じであればheroku.comもherokuapp.comと同じIPを指してくれるので問題は無し。
というわけでまずDBのバックアップ。
bundle exec heroku db:pull sqlite://db/production.sqlite3 --app appname
ここで自分の環境ではエラーが出た。このエントリーを書いている時点ではRuby1.9.3以降でsqlite形式にデータを変換する時にバグがあるらしく、Ruby1.9.2以前のバージンでエクスポートしなくてはならない。(Macで開発している場合は「brew install apple-gcc42」でRuby1.9.2をコンパイルできるようになります。)
そして現在使っているHerokuドメイン"appname"をブラウザから別名にリネーム*1し、今まで使っていた"appname"でアプリを再作成します。
heroku create appname --stack cedar # アプリ削除からこのコマンド実行までに"appname"を取られたら作れなくなるので急いで作る
そしてバックアップしたDBを新アプリにインポート。
bundle exec appname db:push sqlite://db/production.sqlite3 --app appname
これでアクセスしてみて動作確認がとれれば旧アプリは削除してしまってOK。
ちょっと面倒ですね。ブラウザからクリックひとつでStackを移行できるツールがあったらいいのに。
*1:コマンドでもできます
RubyHiroba 2013年に行ってきた
RubyHieroba2013に行って来ました。
相変わらず意識のRubyistばかりでいい刺激になって良かった。
今回特に興味を持ったのはTwilioですかね。いじってみたい。まだ何を作るかは思いつかないけど、色々と使い道がありそう。
ずっとLTのブースにいたんですが、そろそろ自分もLTぐらいはやった方がいいかなと思った。まずはネタを考えないとだけど。
入門Chef Solo補足メモ
入門Chef Solo - Infrastructure as Code
- 作者: 伊藤直也
- 出版社/メーカー: 伊藤直也
- 発売日: 2013/03/11
- メディア: Kindle版
- 購入: 16人 クリック: 1,027回
- この商品を含むブログ (12件) を見る
そろそろChefでも覚えるかって時に伊藤直也さんが「入門Chef solo」を出版されたので購入しました。
Chefを覚えようとして最初の段階でハマッて諦める人が多いみたいですね。僕はいきなり本書を読みながら進めていったので殆ど止まること無く覚えられましたが、Chefのマニュアルを見た印象では確かにいきなり詳細過ぎる解説を見せられても分かりにくいかなー、と感じました。たったの890円だし、Chefをこれから覚えたい人は買って損は無いと思います。
補足
knife-soloの最新版インストール時の解説で、git cloneしてrake installと書かれていましたが、自分の環境ではjsonが入らずにエラーになりました。gem update --systemを実行し、gem installでオプションの--preをつければ0.3.0が入ります。
$ gem update --system $ gem install knife-solo --pre
knife solo init実行時にuninitialized constant KnifeSolo::Pathname (NameError)が発生しました。knife-soloのインストール先のknife-solo.rbでrequire 'pathname'を追記して下さい。例えばrbenvを使っている環境なら以下のファイルになります。
# require 'pathname' を追加 ~/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/knife-solo-0.3.0.pre3/lib/knife-solo.rb
RSpecでshouldからexpectへ移行する時に困ったこと
RSpecのExpectationsでshouldが非推奨となり、expectが推奨になったわけですが、expectで書くかと思った時に困ることがあった。例えば、
subject { User.new } its(:login_id) { should be_nil }
のようなコードを書きたくてもshouldが無いと書けないのでは?と思ってたわけです。
これが書けないってなるとまだshouldで様子見かと判断していたのですが、
実はこのケースについてはconfigでshouldをdisabledにしてもサポートされていました。
ちょっと安心。shouldを使える場所はshouldを使い続けて、書かざるを得ない部分だけexpectを使えばもしshould継続!って展開になっても対応は最小限で済むはず。
しかし、shouldが使えないとなるとコードをパッと見て「expectを使っているところは更新処理」だと判断しにくくなる点が不満ではあるなぁ。
undefined method `mtime' for nil:NilClass(i18n-js)
RailsでJavaScriptの国際化をするライブラリは今のところi18n-jsが有名です。
暫く使っていなかったのだけど、久しぶりに使う機会がきたのでgithubを見てみたら便利になってた。なんとassetsを有効にしている環境なら以下の2行を追加するだけで動いてくれるらしい。
//= require i18n //= require i18n/translations
早速やってみた(Rails3.2.12)ら「undefined method `mtime' for nil:NilClass」というエラーが発生。調べてみると"rake i18n:js:setup"でconfigファイルを作ってやれば動くとのこと。
・・で、configファイルを作ったら無事動きました。ちなみにtranslations fileを指定したりする必要は無いようです。前回使った時はtranslations fileがgrepの時にひっかかりまくってうざかったんですよね。それが無くなるだけでかなり快適。
Rails + Sass + Compass環境でTwitterBootstrapのvariablesを変更する
【注意】この情報古いっす。bootstrap-sassのgithub見てください。もっと簡単にできます。
bootstrapの公式サイトには Customize variablesというページがあって、これを変更する事によって色などを変更したbootstrapをダウンロードできます。これをRailsで変更したいという時にどうするか。
環境は、Railsが3.1.12で、gemは bootstrap-sass, compass-railsを使用しているものとします。
bootstrap-sassではこのファイルで全てのvariablesが宣言されているので、これを上書きしえてしまえばいいわけです。
ファイル構成
以下の様な構成でファイルを作成します。
app/assets/stylesheets/ ├── application.css.scss ├── bootstrap │ └── _variables.scss # variablesを定義する場所 ├── bootstrap_load.css.scss # bootstrap読み込み用 └── layout.css.scss # 独自の定義など
各ファイルの内容
app/assets/stylesheets/bootstrap/_variables.scss
$tableBackground: #fff; // 例えば@tableBackgroundを上書きしたいならこんな感じ。
app/assets/stylesheets/application.css.scss
@import "compass";
app/assets/stylesheets/bootstrap_load.css.scss
@import "bootstrap/variables"; // _variables.scssで変数を上書きしている @import "bootstrap"; @import "bootstrap-responsive";
app/assets/stylesheets/layout.css.scss
// 独自に定義したスタイルを書く
大体こんな感じ。app/assets/stylesheets/bootstrap/_variables.scssはsass-railsと同じディレクトリ構成にしておいた方が分かりやすくていいかなと思ってこうやってます。bootstrap-sassが推奨のテンプレをgenerateしてくれるといいんだけどなあ。
Haml 4.0 has been released!!
Haml4.0でた。
http://blog.haml.info/post/42998475354/haml-4-0-has-been-released
CHANGELOGはしっかり読んでないけど、一個だけサンプルコードが書いてあって、これは個人的に嬉しかったな。
Haml now flattens deeply nested data attribute hashes. For example: .foo{:data => {:a => "b", :c => {:d => "e", :f => "g"}}} would render to: <div class='foo' data-a='b' data-c-d='e' data-c-f='g'></div>
いい。