Synthèse

= Erlang = Erlang est un langage de programmation fonctionnel et concurrent datant des années 1988, crée par la société de télécommunication Ericsson. Il est sous licence Apache v2 donc libre et open source.

Sa machine virtuelle est appelée BEAM (équivalente de la JVM pour Java).

Erlang a été crée à la base pour les commutateurs de télécommunication de Ericsson. Le principe est d'avoir plusieurs petits processus légers et simples, isolés et fonctionnant en concurrence. Ils fonctionnent sur le principe du Kill & Restart : dans le cas où l'un plante, il va alors être tué puis redémarré immédiatement. Cette tâche n'est pas coûteuse du fait de la légèreté des processus. Ce système permet à Erlang d'être hautement disponible (on compte seulement 1/10s d'indisponibilité sur l'année 1998), avec une haute performance et résiste fortement aux pannes et aux erreurs.

= Elixir =



Présentation
Elixir est un langage de programmation fonctionnelle et dynamique. Il repose sur la machine virtuelle Erlang (BEAM) et sa syntaxe est inspirée de Ruby, bien qu'il reprenne également quelques fonctionnalités intéressantes de d'autres langages comme Python. Elixir implémente également la philosophie Let It Crash. Il est également possible de mettre à jour du code sans que les connexions existantes soient interrompues.


 * Crée en 2011 par José Valim, qui est un contributeur reconnu de Ruby
 * La première version d'Elixir (1.0) est sortie en 2014
 * Licence Apache

Outils fournis par Elixir

 * Iex est une console shell interactive.
 * ExUnit est un framework de test / cadriciel de test qui permet d'écrire et générer des tests concis. Ainsi, les rapports d'erreurs sont compréhensibles et facilement repérables.
 * Mix est un outil pour le build, la création, la compilation, le test et pour gérer les dépendances.
 * Hex est un gestionnaire de paquets dont la documentation est générée automatiquement à partir du code. Elle est ainsi toujours à jour. La commande suivante permet d'installer Hex localement :

= Phoenix =



Présentation
Phoenix est le framework de référence pour Elixir. Par le biais de channels, il permet de simplifier l'implémentation d'applications web en temps réel. Grâce à la haute disponibilité d'Elixir et de la machine virtuelle Erlang, environ 2 millions de connexions en simultanée peuvent se faire sur une seule machine. Phoenix est l'équivalent pour Elixir de Ruby on Rails pour Ruby. Afin de comparer les deux, le temps de réponse d'accès à une page qui est en interaction avec une base de données est de l'ordre de millisecondes, tandis que pour Ruby on Rails cela serait de l'ordre de dizaines de millisecondes. Phoenix est basé sur le pattern Modèle Vue Contrôleur (MVC)


 * Première version stable sortie en août 2015
 * Licence MIT

Parties

 * End point : gère les requêtes jusqu'au routeur
 * Router : gère les requêtes entrantes, les envoie aux controllers correspondants et gère les URL des pages
 * Templates : contient les fichiers de type HTML
 * Views : gère l’affichage des templates
 * Controller : contient les fonctions (aussi appelées actions), ce qui permet de gérer les requêtes et d’envoyer/recevoir des données à transmettre aux views
 * Channels : gère les sockets et les communications en temps réel, bidirectionnelles, avec des connexions persistantes
 * PubSub : Publish Subscribe, permet de supprimer l’envoi d’un message direct à un receveur, en créant des topics, auxquels des receveurs vont s’abonner, et ils seront prévenus par un système de notification de l’ajout de nouveaux messages

Couches

 * Ecto : permet de gérer tout ce qui concerne la base de données. Celle qui est mise par défaut est PostgreSQL, mais on peut modifier facilement pour autre chose comme mySQL.
 * Repo : assure la connexion à la base de donnée
 * Schéma : définit le modèle de données avec toutes les tables, leur nom, leurs champs, leurs types, leurs associations…
 * Query : ce sont les requêtes qui permettent de faire le lien entre le repo et le schéma, donc de récupérer des données dans la base de données ou d’effectuer des modifications/suppressions
 * Changeset : permet d'effectuer des vérifications / casting / filtrage / validation (par exemple : vérifier la présence d'un champ, son type, sa valeur...)
 * Cowboy : serveur web HTTP
 * Plug : permet de spécifier des modules et fonctions réutilisables pour gérer la connexion avec le serveur web. Exemples de plugs :
 * un plug qui redirige un utilisateur non connecté lorsque celui-ci veut accéder à une page où il faut être connecté
 * un plug pour indiquer à l’utilisateur qu’il n’a pas les droits d’accéder à une page admin
 * un plug pour gérer les pages qui n’existent pas

= Cas d'utilisation =

Elixir est recommandé pour les logiciels dont le trafic est important et qui ont besoin de temps de réponse très bas. L'utilisation de websockets et de channels avec Elixir va permettre de réaliser des communication en temps réel.


 * Discord avec plus de 5 millions d’utilisateurs connectés en simultané et des millions d’événements par seconde
 * WhatsApp (codé en Erlang) avec plus d’1,5 milliards d’utilisateurs par mois


 * Pinterest


 * Bet365


 * Square Enix


 * Financiel Times


 * Pinterest


 * FontStore


 * Lonely Planet


 * Everyday Hero

= Avantages =

Grâce au support de la machine virtuelle Erlang (BEAM), Elixir fournit également les services suivants :


 * Une grande simplicité
 * Une haute disponibilité
 * Des fonctionnalités en temps réel
 * Des traitements parallèles indépendants
 * Une résistance aux erreurs
 * Une faible latence (des temps de réponse très bas), ce qui permet de communiquer massivement
 * Tolérance à la panne / Robustesse : si un processus crash, cela ne fera pas crasher l'ensemble des processus. Une illustration serait pour des appels téléphoniques, un appel qui coupe ne fera pas couper tous les autres appels qui ont lieu en même temps.
 * Rechargement à chaud : la publication de mise à jour se fera après avoir terminé l'utilisation du processus. Ainsi, si un processus est en cours d'utilisation (par exemple un appel passé avec WhatsApp), la mise à jour ne se fera pas pendant cette utilisation mais à la fin (après avoir raccroché).


 * Les commentaires dans le code et la possibilité de spécifier des exemples génèrent de la documentation automatiquement ainsi que des tests unitaires

= Inconvénients =


 * Une petite communauté : la communauté utilisant Phoenix n'est pas très nombreuse du fait de sa récence, par rapport à des langages plus ancients comme Python, PHP ou encore Ruby qui eux possède une grande communauté avec de nombreuses plateformes de support. Il peut donc être difficile de trouver de l'aide si besoin en utilisant Elixir et Phoenix.
 * Étant donné que les langages de programmation sont souvent orientés objets, il peut être difficile au début d'utiliser Elixir si l'on n'est pas habitué aux langages de programmation fonctionnelle.
 * Sa simplicité est un avantage mais également un inconvénient, pour rendre Elixir simple d'utilisation, il a fallu faire des concessions, ce qui fait que certaines fonctionnalités ont forcément dû êtres mises de côté.

= Installation =

Les commandes suivantes sont à lancer dans un Terminal.

Elixir
Vérifier la version d'Elixir installée :

Erlang permet de compiler du code Elixir. Vérifier que Erlang a bien été installé en lançant :

Node.js
Lien de téléchargement sur le site officiel

Vérifier la version installée :

PostgreSQL
Lien de téléchargement sur le site officiel

Client PostgreSQL (optionnel)
Plusieurs clients PostgreSQL peuvent être trouvés sur le lien suivant. Celui testé dans le cadre de notre découverte d'Elixir et Phoenix est Postico, disponible sous MacOS, qui fournit une interface graphique permettant de visualiser la base de donnée.

Extensions VSCode
= Génération d'un nouveau projet =

Création
La commande  crée un nouveau projet dans le dossier   dont le nom du module principal est.

Lancement du serveur HTTP (Cowboy)


Dans le dossier du projet :

sur le serveur local localhost:4000. Le port 4000 est modifiable dans le fichier.

La page d'accueil ci-jointe est générée.

Avec l'image docker Postgres
Cela permet de stocker les données de l'API.

Initialisation
Il est également possible d'utiliser le langage MySQL au lieu de PostgreSQL en ajoutant  à l'initialisation.

Générer un CRUD
On peut générer automatiquement une entité Utilisateur pour gérer des comptes utilisateurs. Les champs sont personnalisables, la liste de tous les champs est disponible ici.

Cette commande permet de générer plusieurs fichiers tels qu'un Controller, un Module, une Vue, un Template. La seule action à réaliser est d'ajouter dans le router  le chemin vers la page.

Ne pas oublier de migrer la base de données avec la commande

= Documentation officielle =
 * Erlang
 * Elixir
 * Hex Packages
 * Phoenix Overview
 * Phoenix Framework

= Bibliographie =

Sites internet

 * Elixir, Phoenix et Membrane, Bruno Michel, 30/07/2018
 * Démarrer avec phoenix-framework
 * Découverte du langage fonctionnel Elixir et du Framework Phoenix, Julien Rollin, 06/04/2019
 * Writing a Blog Engine in Phoenix and Elixir: Part 4, Adding Roles to our Controllers, Brandon Richey, 14/10/2015
 * Phoenix and Ecto: From `mix new` to Heroku, Wendy Smoak, 12/07/2015
 * Pros and Cons of Elixir Programming, Maria Redka, 06/08/2019
 * Nombre d’utilisateurs actifs mensuels de WhatsApp, janvier 2019
 * Top websites built with Elixir and Phoenix, Cyprian Lakomy, 19/04/2019
 * Why Discord, Pinterest, Moz, Bleacher Reeport use Elixir, Cyprian Lakomy, 23/11/2018
 * Phoenix PubSub, 15/07/2018
 * Découverte du framework phoenix, Pierre, 13/05/2019
 * Introduction to Testing Elixir Applications with ExUnit, Cody Boggs, 26/10/2016
 * Elixir and Phoenix: The future of web APIs and Apps?, Christian Nelson, 19/04/2016

Vidéos

 * Phoenix a Web Framework for the New Web, José Valim (Goto Conférences), 03/11/2016
 * Tutoriel Elixir : Découverte du langage Elixir, Grafikart.fr, 13/06/2017
 * A Chat Room in 8 minutes with Phoenix, Elixir Casts, 13/07/2018