RubyのオンラインリファレンスのURLが移動
Rubyのリファレンスを参照するときは、いつもGoogleで検索していたのですが、なぜか検索結果からのリンクがリンク切れに。 昔のリファレンスは
- http://www
.ruby-lang .org/ja/ma n/html/*
にあったのですが、以下のように新しいURLに移動したようです。
旧版は以下に移動した模様。
検索インデックスが新しくなるようにGoogle botに頑張って欲しいです。
See Also
Rubyのリファレンスを参照するときは、いつもGoogleで検索していたのですが、なぜか検索結果からのリンクがリンク切れに。 昔のリファレンスは
にあったのですが、以下のように新しいURLに移動したようです。
旧版は以下に移動した模様。
検索インデックスが新しくなるようにGoogle botに頑張って欲しいです。
See Also
Sinatra 1.2からサポートされたSlimについての調査メモ。
.slim
a href=foo
のようにquoteされてない場合は右辺値がrubyコードとして評価されるのがcool。=
はデフォルトでHTML escapeされる。escapeしない場合は ==
#{{hoge}}
でエスケープしない。#my_id.my_c lass
はhamlと一緒。tag省略はdivも一緒。\
や行頭|
で複数行など、複数行のサポートが充実coffee:
のように:
を後置。hamlとは逆ActiveReco
1 YamlDb.dump "/path/to/data.yml" # dump 2 YamlDb.load "/path/to/d ata.yml" # load
という感じに使えます。structureは作ってくれないので、migrationなどであらかじめ用意しておきます。
spec_helpeRSpec.conf
を呼び出している場合、
以下のような警告が出てくることがあります。
1 ****************************************************** 2 DEPRECATION WARNING: you are using deprecated 3 behaviour that will be removed from RSpec 3. 4 5 You have set some configurat ion options after an 6 example group has already been defined. In RSpec 3, 7 this will not be allowed. All configurat ion should 8 happen before the first example group is defined. 9 The configurat ion is happening at: 10 11 /path/to/a pp/spec/sp ec_helper. rb:50 12 ******************************************************
これは spec_helpe
そもそも Ruby の require は一度しかファイルを読み込まないように なっていますが、読み込んだかどうか判定する基準となるのが 読み込み対象のファイルの絶対パスではなく、require に渡された引数であるため、同じファイルをrequireしてもパスの指定の仕方によって何度も読み込まれてしまうのです。
そこで、以下のように spec_helpe
1 $LOADED_FEATURES.push File.expand_pat h(__FILE__) 2 def require(path) 3 path = File.expand_pat h(path) if path =~ %r{^[./]} 4 super path 5 end
require を上書きして引数が "." か "/" で始まっている場合に expand_pat
rake gems:unpac
などでvender/gem
以下にunpackしたgemとbundlerを併用したい場合があります。
最近では、locale_rai
こんな場合には、Gemfile にて
1 gem 'locale_rails', '=2.0.5', :path => 'vendor/gem s/locale_r ails-2.0.5 '
というように記述しておけば、unpack したgemを使ってくれます。 第二引数のversionは必須っぽいのでご注意。
bundlerを使うとRubyアプリケーションごとに閉じたgemの依存関係を構築できるので、gemのバージョンの違いや環境ごとの違いで悩まされることが減ります。 これは非常に便利なのですが、rakeやunicornのようにコマンドをインストールするgemの場合、
1 % bundle exec unicorn
のように、bundle exec
を介して実行する必用があって面倒です。
しかし、rvmを使えばこれを賢く解決できます。
比較的新しめのrvmとbundlerが必用になるので、 あらかじめ最新版をインストールしておいてください。
まず、以下のように適当なアプリケーション名などでgemsetを作ります。
1 % rvm gemset create foo-app
作成したgemsetは
1 % rvm gemset use foo-app
のようにしてアクティベートできます。新規に作成したgemsetの中身は こんな感じになっています。
1 % gem list 2 3 *** LOCAL GEMS *** 4 5 bundler (1.0.2) 6 rake (0.8.7)
bundler-1.gem udpate
して最新のbundlerにします。
この状態であらかじめ用意しておいたGemfileに従ってgemをインストールします。
1 % bundler install --system
これで foo-app gemset にはGemfileで指定したgem群が入った状態になり、rake, unicornなどのコマンド群もrvmがいい感じに取り計らってくれます。
あとは、rvm gemset use xxx
を使えば適宜必用なgem環境を切り替えることができます。
ただ、アプリケーションが複数ある場合に、頻繁にgem環境を切り替えるのは面倒です。 アプリケーションのrootディレクトリに .rvmrc というファイルを作って
1 rvm use ruby-1.8.7-p302@foo-app
のように記述しておいておくと、cd した時にrvmが勝手にgemsetを切り替えてくれます。これで完璧ですね!
Bye bye gem hell!
Rubyはメソッド定義内で begin/end が無くても直接rescueやensureを記述できますが、これは無駄な記述を減らす上でとても魅力的な文法だと思います。
1 def foo 2 puts "hello world :-)" 3 rescue 4 puts "something wrong :'-(" 5 end
この書き方のまま、所定回数だけretryしたい場合、retry回数を覚えておくカウンタ変数を用意する場所に困ったりするのですが (ローカル変数として定義すると、retry後に再初期化されてしまいますからね) 以下のように引数として用意しておくと、methodが定義するブロックよりも外側のライフタイムを持つので、retryカウンタとして使えます。
1 def foo(bar = 0) 2 puts bar 3 raise 4 rescue 5 bar += 1 6 retry if bar < 10 7 end 8 9 foo
実行した結果は以下の通り
1 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9
またプロセスがハングアップする問題が発生したため、システム構成を見直し。 passengerからunicornに切り替えました。 正確な構成は、
という感じです。
unicornのマスタープロセスのPIDを取得するために、以下のようなスクリプトを使ってます。
unicorn_ma
1 port = ARGV.shift 2 pids = `lsof -i:#{port} | awk "{print \\$2}"`.split("\n")[1..-1] 3 pids.each do |pid| 4 puts pid if `ps --ppid #{pid}`.split("\n").size > 1 5 end 6 7 # USAGE: 8 # ruby unicorn_master.rb <#port>
またしばらく様子をみてみます。
古いRailsアプリをBundler仕様にする場合、
1 config.gem "foo", 2 :version => "0.0.1", 3 :lib => "bar", 4 :source => "http://gems.github.c om"
と等価なGemfileの記述方法は
1 source "http://gems.github.c om" 2 gem "foo", "0.0.1", :require => "bar"
で良いようです。バージョン指定をしない場合は第二引数を省略可。
Rubygemsが新しすぎると、掲題のようなエラーが出る場合があります。 とりあえず回避するには
1 # gem update --system 1.6.2
までダウングレードすればok