100.times { Asakusa.rb.meetup! }
April 12th, 2011
我らがAsakusa.rbのたぶん100回目ぐらいのmeetupを記念して、4月10日の日曜日に大江戸Ruby会議01なるちょっとしたカンファレンスが開催された。
でもって、えらそうに基調講演してきた。
とりあえず資料はこちら。タイトルが動かなさげだったりしたのをこっそり直したりちょっと写真を増やしたりと、若干バージョンアップしています。
それから動画はこちら。大江戸KaigiFreaksの皆さん(1名だけど)、迅速な仕事をありがとうございます。
100.times { Asakusa.rb.meetup! } / @a_matsuda from ogi.
内容については、思い返してみるに我ながらだいぶえらそうで感じ悪いんだけど、通算100回のコミュニティ活動を通して感じたことや考えたことのエッセンスを、あまりパーソナル過ぎないような形で言語化して伝えようとしてみたつもり。
なんだけど、予定された基調講演で予定どおり登壇するのはたぶん初めてだった(2010年のRubyKaigiで代打の基調漫談ならやったけど)というのと、Keynoteのリモコンがうまく繋がらなかったこともあって、ちょっと舞い上がってしまってうまく話しきれなかった部分もあるので、以下少々キーワードごとにちょっとだけ補足していこうと思う。
・「Asakusa.rbは勉強会じゃありません」
これはまぁ割と最初からブレずに言い続けてることなんだけど、つまり、勉強するだけの勉強会はそろそろ卒業しようぜ、という意図。
偉大な先達である高井さん(新婚)の「勉強会に勉強しに来るヤツは素人」とのお言葉どおり、勉強会に参加して何が一番おもしろいって、いわゆる「懇親会」だよね。じゃあ本編が全部まるごと懇親会みたいなのをやったらもっと面白いじゃん、と思って。
「勉強したい人は来るな」は、勉強会に勉強だけしに行きたいタイプの人はたぶんAsakusa.rbには向いてないから来ないほうがいいよ、という意味。
最近のAsakusa.rbの日常は数式で表すとまぁおおむね
meetup = 勉強会 - 勉強 |
みたいな感じになってるよね。
・「セミナーじゃないんでお客さんはご遠慮ください」的な
これって前にも誰かがもっと上手に言ってたよなぁ、と思って今ぐぐってみたらかくたにメンバーだった。ああ、そうか、『Life Hacks PRESS』で読んだのか。
・メーリングリストが「えー」な件
これはたぶん僕がメールとかチャットとかの読み書きがあんまり好きじゃないからで、ぜんぜん関係ないけど今住んでるマンションの理事会の副理事長とかやってて今週末はマンション飲み会をやったりとか(オレ幹事)夏には神輿を担いだりする(今年は自粛…)んだけど、これがほんとの「地域コミュニティ」ってやつで、こっちなんかメーリングリストすらないわけよ。でもって、地震が起こった時なんかは誰からともなく管理人室に集まって対策会議が始まったりする。
要は、物理的な距離感とインターネットへの依存度はおおよそ反比例するわけで、どうやらインターネットがあまりうまくない僕みたいなのは地域コミュニティぐらいが性にあっているようだ。
・「仲間を集めろ」
これはやっぱりすごく重要なわけで、単に◯◯.rbとかノリで名乗ってみてTwitterで微妙につぶやいてみたりしてATNDだかで適当に告知しといたらまほうみたいにたのしいなかまがぽぽぽぽ〜ん、なんて都合のよろしいことはあるわけなくて、コミュニティの旗揚げ時のメンバーの取捨選択みたいなところは特に慎重にグッとパワーをかけて行うべきところだと思う。例えば会社を作るときと一緒、って言えばなんとなくわかってもらえるだろうか(会社なんて作ったことないけど)。
たとえば麻雀で卓にひとりシロウトが混じったらゲーム全体が一気につまんなくなっちゃうのと一緒で、なにか特別な目的意識を持ち寄ったりしてる人だけが集まったらそれがなにかクオリティにつながると僕は信じている。で、実際にそれをひと足お先に実現しちゃっているのが Seattle.rb だよね。
・「仲間」
それにしても、僕みたいな一般人がコミッタの皆さんなんかを捕まえて「仲間」だとか言っちゃうのはもちろんとっても畏れ多いことなんだけど、「Ruby : Rails」「開発者:ユーザー」の垣根を超えて2つのコミュニティが歩み寄ってリアルなコミュニケーションの場を形成する、という目的のためにはコミッタの皆さんのご助力がどうしても必要なファクターだった。
と思っていたら、旗揚げに付き合ってくださって以来ずっと面倒を見てくださっている顧問の先生のようなささださん、いつも持参の焼酎を飲みながらRubyを書きに来てくださるなかださん、いつもgdgdでダメダメな僕らに的確なツッコミと細やかな気配りをしてくださるなひさん、毎度予告もなしに気軽に遊びに来てくださるまつもとさん、さらには卜部さん、成瀬さん、うささん、ゆうぞうさん、といった、何を訊いても何でも知ってて答えてくださる化物のような面々の揃った、世界にも類を見ない、本当にひどいメンツ(いい意味で)の集まるコミュニティになってしまった。
こんなスーパーバンドにいちプレイヤーとして在籍していられる一介のRailsプログラマーなんて絶対浅草以外の世界中どこに行っても存在し得ないわけで、自分は本当に信じられないぐらい恵まれた境遇にいるなぁ、としみじみ思う。
ちなみに、この「2つのコミュニティ」の分断、っていうのは、思うに”the Rails Invasion”という急激な変化に伴って形成されたひずみであって、我々はそれを少しでも平たくしていくためにはどういう行動を取ればいいんだろうか、みたいな話は次にどこかで何かの折にしゃべる予定。興味があったら聴きに来てください。
・最後に
当たり前だけどいちおう言っておくと、僕はべつに他の勉強会やコミュニティのあり方をdisる気とかはまったくなくて、「僕の」コミュニティはこういう心意気でやってます、というのを100回目を機にご紹介というか自慢しただけ。
“SOCIAL CODING”な今の時代、プログラマーが人とかかわらずに生きて行くことは難しい。そんな中、みんなそれぞれ自分にあったコミュニティを探せばいいと思うし、見つからなければ自分のコミュニティを作ればいいと思う。少なくとも今のRuby界には居心地のいい居場所がきっとある。
Community.find_or_create!
|
今回のお話が、そんな皆さんのこれからのコミュニティ活動の一助になれば幸いです。
浅草ではRuby 1.9.1を使ってます
February 23rd, 2009
先週行われたOSC Tokyo 2009/Springの日本Rubyの会のコマで、3週間ほど前にリリースされた新しいRuby、Ruby 1.9.1について、Ruby 1.9コンサルタント(自称)としてお話をしてきた。
浅草ではRuby 1.9.1を使ってます
資料はこちら。
今回は新機能などをいちいち細かく紹介するのはやめて、もっとざっくりと全体像をなるべくユーザーの視点から語ってみることにした。
つまり、今あなたがRuby 1.9.1をダウンロードしてインストールして毎日のスクリプティングに使い始めると何が嬉しいのか?何が楽しいのか?どんな良いことがあるのか?というのがメインテーマ。
事実、僕自身は毎日Ruby 1.9を使っていて非常に楽しい思いをさせてもらっているし、この機会にその楽しさをみんなに伝えたい、と思ったのだが、それって、何か理由を一つ挙げるとすると何故なんだろう?と考えてみると意外に説明が難しい。
で、僕なりに考え直してみた結果が、EnumeratorがどうしたとかVMがどうしたとかそういう難しいところじゃなくて(そういうのはささだ先生にお任せして)、「新しいことはいいことだ」で語った内容だと思う。
(以下、デンパ注意)
“Ruby”は人類の英知の結晶だ。”Ruby”は単にいちプログラミング言語の名前であるのみならず、僕らプログラマーが世の中をもっと良いものにしていく社会的ムーヴメントだ。
Rubyは、プログラミング言語としては必ずしもコンピューターサイエンス的な意味で最高に高度なものではないかも知れないが、どこかの大企業が自社製品を売り込むための思惑が込められているわけでもなければ、誰かの気まぐれな思いつき「だけ」で成り立っているわけでもなく、その代わりに、ユーザーがもっと楽しく、もっと豊かにプログラミングができるようにしたい!というみんなの想いがこれ以上ないぐらい高い密度で凝縮されてできている。
(特に太平洋の向こう側に住んでいる)一部の心ないRailerたちが過去のRubyの一部を切り取った”Ruby 1.8.6”という言語にしがみつこうとしているとかいうような話もあるようだが、おそらく彼らの曇った目にはRubyが”ちょっと仕事を便利にしてくれるプログラミング言語”というぐらいにしか映っていないのだろう。
でも僕らはそうじゃない。今たまたま日本に生まれてプログラマーという人生を選んでRubyという言語に出会ったおかげで、僕らはこの魔法のかかったムーヴメントの真っただ中に身を置くことができる。新しいRubyが毎日作り出されていく奇跡を肌で感じることができる。
さらに、何かしらの形で自分なりのアウトプットを先っちょのほうに投げ込んでみることによって、自分の中の何かがそんな魔法を作り出すエネルギーに変わって世界中を幸せにできたりするかも知れない。この”Ruby”という、世界中を巻き込みつつ未だかつてない規模で進行している「祭り」にリアルタイムで遭遇したというこのチャンスにあなたも参加しないなんてもったいない!
これが、あなたが今すぐにRuby 1.9.1を使い始めるべき最大の理由だ。
というようなことを語ろうと思ったけど、朝イチで眠かったし、ちょっと宗教じみてるかなー、とか思って自重してしまったっていうのもあったし、あと満員御礼(笑)で若干テンションが下がった、ってのもあって、ちょっと電波力を抑えすぎてしまったかな、と今では反省している。次の機会があったらもっと本気で電波出すことにしよう。
とにかく、あれを聞いて一人でも「Ruby 1.9.1をインストールしてみたよ!」とか「Asakusa.rb入りたい!」とか言ってくださる人が居たらいいなぁ。
仙台Ruby会議01
January 30th, 2009
仙台RubyKaigi01に参加した。仙台は、牛タンだけじゃなくて海の幸もすこぶるウマい素敵な街だった。
で、「Rails 2.3(もしくはMerb)で5分で作るトランプゲーム(仮)」というタイトルでLTした。とりあえず資料は以下。
ほんとうはRails 2.3というフレームワークの上で動くネットワーク対戦型トランプゲームフレームワーク、というという題材で、いかに業務ロジックを再利用可能なメタなフレームワーク部分とRubyっぽいDSL(Rails的な意味で)に分けて設計/実装できるか、というのが当初の構想で、いちおうその後の懇親会で見せたとおり、そのためのデモアプリも完成してはいたんだけど、素振りしてみたらこんなのを5分でデモを交えつつ喋るのはぜんぜんムリ、ということがわかったので、急遽方針変更してデモはばっさり落としてしまった。
結局、単に「メタとベタ」というフレーズ(1週間前のRails勉強会の懇親会で福井さんから聞いた)が使いたかっただけなんちゃうか的な感じになっちゃって、ちょっと内容が薄かったかな、と反省。
ちなみに、この問題のスライドだけど、

これは自分で書いたわけじゃなくて、「会社を紹介するスライドをなんかください」って会社の人に言ったらこんなのが出てきた、という。
そんなわけで、もう一度言っとくけど、
どうやらT&Fカンパニーという会社でフェロー(笑)をやってることになってます。
よろしくお願いします。
あと、「トランプゲーム」そのものをえらく楽しみにしててくださった方もいたようで、
『トランプの「ト」の字もでてこなかったじゃないかー』
と、あとで大場nay3にお叱りを受けてしまった。どうもすいません。
いちおう、そっちのほうはもうちょっとコードが整理できたらGitHubに上げとくので、興味がある方は是非ご覧ください。
楽天テクノロジーカンファレンス2008でLTしてきました
December 10th, 2008
2008/11/29に行われた 楽天テクノロジーカンファレンス2008 (updated081216 リンク先更新)内で開催した Rails勉強会@東京第35回 のLT大会で
Rails 2.2のi18nライブラリ、 i18n_generators についてLTしてきた。
自分の資料作りに追われて皆さんの発表がじっくり聞けなかったのはちょっと残念だったかも。
それと、発表がトリだったので、そのまま会場にACアダプタを忘れて帰ってしまったのだが、ちゃんと楽天さんの技術部の中の人が保管してくださっていて、無事に手元に戻ってきた。楽天さんはいい会社です。生ビールも飲めるし。
で、以下LTの資料。Rails 2.2の日本語化とかそこらへんのご興味のある方はご覧ください。というような内容でもないか。
第2回Asakusa.rb
August 4th, 2008
7/26(土)、 第2回Asakusa.rbが開催された。
今回は、 隅田川花火大会 の真っ最中に 花火会場のほど近くにお住まいのメンバー のご自宅にて開催、という、とっても夏の浅草「らしい」集いになった。
結局花火に夢中で、肝心のhackの方は全然はかどらなかったわけだが、まぁたまにはそういうのもアリなんじゃないでしょうかね。
そんなわけで、 まとめはこちら 。
今回は、前回よりも一層、「Rubyの凄い人」と「Railsの濃い人」がそれぞれ集まったようなメンバーで、 「RubygemsってやつをRuby 1.9から標準添付にしてるんだけどそんなもの使ったことないよ」っていう人 と 「Rubygemsは毎日使ってるけどRuby 1.9から標準添付になったなんて知らなかった」っていう人 が異文化コミュニケーションを果たすことができたというのは、これもまたAsakusa.rbの活動のひとつの大きな狙いだったりするので、個人的にはけっこう満足だったりする。
それから、今回のもうひとつ大きな収穫と言えば、「Rubyのおかしな挙動を見つけたらどんどん Redmineに上げちゃっていいよ」と Rubyコミッターチームに言っていただけたこと。
そんなわけで、とりあえず前回同様に最新版のRubyでも再現したSEGVの件について Redmineに報告しておいた 。
今回のこれのおかげで、今後の進め方がひとつはっきり見えてきたような気はする。
つまり、日頃いろんな関わり方でRubyを使っている多彩なメンバーが集まって、あちこちからYARVを突っついていじめて、とにかくたくさんバグを出して、片っ端から Redmineに報告する、というだけでも、立派な成果と呼べるものになるんじゃないだろうか?
ただ、それにしてもこのチケットはあまりに大雑把すぎて非常にいただけないので、次からはもうちょっときちんと切り分けができるようになりたい、というあたりは課題かな。
ちなみに、このとき明かされた舞波さんの新しいプラグインの構想が、超life changingで革命的すぎる一品だった!
あれさえあれば、Rails 2.xのあのダサかっこ悪い respond_toブロックがウルトラセクシーな記法に大変身!
心待ちにしておこう。
と思っていたら来た!
http://blog.s21g.com/articles/697
・・・けど、 致命的な問題 が><
ん〜、惜しい!
ファンの皆様、引き続きmaiha先生の新作にご期待ください!
Rails 2.2の I18nについてくわしく
July 27th, 2008
第31回Rails勉強会@東京のセッション「Rails 2.2の I18nについてくわしく」の資料
●I18nモジュールとは
- ある日高橋会長のもとに舞い込んできたメール
- 2008年7月、Rails本体に取り込まれた
- Google groups
- Githubの I18nプロジェクト
- ウォッチしてたら svenfuchsさんからメールが来た!
- バージョンはまだ 0.0.1!
●ソース
github からこんな感じで検索してみる。
http://github.com/rails/rails/search?q=i18n&choice=grep
●重要そうなコミット
●基本機能
I18nというライブラリのクラスメソッドがいくつか提供されている。
>> [I18n.local_methods - Object.methods] => [["append_features", "backend", "backend=", "default_exception_handler", "default_locale", "default_locale=", "exception_handler=", "l", "locale", "locale=", "localize", "normalize_translation_keys", "populate", "store_translations", "t", "translate"]] |
デフォルトの localeは en-USになっている。
>> I18n.locale => "en-US" |
ja-JPに変更してみる。
>> I18n.default_locale = 'ja-JP' |
詳しくはソースで。
●ソースの読みどころ
- I18n gemの本体
activesupport/lib/active_support/vendor/i18n-0.0.1/ 以下 - 基本的な操作とか
activesupport/lib/active_support/vendor/i18n-0.0.1/lib/i18n.rb - vendor/rails/activerecord/lib/active_record/validations.rb
●機能その1. translate
翻訳メソッド。
>> I18n.t 'hoge' => "translation missing: ja-JP, hoge" >> I18n.t 'hoge', :default => 'ほげ' => "ほげ" |
>> I18n.store_translations :'ja-JP', :hoge => 'ホゲ' => {:hoge=>"ホゲ"} >> I18n.t 'hoge' => "ホゲ" >> I18n.t 'hoge', :default => 'ほげ' => "ホゲ" |
●機能その2. localize
日付や時刻、お金のフォーマット
% lv vendor/rails/activesupport/lib/active_support/locale/en-US.rb |
I18n.backend.store_translations :'en-US', { :support => { :array => { :sentence_connector => 'and' } }, :date => { :formats => { :default => "%Y-%m-%d", :short => "%b %d", :long => "%B %d, %Y", }, :day_names => Date::DAYNAMES, :abbr_day_names => Date::ABBR_DAYNAMES, :month_names => Date::MONTHNAMES, :abbr_month_names => Date::ABBR_MONTHNAMES, :order => [:year, :month, :day] }, :time => { :formats => { :default => "%a, %d %b %Y %H:%M:%S %z", :short => "%d %b %H:%M", :long => "%B %d, %Y %H:%M", }, :am => 'am', :pm => 'pm' } } |
●サンプルアプリを作ってみる
- ja-JP.rbという名前のファイルを $RAILS_ROOT/lib/locale/ に配置する。
自分で作るのはめんどくさいので gettext-railsからパチっちゃえ。
たぶんこんな感じで。
% cp vendor/rails/activerecord/lib/active_record/locale/en-US.rb lib/locale/ % cp /opt/local/lib/ruby/gems/1.8/gems/gettext-1.91.0/po/ja/rails.po lib/locale/ % fgrep '%{fn}' rails.po | ruby -e 'puts STDIN.read.gsub("msgid ", "s/").gsub("\nmsgstr ", "/").gsub(/%\{fn\} ?/, "").gsub(/$/, "/")' > trans.sed % sed -f trans.sed en-US.rb | sed s/en-US/ja-JP/ > ja-JP.rb |
- application_controller に以下の filterを設定
before_filter :set_locale def set_locale locale = params[:locale] || 'ja-JP' I18n.locale = locale I18n.populate do require "lib/locale/#{locale}.rb" end end |
- つついて遊んでみる
Rails勉強会@東京31ぽじぺ
July 27th, 2008
Rails勉強会@東京30 - what's new in Rails 2.1 セッションまとめ
July 25th, 2008
5月に行われた前回(第30回)Rails勉強会@東京では、ふりかえりの際に 『次回から「前回の勉強会のまとめ」を開催告知Wikiページに載っけるようにしてみよう』という Tryが挙げられていた ので、第30回の時にやった「what’s new in Rails 2.1 セッション」のまとめを。
と言っても、2ヶ月も前のことを今更思い出せるわけないので、以前 GoogleDocsに揚げたやつ をそのまま貼るだけなんだけどね。
なので、以下の内容はあくまでも「2ヶ月前の最新情報」であり、現在の最新情報とは違うかもしれないのでご注意ください(以下こぴぺ)。
what’s new in Rails 2.1 セッション
セッション中に即席で書いてるんでだいぶいい加減な内容です。すみません・・・
■ネタ元
Rails2.1について情報が載ってそうなところあれこれ。
- Ryan’s Scraps
http://ryandaigle.com/tags/Edge%20Rails - redemption in a blog
http://blog.codefront.net/category/ruby-on-rails/ - GitHub
http://github.com/rails - Lighthouse
http://rails.lighthouseapp.com/dashboard - Trac
新しいバグは全て Lighthouseに登録されるようになっているが、
旧バグの中にはまだこちらで生き残っているものもあり。
http://dev.rubyonrails.org/ - Riding Rails
A taste of what’s coming in Rails 2.1
http://weblog.rubyonrails.org/2008/4/1/a-taste-of-what-s-coming-in-rails-2-1
2.1 RC1 リリース告知
http://weblog.rubyonrails.org/2008/4/30/rails-2-1-release-candidate-is-imminent - Ruby on Rails: Core
http://groups.google.co.jp/group/rubyonrails-core - Rails Envy
http://railsenvy.com/ - Railscasts
http://railscasts.com/ - 松田ぽじぺ@Rails東京29
http://docs.google.com/Doc?id=ddn3rmd_11gx4t2cjg - 松田ぽじぺ@Rails東京30
http://docs.google.com/Doc?id=ddn3rmd_12ddzcw4q3
■Rails Edgeを cloneしてみよう
今のところ、Rails 2.1系を触ってみるには、以下のような方法がある。
- RC1を使う
% rake rails:freeze:edge |
zipで固められた最新ソースの玉を落として解凍してくれるように変更されたらしい
(たぶん Gitがまだ充分に普及していないから(?))。
が、zipファイルを上げる運用はまだ運用が開始されていない模様。
- piston
pistonが Gitに対応してくれたらこれが一番ラクかも。
- gitコマンドで
% rails edge_080518 % cd edge_080518/rails % git clone git://github.com/rails/rails.git |
■Rails2.1の新機能たち
主立ったものを列挙してみます。これまた当日に思い出しベースで書いているので網羅はできてない気がしますが。
- named_scope
昨秋登場した has_finder という life changingなプラグインが本家に取り込まれた。
個人的には、おそらくこれが Rails2.1の最大のウリなんじゃないかと(詳しくは後述)。
http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality
http://pivots.pivotallabs.com/users/nick/blog/articles/284-hasfinder-it-s-now-easier-than-ever-to-create-complex-re-usable-sql-queries
- has_one :through
関連テーブルを挟んだ has_one 関連がエレガントに書ける機能。
http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-one-through
- ARのレコードに dirty object機能
save時に発行される update文を、変更されたカラムのみを対象にすることができて、うまく使えばパフォーマンスの向上が見込まれる。
さらに、変更前のオリジナルの値も保持してくれている。
ADO .Netの DataTableにあったようなあの機能という理解で良いかと。
http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects
http://dev.rubyonrails.org/changeset/9157
http://blog.codefront.net/2008/04/05/living-on-the-edge-of-rails-14-the-extreme-edition-extremely-late/
http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-partial-updates
- AR#create にブロックを渡せるように
ブロック内部を returning的に書ける文法が追加された。見た目がRubyっぽく書けて嬉しいかも?
http://github.com/rails/rails/commit/dd120ede53eaf71dee76894998a81626b7a689fc
- migrationファイルのファイル名が連番じゃなくてタイムスタンプに
http://ryandaigle.com/articles/2008/4/2/what-s-new-in-edge-rails-utc-based-migration-versioning
- schema_infoテーブル → schema_migrations という新テーブル
- Railsプロジェクトに依存している gemを設定できるように
http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies
- RAILS_ROOT → Rails.root, RAILS_ENV → Rails.env
http://dev.rubyonrails.org/changeset/9180
- ActiveModel
2.1には正式に入るのかも?
- TimeZone機能
rake time:zones:*
|
→ 非US系開発者から若干反感を買ってる模様(以下のコメント欄など参照)。
http://rails.lighthouseapp.com/projects/8994/tickets/195-convenience-methods-for-time-zones-outside-the-u-s
- javascript_include_tag とかの :defaults を自分で再定義できるように
http://blog.codefront.net/2008/03/20/living-on-the-edge-of-rails-12/
- ドキュメントがすごい勢いで充実中
- Ruby1.9 / 1.8.7 対応
実はこれが一番嬉しい変更、という人も多いかも。
1.9系のメソッドたちは ActiveSupportと激しくかぶるので、ActiveSupportにかなり修正が入っている。
- インフラの変化
Subversion → Git
Trac → Github
Trac → Lighthouse
- script/plugin install が Gitのリポジトリに対応
- script/dbconsole
上記のとおり。
http://github.com/rails/rails/commit/4a07103687084496b773e18a03b1f2f5e686f7ad
(※懇親会で喋ってて思い出したので追記)
- ARで connection pool の実装が開始
http://groups.google.co.jp/group/rubyonrails-core/browse_thread/thread/16851dd787844a34/e89e9c741f89227e
■ named_scopeを詳しく
以下、セッション中にデモで書いたコード +α をいちおう載っけておきます。
もう終わった勉強会のぽじぺを見る人って居るんかな?とは思いつつ・・・
- Railsアプリを生成して Edge Railsを取得
手順は上記のとおり。
- こんな感じのいいかげんな modelを一丁 generate
% ./script/generate model person name:string age:integer gender:integer % rake db:migrate |
- サンプルデータを何件か作って、
>> Person.create :name => 'person 1', :age => 20, :gender => 1 >> Person.create do |p| >> p.name = 'person 2' >> p.age = 30 >> p.gender = 2 >> end >> Person.create :name => 'person 3', :age => 3, :gender => 1 |
- named_scopeをあれこれ作ってみる
class Person < ActiveRecord::Base # Hashで conditions。基本形。 named_scope :male, :conditions => {:gender => 1} named_scope :female, :conditions => {:gender => 2} # Stringで conditions。 named_scope :adult, :conditions => 'age >= 20' # Procで scopeを定義した形。例がへぼくてすいません。 named_scope :name_start_with_p, lambda { {:conditions => ["name like ?", 'p%']} } # Proc方式だと scopeに引数も渡せる。 named_scope :older_than, lambda {|n| {:conditions => ['age >= ?', n]} } # さっきのへぼい例もこれなら実用的。 named_scope :name_start_with, lambda {|s| {:conditions => ["name like ?", "#{s}%"]} } end |
- 作ったnamed_scopeたちをつついて遊んでみる
>> Person.male Person Load (0.000603) SELECT * FROM "people" WHERE ("people"."gender" = 1) >> Person.adult Person Load (0.000596) SELECT * FROM "people" WHERE (age >= 20) >> Person.older_than(7) Person Load (0.000651) SELECT * FROM "people" WHERE (age >= 7) |
動いた。あれ?genderは予約語だったか?とか思いつつ。
こんな調子で、ちっちゃいクエリの断片をあらかじめ名前を付けて定義しておくことができる、というのが named_scope の基本機能。
これだけだと、昔 Javaが流行ってた頃に DAO って言われてたやつと何が違うの?と言われてしまいそうなところだが、
- なんと、ネストして呼び出した時のSQLの発行は一回だけ!
>> Person.female.adult Person Load (0.000494) SELECT * FROM "people" WHERE ((age >= 20) AND ("people"."gender" = 2)) |
とにかくこれがすごい。呼び出し側のコードの可読性がめちゃめちゃ高くてシビれる。
→ 流れるようなインターフェース(笑)
- そういえばセッションでは説明し忘れたけど、countとか書いても勝手にネストしてくれるよ。
>> Person.older_than(10).female.name_start_with('松').count SQL (0.000375) SELECT count(*) AS count_all FROM "people" WHERE (((name like '松%') AND ("people"."gender" = 2)) AND (age >= 10)) |
join とか sortとか、その他もろもろは今回は省略。
ちなみに、実はそのあたりは今でも盛んにコミットが行われているところなので、仕様もまだ多少揺れる可能性があるかも。
- named_scopeメソッドで作られるものたちの実体は?
>> pp Person.scopes {:male => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>, :name_start_with => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>, :female => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>, :adult => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>, :name_start_with_p => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>, :scoped => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>, :older_than => #<Proc:0x017ead50@/Users/matsuda/railstokyo/edge080518/vendor/rails/activerecord/lib/active_record/named_scope.rb:87>} |
こんな感じの、キー = 宣言した名前、値 = Proc のインスタンス、な Hash で保持されていることがわかる。
- これを踏まえて、よくある検索画面を想定して動的にクエリを組み立ててみる
さて、この named_scope機能が実際のアプリでどう使えるか、って考えてみると、
よくある検索画面みたいなやつで条件に含める項目自体が動的に変化するようなケースを
思いつくんじゃないだろうか。
つまり、どの scopeをクエリに組み込むか、というのを動的に選んでいきながら複雑なクエリを組み立てて、
最後に一発ドーンと実行するようなイメージ。
def self.search(params) exec_scopes = [] if params[:is_male] exec_scopes << [:male, nil] end if params[:age_min] exec_scopes << [:older_than, params[:age_min]] end # (中略) end |
おまけ
セッションでは上記のように書いて、こんな感じで実行したい scopeを配列とかに溜めて
evalか injectぐらいでガツッと実行してやるしかないよねー、みたいな説明をしておいたが、
Yuumiさんから「かなりぐちゃぐちゃなコードになりそう」
というようなご意見を頂いた。うーん。そうなんですよねー。
さて、そこらへんはその場でコードは書ききっていなかったので、以下参考までに実装イメージを。
※ 実装案1
つまりこういう文字列を組み立てて、
exec_scopes_string = exec_scopes.map {|s| "#{s[0]}(#{s[1]})"}.join('.') |
evalに食わせるという。
引数の型とか数とかまともにハンドリングしてないけどまぁ大体こんな流れで。
eval "Person.#{exec_scopes_string}"
|
※ 実装案2
injectでぐりぐり実行させる。
exec_scopes.inject(Person) {|p, s| scopes[s[0]].call p, *s[1]} |
やっぱりこっちのほうがイケてそうかなぁ。
ということで、案2のほうで実装してみたサンプルがこちら。
引数を複数取る scopeにも対応したかったので、例としてこんな scopeを追加して、
# 複数の引数。 named_scope :age_between, lambda {|from, to| {:conditions => ['age between ? and ?', from, to]} } |
検索を実行するメソッドをこんなふうに。
def self.search(params) exec_scopes = [] # [実行するスコープ, [引数の配列]] な配列 exec_scopes << [Person.scopes[:male], nil] if params[:is_male] exec_scopes << [Person.scopes[:older_than], params[:age_min]] if params[:age_min] exec_scopes << [Person.scopes[:age_between], [params[:age_between][0], params[:age_between][1]]] if params[:age_between] # あとは、こんな調子で他の paramsたちの解釈をずらずらと書く。ここでは省略。 # これが呼び出し部 exec_scopes.reverse.inject(Person) {|p, s| s[0].call p, *s[1]}.all end |
実行結果はこちら。
>> Person.search({:is_male => true, :age_between => [10, 30]}) Person Load (0.000518) SELECT * FROM "people" WHERE (("people"."gender" = 1) AND (age between 10 and 30)) |
ということで、とりあえずめでたく動作。
けっこうスッキリ書けたと思うが、でもこれは確かに書いた本人にしかわからないコードかも・・・
ポイントは便利メソッド injectの()内引数の使いかたと、最後にさりげなく書かれた .all(scopeが1個も使われなかった場合のデフォルトscopeになる)の工夫。
やっぱり Rubyはこんな書き方ができちゃうから面白い。
ただ、このあたりは需要がありそうなので、きっとフレームワークがもうちょっと親切な仕組みを提供してくれることでしょう。
第1回 VimMに参加してみた
July 22nd, 2008
第1回 VimM に参加した。
僕の場合、メインで使っているエディタは?と訊かれたら Vimと答えるけど今数えてみたらメインマシンの~/.vimrc が85行しかないぐらいのシロウトなので、まぁ色々と勉強になった。
実際、普段Railsで開発をしているぶんには Rails.vim にどっぷり依存してしまうので、あまりキーバインドをカスタマイズしてみるとかプラグインをいろいろ試してみるとか、っていう欲求があまり起こらなかったのだが(あと僕がやってる設定と言えば、Leopardの16色しか出ない残念なターミナルでも目が痛くならないような色の設定を頑張ってるぐらい)、これを機にもうちょっと Vimにまじめに取り組んでみても良いかもなぁ、と思った。
とりあえず、
- Spaceキーを活用するキーバインドは面白そう。
- vimperator 入れてみた。まだ慣れないけど、なるほど、クセになる味わいではあるかも。
あと、参加者の皆さんの年齢層がめちゃめちゃ低くてビックリした。これだけ世代を超えて愛されているというあたりに Vimが良いツールであることの証を見た気がする。それにしても、こんなシブい集まりで自分が若くない方に入るとは思わなかった。
そして、そんなオッサンにとって2日連続で飲み放題はかなりしんどい(福井さんともども昨日の Yugui飲み に引き続き。しかし福井さんもタフだなぁ)。
第1回Asakusa.rbの成果のご報告
July 17th, 2008
第1回Asakusa.rb のときに発見されて修正された Railsのバグをパッチにして投げてみたところ、
http://rails.lighthouseapp.com/projects/8994/tickets/623
そっこーで無事本体に取り込まれた。
http://github.com/rails/rails/commit/bb33432b0f5bf644713e696e4dafc7e7d3cc5808
ということで、さっそく成果が出たよ!めでたい!
なにしろこんなたった8文字書き加えるだけのパッチでも、僕一人ではどんなに頑張っても絶対に解決できなかったであろう、(僕にとっては)充分に高度な内容である。
そういう意味でも、みんなに集まってもらって会合を開いた価値はあったわけで、非常に喜ばしい。
しかし、エラーメッセージを一目見て解決してくださったのはささださんだし、
正しいデバッグの方法を指南してくださったのはgotoyuzoさんだし、
実際にキーボードを叩いてくださったのはかくたにさんだし1、
それ以前にネットにつなげてくれたのは cojiさんだし、
という具合なので、実は僕は何もやってないんだけど、
でもコミットは何故か僕の名前でクレジットされてて恐縮だ2。
そんな意味を込めてチケットの説明文には “We” って書いたんだけど、
でもなんの文脈もないので、「"We"って誰だよ?」って感じだよな。
そしてこれにて一件落着、かと思いきや、その直後にこんなアップデートが。
http://github.com/rails/rails/commit/3c282f3a0a7c1d5ab91241674251794ead5fa41d
なになに? uses more memory than eval with block ? そうなの?
Rubyは奥が深いなぁ・・・
1 このあたりについては かくたにさん的には何やらいろいろ言いたいことがあったらしい 。すみません><
2 しかも gitの configの user.name あたりの設定ができてなくて漢字でフルネームとかいって、恥ずかしすぎる><
第1回「詳解Objective-C 2.0」読書会
July 7th, 2008
「詳解Objective-C 2.0」の読書会第1回 に参加してきた。
読書会の詳解は こちら に詳しくまとめられているように、自分一人で読んでても絶対出てこないような色んな視点からの細かいツッコミがたくさん出てきて非常にためになった。
今回特徴的だったと思ったのは、参加者がとてもバリエーション豊かだったこと。
「Obj-Cを学びたい人」という緩い検索条件で集まったメンツだったからか、第1言語がJavaな人も組み込み系な人も居れば、学生さんも社長さんも居て、広島からの参加者もガイジン(自称)も居たりして、と、老若男女じつに様々な方が来られていた。
特に、 宮田さん や 木村さん などCocoa勉強会方面から来られていたパワーユーザの皆さんは、訊いたら何でも知ってるんじゃねぇか、というぐらい、どんな質問にもバシバシ答えてくださっていて、とってもありがたい存在だった。
今回は100%質問する側だったが、次までには自分ももうちょっと予習してきて多少は答える側に回りたいと思う。
それから、もう一つ今回ユニークだったのは、たまたまとは言え、僕の地元浅草で開催されたということ。
浅草で行われた技術系の勉強会なんてヘタすると史上初なんじゃないか?とか思いつつ、せっかくなので2次会は浅草らしく、 ogijunさんの提案 で皆さんを どぜうの飯田屋 にご案内した。
今はちょうどどぜうが子持ち状態で旬な季節だし(浅草では「三社のころが旬」と言われている)、ネギだくどぜう鍋は皆さんにもご好評を頂いたようで何よりだ。
というか、この手の懇親会やらオフ会やらって、どこに行っても同じようなチェーン店のつまらん居酒屋で飲むことが多くて、その点に関しては毎度たいへん物足りなく思っているんだが、それって僕だけだろうか?
今回みたいなご当地ならではみたいなスポットを原住民や現地案内人がチョイスする、っていうのを今後習慣化したらもうちょっと楽しみが増えるんじゃないかと思うんだがどうだろう?
The 8th night of JRuby Japanese Tour 2008
June 29th, 2008
来日中の JRuby の Charles Nutter のジャパンツアーの最後の思い出に、ということで何故かこんなひどい話がもちあがり、
http://twitter.com/ko1_twitter/statuses/844148049
アキバのメイド喫茶というやつに行ってきた。
店内は写真撮影お断りとのことだったので、残念ながらメイドさんと一緒にミートソースを「まぜまぜ」する
Charlesのかわいらしいお姿をここで公開することはできないが、
“maze maze” と “moe moe” の2単語はバッチリ覚えたよ!家に帰っても使うよ!
と嬉しそうにおっしゃっていたので、まぁお連れした甲斐があったというものだ。
よかったよかった。
あわせて読みたい:
JRuby Japanese Tour 2008 Wrap-Up!
Chad Fowler's KANJI Writing
June 27th, 2008
RubyKaigi 2008の会場で、 Chad Fowler にサインもらった!
しかも漢字で!

さて、今回の来日で Chad先生は3週間ぐらいご滞在で日本中あちこち観光して回っておられるようだが、
「東京ではどこに行きましたか?浅草とか?」って訊いたら、
「Osakusa?なにそれ?知らないなぁ」と言われたので、
思わず浅草の写真が載ってる僕のネームカードを渡そうとしたら、
なんとお返しに名刺を頂戴してしまった!

我が家の家宝にしよう。
New Wave of Database Programming with Ruby 1.9 on Rails 2.1
June 26th, 2008
New Wave of Database Programming with Ruby 1.9 on Rails 2.1 というタイトルで、
RubyKaigi 2008で LTした。とりあえず発表資料は こちら 。
(2008/07/01追記: そうか! slideshareなんだからそのまんま貼っちゃえば良いのか!
ということにようやく気づいて以下に貼った)
ところで、これがまたどうも何故か Java方面から思わぬ反応を頂いているようだ。
http://d.hatena.ne.jp/higayasuo/20080624/1214305064
違うよ><全然違うよ!!
Javaは僕にオブジェクト指向を教えてくれた思い出深い言語なので、ひがさんのとこのコメントにも
書いたとおり嫌いとか対立とか全く思ってもいないし、ていうかそもそもそんな後ろ向きな話題には
微塵も興味ないし。
そんなことより、僕が RubyKaigiの LTという競争率の高い貴重な機会を頂いてみんなに
訴えたかったのは、「 Javaなんてう××!! 」とかそんなんじゃなくて、スライドの一番最後。
Rails派のみんなももっと Ruby 1.9使おうぜ!
っていうこと。
僕の周りだけかもしれないが、なんか仕事で Rails使ってます。みたいな人に限って、
「Ruby 1.9って、まだ Railsまともに動かないんでしょ?
そんなの使えねーよ。正式に対応するようになってから使うわ」
って言ってる人が多くて、
「Rubyってあの Railsを動かすための言語 でしょ?」
とかって、あながちネタじゃなくてけっこう本気で思ってる人も居るような気がしてならない。
みんな Rubyがそこにあることが当たり前になりすぎて忘れちゃってるんじゃないだろうか?
思うに「言語」を作っちゃうなんて、どう考えてもめちゃめちゃ凄すぎると思う。
Ruby-coreの皆さんは日本の宝、いや、人類の宝ですよ、ホントに。
しかも、Ruby 1.9は実に素晴らしい言語ですよ!
言語仕様だって1.8に比べても確実に良くなってるじゃん!
というのを LTではきちんとアピールしようと思ってたんだけど、
当日ギリギリに作ったスライドがかなりの枚数になってしまい、
結果として、その main ideaの部分に辿り着く前に時間切れで終わってしまった。
その後ささださんにも「Ruby 1.9の話が全然出てこなかったじゃーん」と
厳しくダメ出しをされてしまった。
どうやらささださんをはじめ、選考してくださった皆様を大いに失望させてしまったようで、
本当に不甲斐なく、情けない。
そんなわけで、Ruby方面の皆様には、絶対にいずれ僕なりにできる何らかの方法で、
恩返しをさせていただきたいと心の底から思う。
今に見てろよ。
RubyKaigi 2008
June 23rd, 2008
RubyKaigi 2008 が無事終わった。楽しかった。
とりあえずざっくりまとめ。詳細についてはあとで書く。
- 生 Chad Fowler と喋った。名刺ゲット & 漢字でサインしてもらった!
- その他にも色々サイン本収集祭り。
- 0日目、1日目は Rails勉強会@東京ブースのブース番。
刷っていった紙 & 舞波CDもおかげさまで無事完売。
- 1日目ブース番してたらRamazeの人が来て「チケット持ってないから会場入れないんだよー」とか言ってた。
ちょうど xibbarさんがチケットを余らせていたので、xibbarさんにお願いして1枚プレゼントして差し上げた。
翌日も来られていた & Reject Kaigi で発表までしてもらえて、良かった良かった。
- 笹田研 すごいなぁ。おめでとうございます。
- 夜は3日連続で ビール会議 。普通じゃ絶対知り合う機会も無いようなすごい人とか遠い人とかいろんな人と飲んで話せた。
- MacRubyすげぇ
- Rails系セッションの座長をやった。
- Regional RubyKaigi@東京!





