Thématiques principales

samedi 30 juin 2018

Ceux qui nous motivent

Lorsque l'on réalise un entretien d'embauche (que l'on soit recruteur ou postulant), ce qui est déterminant, ce sont les gens et les personnalités. Au delà des compétences, l’élément déclencheur sera toujours la réponse a la question: "mais est ce que j'ai envie de bosser avec lui?"

Bien sur cela ne se résume pas à choisir un collaborateur qui sera sympa mais surtout si ce futur collaborateur aura sur moi un impact intellectuellement significatif en m'ouvrant à de nouvelles perspectives, de nouvelles réflexions. 

Personnellement, ça a toujours été la clef de mon choix dans ma manière de choisir mes employeurs. A chaque fois, le point qui m'a pousser a choisir une entreprise plutôt qu'une autre a été l'humain. 

Pour nuancer mon propos, je dirais qu'a l'inverse c'est aussi l'humain qui m'a fait quitter mes postes.... car certaines personnes a l'opposé n'apportent pas grand chose et souvent au contraire perturbent, font douter lorsque ce n'est pas justifié et corrompent la pensée. On en sort souvent en se ressourçant par une bonne prise de recul. Cependant, cela consomme de l’énergie qui aurait pu être mieux utiliser...

lundi 25 juin 2018

IA : Intelligence artificielle

En mars dernier nous avions commencé à évoquer quelques notions mathématiques indispensables à la compréhension de l'implémentation de l’IA comme les vecteurs, les matrices ou les fonctions de calcul d’erreur (comme l’erreur quadratique) [1]. Nous avions aussi évoqué la relation que le domaine de l'Intelligence Artificielle pouvait avoir avec le domaine de l’automatique [2]. Aujourd’hui nous allons parfaire ce tour d’horizon des bases de l’IA en nous intéressant un peu plus aux origines de l’IA.

Un peu d'histoire

Pour parler de l'IA, je vous propose avant tout de revenir aux origines de l’informatique. Alors bien sûr, nous allons évoquer Alan Turing et son fameux article de 1950 sur l’intelligence dans le calcul informatique, soulevant la question : les machines pensent elles ? [3] Mais avant cela, il faut aussi évoquer brièvement, tout comme Turing l’a fait lui même, les origines de l’informatique avec la Machine de Manchester de Charles Babbage [4] qui fut le premier à élaborer une machine capable de calcul. Celle ci était certes mécanique (et non électronique) et partiellement fonctionnelle mais déjà à cette époque, il a été possible de penser des machines capable de réaliser des tâches équivalentes a celles réalisées par l'homme. En effet, cette machine permettait entre autre la mise en œuvre de calcul analytique à partir de carte perforée (à l’image de nos disquettes des années 80) ouvrant alors le champs de l'automatisation que nous connaissons aujourd'hui.



A la suite de Charles Babbage, (et la aussi cité par Alan Turing), il est intéressant de savoir que la première personne à utiliser et étudier cette machine fut une femme, Lady Ada Lovelace [5] considérée aujourd’hui comme la première personne à avoir développé un programme “informatique”. Celle-ci, intervient là aussi de façon significative dans la réflexion de Alan Turing lorsqu’elle conclut (je me permets peut être abusivement de résumer) que les machines ne feront que ce pour quoi elles ont été programmé.

En un sens elle n'avait pas tort mais Turing, dans son article (et c’est peut être la son génie), verra dans les capacités offertes par l'électronique beaucoup plus de potentiel et de possibilité. A la décharge de Ada Lovelace, bien que contemporaine de Georg Ohm, et de la seconde révolution industrielle qui verra exploser l’utilisation de l'électricité, il lui aurait encore fallu attendre le tube électronique au début du siècle (1900) dernier pour commencer à pouvoir imaginer ce que verra 50 ans plus tard Turing

Bien sur, avant cet article, la science fiction avait déjà évoqué le concept d’intelligence artificielle et les conséquences de machines pensantes, comme par exemple Issa Asimov, lorsqu'il formula les 3 lois de la robotique [6] soulevant ainsi la question de la problématique morale dans laquelle l’homme pourrait se trouver si un jour les machines devenaient capables d’intelligence et de réflexion.

Approche scientifique

Pourtant l’article de Turing marqua un basculement car, à partir de celui-ci, la question de l’intelligence des machines et de leur capacité à apprendre et penser s’est posée de façon plus formelle auprès de la communauté scientifique. Il proposa le test d'imitation aujourd’hui connu sous le nom de test de Turing, pendant lequel, une IA est évaluée au travers une discussion à l’aveugle afin de déterminer si celle-ci est humaine ou non. Bien sur ce qui est évalué, comme tout bon protocole expérimental, est le taux statistique de réussite à duper un humain comparé a ce que serait capable de faire un véritable humain (et oui car il est possible aussi qu’un humain ne soit pas crédible en tant qu’humain… le fameux faux positif, nous y reviendrons quand nous traiterons du bayesianisme)

Il est évident que ce test comporte de nombreuses limites car effectivement, réussir ce test ne permet pas forcément de se convaincre que l’IA, est réellement capable de penser, d'élaborer une réflexion, juste qu’elle en donne une impression suffisante pour donner le change. Mais alors qu'est ce que l'IA?

Une définition de l’IA

Tout d'abord distinguons L'Intelligence artificielle et UNE intelligence artificielle. Le premier est l'ensemble des théories permettant la mise en œuvre de la seconde, c'est à dire une entité capable de simuler la pensée [23]. Cette définition reste cependant assez vague sur la notion de simulation. Est ce être capable de mimer une pensée comme un être humain comme le propose Turing dans son article ? Finalement si nous reprenons son test, celui ci ne permet que d'évaluer et valider la conséquence possible d'être une chose pensante, rien ne dit que d’autres solutions ne pourraient amener à la même conclusion sans que ces solutions soient des entités pensantes.

Tout cela est finalement très philosophique mais ces points ont le mérite de soulever des questions sur la nature même de la pensée, voir de la conscience [7, 8]. Ainsi il sera possible de distinguer deux types d'intelligences artificielles, celles dites faibles (qui ne fait que mimer la pensée mais suffisamment pour nous tromper) celles dites fortes, qui elles pensent vraiment et dont le statut est clairement a redéfinir. Nous reviendrons sur ces deux concepts mais il est à noter qu’à l'heure d'aujourd'hui seul le premier type d'IA existe.

De Turing a aujourd'hui

Suite à l'article de Turing, l’IA a été très en vogue avec un engouement qui a eut malgré tout des hauts et des bas en sautant de découvertes prometteuses en désillusion. Elle s’est construite sur différents domaines, la mathématique, l’informatique, l’automatique et la robotique.

Dans un premier temps, elle a fait émerger des domaines plus accessibles à une mise en œuvre comme les systèmes experts [17] ou la logique floue issue de l'automatique (nous reviendrons sur la logique flou dans un autre article). Nous avions déjà traité dans l'article [9] les systèmes experts. Pour rappel, ces derniers ont la particularité de réifier la connaissance des experts des domaines par la mise en œuvre d'un langage de règles (porté par du Lisp [10] ou Prolog [11] par exemple). Cette approche, a permit des avancés majeures dans le domaine médical en fiabilisant les processus de diagnostic [12]. Pourtant ces approches, bien que performantes, n'ont pas eut le succès escompté à cause d'une réception assez peu positive du public. Leur règne aura pourtant duré de 1969 à 1993. Aujourd'hui les systèmes experts n'en ont pas pour autant disparu. Des Framework tels que Drools [13] continuent d'être largement employés.

Face à cette désillusion au cours des années 90, la recherche en IA a su réorienter ses ressources en redécouvrant le modèle neuromimétique [14], exprimé par McCulloch et Pitts en 1943, mais considéré à l'époque comme trop complexe a mettre en œuvre. Ce modèle donna à la recherche en IA un nouveau souffle qui cependant fut de courte durée à cause des moyens et solutions techniques encore trop limités. Cependant ce regain d’intérêt a profité a d'autres approches qui a l'instar de l'idée que l'observation de la nature pouvait permettre l'élaboration de nouvelles formes d'IA, permis, dans les années 2000, le renouveaux d'algorithmes tels que les algorithmes de vie artificielle [15], les algorithmes génétiques [16], les systèmes multi-agents [17] ou le Machine Learning qui peinait a émerger depuis 1980 [21] mais qui profita de l'explosion du BigData pour redevenir un incontournable du traitement des données.

Déclinaison de l'IA



L'IA est donc un domaine vaste composé donc principalement d'un coté des systèmes experts et de l'autre ce que l'on appelé le Machine Learning.

La machine Learning est un sous domaine de l'intelligence artificielle composé d'un ensemble d'approches et techniques mathématiques permettant la mise en œuvre d'algorithmes et de structures simulant des processus d'apprentissages.

Nous ne traiterons pas ici du contenu de ces différents algorithmes et vous invite pour cela sur d'autres futurs articles cependant, nous pouvons les lister. Le machine Learning se subdivise en différentes catégories [18, 19, 20, 21] guidées par le mode d'apprentissage ou les structures logiques mise en œuvre.Ainsi, de façon non exhaustive, nous trouverons donc les différents types d'apprentissages suivant:

  • Supervisé guidé par des algorithmes et structure de type:
    • Régression linéaire ou logistique 
    • Descente de gradient  
    • Régression polynomiale 
    • Séparation a vaste marge (machine à vecteurs de support) 
    • Arbre de descision 
    • Classification linéaire ou non linéaire 
    • Réseau de neurone 
    • Naïve bayes
  • non-supervisé guidé par des algorithmes et structure de type:
    • Foret aléatoire 
    • Clustering et réduction de dimension 
    • SVD 
    • Analyse par composante principale (a noyau ou non) 
    • Règles
  • Par renforcement 
  • Semi-supervisé

Enfin depuis 2014, une approche différente des réseaux de neurones a été proposée par Yann Lecun [24] : le Deep Learning [28]. Ainsi, âpres avoir travaillé depuis les années 80 sur les réseaux de neurones, et proposé différentes améliorations de leur algorithme (par exemple sur la back propagation en 99 [25]), Yann LeCun a proposé la mise en abîme des couches des réseaux de neurones en multipliant leur nombre et leur type (de convolution, de filtrage, de réduction de dimension, etc.) et améliorant alors significativement leur efficacité.

Objectifs

Le but de cet article n'est pas d'entrer dans le détail des techniques de ML ni du DeepLearning (ceci sera l'objet d'articles futur), mais d'en présenter surtout l'historique et les champs d'applications. Ainsi il faut garder a l'esprit que désormais, il faut faire avec l'IA dans notre quotidien, et pour ceux qui ne sont pas encore convaincu, il suffit de regarder la cascade d'innovations majeures menant aux dernières avancées de l'IA connues aujourd'hui: Alpha Go [26], Google Home ou plus récemment Alexa de Amazon et bien d'autres [27].

Pour preuve, il suffit juste de penser aux algorithmes de recommandations des vidéo Youtube, les systèmes de notations de films chez NetFlix, ou encore les outils de reconnaissance vocale dans votre téléphone Androïde ou Apple.

L'IA est aujourd'hui partout et sous de multiples forme. Elle va aussi servir [29] dans l'aide à la conduite ou même dans la mise en œuvre de système de conduite autonome. Elle était déjà présente dans le domaine médical via les systèmes experts mais les réseaux à base de DeepLearning deviennent maintenant incontournables en aidant au dépistage des cancers.

En fait le champs applicatif de l'IA est partout ou la, nous, être humains, avons une activité [30] dite classique (par exemple et tout betement le tri de CV [31]).

Conclusions

Nous arrivons au terme de cet article. J’espère qu'il aura été intéressant autant pour vous que pour moi car la je sors un peu de mes habitudes en traitant plus de l'historique que de techniques. Je n'ai pas beaucoup parlé des concepts d'IA faible et d'IA forte, juste évoqué, mais à la lecture de cet article, je pense qu'il n'est pas nécessaire d'en dire grand chose a part qu'aujourd'hui tout ce que nous entendons par IA, est en fait de l'IA faible et que l'IA forte (celle doté de conscience et qui détruira l'humanité ^^) n'est pas encore la (je n'ai pas dit que le sujet n'est pas d'actualité mais disons que techniquement, il nous faudra encore quelques décennies de recherche).

Références

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/03/notions-de-mathematiques-elementaires.html
[2] https://un-est-tout-et-tout-est-un.blogspot.com/2018/04/ia-principe-de-lautomatique.html
[3] https://www.csee.umbc.edu/courses/471/papers/turing.pdf
[4] https://fr.wikipedia.org/wiki/Charles_Babbage
[5] https://femmessavantes2.pressbooks.com/chapter/ada-lovelace-mathematicienne-1815-1852/
[6] https://fr.wikipedia.org/wiki/Trois_lois_de_la_robotique
[7] https://www.youtube.com/channel/UC0NCbj8CxzeCGIF6sODJ-7A
[8] https://www.youtube.com/channel/UCqA8H22FwgBVcF3GJpp0MQw
[9] https://un-est-tout-et-tout-est-un.blogspot.com/2018/01/ia-les-systemes-experts-drools.html
[10] http://lisp-lang.org/
[11] http://www.swi-prolog.org/
[12] https://en.wikibooks.org/wiki/Expert_Systems/MYCIN
[13] https://www.drools.org/
[14] http://www.cse.chalmers.se/~coquand/AUTOMATA/mcp.pdf
[15] https://fr.wikipedia.org/wiki/Vie_artificielle
[16] http://souqueta.free.fr/Project/files/TE_AG.pdf
[17] https://www.inprincipio.xyz/systemes-experts/
[18] https://dzone.com/articles/deep-dive-into-machine-learning?edition=334840&utm_source=Weekly%20Digest&utm_medium=email&utm_campaign=Weekly%20Digest%202017-11-08
[19] https://www.datasciencecentral.com/profiles/blogs/decoding-machine-learning-methods?utm_content=bufferfd5b1&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
[20] https://dzone.com/articles/artificial-intelligence-vs-machine-learning-vs-dee?edition=343095&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=Daily%20Digest%202017-12-05
[21] https://dzone.com/articles/demystifying-ai-machine-learning-and-deep-learning
[22] https://dzone.com/articles/machine-learning-algorithms-which-one-to-choose-fo?edition=334817&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=Daily%20Digest%202017-10-30
[23] https://fr.wikipedia.org/wiki/Intelligence_artificielle
[24] https://www.nature.com/articles/nature14539
[25] http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf
[26] https://deepmind.com/research/alphago/
[27] https://www.business2community.com/trends-news/10-companies-using-machine-learning-cool-ways-01889944#tglOfs28u8HMalfU.97
[28] https://medium.freecodecamp.org/want-to-know-how-deep-learning-works-heres-a-quick-guide-for-everyone-1aedeca88076
[29] https://www.mathworks.com/discovery/deep-learning.html?s_v1=21617&elqem=1711045_EM_WW_17-11_COMM-GOV-DIGEST_NEWSLETTER_DEFAULT&elqTrackId=05e1f66444b94d7c9517446750fe547d&elq=070b93472b5b4eaab436c04dbb819624&elqaid=21617&elqat=1&elqCampaignId=7021
[30] https://dzone.com/articles/effective-learning-the-near-future-of-ai-1?edition=334921&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=Daily%20Digest%202017-11-16
[31] https://dzone.com/articles/cv-r-cvs-retrieval-system-based-on-job-description?edition=333604&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=Daily%20Digest%202017-10-17
[32] https://dzone.com/articles/ai-glossary?edition=306214&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=dd%202017-07-04

lundi 18 juin 2018

Livre sur Scala

Je cherchais un bon livre sur Scala, assez technique qui ne soit par une redite des concepts de base de l'informatique mais permette de comprendre les points forts du langage, et bien celui ci honore ses promesses : rapide, synthétique et clair.

Je ne m'attarde pas car de toute façon je reviendrais sur ce langage dans de futurs articles.


dimanche 10 juin 2018

SGBD : Liquibase

La réalisation d’un système logiciel fait intervenir de nombreux types de composants. Qu’ils soient dédiés à l’IHM, à la logique métier ou aux données, leur conception, réalisation et maintenance sont des défis pour les équipes de développement.

Différentes avancées ont permis de rationaliser un certains nombre de ces activités en proposant des solutions afin de gérer le versionnage des sources. Ainsi des outils comme CVS ou SVN, dans un premier temps, ou Git et Mercurial sont couramment employés afin de gérer le code sources, gérer les versions et faciliter l’industrialisation.

Pourtant il existe un type de composant que ne permet pas de gérer ce type d’outil : les SGBD. En effet, si les outils comme git ou svn sont capable de tracer dans le temps l’ensemble des modifications apportés à un code source, il demeure très complexe d’avoir une vision similaire sur un SGBD car même si il est toujours possible de gérer son schéma statiquement, cela n’aide pas à la gestion des modifications au sein même de la base ni du devenir des données.

Approche proposée : Liquibase

Pour répondre à cette problématique, je vous propose de vous présenter l’outil Liquibase [6]. Nous allons au travers de cet article nous référer à certaines définitions évoquées dans les articles précédents sur les SGBD, je vous invite donc à vous y reporter [1-5]

Liquibase est un outil permettant la gestion du cycle de vie d’une base de données comme le ferait un gestionnaire de code sur du source. Il s’utilise sous deux formes soit en stand alone, c’est à dire à partir de binaire (la version 3.5.5 de liquibase [7] ), soit en utilisant son plugin maven (la version 3.6.1 [8-9]) .

Dans son principe, l’utilisation de l’un ou de l’autre importe assez peu puisque les deux s’appuient sur les mêmes processus et les même types de données cependant, afin d’affiner notre compréhension de l’outil, nous présenterons les deux approches.

Principes

Avant cela, il faut décrire le fonctionnement de liquibase. L’outil s’appuie des fichiers de type databasechangelog (au format YAML ou JSON mais sont préférentiellement en XML) qui recensent des instructions de gestion.

<databasechangelog xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemalocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
</databasechangelog>

Ces instructions peuvent être de différents types. Elles peuvent être soit:
  • des préconditions 
  • des properties 
  • des changeset 
  • des includes

Les preconditions

Les préconditions se déclarent soit dans un databasechangelog, soit dans un changeset. Elles permettent de définir les conditions d'exécutions pour les autres types d’instructions auxquelles elles sont associées selon le type de base de donnée utilisé ou selon des paramètres internes à la bd (des données particulières dans certaines relations) où selon des paramètres externes (données d’environnement) ou encore selon l'état de la base (lorsqu’il s’agit d’appliquer ou non un patch sur le schéma par exemple)

<preconditions>
     <dbms type="oracle">
     <runningas username="SYSTEM">
 </runningas></dbms></preconditions>

Les propriétées

Les propriétés sont des données basiques permettant de paramétrer les autres instructions contenus dans les fichiers databasechangelog avec un formalisme proche de celui utilisé par les paramètres maven. Par exemple


<property dbms="oracle" name="clob.type" value="clob">
</property>

permet lors la déclaration d’un attribut de relation de préciser:

<column name="${column1.name}" type="${clob.type}">
</column>

Les includes

Les includes sont des instructions permettent d’ajouter d’autres fichiers de type databasechangelog contenant eux-même d’autres instructions ou scripts SQL. Leur utilisation est importante car elles permettent de dissocier physiquement les différentes évolutions de la base de données mis en oeuvre tout au long du cycle de vie du projet. C’est une instruction simple permettant d’inclure soit un fichier spécifique, soit le contenu d’un répertoire:

<include file="com/example/news/news.changelog.xml">
<includeall path="src/main/resources/liquibase/changelogs">
</includeall></include>

Les changeSet

Enfin les instructions de type changeset portent les informations sur les changements à apporter à la base de données. Ces changement concernent soit des instructions de création, des modifications, des injections de données, des suppressions et/ou filtrage et nettoyage des données ou, de façon plus définitive, des suppressions de relations.


<changeset author="bob" id="1">
  <createtable tablename="user">
   <column name="id" type="int">
   <column name="nom" type="varchar(32)">
   <column name="age" type="int">
  </column></column></column></createtable>
 </changeset>


A ces modifications d’ajout où de suppression, les changeset permettent également (et c’est même plutôt conseillé) de définir une procédure de rollback. Ces procédures sont quasi aussi importante que les évolutions car elles permettent de garantir l’annulation des modifications faites sur la base lors d’un échec d’un déploiement logiciel par exemple.


<rollback>
   <droptable tablename="testTable">
   </droptable>
</rollback>


Chaque changeset implique un nouvel état de la base. Ils sont identifiables via un identifiant et doivent être porté par un utilisateur. Ainsi, pour chaque nouveau changeset de déclaré, un nouvel état possible de la base peut être considéré et ce de façon séquentielle (ordre de lecture du fichier, peut importe les identifiants).



Ce processus de versionnage de base va remplir 80% des cas d’utilisations de liquibase en donnant des moyens simples de suivre les versions et les modifications apportés au fil du temps à la base de données. Cette utilisation va surtout faciliter la reconstruction des versions successives du schéma d’une base.

Il est pourtant possible d’aller plus loin dans l’utilisation de Liquibase et de réaliser des conceptions plus modulaire de la base de données en s’appuyant sur les contextes.

Les contextes

Les contextes sont des sortes de tags (attentions ce ne sont pas des tags car ce concept existe aussi dans liquibase mais nous verrons cela plus loin) permettant d'exécuter qu’un sous ensemble des changeSet. Sans forcément s’appuyer sur des données environnementale comme pour les préconditions, l’utilisation de contexte va permettre de classer les changeset dans des ensembles exécutables ensemble ou non selon le besoin.

Ainsi, l’utilisation première que l’on fera des contextes est de différencier les changeset permettant de construire la base dans une version iso de la prod et les changesets de test dont la seul vocation est de fournir des jeux de données à injecter pour les phases IVQ. Ceci est un premier use case de l’emploie des contextes, mais les contextes effectivement peuvent permettre aussi de concevoir une base de schéma distribué et de façon modulaire en intégrant les spécificités selon l’application qui l'exploite. Cette approche permet d’avoir une approche globale de conception tout en gardant une approche locale de déploiement.


<changeset author="bob" context="schema" id="1">
  <createtable tablename="testTable">
   <column name="id" type="int">
   <column name="nom" type="varchar(32)">
   <column name="age" type="int">
  </column></column></column></createtable>
  <rollback>
   <droptable tablename="testTable">
  </droptable></rollback>
 </changeset>

 <changeset author="bob" context="test" id="2">
  <insert tablename="testTable">
   <column name="id" value="2">
   <column name="nom" value="tata">
   <column name="age" value="59">
  </column></column></column></insert>
  <rollback>
   <delete tablename="testTable">
    <where>id=2</where>
   </delete>
  </rollback>
 </changeset>

 <changeset author="bob" context="schema" id="3">
  <addcolumn tablename="testTable">
   <column name="address" type="varchar(255)">
  </column></addcolumn>
  <rollback>
   <dropcolumn columnname="address" tablename="testTable">
  </dropcolumn></rollback>
 </changeset>


Dans cet exemple, un changeset construit une première partie de la base dans un contexte schema et suivit par une injection de données dont la finalité est de faire des tests (contexte test). Ces deux parties du processus pourront alors être appelé indépendamment et géré de façon séparé (en terme de correction). Ainsi, si une nouvelle modification doit être appliqué au schéma de base (ici le changeSet d’id 3), il sera possible de valider différents scénarios de mise à jour et construction de la base:

tout le processus d’initialisation du schéma peut être exécuté sur une base vierge de données (appel du contexte schema seul) et vérifier ensuite que l’injection des données est toujours faisable (en appliquant ensuite le contexte test). appliquer les deux contextes simultanément afin de vérifier que la modification du schéma sur une base contenant des données ne pose pas non plus de problème afin de garantir qu’en production, la migration se réalise sans problème malgré les données

Exécution

Nous en avions parlé au début de l’article, l’utilisation de liquibase peut se faire soit en ligne de commande soit via un plugin maven. Bien sur l’utilisation en ligne de commande fournira plus de finesse dans la mise au point et le debugage, cependant l’utilisation du plugin maven permettra une industrialisation plus efficace dans les phase de compilation, test, intégration et mise en production.

CLI

Appliqué en ligne de commande, liquibase nécessite quelques ressources telles que le fichier changelog.xml, les login/pwd de la base de données, l’url de la base, son driver, et le classpath dans lequel se trouve ce driver. Ensuite quelques paramètres optionnels peuvent être positionnés comme le niveau de debug des logs lors de l'exécution ou l’application spécifique de tel où tel contexte (qui va permettre de filtrer l'exécution des changeset selon les besoins locaux). A cela, il faudra ensuite utiliser la commande voulu comme suit avec la commande update.


$LIQUIBASE_HOME/liquibase --logLevel debug --contexts=schema \
--changeLogFile src/main/resources/liquibase/changelog.xml \
--username test --password test --url=jdbc:h2:file:./target/test \
--driver=org.h2.Driver --classpath=$H2_HOME/bin/h2-1.4.197.jar  update

Toutes ces commandes vont alors servir outils pour renforcer les moyens de gestion du cycle de vie de la base de données, il y a bien sur ceux que nous avons déjà vu : update et rollback mais aussi des commande pour vider la base, ou poser un tag sur un état particulier de la base pour pouvoir y revenir le cas échéant. En voici la liste :
  • update qui applique tous les changeset 
  • updateCount qui applique les n changeset suivant 
  • rollback qui revient a la version portant le tag 
  • rollbackCount qui exécute un rollback sur les n précédent changeset 
  • tag qui applique un tag sur la version courante 
  • dropAll qui vide la base 
Bien sur il y en a d’autres et je vous invite à consulter la documentation pour cela [10].

Ainsi par exemple, l’application de la commande précédente va permettre l’execution des changesets exclusivement associé au contexte schema. Ces changeset vont alors initialiser une base de type H2 dans le répertoire target du projet à partir du changelog.xml du projet.

En utilisant la commande dropAll, il va être possible de rincer complètement la base nouvellement creer. Il sera possible alors d’utiliser la commande updateCount afin de créer la base en mode pas à pas avec un incrément de la valeur du paramètre. De la même manière, il va être possible de réaliser des retours arrières avec la commande rollbackCount ou rollback en spécifiant un tag si la commande tag a ete préalablement utilisé également. De nombreuses possibilités de tests et de manipulations sont réalisable afin de garantir que la base de données sera toujours fonctionnelle.

Maven

Il est aussi possible de réaliser l’application des commandes liquibase lors de l'exécution d’un processus maven. Pour cela il est nécessaire d’employer le plugin maven liquibase-maven-plugin [9]. Ce plugin permet l’utilisation des goals reprenant les différentes commandes exploitable en CLI [11].

Ce plugin est un plugin dont l’utilisation est très classique. Une partie configuration permettant de soit definir les parametres url, driver and coe, directement dans le plugin [12] ou plus simplement de les définir dans un fichier dédié [13].

Ensuite, soit le goal est exploité par un appel avec la commande maven soit appelé par un appel synchronisé avec la phase adéquat.



<build>
  <plugins>
   <plugin>
    <groupid>org.liquibase</groupid>
    <artifactid>liquibase-maven-plugin</artifactid>
    <version>3.6.1</version>
    <configuration> 
       <propertyfilewilloverride>true</propertyfilewilloverride>
       <propertyfile>src/main/resources/liquibase/h2-embedded.properties</propertyfile>
    </configuration>
    <executions>
     <execution>
      <phase>process-resources</phase>
      <goals>
       <goal>update</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
  </plugins>
 </build>

Conclusion

Nous venons de passer en revu les fonctionnalités de liquibase et ses possibilités de gestion du versioning d’une base de données. Il fournit de nombreuses possibilités de manipulations afin d’affiner les tests de migrations des bases contenant où non des données en accompagnant les mises à niveau mais aussi les rollback. Finalement par une gestion plus cohérente du cycle de vie de la base de données, liquibase permet également de concevoir des bases plus flexibles et plus modulaires.

Nous avons aussi vu qu’il était possible de l’utiliser soit de façon manuelle au travers d’une interface CLI permettant de simplifier la mise au point mais aussi de l’employer avec un plugin maven en vue d’automatiser les processus de migration et de modifications.

Cet outil est clairement un incontournable de l’industrialisation du développement en fournissant des moyens pour maîtriser le cycle de vie de la base de données nécessaire à notre application que ce soit en terme de test ou de mise en production.

Références

[1] http://un-est-tout-et-tout-est-un.blogspot.fr/2017/09/postgres-commandes-de-base.html
[2] https://un-est-tout-et-tout-est-un.blogspot.fr/2018/02/sgbd-r-introduction.html
[3] https://un-est-tout-et-tout-est-un.blogspot.fr/2018/02/sgbd-r-normalisation.html
[4] https://un-est-tout-et-tout-est-un.blogspot.fr/2018/02/sgbd-r-algebre-relationnelle.html
[5] https://un-est-tout-et-tout-est-un.blogspot.fr/2018/02/sgbd-r-jointures.html
[6] https://www.liquibase.org/
[7] https://github.com/liquibase/liquibase/releases/download/liquibase-parent-3.5.5/liquibase-3.5.5-bin.zip
[8] http://www.liquibase.org/documentation/maven/index.html
[9] http://mvnrepository.com/artifact/org.liquibase/liquibase-maven-plugin
[10] https://www.liquibase.org/documentation/command_line.html
[11] http://www.liquibase.org/documentation/maven/index.html#using_configuration_property_files
[12] https://www.yegor256.com/2014/07/20/liquibase-in-maven.html
[13] http://www.liquibase.org/documentation/liquibase.properties.html