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

Post on 27-Jun-2015

970 views 0 download

description

Cette présentation a été réalisée dans le cadre des Rencontres Mondiales décentralisées du Logiciel Libre (RMLLd) qui se sont déroulées du 1er au 3 Juillet 2011 à Saint-Joseph (Ile de la Réunion).

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

  

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 pourle framework Ruby On Rails

dans le développement d’applications web ?

  

Ruby

LibreInterprété

Orienté objet

Multi-plateforme

Multi-paradigme

  

Tout est objet

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

+ est une méthode de Fixnum

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

Pas de type primitif1.class # Fixnum7.next # 8"Vive les RMLLd".length # 14true.class # TrueClass

  

Syntaxe naturelle

PHP Rubyfor ($i = 0 ; $i < 7 ; i++) { echo "Hello World!";}

8.times do puts "Hello World!"end

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

puts "Hello World!" if say_hi?

  

Hello World!

Rubyputs "Hello World!"

Cint main(void) { printf("Hello World!\n"); return 0;}

Javapublic class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); }}

  

Moindre surprise

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

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

method_namedangerous_method!question_method?setter_method=

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

  

YAML

YAMLspidou: on: Ubuntu firstname: Mathieu lastname: Fontaine skills: - skill: Web Developer since: 2006 - skill: Rails Project Manager since: 2008

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

  

Rails

LibreDon't Repeat Yourself MVC

Convention over ConfigurationRESTful

  

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

users

id

username

created_at

updated_at

Base de donnéesModèle

class User < ActiveRecord::Baseend

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

  

MVC

Requête

Contrôleur Modèle

Vue

Réponse

Affichage

[Post1, Post2, ...]

Post.find(:all)

  

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

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

  

Rails poursuit son évolution

  

Arel (1/2)

@posts = Post.find(:all, :conditions => { :published => true })

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

# Exécution de la requête SQL# @posts reçoit un tableau d'éléments

# La requête SQL n'est pas exécutée à ce moment# @posts reçoit un objet de type ActiveRecord::Relation

Rails 2

Rails 3

  

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)

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

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

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

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

UJS = Unobtrusive JavaScript = « Javascript discret »

Rails 2

Rails 3

  

UJS (2/2)

Rails 2

Rails 3

<%= 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>

<%= 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

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

Avant 2007

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

rubyonrails.com

wikipedia.org

workingwithrails.com

Osirails osirails.spidou.com/wiki

github.com/spidou/osirails

EMR emr-oi.com

insideit.fr

blog-nouvelles-technologies.fr

blog.spidou.com