tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

「初めてのRuby」一人勉強会最終日

Ruby をぼちぼち勉強しています。


教材はコレ↓
初めてのRuby


今日は第9章。本書を越えて


これを読みつつ、つぶやいてみます。

以下、つぶやきメモ。

※1 今のところ、正直あまり Ruby は好きではありません。
※2 オイラがまともにそこそこ書ける言語は C#, Java(5.0より前), Perl です。言語の機能を語っているときはその辺との比較になっているはず
※3 Ruby はまだあんま理解していないので、的外れでトンチンカンな批判してるかも
※4 コードはサンプルそのままのときと、オイラが勝手に変えてるときがあります

RubyGems (p.167)

PerlCPAN シェルみたいもん。

% gem list
gem: コマンドが見つかりません.

オイラの環境には入ってなかった。FreeBSD では ports で入れろってことね。devel/rubygem を入れるみたい。

openuri ライブラリ (p.170 例9-1)
#!/usr/local/bin/ruby

require 'open-uri'
open("http://www.oreilly.co.jp") { |connection|
  connection.each_line do |line|
    print line
  end
}

HTTP のライブラリみたい。便利だね。

Active Record (p.170 例9-2)
#!/usr/local/bin/ruby

require 'rubygems'
gem 'activerecord'
require 'active_record'

ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory')

ActiveRecord::Base.connection.create_table("books") do |t|
  t.string :isbn, :limit => 13, :null => false, :unique => true
  t.string :title, :null => false
  t.timestamps
end

class Book < ActiveRecord::Base; end
Book.create!(:isbn => '9784003220931', :title=> "ガリヴァー旅行記")
p Book.find_by_title("ガリヴァー旅行記")
% ruby a.rb
a.rb:11: undefined method `string' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x28b881ac> (NoMethodError)
        from /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.6/lib/active_record/connection_adapters/abstract/schema_statements.rb:94:in `create_table'
        from a.rb:9

このサンプルコードが動かなかった。Active Record の仕様が変わったのかなぁ?それともオイラがどっか内間違えてるのだろうか?

ちなみに、 database/rubygem-activerecord を SQLite3 のバインディングを付けてインストールした。バージョンは Active Record の 1.15.6 らしい。

GD2 (p.171 例9-3)
#!/usr/local/bin/ruby

require 'rubygems'
require 'gd2'
image = GD2::Image::TrueColor.new(270, 200)
image.draw do |pen|
  pen.color = image.palette.resolve GD2::Color[1.0, 1.0, 1.0]
  pen.fill
  pen.color = image.palette.resolve GD2::Color[1.0, 0.0, 0.0]
  pen.thickness = 2
  pen.move_to 20, 50
  # このサンプルは MAC 用かな?
  #pen.font = GD2::Font::TrueType['Library/Fonts/Courier New.ttf', 40]
  # FreeBSD だと下記でとりあえず動いた(多分 japanese/ipa-ttfonts がいる)
  pen.font = GD2::Font::TrueType['/usr/local/lib/X11/fonts/TrueType/ipag.ttf', 40] 
  pen.text "%s\n%s\n%s" % %w[Welcome to Ruby].map{|s| s.center(7) }
end

image.export('09-003-output.png')

グラフィックスライブラリかな。初めて使ったので良く分からんです

graphics/rubygem-gd2 をいれたら動いた。元サンプルそのままだとダメで、ちゃんと存在するフォントを渡してやる必要がある。

wxWidgets (p.171-172 例9-4)

wxWidgets という GUI ツールキットもあるらしい。でもこのサンプル動かなかった。wxruby がちゃんと入っていないっぽい。x11-toolkits/ruby-wx ってのを入れたんだけどなぁ...

コンテキストのすり替え (p.174 例9-6)
#!/usr/local/bin/ruby


class CybernatedAndroid
  def initialize(name) @name = name end
end

proc = Proc.new {
  p self
  p @name
}

dicey = CybernatedAndroid.new("dicey1")
dicey.instance_eval(&proc)

実行するとこんな感じ。

% ruby a.rb
#<CybernatedAndroid:0x28326ff4 @name="dicey1">
"dicey1"

うぉ、恐い。インスタンス変数にアクセスできちゃう。黒魔術な領域です。

method_missing (p.175-176 例9-8)

method_missing(method_name, *arguments) 定義されてないメソッドを呼んだときに呼ばれる。Perl の AUTOLOAD みたいなもんだね。

まとめ

とりあえず Ruby の全貌を理解できたとは全く思えませんが、とりあえずこれでおしまい。なかなか勉強になりました。次は Ruby で TDD でもやってみようかなぁ、と思います。

やってみて分かったのですが、勉強の中身を Blog にアップするのは凄くいいです。(読者にとってもいいかどうかは分かりませんが)。頭への入り方が全然違います。超お勧めです。