名古屋Ruby会議02 LT:Ruby中級への道

65
Ruby 中級への道 NAGOYARubyKaigi02 2011/02/26 @suchi (Hamamatsu.rb)

description

初級を抜け出すためにやったこと、「Ruby逆引きレシピ 232」「リファクタリングRuby」「メタプログラミングRuby」の面白かったところをお話させていただきます。

Transcript of 名古屋Ruby会議02 LT:Ruby中級への道

Page 1: 名古屋Ruby会議02 LT:Ruby中級への道

Ruby中級への道

NAGOYARubyKaigi022011/02/26

@suchi(Hamamatsu.rb)

Page 2: 名古屋Ruby会議02 LT:Ruby中級への道

suchihttp://www.suchi.org/

Ruby Lv: 初心者→中級?好きなメソッド: Object#tap

好きなrubyist: @m_seki好きなSNSDメンバ: TaeYeon

好きなアジャイルプラクティス: ありのままの進捗を計測好きなXPプラクティス: 計画ゲーム

好きなもの: 似てるもの

Page 3: 名古屋Ruby会議02 LT:Ruby中級への道

Hamamatsu.rb?

http://hamamatsu-rb.github.com/

3/9 Kickoff

Page 4: 名古屋Ruby会議02 LT:Ruby中級への道

Rubyレベル

Page 5: 名古屋Ruby会議02 LT:Ruby中級への道

NGRK01

Page 6: 名古屋Ruby会議02 LT:Ruby中級への道

「好きなメソッドはyieldと書きたかったんで

すが」http://www.youtube.com/watch?v=o8Y3mHpPAlE 02:35

Page 7: 名古屋Ruby会議02 LT:Ruby中級への道

yieldは

メソッドではなく

Page 8: 名古屋Ruby会議02 LT:Ruby中級への道

初心者から抜き出るには

Page 9: 名古屋Ruby会議02 LT:Ruby中級への道

いま風なのは

• 遅延評価勉強法(@amachang)

• つまみ食い勉強法

• パラシュート法

(野口悠紀雄「『超』勉強法」

http://d.hatena.ne.jp/amachang/20080204/1202104260

Page 10: 名古屋Ruby会議02 LT:Ruby中級への道

がこれまでを振り返ると

Page 11: 名古屋Ruby会議02 LT:Ruby中級への道

K&REffective C++/STL

Page 12: 名古屋Ruby会議02 LT:Ruby中級への道

ソフトウェア作法Software Tools

Page 13: 名古屋Ruby会議02 LT:Ruby中級への道

MachProgramming

Page 14: 名古屋Ruby会議02 LT:Ruby中級への道

Scheme

Page 15: 名古屋Ruby会議02 LT:Ruby中級への道

本日の水木サン

Page 16: 名古屋Ruby会議02 LT:Ruby中級への道

WindowsAPIMFC

Page 17: 名古屋Ruby会議02 LT:Ruby中級への道

XP

Page 18: 名古屋Ruby会議02 LT:Ruby中級への道

CODECOMPLETE

Page 19: 名古屋Ruby会議02 LT:Ruby中級への道

身についたのは全部

つまみ食いフルコース

Page 20: 名古屋Ruby会議02 LT:Ruby中級への道

Why?

Page 21: 名古屋Ruby会議02 LT:Ruby中級への道

高野豊rootから/への

メッセージ

http://www.amazon.co.jp/dp/4756107869

Page 22: 名古屋Ruby会議02 LT:Ruby中級への道

「管理者になるからにはBSDのmanは全部

読め」

Page 23: 名古屋Ruby会議02 LT:Ruby中級への道

ゲーテ

言わなくていいことをわざわざ言っちゃう人

(最近再ブレイク)

Page 24: 名古屋Ruby会議02 LT:Ruby中級への道

世界はお粥で出来ているのではない怠けてぐずぐずするな

堅いものなら噛め

二つに一つしかないのだ世界に負けて喉が詰まるか

それとも自分の力で消化するか

あこがれを持って、強く希求し、そしてそのためにどれほど膨大なコツコツが必要であるかに溜息をつきながら、投げ出さないで続けることって、難しいことですが、すごく豊かになれますよ(id: inflorescenciaさん)

http://d.hatena.ne.jp/inflorescencia/20071027/1193498546

Page 25: 名古屋Ruby会議02 LT:Ruby中級への道

amazonのペゾスさん

Page 26: 名古屋Ruby会議02 LT:Ruby中級への道

「PCや携帯電話、PDAのようなネットワークツールが普及することで、情報の断片的な収集(情報のつまみぐい)に慣れてしまい、長時間集中して本を読まなくなってきている」といった主旨のことを語ったという。また、「Kindleによって、そうしたことからの脱却を図りたい」とも述べていたという。

http://bizmakoto.jp/makoto/articles/1102/16/news013.html

Page 27: 名古屋Ruby会議02 LT:Ruby中級への道

戦略

• 基本からしっかり

• 重箱の隅ではなく全体感/体系

• 全部読む–時間がない?→トイレで読む

• (でもドライブする仕組みがあるといい)

Page 28: 名古屋Ruby会議02 LT:Ruby中級への道

たのしいRuby 2007/11/27-04/27Webアプリスーパーサンプル

2009/07/01-08/01

Rubyレシピブック268

2008/08/30-10/07 逆引きRails(2回目) 2009/10/22-12/20

Railsレシピ183 2008/10/07-10/16 Ruby逆引きレシピ232 2009/12/23-01/29

AWDwR 2008/11/17-03/03 Head First Rails 2010/03/23-04/05

一日でわかるRails 2009/01/07-01/10 Railsデプロイ 2010/04/08-04/21

Railsレシピ 183 2009/01/15-03/29 RailsOfRubyOnRails 2010/04/17-05/16

初めてのRuby 2009/03/30-04/16リファクタリングRubyエディション

2010/05/17-07/07

逆引きRails 2009/05/08-06/22メタプログラミングRuby

2010/09/07-11/20

Page 29: 名古屋Ruby会議02 LT:Ruby中級への道

アクティヴィティ

• 表紙から索引、後付まで全部読む

• レシピ本を全部読む

• 逆引き本を最初から読む ← オススメ!

– 中身忘れてもインデックスができる

• バーンダウンチャートでドライブ! ←オススメ!

• 社内Wikiに載せる

• トイレで読む

Page 30: 名古屋Ruby会議02 LT:Ruby中級への道

バーンダウンチャート

Page 31: 名古屋Ruby会議02 LT:Ruby中級への道

トラウマ

Page 32: 名古屋Ruby会議02 LT:Ruby中級への道

計るもの

• 残ページ数

• ユニット数

– レシピ番号

– 逆引き番号

• 10日毎に予測線←オススメ!

• あまり関係ない

– 消化ページ数

– 平均進捗/ここ10日の進捗

Page 33: 名古屋Ruby会議02 LT:Ruby中級への道

消化ユニット

残ユニット

Page 34: 名古屋Ruby会議02 LT:Ruby中級への道

1/1の予測ライン

1/10の予測ライン

Page 35: 名古屋Ruby会議02 LT:Ruby中級への道

脱初心者向け面白かった本

Page 36: 名古屋Ruby会議02 LT:Ruby中級への道
Page 37: 名古屋Ruby会議02 LT:Ruby中級への道

はじめに(Martin Fowler)

Page 38: 名古屋Ruby会議02 LT:Ruby中級への道

Q.オリジナルを持っているのにこの本も

必要なのか?

Page 39: 名古屋Ruby会議02 LT:Ruby中級への道

たぶんいらないだろう

Page 40: 名古屋Ruby会議02 LT:Ruby中級への道

ゲーテ

Page 41: 名古屋Ruby会議02 LT:Ruby中級への道

例: タイプコードの除去

• ふるまいをタイプコード(switch文等)で切り替えているコード

• オブジェクト指向(ポリモーフィズム)を理解していない場合が多い

• 重傷な場合は、クラスのタイプIDを取得してswitch文で振り分けていたり

Page 42: 名古屋Ruby会議02 LT:Ruby中級への道

本家リファクタリング

Page 43: 名古屋Ruby会議02 LT:Ruby中級への道

a.クラスによるタイプコードの置き換え

b.サブクラスによるタイプコードの置き換え

c.State/Strategyによるタイプコードの置き換え

Page 44: 名古屋Ruby会議02 LT:Ruby中級への道

Rubyエディション

Page 45: 名古屋Ruby会議02 LT:Ruby中級への道

a.クラスによるタイプコードの置き換え

b.タイプコードからモジュールのextendへ

c.State/Strategyによるタイプコードの置き換え

Page 46: 名古屋Ruby会議02 LT:Ruby中級への道
Page 47: 名古屋Ruby会議02 LT:Ruby中級への道

他にも

• モジュールの抽出

• テンプレートメソッドの作成

–モジュール版

• クラスアノテーションの導入

• 名前付き引数の導入

Page 48: 名古屋Ruby会議02 LT:Ruby中級への道
Page 49: 名古屋Ruby会議02 LT:Ruby中級への道

メタプログラミングRuby

Page 50: 名古屋Ruby会議02 LT:Ruby中級への道

クラスアノテーション導入によるリファクタリング

module CustomInitializers

def hash_initializer(*attribute_names)

define_method(:initialize) do |*args|

data = args.first || {}

attribute_names.each do |attribute_name|

instance_variable_set

"@#{attribute_name}", data[attribute_name]

end

end

endm

end

Class.send :include, CustomInitializers

class SearchCriteria...

hash_initializer :author_id, :publichsr_id, :isbn

end

Page 51: 名古屋Ruby会議02 LT:Ruby中級への道

クラスメソッド

class MyClass

def self.my_method;

:

end

end

def MyClass.my_other_method

:

end

Page 52: 名古屋Ruby会議02 LT:Ruby中級への道

これはどういうこと

class MyClass

class << self

def class_method;

:

end

end

end

Page 53: 名古屋Ruby会議02 LT:Ruby中級への道

クラスメソッドはClassの

特異クラスの特異メソッド

Page 54: 名古屋Ruby会議02 LT:Ruby中級への道

オープンソースのコードを読んで面食らうこと

ボブが易しく解説

Page 55: 名古屋Ruby会議02 LT:Ruby中級への道

• 「初めてのRuby」

– 他言語からの移行者に特にオススメ!

– 第8章は、筆がすべっている!

• クラスとオブジェクトとモジュールの難しい関係

– メタプログラミングRubyを読んで

• →Rubyを理解する上で重要なところだったのか!

Page 56: 名古屋Ruby会議02 LT:Ruby中級への道

Object Module

ClassMyClass

Obj1

Obj2

Obj3

super class

super class

super class

class

class

class

class

classclass

class

Page 57: 名古屋Ruby会議02 LT:Ruby中級への道

ActiveRecord

Page 58: 名古屋Ruby会議02 LT:Ruby中級への道

ActiveRecordで定義したクラスPersonを探す

Page 59: 名古屋Ruby会議02 LT:Ruby中級への道

Object.const_defined?(:Person) #=> false

Object.const_get(:Person) #=> Person

# ここで定義されるObject.const_defined?(:Person) #=> true

Page 60: 名古屋Ruby会議02 LT:Ruby中級への道

うっかりClassを調べると

Page 61: 名古屋Ruby会議02 LT:Ruby中級への道

>> Class.ancestors>> Class.ancestors

=> [Class, ActiveSupport::Dependencies::ClassConstMiss

ing, Module, ActiveSupport::Deprecation::ClassMethods,

ActiveSupport::Dependencies::ModuleConstMissing, Active

Support::CoreExtensions::Module, Object, PP::ObjectMixin

, ActiveSupport::Dependencies::Loadable, InstanceExecMet

hods, Base64::Deprecated, Base64, Kernel]

Page 62: 名古屋Ruby会議02 LT:Ruby中級への道

わかること

• メソッドはどうやって探すの?

• Procとlambdaの違いは?

• では聞くが、クラスとはいったいなんなのだ?

• 自己記述コード

Page 63: 名古屋Ruby会議02 LT:Ruby中級への道

異様に楽しい

Page 64: 名古屋Ruby会議02 LT:Ruby中級への道

副作用

def foo

proc { puts "hello" }

end

foo.call

foo.class #=> Proc

Page 65: 名古屋Ruby会議02 LT:Ruby中級への道

まとめ

• 脱初心者にはフルコース– (不器用なのでそれしかやり方を知らない)

• バーンダウンはドライブする• 逆引き本オススメ• 「リファクタリング:Ruby Ed」

– 言語の使い方がわかる

• 「メタプログラミングRuby」– Rubyである意味がわかる。

• 応用例は30分後!

• 中級は理解する楽しさ