Rails初心者講習会 Rubyist九州 あらいしゅんいち 後援:サンマイクロシステムズ株式会社 Rubyistはひらがな (cc-by) 2007 ARAI Shunichi
本日の予定 レクチャー前編 (30分くらい?) Rails実習 (3~4時間くらい) レクチャー後編 (20分くらい) Rubyの紹介
講師紹介 あらいしゅんいち (新井俊一) 29歳 独身 未踏ソフトウェア創造事業経験者 Rubyによりxcream.netを開発・運営 動画ダウンロードサイト 独自フレームワークにより開発 Railsによりpodcastle.jpを共同開発
Rubyとは まつもとゆきひろ氏が作成した オブジェクト指向汎用スクリプト言語 Perlとオブジェクト指向をベースとして Lispなどのよさを積極的に取り入れた 美しく楽しい強力な言語
Ruby on Railsとは Webフレームワーク なぜRubyで作ったのか なぜ話題なのか David Heinemeier Hansson作 Web Applicationを作るための仕組み なぜRubyで作ったのか 美しいコードが書ける言語だから なぜ話題なのか 少ないコード、少ないSQLで書けるから
Rubyist九州って? 福岡を中心に毎月集まっている Rubyのユーザーグループ 話したい人が話したい話題やネタを 持ち寄って話す Railsの話題やruby/tkなど 参加者募集中です
Rubyはなぜ良いの? 使い慣れた文法 (手続き型) 強力な文法 (抽象化) シンプルなライブラリ Perlに近い、CやJavaとも似ている オブジェクト指向 関数型 シンプルなライブラリ PerlやUNIXを基本とした使いやすさ Rubyのユーザーグループなので、しばらくRubyの宣伝をします
Perlより美しい文法 *Perl – TIMTOWDI? *Ruby @a = (1,2,3); print $a[1] . "\n"; print $b->[1] . "\n"; print @$b[1] . "\n"; 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 文字列配列 Case文 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
Railsの特徴 強力なデータベース操作機能 一通りの機能がいっぺんに揃う 少ないコード量、少ない設定の量 強力なマーケティング(笑) 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) レスポンス
書籍に沿って実践 Let’s roll InstantRailsはインストール不要! 第5章から第10章 できれば11章も RailsによるアジャイルWebアプリケーション開発 InstantRailsはインストール不要! zipファイルを解凍してどこかに置けばOK 第5章から第10章 できれば11章も Let’s roll
書籍に沿って実践 Depotアプリケーション 5章 アプリケーションの仕様、開発手法 いまここ 6章 タスクA: 商品の管理 7章 タスクB: カタログの表示 8章 タスクC: カートの作成 9章 タスクD: チェックアウト(注文)! 10章 タスクE: 発送 11章 タスクF: ユーザ管理 12章 タスクT: テスト 14:00- 14:30- 15:00- 15:30- 16:00- 16:30- 17:00- 付録E - migrate 目安
migration 余裕があればmigrateも ruby script/generate model hogehoge 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 def self.down drop_table :articles
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") { 100.times { Article.find(1) } bm.report("find_by_sql") { Article.find_by_sql(["select * from articles where id = 1"]) bm.report("connection") { Article.connection.execute("select * from articles where id = 1") user system total real find 0.161000 0.030000 0.191000 ( 0.331000) find_by_sql 0.180000 0.031000 0.211000 ( 0.340000) connection 0.120000 0.000000 0.120000 ( 0.291000)
ベンチマーク結果 (作成) Benchmark.bmbm { |bm| bm.report("create") { 100.times { Article.create(:title => "hoge") } bm.report("connection") { 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を使うこと findやfind_by_sqlは以下のように <%=h @product.name %> findやfind_by_sqlは以下のように find(:conditions=>[”name = ?”,name]) find_by_sql([“select * from product where name = ?”,name]) “name = #{name}”と書いたらやばい!
Rubyist九州 毎月、今泉で例会を開催中 Railsで分からないことなど 相談できる仲間がいます 第2か第3の土曜日にやってます Railsで分からないことなど 相談できる仲間がいます メーリングリストにご参加ください 参加方法は配布資料をご覧ください みなさん、おつかれさまでした