• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
 
 

Rails-2.3.11用のExceptionNotificationプラグインは以下にあるようです (via @a_matsuda

基本的にはこれを script/plugin install -r 2-3-stable すれば良いのですが、ConsiderLocalの実装にバグがあるので 直す必要があります。

具体的には、以下のファイルの self.included の場所をConsiderLocalモジュールの直下に移動します。

あとはREADME通りに設定して、ConsiderLocalをApplicationControllerからincludeすればok

posted by Png genki on Sat 11 Jun 2011 at 06:51

GitリポジトリのRailsプラグインをインストールするときに、 標準では master ブランチがインストールされますが、 特定のブランチの内容をインストールしたい場合には、以下のように -r オプションを使用します。

   1  script/plugin install --force https://github.com/rails/exception_notification.git -r 2-3-stable

上記の例では 2-3-stable ブランチをインストールします。

posted by Png genki on Sat 11 Jun 2011 at 05:21

ちょっと調べ物。オープンソースのアドサーバー

OpenX Ad Server

ASB MyAds

posted by Png genki on Fri 10 Jun 2011 at 22:08

結構長いことredmineを使ってるのですが、wikiのサイドバーを作れることに最近気が付きました。

作り方は単純で Sidebar という名前のページを作ればok. サイドバーに入れる場合、見出しは h3 が良さそうです。

posted by Png genki on Fri 3 Jun 2011 at 04:56

iftopコマンドを使うと、特定のインターフェイス/ポート番号における通信量を調べることができます。

ローカルのポート1234への通信量を調べる例:

   1  iftop -i lo -B -f "dst port 1234"

転送されるデータ量を測定してチューニング、使ってるか使ってないかわからないサーバプロセスの発見などに使えます。

ubunut/debianなら、

   1  # apt-get install iftop

でインストールできます。

posted by Png genki on Tue 31 May 2011 at 06:23

spec_helper.rbの中でRSpec.configure を呼び出している場合、 以下のような警告が出てくることがあります。

   1  ******************************************************
   2  DEPRECATION WARNING: you are using deprecated 
   3  behaviour that will be removed from RSpec 3.
   4  
   5  You have set some configuration options after an 
   6  example group has already been defined.  In RSpec 3,
   7  this will not be allowed.  All configuration should 
   8  happen before the first example group is defined.
   9  The configuration is happening at:
  10  
  11    /path/to/app/spec/spec_helper.rb:50
  12  ******************************************************

これは spec_helper.rb が何度も呼び出されてしまうことで、 configureブロックが2回以上呼び出されてしまうために起こる問題です。

そもそも Ruby の require は一度しかファイルを読み込まないように なっていますが、読み込んだかどうか判定する基準となるのが 読み込み対象のファイルの絶対パスではなく、require に渡された引数であるため、同じファイルをrequireしてもパスの指定の仕方によって何度も読み込まれてしまうのです。

そこで、以下のように spec_helper.rb の先頭に記述することで、 二度読みを回避して警告されないようにすることができます。

   1  $LOADED_FEATURES.push File.expand_path(__FILE__)
   2  def require(path)
   3    path = File.expand_path(path) if path =~ %r{^[./]}
   4    super path
   5  end

require を上書きして引数が "." か "/" で始まっている場合に expand_path を呼び出して正規化しています。 自分自身が呼び出される時のrequireは上書きできないので、 $LOADED_FEATURESに自分自身の絶対パスを追加しておきます。 require は $LOADED_FEATURESにpathが存在するする場合はスクリプトを読み込まなくなります。

posted by Png genki on Mon 30 May 2011 at 13:00

rake gems:unpack GEM=foo などでvender/gems 以下にunpackしたgemとbundlerを併用したい場合があります。 最近では、locale_rails-2.0.5にパッチをあてたものを利用したい局面でそうなりました。

こんな場合には、Gemfile にて

   1  gem 'locale_rails', '=2.0.5', :path => 'vendor/gems/locale_rails-2.0.5'

というように記述しておけば、unpack したgemを使ってくれます。 第二引数のversionは必須っぽいのでご注意。

posted by Png genki on Sun 29 May 2011 at 07:28

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.0.2はちょっと古いので、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!

posted by Png genki on Sat 28 May 2011 at 21:49

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

posted by Png genki on Sat 28 May 2011 at 01:29 with 1 comment

request.host などがちゃんとリモートホストのドメイン名を指すように、 以下のように設定します。

   1  location / {
   2    # ..snip..
   3  
   4    proxy_redirect     off;
   5    proxy_set_header   Host             $host;
   6    proxy_set_header   X-Real-IP        $remote_addr;
   7    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
   8  
   9    # ..snip..
  10  }

ちょっと設定を忘れていてRSS中のGUIDがlocalhsotを指すという問題が発生しておりました。現在は復旧しております。 ご不便をおかけいたしましたことをお詫びいたします。

posted by Png genki on Wed 25 May 2011 at 23:13