Blog entries

Résumé de la conférence ISWC 2020

20/01/2021

Elodie Thiéblin, développeuse chez Logilab et spécialiste du Web sémantique

Du 3 au 6 novembre, j'ai participé à la conférence ISWC (International Semantic Web Conference), qui est une des références internationales dans le domaine du Web Sémantique. On y parle des problématiques du web de données liées et de réprésentation des connaissances. Je partage ici mes notes sur les sujets qui m'ont le plus marquée.

Débriefing général de la conférence

Cette année, il y a eu de nombreux articles consacrés à SHACL (Shape Constraint Language).

L'idée de remettre l'utilisateur des données et technologies du Web sémantique au centre des innovations à venir a été répétée à plusieurs reprises.

L'intervention de Miriam Fernandez sur la diversité des données était enrichissante. Elle invite les producteurs de données à se poser la question du biais de leurs données et de la représentation du monde qu'elles renferment.

Des données biaisées peuvent provoquer de désastreux effets sociaux.

Elle cite notamment cet article qui présente les résultats d'une étude comparant les blessures des femmes et des hommes avec une ceinture de sécurité lors d'accidents de la route entre 1998 et 2008. La différence de 47% entre les deux sexes serait imputable aux mannequins de test de l'industrie automobile dimensionnés sur des hommes.

Résumé de présentations

Deux papiers ont retenu mon attention pour faciliter l'utilisation des technologies du Web sémantique par les développeuses et les développeurs Web.

ON2TS: Typescript generation from OWL ontologies and SHACL

ON2TS est un prototype permettant de générer des classes et interfaces TypeScript à partir d'ontologies OWL et de règles en SHACL. Les développeurs peuvent donc utiliser directement les classes et interfaces générées pour valider la structure et la forme de leurs données lors de l'exécution.

Ce prototype utilise la bibliothèque @ldflex/comunica, le moteur de requêtes pour langage LDflex, qui est décrit ci-dessous.

Pour plus de détails, lisez l'article.

LDflex: a Read/Write Linked Data Abstraction for Front-End Web Developers

LDflex est un langage dédié qui fait apparaîtr les données liées du Web comme des structures de données en JavaScript. La vidéo de la présentation est en ligne et il est possible d'expérimentation dans un bac à sable.

Selon Ruben Verborgh, une des grandes différences entre les applications Web et le Web sémantique est la "prédicabilité" : la structure et l'emplacement des données sont prédéfinis dans une application Web (souvent choisie par les développeurs de ladite application), tandis que dans le cas du Web sémantique, les ontologies sont hétérogènes et les données sont distribuées.

Le but de LDflex est de simplifier la gestion des différents formats et modes d'interrogation des serveurs de Web de données liées: des données en RDF peuvent être récupérées depuis le Web puis interrogées localement en SPARQL.

Avec LDflex il est possible de manipuler une structure de données locale, qui est mise en correspondance avec les données RDF d'origine au moyen d'un contexte. Par exemple, le contexte suivant permet d'écrire user.friends pour récupérer les individus ayant un lien foaf:knows vers user.

json "@context": { "@vocab": "http://xmlns.com/foaf/0.1/", "friends": "knows", "label": "http://www.w3.org/2000/01/rdf-schema#label", }

Si le modèle évolue, il peut suffire de modifier le contexte pour adapter l'application, ce qui en simplifie la maintenance.

LDflex semble donc à première vue une bonne alternative à rdflib.js. Comme cette dernière, elle dépend toutefois des bibliothèques d'authentification Solid qui prennent une taille non négligeable (~500ko) dans le bundle final.

La bibliothèque ldflex inclut le langage LDflex et doit être accompagnée de @ldflex/comunica, son moteur de requêtes sur le Web.

Un rapide test sur logilab.fr (avec l'extension CORS Everywhere activée) a suffit à montrer qu'on peut utiliser LDflex pour interroger les instances de Cubicweb en version 3.28

Autres tests et remarques : - Test sur http://dbpedia.org/resource/Paris → Mixed Blocked depuis le bac à sable en HTTPS - Test sur https://aims.fao.org/aos/agrovoc/c_30969 → 301 Moved Temporarily mais pas de requête sur l'URL cible (en HTTP) - Test sur https://www.wikidata.org/entity/Q535 → redirection à travers les différentes URL pour obtenir le RDF est gérée et fonctionne → requêtage en SPARQL ne fonctionne pas car l'entité est décrite en HTTP et non HTTPS dans le RDF

Il sera intéressant de suivre l'évolution de ce projet pour répondre aux questions suivantes:

  • Comment gérer plusieurs contextes simultanément (récupérer foaf:name et schema:name à la fois par exemple) ?
  • Comment contourner le problème des requêtes Mixed Blocked en gardant les données distribuées sur le Web ?

Conclusion

Cette expérience a été très enrichissante, comme chaque année. Je suis contente qu'il y ait de plus en plus d'initiatives pour rendre le Web sémantique agréable et accessible aux développeuses et aux développeurs Web. Cela va peut-être encourager la valorisation des entrepôts de données liées dans des applications en production.

Un des sujets resté sans réponse est la gestion des configurations des serveurs sur le Web de données liées pour notamment la gestion des erreurs CORS, Mixed Blocked, etc.

Rendez-vous l'année prochaine pour vérifier ces hypothèses.


AssignBot facilite la relecture de code

13/01/2021

A Logilab, dans un esprit d'amélioration continue, nous consacrons du temps à développer des projets qui facilitent notre travail au quotidien. Dernièrement le projet AssignBot a été développé par Simon Chabot. Afin d'en savoir plus sur sa création nous lui avons posé quelques questions :

  • Bonjour Simon, peux-tu tout d'abord te présenter en quelques mots ?

En quelques mots : j’ai étudié l’informatique à l’Université de Technologie de Compiègne, puis je suis allé à Nice, entre autre, faire une thèse sur la simulation numérique des séismes, avant de rejoindre Logilab fin 2018.

  • Peux-tu nous expliquer ce qu'est AssignBot et à quel besoin il répond ?

Lorsqu’on écrit du code, une des bonnes pratiques (peut être l’une des plus importante ?), est la relecture par les pairs. L’objectif de la relecture est d’améliorer la qualité du code produit, de favoriser la collaboration et de faire en sorte que les connaissances soient partagées.

À Logilab, nous avons plusieurs centaines de projets dans notre forge. Certains sont des logiciels écrits spécifiquement pour nos clients, généralement avec une équipe dédiée, et d’autres sont « communs ». Il peut s'agir de briques de base utiles à différents projets, d'outils internes (intranet, des tableaux de bords), ou de logiciels libres développés avec des tiers (comme CubicWeb et ses nombreux cubes).

AssignBot est un petit robot dont la mission est d’organiser cette relecture, notamment pour nos projets « communs ». Lorsqu’une personne propose un changement elle envoie sur notre forge une merge request. AssignBot va alors choisir une personne volontaire pour s’occuper de cette merge request. Je dis “volontaire”, parce qu'un des objectifs d’AssignBot est de laisser aux relecteurs la possibilité de régler le nombre de relectures qu’ils veulent bien faire par jour / semaine, afin de permettre aux personnes qui le souhaitent de participer, même si leur emploi du temps est chargé.

  • N'existait-il pas des solutions équivalentes que tu aurais pu utiliser ?

Pour être honnête, je n’ai pas vraiment cherché avant d'écrire AssignBot. Suite à diverses discussions avec des collègues, nous sommes arrivés à la conclusion que ce petit outil pourrait nous aider, et… je trouvais ça rigolo. Un soir, ça m’a démangé et AssignBot est né. Dans l’histoire de Logilab, un tel logiciel a déjà existé, mais il a été petit à petit abandonné car il était trop rigide je crois.

  • Avec quelle(s) technologie(s) l'as-tu fait et pourquoi celle(s)-ci ?

AssignBot est écrit en Python. C’est le langage qui accompagne Logilab depuis ses débuts et qui est connu par toute l’équipe. Pour trouver les nouvelles merge requests, AssignBot utilise la bibliothèque Python gitlab, qui permet d’interagir avec notre forge, basée sur Heptapod (un fork de Gitlab qui permet de gérer des entrepôts Mercurial). Le code est en réalité très court grâce à cette bibliothèque. Il suffit simplement de demander les merge requests non-assignées, et de choisir une personne dans la liste en fonction des préférences qu’elle a définies (en terme de nombre de relectures par jour/semaine).

AssignBot utilise également un petit fichier d’historique, pour pouvoir respecter ces préférences. Ce fichier est quand à lui placé sur notre serveur de stockage S3.

  • Est-il actuellement utilisé ? As-tu eu des retours des personnes utilisatrices ?

AssignBot est utilisé aujourd’hui par une dizaine de personnes à Logilab (j’espère d’ailleurs que cet article permettra d’augmenter ce nombre :smile:)

Oui, j’ai eu quelques retours. Principalement positifs, les merge requests restent moins longtemps en attente dans un coin sur la forge, car il y a une personne qui est en charge de sa publication. AssignBot ne connait pas les domaines avec lesquels les gens ont plus ou moins d’affinité. Donc il arrive des fois que l’on se retrouve assigné une merge request qui est assez loin de ce qu’on maîtrise. Ce qui a été un peu déroutant au début. Mais je pense qu’il faut voir cela du bon côté, ça permet de découvrir de nouvelles choses, d’être informé de ce qui est fait par l’équipe. Et il faut voir la mission comme « je dois faire en sorte que ce travail avance » et non pas comme « je dois relire et trouver les erreurs potentielles de ce code », ça peut donc vouloir dire, aller voir un·e collègue et poser des questions, ou demander si quelqu’un veut bien jeter un œil en parallèle. Voilà… en fait l’objectif d’AssignBot, pour revenir à la question du début, c’est ça : « faire en sorte que les choses avancent ».

  • AssignBot est-il publié sous licence libre ? Est-il utilisable dans un autre contexte que Logilab ?

Oui, tout à fait, AssignBot est libre, publié sous licence LGPL. Le code-source est disponible sur notre forge: https://forge.extranet.logilab.fr/open-source/assignbot et un paquet python est disponible sur pipy: https://pypi.org/project/assignbot/.

AssignBot est utilisable − normalement :) − sur toutes les forges Heptapod ou Gitlab, à partir du moment où un service d’intégration continue est disponible et qu’un compte applicatif pour AssignBot a été crée.

  • Quelles sont les perspectives d'évolution de cet outil (s'il y en a) ?

Il y a deux évolutions possibles qui me viennent en tête.

La première serait d’avoir une fonctionnalité pour publier automatiquement les merge requests qui ont été validées depuis un certain temps. Il est courant dans nos pratiques à Logilab, de mettre un tag « To Publish » ou simplement d’approuver une merge request pour que l’auteur publie ensuite. Dès fois, ça nous sort de la tête, on a oublié qu’il y avait du code à publier. AssignBot pourrait peut être s’en charger, en disant « si les tests passent et que quelqu’un a approuvé il y a plus de XXX jours alors je publie », ce qui est aligné avec l’objectif « faire en sorte que les choses avancent ».

L’autre idée est qu’actuellement AssignBot sauvegarde un historique sur un serveur S3. Donc il est nécessaire d’avoir un tel serveur pour utiliser AssignBot. Une évolution sans doute intéressante serait d’utiliser tout simplement un artifact Gitlab. Ça permettrait de supprimer cette dépendance et d’avoir un robot “tout en un”.


Négociation de contenu dans CubicWeb

30/09/2020

CubicWeb est un cadriciel libre de gestion de données sur le Web développé et maintenu par Logilab depuis 15 ans. Il est utilisé depuis 2010 dans des applications d'envergure telles que DataBnF ou FranceArchives. Basé sur les principes du web sémantique depuis sa création, il adopte à son rythme les standards du W3C pour faciliter la publication de données sur le Web de données liées (LOD).

CubicWeb vient de franchir une nouvelle étape avec la version 3.28 sortie le 24 juin 2020, qui met à disposition la négociation de contenu HTML / RDF.

Cette fonctionnalité a fait l'objet d'un article scientifique et d'une démonstration lors de la conférence d'Ingénierie de Connaissance de la Plateforme Française d'Intelligence Artificielle.

Nous allons maintenant présenter CubicWeb, les principes de la négociation de contenu en général, les choix faits pour la mettre en oeuvre dans CubicWeb et comment personnaliser le RDF généré.

Présentation de CubicWeb

CubicWeb fonctionne par composants, appelés cubes, qui peuvent être combinés pour créer une application (qui est elle-même un cube réutilisable). Un cube est composé:

  1. 1- d'un schéma (ou modèle données) exprimé en YAMS, un langage qui permet d'exprimer un modèle entité-association et les permissions associées en python ;

  2. 2- d'une logique applicative ;

  3. 3- de vues (interfaces graphiques ou fonctions d'export de données).

Lorsqu'une application est "instanciée", le schéma YAMS est compilé en un schéma SQL et une base de données Postgresql est initialisée pour stocker le modèle et les données de l'application.

Schéma YAMS du cube Blog

La logique de l'application, écrite en Python, interagit avec la base de données par le biais du schéma YAMS et du langage de requête RQL. Il n'y a donc pas besoin d'écrire des requêtes SQL et de se préoccuper du schéma physique de la base relationnelle sous-jacente.

L'introduction d'une séparation nette entre l'obtention des données via une requête RQL et leur mise en forme par une vue permet d'offrir à l'utilisateur une grande liberté dans son exploration de la base.

S'il n'y a pas de vue personnalisée prévue pour une entité du modèle YAMS, une vue est générée automatiquement, ce qui assure que toutes les données sont visibles et manipulables, ne serait-ce qu'au travers d'une interface minimale qui permet aux utilisateurs autorisés d'ajouter, éditer et supprimer les entités de l'application.

Dans cette architecture, offrir une représentation RDF d'une ressource/entité consiste à définir une vue spécifique, qui traduira dans le vocabulaire RDF choisi les entités définies par le modèle YAMS.

Présentation de la négociation de contenu

La négociation de contenu permet d'obtenir plusieurs représentations d'une même ressource à partir d'une même URL^1.

Une personne visitant la ressource http://cubicweb.example.com/person/123 avec son navigateur souhaite généralement obtenir la version HTML pour la lire. Dans le Web de données, un robot ou un programme sera plus intéressé par la représentation RDF de cette ressource pour en traiter les données.

Schéma d'un serveur retournant pour la même URL http://cubicweb.example.com/person/123 soit la représentation RDF à un robot, soit la représentation HTML à un humain.

La même ressource abstraite est donc mise à disposition par le serveur sous deux représentations distinctes : le RDF et le HTML. Le mécanisme de négociation de contenu permet de servir ces représentations depuis la même URL, qui pourra ainsi être partagée entre ces deux mondes : humain et robot.

Implémentation de la négociation de contenu

La négociation de contenu passe par les différents en-têtes Accept* d'une requête HTTP. Elle peut concerner la langue avec Accept-Language, le jeu de caractères avec Accept-Charset, l'encodage avec Accept-Encoding ou encore le format avec Accept.

C'est l'en-tête Accept qui est utilisée par le client pour spécifier qu'il souhaite la représentation RDF d'une ressource dans un format donné, en utilisant l'un des types MIME suivants :

  • · application/rdf+xml

  • · text/turtle

  • · text/n3

  • · application/n-quads

  • · application/n-triples

  • · application/trig

  • · application/ld+json

Lorsqu'une requête est envoyée au serveur avec l'en-tête Accept et un type MIME de la liste ci-dessus, le serveur peut répondre de plusieurs façons.

Il peut indiquer au client, via une redirection intermédiaire (303 See Other), l'URL où se trouve la ressource dans la bonne représentation. C'est le choix fait par Virtuoso.

Négociation de contenu avec réponse 303 See Other

Il peut également répondre en envoyant directement la description RDF dans le format correspondant au type MIME de la requête.

Négociation de contenu directe

C'est le choix que nous avons fait dans CubicWeb, pour éviter une seconde requête et gagner en efficacité.

Description RDF des entités CubicWeb

Dans la version 3.28, CubicWeb fournit une représentation en RDF par défaut de ses entités, qui contient deux «types» de triplets :

  • · ceux qui décrivent les relations et attributs du schéma YAMS. Ils utilisent le préfixe http://ns.cubicweb.org/cubicweb/0.0/, abrégé en cubicweb.

  • · ceux qui décrivent des relations Dublin Core.

Par exemple, si vous avez une instance qui héberge des articles de blog (CustomBlogEntry), vous pourrez exécuter :

curl -iH "Accept: text/turtle" http://cubicweb.example.com/customblogentry/2872

qui retournera :

@prefix cubicweb: <http://ns.cubicweb.org/cubicweb/0.0/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

# triplets Cubicweb (générés par cw_triples())
<http://cubicweb.example.com/902> cubicweb:wf_info_for <http://cubicweb.example.com/901> .

<http://cubicweb.example.com/901> a cubicweb:CustomBlogEntry ;
    cubicweb:content "Ceci est le contenu de mon billet de blog" ;
    cubicweb:content_format "text/plain" ;
    cubicweb:creation_date "2020-07-09T07:59:09.339052+00:00"^^xsd:dateTime ;
    cubicweb:entry_of <http://cubicweb.example.com/900> ;
    cubicweb:modification_date "2020-07-09T07:59:29.300045+00:00"^^xsd:dateTime ;
    cubicweb:title "Mon billet de blog" .

# triplets Dublin Core (généré par dc_triples())
    dc:language "en" ;
    dc:title "Mon billet de blog" ;
    dc:type "Blog entry" .

Personnaliser le RDF généré

Pour personnaliser la représentation RDF d'un type d'entité, il faut créer une classe héritant de EntityRDFAdapter, puis redéfinir sa méthode triples qui doit, comme son nom l'indique, renvoyer un ensemble de triplets. Les triplets sont formés avec rdflib.

Par défaut, la méthode triples appelle les méthodes cw_triples et dc_triples de EntityRDFAdapter pour récupérer respectivement les triplets CubicWeb et les triplets Dublin Core. Ces méthodes peuvent être surchargées si nécessaire.

Le code ci-dessous montre un exemple d'adaptateur RDF pour la classe BlogEntry. La fonction _use_namespace permet de relier un préfixe à son namespace dans le graphe RDF généré, en l'ajoutant au dictionnaire NAMESPACES du module cubicweb.rdf.

from rdflib import URIRef, Namespace
from cubicweb.entities.adapters import EntityRDFAdapter
from cubicweb.rdf import NAMESPACES

NAMESPACES["sioct"] = Namespace("http://rdfs.org/sioc/types#")

class BlogEntryRDFAdapter(EntityRDFAdapter):
    __select__ = is_instance("BlogEntry")

    def triples(self):
        SIOCT = self._use_namespace("sioct")
        RDF = self._use_namespace("rdf")
        yield (URIRef(self.uri), RDF.type, SIOCT.BlogPost)

Exemple de triplets personnalisés

Dans la version 1.14.0 du cube blog sortie le 24 juin 2020, l'ontologie SIOC (Semantically-Interlinked Online Communities) a été utilisée pour décrire les entités relatives aux blogs.

Voici le résultat obtenu pour un billet de blog :

curl -iH "Accept: text/turtle" https://www.logilab.fr/blogentry/2872

qui renverra:

@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sioc: <http://rdfs.org/sioc/ns#> .
@prefix sioct: <http://rdfs.org/sioc/types#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://www.logilab.fr/2872> a sioct:BlogPost ;
    dcterms:date "2019-06-28T15:28:31.852530+00:00"^^xsd:dateTime ;
    dcterms:format "text/markdown" ;
    dcterms:modified "2020-06-19T13:26:20.750747+00:00"^^xsd:dateTime ;
    dcterms:title "SemWeb.Pro 2019 : envoyez votre proposition avant samedi 31 août !" ;
    sioc:container <http://beta.logilab.fr1377> ;
    sioc:content """La prochaine édition de SemWeb.Pro aura lieu mardi 3 décembre à Paris.\r
\r
![image](<https://www.logilab.fr/file/2873/raw>)\r
\r
Nous vous invitons à soumettre vos propositions de présentation en [répondant à l'appel à communication](<http://www.semweb.pro/semwebpro-2019.html>) **avant le 31 août 2019**.\r
\r
Pour être tenu informé de l'ouverture de la billetterie, envoyez un courriel à contact at semweb.pro en demandant à être inscrit à la liste d'information.""" .

Les prochaines étapes pour CubicWeb

Permettre la négociation de contenu est une étape de nos travaux actuels pour faire de CubicWeb une brique à part entière du LOD. Nous travaillons déjà à la génération d'archive RDF pour faciliter l'export, mais également à la possibilité d'interroger la base en SPARQL, en plus du RQL.


SemWeb.Pro 2019 : envoyez votre proposition avant samedi 31 août !

28/06/2019

La prochaine édition de SemWeb.Pro aura lieu mardi 3 décembre au FIAP Jean Monnet, à Paris.

image

Nous vous invitons à soumettre vos propositions de présentation en répondant à l'appel à communication avant le 31 août 2019.

Pour être tenu informé de l'ouverture de la billetterie, envoyez un courriel à contact@semweb.pro en demandant à être inscrit à la liste d'information.


Logilab soutient pgDay Lyon 2019

24/06/2019

Nous avons eu le plaisir de soutenir l'organisation du pgDay Lyon 2019 aux côté des spécialistes de Postgresql et d'autres sociétés qui en font un usage intensif.

Le programme montre que Postgresql est une base de données très flexible, qui allie performances et très grandes quantités de données !


La conférence Mercurial aura lieu mardi 28 mai, à Paris !

03/05/2019

Co-organisée par Logilab, Octobus & RhodeCode la conférence Mercurial aura lieu mardi 28 mai au siège de Mozilla, à Paris.

Mercurial est un système de gestion de contrôle de code source distribué gratuitement qui offre une interface intuitive pour gérer efficacement des projets de toutes tailles. Avec son système d'extension puissant, Mercurial peut facilement s'adapter à n'importe quel environnement.

image

Cette première édition s'adresse aux entreprises qui utilisent déjà Mercurial ou qui envisagent de passer d'un autre système de contrôle de version, tel que Subversion.

Assister à la conférence Mercurial permettra aux utilisateurs de partager des idées et des expériences dans différents secteurs. C'est aussi l'occasion de communiquer avec les principaux développeurs de Mercurial et d'obtenir des mises à jour sur le flux de travail et ses fonctionnalités modernes.

Inscrivez-vous !

Mozilla : 16 bis boulevard Montmartre 75009 - Paris


Mini-sprint mercurial du 4 au 7 avril à Paris

18/03/2019

Logilab co-organise avec la société Octobus, un mini-sprint Mercurial qui aura lieu du jeudi 4 au dimanche 7 avril à Paris.

image

Logilab accueillera le mini-sprint dans ses locaux parisiens les jeudi 4 et vendredi 5 avril. Octobus s'occupe des samedi et dimanche et communiquera très prochainement le lieu retenu pour ces jours-là.

Afin de participer au sprint, remplissez le sondage et indiquez votre nom et les dates auxquelles vous souhaitez participer.

Vous pouvez aussi remplir le pad pour indiquer les thématiques que vous souhaitez aborder au cours de ce sprint : https://mensuel.framapad.org/p/mini-sprint-hg

Let's code together!


Logilab soutient pgDay Paris 2019

05/03/2019

Nous avons le plaisir de soutenir l'organisation du pgDay Paris 2019 aux côté des spécialistes de Postgresql et d'autres sociétés qui en font un usage intensif.

Consulter le programme, il est montre que Postgresql est une base de données très flexible, qui allie performances et très grandes quantités de données !


Fosdem 2019, nous y étions !

19/02/2019

Découvrez le retour de Nicolas Chauvat sur l'édition 2019 du FOSDEM qui a lieu les 2 et 3 février à Bruxelles, en Belgique.

image

À cette occasion, Nicolas a présenté le dernier projet de Logilab, un redémarrage de CubicWeb pour le transformer en une extension Web permettant de parcourir le Web des données. L'enregistrement de la conférence, les diapositives et la vidéo de la démo sont en ligne.


Logilab présent au Capitole du Libre 2018

05/12/2018

Logilab, comme les années précédentes, a apporté son soutien au Capitole du Libre à Toulouse et a contribué à son programme en présentant Déployer des applications python dans un cluster openshift et Retour d'expérience sur la mise en place de déploiement continu.

image

Ces deux présentations ont été assurées par Philippe Pepiot et Arthur Lutz, tous les deux ingénieurs développeurs au sein de Logilab.