後援:サンマイクロシステムズ株式会社 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で分からないことなど 相談できる仲間がいます • メーリングリストにご参加ください 参加方法は配布資料をご覧ください • みなさん、おつかれさまでした
© Copyright 2024 ExpyDoc