« 四国行ってきたぜ | メイン | 実践Common Lispを読んでみる(その1) »

2008年9月21日

Ruby/Rails勉強会@関西-30メモ

さて、勉強会にはぼちぼち参加しているのですがblogの記事として書くのはずいぶん久しぶりだったりします。とりあえずいろいろ思ったことなど。

まずは石川さんによる信長の野望 on Rails。さーておじさん昨日のうちにノートのVMware上にRails環境そろえたしこれでばっちりだろ、と思ったらrake db:migrateでエラー。確か昨日ちょっとファイル消したのでその影響かな・・と(ファイル消したσ(`ε´) オレバカ)。
仕方ないのでサーバに急遽Railsの環境をそろえて実行、うん、こっちはうまくいったっぽい。配布資料がなかったのが残念です。

で、今回久しぶりにRailsをさわってみて思ったのが「Web上にいいRailsの情報、少なくとも初心者がぱっと見てなんとなくわかる情報がないなぁ」ということでした。そして、一番問題かなと思ったのが「古い情報と新しい情報が混在しすぎ」ということ。たとえば、今のRailsの最新バージョンは2.2.1で、推奨されるデータベースはSQLite3なのに、まだまだWeb上だとMySQLとか多いですし・・・。一番ぱっと見たなかで役にたったのはRuby on Rails 2.0アプリを1分で作る :ITproだったりします。

次はサイロスさんによるニコニコ技術部関西勉強会でネギを振らせてみた。めっちゃ行きたかったんですが、いろいろ都合が合わず泣く泣く断念しました。FPGAとかすげー見たかったです。内容はライブコーディングでMiyakoからネギをふらせるという(何にネギを降らせるかは言わずもがな)。ライブコーディングの難しさはいかにして空白の時間をつぶすことなのかなとふと思ったです。

続いて、Yuguiさんの「Ruby黒魔術入門」。いや、正式にはタイトルはないのですが、勝手にこんなタイトルにしてみました。話はほとんど分からなかったのですが、特異メソッドとか特異クラスとかでていたので個人的にまとめてみました。

class Foo
  def hello
    print "hello.\n"
  end

  #クラスメソッド、これはインスタンスを作らなくても
  #(つまりnewで作らなくても)表示可能
  def self.show
    print "this is test sentence.\n"
  end

end

Foo.show         #1

foo = Foo.new
foo.hello          #2 

#上で定義したfoo (foo = Foo.new)のみのhelloメソッドを変更する
#元のFooのメソッドは変更しない、このfooは特異クラスとなる
class << foo
  attr :name, true
  def hello
    print "hello. I'm ", @name, ".\n"
  end
end

foo.name = "Tom"
foo.hello          #3

#このhogeの出力はhelloのみとなる
hoge = Foo.new
hoge.hello         #4

#ここで特異メソッドを追加する
def hoge.hello2
  print "hello2\n"
end

hoge.hello         #5
これを実行すると以下のようになります。
[kazunori-s@wonder60] $ ruby test.rb                                                       
this is test sentence.   #1
hello.                          #2
hello. I'm Tom.            #3
hello.                         #4
hello2                        #5

そもそも、特異メソッドや特異クラスの「特異」とは一般的には、普通と特に異なっているという意味です。わかりやすくいうと、「おまえだけ特別扱いしてやるぜ、ぐへぐへ」という感じです。

まず特異メソッドから。これはクラスのあるインスタンスを特別扱いする(特別なメソッドを追加することで)という意味です。#4ではFooのインスタンスhogeのメソッドhelloを実行してます。ここで特異メソッドであるhello2を追加、つまりこのhogeを特別扱いしてあげます。すると#5ではメソッドhelloの結果がhello2になりました。

次にクラスメソッドです。これはクラスの特異メソッド、つまりクラスを特別扱いするということになります。実際にはどんなインスタンスであっても処理してほしい内容をメソッドとして定義することです。メリットとして、インスタンスを生成しなくてもこのクラスメソッドは実行可能です。それが#1の結果となります。

最後に特異クラス。これは特異メソッドの拡張と思えばいいのかな。特異メソッドはあるクラスに対してメソッドの追加(実は同じメソッド名もOK、その場合上書きされる)が可能ですが、この特異クラス機構を使うことでインスタンスを通じて元のクラス自体を一時的に変更しちゃうという荒技です。#2は元のクラスFooでしたが、#3ではクラスに変数としてnameを追加、さらにメソッドhello内でnameを表示させるようにしました。

ただ、特異クラスは相当に黒魔術らしくあんまり推奨されてないですが、知識として知っておくのは悪くないかなと思います。特異メソッドやクラスメソッドはまだ使い道があるでしょうが、さすがに特異クラスをそうばんばん使う状況はないでしょうし(つーかクラスの設計見直せよ、って感じですが)。特異クラスについてはohai日記なんかが詳しいかと思います。

最後に初級者向けレッスン。今回のネタはもう何回目になるかわからないけどよく見たTDD。さすがにテストもそれなりになれてきました。ただやっぱり思うのは、これをゲームプログラミングに導入するのは難しいのかなと。あと、例外が未だに分かってないσ(`ε´) オレだめすぎ・・・。

******************************************************************

原付で会場に行っていたので懇親会をキャンセルして(四条を原付で彷徨うのは怖すぎなので)、営業再開した「夢を語れ」というラーメン屋に行ってきました。やっぱここのラーメンはたまーに無性に食べたくなる味です。1回食べたら2~3ヶ月は食べようとは思わないけど。

投稿者 mak : 2008年9月21日 21:11

トラックバック

このエントリーのトラックバックURL:
http://sorakaze.net/cgi-bin/blog/mt-tb.cgi/136

コメント

google-code-prettifyを導入したので、だいぶソースが見やすくなったと思います、はい。

投稿者 mak : 2008年9月23日 17:03

コメントする