Skip to content
yowasou edited this page Aug 13, 2023 · 10 revisions

[議事録]

  • 日付:2011年7月13日
  • 議事録担当:@tarya , @sasaki

AGENDA

  1. AGENDAの共有(by司会)
  2. 前回決めたTryの再確認
  • 過去の未解決質問を検討する時間があってもいいかもしれない
  • コードを事前に用意してほしい
  • 議事録を二人以上で書いてみる
  • 一回は発言する
  1. 初参加者の自己紹介
  2. メタプログラミングRuby読書会
  3. 発表
  • @mackatoさん「浜松Rails3道場 Active Record編(多分)」
  • @kiwofusiさん「Rails勉強会とかAsakusa.rbみてきた話とかを5分でおしゃべりします」
  1. KPT(最後の15分)
  2. 次回の予告と担当割り振り

初参加

  • @w1mvy 松本さん (@sea_mountain さんのご学友)
    • メタプログラミングを勉強していきたい

範囲:第4章 木曜日: クラス定義

疑問点と議論

  • p.145 コラム ・@@vが定義されているときのカレントクラスはObject ・クラス変数はサブクラスからアクセス可・ゆえにMyClassからObjectの@@vにアクセスできる、というのは理解できたのですが、「クラス変数はクラスではなく、クラス階層に属している」の意味がわかりませんでした(suchi)

    • クラス変数は、定義されたクラスを派生したクラスでも参照できるし変更できる。ここで「クラス階層に属している」という表現を使っているのは、クラスインスタンス変数とは違うということを言いたいのではないかと思われる。
      • クラスインスタンス変数: 定義されたそのクラスでしか参照できない
      • クラス変数: 定義されたクラスを派生したクラスでも参照できる
  • p.147 真ん中あたり「class_eval()...を使って、プライベートな @time_class 変数にこのクラスを割り当てる」のclass_evalを使った場合はどう書く?(mackato)

    • class_eval と instance_eval の違いは?
    • どちらも同じ動作をするようだが、オブジェクトに対しては instance_eval しか使えない
    • Loan をオブジェクトとしての視点で見るときは、instance_eval を使い、クラスの視点で見るとき(オープンクラスを使いたいとき)は class_eval を使う
class Loan
  def initialize(book)
    @book = book
    @time = Loan.time_class.now
  end
  
  def self.time_class
    @time || Time
  end
  
  def to_s
    '#{@book.upcase} loaned on #{@time}'
  end
end

class FakeTime
  def self.now; 'Mon Apr 06 12:15:50'; end
end

require 'test/unit'

class TestLoan < Test::Unit::TestCase
  def test_conversion_to_string
    Loan.class_eval { @tine_class = FakeTime }
    Loan = Loan.new('War and Peace')
    assert_equal 'WAR AND PEACE loaned on Mon Apr 06 12:15:50', loan.to_s
  end
end

ここで、class_eval を instance_eval に書き換えても、そのまま動く

  • p.150 Object.singleton_methods #=> 特異メソッドを配列で返す

  • p.153 class_definisions/attr.rbのコードで、def my_attribute=(value)の部分で、my_attributeに=が付いている理由(これで起こる処理?)。

    • "my_attribute=" までがメソッド名
    • オブジェクトの属性に対する代入が目的のメソッド名は = を使う。(C# のプロパティの setter と同じで = がメソッド名に付く)

例として、以下のようなメソッド定義では、d.foo = "hoge" というように = を使うことができない。

 class D
   def foo(value)
     @foo = value
   end
 end
  • p.158 「特異クラスとinstance_eval()」 「instance_evalを呼ぶことでカレントクラスをレシーバの特異クラスに変更する」の意味がわからなかった(suchi)

    • 普通はその方法では使わないと言う事を主張するための文意があるのだろうか
    • instance_eval もカレントクラスを変更するのだが、一般的にその目的で使うことはない。
    • よって、instance_eval の意味として「self に変更を加えたい」という認識で問題ない
  • 「4.6 エイリアス」 aliasとModule#alias_method() の使い分けは必要? (suchi)

    • 別にわざわざ用意されている意味は何だろうか?
    • 動的にエイリアスを作りたいときは、キーワードを使えないので Module#alias_method() が用意されている
  • 4.7 クイズ:壊れた計算

    • 演算子のオーバーライド
      • というメソッドを自分で定義するとどうなるだろうか
 class Foo
   def +(value)
     puts value; value
   end
 end
 
 Foo.new + "hello"
 => hello
 
 Foo.new + "hello" + " world"
 => hello world
  • 再定義できない演算子
= ?: .. ... ! not && and || or ::
  • 演算の優先度を変更できないだろうか
    • => できなそう
  • groovy のエルビス演算子(?:)は定義できるだろうか
    • => ? が再定義できない為無理

クイズ

発表「浅草とゾンビ」(kiwofushi)

  • Asakusa.rb

    • rubykaigiのプログラムみて雑談
    • 身内感があった
    • 勉強会というよりコミュニティとしての雰囲気が強い
    • Ruby会議
    • 「Ruby でつくるOS」がすごいらしい
  • Rails For Zombies

    • インタラクティブな Rails 学習サイト(http://railsforzombies.org/)
    • チームの一体感の形成の為ふりかえりを行う
    • リラックスが大事
    • 勉強会開催場所(静大月曜日11時から)

発表「浜松 Rails3 道場 其の2 Model 編」(mackato)

  • wiki の仕様

    • ユーザ認証・ページ履歴確認・ページ作成
  • 参考

    • Ruby on Rails Guides
  • バージョン

    • ruby 1.9.2
    • rails 3.0
  • サンプルコード

    • GitHub
  • 環境

    • FactoryGirls:テストデータ作成 => ruby のコードでテストデータを作成
    • Spork:テストの高速化
  • 実装モデル

    • User
    • Page
    • Comment
    • History
  • 各モデルの実装手順

    1. モデルの作成
    2. Factory
    3. Spec (参照: http://jp.rubyist.net/magazine/?0032-TranslationArticle)
      • 条件によってスペックの前にコンテキストを追加
 describe "ClassName" do
   describe "#method_name" do
     context "条件" do
       it "テスト内容" do
  1. モデルクラス
    • SexyValidation
    • scope
  2. 各モデルの関連付け
  3. テスト実行
  • 開発終了時

    • 作業内容を master にマージ
    • 作業後のコードが GitHub にある
  • モデルについて補足

  • Migration(データベース構造の管理)

    rake db:migrate
    rake db:rollback
    rake db:migrate:redo
  • Validations(データ検証)
    Validation Helpers
    Sexy Validation
  • Associations(データ関連)
    belongs_to
    has_one
    has_many
    has_many :through
  • Query(データ検索)
    Finder methods
    Retrieving a Single Object
    Retrieving Multiple Object
    Calculations
  • ※ 遅延評価に注意
    • Page.limit(10).count #=> 11
    • Page.limit(10).all.count #=> 10
    • 実際にクエリを実行させてデータをフェッチさせそれからカウントを取る

質問

  • ActiveRecord でテーブルの項目が内部で動的に作られていると思うが、それをオーバーライドして別のメソッドを作りたい
    • 同名の setter を作成して上書きしていいのかどうか
    • アクセサメソッドの挙動・仕様が明示的で無くなるのであまりやらない方がいいかもしれない

ruby 複数バージョンの管理

  • Linux, Mac だと RVM
  • Windows だと PICK

KPT

Keep

  • dojo のクオリティやばい
  • 浅草・ゾンビの発表がよかった
  • 色々なツールを知るきっかけになる
  • LTがあった
  • dojoのスライドきれい
  • dojo復習
  • dojo説明丁寧
  • dojoレベル高い
  • 議事録は2人だと good(片方が話していてもOK)

Problem

  • GitHubの使い方が分からない
  • 初心者にはきつい
  • コードはDLしてくる
  • メタプロ難しい
  • メタプロ質問ない
  • 予習しないとダメです ついていけません
  • メタプロRubyの日本語変
  • ATNDのアンケート結果知りたい
  • 発言少なめ
  • テストがちゃんと書けない

Try

  • 開催場所を変えてみる
  • ATND 価値のあるアンケート
  • メーリングリストで宣伝
  • メタプロRubyの日本語のリファクタリングが必要
  • コードのカラーを変更(Rails3道場)
  • メタプロのあとのあり方を相談したい(浅草ゾンビを受けて)
  • いろいろ試したい
  • LT希望(内容未定)
  • Git本
    • ハマノさんのGit本オススメ → 入門Git(今見たらレビュー点数が低くてしょんぼりです。 @ke_tachibana)
    • Pro GIT オンラインで読める

次回の予告と担当割り振り

  • 告知(ATNDとか): tarya
  • モデレータ: 清水さん
  • 打ち込まー: ke_tachibanaさん
  • 議事録er: チェさん, kiwofusiさん
  • LT: arfyasuさん

フィードバック

  • (勉強会終了後のフィードバック記事)
Clone this wiki locally