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.