tswi's dev

動くものが正しいものだ

Homebrewで管理しているruby(gem)でrailsをインストール

Homebrewで管理しているrubyというかgemでrailsをインストールするときに少し躓いたのでメモ。

環境は以下のとおり。
Mac OS X 10.9.2
Homebrew 0.9.5
ruby 1.9.3-p392
gem 2.2.2

gemコマンドでrailsをインストールする

今回はrails3系を使いたかったので、バージョンを確認

$ gem search ^rails$ -a

rails 3.xの最新版をバージョン指定してインストール

$ sudo gem install rails -v 3.2.17

railsコマンドのリンクを作成する

gemでは正常にインストール完了したみたいなんだけど、コマンドを実行しようとしても以下のメッセージが出る。

$ rails -v
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.

どうもrailsにパスが通っていないらしい。
Homebrewでインストールした他のツール同様、/usr/local/binにシンボリックリンクを作成する。

$ cd /usr/local/bin
$ ln -s ../Cellar/ruby/1.9.3-p392/bin/rails ./rails

意図したディレクトリのrailsコマンドが読まれることを確認する。

$ which rails
/usr/local/bin/rails

$ rails -v
Rails 3.2.17

もしwhichで他のrailsを見ていることがわかった場合は、そちらをアンインストールするなり.bash_profileでpathの設定を見直すなり対応すること。

Homebrewでrubyのバージョン切り替え

Homebrewのrubyがバージョン2.0.0になってたんだけど、1.9.xを使いたいので利用可能なバージョンを切り替える。

ローカルに無いバージョンを利用する場合

  • 現在のrubyを利用停止
  • rubyバージョン一覧の表示
  • 利用したいバージョンのインストール
  • 現在利用中のものを停止する
$ brew unlink ruby

一覧表示

$ brew versions ruby
1.9.3-p392 git checkout 9c2a389 /usr/local/Library/Formula/ruby.rb
2.0.0-p0 git checkout d3455a1 /usr/local/Library/Formula/ruby.rb
1.9.3-p385 git checkout e5b9678 /usr/local/Library/Formula/ruby.rb
1.9.3-p374 git checkout b0f8027 /usr/local/Library/Formula/ruby.rb
1.9.3-p362 git checkout 62b8c63 /usr/local/Library/Formula/ruby.rb
1.9.3-p327 git checkout 1734e5b /usr/local/Library/Formula/ruby.rb
1.9.3-p286 git checkout 1b726f7 /usr/local/Library/Formula/ruby.rb
1.9.3-p194 git checkout 9c6ea53 /usr/local/Library/Formula/ruby.rb
1.9.3-p125 git checkout bf3dfa9 /usr/local/Library/Formula/ruby.rb
1.9.3-p0 git checkout 7338ed6 /usr/local/Library/Formula/ruby.rb
1.9.2-p290 git checkout b6aa338 /usr/local/Library/Formula/ruby.rb
1.9.2-p180 git checkout 83ed494 /usr/local/Library/Formula/ruby.rb
1.9.2-p136 git checkout f282737 /usr/local/Library/Formula/ruby.rb
1.9.2-p0 git checkout 773915d /usr/local/Library/Formula/ruby.rb
1.9.1-p378 git checkout d0efd9e /usr/local/Library/Formula/ruby.rb

利用したいものをインストール

$ git checkout 9c2a389 /usr/local/Library/Formula/ruby.rb
$ brew install ruby

ローカルに存在するバージョンを利用する場合

  • rubyバージョン一覧の表示
  • 切り替え

切り替えはswitchで行う

$ brew switch ruby 1.9.3-p392

Homebrew、かなり便利だと実感。

HomebrewでMacにRuby1.9.3をインストール

メモとして。
Mac OS X 10.8はRuby 1.8.7がプリインストールされてるけど、homebrewから1.9.3をインストールする。

brewコマンドの実行

$ brew install ruby

.bash_profileに以下を追記

$ vi ~/.bash_profile

# 末尾に追記
export PATH=/usr/local/bin:$PATH

.bash_profileの再読み込み

$ source ~/.bash_profile

以上。

参考:
homebrewでMacに複数バージョンのrubyをインストールする | おいぬま日報

Rubyの学習(第5回)

例外処理

begin-rescue-ensure-endの形式で記載する。
rescureの"=> 変数"、またensure句はオプション。
なお、"raise"によって例外を発生させることもできる。

begin
  puts "raise exception"
  raise "Exception"
rescue => ex
  puts ex
  puts "classname : #{ex.class.name}"
  puts "message : #{ex.message}"
ensure
  puts "is ensure"
end

特定の例外を取得する場合、以下のように指定する

begin
  # 例外が発生する可能性のある処理
rescue Errno::EXXX
  # EXXX例外捕捉時の処理
end

メソッド

以下のように記載する。

# def-endで定義する
def test_method(arg1, arg2)
  puts arg1 + arg2
end

# メソッドの呼び出し
test_method(1, 2)
#=> 3

メソッド定義を行う際、引数にデフォルト値を設定することができる。
メソッド呼び出し時に引数を渡さない場合、定義したデフォルト値で処理を実行する。

def test_method_default(arg1 = 10, arg2 = 20)
  puts arg1 + arg2
end

test_method_default
#=> 30
test_method_default(1)
#=> 21
test_method_default(1, 2)
#=> 3


便利な機能があってモダンな印象。
次回はクラスの定義。

Rubyの学習(第4回)

条件分岐(case)

case文は以下のように書く。"then"は省略可能。
なお、Javaのように各分岐箇所にbreakを入れる必要はない。

i = 2
case
when i == 1 then
  puts "case1"
when i == 2
  puts "case2"
when i == 3
  puts "case3"
else
  puts "case else"
end
#=> case2

別の書き方も可能。

case 8
when 1,2,3
  puts "is 1,2,3"
when 4,5,6
  puts "is 4,5,6"
when 7,8,9
  puts "is 7,8,9"
else
  puts "case else"
end
#=> is 7,8,9

改行しない省略表記。

case 8
when 1..3 : puts "is 1-3"
when 4..6 : puts "is 4-6"
else puts "nothing"
end
#=> nothing

ループ(while)

以下のように書く。"do"は省略可能。

i = 0
while i < 3 do
  puts i
  i += 1
end
#=> 0
#=> 1
#=> 2

条件式が成立しない場合にループさせる構文もある。

i = 3
until i < 1
  puts i
  i -= 1
end
#=> 3
#=> 2
#=> 1

for

以下のように書く。"do"は省略可能。

for str in ["a", "b", "c"] do
  puts str
end
#=> a
#=> b
#=> c

カウンタを使用することもできる。

for i in (1..4)
  puts i
end
#=> 1
#=> 2
#=> 3
#=> 4

イテレータ

Rubyでは、whileやfor以外の繰り返し処理がいくつかある。

  • times
    • 一定回数の繰り返しに利用する
  • each
    • オブジェクトを1つずつ取り出す
  • loop
    • ループを終了する命令があるまで繰り返し処理を続ける
# times
3.times do |num|
  puts num
end
#=> 0
#=> 1
#=> 2

# do-endは{}で代替することもできる
3.times { |num|
  puts num
}
#=> 0
#=> 1
#=> 2

# each
array = ["abc", "def", "ghi"]
array.each do |addr|
  puts addr
end
#=> abc
#=> def
#=> ghi

# loop
# break等でループから抜けない限り繰り返しを続ける
loop do
  puts "in loop"
  break
end
#=> in loop

なお、繰り返しの制御命令として以下がある。

  • break
    • 繰り返しから抜ける
  • next
    • 処理を中断し、次の繰り返しまで飛ぶ
  • redo
    • 同じ繰り返し処理を再実行する


簡潔さは相変わらず。
徐々に面白くなってきた。

Rubyの学習(第3回)

演算子

四則演算、余算はごく普通の記述。

p 10 + 3
#=> 13

p 10 - 3
#=> 7

p 10 * 3
#=> 30

p 10 / 3
#=> 3

p 10 % 3
#=> 1

なお、インクリメント/デクリメントは実装していないので以下のように記載すること。

i = 10
i += 1
p i
#=> 11

i = 10
i -= 5
p i
#=> 5

条件分岐(if)

if文は下記の通り。なお通常、"then"は省略することができる。

if 1 == 1 then
  puts "is true"
end
#=> is true

一行で書く場合は"then"が必須。ただし":"に書き換えることも可能。

if true then puts "one line true" end
#=> one line true

if true : puts "one line true" end
#=> one line true


if〜elseは下記。
なお、"else if"に相当する命令は"elsif"と記載する。"elseif"ではない。

if true
  puts "is true"
else
  puts "is false"
end
#=> is true

if nil
  puts "is true"
elsif true
  puts "elsif true"
else
  puts "false"
end
#=> elsif true

unlessという、ifの否定形を表す命令もある。
"if !条件式"と同等。

unless true
  puts "unless true"
else
  puts "unless false"
end
#=> unless false


なお、if, unlessは式を後置することもできる。

puts "後置true" if true
#=> 後置true

puts "後置false" if false
#=> 出力なし

puts "後置true" unless true
#=> 出力なし

puts "後置false" unless false
#=> 後置false

うん、実にサラサラと書ける。
コード中に"()"や"{}"が入ってこないので、改行やインデント、行間開けはしっかりする必要がありそう。

Rubyの学習(第2回)

定数

先頭1文字を大文字にすること

Var = "Constant"
puts Var
#=> Constant

# 定数に再度値を入れようとすると警告が出るが、代入自体は可能な模様
Var = "CONSTANT"
#=> warning: already initialized constant Var
puts Var
#=> CONSTANT


組込み定数。

# ARGF
# 引数または標準入力により構成される仮想ファイル
# 下記のように記述すると、引数で指定したファイルを1行ずつ処理できる
ARGF.each do |line|
  puts line
end

# ARGV
# コマンドライン引数
puts ARGV[0]

# ENV
# 環境変数
puts ENV['PATH']
#=> /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

# RUBY_VERSION
# Ruby処理系のバージョン
puts RUBY_VERSION
#=> 1.8.7

# RUBY_RELEASE_DATE
# Ruby処理系のリリース日
puts RUBY_RELEASE_DATE
#=> 2011-12-28

# RUBY_PLATFORM
# 実行環境
puts RUBY_PLATFORM
#=> universal-darwin11.0

# STDIN
# 標準入力

# STDOUT
# 標準出力

# STDERR
# 標準エラー出力

# DATA
# __END__以降を扱うオブジェクト
# ファイルに"__END__"を記載すると、以降の記載はデータとなる
DATA.each do |line|
  puts line
end
__END__
abc
def
ghi
#=> abc
#=> def
#=> ghi

コメント

1行コメント

# 井桁を記入すると、そこから行末までがコメントアウトされる

複数行コメント

=begin
"=begin"〜"=end"で囲まれた範囲は
すべてコメントアウトされる
=end

配列

型を混在させることができる。

array = [1, "abc", 10.7]

array.each do |line|
  puts line
end
#=> 1
#=> abc
#=> 10.7

puts array[0]
#=> 1

# 範囲を指定することもできる
puts array[0..2]
#=> 1
#=> abc
#=> 10.7

# 範囲指定を"..."でつなげると、最大値未満までが対象となる
puts array[0...2]
#=> 1
#=> abc

# 存在しない要素番号を指定するとnilが返る
puts array[3]
#=> nil

# 範囲指定で存在しない要素番号がある場合、nilは返らない
puts array[0..3]
#=> 1
#=> abc
#=> 10.7 


とりあえずこんなところ。
本当にスルスル書けるけど、誤った操作を許容してしまいそうな気がする。
試験が非常に重要になりそう。