rails_koshukai

後援:サンマイクロシステムズ株式会社
Rails初心者講習会
Rubyist九州
あらいしゅんいち
Rubyistはひらがな
(cc-by) 2007 ARAI Shunichi
本日の予定
• レクチャー前編 (30分くらい?)
– Rubyの紹介
– Railsの紹介
• Rails実習 (3~4時間くらい)
• レクチャー後編 (20分くらい)
– Rails利用における注意点など
講師紹介
•
•
•
•
あらいしゅんいち (新井俊一)
29歳 独身
未踏ソフトウェア創造事業経験者
Rubyによりxcream.netを開発・運営
– 動画ダウンロードサイト
– 独自フレームワークにより開発
• Railsによりpodcastle.jpを共同開発
Rubyとは
• まつもとゆきひろ氏が作成した
オブジェクト指向汎用スクリプト言語
• Perlとオブジェクト指向をベースとして
Lispなどのよさを積極的に取り入れた
• 美しく楽しい強力な言語
Ruby on Railsとは
• Webフレームワーク
– David Heinemeier Hansson作
– Web Applicationを作るための仕組み
• なぜRubyで作ったのか
– 美しいコードが書ける言語だから
• なぜ話題なのか
– 少ないコード、少ないSQLで書けるから
Rubyist九州って?
• 福岡を中心に毎月集まっている
Rubyのユーザーグループ
• 話したい人が話したい話題やネタを
持ち寄って話す
• Railsの話題やruby/tkなど
• 参加者募集中です
Rubyはなぜ良いの?
• 使い慣れた文法 (手続き型)
– Perlに近い、CやJavaとも似ている
• 強力な文法 (抽象化)
– オブジェクト指向
– 関数型
• シンプルなライブラリ
– PerlやUNIXを基本とした使いやすさ
Perlより美しい文法
*Perl – TIMTOWDI?
@a = (1,2,3);
print $a[1] . "\n";
$b = [1,2,3];
print $b->[1] . "\n";
print @$b[1] . "\n";
 これはなんなんだ!?
*Ruby
a = [1,2,3]
puts a[1]
Javaより簡潔
*Java
FileInputStream fis = new FileInputStream("hello.txt");
InputStreamReader ir = new InputStreamReader(fis,"MS932");
BufferedReader br = new BufferedReader(ir);
うわっ
*Ruby
file = open("hello.txt","r")
Rubyの特徴 – ブロック
• 一連のコードをメソッドに渡せる
• 以下の例
– STDINオブジェクトのメソッドeach_with_index
• 行ごとにブロックを繰り返し呼び出す (通し番号付)
STDIN.each_with_index { |line,i|
print "#{i}: #{line}"
}
Rubyの特徴 – 強力な配列
*Java
int []a = {1,2,3,4,5}
for(i=0; i<a.length; i++) {
a[i] = a[i] * 2
}
*Ruby
a = [1,2,3,4,5]
a = a.map { |x| x * 2 }
Cool!
Ruby – その他の強力な文法
• arrayのhash
– a = {:taro => [1970,4,12],:hana => [1980,1,1]}
• 文字列配列
– %w{taro hanako jiro}.each { |a| puts a}
• Case文
– sex = case name
when /ro$/: :male
when /ko$/: :female
end
Web development that doesn’t hurt
Railsの特徴
• 強力なデータベース操作機能
– ActiveRecord
• 一通りの機能がいっぺんに揃う
– テスト機能も内蔵している
• 少ないコード量、少ない設定の量
– Convention over configuration
(設定より規約)
• 強力なマーケティング(笑)
Rails as a Webフレームワーク
• 役割
– ルーティング  Action Controller
• URLに従ってメソッドを呼び出す
– セッション管理  Action Controller
– HTML表示処理  Action View (erb)
– データベース操作  ActiveRecord
• O/R Mapping
ActiveRecord
•
•
•
•
Railsの肝?
DBのテーブル = 1クラスとしてアクセス
データベースの関連をたどれる
SQL無しで色々なことができる
db.select_one("SELECT * FROM users, groups WHERE
name = ? AND users.id = groups.user_id","arai")

User.find_by_name("arai").group
Railsの動作
リクエスト (/foo/hoge.html)
Action Controller (app/controllers/foo.rb) (メソッド hoge)
データベース (app/model/foo.rb)
Action View (eruby) (app/views/foo/hoge.rhtml)
レスポンス
書籍に沿って実践
• RailsによるアジャイルWebアプリケーション開発
• InstantRailsはインストール不要!
– zipファイルを解凍してどこかに置けばOK
• 第5章から第10章  できれば11章も
Let’s roll
書籍に沿って実践
• Depotアプリケーション
14:0014:3015:0015:3016:0016:3017:00-
–
–
–
–
–
–
–
–
5章 アプリケーションの仕様、開発手法 いまここ
6章 タスクA: 商品の管理
7章 タスクB: カタログの表示
8章 タスクC: カートの作成
9章 タスクD: チェックアウト(注文)!
10章 タスクE: 発送
11章 タスクF: ユーザ管理
12章 タスクT: テスト
目安
付録E - migrate
書籍 - 付録E
migration
• 余裕があればmigrateも
– migrateはDBの構築スクリプト
• ruby script/generate model hogehoge
– によってmigrateのひな形が作成
• rake db:migrate
– でmysqlにテーブルが作成される
• SQLを書かずにrubyでテーブル構築
Migrate (2)
class CreateArticles < ActiveRecord::Migration
def self.up
create_table :articles do |t|
t.column :title, :string
t.column :title_j, :string
t.column :body, :text
t.column :body_j, :text
t.column :created_at, :datetime
end
end
def self.down
drop_table :articles
end
end
Rails講習会 – 後編
もはや初心者ではないですよね
script/console
• irb (対話的Rubyコンソール)環境
• ActiveRecordでDB操作可能
• DBの管理運営や検査集計に
Ruby script/console
Loading development environment.
>> Product.find(1)
=> #<Product @attributes={“price”=>”100”}>
Rails実例
• 37signals
– Backpack
– Basecamp
• 国内事例
– Podcastle.jp
– myITPro
テストの作成・実行
• Rake test  テストの実行
• テストディレクトリ
– /test/unit
– /test/functional
• 単純なテストでも無いよりマシ
– Viewに対してgetして200 OKが返る
バッチ処理の記述
• /lib/tasksに.rakeファイルを作成
• rake tasknameで実行される
desc “processing data"
task :process_data => :environment do
establish_connection
HogeData.process
end
Railsの注意点
• 速度
– ついつい遅いコードを書いてしまう
– ActiveRecordがけっこう遅い?
• 更新
• 参照
• バージョンで動作が違う
• 覚えること、調べることが多い
– ふつうのRubyと違う
ベンチマーク結果 (参照)
Benchmark.bmbm { |bm|
user system total
real
bm.report("find") {
find
0.161000 0.030000 0.191000 ( 0.331000)
100.times {
find_by_sql 0.180000 0.031000 0.211000 ( 0.340000)
Article.find(1)
connection 0.120000 0.000000 0.120000 ( 0.291000)
}
}
bm.report("find_by_sql") {
100.times {
Article.find_by_sql(["select * from articles where id = 1"])
}
}
bm.report("connection") {
100.times {
Article.connection.execute("select * from articles where id = 1")
}
}
}
ベンチマーク結果 (作成)
Benchmark.bmbm { |bm|
bm.report("create") {
100.times {
Article.create(:title => "hoge")
}
}
bm.report("connection") {
100.times {
Article.connection.execute("insert into articles (title) values ('hoge')")
}
}
}
user system total
real
create
0.461000 0.010000 0.471000 ( 6.199000)
connection 0.100000 0.000000 0.100000 ( 6.099000)
セキュリティ上の注意
• 必ず守ること
– 基本的に表示時はhを使うこと
• <%=h @product.name %>
– findやfind_by_sqlは以下のように
• find(:conditions=>[”name = ?”,name])
• find_by_sql([“select * from product where
name = ?”,name])
– “name = #{name}”と書いたらやばい!
Rubyist九州
• 毎月、今泉で例会を開催中
– 第2か第3の土曜日にやってます
• Railsで分からないことなど
相談できる仲間がいます
• メーリングリストにご参加ください
参加方法は配布資料をご覧ください
• みなさん、おつかれさまでした