Ruby札幌 presents
RubySapporoNightvol.4
日本Rubyの会 / Ruby札幌島田浩二
アジェンダ✓ 自己紹介✓ RubyとRuby札幌✓ Ruby on Rails入門✓ RubyCocoa関連いろいろ✓ 予告
自己紹介
しまだこうじ(snoozer.05)✓ 普通のフリーランス・プログラマ✓ ‘06に独立し、武者修行中
✓ Rubyとの関わり✓ Ruby札幌運営✓ RubyKaigi2007当日スタッフ✓ るびま、るりま
✓ プログラミングの楽しさを皆さんと共有したい✓ 自分の知らないコトやヒトと出会いたい✓ http://iddy.jp/profile/snoozer05
しまだこうじ(snoozer.05)✓ 組み込みZineに記事を書きました✓ 読んで評価をいただけると嬉しいです✓ Cの話題ですが…
http://kumikomizine.jp/article/corner/10/
本日もどうぞよろしくお願いします
Ruby
Rubyとは✓ まつもとゆきひろ氏によって開発された動的オブジェクト指向スクリプト言語
✓ http://www.ruby-lang.org/ja/✓ 楽しく、簡単に、自然にプログラミングがコンセプト
✓ 柔軟かつアジャイルな開発を支援✓ A Programmer’s Best Friend
Ruby札幌
Ruby札幌とは✓ 札幌にてRubyに関するイベントや活動を行っているコミュニティ✓ “From Sapporo, With Love For Ruby.” ✓ Ruby勉強会@札幌✓ RubySapporoNight ✓ 開発集会@札幌✓ Ruby&Rails入門講座
本編
前回のRSNに参加いただいた方?
前回のRSN
AR特集
資料の作成はけっこう頑張った
機能の説明に終始しすぎて、魅力をうまく伝えられず
しょぼーん(́・ω・`)
どうしたらRubyやRailsの魅力をうまく伝えられるだろう
一昨日までの状況
http://noplans.org/product/t-shirt/
閃いた(11/27未明)
僕が好きな所に絞って説明したらなんとかなるかもしれない
ということでなんとか準備して参りました
ならなかったらごめんなさい
とりあえずいきます
今年最後のRSN
Ruby on Rails入門 - 番外編
2007-11-28RubySapporoNight-4
僕がRailsに惹かれた理由
たくさんあるので今日はそのうちの一つについて(汗
一つ
言語指向プログラミング
LanguageOriented
Programming
言語指向プログラミングとは?
Martin Fowler
http://www.martinfowler.com/articles/
DSLを使ってソフトウェア構築を行う一般的な開発スタイル
DSLDomain Specific Language
ドメイン特化言語
特定の問題領域の解決に特化してデザインされた言語
DSLとは問題に対して言語を最適化するアプローチ
言語内DSLと
言語外DSL
言語内DSLホストとなる言語とDSLが同じもの
言語外DSLホストとなる言語とDSLが異なるもの
RailsとDSL
RailsではRubyを拡張してDSLっぽく使っている
引用:「TODOを作りながら学ぶRailsチュートリアル」
Webに特化させてる故に書きやすい
引用:「TODOを作りながら学ぶRailsチュートリアル」
Webアプリ開発という問題領域に対する言語内DSLとしてのRails
プログラミングの面白さを改めて実感
具体例
簡単に4つほど
(1)
モデル間の関連をクラスメソッドで表現
class Host < ActiveRecord::Base has_many :eventsend
class Event < ActiveRecord::Base belongs_to :hostend
ruby_sapporo = Host.find(:first)ruby_sapporo.events.each do |event| puts event.nameend
(2)
データベースのマイグレーション
class CreateUsers < ActiveRecord::Migration def self.up create_table "users" do |t| t.column :login, :string t.column :email, :string t.column :created_at, :datetime t.column :updated_at, :datetime end end
def self.down drop_table "users" endend
(3)
データベース接続のためのアダプタ
ActiveRecord::Base.establish_connection( :adapter => “postgresql”, :host => “localhost”, :username => “foo”, :password => “bar”, :database => “rsn_development”)
(4)
ルーティング定義
ActionController::Routing::Routes.draw do |map| # You can have the root of your site routed by hooking up # '' -- just remember to delete public/index.html. map.connect '', :controller => "event", :action => "list"
# Allow downloading Web Service WSDL as a file # with an extension instead of a file named 'wsdl' map.connect ':controller/service.wsdl', :action => 'wsdl'
# Install the default route as the lowest priority. map.connect ':controller/:action/:id.:format' map.connect ':controller/:action/:id'end
Webアプリケーション開発に対するDSL的な工夫がたくさん
Railsの魅力
Rubyの表現力がパワー
DSLを支えるRubyの表現力
(1)
省略表記
メソッドの括弧を省略できるとか
class CreateUsers < ActiveRecord::Migration def self.up create_table( "users" ) { |t| t.column( :login, :string ) t.column( :email, :string ) t.column( :created_at, :datetime ) t.column( :updated_at, :datetime ) } end ...end
class CreateUsers < ActiveRecord::Migration def self.up create_table "users" do |t| t.column :login, :string t.column :email, :string t.column :created_at, :datetime t.column :updated_at, :datetime end end ...end
(2)
純粋なオブジェクト指向言語
シンボルや文字列もオブジェクト
ActiveRecord::Base.establish_connection( :adapter => “postgresql”, :host => “localhost”, :username => “foo”, :password => “bar”, :database => “rsn_development”)
(3)
ブロックのサポート
コンテキストをうまく表現できる
class CreateUsers < ActiveRecord::Migration def self.up create_table "users" do |t| t.column :login, :string t.column :email, :string t.column :created_at, :datetime t.column :updated_at, :datetime end end ...end
(4)
オープンクラス
標準クラスだって手を入れられる
大事なのは「問題」対「私たち」
DSLを支えるRubyの表現力
Rails以外にもあるよ
RubyでDSL
Rake
Rubyで作られたビルドツール
#settingTARGET = ‘hello’OBJ = FileList["./*.c"].ext("o")
#rakedesc "Build target."task :default => [TARGET]file TARGET => OBJ do sh "gcc ./#{OBJ} -o #{TARGET}"end
#rake cleanCLEAN.include("./#{OBJ}")CLEAN.include("#{TARGET}")
RSpec
プログラムの振舞を記述するためのDSLフレームワーク
describe Array, "when empty" do before do @empty_array = [] end
it "should be empty" do @empty_array.should be_empty end
it "should size 0" do @empty_array.size.should == 0 end
after do @empty_array = nil endend
Rubyの表現力
DSLの良いプラットフォーム
まとめ
DSLは問題に対して言語を最適化するアプローチ
問題領域=
人の考える領域
DSLとはプログラミング言語を人の思考に近づける
アプローチ
加えて言語内DSLだとプログラミング言語のパワーも引き継ぐことが出来る
良い例
Ruby On Rails
Webアプリケーション開発という問題領域に
対するDSL
Rubyの表現力がそれを支援している
DSLにのっかる楽しさ
DSLを作る楽しさ
RubyでDSLは面白い
皆さんも関心のある問題領域をRubyを使ってDSLってみませんか?
Ruby on Rails入門 - 番外編
2007-11-28RubySapporoNight-4
僕がRailsに惹かれた理由
RubyCocoa関連
✓ RubyCocoa 0.13.0 リリース✓ rucola 0.0.2 リリース✓ rubigen✓ newgem✓ RubyInject 0.1.0 リリース
RubyInject✓ mach_starをRubyで使えるようにしたもの✓ mach_star✓ 既存のシンボルを別のシンボルでオーバーライドできる
✓ 実行中のプロセスに任意のモジュールをロードできる
✓ PyObjCのobjc.injectのRuby版
RubyCocoa関連
✓ RubyCocoa 0.13.0 リリース✓ rucola 0.0.2 リリース✓ rubigen✓ newgem✓ RubyInject 0.1.0 リリース
予告
Ruby忘年会@札幌✓ 時:2007年12月23日(土)✓ 場所:札幌某所✓ 内容:✓ みんなで集まってワイワイ✓ もう少ししたらアナウンスします✓ 同時開催 : ✓ Ruby札幌ふりかえり
Ruby初め2008@札幌✓ 時:2008年1月2日✓ 場所:北海道情報大学札幌サテライト✓ 内容:✓ 2008年、どこよりも早い勉強会!✓ 高橋会長をお迎えしてお送りします!✓ 書き初め、読み合わせ、...etc✓ 待て!詳細
JPUG × Ruby札幌 合同イベント✓ 時:2008年2月16日(土)✓ 場所:エルプラザ大研修室✓ 内容:✓ Ruby界からは、かの角谷信太郎氏をお迎えして、RSpecを使ったテスト駆動開発入門「スはスペックのス~RSpecによるDeveloper Testingの紹介~」を行っていただく予定です!乞うご期待!
これからも真摯にRubyのことを伝えていければと思っています
2008年もRuby札幌をどうぞよろしくお願いします
ご清聴ありがとうございました
なにかご質問は?