Mac+rbenvでconfigure: error: something wrong with LDFLAGS=”…”とか言われた時のいち解法

今日は多摩川花火大会をやっていまして、今まさに自室の窓の外から花火が見え音が聞こえる中こんなブログ記事を書いています。ダイナマイト漁で捕獲でもされている気分です。

さて、El Capitanでrbenvを使っていて、rbenv installをしようとしたときこんなかんじのエラーが出てちょっとハマりました。

% rbenv install 2.2.3
Downloading ruby-2.2.3.tar.bz2...
 -> https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.bz2
Installing ruby-2.2.3...

BUILD FAILED (OS X 10.11.6 using ruby-build 20160602-31-gf085feb)
...
checking whether LDFLAGS is valid... no
configure: error: something wrong with LDFLAGS="-L/Users/(myname)/.rbenv/versions/2.2.3/lib "
make: *** No targets specified and no makefile found.  Stop.

このエラーはいろんな状況で起こるようです。autoconfのログを見てもよくわかりませんでした。
ググってみると、やれrbenvプラグインのruby-buildが古いだの、やれ特定バージョンのrubyで起こるだの、gccを消せだの、brew doctorしろだの、手動ビルドしろだの…などなど、さまざまな原因でこの現象が起こるようですが、
僕の場合はLIBRARY_PATH環境変数に書いてあったディレクトリが実在しなかったことが原因でした。

つまり、

LIBRARY_PATH=/usr/local/lib:/usr/lib:/lib

だったのですが、僕の使用するEl Capitan機に/libというディレクトリは存在しなくて、それが結局rbenv installのエラーを引き起こしていました。
なので、環境変数から/libを除くか、/libをmkdirすると、rbenvのビルドは死ななくなりました。
エラーメッセージ自体からはそのことを直接は読み取れなかったので、ハマりました。

ご参考までに。

【灰色魔術】Rails.loggerと独自Loggerのログレベルを同じにさせたかった

お魚といえば安いものから高いものまでピンきりですが、上はどこまでいくんでしょうか。魚ですよ!値段順で調べるで見ると、マグロなどが高いのはやはり用意に想像がつくところですが、キログラム単価で見た時には特にウニやかずのこなど量が取れないものがぶっちぎってるんですね。

さて、RailsのLoggerでは、ログレベル、すなわちどのレベルのログまでがログファイルに保存されるかを指定することができます。

Rails.logger.level = :info

この辺りは既に十分いろんなわかりやすい説明があるのでそのあたりをご参照いただくとして。
Debugging Rails Applications — Ruby on Rails Guides

一方で、独自ライブラリ等でRailsと独立のロガーを持っている場合、すなわちRails.loggerと別にLoggerのインスタンスを持っていて、そいつのログレベルを設定するときには、小文字シンボル:infoや:warnでは設定できません。
Loggerクラスに定義されている定数Logger::INFOやLogger::WARNを指定する必要があります。

$logger = Logger.new(STDOUT)
$logger.level = Logger::INFO

では、Railsでアプリを書いていてなおかつそのログレベルを環境変数等で指定可能にしたいが、その際にそういった独自Loggerのログレベルも一致させたい場合はどうすれば。
ちょっと何を言っているかわかりにくいでしょうが、下記のコードのようなことです。

log_level = (ENV['LOG_LEVEL'] || :info).to_sym
Rails.logger.level = log_level.downcase
$logger = Logger.new
$logger.level = Logger.const_get(log_level.upcase)

Rails.logger.levelにつっこむシンボルを使って強引にLoggerクラスの定数をRubyのClassに実装されているconst_getを使って動的にひっぱってくる…というような方法をとっています。
黒魔術的というほどではないですが少し灰色なかんじ。

このようにすれば、Railsのloggerのログレベルと独自Loggerのログレベルを一度で同時に指定できるようになります。
例えば

% LOG_LEVEL=Debug rails c
> Rails.logger.level
:debug
> $logger.level
0
# ↑ Logger::DEBUGの値

そもそもRails.logger.levelも:infoなどのシンボルではなくLogger::DEBUG(=0)など数値で指定することもできるのですが、
その場合もこの技法を活用すればユーザ指定時(シェルから%LOG_LEVEL=WARN rails cする場合)などでは文字列で書けるので便利と言えそうです。

指定されたLOG_LEVELの文字列自体が正しくない(例えば%LOG_LEVEL=DEBUUUG rails cなどと書いてしまった)場合も、const_getが例外を吐いてくれるというチェック機構が自動で働くことになるので、直接数値を指定可能にする(で数値の範囲を独自でチェックするロジックを書く)よりもラクで安全という面もあるかもしれません。

ログの収集や活用・分析などなど(fluentdとか)についてはまた備忘録がてらにまとめたいところもありますが、またの機会に。

Railsログ中の”Rendered xxxx.html.erb”を静かにさせたかった

お魚の可食部の重量に占める割合というのは、もちろん種類によって変わってくるのですが、しらすなどではもちろん100%、一方でスズキなどでは40%程度と低いようです。ただしらすは稚魚ですので、成魚と比べるのは厳しい判定かも。
さて、Rails(Rack)がGETリクエストひとつに対して吐いてくれるアクセスログは、下記のような雰囲気になります。
このうち、xxxx.html.erbをレンダリングしたよ!という情報は特に本番ではあまり必要でないことが(自分の状況では)多いので、これを静かにしてしまいたくなりました。

[2016-08-02T15:58:51](pid: 23067) INFO  -- Started GET "/" for 127.0.0.1 at 2016-08-02 15:58:51 +0900
[2016-08-02T15:58:51](pid: 23067) INFO  -- Processing by HomeController#index as HTML
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered home/_user_objects.html.erb (5.9ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered home/index.html.erb within layouts/application (11.4ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_navbar.html.erb (173.5ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_image_box.html.erb (0.3ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_image_box.html.erb (1.2ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_image_box.html.erb (0.9ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_image_box.html.erb (0.8ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_image_box.html.erb (1.0ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_header.html.erb (175.5ms)
[2016-08-02T15:58:52](pid: 23067) INFO  --   Rendered application/_footer.html.erb (0.5ms)
[2016-08-02T15:58:52](pid: 23067) INFO  -- Completed 200 OK in 650ms (Views: 52.1ms | ActiveRecord: 10.0ms)

コチョナナバ: railsの部分テンプレートのログ出力を出さなくする
Hide rendering of partials from rails logs – Stack Overflow
このあたりを参考にして、

# config/environments/production.rb
MyApplication::Application.configure do
  ...
  # Not to show logs like Rendered xxxx.html.erb
  config.action_view.logger = nil
  ...
end

のように設定すると、このrenderingのログだけがいいかんじに静かになってくれます。

[2016-08-03T16:44:20](pid: 5973) INFO  -- Started GET "/" for 127.0.0.1 at 2016-08-03 16:44:20 +0900
[2016-08-03T16:44:20](pid: 5973) INFO  -- Processing by HomeController#index as HTML
[2016-08-03T16:44:21](pid: 5973) INFO  -- Completed 200 OK in 724ms (Views: 53.9ms | ActiveRecord: 9.4ms)

大変Informativeでよろしい。
以上、最初から最後まで完全に備忘録でした。