SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Qui suis-je ?

Mathieu Fontaine, 25 ans

Diplômé de Supinfo (promo 2008)

Développeur Web (depuis 2005)

Chef de projet / Développeur Rails (depuis 2008)

about.me/spidou


                   
Quelle place pour
     le framework Ruby On Rails
dans le développement d’applications web ?




                
Ruby

Multi-paradigme

                                    Orienté objet

                      Libre
  Interprété
                              Multi-plateforme




                   
Tout est objet
Pas de type primitif
1.class                          # Fixnum
7.next                           #8
"Vive les RMLLd".length          # 14
true.class                       # TrueClass

Pas d'opérateur
1+2   <=>       1.send('+', 2)   <=>    1.+(1)

+ est une méthode de Fixnum

1.methods.sort                   # ["%", "&", "*", "**", "+", "-", ...]



                                  
Syntaxe naturelle
PHP                                 Ruby
for ($i = 0 ; $i < 7 ; i++) {       8.times do
  echo "Hello World!";               puts "Hello World!"
}                                   end


if (say_hi()) {                     puts "Hello World!" if say_hi?
  echo "Hello World!";
}




                                 
Hello World!
Java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}
                                             C
                                             int main(void) {
                                                printf("Hello World!n");
                                                return 0;
                                             }
           Ruby
           puts "Hello World!"




                              
Moindre surprise

La touche "F1" affiche l'aide
La touche "Suppr" envoie le fichier dans la corbeille


Ruby a été écrit en respectant ce principe,
et incite à en faire de même

Voici un exemple avec la convention de nommage des méthodes :

   method_name
   dangerous_method!
   question_method?
   setter_method=



                            
YAML


XML                                                   YAML
<user id="spidou" on="Ubuntu">                        spidou:
 <firstname>Mathieu</firstname>                        on: Ubuntu
 <lastname>Fontaine</lastname>                         firstname: Mathieu
 <skills>                                              lastname: Fontaine
  <skill since="2006">Web Developer</skill>            skills:
  <skill since="2008">Rails Project Manager</skill>      - skill: Web Developer
 </skills>                                                 since: 2006
</user>                                                  - skill: Rails Project Manager
                                                           since: 2008




                                     
Rails

 RESTful                     Convention over Configuration



                        Libre
Don't Repeat Yourself                     MVC




                     
Java + Hibernate (1/2)
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="[...]" xmlns:xsi="[...]" xsi:schemaLocation="[...]" version="[...]">

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
 <mapping-file>META-INF/orm.xml</mapping-file>

 <class>com.mysite.User</class>

 <properties>
  <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
  <property name="hibernate.cache.use_query_cache" value="true" />
  <property name="hibernate.cache.use_second_level_cache" value="true" />
  <property name="hibernate.show_sql" value="true" />
  <property name="hibernate.format_sql" value="true" />
  <property name="use_sql_comments" value="false" />
  <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" />
  <property name="hibernate.c3p0.min_size" value="5" />
  <property name="hibernate.c3p0.max_size" value="20" />
  <property name="hibernate.c3p0.timeout" value="300" />
  <property name="hibernate.c3p0.max_statements" value="50" />
  <property name="hibernate.c3p0.idle_test_period" value="3000" />

  <property name="hibernate.search.default.directory_provider"
value="org.hibernate.search.store.FSDirectoryProvider" />
 </properties>

</persistence-unit>

</persistence>

                                                    
Java + Hibernate (2/2)


orm.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="[...]" xmlns:xsi="[...]" xsi:schemaLocation="[...]" version="1.0">

<package>com.mysite</package>

<entity class="User">
  <sql-result-set-mapping name="usernames">
    <column-result name="username" />
  </sql-result-set-mapping>
  <table name="User" />
  <named-native-query name="myQuery" result-set-mapping="usernames">
    <query><![CDATA[select u.username from User u]]>
  </query>
  </named-native-query>
</entity>
</entity-mappings>




                                                  
ActiveRecord
Modèle                                         Base de données

class User < ActiveRecord::Base                 users
end                                             id
                                                username
                                                created_at
                                                updated_at



User.all               # (select * from users)
@user = User.first     # (select * from users limit 1)
@user.username         # "spidou"




                          
MVC


       Requête                     Post.find(:all)

                 Contrôleur                          Modèle
                               [Post1, Post2, ...]



                       Affichage
    Réponse



                     Vue




                  
RESTful
Opération                             Site classique (en PHP)            Site RESTful (en Rails)


Lister les utilisateurs               GET /list_users.php                GET /users


Créer un utilisateur                  POST /create_user.php              POST /users


Afficher un utilisateur               GET /show_user.php?id=1            GET /users/1


Modifier un utilisateur               POST /edit_user.php                PUT /users/1


Supprimer un utilisateur              GET /delete_user.php?id=1          DELETE /users/1




Lister les commentaire d'un article   GET /list_comments.php?post_id=1   GET /posts/1/comments

                                      GET /delete_comment.php?
Supprimer un commentaire                                                 DELETE /posts/1/comments/1
                                      id=1&post_id=1




                                            
Rails poursuit son évolution




              
Arel (1/2)

Rails 2
 @posts = Post.find(:all, :conditions => { :published => true })
                                        # Exécution de la requête SQL
                                        # @posts reçoit un tableau d'éléments



Rails 3
 @posts = Post.where(:published => true)
                       # La requête SQL n'est pas exécutée à ce moment
                       # @posts reçoit un objet de type ActiveRecord::Relation




                               
Arel (2/2)

@posts = Post.where(:published => true)

if params[:order]
  @posts = @posts.order(params[:order])
end

@posts.each do |p|
 ...
end
                  # La requête SQL est exécutée maintenant !




                           
UJS (1/2)
UJS = Unobtrusive JavaScript = « Javascript discret »

Rails 2
  <%= link_to_remote 'Profil utilisateur', @user %>

  <a href="#" onclick="new Ajax.Request('/users/99',
  { asynchronous:true, evalScripts:true, parameters:[...] })">Profil utilisateur</a>



Rails 3
  <%= link_to 'Profil utilisateur', @user, :remote => true %>

  <a href="/users/99" data-remote="true">Profil utilisateur</a>




                                    
UJS (2/2)
Rails 2
  <%= link_to 'Supprimer', @user, :method => :delete, :confirm => "Êtes-vous sûr ?" %>

  <a href="/users/99" onclick="if (confirm("Êtes-vous sûr ?")) {
  var f = document.createElement('form'); f.style.display='none';
  this.parentNode.appendChild(f); f.method='POST'; f.action='this.href';
  var m = document.createElement('input'); […] m.setAttribute('value', 'delete');
  f.appendChild(m) ; f.submit(); }; return false;">Supprimer</a>



Rails 3
  <%= link_to 'Supprimer', @user, :method => :delete %>

  <a href="/users/99" data-method="delete" ref="nofollow">Supprimer</a>




                                       
L'éco-système




       
Github (1/2)

    Hébergement et gestion de développement de
     logiciel grâce à Git

    Pas de publicité

    Gratuit pour les projets open source

    Navigation intuitive

    Facilite et incite la création de forks




                         
Github (2/2)

    Passe devant Sourceforce et Google Code en juin 2011
        
                Github : 1 153 059 commits (54%)
        
                Sourceforge : 624 989 commits (30%)
        
                Google Code 287 901 commits (14%)

    2 millions de dépôts

    1 million d'utilisateurs prévus en septembre 2011



    Quelques projets hébergés sur Github :
        
                PHP, Perl, Python, Symfony, Rails, Facebook, Diaspora
        
                Redmine, JQuery, Script.aculo.us, Git, Linux




                                     
New Relic (1/2)

    SaaS

    Monitoring et suivi des performances

    Aucun serveur à installer (cloud)

    Interface utilisateur extrêmement simple

    Un plugin Rails à installer, et ça marche !




                      
New Relic (2/2)




        
Heroku (1/2)

    Déploiement ultra simplifié via Git

    Manipulations en ligne de commande ou via le site web

    Mise à jour des ressources (CPU, mémoire) en fonction
     de la charge

    43 add-ons (sendgrid, new relic, cron, memcache, etc.)

    + 153 300 applications déployées




                         
Heroku (2/2)




       
Ils font confiance




         
Yellow Pages
Avant 2007

    1 500 requêtes/sec

    JavaEE + EJB = problèmes de maintenabilité, de design

    125 000 lignes de code (0 test)


Après migration vers Rails en 2007

    20 000 lignes de code (tests compris)

    Réécriture en 3 mois (5 développeurs)

    Performances égales




                         
Twitter (1/2)

    Créé en 2006



    Développement initial en Rails



    Fin 2008 :
        
                100 million de tweets par trimestre
        
                Lève 15 million de dollars
        
                Valorisé à 500 million de dollars




                                
Twitter (2/2)

    2009 : Victime de son succès, Twitter migre progressivement
      vers Scala



    Fin 2010 :
        
                Lève +140 million de dollars
        
                Valorisé à 3.7 milliard de dollars


    Rails = rampe de lancement de projet




                                 
Osirails

    ERP destiné aux PME/PMI

    Adapté à la fabrication sur mesure

    Modulaire
       
               Module Tiers (gestion des clients, fournisseurs, etc.)
       
               Module RH (gestion des ressources humaines, congés, etc.)
       
               Module Stocks (gestion des articles, inventaires, etc.)
       
               Module Ventes (gestion produits, devis, facture, etc.)
       
               ...


    En cours de développement chez EMR

    En phase de test, bientôt en production

    github.com/spidou/osirails/fork

                                       
Des questions ?



          
Crédits

    Présentation réalisée grâce à LibreOffice sur Ubuntu 11.04

    Sources :
          
                  ruby-lang.org                     
                                                        insideit.fr
          
                  rubyonrails.com                   
                                                        blog-nouvelles-technologies.fr
          
                  wikipedia.org                     
                                                        blog.spidou.com
          
                  workingwithrails.com

    Osirails
          
                  osirails.spidou.com/wiki
          
                  github.com/spidou/osirails

    EMR
          
                  emr-oi.com




                                       

Contenu connexe

Tendances

Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbcabderrahim marzouk
 
Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4halleck45
 
Formation JPA Java persistence API
Formation JPA Java persistence APIFormation JPA Java persistence API
Formation JPA Java persistence APIThibault Cuvillier
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Sylvain Wallez
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2dhugomallet
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Spring par la pratique chap-7 - mvc
Spring par la pratique  chap-7 - mvcSpring par la pratique  chap-7 - mvc
Spring par la pratique chap-7 - mvcFlorent Breton
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
les servlets-java EE
les  servlets-java EEles  servlets-java EE
les servlets-java EEYassine Badri
 

Tendances (20)

Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
 
Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4
 
Formation JPA Java persistence API
Formation JPA Java persistence APIFormation JPA Java persistence API
Formation JPA Java persistence API
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 
Ce bon vieux propel
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Cours JSP
Cours JSPCours JSP
Cours JSP
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
Tp java ee.pptx
Tp java ee.pptxTp java ee.pptx
Tp java ee.pptx
 
Spring par la pratique chap-7 - mvc
Spring par la pratique  chap-7 - mvcSpring par la pratique  chap-7 - mvc
Spring par la pratique chap-7 - mvc
 
jQuery
jQueryjQuery
jQuery
 
Introduction à ajax
Introduction à ajaxIntroduction à ajax
Introduction à ajax
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
Marzouk jsp
Marzouk jspMarzouk jsp
Marzouk jsp
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Jboss Seam
Jboss SeamJboss Seam
Jboss Seam
 
Cours php
Cours phpCours php
Cours php
 
les servlets-java EE
les  servlets-java EEles  servlets-java EE
les servlets-java EE
 

En vedette

Tot To Create Wellness Leaders
Tot To Create Wellness Leaders Tot To Create Wellness Leaders
Tot To Create Wellness Leaders Meena Shah
 
Étude de cas - Espace Edena
Étude de cas - Espace EdenaÉtude de cas - Espace Edena
Étude de cas - Espace EdenaproPulse
 
MobileClick-2 キックオフイベント
MobileClick-2 キックオフイベントMobileClick-2 キックオフイベント
MobileClick-2 キックオフイベントkt.mako
 
NTCIR-12 MobileClick-2 Overview
NTCIR-12 MobileClick-2 OverviewNTCIR-12 MobileClick-2 Overview
NTCIR-12 MobileClick-2 Overviewkt.mako
 
Fundamental Force Map : High Energy Physics vs Nature Knowledge Theory
Fundamental Force Map : High Energy Physics vs Nature Knowledge TheoryFundamental Force Map : High Energy Physics vs Nature Knowledge Theory
Fundamental Force Map : High Energy Physics vs Nature Knowledge TheoryMd Santo
 
Castello dell'ovo e gli scorci di panorami che ci regala
Castello dell'ovo e gli scorci di panorami che ci regalaCastello dell'ovo e gli scorci di panorami che ci regala
Castello dell'ovo e gli scorci di panorami che ci regalaMy own sweet home
 
MobileClick-2 Kickoff Event
MobileClick-2 Kickoff EventMobileClick-2 Kickoff Event
MobileClick-2 Kickoff Eventkt.mako
 
Référencement Local (SEO Local) - Queduweb 2016
Référencement Local (SEO Local) - Queduweb 2016Référencement Local (SEO Local) - Queduweb 2016
Référencement Local (SEO Local) - Queduweb 2016Victor Lerat
 
Giro italia imprenditoria femminile
Giro italia imprenditoria femminileGiro italia imprenditoria femminile
Giro italia imprenditoria femminileParma Couture
 

En vedette (12)

Tot To Create Wellness Leaders
Tot To Create Wellness Leaders Tot To Create Wellness Leaders
Tot To Create Wellness Leaders
 
Certosa di padula 1
Certosa di padula 1 Certosa di padula 1
Certosa di padula 1
 
Mahara 1.5 steht for der Tür
Mahara 1.5 steht for der TürMahara 1.5 steht for der Tür
Mahara 1.5 steht for der Tür
 
Étude de cas - Espace Edena
Étude de cas - Espace EdenaÉtude de cas - Espace Edena
Étude de cas - Espace Edena
 
MobileClick-2 キックオフイベント
MobileClick-2 キックオフイベントMobileClick-2 キックオフイベント
MobileClick-2 キックオフイベント
 
NTCIR-12 MobileClick-2 Overview
NTCIR-12 MobileClick-2 OverviewNTCIR-12 MobileClick-2 Overview
NTCIR-12 MobileClick-2 Overview
 
Fundamental Force Map : High Energy Physics vs Nature Knowledge Theory
Fundamental Force Map : High Energy Physics vs Nature Knowledge TheoryFundamental Force Map : High Energy Physics vs Nature Knowledge Theory
Fundamental Force Map : High Energy Physics vs Nature Knowledge Theory
 
Castello dell'ovo e gli scorci di panorami che ci regala
Castello dell'ovo e gli scorci di panorami che ci regalaCastello dell'ovo e gli scorci di panorami che ci regala
Castello dell'ovo e gli scorci di panorami che ci regala
 
Il cristo di maratea
Il cristo di marateaIl cristo di maratea
Il cristo di maratea
 
MobileClick-2 Kickoff Event
MobileClick-2 Kickoff EventMobileClick-2 Kickoff Event
MobileClick-2 Kickoff Event
 
Référencement Local (SEO Local) - Queduweb 2016
Référencement Local (SEO Local) - Queduweb 2016Référencement Local (SEO Local) - Queduweb 2016
Référencement Local (SEO Local) - Queduweb 2016
 
Giro italia imprenditoria femminile
Giro italia imprenditoria femminileGiro italia imprenditoria femminile
Giro italia imprenditoria femminile
 

Similaire à Quelle place pour le framework Rails dans le développement d'application web

Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Xavier NOPRE
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
react-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basicreact-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basiczineblahib2
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2
Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2
Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2Romain Linsolas
 
Introduction à Ruby - MS Techdays 2012
Introduction à Ruby - MS Techdays 2012Introduction à Ruby - MS Techdays 2012
Introduction à Ruby - MS Techdays 2012Nicolas Ledez
 
Introduction à Ruby 2
Introduction à Ruby 2Introduction à Ruby 2
Introduction à Ruby 2Microsoft
 
Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à SinatraRémi Prévost
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptRaphaël Semeteys
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro rubyNicolas Ledez
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 

Similaire à Quelle place pour le framework Rails dans le développement d'application web (20)

Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
react-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basicreact-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basic
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2
Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2
Devoxx France 2015 - Se préparer à l'arrivée d'Angular 2
 
Introduction à Ruby - MS Techdays 2012
Introduction à Ruby - MS Techdays 2012Introduction à Ruby - MS Techdays 2012
Introduction à Ruby - MS Techdays 2012
 
Introduction à Ruby 2
Introduction à Ruby 2Introduction à Ruby 2
Introduction à Ruby 2
 
Drools
DroolsDrools
Drools
 
Manualjquery
ManualjqueryManualjquery
Manualjquery
 
Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à Sinatra
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScript
 
Breizh camp intro ruby
Breizh camp   intro rubyBreizh camp   intro ruby
Breizh camp intro ruby
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 

Quelle place pour le framework Rails dans le développement d'application web

  • 1. Qui suis-je ? Mathieu Fontaine, 25 ans Diplômé de Supinfo (promo 2008) Développeur Web (depuis 2005) Chef de projet / Développeur Rails (depuis 2008) about.me/spidou    
  • 2. Quelle place pour le framework Ruby On Rails dans le développement d’applications web ?    
  • 3. Ruby Multi-paradigme Orienté objet Libre Interprété Multi-plateforme    
  • 4. Tout est objet Pas de type primitif 1.class # Fixnum 7.next #8 "Vive les RMLLd".length # 14 true.class # TrueClass Pas d'opérateur 1+2 <=> 1.send('+', 2) <=> 1.+(1) + est une méthode de Fixnum 1.methods.sort # ["%", "&", "*", "**", "+", "-", ...]    
  • 5. Syntaxe naturelle PHP Ruby for ($i = 0 ; $i < 7 ; i++) { 8.times do echo "Hello World!"; puts "Hello World!" } end if (say_hi()) { puts "Hello World!" if say_hi? echo "Hello World!"; }    
  • 6. Hello World! Java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } C int main(void) { printf("Hello World!n"); return 0; } Ruby puts "Hello World!"    
  • 7. Moindre surprise La touche "F1" affiche l'aide La touche "Suppr" envoie le fichier dans la corbeille Ruby a été écrit en respectant ce principe, et incite à en faire de même Voici un exemple avec la convention de nommage des méthodes : method_name dangerous_method! question_method? setter_method=    
  • 8. YAML XML YAML <user id="spidou" on="Ubuntu"> spidou: <firstname>Mathieu</firstname> on: Ubuntu <lastname>Fontaine</lastname> firstname: Mathieu <skills> lastname: Fontaine <skill since="2006">Web Developer</skill> skills: <skill since="2008">Rails Project Manager</skill> - skill: Web Developer </skills> since: 2006 </user> - skill: Rails Project Manager since: 2008    
  • 9. Rails RESTful Convention over Configuration Libre Don't Repeat Yourself MVC    
  • 10. Java + Hibernate (1/2) persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="[...]" xmlns:xsi="[...]" xsi:schemaLocation="[...]" version="[...]"> <persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> <mapping-file>META-INF/orm.xml</mapping-file> <class>com.mysite.User</class> <properties> <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> <property name="hibernate.cache.use_query_cache" value="true" /> <property name="hibernate.cache.use_second_level_cache" value="true" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="use_sql_comments" value="false" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" /> <property name="hibernate.c3p0.min_size" value="5" /> <property name="hibernate.c3p0.max_size" value="20" /> <property name="hibernate.c3p0.timeout" value="300" /> <property name="hibernate.c3p0.max_statements" value="50" /> <property name="hibernate.c3p0.idle_test_period" value="3000" /> <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" /> </properties> </persistence-unit> </persistence>    
  • 11. Java + Hibernate (2/2) orm.xml <?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="[...]" xmlns:xsi="[...]" xsi:schemaLocation="[...]" version="1.0"> <package>com.mysite</package> <entity class="User"> <sql-result-set-mapping name="usernames"> <column-result name="username" /> </sql-result-set-mapping> <table name="User" /> <named-native-query name="myQuery" result-set-mapping="usernames"> <query><![CDATA[select u.username from User u]]> </query> </named-native-query> </entity> </entity-mappings>    
  • 12. ActiveRecord Modèle Base de données class User < ActiveRecord::Base users end id username created_at updated_at User.all # (select * from users) @user = User.first # (select * from users limit 1) @user.username # "spidou"    
  • 13. MVC Requête Post.find(:all) Contrôleur Modèle [Post1, Post2, ...] Affichage Réponse Vue    
  • 14. RESTful Opération Site classique (en PHP) Site RESTful (en Rails) Lister les utilisateurs GET /list_users.php GET /users Créer un utilisateur POST /create_user.php POST /users Afficher un utilisateur GET /show_user.php?id=1 GET /users/1 Modifier un utilisateur POST /edit_user.php PUT /users/1 Supprimer un utilisateur GET /delete_user.php?id=1 DELETE /users/1 Lister les commentaire d'un article GET /list_comments.php?post_id=1 GET /posts/1/comments GET /delete_comment.php? Supprimer un commentaire DELETE /posts/1/comments/1 id=1&post_id=1    
  • 15. Rails poursuit son évolution    
  • 16. Arel (1/2) Rails 2 @posts = Post.find(:all, :conditions => { :published => true }) # Exécution de la requête SQL # @posts reçoit un tableau d'éléments Rails 3 @posts = Post.where(:published => true) # La requête SQL n'est pas exécutée à ce moment # @posts reçoit un objet de type ActiveRecord::Relation    
  • 17. Arel (2/2) @posts = Post.where(:published => true) if params[:order] @posts = @posts.order(params[:order]) end @posts.each do |p| ... end # La requête SQL est exécutée maintenant !    
  • 18. UJS (1/2) UJS = Unobtrusive JavaScript = « Javascript discret » Rails 2 <%= link_to_remote 'Profil utilisateur', @user %> <a href="#" onclick="new Ajax.Request('/users/99', { asynchronous:true, evalScripts:true, parameters:[...] })">Profil utilisateur</a> Rails 3 <%= link_to 'Profil utilisateur', @user, :remote => true %> <a href="/users/99" data-remote="true">Profil utilisateur</a>    
  • 19. UJS (2/2) Rails 2 <%= link_to 'Supprimer', @user, :method => :delete, :confirm => "Êtes-vous sûr ?" %> <a href="/users/99" onclick="if (confirm("Êtes-vous sûr ?")) { var f = document.createElement('form'); f.style.display='none'; this.parentNode.appendChild(f); f.method='POST'; f.action='this.href'; var m = document.createElement('input'); […] m.setAttribute('value', 'delete'); f.appendChild(m) ; f.submit(); }; return false;">Supprimer</a> Rails 3 <%= link_to 'Supprimer', @user, :method => :delete %> <a href="/users/99" data-method="delete" ref="nofollow">Supprimer</a>    
  • 21. Github (1/2)  Hébergement et gestion de développement de logiciel grâce à Git  Pas de publicité  Gratuit pour les projets open source  Navigation intuitive  Facilite et incite la création de forks    
  • 22. Github (2/2)  Passe devant Sourceforce et Google Code en juin 2011  Github : 1 153 059 commits (54%)  Sourceforge : 624 989 commits (30%)  Google Code 287 901 commits (14%)  2 millions de dépôts  1 million d'utilisateurs prévus en septembre 2011  Quelques projets hébergés sur Github :  PHP, Perl, Python, Symfony, Rails, Facebook, Diaspora  Redmine, JQuery, Script.aculo.us, Git, Linux    
  • 23. New Relic (1/2)  SaaS  Monitoring et suivi des performances  Aucun serveur à installer (cloud)  Interface utilisateur extrêmement simple  Un plugin Rails à installer, et ça marche !    
  • 25. Heroku (1/2)  Déploiement ultra simplifié via Git  Manipulations en ligne de commande ou via le site web  Mise à jour des ressources (CPU, mémoire) en fonction de la charge  43 add-ons (sendgrid, new relic, cron, memcache, etc.)  + 153 300 applications déployées    
  • 28. Yellow Pages Avant 2007  1 500 requêtes/sec  JavaEE + EJB = problèmes de maintenabilité, de design  125 000 lignes de code (0 test) Après migration vers Rails en 2007  20 000 lignes de code (tests compris)  Réécriture en 3 mois (5 développeurs)  Performances égales    
  • 29. Twitter (1/2)  Créé en 2006  Développement initial en Rails  Fin 2008 :  100 million de tweets par trimestre  Lève 15 million de dollars  Valorisé à 500 million de dollars    
  • 30. Twitter (2/2)  2009 : Victime de son succès, Twitter migre progressivement vers Scala  Fin 2010 :  Lève +140 million de dollars  Valorisé à 3.7 milliard de dollars Rails = rampe de lancement de projet    
  • 31. Osirails  ERP destiné aux PME/PMI  Adapté à la fabrication sur mesure  Modulaire  Module Tiers (gestion des clients, fournisseurs, etc.)  Module RH (gestion des ressources humaines, congés, etc.)  Module Stocks (gestion des articles, inventaires, etc.)  Module Ventes (gestion produits, devis, facture, etc.)  ...  En cours de développement chez EMR  En phase de test, bientôt en production  github.com/spidou/osirails/fork    
  • 33. Crédits  Présentation réalisée grâce à LibreOffice sur Ubuntu 11.04  Sources :  ruby-lang.org  insideit.fr  rubyonrails.com  blog-nouvelles-technologies.fr  wikipedia.org  blog.spidou.com  workingwithrails.com  Osirails  osirails.spidou.com/wiki  github.com/spidou/osirails  EMR  emr-oi.com