2012年3月25日日曜日

[ruby] ruby, rubygems, rails のインストールメモ

ruby をソースからインストールする際に若干ハマってしまったので,手順を残しておきます。

環境は,次の通りです。
  • fedora 15
  • ruby 1.9.3-p125
  • rubygems 1.8.21
  • rails 3.2.2
  • sqlite3 1.3.5

libyaml のインストール

yaml のパーサが変更されたとかで,そのままインストール作業を進めていたら,こんな警告が出ました。
It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby.
そのための対応として,libyaml をインストールします。

$ wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
$ tar xvzf yaml-0.1.4.tar.gz
$ cd yaml-0.1.4
$ ./configure
$ make
# make install

ruby のインストール

上記のインストールが済んだら,次は ruby です。
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p125.tar.gz
$ tar xvzf ruby-1.9.3-p125.tar.gz
$ cd ruby-1.9.3-p125
$ ./configure --prefix=/opt/ruby-1.9.3 \
  --with-opt-dir=/usr/local/lib \
  --enable-shared \
  --enable-option-checking
$ make
# make install


rubygem のインストール

続いて,rubygem を入れます。
$ wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.21.tgz
$ tar xvzf rubygems-1.8.21.tgz
$ cd rubygems-1.8.21
$ ./configure
$ make
# make install


さてこれで,あとはすんなりと rails を入れてアプリを作れるかなと思っていたら,途中で幾つかエラーが出たので,事前準備をしておきます。

openssl のインストール

# yum install openssl-devel
# cd ruby_src_dir/ext/openssl
# ruby extconf.rb
# make
# make install

sqlite3 のインストール

# yum install sqlite-devel
# gem install sqlite3 -v '1.3.5'

これであとは,rails のインストールを行います。

ruby on rails のインストール

# gem install rails

gem list を叩いて,rails (3.2.2) が表示されればOKです。
準備ができたので,アプリを作成して起動します。

$ rails new myapp
--- 途中で以下のように促されるので,パスワードを入力する。
Enter your password to install the bundled RubyGems to your system:
$ cd myapp
$ rails server

あとは,http://localhost:3000 でアプリにアクセスできます。

[scala]scala でリトライ処理

http://d.hatena.ne.jp/Yoshiori/20120315/1331825419 の記事を読んで,
scala でリトライ処理を書いてみました。
例外処理は,Option に翻訳しており,処理に失敗したときは,None になります。

object Retry {

  def run[A](f: => A)(count: Int, interval: Int = 3000): Option[A] = { 
    exec(f) match {
      case result: Some[_] => result
      case None if count >= 1 => Thread.sleep(interval); run(f)(count - 1, interval)
      case None => None
    }   
  }
                                                                                                                                                                       
  private def exec[A](f: => A): Option[A] = { 
    try {
      Some(f)
    } catch {
      case _ => None
    }   
  }

}

使い方は,次のような感じで。

import org.scalatest.FunSpec

class RetrySpec extends FunSpec {

  describe("Usage") {
    it("通常呼び出し") {
      val result = Retry.run {
        1 + 2
      }(1)
      assert(result === Some(3))
    }
                                                                                                                                                                       
    it("1秒間隔で3回リトライ") {
      val result = Retry.run {
        "some error occured"(999)
      }(3, 1000)
      assert(result === None)
    }
  }
}

ソースコードはこちら。
https://github.com/dnoguchi/retry-handler