2014/04/28

ほとんど誰の役にも立たない Rails 4.1 での変更点

Book.where(category: 'comics')
こんなコードを書いた場合、Rails 4.0 まではこんなログが出力されていました。
Book Load (0.1ms)  SELECT "books".* FROM "books" WHERE "books"."category" = 'comics'
でも Rails 4.1 ではこんなログが出力されます。
Book Load (0.1ms)  SELECT "books".* FROM "books"  WHERE "books"."category" = 'comics'
WHERE の前の半角スペースが 1 つ増えてます。
おかげで rails-flog のテストが Rails 4.1 でコケる。
さて、直そう

rbenv で ruby がインストールできなくなった

おもむろに最新パッチレベルとそろそろruby2.1.1を入れようと思って、

CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl` --with-gcc=clang" rbenv install 2.0.0-p451
を叩いたらエラーでインストールできなかった。
エラーログを見てみると下記のようなエラーメッセージが出ていたので、どうやら readline 関連でエラーが出ているらしい。
readline.c:1886:26: error: use of undeclared identifier 'Function'
    rl_pre_input_hook = (Function *)readline_pre_input_hook;
                         ^
readline.c:1886:36: error: expected expression
    rl_pre_input_hook = (Function *)readline_pre_input_hook;

調べてみると、どうやら readline が 6.3 になって rbenv でインストールしようとしたらエラーになるということらしい。
参考:MacでRuby 2.x.xがインストールできないバグ (homebrew + rbenv) - Qiita
readline を以前のバージョンに戻せばインストールできるとのことなので、

pinzolo@ileach % brew info readline
readline: stable 6.3.3 (bottled) http://tiswww.case.edu/php/chet/readline/rltop.html This formula is keg-only. OS X provides the BSD libedit library, which shadows libreadline. In order to prevent conflicts when programs look for libreadline we are defaulting this GNU Readline installation to keg-only. /usr/local/Cellar/readline/6.2.2 (30 files, 1.6M) /usr/local/Cellar/readline/6.2.4 (30 files, 1.6M) /usr/local/Cellar/readline/6.3.3 (40 files, 2.1M) * Poured from bottle From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/readline.rb
6.2.4 が入っていることを確認して、
pinzolo@ileach % brew switch readline 6.2.4
Cleaning /usr/local/Cellar/readline/6.2.2 Cleaning /usr/local/Cellar/readline/6.2.4 Cleaning /usr/local/Cellar/readline/6.3.3 Opt link created for /usr/local/Cellar/readline/6.2.4
readline を切り替えて再度インストールしたら無事インストールできた。

2014/04/13

Redmine がついに Markdown をサポートしたようだ

Redmine.org の issue を眺めていると Feature #15520: Markdown formatting - Redmine が上に上がっていた。
この要望は定期的にあがるよなーと思って読んでいると、なんととうとうサポートしたとのこと。 2.5.0 - Redmineを見ると、確かに 2.5.0 で追加されてる。
Github, Gist, Qiita, はてなブログ, wri.pe などなど Markdown はエンジニアのメモ記法のデファクトスタンダードになっているので、これは嬉しいニュース。待ち望んでいた人も多いのでは。

設定

確かに experimental となっていますが、Markdown が選択できるようになってます。
プロジェクト単位ではなく、Redmine全体での選択になるけど、もともと書式選択が全体なのは従来の仕様なのでこれはしかたない。

試してみた

早速こんな markdown で wiki を書いてみた。 これがこんなふうになる。
内部では Redcarpet 2.3 を使用しているので当然ながら GFM なシンタックスハイライトまでサポートされているのは嬉しい。

周辺サポート

experimental ながらしっかり周辺もサポートされてて、markdown を選んだ場合には wiki 用のツールバーも markdown 用になっており、各ボタンを押すと markdown に対応した書式を追加してくれる。
ちなみに下記の場所で Markdown が使えているのを確認済み。ほぼ漏れ無く対応されている感じ。
  • Wiki
  • 文書
  • プロジェクトの概要
  • チケットの説明
  • チケットの履歴の注記

残念なところも

ちなみに事前に textile でこんな文書を書いておいて、設定変更後に確認してみるとこうなる。
残念ながら書式は保存されないようです。
textile に設定を戻すと、markdown で書いた文書も textile で解釈された見れたもんじゃない文書になってしまう。
つまり現時点で markdown を使おうと思えば、過去の資産を全て捨てる、もしくは書き換えるしかないということになりますね。
残念だけど正式サポートの頃にはなんとかなるんだろうか?書いた時の書式を保存するとか。

markdown のサポートは現時点で experimental なのでこれから進化していくと思うとドキドキですね。

2014/04/12

Rubyのアップデートがちゃんとできていなくて、Redmineをアップデートできなかった

さくらのVPSで使用している Redmine を最新にしようと思い立った。

% cd work
% wget http://www.redmine.org/releases/redmine-2.5.1.tar.gz
% tar xf redmine-2.5.1.tar.gz
% mv redmine-2.5.1 /etc/lib/rails
% cd /etc/lib/rails/redmine-2.5.1
% cp ../redmine/config/database.yml config/
% cp ../redmine/config/configuration.yml config/
% bundle install --path vendor/bundle
% bundle exec rake generate_secret_token

ここまで順調に来たが、ここでエラー。

Could not find rake-10.1.1 in any of the sources
なぜか、bundler から bundler で今しがたインストールしたはずの gem が参照できないらしい。
調べてみると、どうやら bundler が実行時に参照するのは vendor/bundle/ruby/2.0.0 以下、しかしインストール時にインストールしていたのは vendor/bundle/ruby/1.9.1 以下というちぐはぐな状態になっていた。

思い当たることは、ruby を 2.0.0 にアップデートしたこと。
「今の Redmine をインストールした → ruby 2.0.0 をインストール → 今回」なので今までの Redmine は問題なく動いていたんだろうな
しかも ruby 2.0.0 をインストールした時、手順を間違えて ruby 1.9.3 の実行ファイルを正しく更新できていなかったようだ。
つまり、gem は ruby 1.9.3 の頃のものが動いていて bundler によるインストールは 1.9.1 以下に配置するが、実行時は ruby 2.0.0 で動いているので 2.0.0 以下を参照しようとしていたということだな。

というわけなので、rubyの最新版からちゃんとインストールし直すことにした。

% wget http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p451.tar.gz
% tar xf ruby-2.0.0-p451.tar.gz
% cd ruby-2.0.0-p451
% ./configure --prefix=/usr/local/ruby-2.0.0-p451
% make
% make install
% rm /usr/bin/erb
% rm /usr/bin/gem
% rm /usr/bin/irb
% rm /usr/bin/rake
% rm /usr/bin/rdoc
% rm /usr/bin/ri
% rm /usr/bin/ruby
% rm /usr/bin/testrb
% ln -s /usr/local/ruby-2.0.0-p451/bin/* /usr/bin/

手順をミスった ruby-2.0.0-p353 が動かないように変更

% mv /usr/local/bin/erb{,.bak}
% mv /usr/local/bin/gem{,.bak}
% mv /usr/local/bin/irb{,.bak}
% mv /usr/local/bin/rake{,.bak}
% mv /usr/local/bin/rdoc{,.bak}
% mv /usr/local/bin/ri{,.bak}
% mv /usr/local/bin/ruby{,.bak}
% mv /usr/local/bin/testrb{,.bak}

bundler をインストール

% gem install bundler
% ln -s /usr/local/ruby-2.0.0-p451/bin/bundle /usr/bin/

passenger の最新をインストールして変更

% gem install passenger
% cd /usr/local/ruby-2.0.0-p451
% ./bin/passenger-install-apache2-module

# /etc/apache2/mods-available/passenger.load を下記に変更
LoadModule passenger_module /usr/local/ruby-2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41/buildout/apache2/mod_passenger.so

# /etc/apache2/mods-available/passenger.conf を下記に変更
PassengerRoot /usr/local/ruby-2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41
PassengerDefaultRuby /usr/bin/ruby

redmine-2.5.1 のインストールのやり直し

# 同じなので省略
% bundle install --path vendor/bundle
% bundle exec rake generate_secret_token
% bundle exec rake db:migrate RAILS_ENV=production
% bundle exec rake tmp:cache:clear RAILS_ENV=production
% bundle exec rake tmp:sessions:clear RAILS_ENV=production
% mkdir public/plugin_assets
% cd ../
% chown -R www-data:www-data redmine-2.5.1
% ln -s /var/lib/rails/redmine-2.5.1 /var/lib/rails/redmine
% service apache2 restart

ちゃんと表示されて一安心