Jenkinsによるビルドテストにおいて、リソースを制限した状態でRubyスクリプトを実行する必要が生じた。

Ruby自身にはリソースの制限を行う機能がないので(setrlimitをラップした拡張ライブラリはないかな?)、何らかの方法でリソース制限を行ったのちにスクリプトを起動しなければならない。

もちろんビルドスクリプトに

ulimit ...
ruby -e '...'

と書いてもよいのだが、Rubyスクリプト部が複雑化するとクォート地獄に落ちるのが必至なので、以前書いた -x オプションを使った。

ulimit ...
exec ruby -x "$0" "$@"
#! ruby
...

exec 後の ruby には -x が与えてあるので #! ruby までの部分を無視してくれる。これでシェルレベルでリソースのお膳立てをしてから ruby インタプリタを起動出来る。

Ruby技術者認定試験制度のGoldを受けて来た。

当初は無勉強で受験するつもりだったが、金もかかっているので、事前にITトレメ試験問題をやっておいた。2010年末から、3ヶ月くらいで内容一巡の周期で、平日に1問ずつ出題されている。振り返るに、一巡分を全問正答できれば7割程度の点は取れるのではないかと思う。

結果は84点で合格。ただし、Silverを受験したことがないので、Ruby Association Certified Ruby Programmer Goldの認定とはならないはず。

※Ruby Association Certified Ruby Programmer Gold認定要件:Ruby技術者認定試験の「Silver(RY0-100)試験」と「Gold(RY0-200)試験」の2試験に合格するとRuby Association Certified Ruby Programmer Goldに認定されます。受験する順番はどちらからでも構いません。

試験は、申し込み時に選んだ会場に赴き、会場のPCを使って受験する。時間は90分。30分もあれば一通りの問題(50問)を見られるので、残り時間である程度見直し(回答時に問題にチェックを入れて、一覧時に目立たせる機能もある)たあと、終了。その後のアンケートへの回答(3乃至5分程度)を終えると合否が表示される。

  • クラス変数(クラスのインスタンス変数ではなく)
  • 定数の探索
  • トップレベルの正体(Kernel, Object, main)
  • 多重代入
  • 特異クラス

あたりの理解に、曖昧なまま放置してある箇所があることが分かったのが収穫。

普段の実用第一の立場では、これを知っていることを評価されても意味がないな、と考えてしまう問題もあったし、1割くらいは、普通リファレンスかirbだよね、といういわゆる暗記物もあったのだが、大多数の問題は、的確に弱点を突かれて自覚することができる良問揃いだったと思う。

なお、あくまで言語としてのRubyの理解を問う試験なので、アルゴリズムだのデザインパターンだのの素養は合格の助けにはならない。

あわせて読みたい: Rails Hub情報局: Ruby技術者認定試験シルバーを受けてみた

今年になってから、再びrvmの利用を始めた。最近のrvmは、 cd 後に走るフックを定義できるようなので、何度も試みている bundle exec 付きコマンド実行の省力化に挑戦する。

とは言っても、そのへんはrvm側でも意識するようになっていて、安定版にも after_cd_bundler というフックスクリプトが用意されている。このスクリプトは、bundle コマンドを --binstubs オプション付きで実行することを前提としていて、 PATH の先頭にスタブをインストールしたディレクトリを追加したり取り除いたりするという動作になっている。

最近は--binstubsを使っていないので、代わりにこんなスクリプトを書いてみた。


#!/bin/zsh

if [[ Gemfile.lock -nt Gemfile ]]; then
  for bin in $(ruby -rbundler/setup -e 'Bundler.setup' -e 'puts $:.map{|d| Dir["#{d}/../bin/*"] }.flatten.map{|f| File.basename(f)}'); do
    [[ $bin = bundle ]] || alias $bin='bundle exec '$bin
  done
else
  for alias in $(alias | sed -n -e "s/='bundle exec .*'//p"); do
    unalias "$alias"
  done
fi

※ 先頭のsh-bangはエディタにzshを認識させるもので、直接実行するわけではない。

Gemfile.lockとGemfileが両方存在して、Gemfile.lockのほうが新しい場合に、Bundler環境下で利用可能となるbinディレクトリの下のコマンドを拾い出し、bundle exec付きのエイリアスを作っている。逆に条件を満たさなければbundle exec付きの定義になっているエイリアスを一通り削除。

親ディレクトリにGemfileがある場合も考慮すべきじゃないかと思いはするが、とりあえず現在の仕様でしばらく使ってみよう。