Ruby on Rails 5 est sorti… et après ?

Pour le développement web, j’utilise Ruby on Rails depuis des années.

Ruby quoi ?

Ruby est un langage de programmation qui, en synthèse, n’est pas le plus rapide d’un point de vue technique mais est extrêmement rapide en termes d’écriture de code et en termes d’exécution dans un cadre concret. Vous connaissez le lièvre et la tortue ? C’est la tortue.

Ruby on Rails est un framework web reposant sur le langage Ruby. Un framework étant – grossièrement – un ensemble d’outils permettant d’atteindre un objectif. Dans le cadre de Ruby on Rails, il s’agit du serveur web, de la connexion aux base de données, la gestion du cache, le rendu du contenu web, les tests unitaires et j’en passe. Tout ce qui permet de concevoir une plateforme web solide et performante.

Ruby on Rails a quelques beaux succès à son actif (Basecamp, GitHub, AirBnB, Twitch, SoundCloud, Hulu, Zendesk, Square et j’en passe). C’est du sérieux.

On passe la cinquième

Ruby on Rails est né en 2004. Et, en 12 ans, le web a bien évolué.

Le framework web a suivi ces évolutions. A son rythme, pour garder sa solidité.

C’est donc dans les derniers jours de juin 2016 que Ruby on Rails 5 a vu le jour.

Action Cable : du temps réel

Le temps réel, qu’est-ce que c’est ?

En général, sur le web, un client (navigateur web, application mobile) effectue une requête auprès d’un serveur. Et le serveur renvoie une réponse.

Le client a donc à l’instant T une réponse datant de sa dernière requête.

S’il veut une réponse plus « fraîche », il doit effectuer une nouvelle requête. Qui lui dira si oui ou non il y a un nouveau contenu. Le tout en faisant transiter sur le réseau tout un tas d’informations à l’utilité douteuse.

Puis sont apparues les WebSocket, qui sont une réponse à cette problématique.

Les WebSocket sont disponibles depuis un certain temps, mais sont devenues « populaires » seulement récemment. Depuis un certain temps sur Firefox, Chrome et Safari. Depuis Internet Explorer 11 (version 10 en théorie), qui commence juste à être populaire. Et bien sûr son successeur Edge. Côté mobile, c’est disponible depuis iOS 4.2 (autant dire, tous les iOS en circulation), et depuis Android 4.4 (77 % des appareils, mais beaucoup utilisent également le navigateur Chrome, plus récent).

C’est encore un peu neuf, mais c’est tout de même disponible sur une très grosse majorité des appareils. Mais au fait : à quoi ça sert ?

On l’a vu : le web tel qu’il existe ne permet pas l’instantanéité. Les WebSocket répondent à cette problématique en permettant au serveur et au client d’avoir une connexion ouverte en permanence, en utilisant la connexion réseau HTTP(S).

Client et serveur peuvent donc s’envoyer l’un et l’autre des messages à tout moment, sans avoir tout une couche de protocole.

Quand une information nouvelle arrive, c’est le serveur qui déclenche un événement sur le client. Par exemple, dans le cadre d’une messagerie, le client 1 envoie un message au serveur qui va lui même le renvoyer au client 2.

Le client 2 n’aura pas besoin d’aller chercher l’info : elle vient a lui.

Action Cable, qui a un historique suffisant, est maintenant directement intégré – de manière optionnelle mais standardisée – au sein de Ruby on Rails.

En quelques manipulations, on crée des canaux de communication côté serveur (ruby) comme côté client (javascript).

J’ai eu l’occasion de le mettre en application dans un projet client. Je l’ai déployé sur Heroku. Ça marche du tonnerre.

Le mode API

En 2016, on ne fait pas seulement des sites web : on réalise aussi beaucoup d’API. Notamment pour les applications mobiles.

Pour les plus novices des lecteurs, les API web sont des interfaces qui ne sont visibles que par les programmes en eux-mêmes. Il s’agit d’échanger des données, dans des formats spécifiques. Mais il ne s’agit pas, comme sur un site web, d’échanger le contenu affiché.

Par exemple, un navigateur web va demander au site web de lui fournir le code HTML, les feuilles de style CSS, les images, etc.

Une application mobile va demander au service web de lui fournir les données uniquement. L’application mobile se chargera ensuite elle-même de la mise en forme. Ce type d’échanges de données est une API web.

Et l’API web fonctionne différemment d’un site web. On a globalement besoin de moins de choses, et les besoins sont plus spécifiques.

Ruby on Rails 5 permet de concevoir des applications web ayant spécifiquement le rôle d’API. Alors que c’est par défaut prévu pour concevoir des sites web.

C’est efficace. Pour l’avoir mis en place dans un projet d’application mobile, ça fait bien le job.

Les autres nouveautés

2-3 autres nouveautés permettent de renforcer la standardisation, les performances et la sécurité.

Le HSTS a notamment été renforcé. Cette technologie disponible sur les navigateurs web les moins anciens permet de s’assurer que tous les liens du site sont sécurisés en HTTPS.

Donc Ruby on Rails, c’est cool ?

Ouais, c’est cool. 🙂

Let’s Encrypt + Heroku :-)

Depuis peu, Heroku intègre gratuitement en beta le SSL via SNI.

Let’s Encrypt permet d’obtenir des certificats SSL gratuits.

Comment faire fonctionner l’ensemble avec Ruby on Rails ? C’est l’objet de cet article, fortement inspiré d’un article de Collective Idea.

Après ça, vous n’aurez plus d’excuses pour ne plus sécuriser vos sites !

D’abord, installer Let’s Encrypt

Vous êtes sur Mac et avez installé Homebrew ? C’est facile. Une simple ligne de commande suffit.

brew install letsencrypt

Pour les autres, rendez-vous sur le site officiel.

Premières étapes

Lancez l’invite de commande et suivez doucement les instructions.

sudo letsencrypt certonly --manual

On vous demande ensuite le nom de domaine.

Puis si vous êtes d’accord pour enregistrer votre IP : acceptez.

Ensuite, l’écran passe au noir avec un message de type :


Make sure your web server displays the following content at [...]

Là, stoppez !

On passe à la partie Ruby on Rails.

La partie Ruby on Rails

D’abord, mettez à jour config/routes.rb.


Rails.application.routes.draw do
# ...

# Let’s encrypt
get ‘/.well-known/acme-challenge/:id’ => ‘pages#letsencrypt’

# …

end

 

Le contrôleur s’appelle ici PagesController mais peut être n’importe quel contrôleur de pages statiques.
class PagesController < ApplicationController
def letsencrypt
# utilisez ici le code fourni par Let's Encrypt
render text: "code-fourni-par-lets-encrypt"
end
end

C’est fini pour la partie Ruby on Rails.

On continue via Let’s Encrypt

D’abord, on vérifie l’adresse http://<mon-domaine>/.well-known/acme-challenge/<id&gt; histoire de s’assurer que ça retourne bien le texte en code.

Là, c’est compliqué. On presse Enter.

Vous voyez le message Congratulations! ? C’est gagné !

Mais on ne s’arrête pas là.

Installation sur Heroku

Simple commande :
sudo heroku _certs:add /etc/letsencrypt/live/<domaine>/fullchain.pem /etc/letsencrypt/live/<domaine>/privkey.pem --app <mon-app>

Et voilà.

Pensez ensuite à mettre à jour vos DNS. Attendez quelques instants. Normalement, tout devrait être sécurisé.

[ Edit ]

Un outil permet de faciliter tout ça. Venez le découvrir sur GitHub. (merci @dmathieu)

Quoi de neuf chez Morin Innovation ?

Après avoir fait des blagues potaches pour le 1er avril, il est toujours intéressant de connaître la – véritable – actualité de l’entreprise.

Et bien, de nombreux projets en cours et à venir. Notamment grâce à Hopwork et aux rencontres Niort Numeric.

Du service web sécurisé et performant

Dans le cadre d’un projet de startup, j’ai mis en place un service web garantissant une sécurité optimale. Pas parfaite, je n’ai pas cette prétention. Mais répondant à de hauts critères en matière de sécurité et de performances.

Ruby on Rails : on passe la 5ème

Le service web étant mis en production cet été, le développement a été réalisé avec Ruby on Rails 5, la dernière mouture du framework web, actuellement dans ses dernières versions beta.

Comme toujours, l’outil tient ses promesses et propose un socle solide pour le développement en mode agile.

OAuth2 : authentification sécurisée

Le service web étant destiné à une application mobile, l’accès à ce dernier doit être sécurisé tout en conservant une certaine souplesse et de bonnes performances.

Le protocole OAuth2 offre cette possibilité tout en restant sur une architecture standard.

Ajoutez à cela une protection SSL solide, le bon suivi des règles de sécurité OWASP et le tour est joué.

Authenticité des utilisateurs

Quand on échange des données confidentielles, on aime que les personnes sur le réseau soient des personnes de confiance.

La mise en place d’une validation par email et/ou SMS en amont de l’inscription permet de s’assurer – dans une certaine mesure – que les utilisateurs de la plateforme sont de vraies personnes.

Authentification à plusieurs facteurs

Un simple mot de passe peut parfois suffire.

Pour un service web nécessitant un certain niveau de sécurité et de confidentialité, ce n’est pas suffisant.

L’utilisateur à le choix d’activer l’authentification à plusieurs facteurs.

S’il l’active, il reçoit un SMS permettant de valider son identité lors de la première connexion au service sur un même appareil.

Liens courts

Les liens courts permettent de faciliter l’échange de liens : un lien court est facile à recopier et très efficace en QRCode.

En plus, dans un SMS, ça prend moins de place.

Une app iOS moderne sécurisée

IOS offre de nombreux mécanismes de sécurité. Encore faut-il savoir les utiliser à bon escient.

Deeplinking et liens universels

Le deeplinking permet d’ouvrir une app via un format de lien spécifique.

Le lien universel – introduit par iOS 9 – permet d’ouvrir directement une app au bon endroit grâce à un lien vers un site.

Ce procédé permet de renforcer la qualité de l’expérience utilisateur tout en conservant un niveau de sécurité élevé.

Connexion sécurisée aux services web

L’application actuelle est – comme la plupart des applications – connectée à un service web.

Même si la connexion est sécurisée, les identifiants permettant de se connecter aux services web avaient – jusqu’à récemment encore – la fâcheuse habitude d’être intégrés au code source de l’application. Et donc potentiellement récupérables en cassant la sécurité l’application.

Depuis iOS 8, on peut s’affranchir du stockage de ces précieuses données. L’accès au code source en lui-même ne permet pas le piratage car il ne contient pas les identifiants de connexion. (si vous voulez savoir comment je fais, n’hésitez pas à me contacter 🙂 )

Stockage sécurisé des données

IOS propose des mécanismes permettant de sécuriser le stockage des données : autant les exploiter. Toutes les données personnelles de l’app sont chiffrées par le système.

La sécurité des données confidentielles est une question de confiance vis à vis des utilisateurs. Il est essentiel de la garantir.

Accès sécurisé au contenu

Souvent, la sécurité concernant les images et autres contenus stockés sur des CDN se résume à « cacher » l’URL de la ressource en espérant que le contenu ne soit pas vu.

Le système mis en place nécessite l’utilisation d’une signature générée grâce à un identifiant et une clé pouvant eux-même changer. En clair, on ne tombe pas dessus par hasard.

Les performances et l’expérience utilisateur

Ceux-ci sont également essentiels, mais restent plus « classiques ».

On utilise les dernières techniques iOS 8 et iOS 9, avec une bonne dose de Swift, un usage intelligent des différents niveaux d’exécution des tâches et le tour est joué.

To be continued…

Le projet est en cours. D’autres projets vont arriver.

Et, cet été, ce sera – normalement – l’arrivé du successeur de iOS 9 : tout un programme !

À suivre…

RVM (Ruby) + Homebrew sur OS X El Capitan

Vous venez d’installer OS X El Capitan sur votre Mac.

Comme chaque année, il faut faire une installation « propre » de Homebrew et RVM. Mais voilà, des soucis liés au SSL empêchent le bon fonctionnement de l’ensemble.

Ce que vous avez fait

Vous avez désinstallé Homebrew + RVM avant de mettre à jour votre système.

rvm implode
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

Puis vous avez réinstallé le tout.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable

Ce qui a posé problème

Votre installation a bien fonctionné.

Mais, soudain, en pleine exécution de code Ruby, s’affiche un message incompréhensible.

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

Que s’est-il passé ?

Par défaut, RVM va chercher les binaires adaptés à votre système, de sorte à accélérer l’installation.

Seulement, la « mauvaise » version de OpenSSL est utilisée. Votre installation n’est plus cohérente.

Quelle est la solution ?

La seule solution est de faire en sorte que Ruby soit systématiquement installé via une compilation.

Soit vous utilisez l’option –disable-binary à l’installation.

rvm install ruby-2.2.3 --disable-binary

Soit vous définissez cette option par défaut dans le fichier .rvmrc :

export rvm_disable_binary_flag=1

En espérant vous avoir sorti d’une bonne galère 😉

Ruby : le développement agile

Chez Morin Innovation, société orienté « startup », nous travaillons à 100 % en mode agile. L’enjeu est de pouvoir être réactif tout en sécurisant le travail. Un bon équilibre en qualité et productivité.

Pour cela, nous nous appuyons sur Ruby, un langage orienté agilité de par sa conception.

Idée reçue n°1 : tout projet peut être mené quel que soit le langage utilisé

Cette idée, souvent répandue par les chefs de projets qui n’ont pas forcément de connaissances techniques, est théoriquement vraie. Mais théoriquement seulement.

Je peux théoriquement construire une maison en bois avec beaucoup d’allumettes. La maison sera théoriquement aussi solide. Mais il sera plus rapide et plus adapté d’utilisé le matériau adéquate.

Pour le développement, c’est pareil. C’est dans cet esprit qu’a été conçu Ruby dès ses origines : pour le développement agile.

Le langage et son environnement permettent de réaliser très rapidement des développements robustes. Dans la limite de ce que permettent les langages de script.

Idée reçue n°2 : les performances du langage déterminent les performances de l’application

Ne confondons pas performances et efficacité. Si l’interpréteur Ruby n’est pas le meilleur (ni le pire) en termes de performances, il permet un développement rapide. Et son environnement lui permet d’être optimal en termes d’efficacité.

Rien ne sert de courir, il faut partir à point.

Ruby propose une syntaxe optimale et minimaliste pour le développement. La relecture en est donc simplifiée. La correction de bugs est plus rapide. L’optimisation est également plus facile car plus simple à appréhender.

Également, le gain de temps obtenu sur la réalisation permet, si nécessaire, de passer du temps sur l’optimisation.

De plus, Ruby possède un système de packages (des composants à installer) qui fournissent du code open-source très simple à intégré et déjà optimisé.

Car, s’il y a une force dans Ruby, c’est également son système de plugins natifs, qui permet d’appeler du code natif (performant) depuis le langage Ruby. Idéal pour les portions de code critique (analyse de contenu XML/HTML, génération d’images, etc).

Enfin, le code Ruby peut être exécuté au travers d’une machine virtuelle Java (JVM) grâce à JRuby, ce qui apporte un gain de performances conséquent tout en profitant de l’efficacité de l’outil.

Ruby en environnement agile

Passées ces idées reçues, venons-en aux faits. En quoi Ruby est-il meilleur qu’un autre en environnement agile (SCRUM ou autres) ?

Développement souple et rapide

Comme évoqué, la syntaxe même de Ruby lui permet de faciliter le travail du développeur, que ce soit seul ou en équipe.

Un petit bout de code « pour tester » peut être très rapidement déployé. En quelques minutes, on peut avoir un outil d’extraction de données ou de quoi tester un service web.

Adapté aux tests unitaires

Que ce soit via ses modules de tests intégrés (Test::Unit) ou via des outils externes plus élaborés (RSpec), les tests unitaires sont une partie intégrante de l’environnement de développement Ruby.

Au delà de l’apport évident en termes de sécurité et de fiabilité du code, c’est un atout majeur pour le travail en équipe et le développement par les tests (Test Driven Development) qui est un des socles du développement agile.

Bien entendu, de nombreux outils permettent une intégration continue optimale et naturelle, ce qui est également un atout des méthodes de travail agiles.

Idéal pour le travail en équipe

Le code étant basé sur le script, son intégration dans les dépôts de code source (Git et autres) est totalement adapté.

Egalement, son système de packages (les gems) et la configuration des dépendances via le fameux Gemfile permettent d’installer rapidement l’environnement de développement adapté au projet.

Egalement, les gems pouvant être privés et stockés sur Git, le partage de code entre les projets est totalement optimisé.

Un atout majeur pour rejoindre les équipes. Que l’on travaille sur un même réseau ou à distance. Et dans un environnement de travail hétérogène.

Ruby on Rails : le développement web agile

Ruby on Rails est un framework web conçu en Ruby.

Son avantage est sa structure, copiée par de nombreux autres projets dans d’autres langages (Symfony, Play! et autres) : mais la copie ne vaut jamais l’original. Cette structure permet non seulement de s’y retrouver dans son propre code, mais permet également de facilement intégrer des développeurs sur un projet. Et, par extension, faciliter la reprise du code.

Ruby on Rails intègre évidemment les tests unitaires, un impératif pour l’intégration continue (via Codeship par exemple).

Le tout en profitant des atouts de Ruby. Et d’une logique orienté efficacité plus que performances.

La souplesse de l’outil permet un déploiement en environnement « scalable » très simple. Notamment grâce à des solutions comme Heroku, qui proposent un hébergement sans ce soucier de l’aspect administration réseau (tout se fait au travers d’un simple dépôt Git sécurisé).

La sécurité est au rendez-vous, avec un respect scrupuleux des recommandations OWASP.

Les performances « effectives » sont également au RDV, grâce – notamment – à des mécanismes de mise en cache simplifiés.

Success Stories

Travaillant en marque blanche (invisible pour le client final), je ne peux présenter les success stories de Morin Innovation. Je peux juste dire que Ruby nous permet de tenir nos délais de manière systématique (sauf rares exceptions indépendantes de l’équipe), tout en ayant une réactivité maximale sur la correction de bugs et avec des performances très honorables. (on a pu monter jusqu’à 1000 utilisateurs simultanés sur un projet web sans blocage ni lenteur)

Plusieurs sociétés se sont développées grâce à Ruby, et plus particulièrement Ruby on Rails :

  • Twitter
  • Shopify
  • LinkedIn
  • GitHub
  • Basecamp
  • Drivy
  • Airbnb
  • et bien d’autres.

Quid des autres solutions ?

D’autres solutions se développent, bien souvent en « copiant » le modèle de Ruby on Rails, mais dans d’autres langages.

NodeJS, par exemple, est à la mode. On entend souvent des responsables de projets informatiques en faire la promo en amont, dire ensuite que c’est génial… mais ne jamais le déployer à grande échelle. CQFD 🙂

En PHP, Symfony s’approche de Ruby on Rails. En Java (Scala), c’est Play qui reprend le même modèle.

Mais bon, la syntaxe joue beaucoup. Le langage Python, et son framework web Django, est probablement un des seuls à être du niveau de Ruby en termes d’efficacité.

L’évolution en environnement Java

Bien souvent, de nombreuses structures se sont orientées vers Java. Et elles souhaitent ensuite évoluer vers des solutions plus agiles.

L’avantages de Ruby est qu’il possède son environnement d’exécution Java : JRuby.

Non seulement JRuby peut s’exécuter dans un environnement Java, mais en plus on peut appeler du code Java depuis JRuby et vice versa.

Et maintenant ?

Je vous ai présenté l’environnement de développement Ruby.

Si vous souhaitez en savoir plus, n’hésitez pas à contacter Morin Innovation.

La cité niortaise devient la cité des startups et de l’innovation. Ce sera un plaisir pour nous de contribuer à l’accélération de vos développements.