Quelle place pour le framework Rails dans le développement d'application web
-
Upload
5pidou -
Category
Technology
-
view
970 -
download
0
description
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