Évaluons votre projet

Les Livebooks Elixir

Publié le 14 janvier 2022 par Clément Alexandre | elixir - framework

Cet article est publié sous licence CC BY-NC-SA

Logo de Livebook

Petite révolution, les Livebooks Elixir permettent l’exécution de code back-end à la volée, tout en permettant à l’utilisateur d’interagir par le biais d’entrées/sorties graphiques et dynamiques.

Concrètement, Livebook est une application à installer ou exécuter dans le cloud, qui permettra de lire un fichier Markdown tout à fait conventionnel et d’évaluer les extraits de code Elixir qu’il contient à la volée.

C’est un peu CodePen.io, replit ou jupyter à installer où bon vous semble avec quelques super-pouvoirs pour rendre le code plus interactif.

Cette application se trouve être basée sur Phoenix, qui met à profit une bonne partie des fonctionnalités de LiveView. En effet, les Livebooks peuvent par exemple être édités collaborativement !

C’est parti !

Pour découvrir Livebook par la pratique rien de plus simple !

Nous allons commencer par exécuter une instance de Livebook sur notre machine.

Si vous n’utilisez pas Docker, deux autres options s’offrent à vous, je vous invite à les consulter sur Livebook.dev.

Lançons la commande suivante :

docker run --rm -p 8080:8080 livebook/livebook

Ensuite, vous pourrez cliquer sur le bouton ci-dessous, avant de renseigner l’URL de votre instance Livebook, afin que celle-ci télécharge et importe le notebook que je vous propose en exemple.

Ce badge a été créé sur Livebook.dev ; il consiste simplement à renseigner l’URL d’un notebook stocké en ligne. Vous pouvez également télécharger importer mon notebook à la main en allant le chercher ici.

Et voilà ! On se retrouve dans le notebook pour la suite de l’article.

Voici une vidéo du procédé et de ses résultats.


Comme vous pourrez le constater, Livebook est une solution assez fantastique pour illustrer le fonctionnement des bibliothèques, en rendant la documentation interactive.
Même si on trouve déjà des documentations interactives, il semble qu’on aille ici un peu plus loin avec les composants d’entrée/sortie graphiques.

Livebook a été une surprise et mis à disposition très rapidement après que l’idée dont il est issu ait germé.
Ça illustre la versatilité de l’architecture OTP/Erlang et du framework Phoenix, qui se prêtent parfaitement à ce genre d’application.

Des exemples sont fournis dans toutes les instances de Livebook, vous y trouverez notamment un Pong qui illustre les capacités de gestion de processus et des sessions où deux utilisateurs connectés au même notebook peuvent s’affronter dans des matchs endiablés.

Il est également possible de connecter des nœuds OTP (instances de machines virtuelles Erlang) entre eux. On verra ça une prochaine fois :).

C’est tout pour aujourd’hui ! Nous vous présenterons très certainement d’autres usages de Livebook ou des extraits de code Elixir grâce à cette technologie dans de prochains articles.

Voici l’extrait de code présent dans le notebook pour la postérité :


Mix.install([
  {:tesla, "~> 1.4"},
  {:ex_png,
  git: "https://github.com/mikowitz/ex_png.git", ref: "bde6fbb237c632342dc009c315125d4c3e2a8b99"}
])
image_url = "https://link.eu1.storjshare.io/raw/jww2xzhymufeyx7xvee2pirxryaq/synbioz-articles%2Flivebooks%2Fsynbioz.png"

{:ok, %{body: request_body}} = Tesla.get(image_url)

{:ok, %{width: width, height: height} = image} = ExPng.Image.from_binary(request_body)

pixels_count = height * width

recolored_image =
  Enum.reduce(0..(pixels_count - 1), image, fn pixel_index, reduce_acc ->
    x = rem(pixel_index, width)
    y = div(pixel_index, width)

    coordinates = {x, y}

    case ExPng.Image.at(image, coordinates) do
      <<_r, _g, b, a>> when b < 180 and a > 0 ->
        ExPng.Image.Drawing.draw(reduce_acc, coordinates, ExPng.Color.rgba(255, 0, 0, 255))

      _ ->
        reduce_acc
    end
  end)

blank_image = ExPng.Image.new(width, height)

inverted_image =
  Enum.reduce(0..(pixels_count - 1), blank_image, fn pixel_index, reduce_acc ->
    x = rem(pixel_index, width)
    y = div(pixel_index, width)

    <<r, g, b, a>> = ExPng.Image.at(image, {x, y})
    inverted_color = <<255 - r, 255 - g, 255 - b, a>>

    ExPng.Image.Drawing.draw(
      reduce_acc,
      {width - x, height - y},
      inverted_color
    )
  end)

L’équipe Synbioz.
Libres d’être ensemble.