(追記:2012-12-03) 本記事を電子書籍化しました。「Gumroad」を通して100円にて販売しています。詳細は文末に追記しましたので、購入ご検討のほどよろしくお願いしますm(__)m

start Ruby

電子書籍「これからRubyを始める人たちへ」EPUB版

Rubyの特徴

Rubyは、まつもとゆきひろ氏(通称Matz)により設計されたオブジェクト指向プログラミング言語です。Rubyの特徴を一言で言うならば、それは「間口が広くて奥が深い言語」ということになります。

「間口が広い」というのは、インタフェースがシンプルで誰でもが簡単に使い始められることを意味します。「奥が深い」というのは、プロフェッショナルによる長期使用に耐えうる本物の言語であるということを意味します。「間口が広い」ということと「奥が深い」ということは本来競合する概念ではありませんが、その両方をバランスよく組み合わせるには、対象に対する深い知識と広い視野加えて人並み外れたセンスが必要です。

Rubyはまつもと氏のその絶妙なバランス感覚によって生まれました。つまりRubyはプログラム言語における「スーパーマリオブラザーズ」であり、氏は言語界における「宮本茂」なのです。

Rubyのインストール

まずRubyをinstallする必要がありますが、もしあなたがWindowsユーザならRubyInstaller for Windowsというツールがあります。以下などを参考に最新版をインストールしてください。

Windows で Ruby バージョン 1.8.7 あるいは 1.9.2 のインストール (RubyInstaller を使用)

もしあなたがMacユーザならRubyが最初から入っていますがversionがちょっと古いです。Terminalを開いて、次のようにしてversionを確認して下さい。

% ruby -v

1.8.7が返ってきたなら1.9.2以降が必要です。

Xcodeがあるとして、まずはHomebrewという、UNIXツールパッケージマネージャをinstallしてください。次にhomebrewでrbenvという、RubyのVersionマネージャをinstallします。readlineもinstallします。

% brew update
% brew install rbenv
% brew install ruby-build
% brew install readline
% brew link readline

.bashrcなどに以下を追記します。

% export PATH="$HOME/.rbenv/bin:$PATH"
% eval "$(rbenv init -)"

そしてRubyをinstallします。最初にrbenv installでinstall候補を表示して、1.9.3-p327辺りをinstallします。

% rbenv install
% CONFIGURE_OPTS="--with-readline-dir=/usr/local" rbenv install 1.9.3-p327
% rbenv rehash
% rbenv global 1.9.3-p327

ruby -vしてversionを確認してください。

開発環境

Rubyistはエディタを使います。IDEはあまり使いません。VimやEmacsを使っている人が多そうです。海外のMacユーザにはTextMateが人気です(日本語の扱いに若干の問題があります)。もっとも最近は、国内外を問わず、Sublime Textというクロスプラットフォームなエディタの人気が急上昇しています。

TextMateを使う場合は、Preferences-Advancedに次のような設定が必要です。

TM_RUBY: /Users/あなた/.rbenv/shims/ruby
PATH:   /Users/あなた/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
RBENV_VERSION:  1.9.3-p327

Rubyのコード

Rubyはすぐ始めることができます。早速何か作ってみましょう。パスワード生成器を作りましょう。

パスワード生成器

もしあなたが他のプログラミング言語を知っているなら、まずそれで考えてみてください。英数字8文字からなるパスワードを10個作ります。

Rubyでは次のようになります。

どうです?Rubyを知らなくても何となくコードが読めると思います。Rubyのコードは簡潔で可読性が高いです。

プログラムの実行はTerminalで次のようにします。

% ruby password_gen.rb

TextMateを手に入れた人は⌘R⌃⇧⌘Eで実行します。

HIa09itR
k6GgIFLc
ZKGwo1q7
DXVYKpnZ
F2uXCza7
EJRiQyvV
THJ6thBE
4mTBscNK
y6kEzx1Q
vz5PLiKT

少し解説します。

Rubyはオブジェクト指向言語ですから、プログラムはオブジェクトに対するメソッド呼び出しの形を取ります。def endはメソッド定義で、その引数にはdefault値をセットできます。メソッド定義の中では[ ](角括弧)で配列を作って、sampleというメソッドを呼んでsizeの数だけ配列の要素をサンプリングしています。更にその返り値にjoinというメソッドを呼んで、サンプリングした配列の要素を結合しています。配列の中の0..9はRangeオブジェクトで、先頭の*(splat)演算子で配列に展開しています。メソッドは常に結果を返します。何処かで明示的にreturnしなければ最後の式の結果が返り値になります。

10.timesは10オブジェクトに対してtimesメソッドを呼んでいます。そう数字もオブジェクトです。RubyにはPrimitive型のようなものはなく、すべてがクラスから生成されるオブジェクトです。ちなみにRubyではtruenilもそれからクラス自身もオブジェクトです。10.timesは0から9の繰り返しを表現するEnumeratorというオブジェクトを返します。

mapメソッドは渡したブロック({}またはdo endで表現される)内の手続きを使って、Enumeratorの要素である0から9を置換します。ここで、定義したpassword_genメソッドを呼んでいます。引数が不要の場合はメソッド呼び出しの括弧は省略できます。結果は配列の形で返ります。Rubyではmapのようなブロックを取るメソッドが多数登場します。ブロック内には自由に手続きを書けますから、つまりこれは高階関数(関数を引数に取る関数)の簡易版です。

最初のdef endのところでこれはメソッド定義だと説明しました。そう、これは関数ではありません。Rubyには関数はありません。すべてがオブジェクトに対するメソッド呼び出しです。先のコードのようにクラス定義の外側(これをトップレベルと呼びます)で定義されるメソッドは、クラスツリーの最上位に位置するObjectクラスに定義されたものとして扱われます。そして外からは呼び出せない内部メソッドとなるようprivate指定されます。Rubyではprivate指定されたメソッドはオブジェクトを指定しない暗黙の呼び出しでしか呼べないよう設計されています。putsも同様です。このようにしてRubyでは、オブジェクト指向における設計の一貫性を維持しつつ、使い勝手の良い手続き的プログラミングができるようになっています。これがRubyの素晴らしい点です。

irbを使う

Rubyにはirbという対話型実行環境が付属しています。Terminalでirbしてみます。

% irb

そしてコードを打ち込んでreturnしてください。

>> char_set = [*0..9, *'a'..'z', *'A'..'Z']
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
>> char_set.sample(8)
=> ["q", "d", 0, "S", "R", "K", "r", "Q"]
>> char_set.sample(8).join
=> "PI1EOBJg"

returnのたびにその式が評価されるのが分かると思います。こうしてRubyistはirbでちょっと試してその動作を確認しつつプログラムするのです。

Rubyの格言の一つに「RubyのことはRubyに聞け」というのがあります。例えば、先の配列オブジェクトchar_setがどのようなメソッドを受け付けるのか知りたいとします。そんなときはirbでこうします。

>> char_set.methods
=> [:inspect, :to_s, :to_a, :to_ary, :frozen?, :==, :eql?, :hash, :[], :[]=, :at, :fetch, :first, :last, :concat, :<<, :push, :pop, :shift, :unshift, :insert, :each, :each_index, :reverse_each, :length, :size, :empty?, :find_index, :index, :rindex, :join, :reverse, :reverse!, :rotate, :rotate!, :sort, :sort!, :sort_by!, :collect, :collect!, :map, :map!, :select, :select!, :keep_if, :values_at, :delete, :delete_at, :delete_if, :reject, :reject!, :zip, :transpose, :replace, :clear, :fill, :include?, :<=>, :slice, :slice!, :assoc, :rassoc, :+, :*, :-, :&, :|, :uniq, :uniq!, :compact, :compact!, :flatten, :flatten!, :count, :shuffle!, :shuffle, :sample, :cycle, :permutation, :combination, :repeated_permutation, :repeated_combination, :product, :take, :take_while, :drop, :drop_while, :pack, :entries, :sort_by, :grep, :find, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :all?, :any?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :nil?, :===, :=~, :!~, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :__id__, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]

そこにsampleというメソッドを見つけました。irbでhelpと打ってreturnします。

>> help

promptが変わりますから、そこでsampleと打ちます。

>> sample
.sample

(from ruby core)
Implementation from Array
----------------------------------------------
  ary.sample        -> obj
  ary.sample(n)     -> new_ary
----------------------------------------------

Choose a random element or n random elements from the array. The elements are chosen by using random and unique indices into the array in order to ensure that an element doesn't repeat itself unless the array already contained duplicate elements. If the array is empty the first form returns nil and the second form returns an empty array.

空returnでhelpを抜けます。ネットに日本語のRubyリファレンスマニュアルがあります。全メソッドを一覧したいという欲張りな人には、拙作Ruby Reference Indexがあります。

ファイル情報一覧ツール

次に、UNIXコマンドを一つ作ってみます。ディレクトリ内のファイルの情報一覧を表示する、つまり次のUNIXコマンドのRuby版です。

% ls -l

Rubyにはシェルコマンドをそのまま呼べるsystemというメソッドがあるので、コードは次のようになります。

puts system 'ls -l'

これではRubyの紹介になりません。systemを使わないで書いてみます。

実行すると次の結果が得られます。

% ruby ls_l.rb

mode  nlink  uid  gid  size  mtime
16877  3  501  20  102  2012-04-05 22:50:12 +0900  lib
33188  1  501  20  450  2012-04-07 13:50:34 +0900  ls_l.rb
33188  1  501  20  366  2012-04-05 08:29:55 +0900  myfirst_webapp.rb
33188  1  501  20  276  2012-04-06 08:00:31 +0900  password_gen.rb
16877  3  501  20  102  2012-04-05 22:49:54 +0900  test

今度のコードは読むのがちょっと難しいですね。解説します。

%w( … )は文字列を要素とする配列の簡略記法です。簡略しない書き方はこうです。

long_format = ['mode', 'nlink', 'uid', 'gid', 'size', 'mtime']

この配列をlong_formatという変数に代入しています。Rubyの変数には型という概念がありません。Rubyの変数はオブジェクトへの参照です。つまり名札です。

Dir[path]は一見、配列参照のように見えますが、これはDirオブジェクトに対するメソッド呼び出しです。irbで次のようにしてください。

>> Dir['*']
=> ["lib", "ls_l.rb", "myfirst_webapp.rb", "password_gen.rb", "test"]

次にこうしてください。

>> Dir.[]('*')
=> ["lib", "ls_l.rb", "myfirst_webapp.rb", "password_gen.rb", "test"]

同じ結果が得られました。つまりDir[arg]Dir.[](arg)の簡略記法(syntax sugar)です。ちょっといたずらをします。irbで次のようにしてください。

>> def Dir.[](arg)
>>   arg * 10
>> end
=> nil

もう一度Dir['*']を実行します。

>> Dir['*']
=> "**********"
>> Dir['/bin']
=> "/bin/bin/bin/bin/bin/bin/bin/bin/bin/bin"

挙動が変わりました。つまりメソッドがoverrideされました。

Rubyにはこのような見た目を良くするためのメソッド呼び出しの簡略記法がいろいろあります。以下もそうです。

>> 1 + 2
=> 3
>> [1,2,3] << 4
=> [1, 2, 3, 4]
>> hash = {}
>> hash[:job] = 'rubyist'
=> "rubyist"

これらは演算子に見えますが、メソッド呼び出しです。originalはこうです。

>> 1.+(2)
=> 3
>> [1,2,3].<<(4)
=> [1, 2, 3, 4]
>> hash.[]=(:job, 'rubyist')
=> "rubyist"

Rubyで演算子に見える記号の多くはメソッド呼び出しです。したがってoverrideしたり、オブジェクトの種類に応じてその挙動を変えることができます。ポリモーフィズムですね。

ls_lの解説に戻ります。コードを再掲します。

mapはpassword_genのところで説明しました。Dir[path]で得られたfilenameは|fname|でブロック内の手続きに順番に渡されます。File.stat(fname)はfnameを引数にFileオブジェクトのstatメソッドを呼んでいます。これでそのファイル属性をパッケージ化したオブジェクトが得られます。そしてまたmapです。今度はlong_formatの要素(ファイル属性名)を順番にブロックに渡します。ここで、sendメソッドでstatにファイル属性名を渡して、各属性名を属性値に置換します。通常、属性値の取得は次のようにします。

>> stat = File.stat('password_gen.rb')
>> stat.mode
=> 33188
>> stat.nlink
=> 1
>> stat.uid
=> 501
>> stat.gid
=> 20
>> stat.size
=> 276
>> stat.mtime
=> 2012-04-06 08:00:31 +0900

sendメソッドはその文字列で各メソッドの呼び出しを可能にします。<<は上で見ました。long_format.mapで返された配列にfnameを追加するメソッドです。

最後にpath = ARGV[0] || '*'の説明です。ARGVはcommand line引数を表す配列オブジェクトです。つまりこういうことです。

% ruby ls_l.rb '/usr/local/*'

この場合ARGV[0]には'/usr/local/*'が格納され、変数pathはこれを指すことになります。引数なしで$ ruby ls_l.rbとした場合、nilが入ります。その場合pathは代わりに'*'を参照します。つまりpath = ARGV[0] || '*'

path = ARGV[0] ? ARGV[0] : '*'

あるいは

path =
  if ARGV[0]
    ARGV[0]
  else
    '*'
  end

と等価です。ちなみにRubyではifを含む制御構造の多くが式です。つまり結果を返します。上の例では結果はpathに代入されます。

Rubyのクラス階層

さてRubyのクラスの説明を少しします。RubyのクラスシステムはUNIXのファイルシステムと同じ木構造です。クラスツリーのrootはObjectクラスです。Objectクラスの持っている特性(つまりメソッド)は、そこにぶら下がっているクラス(つまりすべてのクラス)に継承されます。そしてぶら下がっているクラスで別の特性が追加されたなら、その追加の特性を含めてそこにぶら下がっているクラスに継承します。ここで言っている継承とは、下流から上流のメソッドを参照できるという意味です。

ここでRubyが標準で持っているクラスシステムを見てみます。1.9系で少しクラスシステムが複雑になりました。ここでは1.8.7のものを見ます。

Object
 |--Module
 |  └-Class
 |--Numeric
 |  └-Float
 |  └-Integer
 |     └-Bignum
 |     └-Fixnum
 |--String
 |--Symbol
 |--Array
 |--Hash
 |--Range
 |--Regexp
 |--MatchData
 |--IO
 |  └-File
 |--File::Stat
 |--Dir
 |--Time
 |--Struct
 |  └-Struct::Tms
 |--Enumerable::Enumerator
 |--Proc
 |--Method
 |--UnboundMethod
 |--Thread
 |--ThreadGroup
 |--FalseClass
 |--TrueClass
 |--NilClass
 |--Exception
 |--Continuation
 |--Process::Status
 |--Binding
 `--Data
    └-NameError::message

これらはRubyに最初から組み込まれたクラスです。重要なもの・よく使うものを上の方に配置しました。Rubyを起動すると最初にこれらのクラスがメモリ空間に構築されて呼べるようになります。Rubyではクラスもメモリ空間に常駐するオブジェクトです。最重要クラスはObjectModuleClassです。これらがRubyの世界の基礎を構築しています。

Rubyには別途標準添付のクラス群があります。標準添付ライブラリと言います。これらは明示的にメモリに読み出す必要があります。読み出しにはrequireを使います。

require 'date'

puts Date.today
# >> 2012-04-07

読み出しによりこれらもクラスツリーのどこかにぶら下がることになります。あなたが作るoriginalのクラスも他の誰かが公開したクラスも、標準添付ライブラリと全く同様の扱いを受けます。

クラスの主たる仕事はオブジェクトをメモリ空間に生成することです。そしてその標準的な作法はクラスに対しnewメソッドを呼ぶことです。

string = String.new('hello') # => "hello"
array = Array.new(3, 'hello') # => ["hello", "hello", "hello"]
hash = Hash.new # => {}
range = Range.new(1,9) # => 1..9
regexp = Regexp.new(/r..y/) # => /r..y/
f = File.new('ls_l.rb') # => #<File:ls_l.rb>

もっとも、よく使われる組み込みクラスでは、結果を直接書けばオブジェクトが生成できるようになっています。そのようなものをリテラルといいます。

string = 'hello' # => "hello"
array = ['hello', 'hello', 'hello'] # => ["hello", "hello", "hello"]
hash = {} # => {}
range = 1..9 # => 1..9
regexp = /r..y/ # => /r..y/

各オブジェクトに対してはその生成元クラスで定義したメソッドが呼べるようになります。各組み込みクラスには大量のメソッドが定義されています。Ruby Reference Indexにおける各クラスのpublic_instance_methodsの項を見てください。例えばArrayクラスには80を超えるメソッドが定義されています。これがRubyの便利さの源です。生成元クラスにメソッドが見つからなければ、Rubyはクラスツリーを逆にたどってメソッドを探しに行きます。これが継承の意味です。

モジュール

Rubyにはクラスとそっくりなモジュールというオブジェクトがあります。クラス同様そこにはメソッドが定義できます。しかしモジュールは先のクラスツリーにぶら下がることができません。オブジェクトを生成することもできません。代わりに、クラスに挿し木されます。それによって対象のクラスにメソッドを補給します。これをmix-inといいます。一つのモジュールを複数のクラスに挿し木することもできます。Enumerableという繰り返しに係る機能を提供するモジュールはArray Hash Range IOなど多数のクラスにmix-inされています。最重要モジュールは、ObjectクラスにMix-inされたKernelモジュールです。モジュールのことを母たるクラスに対して「ベビーシッター」とか「飛べない鳥ニワトリ」とかいう人もいます。たぶん。

RubyGems

他の人が作ったクラスやモジュールは、もっぱらRubyGemsという形式でパッケージされ公開・配布されています。それらはRubyGems.orgでホスティングされています。Rubyにはそこからパッケージを取得するためのrubygemsというツールが付属しています。これを使ってgem searchしてgem installします。

% gem search rails --remote
% gem install rails

名前がはっきりしないような場合はRubyGems.orgで検索します。機能別で比較しながら見つけたいならThe Ruby Toolboxがいいです。RubyのWeb Application Frameworkにどんなものがあって、人気はどうなのか見てみます。

The Ruby Toolbox - Web App Frameworks

Ruby on Railsの人気が図抜けているのがわかります。

My First Web Application

ではgemを使って何か作ってみましょう。2番人気のSinatrahamlというHTMLマークアップ言語でWebアプリを作ります。まずはこれらgemsをinstallします。

% gem install sinatra
% gem install haml

そしてこれらのgemと最初に書いたpassword_gen.rbをrequireで読み込んで、それらを使ったコードを書きます。その前にpassword_gen.rbを少し直します。

#!/usr/bin/env ruby
def password_gen(size=8)
  [*0..9, *'a'..'z', *'A'..'Z'].sample(size).join
end

if __FILE__ == $0
  puts 10.times.map { password_gen }
end

puts 10.times...if __FILE__ == $0 endで囲います。このファイルを直接実行したときにだけ、if節が実行するようになります。

そうですパスワード・ジェネレーターサービスを作ります。さあコードを書きましょう。

この1ファイルで完成です。ええ、ほんとうに。

簡単に解説します。まずget '/' do endは括弧が省略されたRubyのメソッド呼び出しです。rootパスに対するHTTPメソッドGETリクエストを受けて、haml言語で書かれたindexをレンダリングします。get '/:size' do endはrootパスに渡されたパラメータを受けて、これをpassword_genメソッドに渡して結果を@pwdインスタンス変数に取得し、pwdのレンダリングのときにこれが出力されるようにします。何となく読めるでしょうか。このように一見その目的に特化した構文に見えるけれども、実はRubyの柔軟性を使ったその文法に従った構文を内部DSLと言います。Rubyistは内部DSLが得意です。

さあ、このコードを実行します。

% ruby myfirst_webapp.rb

するとWEBrickというWeb Serverが起動します。http://localhost:4567/にアクセスします。

Alt Browser Screen

リンクをクリックして..

Alt Browser Screen

Alt Browser Screen

希望の長さのパスワードが生成されてユーザに提供されます。

メタプログラミング

次にRubyのメタプログラミングについても触れておきます。メタプログラミングとは、あなたに代わってランタイムつまり動的にプログラムにプログラムを書かせることです。method_missingというフックメソッドを使ったメタプログラミングをやってみます。まずは次のような仕掛けをしておきます。

ここには具体的なメソッド定義はありません。代わりにメソッド定義を動的に生成するdefine_methodが定義されています。概要だけ説明すると、Countryおよびそのサブクラスがdef__ではじまるメソッド呼び出しを受けたとき、def__以下のwordに係るsetterとgetterメソッドを自動生成します。次のように使います。

class Japan < Country
  %w(capital language population).each { |m| send "def__#{m}" }
end

Japan.capital = 'Tokyo'
Japan.language = 'Japanese'
Japan.population = 127433494

puts <<EOS
Japan
  Capital:    #{Japan.capital}
  Language:   #{Japan.language}
  Population: #{Japan.population}
EOS

# >> Japan
# >>   Capital:    Tokyo
# >>   Language:   Japanese
# >>   Population: 127433494

CountryのサブクラスJapanで、def__ではじまるcapital以下のメソッドを呼び出します。しかしそのようなメソッドはJapanクラスにもCountryクラスにもさらにはその親であるObjectクラスにも定義されていないので、これらの呼び出しは結局、Countryのmethod_missingメソッドを呼び出すことになります。そしてそこに書かれたコードが実行されて、動的にcapital, capital=, language, language=, population, population=の各メソッドが定義されることになります。一応確認してみましょう。

Japan.methods(false) # => [:capital=, :capital, :language=, :language, :population=, :population, :currency=, :currency]

いいですね。

クラス定義のやり方も説明せずに、いきなりメタプログラミングもないものです。ただRubyの強力さを伝えたかったのです。

本の紹介

最後にRubyの本をいくつか紹介します。つまりアフィリエイトです。

上に書いてあることが概ね理解できるなら、最初に読むRubyの本としては初めてのRubyをお薦めします。

初めてのRuby

200頁ほどの比較的短い書籍ですが内容は濃いです。Rubyの言語解説だけでなく、言語を取り巻く環境についての説明がある点がいいです。言語仕様の理解だけではわからない、Rubyの世界観を掴むには最適の一冊だと思います。また文章が正確で読みやすい、という点もいいです。欠点を挙げるとするならば1.9の新機能に説明が傾斜している点ですが、それも1.9のリリースマネージャが書いたということに鑑みれば仕方なく、また貴重な解説ということができます。

プログラミングの経験があまり無いのなら、初めてのプログラミング 第2版たのしいRuby 第3版をお薦めします。

初めてのプログラミング 第2版

初めてのプログラミング 第2版は200頁ほどのチュートリアル的書籍で、手を動かしながらRubyを学ぶといった内容になっています。従ってRubyの言語仕様全体を知るには不向きですが、米国人特有のウィットに富んだ説明が、Rubyでプログラムを書く楽しさとマッチしていて僕は好きです。僕が読んだ第1版では、Rubyの外界とのやり取りつまりファイルやネットワークを扱うものがなく物足りなさもありましたが、第2版では少し補われているようです。英語がイケるなら$16.50のebookがお得です。また第1版はネットで日本語訳が無料公開されています。

Learn to Program

プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama

たのしいRuby 第3版

たのしいRuby 第3版は500頁ほどの非常に丁寧で網羅的なRubyの言語解説本になっています。言語の持っている機能を一つづつ順番に潰していき、最後に比較的大きな例題をこなすオーソドックスなスタイルです。説明も信頼できるものであり、安心して読み進めることができると思います。

読んでいないのでコメントはできませんが、パラパラとめくった感じではRuby 1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)もよさそうです。Rubyの本というよりも情報工学の基礎をRubyを通して学ぶといった趣のものになっています。著者も信頼できます。

プログラミングRuby 1.9 −言語編−

プログラミングRuby 1.9 −言語編−はRuby解説本のDe-Facto Standardです。このシリーズに目を通したことがないRubyistはいません(そんなこともありません)。 だからこの本は必読です。残念な点はこの版でプログラミングRuby 1.9 −ライブラリ編−と2分冊になったにも拘わらず450頁の言語編だけで3,990円もする点です(2冊合わせると8,610円!)。まあライブラリ編はいらないですけど。英語がイケるなら$25.00のebookをお薦めします(もちろんライブラリ解説込み)。

Programming Ruby 1.9

ここで一つトリビアを。17章で登場する日本人女性開発者Yuiの最初の名前はTamaだった!

プログラミング言語 Ruby

さて次に紹介する本はプログラミング言語 Rubyです。この本はプログラミングRuby 1.9 −言語編−が持つDe-Facto Standard座を射程に入れています。しかしこの本には注意が必要です。少なくとも最初に読むべきではありません。Rubyが本来持っている楽しさというものを奪い取って、あなたのRubyに対する興味を消失させる可能性を持っています。つまりこの本はRubyの解説本ではなく、硬派なRuby言語仕様詳細解説本です。著者が、JavaScript本のDe-Facto StandardになっているJavaScript 第5版のDavid Flanaganである、と聞いて察しがつく人もいるでしょう。本が生まれた経緯から著者にまつもと氏が名を連ねていますが、これは実質David Flanaganの本です。一方でRubyのことをそれなりに知っていて(例えばプログラミング言語 Rubyは既に読んでいて)、Rubyに対するより詳細で正確な知識がほしい、もっとトリビアを知りたい、といった人には最高の一冊になります。にやにやしながらこの本を読むことになります。第一印象は最悪でしたが今はこの本がかなり好きです。こういった書籍は他にはありません。

Rubyの詳細は知りたいけれども、もっと遊び心がある本が良いといった人にはRuby Way 第2版 (Professional Ruby Series)をお薦めします。

Ruby Way 第2版 (Professional Ruby Series)

650頁の大著です。1.8と1.9を跨いで出版されたのが良くなかったのか、今ひとつ人気がありません。だけど僕、この本好きなんですよねー。著者のHal FultonはきっとRubyが大好きなんだと思います。exampleが豊富で著者がそこに時間を掛けているのがよく分かります。

Rubyを使ったプロの仕事を知りたいなら、この一冊で間違いありません。 Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

実践コードをベースにテスト技法、API設計、メタプログラミング、プロジェクト管理など、実践における正にベストプラクティスを解説する一冊になっています。高度な内容を取り扱っているにも拘らず、説明が丁寧かつ平易でその難しさを感じさせない良書だと思います。original英語版は無料公開されています。太っ腹。

Ruby Best Practices- Full Book Now Available For Free!

最後に紹介するのはRubyのメタプログラミングだけを扱ったメタプログラミングRubyです。

メタプログラミングRuby

この本は国外の評価は分かりませんが日本では大変に人気があります。特に他言語プログラマーの評価が高いように感じます。Rubyをある程度知っている身としては、正直得るものは多くはなかったです。ただ、Rubyistが普段使っている各テクニックに名前を付けた、つまり共通言語としてカタログ化したことの役割は小さくないのだと思います。Railsをやるなら目を通す必要があるのでしょう。

さて以上で「これからRubyを始める人たちへ」向けた、長かったRubyの紹介を終わります。Rubyを好きになれそうですか?もしこの記事でRubyを始めることを決意し、次に参考になる書籍以外の(つまりFreeの)読み物が必要なら、このブログにある次の記事を読んで頂けるとうれしいです。

秋だ!Rubyを学ぼう! ~Rubyを知るための26ポスト

Blog Hostingの移行に伴う記事の校正が不完全です。読みづらい点ご容赦ください。

(追記:2012-04-11) 記事を少し直しました。

(追記:2012-04-21) path = ARGV[0] ||= '' となっていたのを path = ARGV[0] || ''に変更しました。


(追記:2012-12-03)

電子書籍「これからRubyを始める人たちへ」の販売について

本記事を電子書籍化しました。「Gumroad」を通して100円にて販売しています。

start Ruby

start Ruby start Ruby

コンテンツについては、本記事「これからRubyを始める人たちへ」における、誤記の修正およびメディア向けの調整を行っていますが、実質的な内容についての追加・変更はありません。したがってテキストに関し、有料購入する価値は無いと思います。しかしながら、次の何れかの理由で興味を持たれる方が居られるかもしれません。

  1. コンテンツに関心があるので、それが電子書籍の形態で読めるのはやはり便利だ。

  2. コードのSyntax HighlightingをEPUBで実現したものをあまり見たことがない。どんなものかちょっと見てみたい。

  3. ブログの記事を読んだが参考になった。これが無料なんて申し訳なく思うから買ってあげたい。

  4. ブログの記事は読んでないが、興味はあるのでどうせなら電子書籍で読んでみよう。

  5. なんか表紙が気に入ったからそれを眺めるために買ってみよう。

  6. このブログのネタは全体としてなかなか面白い。これからも継続して欲しいので寄付の気持ちで購入してもいいかな。

  7. タブレットを買ったばかりなので、いろいろな電子書籍を衝動買いしたい。

  8. 今日はいい気分だ。だれでもいいから俺の100円受け取って。

次のリンクはGumroadにおける商品購入リンクになっています。クリックすると、オーバーレイ・ウインドウが立ち上がって、この場でクレジットカード決済による購入が可能です。購入にはクレジット情報およびメールアドレスの入力が必要になります。購入すると、入力したメールアドレスにコンテンツのDLリンクが送られてきます。

電子書籍「これからRubyを始める人たちへ」EPUB版

ご検討のほど、よろしくお願いしますm(__)m

なお、EPUBはAmazon Kindleでは読めないので、mobiなどへの変換が必要です。変換には「calibre」が便利です。


関連記事: RubyによるMarkdownをベースにしたEPUB電子書籍の作り方と出版のお知らせ


(追記:2012-12-21)一部不適切な記述がありましたので訂正しました。ゴメンナサイ。



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS