Thématiques principales

lundi 31 décembre 2018

Docker - Plugin Maven

Un petit écart dans la liste des articles qui devaient être publiés prochainement en abordant le sujet du packaging de nos builds maven dans des images Docker.

On parle d'écart mais en fait pas tant que ca car nous verrons que OSGI se prête bien à une intégration dans docker. Bref ca c’est une autre histoire.

Tout le monde connaît Docker, au moins de nom. Il s’agit d’une solution de conteneurisation [docker-pub], assimilable à de la “virtualisation allégé” (ok le raccourci est rapide) permettant de construire des architectures scalables [scala] de type [microservice] (nous en reparlerons).

L’approche classique pour construire une image docker et d’utiliser la commande “docker build”, si vous êtes un habitué de l’outil, sera de construire un Dockerfile. Je vous laisse pour cela aller consulter l’article [docker-base].

Cependant cette approche en ligne de commande, bien que pratique car universelle n’est pas forcément immédiate dans le cadre d’une industrialisation comme d’un build maven qui aurait pour résultat non pas un artifact java classique [integ-java] mais une image docker prête à l’emploi pour les tests ou la production (vous le voyez poindre le concept de Déploiement Continu?).

Heureusement pour répondre à ce problème il existe deux plugins maven [compar]:
  • spotify/maven-docker-plugin [spotify], et sa nouvelle version [spotify-2] spotify/dokerfile-maven-plugin
  • fabric8io/maven-docker-plugin [fabric8io]

Spotify

Ce plugin maven est celui ci qui collera le plus avec la logique d’utilisation de docker.

En effet, ce plugin s’utilise de façon assez simple soit par configuration xml sur les éléments basiques qu’un dockerfile pourrait contenir où en spécifiant directement un répertoire où se trouvera un dockerfile.

Ainsi ce plugin va permettre de réaliser la phase de build de la commande docker mais aussi en complément la phase de push pour livrer l’image ainsi construite dans un repository comme le docker hub [DocHub].

On pourra regretter que ce plugin ne permet pas de lancer lui même des conteneurs, chose qui aurait pu être intéressant pour la réalisation de phase de tests.

Dans le cadre de cet article, comme dans celui de [compar], nous ne nous attarderons pas sur ce plugin qui finalement fait bien son taff mais ne fournira pas en dehors du cadre de l'intégration à maven beaucoup plus de fonctionnalité que de faire son Dockerfile nous même.

Fabric8io

Le plugin fabric8io sort quand à lui plus des sentier battu en ne s’appuyant pas du tout sur un dockerfile mais sur une approche plus classique dans un environnement maven. En effet, ce plugin propose d’utiliser un descriptif xml du Dockerfile [doc-fabric] ainsi que le mécanisme des assembly [assembly-maven].

A cela, il permet aussi de gérer le cycle de vie des conteneurs en activité (start/stop/kill etc...) ainsi que de publier les images sur un repository (comme le DockerHub [DocHub])

Le plus simple pour présenter le plugin est d’en faire la démonstration.

Ainsi considérons un projet java construit forcément avec un process maven. L’idée d’un build est de généralement construire jar. Dans une approche standard de packaging, le process maven appliquera une phase d’assemblage dans laquelle, le jar, sa conf et ses éventuellement dépendances seront mis dans un targz, un paquet debian où tout autre format de livraison.

Avec docker, le concept permettant d'exécuter un conteneur à partir d’une image quelque soit la plateforme permet d’imaginer une rationalisation du moyen de livraison et d'exécution.

Ainsi, parce que nous utilisons maven, nous allons enrichir un pom parent avec une configuration pluginManagement du plugin fabric8io. L’idée est alors de permettre à tout pom héritant de celui-ci de construire une image docker de packaging et d'exécution.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<profiles>
    <profile>
        <id>DOCKER</id>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>io.fabric8</groupId>
                        <artifactId>docker-maven-plugin</artifactId>
                        <version>0.27.2</version>
                        <configuration>
                            <images>
                                <image>
                                    <name>${docker.login}/${project.artifactId}:%l</name>
                                    <alias>${project.artifactId}</alias>
                                    <build>
                                        <maintainer>Collonville Thomas collonville.thomas@gmail.com</maintainer>
                                        <!-- <dockerFile>Dockerfile</dockerFile> -->
                                        <assembly>
                                            <mode>dir</mode>
                                            <permissions>auto</permissions>
                                            <targetDir>/</targetDir>
                                            <descriptor>../assembly/assembly-docker.xml</descriptor>
                                        </assembly>
                                    </build>
                                </image>
                            </images>
                        </configuration>
                        <executions>
                            <execution>
                                <id>start</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>build</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
    <profile>
        <id>PUSH</id>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>io.fabric8</groupId>
                        <artifactId>docker-maven-plugin</artifactId>
                        <version>0.27.2</version>
                        <executions>
                            <execution>
                                <id>start</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>build</goal>
                                    <goal>push</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
</profiles>

Ainsi la pré configuration maven du plugin permet de façon générale de donner un nom à l’image et spécifier ses informations générales (nom, mainteneur) dans la section “image”.

Ensuite dans une section build on va préciser le contenu de l’image en utilisant les mécanismes d’assembly maven que l’on devra préciser dans le fichier “assembly/assembly-docker.xml”

Enfin en coherence avec la logique des plugins maven se constituant d’une partie configuration et d’une partie exécution, dans cette dernière, on va préciser quelle commande docker nous allons appliquer.

Ici on notera qu’il y a deux profiles maven, l’un DOCKER de base qui apporte la configuration et la construction de l’image et un second PUSH dans lequel on appliquera la commande “push” de docker (cela nécessitera l’utilisation de la propriété docker.login précisant le compte du DockerHub associé et présent dans le nom de l’image)

L’utilisation de ce pom parent passe ensuite par la surcharge du profile DOCKER dans une section plugin (le profile PUSH étant directement hérité).

La surcharge est rapide bien qu’un peu verbeuse à cause du profile maven. (à noter que dans un process complet et générique on pourra in fine s’en passer)


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<profiles>
    <profile>
        <id>DOCKER</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>io.fabric8</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <configuration>
                        <images>
                            <image>
                                <build>
                                    <from>openjdk:8-jre-alpine</from>
                                    <cmd>/opt/equinox-loader/docker.sh</cmd>
                                    <ports>
                                        <port>${jmx.port}</port>
                                    </ports>
                                </build>
                            </image>
                        </images>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Dans ce pom, il s’agira juste de completer les parties manquantes c’est à dire:

  • l’image source utilisé
  • une commande de lancement
  • les ports et les volumes à déclarer
  • pour finir le contenu de l’assembly, faisant office de commande ADD et COPY d’un Dockerfile

Ici nous utiliserons l’image openjdk:8-jre-alpine comme image source que nous allons configurer le port JMX de la JVM et que nous lancerons l’application via un script sh.

Pour ce qui concerne l’assembly, il s’agit à ce niveau d’une assembly standard utilisant des section “dependencySets” et “fileSets”. Je vous invite à consulter la documentation du plugin [plugass] et/ou de lire l’article [assem].

Voilà avec ce plugin, du coup il est possible de construire des images docker contenant directement notre build prêt à l’emploi nous facilitant d’une part la diffusion du livrable mais aussi l’exploitation dans des tests et surtout l’exploitation en production.

Références

[docker-pub] https://un-est-tout-et-tout-est-un.blogspot.com/2017/10/docker-publier.html
[docker-base] https://un-est-tout-et-tout-est-un.blogspot.com/2017/09/docker-construire-son-image.html
[scala] https://fr.wikipedia.org/wiki/Scalability
[integ-java] https://runnable.com/docker/java/dockerize-your-java-application
[microservice] https://fr.wikipedia.org/wiki/Microservices
[spotify] https://github.com/spotify/docker-maven-plugin
[spotify-2] https://github.com/spotify/dockerfile-maven
[fabric8io] https://github.com/fabric8io/docker-maven-plugin
[doc-fabric] http://dmp.fabric8.io/
[compar] https://dzone.com/articles/meet-the-docker-maven-plugin
[assembly-maven] http://maven.apache.org/plugins/maven-assembly-plugin/
[DocHub] https://hub.docker.com/
[assem] https://un-est-tout-et-tout-est-un.blogspot.com/2018/03/maven-assembly-targz-et-jdeb.html
[plugass] https://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html

vendredi 28 décembre 2018

OSGI : Concepts généraux


Aujourd’hui nous allons parler d’un framework qui me tient à coeur: OSGI. Cela faisait un moment que je voulais écrire un article sur celui ci mais beaucoup d’autre sujet, se sont trouvé être plus intéressant sur le moment.

À vrai dire, OSGI est clairement très intéressant mais l’utilisant depuis déjà près de 8 ans, malgré l'intérêt qu’il a intrinsèquement, il ne porte plus pour moi ce goût de nouveau que peuvent avoir les sujets comme l’IA... , c’est évident.

Pourtant voilà, je me suis dit, il est temps de faire le point sur le sujet et de le mettre un peu plus sous les projecteurs, car mine de rien, quasiment tout le monde l’a un jour utiliser, mais très peu de gens le savent!

Mais repartons du début!

Historique

OSGI [OSGI], [wikipedia] ou Open Service Gateway Initiative est un framework de gestion de composants et de services. Initialement prévu pour le monde de l’embarqué (si si ^^), il a été utilisé par des constructeur comme Volvo, BMW ou encore Cisco et s’emploie dans les produits logiciels à destination du monde de la domotique et des systèmes de sécurités

Nous le verrons plus en détail mais pourquoi OSGI? parce que ce framework est léger (en dehors de la JVM) et permet le chargement et le déchargement de ses librairies à chaud tout en facilitant la manipulation de ces dernières dans des versions différentes simultanément.

Issu de la JSR 8 [JSR8], OSGI a été créé dans les années 2000 et a évolué régulièrement. Ainsi aujourd’hui la spécification OSGI en est à la version 7 [OSGI-V7] avec une implémentation de référence fourni par l’Alliance OSGI qui ne doit pas être considéré comme une version de production mais “juste de références”. Ainsi différentes versions open sources ont été implémenté pour répondre à des besoins plus techniques et se sont accaparé ces différentes versions des spécifications comme equinox [equinox], knoplerfish [knoplerfish], concierge [concierge] ou encore felix [felix].

Aujourd’hui la spécification 7 de OSGI forme un pavé de plus de 1000 pages de documentation [OSGI-V7-CORE] et il nous est impossible d’en faire un résumé exhaustif ici cependant dans cet article nous tâcherons de passer en revu les concepts pivots de OSGI pour en comprendre les mécanismes clefs puis nous nous intéresserons aux différentes implémentations ainsi que leur intégrations dans les frameworks plus classique (mais qu’on sait pas que OSGI est dedans…. O_o)

OSGI concepts généraux

OSGI est donc un framework Java. Conçu il y a près de 18 ans, celui ci est un peu partout sans que personne ne le sache vraiment. On le trouve dans la plupart de nos serveurs d’applications JEE, jusque dans nos IDE comme eclipse qui à fondé sa architecture dessus… si si…

Bien sûr ce n’est pas parce que quelque chose est utilisé partout que forcément c’est bien…. c’est vrai on le voit tous les jours avec le framework Spring! non blague à part (ou pas), OSGI est partout mais pour de bonnes raisons et c’est justement sa discrétion qui en fait sa force et sa pertinence.

En effet, OSGI est un framework amenant des moyen technique de mise en oeuvre logicielle mais aussi des moyens conceptuelles, apportant avec lui quelques paradigme de modélisation simple mais efficace laissant libre le développeur de faire ce qu’il veut tout en lui garantissant plus de souplesse à son application.

Il fournit pour cela une implémentation à deux paradigmes importants en développement logiciel:

  • la modularité qui permet la gestion et l’articulation logique des éléments de l’application
  • les services qui fournissent les moyens de donner une opérationnalitée à ces éléments en leur donnant du sens.

La modularité dans OSGI

Sans aller trop loin dans le débat de la modularité [serv-side], on rappellera quelques principe de façon à poser ce à quoi nous attendre dans OSGI

La modularité est une approche de conception permettant la séparation des préoccupations, que celles-ci soient fonctionnelle, ou technique.

Bien sur il existe différents degrés de modularité et celle-ci s’appliquant sur la solution logicielle à des niveaux très variés.

Il est ainsi possible de concevoir de façon modulaire tant au niveau de l’architecture système que de l'architecture logicielle. Quel que soit l’objectif métier, le but est de permettre de scinder les problématiques et amener du découplage facilitant ainsi: la réalisation, le test, la compréhension, la maintenance, la mise à jour, etc...



Pour mettre en oeuvre de la modularité dans une architecture, il existe divers solutions et implémentations: certains design pattern comme l’observateur [observ], l’association du pattern proxy et factory [invochand] ou encore l’utilisation de contrat de services avec des interfaces et des API comme illustré ci dessus.

OSGI propose une autre alternative en se situant à la croisé des chemins de ces approches. Nous en avions parlé dans l’article [whriteboard]. En résumé, la modularité consiste en la construction de composants interdépendants via des interfaces (API). Des lors, l’utilisation d’un module par un autre passe par une api et masque donc l’identité du composant réellement utilisé, c’est le principe du masquage de l'implémentation permettant ainsi découplage, réutilisation, capacité à être testé etc…

Cependant, on constate une limite a l’utilisation des contrats de service et des API : il faut etre capable de re-associer les composants interdépendants [serv-side]. Il faut pour cela utiliser des patterns comme la Factory et au final déplacer le couplage vers la factory [whiteboard].


Alors bien sur il existe d’autres approches pour répondre à cette problématique avec les framework d’IoC comme Spring (implémentant le pattern Hollywood [hollywood]) utilisant des xml ou des annotations. Pourtant ces solutions sont assez peu satisfaisantes car elles confient les détails d'implémentations à un acteur tiers qui aura la charge de faire communiquer les composants entre eux sur la base d’une description donné statiquement. Finalement cela re-créera un couplage car si en effet dans Spring (par exemple) on spécifie la dépendance d’un composant via une API et des interfaces, il faudra lui spécifier un à moment l'implémentation qui y répondra et cela de façon statique par configuration.

Le pattern Broker

OSGI fournit une alternative en utilisant le pattern Broker [broker] permettant, au travers d’un registre de bundle (nom des composants ou modules OSGI) et de service, de déporter le couplage en dehors de la préoccupation des composants mis en interaction.

Il s’agit avant tout d’un pattern d’architecture (non d'implémentation) qui classiquement s’utilise dans le cadre de service de messagerie comme JMS mais qui ici se focalise sur la mise en collaboration des bundles entre eux, à la demande, et ce géré par le registre.

Dans sa mise en oeuvre, un ensemble de composants (les bundles) vont s’enregistrer auprès du registre comme fournisseur de services liés à différents contrats d’interfaces. Ensuite, par l'intermédiaire du registre, ils seront appelé par d’autres bundle ayant besoin des services remplissant les contrats d’interfaces souhaités.

Dans ce principe, aucun bundle ne se connait directement, tout passe par le registre qui aura à gérer l’ensemble des services offerts et les clients qu’il faudra rediriger vers les bonnes implémentations.


Les services

OSGI est une implémentation du pattern Broker. Il s’agit donc en réalité d’un framework permettant la conception logicielle de façon modulaire mais et surtout de construire des applications selon une logique orienté service.

Ainsi comme nous venons de le voir la modularité va nous amener à séparer les préoccupations, les services vont en plus nous amener à réfléchir nos bundles selon le rôle qu’ils ont à mener dans notre application de façon à en exposer juste et seulement leur valeur ajouté.

L’idée est la encore et toujours la modularité, mais en ayant une forte décomposition, on maximise alors le re-use car un service implémentant un contrat de service pourra être mis à disposition par le registre à tous les bundles en ayant le besoin.

Vous allez dire mais ça Spring le fait déjà au final le registre, c’est le fichier xml de Spring.

Effectivement mais OSGI va plus loin:

  • D’une part, l’utilisation du registre va autoriser un bundle à consommer un service à la demande et de s’en défaire, le couplage entre les bundles est dynamique et non permanent.
  • La conséquence du point précédent que nous détaillerons plus loin dans l’article est que cela permet la mise en ligne des bundles sans que ces derniers n’aient eu le besoin de résoudre à leur chargement toute leur dépendance et service.
  • Ceci nous amènera alors à la possibilité de gérer des versions concurrente d’un même service pour faciliter leur mise à jour à chaud.

Avec OSGI, la gestion des services par le registre des bundles nous laisse entrevoir quelques fonctionnalités dont nous n’avons pas vraiment l’habitude. Dans un projet classique, généralement nous pensons notre application comme un tout unique dont les éléments, librairies et services, devront évoluer conjointement. Mais avec OSGI, cette vision limitative devient caduc et il faudra penser l’application comme un système en perpétuel mutation dont les éléments nouveau côtoient des éléments anciens et dont les services seront utilisés selon le besoin.

Gestion des dépendances

Pour permettre des mécanismes de gestion à chaud des bundles et de la consommations dynamiques des services, OSGI va donc fournir un certain nombre de concepts focalisé sur une gestion un peu particulière des dépendances.

Cette gestion des dépendances va s’exprimer selon deux types [10min]:

  • les dépendances statiques
  • les dépendances dynamiques

Statiquement

La gestion statique des dépendances dans OSGI est assez similaire à la gestion des dépendances Java réalisé avec le classpath à ceci prêt que celui ci est plus stricte car embarque avec les lui le detail des versions impliqué dans la dépendance.

Cela paraît dans un premier temps très contraignant cependant cela permet en fait de faire vivre au sein du framework deux versions distinctes d’une même dépendance, laissant alors au composant qui en ont besoin d’utiliser celle avec laquelle il sera le plus en phase.

Ce type de dépendance se déclarent au sein du manifest java décoré et adapté au formalisme OSGI (nous verrons cela plus en détails dans le chapitre sur les bundles).

Ainsi les bundles lorsqu’ils seront chargé par le framework OSGI (on verra plus tard mais il s’agit de la phase d’installation) devront trouver dans leur classpath ou dans les classloader du framework les dépendances apportées par les autres bundles dans les versions attendues


Dynamiquement

Une fois installé, un bundle apporte un ensemble de dépendance statique, cependant, pour créer un minimum de couplage, il est préférable de s’appuyer autant que faire se peut sur le pattern broker.

Ainsi pour cela le framework OSGI nous amene à construire des bundles définissant des contrats des services ne contenant que des informations spécifiques aux contrats de services.

Ainsi ces contrats seront ensuite implémentés par un autre bundle qui aura la charge de l'implémentation du contrat de service. Ainsi, ce bundle s'enregistrer auprès du registre et lorsqu’un autre bundle demandera au registre OSGI un service conforme au contrat de service défini dans le bundle contrat alors le registre fournit l'implémentation.

L'intérêt de cette approche est qu’il est possible alors de proposer divers implémentation d’un même contrat de service.


Conclusion

Nous avons dans les grandes lignes les principes généraux de OSGI, son paradigme de modélisation modulaire et orienté service.

L'intérêt de son utilisation est double, d’une part de fournir une solution réelle de couplage des modules mais aussi la capacité de faire évoluer une application dynamiquement tout au long de son cycle de vie et ce, “à chaud”.

Il peut être intéressant maintenant d’en parcourir l’utilisation dans le concret (dans le prochain article sur OSGI) afin de mieux appréhender ses contraintes techniques.

Références

lundi 10 décembre 2018

IA : Classification SVC avec SciKit-Learn

Introduction

Dans les article précédent, nous avion aborder la problématique de la classification [1,2] qui consiste à séparer des ensembles binaire ou multiple, pour cela, nous avions réalisé un neurone à la main avec une approche rationalisée autour de la constitution d’un jeu de donné d’apprentissage et d’un jeu de donnée d'évaluation.

Dans cet article, on va industrialiser une peu plus en nous appuyant sur un framework pour réaliser toute ces tâches : scikit learn [3]. Nous prendrons le cas classique de la classification des données du jeu Iris sur lequel nous appliquerons l’algorithme de classification SVC (Support Vector Classification)[4].

Avant cela, nous présenterons rapidement (car nous aurons d’autres occasion de l’utiliser) scikit learn et son utilisation, nous verrons le principe général de SVC puis nous traiterons concrètement la problématique de classification du jeu de données Iris.

Description Scikit learn

Scikit learn est un framework python dédié au machine learning. il implémente de façon exhaustive les algorithmes les plus commun du domaine (il suffit de télécharger la documentation pdf du framework pour se rendre compte de la quantité d'algorithme que regorge scikit learn).

On y trouvera donc autant des algorithmes à base d'apprentissage supervisé (K plus proche voisin, Régression linéaire/logistique, SVM, arbre de décisions, etc…), non supervisé (partitionnement, visualisation ou réduction de dimension, règle d’association) ou semi-supervisé (issu de la combinaison des deux précédentes approches)

À cela, scikit-learn va proposer des outils facilitateurs pour construire des processus de traitements incluant phases de traitements des données (visualisations, analyse, nettoyage, calibrage, découpage, transformation), de paramétrages (par quadrillage, recherche aléatoire ou avec des modèles), d’apprentissages (sous format batch c’est à dire en une fois, en ligne c’est à dire de façon progressive ou encore avec des stratégies d’optimisation comme la descente de gradient ordinaire ou stochastique, l’utilisation de mini-lots, d'arrêt précoce), d’évaluations et de mises en production tout cela sous la forme de pipeline.

Nous aurons l’occasion d’explorer l’ensemble des fonctionnalités de scikit learn, aujourd’hui intéressons nous aux SVM et entre autre à SVC.

Description SVC

SVC (ou Support Vector Classifier) est un algorithme de machine learning faisant parti de la famille des SVM (Support Vector Machine) [4].

En fait un SVM est un algorithme utilisant la composante vectorielle des éléments du jeu de données d’apprentissage afin d’en déterminer une orientation préférentielle. Ainsi selon que l’on se place dans un contexte de régression ou de classification, il va être possible de
  • soit définir une droite porté par cette orientation donnée par la composante vectorielle 
  • soit de construire une droite perpendiculaire à ce même vecteur (et placer à équidistance des ensembles à séparer)
Si vous avez pris le temps de lire l’article précédent sur la classification [1], l’exemple de la construction de la droite séparatrice des fruits est classiquement un SVM et entre une forme de SVC.

edit 1: pas tout a fait car le SVM va chercher a minimiser la distance avec les quelques éléments choisis des deux ensembles, ces elements etant les "vecteurs supports", dans le cas de l'article [1], tous les elements sont des vecteurs supports.

edit 2: le schema ci dessous a pour but d'illustrer le principe de la separation d'ensemble pas que ce soit celle ci qui est obtenu

L'iris dataset

Pour illustrer l’utilisation d’un SVM avec scikit learn, nous allons utiliser un jeu de donnée (dataset) classiquement employé pour justement illustrer les approches de classification. Ne faisons pas mentir les habitudes.


iris= pd.read_csv('iris.data.txt',sep=',') #https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
print(iris.shape)
pandata = pd.DataFrame(np.array(iris),columns=['sepal_length',  'sepal_width',  'petal_length',  'petal_width', 'species'])
print(pandata[:5])
sns.pairplot(pandata,hue='species', size=2.5)


Ce jeu de donnée est accessible les archives en ligne [5]. Pour visualiser un peu les données comme nous l’avions fait dans le précédent article à l’aide de panda:

Comme on le voit sur le schéma, le jeu de donnée est constitué de différentes informations sur les iris comme la largeur et la longueur du pétale ainsi que la longueur du sepal (la sorte de petal mais verte et enfermant le bouton). Une dernière information permet enfin de déterminer le type de la fleur en fonction des informations données. 

Celle ci sont de trois types:
  • Iris-setosa
  • Iris-virginica
  • Iris-versicolor
Tentons maintenant avec scikit learn d'entraîner un modèle SVC nous permettant de déterminer le type de fleur à partir des informations précédentes.

Traitement avec scikit learn

Pour construire notre modèle il nous faut avant tout chose penser à constituer un jeu de donnée de test afin nous permettre de l'évaluer une fois l’apprentissage réalisé.

Ainsi nous allons scinder le jeu de donné. Le data set n’est pas énorme (150 échantillons), il faut donc faire un choix entre quantité lié à l’apprentissage et quantité dédié à la validation. À cet effet on prendra 125 échantillons pour l’apprentissage et les 25 derniers pour la validation.

A noter cependant que les données iris sont initialement trié, nous allons donc les mélanger d’abord avant de les scinder à laide d’un tableau de valeurs aléatoires pour constituer le jeux d’apprentissage et le jeu de validation.

perm=random.permutation(np.array(iris)[:,4].size)
irisRand=np.array(iris)[perm]
targetPerm,dataPerm=irisRand[:,4],irisRand[:,:4]
division=125
print("base:",targetPerm.size,dataPerm.shape)
targetLearn,targetTest=targetPerm[:division],targetPerm[division:]
print("target:",targetLearn.size,targetTest.size)
dataLearn,dataTest=dataPerm[:division,:],dataPerm[division:,:]
print("data:",dataLearn.size,dataTest.shape)

Maintenant, on va réaliser la partie peut être la plus facile, instancier un modèle et faire une phase d'apprentissage:

model=SVC()
model.fit(dataLearn,targetLearn)

On vérifie que celui-ci fonctionne:

print(model.predict(dataTest[:4]))
print(targetTest[:4])

Bon on voir que ca fonctionne mais on ne peut pas se limiter à ce genre d’evaluation pour mesurer l’efficacité de notre modèle. Dans nos précédents exemple, nous avions utilisé la matrice de confusion.

Matrice de confusion

Nous avons un modèle qui à appris, nous avons un jeu de test maintenant regardons comment Scikit learn nous facilite la vie pour l'évaluer.

Pour cela Scikit nous propose une api générique du package metrics: confusion_matrix.

Prenons l’exemple de jeu de test:

predicData=model.predict(dataTest)
confusion_matrix(targetTest,predicData)


array([[8, 0, 0],
       [0, 9, 1],
       [0, 0, 6]], dtype=int64)

Nous voyons que la matrice est diagonale, donc le modèle est dans l’absolu idéal! mais comme nous ne croyons pas aux licornes on peut légitimement se demander si cela n’est pas du à un jeu de test un peu trop petit. Essayons avec quelques jeux de test un peu plus important (mais du coup reduisant à l’inverse le jeu d’apprentissage et donc diminuant forcement la qualité du modele aussi…) avec les ratio suivant: 100/50, 75/75, 50/100:


array([[19,  0,  0],
       [ 0, 17,  1],
       [ 0,  0, 12]], dtype=int64)

array([[21,  0,  0],
       [ 0, 25,  1],
       [ 0,  3, 24]], dtype=int64)


array([[30,  0,  0],
       [ 0, 35,  3],
       [ 0,  0, 31]], dtype=int64)


À cela, on se rend compte que sensiblement le modèle se dégrade mais réagit plutôt bien (puisque à priori notre jeu de test est lui plus performant) Apres le choix de l’ajustement et de la balance des données reste un choix et un paramètre à prendre en compte mais il faut toujours avoir un moyen d’évaluation et d’en connaitre la pertinence et la limite

Conclusion

Bien sur il y à d’autre algo de classification et aussi bien sur d’autres outils mais ceux la sont les basiques, on en verra d’autres. Aujourd’hui nous avons vu le modèle SVC appliqué au jeu de données Iris en appliquant une approche mettant en avant la problématique de l’apprentissage face à la validation.

Notes: vous trouverez l’intégralité des exemples sur le depot github [6]

Référence

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/07/ai-approche-neuromimetique-la.html
[2] http://un-est-tout-et-tout-est-un.blogspot.com/2018/07/ai-approche-neuromimetique.html
[3] http://scikit-learn.org/
[4] https://zestedesavoir.com/tutoriels/1760/un-peu-de-machine-learning-avec-les-svm/

lundi 26 novembre 2018

dimanche 25 novembre 2018

Liquibase sources

En juin dernier, j'avais écris un article sur Liquibase [1] avec des extraits de code, seulement depuis, j'ai lancer un repository git contenant les sources des articles. Du coup cet article n'est que la que pour signaler que le code source de cet ancien article est disponible dans le repository [2]

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/06/sgbd-liquibase.html
[2] https://github.com/collonville-tom/tc-un-est-tout-et-tout-est-un

vendredi 23 novembre 2018

IA : Presentation du neurone

Un petit article rapide pour attendre les prochains articles sur OSGI et SPARK .

Ici je parlerai d'une petite (grosse) présentation sur le neurone intitulé:

Que faire avec son neurone ?

Il s'agit en fait d'un recap des 2 ou 3 articles écrits jusque ici sur l'IA et sur le neurone implémenté en mode adhoc.

mercredi 14 novembre 2018

Asciidoctor

Suite a l'article d'hier [1],  on peut quand même se demander :Comment augmenter même un peu l’attractivité de la présentation?

En passant à Asciidoctor [2,3]!

Quoi un autre outil! non mais tu nous arnaques la, il va falloir tout refaire!

Non non ne vous inquiétez pas! Asciidoctor est un outil qui implémente (en ruby) tout le corpus de Asciidoc avec quelques petits trucs en plus.

Du coup oui il va falloir changer d’outil mais…. pas autant que vous le croyez [4]! n’oubliez pas ce dont nous parlions dans l'article précédent [1], comment rendre plus simple, plus attractive la rédaction documentaire dans le cadre d’un projet?

Et bien à l'instar d’un maven site [5] (qui est très très basique il faut l’avouer) on va également builder notre documentation technique avec Maven tout en restant (peu ou prou) compatible avec Asciidoc et sa simplicité (syntaxiquement parlant).

Avec Maven

Bien, on a déjà parlé de Maven [6] , et effectivement surtout dans le cadre de projet Java. Pourtant, si on prend un peu le point de vue du MDE/IDM, on peut considérer la documentation comme un modèle comme un autre de notre application alors si c'est un modèle, comme de l'UML ou même du code, pourquoi ne pas le compiler? Finalement il n'est qu une façon de voir une application ou un concept.

Ici on va rejoindre cette idée et nous allons définir un contexte de build maven pour faire notre documentation.

Des parents

Comme nous l'avions vu dans notre article sur Maven, on ne va pas partir bille en tête dans la simple définition d’un pom. On va se débrouiller pour augmenter la reutilisabilité. Du coup on va faire des pom parent!

On sait que asciidoc est naturellement fait pour produire des documents on va donc d’abord définir un parent permettant de construire ce type de doc, disons sous le format pdf puis par extension, on va tirer partie de ce premier pom pour l'étendre vers la production de présentations (il va de soit que le contenu sera le même, seul la forme change)

Pour faire ces deux pom parent, je citerai que je me suis beaucoup inspiré d’un fork d’un ami  sur github [7].

Ainsi le premier pom nommé tc-asciidoctor-pdf-parent va s’appuyer sur le plugin maven dédié à asciidoctor: asciidoctor-maven-plugin [8]. Il est complété par deux plugin asciidoctor que sont asciidoctorj-pdf [9] et asciidoctorj-diagram [10, 11] permettant de générer du pdf et de gérer des diagrammes au sein du document (comme UML, Graphviz, etc…) Pour en connaître un peu plus je vous invite à consulter le source du fichier sous github ici [12].

Le second pom nommé tc-asciidoctor-html-parent propose d'étendre le premier en spécialisant la génération documentaire au profit d’une interface html supportant la présentation. De façon à rendre celle ci plus dynamique, le pom va intégrer dynamiquement lors du build, une librairie Javascript revealjs [13] qui sera downloader via le plugin maven download-maven-plugin [14]. Ensuite, le plugin asciidoctor-maven-plugin va intégrer cette librairie pour construire la présentation en html. Pour en connaître un peu plus je vous invite à consulter le source du fichier sous github ici [15].

Utilisation

Il faut maintenant réintégrer les sources précédemment utilisées et les mettre dans un projet maven héritant du dernier pom présenté (tc-asciidoctor-html-parent)

On build :

mvn clean process-resources

et cela nous donne brutalement la présentation accessible ici [16].

Déjà c’est cool notre présentation à déjà bien évolué mais on voit que la compatibilité n’est pas présente à 100%.... le cadrage n’est pas parfait... Sachant cela, chacun verra midi à sa porte et choisira son approche préférée.

Conclusion

Nous n’avons pas été très loin dans l’utilisation de Asciidoc ni de Asciidoctor son équivalent, mais sont utilisation étant simple, il ne m'a pas semblé pertinent de s’attarder sur ce genre de problématique. Par contre son utilisation et les différents de logique de build existant entre les deux outils me semblait plus intéressant à montrer (sachant que Asciidoctor étant en ruby, via l’utilisation de l’installeur Ruby et de l’application Gem il est aussi possible de l’utiliser sans une industrialisation maven qui pourtant est, il me semble pertinente)

Voilà ainsi dans l’avenir, si je réalise une présentation en association avec un article, je procéderai comme pour le code source, je le déposerai dans le dépôt github du blog. Cela permettra de rendre plus dynamique les articles.

Pour ceux voulant aller un peu plus loin, les références suivantes sont pour vous: [17,18,19]

Remerciements (j’en fais pas souvent):

Merci à David et Christophe qui ont piqué ma curiosité avec asciidoc. Moi qui venait de Latex et de son formalisme jusqu’au boutiste, j’ai découvert un compromis et un outil fort pratique qui je pense va devenir un compagnon régulier de ma veille. (Il ne me reste qu'a tester la construction et l’intégration des diagrammes, mais on verra ça a la volée)

Références

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/11/asciidoc.html
[2] https://asciidoctor.org/docs/
[3] https://asciidoctor.org/docs/what-is-asciidoc/
[4] https://asciidoctor.org/docs/asciidoc-asciidoctor-diffs/
[5] https://maven.apache.org/plugins/maven-site-plugin/
[6] https://un-est-tout-et-tout-est-un.blogspot.com/2018/01/maven-preparons-des-parents.html
[7] https://github.com/dvaillant/coursAsciidoc
[8] https://asciidoctor.org/docs/asciidoctor-maven-plugin/
[9] https://github.com/asciidoctor/asciidoctorj-pdf
[10] https://github.com/asciidoctor/asciidoctorj-diagram/
[11] https://asciidoctor.org/docs/asciidoctor-diagram/
[12] https://github.com/collonville-tom/tc-parent/blob/master/tc-asciidoctor-pdf-parent/pom.xml
[13] https://revealjs.com/
[14] https://mvnrepository.com/artifact/com.googlecode.maven-download-plugin
[15] https://github.com/collonville-tom/tc-parent/blob/master/tc-asciidoctor-html-parent/pom.xml
[16] https://collonville-tom.github.io/tc-un-est-tout-et-tout-est-un/tc-asciidoctor-article/ascii-article.html
[17] http://www.vogella.com/tutorials/AsciiDoc/article.html
[18] https://powerman.name/asciidoc/
[19] https://riduidel.wordpress.com/2017/06/16/generer-mon-asciidoc-dans-docker/




mardi 13 novembre 2018

Asciidoc

La rédaction documentaire

Quiconque vous le dira, dans l’IT, le référentiel documentaire d’un projet est toujours le vilain petit canard, un mal aimé lorsque faut le rédiger mais qui pourtant fait l'unanimité des critiques lors de son absence.

Le but de cet article n’est pas forcement de vous convaincre de son utilité et de sa nécessité et de vous réconcilier (on tentera cela dans un autre article)  avec mais juste de vous présenter un outil qui peut être pourra vous simplifier la vie: Asciidoc [1].

Asciidoc est un outil de génération de doc sous différents format à base d’un langage simple inspiré des syntaxes employés dans les Wiki. Cela le rend très facile d'access.

Alors bien sur il n’est pas le seul dans ce domaine, on pourrait parler par exemple de markdown [2], [7] ou latex [3]. Peut être le feront nous seulement j’ai souhaité parler de asciidoc car il m’à semblé être un bon compris justement entre ces deux autres outils :
  • markdown étant vraiment très basique voir simpliste, Asciidoc vous donnera plus d’expressivité tout en fournissant un rendu très satisfaisant. 
  • latex à l’inverse est complet et fournira toujours des résultats impeccables c’est certain pourtant, acquérir sa maîtrise demande une marche qui sera moins haute avec Asciidoc.

Installation

Asciidoc est un outil développé en Python (on se chargera d’installer python 27 préalablement donc). Pour bénéficier de sa dernière version, rien de plus simple:
  • un téléchargement sur sourceforge, 
  • un dezip 
  • un alias dans votre bashrc (sous Debian ou Cygwin) et on est parti!
alias ascdoc="/cygdrive/c/Python27/python.exe C:/Tools/asciidoc-8.6.9/asciidoc.py"


samedi 10 novembre 2018

La Veille Technologique

S’il fallait des raisons d’apprendre

La veille technologique est un processus incontournable aujourd'hui dans n'importe quel domaine et métier mais cette vérité est d'autant plus forte dans le monde de l'IT tant cet eco-système change vite et se transforme rapidement.

Les concepts changent, les processus changent, les technologies changent et tout cela en même temps et ne pas les suivre c'est s'exposer à devenir rapidement inadapté face, pour d'une part, à des besoins clients  en perpétuels évolutions mais aussi d'autre part à des exigences de performances qui doivent faire face a des enjeux de dimensionnement de plus en plus présent (comme avec l’essor du BigData et par extension du Machine Learning cette dernière décennie [1])

Ainsi ne pas faire de veille technologie, par extension, c'est s'exposer individuellement a l'inadaptation face à un marché de l'emploi qui lui aussi évolue vite. J'ai, moi même, comme j'en ai parlé dans mon article un peu auto-biographique [2], pu perdre a certains moment le fil de l'actualité du monde technologique et théorique. Ainsi selon mon évaluation (ça ne vaut que mon avis), aujourd'hui, si un individu s'endort pour quelques 2 a 4 années, alors le gap qu'il aura a combler sera pour lui équivalent a repasser une bonne année des études qu'il avait pu suivre lorsqu'il était étudiant!
Je n'imagine pas la masse de travail a faire si il s'endort plus longtemps car cela ne prend pas en compte bien d'autres phénomènes qui intervienne au delà de ne rien faire.

Un des premiers phénomènes est celui de l'oubli, après combien de temps parvenez vous encore a exploiter des connaissances que vous avez acquises quelques temps plus tôt? honnêtement? 1 mois? 3 mois ? 6 mois? 1 an? 3 ans? 5 ans? Bien sur ce qui est appris est globalement acquis, mais le temps est délétère et selon la manière que cette connaissance a été acquise, il en restera plus ou moins les bases au mieux et nécessitera des révisions.
Personnellement je pense que au delà 3 mois sans utilisation, une technologie nouvelle devra être révisé, et que pour une connaissance couramment utilisé, il faudra probablement 3 années d'inutilisations pour impliquer la nécessite d'une révision (si a ce moment la cette technologie ou connaissance est encore d'actualité!)
De plus, il existe des freins et des limites propres a l'hommes qui font qu'il est nécessaire de faire de la veille technologique régulièrement. Par exemple:
  • les biais cognitifs (bais de confirmations, préjugé, culture, etc...) qui auront altérer notre lecture initiale des faits et qui dans le temps ne feront que renforcer un point de vue sur un sujet qui sera peut être complètement erroné [3]. La veille technologique permet d'apprendre a réviser son jugement et ainsi passer outre nos préjugés (nous évitant alors de passer a coté de sujet intéressant voir même important 
  • le vieillissement est malheureusement un fait et comme on dit, parmi les génies, seuls ceux de moins de 40 ans ont réalisé des grandes choses et des bouleversements justifiant des changement de paradigme : il ne faut donc pas compter sur l'age pour nous aider a être plus performant. Pourtant, la veille technologique a l’intérêt, au delà du travail d'apprentissage de connaissances, d’entraîner le cerveau a réfléchir, a construire sa pensée, a imaginer, a se restructurer. 
  • la confiance en soit, peut être un frein a la connaissance, et la veille technologique peut permettre de gagner en confiance et être plus capable de se mettre en avant sur des sujets.
Au delà de l'acquisition de connaissance brut, la veille est donc un indispensable, elle permet de se maintenir a jour de l'actualité mais aussi de maintenir ses sens en éveil, se maintenir prêt a relever de nouveau défi quitte a même aller sur des sujet non connus!  C'est même la peut être la partie la plus utile de la veille technologique, garder l'esprit aguerri a la réflexion et a la résolution de problématiques sans avoir peur de sortir de son cadre.

WWWWH

Maintenant que l'on s'est donné (de bonnes) raisons de faire de la veille technologique, regardons un peu du coté du WWWWWH [4] pour creuser les axes de cette démarche.

Why ?

Evidemment nous n'allons pas refaire la partir introductive de cet article mais restons pragmatique, pourquoi faire de la veille technologique? Plusieurs points de vue peuvent être aborder:
  • Court terme : le besoin projet, c'est peut être ce qui est le plus pragmatique, pouvoir mettre directement en pratique ce que l'on apprend!
  • A moyen terme : Assouvir de la curiosité mais aussi se maintenir a jour techniquement et aussi parce qu’il ne faut pas attendre qui que ce soit pour préparer l'avenir, sachant que ce sont probablement ces connaissances qui permettront d’accéder a certains autres types de projets
  • A long terme : entretenir les connaissances, mais aussi alimenter la curiosité personnelle de façon a continuer a faire un métier qui nous passionne, un métier ayant du sens.

When ? Where ?

Inutile de dire que ce chapitre sera court! Tous le temps, Partout! Comme le disait Einstein (citation du livre d'Etienne Klein, le pays qu'habitait Albert Einstein [5]):
"L'essentiel dans l’existence d'un homme de mon espèce, réside dans ce qu'il pense et comment il pense, non dans ce qu'il fait ou souffre"
En substance, signifiant pour moi que peu importe le lieu et le temps pour quoique ce soit, l'essentiel est l'utilisation de sa pensée et la manière de la construire. Et autant cela n'engage que moi mais la veille technologique (tout apprentissage en fait) a un rôle structurant pour la pensée qui est important de développer.

What ?

La question du sujet de la veille technologique est compliqué. Il s'agit ici d'un élastique tendu au bout de lequel on trouvera d'un coté, les sujets d’intérêts et de l'autre les sujets utiles!
Toute la difficulté dans une carrière sera de réussir a reboucler cet élastique! On peut distinguer différents types de sujet:
  • les sujets généraux ou transverses
  • les sujets spécifiques ou ciblés
Les premiers auront généralement pour but de donner du sens a une activité de veille technologique. Ce seront donc des sujets plutôt de méthodologie, conceptuel, historiques, et ou posant un contexte. Nous sommes alors plus dans un contexte de vulgarisation.
Les second seront des ramifications des premiers en s'attachant a entrer dans l'intimité d'un aspect du domaine considérer. Il s'agira donc plutôt de sujets abordant certaines technologies, frameworks ou encore de sujets décortiquant une problématique données. Pour aborder ces points, il faudra généralement un certain bagage.

How 

La partie la plus intéressante! Comment réaliser sa veille technologique? Probablement en ne faisant pas faire n'importe quoi non plus! Il importe que ce travail d'apprentissage soit pertinent et efficace! 

Tout d'abord, passons en revu les basiques:
Il est évident qu'il faut avant toute chose identifier un sujet intéressant. On sait pertinemment que la capacité d'apprentissage sera directement conditionné par le taux d’intérêt qui sera alloué au sujet. Bien sur on nous dira:

"Parfois, certains sujets, même indispensable, ne sont pas intéressant! "

C'est vrai, parfois il faut effectuer des veilles technologiques sur des sujets peu ou pas intéressant parce que ce sont des choses déjà vu et qu'il faut alors réviser ou parce que simplement ce sont des pre-requis qui sont juste pas intéressant. Dans ce genre de situation, l’idéal est de coupler le sujet avec un autre pour lequel l’intérêt sera plus grand. Ainsi, l'utilisation du second sera un prétexte pour le premier. L’idéal est même que le second soit une technologie déjà un peu maîtrisée de façon a limiter la marche a gravir.
Une fois le sujet cerné, il importe d'identifier les bagages nécessaires pour l’appréhender. Autant commencer par le commencement! Cela mène à construire un programme pour sa veille technologique. Sans cela, le risque est de sortir du cadre du sujet que l'on souhaitait traiter, attiré par l'ensemble des sujets amont à celui ci, sans cela, le risque est de se retrouver, un mois plus tard, a finalement encore préparer la veille du sujet initial!
Apres il ne faut pas non plus être trop exigent avec soit même car parfois en vagabondant, on se découvre de nouveaux centres d'intérêts et de nouvelles choses a apprendre, c'est ca aussi la veille technologique, s'ouvrir a d'autres choses. 

Ainsi, il est bien de se planifier sa veille technologique mais pas trop afin d’être raisonnable et réaliste avec des objectifs atteignables! Cela évitera de se décourager et de perdre le rythme et finalement abandonné en pensant "je suis trop vieux pour ces conneries". 

Dans le cas ou il faut tout apprendre d'un sujet alors il sera préférable de se tourner vers des supports autres que internet de façon a avoir des sources plus englobante (on sera alors plus sur des sujet généraux comme ceux dont nous avons parlé précédemment)
Maintenant que l'on a cerner le sujet, et identifier les pré-requis, il va falloir trouver les moyens de s'informer. Bien sur la première approche est de se tourner vers internet. Effectivement, on y trouve beaucoup d'informations (peut être parfois trop) sous de nombreux formats:
  • l'article les articles sont souvent un peu plus généraux et donne une vision d'ensemble de sujet spécifique
  • la vidéo est un support un peu spécial, souvent pratique pour les sujets généraux car permettant de comprendre les tenant et aboutissant d'un sujet, par contre lorsqu'il s'agit d'entrer techniquement dans les sujets, cela devient plus compliqué a suivre et nécessite de jouer beaucoup avec le curseur d'avancement. Pas fan personnellement, je peux comprendre que d'autre y adhère plus facilement (que moi), question d'affinité.
  • le tutorial est un article exclusivement dédie a la démonstration, très pratique pour acquérir une expérience, elle ne permet pas forcement par contre de comprendre les concepts sous-jacent contrairement aux article
  • la présentation est un exercice délicat, elle doit marié un contenu intéressant et une bonne pédagogie. Elle apporte la possibilité de connaitre un point de vue spécifique peut être différent de sa propre compréhension et d’étayer le sujet avec l'interlocuteur. 
  • le blog souvent très pratique car regroupant des articles ou des tutoriaux, il permettent d’acquérir une connaissance très précise sur un sujet ou d'une problématique
  • la doc technique est exclusivement a réservé pour ceux qui ont déjà le bagage mais qui cherchent des détails ou qui sont dans une phase de POC
  • le mooc est une formation en ligne mixant articles, tutoriaux et vidéos. Souvent a réserver a des vielles technologiques conséquente, quand on part de loin sur un sujet.
Enfin, dans les cas difficile ou trop conséquent, il faudra préférer probablement s'appuyer sur un livre de façon a avoir un support couvrant l'ensemble des problématiques dans un formalisme homogène et cohérent.

Nous n'avons encore pas vraiment parler d'outils ou de méthode (enfin si avec cette article) cependant, il me semble que la phase de construction de la connaissance est une étape intime et que si vous en êtes la c'est que vous avez déjà depuis longtemps appris a apprendre et que vous vous connaissez et savez comment optimiser cette phase d'assimilation et de compréhension.

Pour ma part, elle se réalise assez simplement:
  • Identifications des sources intéressantes par une lecture rapide filtrante
  • Relecture approfondi par une prise de note
  • Synthèse général par quelques schéma (UML, Mindmap, ERA selon votre domaine de compétence et vos connaissances, nous verrons que cela sera utile par la suite)

Enfin suite a cela a priori, et c'est ce qui viendra en tête de tout le monde, il faut mettre en oeuvre ce qui est appris. C'est effectivement très important car au delà de nous permettre de comprendre les avantages et inconvénient d'une technologie, la mise en oeuvre permet aussi de consolider l'apprentissage en se confrontant aux lacunes de la compréhension que l'on a du sujet (prejugé, biais cognitif, etc...). 

La mise en oeuvre se réalise par un POC (Prove Of Concept).  Il va permettre de vérifier que la technologie offre bien les services qu elle annonce mais et surtout va permettre de savoir que l'on est capable de l'utiliser!

A ce stade alors on pourrait s'attendre à ce que le processus de veille soit a ce stade terminé... il n'en est rien, réaliser un POC est une chose mais le terme de la veille n'est pas cette phase. Finir correctement une veille technologique nécessite de transmettre ce qui a été appris.

Teach

Pour débuter ce paragraphe, je citerai Robert Heinlein :
"When one teaches, two learn" 
Oui, enseigner a d'autres ses connaissances c'est faire aussi de la veille technologique! 

Même si cela est fait très rarement par même ceux faisant de la veille technologique regulierement, la dernière phase d'un apprentissage quel qu'il soit est de démontrer sa capacité à restituer ce que l'on connait. Cela augmente significativement la maîtrise du sujet étudié pour les raisons suivantes:

  • Mon directeur de thése citait souvent Nicolas Boileau (que je paraphraserai pas): 
"Ce que l'on conçoit bien s'énonce clairement"
  • Faire une restitution des connaissances acquise impose de se confronter a la réalité de notre compréhension car en transmettant son savoir, on doit être en mesure de garantir celui-ci! Il faudra donc se pencher plus sur les détails de faire une préparation donnant du sens a l'ensemble, de la cohérence. 
  • Impose, contrairement au POC ou la mise en oeuvre ne permet que de démontrer notre capacité utiliser une technologie, d'en avoir compris les tenant et aboutissant, les éléments pivots, etc...
Donc enseigner va permettre de consolider sa propre connaissance mais aussi d’être face aux choses que l'on aura oublié, a coté duquel il est possible de passer, les subtilités car heureusement, les gens auquel la restitutions s'adressent ne sont probablement pas complètement vierge de connaissances sur le sujet! C'est même du coup la l'occasion de confronter des idées et des points de vue.


Comment transmettre? A qui?


Alors du coup finalement vient la question de comment transmettre? et a qui? Il s'agit d'une question a laquelle chacun doit donner une réponse selon le contexte dans lequel il évolue et les sujets qu'il traite!
Tout d'abord le comment. De la même manière que certaines sources d'informations ont permis d’acquérir des connaissances, rien n’empêche de produire le même genre de support. Ça peut être un blog (comme moi) ou des vidéos (dans la mouvance youtube) mais il faut garder en tête l'objectif de ce travail, le support ne doit pas devenir non plus plus complexe a mettre en oeuvre que le sujet lui même! 

Apres c'est selon l'envies mais il faut garder une chose importante en tête, la veille technologique, c'est pour vous. Le succès de transmettre ses connaissances est un plus si des gens y ont appris quelque chose, ce qui compte c'est le travail de formalisation, consolidation qui a été nécessaire.
Se poser la question de à qui enseigner ses connaissances acquises lors de la veille technologique, c'est avant tout et surtout une question cherchant a positionner le profil de l'interlocuteur cible.
On peut en définir plusieurs types:
  • le novice sur le sujet. Dans ce cas, la restitution de la veille technologique doit être très progressive, il s'agit de ne pas noyer l'interlocuteur. Cette approche progressive aura alors pour intérêt dans la veille technologique de démontrer la maîtrise globale et cohérente du sujet. On sera ici plutôt dans un exercice de vulgarisation.
  • l'expert du sujet. Il faudra pour un public aguerri être très prudent. Bien poser les concepts du sujets et être précis dans les démonstrations. L’intérêt de ce public est d'imposer a votre discourt un certain degré de justesse dans ce qui sera présenté car la critique pourrait être cinglante en cas de grosse bévue. Par contre les échanges seront plus pertinent et enrichissant.
  • l'inconnu. Ce sera l'interlocuteur le plus difficile, car faute de savoir se positionner, il faudra considérer un support de communication adapté au deux types d'interlocuteurs présentés précédemment.

Conclusion

Certains diront que la veille technologique est surement un indispensable mais qu'ils n'ont pas le temps. Effectivement, on a tous une vie en dehors du travail, cependant dans le monde de l'IT ou tout change très vite, on ne peut se satisfaire des formations d'entreprise pour se tenir a jour. De plus, la veille technologique est une activité complexe qui pour être efficace doit être mené régulièrement mais aussi avec de la méthode.
Dans cet article, a été présenté une approche (celle que je suis personnellement) permettant de mener cette veille tout en tachant de la rendre efficace au mieux. Elle consiste globalement a bien sur hiérarchiser les sujets mais aussi après en avoir pris connaissance et avoir fait une mise en oeuvre, a réaliser un travail de restitution.

Pour aller un peu plus loin, voici quelques articles et blog permettant de compléter et confronter mon point de vue [6], [7], [8]

Références

[1] Big data et Machine Learning, 2016, de Pirmin Lemberger (Auteur), Marc Batty (Auteur), Médéric Morel (Auteur), Jean-Luc Raffaëlli (Auteur)
[2] https://un-est-tout-et-tout-est-un.blogspot.com/2018/09/100-un-peu-dautobio.html
[3] http://www.psychomedia.qc.ca/memoire/2014-05-29/transformation-des-souvenirs
[4] https://un-est-tout-et-tout-est-un.blogspot.com/2017/12/qqoqccp.html
[5] Le pays qu'habitait Albert Einstein Broché – 19 octobre 2016, Etienne Klein
[6] https://www.camilleroux.com/2009/09/20/conseil-realiser-bonne-veille-technologique/
[7] https://linuxfr.org/news/methode-et-outils-pour-la-veille-technologique
[8] https://toiledefond.net/5-outils-pour-commencer-une-veille-sur-internet/

jeudi 8 novembre 2018

Design Pattern : Whiteboard

Pourquoi le pattern whiteboard?

Le pattern Whiteboard [1, 2] est un pattern un peu spécifique, il à la particularité d'être intimement associé à la technologie OSGI [3, 5] et comme il était question dans ce blog de parler de ce framework, nous voici donc avec une petite introduction de ce dernier via ce pattern de conception.

Au delà du prétexte de l'écriture d’un article introductif à OSGI, ce pattern pattern à bien entendu une raison d'être qui lui est propre: proposer une alternative raisonnable au pattern listener dans la conception de logiciel à base de microservice comme le permet OSGI [4].

On entrevoit donc ici les raisons de l’utilisation du pattern mais pour etre plus precis, nous regarderons avant cela les concepts de base de OSGI afin d’en comprendre les besoins et avant de détailler plus en avant le pattern whiteboard, nous regarderons pourquoi le pattern listener n’est plus satisfaisant dans certaines situations.

Techno OSGI dans les grandes lignes

La technologie OSGI ou Open Service Gateway Initiative est un framework Java pour la construction d’application à base de composants et de services. Il s’agit d’un framework ayant pour vocation initial la réalisation d’application à taille réduite où la gestion mémoire est millimétré.

Il permet techniquement de gérer simultanément des librairies java évoluant dans des versions différentes ainsi que de charger et décharger ces librairies dynamiquement sans nécessiter le redémarrage de la JVM. Par contre, pour permettre ces capacités, OSGI “impose” (mais en fait c’est un bien) un paradigme de modélisation impliquant la construction de nos application selon une architecture un peu spécifique à base de composant (les bundles) et de services.

Avec cette petite introduction, on perçoit rapidement l'intérêt de ce framework! Nous y reviendrons plus tard, nous en avons vu l’essentiel pour l’instant. Il faut surtout en retenir que OSGI nous permet de construire des applications modulaires à base de composants et de services. Dédié initialement à l’embarqué, il est sortie rapidement de son contexte d’utilisation initial et s’est alors confronté aux méthodes et techniques de construction des architectures logiciels classiques.

Pourtant avec une architecture tel que proposée par OSGI, ce pattern comporte de nombreuses limites.

En effet, dans une architecture à composant ou les dépendances entre composant ne peuvent être forte, il est nécessaire de permettre à deux objets de communiquer sans forcément qu’ils aient connaissance de l’un et de l’autre directement.

Pattern Listener et limites

Entre autre, le cas du pattern Listener est caractéristique car dans le cadre de son utilisation dans le cadre OSGI, il comporte quelques limites.

Nous avons traité le pattern listener dans un autre article [6], je n’y reviendrais pas ici. disons simplement que ce pattern est un pattern d’architecture et comportemental permettant le découplage d’un observateur et d’un observer tout en formalisant son moyen de communication via un objet de type événement. Il s’agit en fait du pattern observateur mais simplifié.

Ce pattern est souvent utilisé pour sa nature événementielle dans le cadre de la gestion des IHM. Ainsi, par exemple, lorsque utilisateur sollicite la souris de son ordinateur, le contrôleur associé va générer des événements permettant de suivre ses déplacements. L'utilisation du pattern listener est en première approche une solution intéressante pour traiter ces événements surtout lorsque les sources possibles sont multiples. Pourtant c’est là sa limite également. Car alors si ces sources produisent de multiples événements simultanément alors le système peut être soumis à un “EventStorm” [1] amenant à une utilisation élevée de la mémoire et du CPU, perdre gravement en performance et dans le pire des cas conduire à un crash.

Whiteboard pattern

Le pattern Whiteboard est une solution apportée comme alternative au pattern listener dans le cadre du framework OSGI.

Il est intimement lié à OSGI cependant comme nous verrons ce framework par la suite il me semble plus pertinent d'éviter d’entrer dans trop de détails d'implémentation lié à cette technologie. Ainsi nous nous attacherons à une présentation d’un modèle abstrait du pattern (sous la forme d’un type PIM, Plateform Independant Model dans le MDA [7])

Ce pattern propose de découpler la source des événements du listener en introduisant un objet supplémentaire entre les deux servant de registre et transformant la relation entre les deux éléments par une relation de service et de consommateur de service.

Ce qui servait donc de listener devient un composant fournissant un service qui sera enregistrer dans un registre. La source des événements aura alors la tâche de demander au registre le service adéquat afin de pouvoir lui transmettre les événements produits.




L'intérêt de l'approche en ajoutant ce registre qui finalement réalisé la réification de la relation listener/sources des événements est de permettre de contrôler cette relation et son utilisation par la source des événements.

Il va être alors possible :
  • de réaliser du monitoring sur le flux d’informations voir même de le debugger
  • de rendre indisponible le service du listener si celui ci est trop utilisé et implique une consommation des ressources trop importante
  • d’adjoindre des droits spécifiques d’utilisations en ajoutant sur le registre une couche de sécurité et des permissions afin de ne pas le rendre disponible à n’importe quel consommateur du service venu
  • injecter des propriétés spécifique pour customiser le mapping (comme par exemple pour préciser un quota en événement par seconde à traiter ou pour proposer une taille de tampon d'événements, etc…)

Exemple

Pour illustrer ces mécanismes voici dans un contexte hors OSGI ce qu proposerait une implémentation du pattern listener (observateur) et ensuite son équivalent dans la philosophie du pattern Whiteboard. On précise ici que l’on reste dans une implémentation de type PIM afin de ne pas perturber la compréhension du pattern avec les spécificités technologiques du framework OSGI

Avec Listener


package listener

class Event{
    String message

    Event(String m){
        this.message=m
    }
}

interface IObserver{
    def update(Event e)
}

interface IObserved{
    def notifyAll(Event e)
}

class TrucQuiEcoute implements IObserver{
    def update(Event e){
        println("Reception d'un message")
        println(">>"+e.message)
    }
}

class TrucQuiFait implements IObserved{
    List obs=new ArrayList<Observer>()

    def notifyAll(Event e) {
        for( Observer o in obs){
            o.update(e)
        }
    }

    def makeSomething() {
        def e = new Event("Ceci est le message")
        println("Envoie d'un message")
        this.notifyAll(e)
    }
}


def ob=new TrucQuiEcoute()
def obd=new TrucQuiFait()
obd.obs.add(ob)
obd.makeSomething()

Avec Whiteboard


package whiteboard

interface IService{
    def serve(Event e)
}

class ServiceRegister{
    Map services=new HashMap<String,IService>()
}

class Event{
    String message

    Event(String m){
        this.message=m
    }
}

class TrucQuiEcoute implements IService{
    def serve(Event e){
        println("Reception d'un message")
        println(">>"+e.message)
    }
}

class TrucQuiFait implements IService{
    ServiceRegister register;

    TrucQuiFait(ServiceRegister register)
    {
        this.register=register;
    }

    def serve(Event serviceNameEvent) {
        def e = new Event("Ceci est le message")
        println("Envoie d'un message")
        this.register.services.get(serviceNameEvent.getMessage()).serve(e)
    }
}

def reg=new ServiceRegister()
reg.services.put("TrucQuiEcoute",new TrucQuiEcoute())
reg.services.put("TrucQuiFait",new TrucQuiFait(reg))

reg.services.get("TrucQuiFait").serve(new Event("TrucQuiEcoute"))

Conclusion

Voilà nous avons fait le tour de ce pattern un peu spécial enfin, surtout un peu spécialisé, qu’est le pattern Whiteboard. Celui-ci est très associé à OSGI mais il peut se comprendre sans et surtout mieux comprendre certains mécanisme de ce framework que nous verrons dans un prochain article.

Références

[1] https://www.osgi.org/wp-content/uploads/whiteboard1.pdf
[2] https://en.wikipedia.org/wiki/Whiteboard_Pattern
[3] https://www.osgi.org/
[4] https://enroute.osgi.org/FAQ/400-patterns.html
[5] https://www.theserverside.com/news/1363820/The-Whiteboard-Pattern-for-OSGi
[6] https://un-est-tout-et-tout-est-un.blogspot.com/2017/11/design-pattern-observateur.html
[7] https://laine.developpez.com/tutoriels/alm/mda/generalites-approche-mda/