Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

初めてのPadrino

6,158 views

Published on

日本OSS推進フォーラム主催 第4回アプリケーション部会勉強会 での発表資料

Published in: Technology

初めてのPadrino

  1. 1. 初めてのPadrino ~ Padrino を利用したWEBアプリケーション作成方法の紹介 ~ 日本OSS推進フォーラム主催 第4回アプリケーション部会勉強会 2014 年12 月11日 Takeshi Yabe ( @tyabe )
  2. 2. お話すること • 自己紹介 • 第1部 Padrino 概要 • 第2部 Padrino を使った開発の実践
  3. 3. Takeshi Yabe @tyabe - アプリケーションエンジニア - 主な担当はサーバサイド - Yokohama.rb, Shibuya.rb - Padrinoとの出会いは2011年頃
  4. 4. 第1部 Padrino 概要 Padrinoとはどういったものか(歴史・特徴)を説明しつつ、 Padrinoアーキテクチャの概説、特徴的機能等を説明します。
  5. 5. Padrino とは Ruby製のWebアプリケーションフレームワーク Webアプリケーションを手早く作るためのDSLである Sinatra のコードと設計思想をベースに、 Webアプリケーション開発でよく使われるであろう ライブラリやヘルパーメソッドなどを追加することで、 複雑なWebアプリケーション開発でも 利用可能なようにすることを目的としている
  6. 6. Padrino とは
  7. 7. Padrino とは Padrino はイタリア語、英語だと Godfather “シナトラ”で作られているから らしい…
  8. 8. Padrino とは Sinatra ベース コードだけではなく設計方針も => 使うときもコレが肝要
  9. 9. Sinatra “Sinatra is a DSL for quickly creating web applications in Ruby with minimal effort” http://www.sinatrarb.com/intro より引用 Sinatra はフレームワークではなく、 Webアプリケーション(Rackアプリケーション)を 手早く簡単に記述するためのDSL
  10. 10. Sinatra クラシックスタイル 1 require 'sinatra' 2 3 get '/' do 4 "Hello, sinatra!" 5 end モジュラースタイル 1 require 'sinatra/base' 2 3 class App < Sinatra::Base 4 get '/' do 5 "Hello, world!" 6 end 7 end 単体で使うシンプルなアプリならクラシックスタイル 他のRackアプリと一緒に使うならモジュラースタイル
  11. 11. Sinatra 簡潔であること 複雑性は必要になったときに追加
  12. 12. Sinatra シンプル!! だけど…
  13. 13. my-project ├── Gemfile ├── Gemfile.lock ├── Rakefile ├── app.rb ├── config │ └── database.rb ├── config.ru ├── db │ └── development.db ├── log │ └── development.log ├── mailer.rb ├── public │ ├── javascripts │ │ └── app.js │ └── stylesheets │ └── app.css └── views ├── index.slim └── layout.slim - ディレクトリ構造 - DBの設定 - ログの設定 - ヘルパーメソッド - HTMLエスケープ - セッション - テスト環境 - コンソールでの動作確認 - Rakeタスク - などなど ..楽したい! Sinatra
  14. 14. Padrino の歴史 nesquena が個人で開発 2009-10 : sinatra_more の開発がスタート 2009-11 : padrino の開発がスタート(0.1.0 -> 0.2.1) 2010-02 : sinatra_more が padrino への移行を表明 2011-12 : sinatra_more 最後のコミット … 2013-10 : 日本人が開発チーム入り(@namusyaka) 2014-02 : 0.12.0 リリース Ruby 1.8 のサポート廃止など大きめの変更 2014-04 : 0.12.1 リリース nesquena と、同僚だった DAddYE, achiu で開発 新しいルーター( pendragon ) を開発 dynamoid のサポート、cache_object helper の追加 2014-05 : 0.12.2 リリース Params Protection の追加 2014-08 : 0.12.3 リリース router, reloader, generator の改善 2014-10 : 0.12.4 リリース mounter が改善され、他のRackアプリのマウントが可能になった
  15. 15. Padrino の利用者
  16. 16. Padrino の主な機能 - ジェネレータ含むコマンドラインツール - サブアプリケーション - 他のRackアプリケーションのマウント - ルーティングの拡張 - MVC パターンの導入 - 豊富なヘルパーメソッド - 簡単なメール送信機能 - キャッシュ機能 - 国際化機能 - 他のライブラリと連携可能なロガー - 開発時のリローダー
  17. 17. Padrino の構成 Padrino Framework gen helpers support cache mailers admin core Sinatra
  18. 18. padrino-core
  19. 19. padrino-core Sinatra を拡張したベースアプリケーション PadrinoFramework の機能を全て使うことができる # lib/padrino-core/application.rb 1 module Padrino 2 class Application < Sinatra::Base 3 register Padrino::ApplicationSetup 4 register Padrino::Routing 5 register Padrino::ParamsProtection register メソッドによる Sinatra 拡張の登録 use メソッドによる Rack ミドルウェアの登録
  20. 20. padrino-core 追加される主な機能 - ルーティングの拡張 - サブアプリケーションとその他のRackアプリのマウント機構 - オートロード対象ディレクトリの設定 - 拡張されたロガー - 開発用のリローダー - コマンドラインツール ( start, stop, generate, console, runner, rake )
  21. 21. padrino-core 追加される主な機能 - ルーティングの拡張 - サブアプリケーションとその他のRackアプリのマウント機構 - オートロード対象ディレクトリの設定 - 拡張されたロガー - 開発用のリローダー - コマンドラインツール ( start, stop, generate, console, runner, rake )
  22. 22. padrino-core ルーティングの拡張(一例) 1 SampleProject::App.controllers :posts do 2 get :index do 3 # url(:posts, :index) => "/posts" 4 render 'posts/index' 5 end 6 7 get :show, map: '/posts/:id' do 8 # url(:posts, :show, id: 5) => "/posts/5" 9 render 'posts/new' 10 end 11 end 名前付きルート、テンプレートエンジンの自動検出
  23. 23. padrino-core 拡張されたロガー
  24. 24. padrino-gen
  25. 25. padrino-gen 新しいPadrinoプロジェクトの作成時や 既存のPadrinoプロジェクトへ 簡単にコードを追加することができるようになる - project - app - mailer - controller - helper - model - migration - plugin - component - task - admin - admin_page
  26. 26. padrino-gen 新しいPadrinoプロジェクトの作成時や 既存のPadrinoプロジェクトへ 簡単にコードを追加することができるようになる - project - app - mailer - controller - helper - model - migration - plugin - component - task - admin - admin_page
  27. 27. padrino-gen ( プロジェクト生成 ) Usage: padrino-gen project [name] [options] Options: -n, [--app=APP] -b, [--bundle], [--no-bundle] -r, [--root=ROOT] [--dev], [--no-dev] -i, [--tiny], [--no-tiny] -l, [--lean], [--no-lean] -a, [--adapter=ADAPTER] -p, [--template=TEMPLATE] -g, [--gem], [--no-gem] padrino プロジェクトで使う場合は $ padrino g project [--migration-format=MIGRATION_FORMAT] -d, [--orm=ORM] -t, [--test=TEST] -m, [--mock=MOCK] -s, [--script=SCRIPT] -e, [--renderer=RENDERER] -c, [--stylesheet=STYLESHEET]
  28. 28. padrino-gen ( プロジェクト生成 ) ORM、データベースアダプタ、テンプレートエンジン、 テスティングフレームワーク、モックライブラリ、 スタイルシートエンジン、JavaScriptライブラリ 必要なものだけを選んで使える ( 選ばなくても良い )
  29. 29. padrino-gen ( プロジェクト生成 ) $ padrino g project sample_project sample_project ├── Gemfile ├── Rakefile ├── app │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts ├── bin │ └── sample_project ├── config │ ├── apps.rb │ └── boot.rb ├── config.ru ├── log ├── public │ ├── favicon.ico │ ├── images │ ├── javascripts │ └── stylesheets └── tmp 13 directories, 8 files $ padrino g project tiny_project ̶tiny tiny_project ├── Gemfile ├── Rakefile ├── app │ ├── app.rb │ ├── controllers.rb │ ├── helpers.rb │ └── mailers.rb ├── bin │ └── tiny_project ├── config │ ├── apps.rb │ └── boot.rb ├── config.ru ├── log ├── public │ ├── favicon.ico │ ├── images │ ├── javascripts │ └── stylesheets └── tmp 9 directories, 11 files
  30. 30. padrino-gen ( コンポーネントの追加 ) Usage: padrino-gen component [options] Options: -n, [--app=APP] -r, [--root=ROOT] -a, [--adapter=ADAPTER] -d, [--orm=ORM] -t, [--test=TEST] -m, [--mock=MOCK] -s, [--script=SCRIPT] -e, [--renderer=RENDERER] -c, [--stylesheet=STYLESHEET] Description: padrino-gen component add components into a Padrino project Current Selected Components: orm none test none mock none script none renderer slim stylesheet none 必要になったときに 必要なものを追加できる
  31. 31. padrino-gen ( サブアプリケーション ) サブアプリケーションは モデルやライブラリを共通で使える $ padrino g admin $ padrino g app api sample_project ├── app │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts ├── admin │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts ├── api │ ├── app.rb │ ├── controllers │ ├── helpers │ └── views │ └── layouts └── public ├── admin │ ├── images │ ├── javascripts │ └── stylesheets ├── favicon.ico ├── images ├── javascripts └── stylesheets # config/apps.rb 1 Padrino.mount('SampleProject::Admin') 2 .to('/admin') 3 Padrino.mount('SampleProject::Api') 4 .to('/') 5 .host("api.example.org") 6 Padrino.mount('SampleProject::App') 7 .to(‘/') マウントの設定で、一致させるパスやホスト名を指定できる
  32. 32. padrino-admin
  33. 33. padrino-admin ユーザ認証付きの管理アプリが作成できるようになる $ padrino g admin
  34. 34. padrino-admin # config/apps.rb 1 Padrino.mount('SampleProject::Admin').to('/admin') 2 Padrino.mount('SampleProject::App').to('/') admin ├── app.rb ├── controllers │ ├── accounts.rb │ ├── base.rb │ └── sessions.rb └── views ├── accounts │ ├── _form.slim │ ├── edit.slim │ ├── index.slim │ └── new.slim ├── base │ └── index.slim ├── errors │ ├── 403.slim │ ├── 404.slim │ └── 500.slim ├── layouts │ ├── application.slim │ └── error.slim └── sessions └── new.slim 7 directories, 15 files 管理アプリはサブアプリケーションとして マウントする
  35. 35. padrino-admin
  36. 36. padrino-admin モデルに対応した管理ページを追加できる $ padrino g admin_page model
  37. 37. padrino-admin 管理アプリ用のヘルパーメソッドがいくつか追加される 1 module SampleProject 2 class Admin < Padrino::Application 3 register Padrino::Mailer 4 register Padrino::Helpers 5 register Padrino::Admin::AccessControl 6 7 set :admin_model, 'Account' 8 set :login_page, '/sessions/new' 9 10 enable :sessions 11 disable :store_location 12 13 access_control.roles_for :any do |role| 14 role.protect '/' 15 role.allow '/sessions' 16 end 17 18 access_control.roles_for :admin do |role| 19 role.project_module :posts, '/posts' 20 role.project_module :accounts, '/accounts' 21 end 22 23 # Custom error management 24 error(403) { @title = "Error 403"; render('errors/403', :layout => :error) } 25 error(404) { @title = "Error 404"; render('errors/404', :layout => :error) } 26 error(500) { @title = "Error 500"; render('errors/500', :layout => :error) } 27 end 28 end
  38. 38. padrino-helpers
  39. 39. padrino-helpers フォームやリンク、画像用のタグなど HTMLタグを生成するメソッドが使用可能になる # => link_to や image_tag などRails と同じようなメソッドが定義されている input_tag :text, class: “demo” #=> <input type='text' class='demo' /> テンプレートをレンダリングするためのメソッド ( render, partial ) が使用可能になる render ‘path/to/any/template' partial 'photo/_item', object: @photo, locals: { foo: 'bar' }
  40. 40. padrino-cache
  41. 41. padrino-cache テンプレートのレンダリング結果や 任意のオブジェクトの内容をキャッシュできるようになる 1 module SampleProject 2 class App < Padrino::Application 3 register Padrino::Cache 4 enable :caching 5 6 get '/foo', cache: true do 7 expires 10 8 Time.now.to_s 9 end 10 end 11 end キャッシュ機構のベースには Moneta が利用されており デフォルトで様々なキャッシュストアが利用可能となっている 1 Padrino.cache = Padrino::Cache.new(:LRUHash) # default choice 2 Padrino.cache = Padrino::Cache.new(:File, dir: Padrino.root('tmp', app_name.to_s, 'cache')) 3 Padrino.cache = Padrino::Cache.new(:Memcached, backend: memcached_or_dalli_instance) 4 Padrino.cache = Padrino::Cache.new(:Redis, backend: redis_instance) 5 Padrino.cache = Padrino::Cache.new(:Mongo, backend: mongo_client_instance)
  42. 42. padrino-mailers
  43. 43. padrino-mailers シンプルなインターフェースでメール配信が行えるようになる ファイルの添付やマルチパートも可能 ( Mail ベース ) 1 class App < Sinatra::Base 2 register Padrino::Mailer 3 4 set :delivery_method, smtp: { 5 address: ‘smtp.gmail.com’, 6 port: 587, 7 domain: 'your.host.name', 8 user_name: '<username>', 9 password: '<password>', 10 authentication: 'plain', 11 enable_starttls_auto: true 12 } 13 14 post :mail do 15 email do 16 from: "foo@example.com", 17 to: "bar@example.com", 18 subject: "Welcome!", 19 body: "This is test mail." 20 end 21 end 22 23 end 1 module Sample 2 class App < Padrino::Application 3 register Padrino::Mailer 4 5 set :delivery_method, :sendmail 6 7 mailer :sample do 8 email :welcome do 9 from "foo@example.com" 10 to "bar@example.com" 11 subject "Welcome!" 12 add_file "/path/to/someotherfile.png" 13 provides :html, :plain 14 render "sample" 15 end 16 end 17 18 post :mail do 19 deliver :sample, :welcome 20 end 21 22 end 23 end
  44. 44. padrino-support
  45. 45. padrino-support padrino をサポートするためのライブラリ集 String の拡張 ( colorize, pluralize ) や 国際化対応用のyamlファイルが置いてある # 一部のメソッドは ActiveSupport のものをそのまま利用している
  46. 46. まとめ
  47. 47. まとめ Padrino とは、 Sinatra の簡潔さを保ちつつ、 複雑なアプリケーション開発に必要となるような機能を 必要なときに付け加える事ができるようにした Webアプリケーションフレームワーク Agnostic ORMやテンプレートエンジンなどを自由に組み合わせ可能 Mountable 小さなRackアプリケーションを自由に組み合わせ可能
  48. 48. 第2部 Padrino を使った開発の実践 Padrino で開発を行う際のTipsや 問題の解決方法などを説明します。
  49. 49. Padrino のエコシステム
  50. 50. Padrino のエコシステム - Rackミドルウェア - rack-contrib - Sinatra の機能拡張 ( SinatraExtention ) - sinatra-contrib - Padrino の機能拡張 ( Padrino 用の SinatraExtention ) - padrino-contrib - Padrino のプラグイン機能 - padrino-recipes に公式のレシピが公開されている
  51. 51. Padrino のエコシステム - Rackミドルウェア - rack-contrib - Sinatra の機能拡張 ( SinatraExtention ) - sinatra-contrib - Padrino の機能拡張 ( Padrino 用の SinatraExtention ) - padrino-contrib - Padrino のプラグイン機能 - padrino-recipes に公式のレシピが公開されている
  52. 52. Padrino のプラグイン機能 ( Templates ) プロジェクトの作成手順が記述されたテンプレートファイルを元に 新しいPadrinoプロジェクトを生成することができる $ padrino g project sample --template path/to/my_template.rb
  53. 53. Padrino のプラグイン機能 ( Templates )
  54. 54. Padrino のプラグイン機能 ( Plugins ) レシピファイルを元に、 既存のPadrinoプロジェクトに機能追加が行える $ padrino g plugin path/to/my_plugin.rb
  55. 55. Padrino のプラグイン機能 ( Plugins )
  56. 56. その他 - OmniAuth, Warden - jpmobile, Browser - will_paginate, Kaminari - Better Errors #=> Sinatra で使えるものは普通に使える - padrino-pipeline, padroni-assets #=> Padrino に特化したものもある
  57. 57. Padrino を使っていくと 遭遇する問題
  58. 58. Padrino を使っていくと遭遇する問題 - コードの肥大化 - 各種コマンドでの起動が遅くなる - 開発サーバ起動後はリローダーが何とかしてくれるが… - Spring は Rails用だし Spork はメンテされていない - Sinatra の哲学に従い小さな部品に分割できないか - サブアプリケーション - アプリケーションの gem 化
  59. 59. Padrino 複数アプリ構成のサンプル
  60. 60. Padrino の情報源
  61. 61. Padrino の情報源 ( 公式ページ )
  62. 62. Padrino の情報源 ( 公式ドキュメント )
  63. 63. Padrino の情報源 ( ebook )
  64. 64. Padrino の情報源 ( 書籍・雑誌 )
  65. 65. Padrino の情報源 ( るびま ) 0036号
  66. 66. Padrino の情報源 ( その他 )
  67. 67. Padrino の情報源 ( その他 )
  68. 68. Padrino の情報源 ( その他 )
  69. 69. Padrino の情報源 ( コード )
  70. 70. Padrino の情報源 ( idobata ) Padrino について雑談できる場所が欲しかったので作った https://idobata.io/organizations/padrino-framework-jp/rooms/public/join_request/ 5b2dda52-c818-45f2-82d6-04c891cb2350
  71. 71. Padrino の今後
  72. 72. Padrino の今後 Padrino 1.0 へ向けて - マルチスレッドのサポート - 新しいルーターの導入 - PadrinoAdmin の刷新 - ページネーション、検索・フィルタ、ダイナミックなUI など - リファクタリング - リローダー、ロガー - ドキュメントの整備 依存を少なく、より堅牢でより高速なフレームワークを目指す Rack2.0, Sinatra2.0 の動向も注目
  73. 73. Padrino の今後
  74. 74. 最後に
  75. 75. Padrino への貢献 - ドキュメント - コードの中、公式ドキュメント、日本語 - プラグイン - 動かないものへのパッチ、自分の欲しいもの - gem - Rackミドルウェア、SinatraExtention、Padrino専用 - コード - コメント修正、バグ修正、新機能の提案
  76. 76. おまけ
  77. 77. その他のRuby製 WebApplicationFramework 個人的に気になっているもの
  78. 78. 毎月第3水曜開催 渋谷周辺で開催(不定) http://shibuyarb.doorkeeper.jp/

×