Affichage des articles dont le libellé est ruby. Afficher tous les articles
Affichage des articles dont le libellé est ruby. Afficher tous les articles

samedi 21 juin 2014

Opérations avancées avec MongoDB

Dans une video, j'avais présenté une introduction à MongoDB.

Pour faire une suite voici quelques manipulations avec le client mongo ou  l'API Ruby.



Pour commencer: 

Avec le client mongo :
voir toutes les bases : shows dbs 
voir toutes les collections d'une base: show collections

Pour les recherches :


Rechercher à l'aide d'une expression régulière :ATTENTION à réserver que pour les champs 'string'
Toutes les stations de velib dont l'adresse contient le mot 'filles' (ex filles du calvaire )
db.stations.find({address :/.+filles.+/i}).count()

ou en version moins compacte :
db.stations.find({address : $regex :{/.+filles.+/i}}).count()

Pour inverser la sélection : $regex :{/(?!.+filles.+)/i}

Avec l'API Ruby:
rech = @stations.find({:address => /#{Regexp.quote(arr)}/}).each { |p| ...


Rechercher les entrées avec qui n'ont pas un champs précis:
db.stations.find({rem: {$exists : false}})

ou 

db.stations.find({rem: null})  # cette forme ne fonctionne pas si un champs contient la valeur null

Avec l'API Ruby:

rech = @stations.find({:arrondissement => nil})....

Afficher que certain champs en sortie:

db.stations.find({arrondissement: 75001},{'state.total_slots' : 1})

Avec Ruby : utiliser le symbole :fields :


@pgm = @db['jcl'].find({'source' => {'$exists' => true}},{:fields => {'jcl' => 1 , 'source' => 1, '_id' => 0}} ).to_a

(le champs id ou _id est special ,c'est l'identifiant des entrées.  il est toujours retourné sauf si , la valeur de sa clé est mise  à zero.)

Une recherche avec une  condition qui porte sur  deux champs de l'entrée (utilisation de $where et this.
(API Ruby)

@alerte = @coll.find('$where'  => "this.reel['total moe'] >= this.valide['total moe']" , 'semaine' => semaine )

Enfin: un tri
db.stations.find({},{address:1}).sort({'state.total_slots' :-1 }).limit(1)
Ici , le tri combiné à   limit(1) permet de récupérer la valeur la plus grande.

Regroupement d'entrée: 


  • Le plus simple est l'opérateur distinct:

db.stations.distinct('arrondissement')

distinct retourne un array (tableau) , aussi pour connaitre le nombre d élément:
db.stations.distinct('arrondissement').length  



  • L'operateur group:


Un autre manière de déterminer le maxima d'une série

@arr = @coll.group( :initial => {cmax:0} ,:reduce =>  "function(obj,prev) { if(prev.cmax < obj.semaine) prev.cmax = obj.semaine; }" )

un autre exemple avec le client mongo
db.stations.group({initial : {cmax : 0 } ,reduce : function(obj,prev) { if (obj.state.total_slots > prev.cmax) prev.cmax = obj.state.total_slots }})

[ { "cmax" : 72 } ]

Enfin un exemple de regroupement avec cumul intermédiaire et condition :

esi  =@coll.group(:key => :esi ,
                       :reduce => "function(obj,res) {res.pr.push({projet :obj['projet'],v: obj['valide']          ['moed'], r:obj['reel']['moed']  });
                                    res.valideESI += obj['valide']['moed'] ;  
                                    res.reelESI += obj['reel']['moed'] ; }",
                        :initial => {  :pr =>  [],
                                       :valideESI => 0,
                                       :reelESI   => 0 
                         },
                       :cond => {:semaine => max})


samedi 13 juillet 2013

mongodb : premiers pas avec cette base nosql

Et une vidéo de plus consacrée à mongodb: Les premières manipulations

Le support est en ligne ici :



La partie vidéo seule est ici:



Les sujets abordés sont les suivants:

j'evoque l'injection massive par la commande mongoimport
La syntaxe est la suivante:

./mongoimport --file ../../stations.json --collection stations --db velibdb --jsonArray


Le dernier paramètre (jsonArray) sert à indiquer que les documents JSON sont  les uns à la suite des autres dans un tableau.

J'utilise un fichier opendata sur l'état des stations  Velib issu du site: http://eaupen.madebymonsieur.com/velib



Le programme ruby  servant à mettre à jour  les informations des stations est donné ci-dessous:



Les prochaines vidéos porteront sur les recherches dans une base mongoDB.

dimanche 10 mars 2013

lazy evaluation avec ruby 2.0

Dans les nouveautés de Ruby 2.0 , une se distingue des autres : la lazy evaluation.
Cette fonctionnalité rapproche de plus en plus ruby du domaine des langages fonctionnels.

La présentation est disponible sur slideshare :



Le code des exemples est le suivant:
La programmation fonctionnelle  favorise l'usage des générateurs ou des suites pour résoudre un certain type de probleme  (List comprehension - map/reduce) .

Avec le mode lazy , ruby est capable de retarder l'évaluation d'expression et mieux encore de le faire à la demande.

Le principal cas d'usage reste l'utilisation des streams (flux) appliquée à des besoins de diffusions de video ou de fichier sous la forme de chunk (tronçons). Ainsi Node.js dispose d'une api permettant de brancher des flux entres eux un peu à la façon de la commande 'pipe' sous unix.






dimanche 24 février 2013

Sortie dans les délais de Ruby version 2.0

Pour les 20 ans de la première version de Ruby, voici la version 2.0

Disponible ici.


Parmi les  nouveautés:

  • Utilisation de paramètre nommé (clé - valeur) dans l'appel des méthodes.
  • Prise en charge d'un vrai  mode 'lazy' dans les générateurs de séquence (enumerator) 
  • Meilleur support de l'asynchronisme

Très bon travail de l'équipe de développement.


samedi 24 novembre 2012

Qu'est ce qu'un websocket

Les websockets sont un nouveau mode d'échange  d'information entre un client (navigateur) et un serveur, défini par la RFC 6455.

Source http://fernetjs.com/wp-content/uploads/2012/11/cables21.jpg

Le dialogue ente le client et le serveur commence par un échange HTTP ou HTTPS puis se continu en mode WS ou WSS (Web Socket et Web Socket Secure).


source:http://warmcat.com/websocket-lifecycle.png

Ce mode d'échange est Bidirectionnel : Le serveur peut pousser des informations au client (ce que ne permet pas directement le HTTP) . C'est le protocole d'avenir des applications web ou non web.

http://websocket-sample.googlecode.com/svn/trunk/images/ws_vs_http.png

Pour tester les websockets: avec Node.js , rien de bien compliqué:
npm install socket.io  
D'autant que les websockets sont adaptées à un fonctionnement de gestion d’évènement asynchrone non bloquant (Comme Node.js) 

Pour Ruby et Rails il existe un gem fournissant un serveur de websocket : em-websocket
En résumé: plus de souplesse , plus rapide moins verbeux, les  websockets sont les invités privilégiés  des smatphones ou des tablettes pour des applications interactives.

samedi 28 juillet 2012

installation de la base Nosql redis

Une video (screencast' de plus consacrée  à la base de données nosql  REDIS.
Cette base s'impose comme la successeur  de  memcached.


Redis manipule cinq types de données. 
La vidéo détaille son installatino et les premiers test à faire.
ci dessous l'exemple d'utilisation de l'API  pour  Ruby .


J'ai confectionné l'infographie suivante qui reprend toutes les commandes de Redis.





vendredi 20 juillet 2012

Express pour Node.je et Sinatra

Express est un framework MVC pour Node.js.  C'est donc du javascript (ou du coffeescript).



Express revendique clairement sa filiation avec Sinatra pour Ruby.




Et c'est vrai que l'analogie est frappante :


Coté Sinatra :




Au delà de cette simple comparaison, Sinatra et Express appartiennent bien à la même famille des DSL dans le domaine d'application de la couche WEB.

1) Le domaine d'application de Sinatra.


Sinatra permet offre un langage de manipulation de la couche web middleware.  Ruby possède une couche middleware très puissante appelée Rack.


Rack permet de faire le lien entre une requête HTTP  entrante (url, méthode et parametre) et des objets Ruby. Il est possible d'agencer à sa guise la pile de traitement d'une requete WEB.

Sinatra offre un langage permettant de travailler directement avec ces couches.

2) Le domaine d'application d'Express


Express tout comme Sinatra permet de manipuler facilement le middleware pour Node.js appelé 'connect.js'.


Express ne fournit pas directement un DSL comme dans Sinatra. Il permet en revanche de réaliser très facilement pour Node.js des applications WEB en mode MVC.

3) Les deux modes d'utilisation de Sinatra.


Sinatra fonctionne sous deux modes:

Le mode 'classique' 

L'application tient dans un fichier et elle est écrite avec le DSL.


Le mode modulaire.


L'application peut être répartie dans plusieurs fichiers.  Il est possible d'avoir plusieurs applications pour un seul interpréteur Ruby actif. En revanche on ne pourra pas faire appel directement au DSL, il faudra passer par des méthodes.

Aucun mode n'est meilleur que l'autre. C'est vraiment deux usages différents. Dans les deux cas, le développeur pourra intervenir sur l'agencement de la couche middleware.
Dans les deux modes, il est possible et recommandé d'isoler les vues dans des sous-répertoires.


4) Les deux mode d'utilisation d'Express


Express lui aussi propose deux usages.

Le mode simple


Comme pour Sinatra, l'application tient dans un fichier et liste les actions à mener pour chaque url.



Ici un exemple en coffeescript.

Le mode MVC


Un appel à la commande express 'mon_appli' génère une arborescente qui ressemble  à celle  d'une grosse application Sinatra.


Par défaut Expres utilise le système de template 'jade' mais il est possible de choisir son moteur des template. Pour ma part , j'utilise 'ejs' qui se rapproche beaucoup de 'erb' pour ruby.

Dans les deux modes, le développeur garde la possibilité de modifier la couche middleware.



En conclusion: Sinatra est a réserver pour les petite applications, après il vaut mieux passer à Rails.

Express, lui prend en charge tout l'aspect serveur WEB (cache , session )  qui n'existe pas en l'état dans Nodes.js  Express sert souvent de base pour d'autres frameworks.
je prépare une série de vidéos sur le thème d'express, rendez vous sur twitter.





 

jeudi 19 juillet 2012

Installer et réaliser une application avec Ruby on Rails en 5 minutes


Encore une nouvelle vidéo des studios 'made by german' .


Avec l'utilisation de deux commandes magiques :
gem install rails 
et
rails new 'mon-appli'

Par défaut Rails utilise une base de données légère: sqlite , mais il sait aussi travailler avec les SGBDR les plus courants: Postgresql , Mysql ou encore Oracle.

Pour SQLite: il convient de s'assurer de la présence des fichiers header pour une bonne installation du driver de la base:

le paquet contenant les fichiers header (.h) 




Parmi les nouveautés de la version 3.2.6 de Rails , j'ai remarqué l'apparition d'un répertoire 'performance' dans le dossier des tests. Deux types de tests sont ajoutés : le benchmark et le profilage.

La vidéo est en ligne ici:

J'utilise une nouvelle machine avec plus de puissance, la qualité de la vidéo et surtout celle  du son est meilleure.






N'hésitez pas à m'envoyer des idées de vidéo.

mercredi 27 juin 2012

publier une application #node.js ou #sinatra sur le cloud heroku

Sur youtube la screencast ( vidéo) de la deuxieme et derniere partie de la publication d'une application sur le cloud heroku


Le plan de cette vidéo est le suivant : h2

Quelques diapos de la vidéo

La gestion des dépendances
h4
Création de l'application sur héroku
h3

En résumé

a) Créer un répertoire
b) faire git init
c) Créer la stack heroku
d) versionner
e) Publier




bref regardez la vidéo.


(rappel :lien vers la premiere partie : lien ici.)

mercredi 20 juin 2012

Conférence de Patrick Chanezon : Le développeur :The artist #cloud , #ruby

J'ai assisté à des  conférences de Patrick Chanezon (ex Google , maintenant chez Cloud Foundry)
C'est quelqu'un d’enthousiaste et de très bons conseils.

J'avais préparé ma conférence pour les solutions linux et par hasard la veille je suis tombé sur une conférence de Patrick sur l'évolution du développement: sa vidéo est tombée à pic. L'important lors d'une présentation est de raconter une histoire. J'ai commencé la mienne par ' mon chien médor  a le blues, il est developpeur JEE etc... .'


 



J'ai commencé à m'amuser avec le Cloud , celui d'heroku et grace à Patrick j'ai découvert celui de Cloud Foundry. J'ai ouvert un compte et je pense bien l'essayer prochainement , cela fera l'objet d'une future vidéo sur http://apprendre1chosechaquejour.herokuapp.com/ . Le coeur de  Cloud foundry est en Ruby, le projet est en opensource.  Il  supporte d'autres langages  que Ruby :java , Node.js etc. Il est possible d'installer un cloud  localement sur sa machine avec vmware.

Ma conf sur share-slide :

vendredi 2 mars 2012

#Ruby sur #android avec ruboto


Réaliser une simplement application pour android 

Remarque préalable.
Les smartphones sont divisés en deux familles les iphones sur IOS et les android.
La technologie à privilégier sur Iphone pour réaliser une application est objective-C.

Sur ANDROID , c'est le langage JAVA qui est utilisé. La pile java sur Android est différente de celle de votre PC. Sur un PC le schéma classique est le suivant: 
Confection d'un source java 
Compilation par le programme javac afin d'obtenir un fichier  de type pseudobyte  (.class) qui sera interprété par une JVM.

Sur ANDROID, le pseudobyte est à son tour compilé pour obtenir un fichier 'dex' interprété non pas par la JVM mais par un dispositif semblable : dalvik
conclusion intermédiaire: une application en  objective-c sera plus performante que son équivalant sur ANDROID. Son code est compilé, directement exécutable.
Source: 
http://www.technomicon.com/ElectroPolitics/ElectroPolitics-11-15-10.html

Installation sur le PC.
Pour ANDROID, le développement se fait sur un PC doté d'un kit de développement complété le plus souvent d'un émulateur de smartphone. Cet émulateur permet de tester très simplement et en toute sécurité vos applications sans avoir recours à un vrai smartphone.
L'outil privilégié pour réaliser tout ça est le plus souvent l'IDE éclipse avec les extensions pour ANDROID.

Il existe une solution alternative avec Ruby et RUBOTO. A l'origine tout commence par jruby, ce projet permet d'écrire des programmes en Ruby qui seront exécutés sur une JVM.  A partir d'un source Ruby, Jruby génère le bytecode qui sera interprété par la JVM. Le projet RUBOTO fourni plusieurs fonctionnalités: 
a) Génération de squelette d'application pour ANDROID
b) Outils pour créer un fichier directement en pseudo-code dex. Jruby intervient  pour la partie amont de traduction du source Ruby en pseudo-code java.  
c) Les librairies à installer sur le système ANDROID pour faire fonctionner les applications RUBOTO.

Le guide de démarrage du site RUBOTO donne la marche à suivre pour obtenir votre première application.
Les principales étapes sont les suivantes:

Les prérequis:
  • installation du
  • installation de jruby
  • SDK ANDROID
  • installation d'un émulateur ANDROID.
L'installation de jruby peut se faire avec l'utilitaire rvm (Ruby Virtual Machine). Pour le reste suivre la documentation du site RUBOTO. Tout fonctionne parfaitement sous Ubuntu
Sur votre ANDROID.

Il faudra récuperer le 'ruboto core' : c'est l'ensemble des librairies utilisées pour faire tourner vos application. L'installation se fait par l'android market. (copie d'écran) 

Un autre utilitaire sera necessaire pour faire passer votre application de votre PC à votre téléphone. J'ai utilisé l'application 'Apk Installer'  toujours par l'android market 

 Après avoir relié le smartphone au PC par le cable USB, il suffira de déposer le programme-archive (.apk)  dans l'arborescence de la SD.  L "APk installer" sera alors capable d'installer l'application comme si elle était issue de l'android market.

Un projet RUBOTO propose des dossiers pour ranger les ressources de l'application (icones).





L'application est ici: 


Elle ressemble à ceci:
L'émulateur  donne cet écran:


La doc  de Ruboto détaille comment accéder aux informations du GPS ou du wifi.

En conclusion:

Dans le cas présent on est dans le domaine des applications de type 'client lourd'.
Réaliser une application de type client léger serait encore plus simple (et plus portable)  mais il manquerait l'accès aux ressources locales (GPS, wifi etc) . L'annonce du portage de chrome sur Android est très importante. Car chrome vient avec son moteur javascript 'V8'.  L'objectif d'avoir un serveur web local léger comme node.js se rapproche.


jeudi 23 février 2012

Les 4 livres essentiels pour aller au bout de #ruby

1 ) Le livre de base :
Programming Ruby: The Pragmatic Programmers' Guide, Second Edition


La première édition est disponible gratuitement sur ce site ou encore sur celui-ci.

 2) The Ruby Programming Language.
 Livre vendu ici.

3) Eloquent Ruby :
Eloquent Ruby (Addison-Wesley Professional Ruby Series) 


C'est à mon opinion le meilleur livre sur Ruby et sa philosophie. A lire et à relire.
Comment créer un DSL interne ou externe.

4) Metaprogramming Ruby
Enfin, cet ouvrage pour vraiment aller au coeur de Ruby. A n'ouvrir qu'après un moment de pratique du langage.


vendredi 13 janvier 2012

Comment PHP a sauvé le #web de #Free mobile





A l'annonce des offre Free , des centaines de milliers d'internaute se sont rués sur le site web de mobile.free.
Celui-ci s'est très vite trouvé saturé et en rupture de charge. Les petits curieux qui analysent les pages web et qui s'intéressent aux architectures web  avaient remarqué que les pages étaient délivrées par un framework JAVA/J2E  (présence des cookies avec des sessions typiques) . Lorsque le site a été de nouveau opérationnel, les cookies par magie relevaient du architecture PHP.
Un des moyens mis en oeuvre par les équipes Free pour augmenter les capacités d'accueil du site (scalabilité) à donc été de remplacer des parties entières de JAVA/J2E par du PHP.

Relevé sur les forums:


Cependant, nous avons pu remarquer encore quelques dysfonctionnement dans le processus d’inscription, et pour cause… Le site a semble t’il été entièrement réécrit dans la nuit !
Ce tour de force rendu semble t’il indispensable par l’incapacité à relever l’ancienne plateforme tournant sous Java, et qui désormais est en PHP.


 ----------------------------------------------------------------------------------------------------------
 (fin de citation)

Une application PHP sera nativement plus performante qu'une application JAVA/J2E pour les raisons suivantes:


  • Le serveur applicatif Apache (langage C) qui sert les pages PHP est plus fiable et puissant que n'importe quel Tomcat. La 'scalabilité' est plus facile à réaliser avec Apache/PHP qu'avec JAVA/J2E. Il est recommandé de placer un apache devant un ou plusieurs  tomcat pour cela (voir aussi le sujet des ressources non java:js,css) .
  • Une architecture PHP like est plus simple et coute moins cher.
  • Une application PHP utilise aussi la programmation objet mais sans ses dérives : des soit-disant experts on convaincu les crédules : la programmation objet doit forcement se traduire en plusieurs couches.  (voir des articles sur la notion de  principes SOLID)
  •  Les développeurs sont meilleurs en PHP

Avant les programmeurs PHP étaient considérés comme des amateurs. Maintenant la tendance s'inverse: Les meilleurs programmeurs se trouvent dans les communautés PHP, Ruby , Python , javascript et les C like.
 Peut importe le langage , l'essenciel est l'algorithmie.
Les entreprises pragmatiques preferent  utilser l'algorithmie  plutot que des dollars pour augmener les performances de leur site.
 Les plus gros sites WEB (facebook, twitter ) ont bien compris cette démarche.

Alors si au détour d'une réunion vous entendez quelqu'un qui explique doctement "que les applications JAVA/J2E sont plus robustes et plus scalables que les autres." , ne cherchez pas à argumenter, vous risquez de l'instruire.

Au commencement était le verbe ...  mais à la fin il y a toujours un developpeur qui se tape le boulot et qui sait ce qui est bon.


Pour le reste, Le grand architecte divin reconnaitra les siens.













samedi 8 octobre 2011

Une tasse de coffeescript

Coffeescript est un nouveau langage de programmation qui génère du javascript. Le site officiel est ici.

 Ce langage est remarquable, il fait parti des DSL (domain specific language). Son auteur Jeremy Ashkenas a démarré en utilisant un livre très connu des hackers : Comment ecrire son propre langage de programmation.
La première version de coffeescript était en Ruby, un langage très adapté pour les DSL. Les versions suivantes  de coffescript sont en  coffeesript...
Coffeescript utilise la bombe du moment 'node.js' comme interpréteur.


Le programme javascript généré peut s’exécuter dans un navigateur ou sur une instance de node. La syntaxe de coffeescript est un mélange de Ruby et de Python dont il reprend les principes d'indentation.
Un script coffeescript par convention prendra l’extension '.coffee'
La génération du javascript se fait par la commande coffee -c monscript.coffee. On obtiendra ainsi  un  programme monscript.js. Ce programme répond à tous les critères de qualité des outils comme jslint.
Sans l'option '-c' le script est  traduit et exécuté directement  par node.js

Le framework Ruby on Rails dans sa dernière version intègre ce générateur de code.
Il suffit de placer un script avec l'extension coffee dans le répertoire javascript pour qu'il soit compilé et rendu disponible à l'application.

Ici j'utilise jquery via coffeescript :

$ ->
   alert "mon premier script avec coffeescript" 


Après un temps d'adaptation de quelques jours, j'ai du mal maintenant à écrire directement du javascript. D'autant qu'il se charge du sale boulot: déclaration des variables locales, closures etc.
La simple ligne : puts = console.log permet d'utiliser la notation classique puts "mon message" comme en Ruby.
J'ai profité du site www.scoop.it pour rassembler des liens sur le sujet : lien de curation ici.





vendredi 7 octobre 2011

Soirée rails france paris.rb

Mardi soir direction le café 'rubis'  rue du Maine pour une soirée organisée par rubis ou rails france. Nous sommes une bonne quarantaine à nous retrouver dans une salle trop petite. Le rétroprojecteur a fait faux bond, aussi  au lieu d'ajourner la soirée, une présentation est improvisée sur un mac book Air. Il s'agit du projet sproutcore.

C'est un framework javascript qui peut s'interfacer facilement avec Rails.
Ce projet se veut plus complet et intégré que backbone.js. Ce type de produit sert à développer des applications pour clients riches, pas pour faire des sites web classiques.

La présentation est là : (suivre le lien).

La soirée m'a permis d'admirer la maquette du nouveau site rails France avec une page 404 prometteuse
 
Tout de même une bonne soirée

mardi 28 juin 2011

Fabriquer un 'gem' #ruby avec jeweler

Pour faire un gem ruby propre, l'utilitaire à utiliser est 'jeweler'

Jeweler: Craft the perfect RubyGem

Jeweler provides the noble ruby developer with two primary features:

* a library for managing and releasing RubyGem projects
* a scaffold generator for starting new RubyGem projects
La commande jeweler 'mon_gem'  (ici jsrdoc) va créer les dossiers et les fichiers suivants:



On constate la présence d'un répertoire 'test'  qui vous invite gentiment à écrire des tests... qui seront lancés par un rake test..

samedi 28 mai 2011

La présentation lumineuse de DHH #rails #javascript

Lors de la Railsconf 2011 à Baltimore, David Heinemeier Hansson créateur de Ruby on Rails à fait une présentation remarquable .

S'il ne fallait retenir qu'une diapo  ce serait celle ci :

Je l'ai modifié pour illustrer le propos :




mymvc 
Il y a une pléthore de langages pour la partie serveur, Mais IL Y EN A QU'UN qui est universel sur le client (navigateur) c'est le javascript.

Aussi , ergoter  sur les avantages de tel ou tel langage n'a plus vraiment de sens car du coté client : il n'y que javascript.
Rails au lieu de  chercher à s'approprier  du coté serveur le javascript, met le framework au  service du développeur javascript. Pour cela Rails dans la version 3.1 proposera par défaut coffeeScript
 Ce DSL permet d'écrire facilement du javascript, il génère du javascript. 

L'autre ajout est SaSS : c'est l'équivalent de coffeeScript pour le CSS.

Enfin cerise sur le gateau, un utilitaire permettra de rassembler tous vos petits morceaux de javascript, css , images pour ne faire qu'un seul fichier compressé.
C'est Sprockets qui se charge de tout ca.

Donc, au lieu que la partie javascipt , css soit cachée sous le tapis, dans Rails, elle est mise en avant au service de : jquery


Ruby on Rails ne veut pas dominer le monde comme les autres framework, il ne cherche qu'a le rendre plus facile pour nous, pauvres développeurs.

La version 3.1 de rails s'annonce comme un tournant historique.C'était  déja le cas pour la version 3.0 avec la fusion réussie avec Merb.

Rails est un outil pour simplifier le travail du développeur, ce n'est pas un boulet à trainer.
Comment voyez vous votre framework :

Comme ca ? :un outil à votre service 


Ou est ce  vous qui êtes à son service ? :dans une machine infernale