Rails 2.0.2に移行する。一応Rubyも最新版に上げておこう

現在の環境は以下の通り。on Debian

ruby -v
#=> ruby 1.8.5 (2007-06-07 patchlevel 52) [i686-linux]
rails -v
#=> Rails 1.2.3

rubyはユーザーのローカルディレクトリにインストールしている。

まずはRubyを最新安定版のruby 1.8.6-p111に

http://www.ruby-lang.org/ja/downloads/から最新安定板ソースを取得。

既存のRubyを消去。

mv ~/local/ruby ~/local/ruby-old

ここではユーザーのローカルディレクトリ/home/dan/local/rubyにインストールするものとする。

mkdir temp
cd temp
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p111.tar.bz2
tar xvf ruby-1.8.6-p111.tar.bz2
cd ruby-1.8.6-p111
./configure --prefix=/home/dan/local/ruby
make
make install

ruby 1.8.6がインストールされたことを確認しておく。

ruby -v
#=> ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux]

ここまではOK。

Ralilsを入れるためにRubyGemsを入れる

RubyGemsのページから最新版(0.9.5)をダウンロード。

cd ../../temp
wget http://rubyforge.org/frs/download.php/28174/rubygems-0.9.5.tgz
tar xzvf rubygems-0.9.5.tgz
cd rubygems-0.9.5
ruby setup.rb

確認しておく。

gem -v
#=> 0.9.5

OK。

Ralisをインストールしようとしたら……

こんなエラーが。

gem install rails
#=> ERROR:  While executing gem ... (Gem::Exception)
#=>     SSL is not installed on this system

むむ。
Capistrano で遊ぶ - ねもぷらすにも同じエラーの報告が。

こちとら、rubyはapt-getじゃないんで、どうしたものか。

続き(解決)

次の手順で解決した。上記エラーは手元の環境にssl.hがなかったのが原因らしい。rootで下記コマンドを実行して解決。ruby-openssl のインスコ問題は1行でイナフだった - Home And Dryを読んでいたらなんとなくわかった。

apt-get install libssl-dev

libssl-devを入れた後、rubyのインストールをconfigureからやり直す。

ちなみに「ruby -r openssl -e ""」と打ち込んでみて何も表示されなければ、rubyにopensslはインストールされている。

メモ

SSLの問題を解決する前の話。gemを0.9.4にしてみたら上記のエラーはでなくなったけど、今度は次のエラーが。

Select which gem to install for your platform (i686-linux)
1. activesupport 2.0.2 ()
2. Skip this gem
3. Cancel installation
> 1
ERROR:  While executing gem ... (OpenURI::HTTPError)
    404 Not Found

これも上記opensslで問題を解決したら出なくなった。(それとも時間が解決してくれた?)

Ralisをインストール

gem install rails

次のようなメッセージが表示されてインストール完了。

Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rake-0.7.3
Successfully installed activesupport-2.0.2
Successfully installed activerecord-2.0.2
Successfully installed actionpack-2.0.2
Successfully installed actionmailer-2.0.2
Successfully installed activeresource-2.0.2
Successfully installed rails-2.0.2
7 gems installed
Installing ri documentation for rake-0.7.3...
Installing ri documentation for activesupport-2.0.2...
Installing ri documentation for activerecord-2.0.2...
Installing ri documentation for actionpack-2.0.2...
Installing ri documentation for actionmailer-2.0.2...
Installing ri documentation for activeresource-2.0.2...
Installing RDoc documentation for rake-0.7.3...
Installing RDoc documentation for activesupport-2.0.2...
Installing RDoc documentation for activerecord-2.0.2...
Installing RDoc documentation for actionpack-2.0.2...
Installing RDoc documentation for actionmailer-2.0.2...
Installing RDoc documentation for activeresource-2.0.2...

sqlite3-rubyをインストール

SQLite3で生きていくので、sqlite3-rubyをインストール。

gem install sqlite3-ruby

Rails 2.0.2でデフォルトDBがSQLite3に

Rails 2.0.2でデフォルトDBがSQLite3に - idesaku blog

先日2.0.1をリリースしたばかりのRuby on Railsだが、早くも2.0.2がでてきた。このバージョンで、RailsのデフォルトDBがMySQLからSQLite3に変更されたそうだ。

これはうれしい気がする。全部SQLite3で済ませようと思っていたし。

早く2.0試してみないと。

書きかけだった正規表現のページを書き始めた

はっきり言って、正規表現は苦手。正規表現は、日常的に使うけれど、他人に正確に説明するほどの自身はない。

特に覚えられないのが、ここ。

  • ^ …… 行頭。文字列の先頭や改行文字の直後の位置にマッチします。
  • $ …… 行末。文字列の末尾や改行文字の直前の位置にマッチします。改行自身は含みません。
  • \A …… 文字列先頭。^ とは異なり改行の有無には影響しません。
  • \Z …… 文字列末尾。文字列が改行で終っていればその改行の直前にマッチします。
  • \z …… 文字列末尾。$ や \Z とは異なり改行の有無には影響しません。

整理しよう。

まず、「^」と「$」。この2つは行頭と行末にマッチする。そして、文字列の先頭と文字列の末尾にもマッチする。うん、これはOK。

次に、「\A」と「\z」。これらは改行があろうがなかろうが関係ない。改行は無視して、単純に文字列の先頭と末尾にマッチする。これもOK。

最後に「\Z」。これはなんだろう。「文字列が改行で終っていればその改行の直前にマッチします。」って。改行で終わっている文字列とは、次のような文字列だよな。

"hello\n"

で、その改行の直前にマッチすると。試してみよう。

"hello\n" =~ /.\Z/
p $&    #=> "o"

"hello\n" =~ /.\z/
p $&    #=> nil

"hello\n" =~ /.\z/m
p $&    #=> "\n"

ふうむ。わかったようなわからないような。

プログラムを知らない人にRubyについて、Rubyの魅力、Rubyを取り巻く状況を伝えるとしたら

どんなのがいいだろう。

  • コードがわかりやすい
  • シンプルに書ける
  • 少ない文字数で書ける
  • 無駄なことは書かなくていい
  • 仕事に集中できる。ややこしい作業に煩わされない
  • プログラミングが楽しい
  • 比較的新しい言語。C/C++, Java, Perlよりも
  • 言語設計がすばらしい
  • 扱いやすい
  • 強力、パワフル
  • 開発効率が高い
  • 日本で生まれた言語
  • 日本人によって開発されている
  • 世界で使われている
  • 今急速に使う人が増えている
  • オープンソース
  • 無償で利用することができる
  • 開発に関するやり取りがMLで行われ、公開されている
  • 誰でも意見を述べることができるし、開発に参加できる
  • 今も進化している
  • コミュニティがある
  • Rubyを愛用する人をRubyistと呼ぶ
  • 有能な人がたくさんいる
  • 質問できる
  • 勉強会やイベントが積極的に行われている
  • コミュニティに気軽に参加できる

開発版では登録された要素の順序が記憶されるように

最新の開発版のRubyでは、ハッシュは登録した順序を記憶するようになりました。

次のような処理を試してみると、登録した順序の通り処理が行われていることが確認できます。

# ruby 1.9.0 (2007-12-13 patchlevel 0) [i686-linux]
a = {
  "tomato" => 120,
  "potato" =>  50,
  "carrot" =>  30,
}
p a         #=> {"tomato"=>120, "potato"=>50, "carrot"=>30}
a.keys      #=> ["tomato", "potato", "carrot"]
a.values    #=> [120, 50, 30]
a.each do |key, value|
  puts "#{key}の値段は、#{value}円です。"
end
#=> tomatoの値段は、120円です。
    potatoの値段は、50円です。
    carrotの値段は、30円です。

ちなみにruby 1.8.5では、次のような結果となり、順序は保存されません。

# ruby 1.8.5 (2007-06-07 patchlevel 52) [i686-linux]
a = {
  "tomato" => 120,
  "potato" =>  50,
  "carrot" =>  30,
}
p a         #=> {"carrot"=>30, "potato"=>50, "tomato"=>120}
a.keys      #=> ["carrot", "potato", "tomato"]
a.values    #=> [30, 50, 120]

個人的には、最新版のように順序を記憶してくれる仕様が正式に採用されることを祈っています。

疲れる小人さん

class Kobito
  def initialize(tree, basket)
    @tree = tree
    @basket = basket
    @tiredness = 0
  end

  def work
    unless @tree.empty?
      if tired?
        eat
      else
        carry
      end
    end
  end

  def tired?
    @tiredness >= 3
  end

  def eat
    @tree.shift
    @tiredness = 0
  end

  def carry
    @basket.push @tree.shift
    @tiredness += 1
  end
end

tree = ["apple", "apple", "apple"]
basket = []

while gets
  hobbit = Kobito.new(tree, basket)
  hobbit.work

  p tree
  p basket
end

プリントアウトして直し

赤ペンを持って校正。でも、それをPCに向かってフィードバックするのがめんどくさい。でも印刷して読み直すといろいろ見えてくるから仕方がない。

昨日はフィードバックの日だった。今日はまた新しいところを書く日。メソッド定義が終わったから、次は配列またはクラス定義。どっちも半分以上書けているのだが、残りのややこしいところを書き上げる必要がある。