新しい環境に移行すべく、ruby-1.9.3, rails-3.1.3 で作ったwebアプリをherokuにデプロイしてみたりしています。 いくつか注意点があったのでメモ。

application.css isn't precompiled

手元の環境で動いていても、いざデプロイすると以下のようなエラーが出ることがあります。

   1  ActionView::Template::Error (application.css isn't precompiled):

事前に bundle exec rake assets:precompile してから生成物をgitに含めてデプロイすればいいのですが、自動的に生成して欲しい場合には、 config/environments/production.rb

   1    config.assets.compile = true

を指定します。これで勝手に生成してくれます。

Could not find a JavaScript runtime

これもassetsの生成に関する問題なのですが、jsファイルを生成するにあたって、jsのランタイム環境が必要になります。 これもherokuの環境でやるためには、Gemfile に以下を追加します。

   1  group :production do
   2    gem 'therubyracer-heroku'
   3  end

これでok

posted by Png genki on Thu 1 Dec 2011 at 04:14 with 2 comments

rvmを使ってcapistranoでアプリケーションごとに異なるrubyのバージョンを利用するには、Capfileの先頭に以下のような記述をすればok

   1  $:.unshift(File.expand_path('./lib', ENV['rvm_path']))
   2  require "rvm/capistrano"
   3  set :rvm_ruby_string, '1.9.3'
   4  set :rvm_type,    :user

ついでに ROOT に .rvmrc を追加して中身に

   1  rvm 1.9.3

のようにしておけば cd したときにrubyのバージョンが切り替わって便利です。

posted by Png genki on Sun 20 Nov 2011 at 21:41

結構需要がありそうな割に、決定版的なツールがなんなのかわからなかったのですが、とりあえずこれを使えば目的を果たせます。

使い方:

   1  % gem install magic-commenter
   2  % cd /path/to/root/of/ruby/files
   3  % magic-commenter

あとは自動的にmultibyteキャラクタを含んでいる rbファイルを見つけて マジックコメントを挿入してくれます。

posted by Png genki on Sun 20 Nov 2011 at 16:59

NetGenesis SuperOPT-GFiveを使っているのですが、特定のPCを接続するとIPマスカレードのセッションテーブルがいっぱいになるという問題が発生しており、原因を調べておりました。

という記事があり、webalizerが原因か、と疑ってみましたが、そのPCにはwebalizerは入ってません。 topでプロセスの動きを眺めていると、haproxyが変な動きをしていたのでこれをpurgeしてみると、どうやらビンゴのようでした。 ということで、特に使ってなかったのでhaproxy を削除してsession table full問題は解決。

posted by Png genki on Sat 19 Nov 2011 at 14:52

バックグラウンドジョブの一覧は

   1  % jobs

で得ることができますが、そのままではPIDがわかりません。

   1  % jobs -p

とやると PID を含めた結果が得られます。

posted by Png genki on Wed 26 Oct 2011 at 02:41

前回(uninitialized constant MysqlCompat::MysqlResの対処法参照)はSnow Leopard でしたが、 今回はLionです。 OSのバージョンが変わるたびに問題が起こる気がします。 今回は、以下で回避できるようです。

   1  % install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /path/to/rubygems/gems/mysql-2.8.1/lib/mysql_api.bundle

See Also

posted by Png genki on Wed 31 Aug 2011 at 03:51

ブラウザのタブを閉じるときは基本的に中ボタンクリックなので、閉じるボタンの存在は無駄なだけでなく、うっかり押してしまって必要なタブを閉じてしまうこともあって邪魔でした。

そんな場合には、about:config で以下のように値を設定すると、閉じるボタンを非表示にすることができます。

   1  browser.tabs.closeButtons = 2

posted by Png genki on Fri 19 Aug 2011 at 09:24

普段はPostgresqlのサイトで配布されているMac用のインストーラを使っているのですが、どうやらLionはまだサポートされていないようです。

ということで、homebrewを使ってインストールすることにしました。

Homebrewをインストール

以下を実行すればok

   1  /usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"

あとは

   1  brew install postgresql

でインストールし、以下でdbを初期化します。

   1  initdb /usr/local/var/postgres

最後に、自動起動の設定を行います。

   1  cp /usr/local/Cellar/postgresql/9.0.4/org.postgresql.postgres.plist ~/Library/LaunchAgents/
   2  launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist

brewでインストールした場合、postgresユーザは作成されないようです。 $USERがスーパユーザとして作成されます。

posted by Png genki on Thu 18 Aug 2011 at 18:04

開発環境でしか使っていないので我慢してきたのですが、 どうも MacOS 10.6.8 における Socket.getaddrinfo の挙動が不安定なようです。 以下のように、タイミングによって動作したりしなかったりします。

   1  ruby-1.8.7-p302 :012 > Socket.getaddrinfo("localhost", nil)
   2  SocketError: getaddrinfo: nodename nor servname provided, or not known
   3          from (irb):12:in `getaddrinfo'
   4          from (irb):12
   5  ruby-1.8.7-p302 :013 > Socket.getaddrinfo("localhost", nil)
   6   => [["AF_INET", 0, "en.localhost", "127.0.0.1", 2, 2, 17], ["AF_INET", 0, "en.localhost", "127.0.0.1", 2, 1, 6], ["AF_INET6", 0, "localhost", "::1", 30, 2, 17], ["AF_INET6", 0, "localhost", "::1", 30, 1, 6]] 

MacOS環境でのSocket.getaddrinfoは鬼門なようで、 これまでにも様々な問題が報告されているようですね。

今回は全く同じ条件下で挙動が変わるというものなので、なかなか手ごわい感じです。

posted by Png genki on Sun 7 Aug 2011 at 14:22

Rubyを使い初めてから結構たちますが、まだ新しい発見というのはあるものですね。

class_evalでブロックを渡す時に、引数も渡したいと思っていたのですが、 class_execはちょうどその目的に使えるようです。

   1  FOO = lambda{|bar| puts bar}
   2  
   3  class Foo
   4    class_exec("Foo", &FOO)
   5  end #=> Foo

posted by Png genki on Sat 6 Aug 2011 at 19:28