| @技術/プログラミング

Unicorn の設定をミスって(たと思ってけど実はそうじゃなかった)ポータルシットが12月の半ば頃から死んだままになってた。きっかけは Capistrano の導入で、仕事で Capistrano 使っていて大変便利なので、これをポータルシットでも使おうとした。

Unicorn で便利なのが、 kill -USR2 `cat tmp/pids/unicorn.pid` とかやることで、ダウンタイム無しに Rails アプリケーションを再起動できるとこだ。これを Sinatra 製の Lokka でも実現したかった。Capistrano と併せて運用することで、サーバーに SSH で接続せずとも

$ bundle exec cap deploy:restart

とかで Lokka を再起動できるようになる。

これまで Lokka の database.yml に DB への接続情報をべた書きしていたのをやめ、起動時にはシェルで以下のコマンドを実行するようにした。

$ env DATABASE_URL=path/to/db bundle exec unicorn -c config/unicorn.rb -D -E production

Capistrano の deploy.rb に書くと以下のようになる。

namespace :deploy do
  task :start do
    run "cd #{current_path}; env DATABASE_URL=#{db_path} bundle exec unicorn -c config/unicorn.rb -D -E production"
  end
end

| @技術/プログラミング

Railsで画面を作っていて、DBを参照せずにselect -> option なHTML(ドロップダウンリスト)を出力したいと思った。DBに入ってない値をドロップダウンリストとして表示する方法。ググったらこういうやり方がヒットした。

このやりが方がかっちょいいのかバッドノウハウなのか判別つかないけど、モデルに定数を書いてそこにいろいろ入れてしまうらしい。以下のような感じ。

class Event < ActiveRecord::Base
  DAYS = ['Monday', 'Tuesday', 'Wednesday', ...]
end

でこれをモデルから参照するときは以下のようにする。

<%= select(:event, :day, Event::DAYS) %>

これでうまいことドロップダウンリストを表示できる。

ところが一点問題があって、このドロップダウンリストで表示したい値が "(ダブルクオーテーション)を含んでいたとする。ダブルクオーテーションはRailsによって自動的にエスケープ処理されてしまうので、 " と表示させたいのに &quot; とか表示されてしまう。Form系のヘルパーメソッドで text_area_tag なら :escape => false とか出来るんだけど、select でそれをやるのは不可能だった。

Railsで文字列のエスケープをせずに出力する方法は一般的に

<%= raw("文字列") %>

とか

<%= "文字列".html_safe %>

だけど、「まさかそれをモデルの中でやっちゃってもエラー出るよね?」と思いながらやってみたらちゃんとエスケープせずにHTMLを出力できた。

モデルクラスのなかにヘルパーメソッドを書くのは気持ち悪いと思うけど、それ以外ではビューの中でイテレータを書いて一個一個エスケープしない処理を書くか、独自のヘルパーメソッドを書くしかない。なんかまどろっこしい気がするのでとりあえずこのやり方で行ってみることにします。

| @技術/プログラミング

Git flow を導入して仕事してる。master ブランチと develop ブランチをベースに、 feature ブランチ、hotfix ブランチ、release ブランチをつくって色々やるあれ。確かに便利何だけどだるいところもある。

hotfix ブランチのバージョン番号

たとえば誰か(A さんとしよう)がバグを見つけて hotfix を start したとする。hotfix 用のタグを 1.0.1 としよう。

$ git flow hotfix start 1.0.1

ここで別の誰か(B さんとしよう)が他のバグを見つけたとする。このとき B さんは A さんがローカル環境で 1.0.1 のタグを既に使っていることを知らない。ので当然 $ git flow hotfix start 1.0.1 してしまう。そんで B さんが

| @技術/プログラミング
本当は tech.portalshit.net に書くべきネタなのかもしんないけど jekyll 動かすのだるいのでここに書きます。

Node.jsをMacにインストールしてたんだけど(何にも使ってなくてただインストールしてただけ)、NodeがVersion 0.5くらいになってからインストールに失敗するようになった。gcc関連のエラーが出てるっぽい。なんかXcode 4.2が悪いとかネットを検索すると出てくるので、削除してosx-gcc-installer入れたりしたけど結局変わらずだった。Xcodeのバージョンを落として4.1にしてみたりもしたけど効果がなかった。

OS入れ直すしかないかなー、めんどくさいなーと思っていたところ、 `brew doctor` したときの画面を見てたら、「homebrewで入れたopensslとreadlineにシンボリックリンクがはってあってPATHが通ってるから消しとけや」みたいな警告が出た。readlineやopensslはRubyを自分でインストールするときに必要なので入れてた。まさか関係あるとは思っていなかったので `brew doctor` したときに出るこの辺の警告は無視してたんだけど、警告に従って `brew unlink readline; brew unlike openssl` してみたらすんなりNode.jsがインストールできた。

というわけでして、homebrewで入れたreadlineとかopensslを /usr/local 以下にシンボリックリンクするとインストールに失敗するソフトもあるようですので、皆様におかれましてはご注意下さい。

| @技術/プログラミング

2011年はてなインターンであらせられるuasiさんのはてなブログに解決方法が書いてありました。

MacVimが悪いんじゃなくてtmuxに原因があったみたい。tmuxごしにVimを起動すると、MacVimでなくて普通のVimでもコピペができなくなる不具合があったようです。しかしChrisJohnsen/tmux-MacOSX-pasteboard - GitHubをインストールすることで解決します。tmuxだけでなくGNU Screen + Vimの組み合わせでも同様の問題が解決するそうです。お困りの方はお試し下さい。

| @技術/プログラミング

Railsで建物名みたいなカラムに building ってのを当ててたら

ActionView::Template::Error (no block given (yield)):

みたいなエラーが出るんですけど、Railsで building って予約語なんですかね。

なんか Rails Wiki のReserved Words You Can’t Use は真っ白だし、古い方のWikiの予約語一覧 にも building は入ってないし。

とりあえず複数形にして対応したけど気持ち悪い。

追記

どうやらMongoidに起因するエラーのようです。

| @技術/プログラミング

MacVimでコピペできなくて(MacVim内のヤンクじゃなくて、他のアプリケーションでコピーしたもののペースト)困ってたんだけど(MacVimでコピペできないんですけど… | tech.portalshit.net)、できるようになりました。原因は mvim っていう、コマンドラインからMacVimを起動するためのシェルスクリプトだった。MacVim kaoriyaのWikiで紹介されてるやつ。

こいつ経由でMacVimを起動したときはどうも他のアプリケーションからのコピペがうまくいかないみたい。

同じくMacVim Kaoriya Wikiで紹介されている、MacVimを起動するコマンドをaliasで化したものを .zshrc に書いたところうまくコピペが機能した。

alias gvim='env LANG=ja_JP.UTF-8 open -a /Applications/MacVim.app "$@"'

同じ問題でお困りの方はお試しあれ。

追記

なんか違うっぽい。alias経由で呼び出してもダメなときはダメだもん。いったい何なんすかね。