<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CarmaBlog</title>
	<atom:link href="https://blog.fabianpiau.com/fr/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.fabianpiau.com/fr/</link>
	<description>Agilité, Développement Java, Nouvelles technologies et plus...</description>
	<lastBuildDate>Mon, 30 Dec 2024 14:34:55 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/2017/02/cup-rss-original-512.png?fit=32%2C32&#038;ssl=1</url>
	<title>CarmaBlog</title>
	<link>https://blog.fabianpiau.com/fr/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">175576829</site>	<item>
		<title>Comment écrire un article de blog? En tout cas à ma façon!</title>
		<link>https://blog.fabianpiau.com/fr/2022/12/05/how-to-write-a-blog-post-at-least-my-way/</link>
					<comments>https://blog.fabianpiau.com/fr/2022/12/05/how-to-write-a-blog-post-at-least-my-way/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Mon, 05 Dec 2022 22:28:26 +0000</pubDate>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[partage]]></category>
		<category><![CDATA[société]]></category>
		<category><![CDATA[write]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5264</guid>

					<description><![CDATA[<p>&#160;English version available Comment écrire un article de blog? A plusieurs reprises, j&#8217;ai reçu des messages de lecteurs me demandant des conseils autour de ce sujet. Comment trouver des idées? Comment faire le tri dans ses pensées avant de se plonger dans l&#8217;écriture? Est-ce que je suis un processus particulier? Ai-je des conseils à partager [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2022/12/05/how-to-write-a-blog-post-at-least-my-way/">Comment écrire un article de blog? En tout cas à ma façon!</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2014/01/09/list-favourite-android-apps/" rel="bookmark" title="Liste de mes applications Android favorites">Liste de mes applications Android favorites</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/09/03/windows-7-test/" rel="bookmark" title="Test de Windows 7">Test de Windows 7</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/11/11/do-you-need-a-good-cover-for-this-winter-eclemma/" rel="bookmark" title="EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver">EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2010/04/04/maven-site-one-step-further/" rel="bookmark" title="Plus loin avec le Maven Site">Plus loin avec le Maven Site</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2022/12/05/how-to-write-a-blog-post-at-least-my-way" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Comment écrire un article de blog? A plusieurs reprises, j&rsquo;ai reçu des messages de lecteurs me demandant des conseils autour de ce sujet.</p>
<ul>
<li>Comment trouver des idées?</li>
<li>Comment faire le tri dans ses pensées avant de se plonger dans l&rsquo;écriture?</li>
<li>Est-ce que je suis un processus particulier?</li>
<li>Ai-je des conseils à partager avec quelqu&rsquo;un qui aimerait commencer à bloguer?</li>
</ul>
<p>Je me souviens encore du jour où j&rsquo;ai commencé ce blog, il y a près de 13 ans (au moment où j&rsquo;écris ceci, je me rends compte à quel point cela sonne préhistorique). A l&rsquo;époque, mon objectif initial était de publier une fois par mois sur des sujets variés liés à l&rsquo;informatique, que ce soit sur des thématiques liées à mon travail, ou à des projets personnels. Si cela fonctionnait plutôt bien au début, ces derniers temps, je dois l&rsquo;avouer, cela ne fonctionne pas si bien que ça. J&rsquo;ai presque honte quand je regarde la date du dernier (précédent) article, il y a plus d&rsquo;un an, c&rsquo;est de loin la plus grosse période d&rsquo;inactivité sur mon blog!</p>
<p>Aujourd&rsquo;hui, j&rsquo;ai décidé d&rsquo;écrire sur ce sujet en particulier, non seulement parce que l&rsquo;on m&rsquo;a interrogé à plusieurs reprises à ce propos, mais aussi parce que cet article représente une étape importante pour mon blog. C&rsquo;est en effet le 100ème article, et c&rsquo;est l’occasion parfaite pour écrire sur un tel sujet même si c&rsquo;est quelque chose d&rsquo;inhabituel et non technique.</p>
<p class="center"><img data-recalc-dims="1" fetchpriority="high" decoding="async" title="Photo Ecrire Article Ordinateur Portable" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00099/write-article-laptop-shadow.png?resize=568%2C303&#038;ssl=1" alt="Photo Ecrire Article Ordinateur Portable" width="568" height="303" /></p>
<p>Pour être honnête, à moins que cela fasse partie d&rsquo;un travail à plein temps, il faut un certain dévouement pour écrire des articles, car cela prend pas mal de temps, et je ne pense pas qu&rsquo;il y ait de recette magique. L&rsquo;état d&rsquo;esprit de chacun fonctionne différemment, et ce qui peut fonctionner pour moi pourrait avoir l&rsquo;effet inverse sur vous. Néanmoins, dans cet article, je vais essayer de décrire ma recette qui fonctionne. Du moins je l’espère, je l&rsquo;ai appliquée pour écrire cet article donc vous pouvez juger de la méthode par vous-même.</p>
<p><br clear="none" /></p>
<h4>L&rsquo;idée</h4>
<p>Tout commence par une idée (ça ressemble à une bande-annonce de film je sais mais c&rsquo;est vrai). Une idée est une phrase courte, un ensemble de mots-clés tout au plus, qui représente un sujet particulier, ni trop spécifique, ni trop vague. Il n&rsquo;y a pas de moment précis pour avoir une idée, cela peut être en travaillant, en pianotant sur son ordinateur, en marchant, en prenant une douche. Une idée pointe le bout de son nez généralement bien avant que vous ne commenciez à écrire du contenu à son sujet, mais ce n&rsquo;est pas toujours vrai, et vous pourriez trouver une idée qui vous passionnera à tel point que vous allez commencer à écrire un article dans l&rsquo;heure qui suit.</p>
<p>Personnellement, je conserve toutes mes idées sous la forme d&rsquo;une liste à puces non ordonnée dans un fichier texte sur mon ordinateur. Pour vous donner une idée (oui celle-ci était facile désolé), j&rsquo;ai actuellement 9 idées dans cette liste.</p>
<p>Tout au long de l&rsquo;année, j&rsquo;ai ce puits d&rsquo;idées dans lequel je peux puiser pour écrire des articles. Comme je l&rsquo;ai mentionné précédemment, il n&rsquo;y a pas de règles lorsque vous sélectionnez une idée ; parfois  j&rsquo;écris un article sur une idée que je viens juste d&rsquo;ajouter (cet article en fait partie), d&rsquo;autres fois j&rsquo;écris un article sur une idée que j&rsquo;ai ajoutée il y a 3 ans. La plupart des idées que j&rsquo;ai maintenant ne feront probablement jamais l&rsquo;objet d’un article, il est donc normal d&rsquo;en abandonner un grand nombre au fil du temps, et cela pour diverses raisons, par exemple l&rsquo;idée:</p>
<ul>
<li>n&rsquo;est pas suffisamment bonne pour faire un article intéressant ;</li>
<li>n&rsquo;est pas alignée avec la ligne éditoriale de mon blog, c&rsquo;est-à-dire qu&rsquo;elle cible un tout autre public ;</li>
<li>est portée sur un sujet niche trop spécialisé ;</li>
<li>ou, au contraire, concerne un sujet archi connu et déjà couvert par de nombreux blogueurs.</li>
</ul>
<p><br clear="none" /></p>
<h4>Contenu brut</h4>
<p>Une fois que j&rsquo;ai sélectionné l&rsquo;idée, je trouve 1 ou 2 heures dans mon agenda et je commence à écrire. J&rsquo;ai besoin d&rsquo;un temps de concentration maximum, et si je peux j&rsquo;évite de faire des pauses pour limiter toutes coupures et autres distractions. Ici, je parle d&rsquo;écrire du contenu pur, une version vraiment brute de décoffrage, tout ce qu&rsquo;il peut me passer par la tête quand je pense à cette idée, ça peut être sous forme de phrases complètes, de listes à puces, de quelques liens ou une description textuelle des futurs images ou schémas que je souhaiterais inclure, etc.</p>
<p>Cela dépend de l&rsquo;idée, mais s&rsquo;il s&rsquo;agit d&rsquo;une idée très technique, je peux aussi faire une préparation préalable et utiliser des notes prises précédemment, par ex. il peut s&rsquo;agir de quelques lignes de code ou d&rsquo;autres exemples de programmation. Je peux également faire des recherches supplémentaires sur Internet pour savoir s&rsquo;il y a autre chose auquel je n&rsquo;ai pas pensé. Ce n&rsquo;est pas une mauvaise chose de s&rsquo;inspirer d&rsquo;autres sources, bien sûr tant que vous ne paraphrasez pas ou ne faites pas de plagiat!</p>
<p>A ce stade, je ne fais pas attention ni à l&rsquo;orthographe, ni aux fautes de frappe et autres fautes de grammaire, j&rsquo;écris littéralement ce qui me passe par la tête et que je ne voudrais pas oublier. J&rsquo;utilise un simple éditeur de texte plutôt que d&rsquo;utiliser l&rsquo;éditeur de blog en ligne afin d&rsquo;éviter toute distraction.</p>
<p>Cela ne vous concerne peut-être pas, mais comme mon blog est bilingue, avec un contenu disponible en français et en anglais, je dois aussi décider dans quelle langue je vais écrire en premier. Selon moi, je ne pense pas qu&rsquo;il soit très efficace d&rsquo;écrire dans les deux langues en parallèle, et je préfère me concentrer sur une seule à la fois en laissant la traduction à la fin. La plupart du temps et même si le français est ma langue maternelle, j&rsquo;écris d&rsquo;abord en anglais. La raison principale est que je risquerais d&rsquo;écrire des phrases trop complexes en français qui seront difficilement traduisibles en anglais, une autre raison est le fait que je travaille dans le secteur des technologies dans un environnement anglais, donc cette langue est tout simplement plus naturelle (je n&rsquo;aurais jamais pensé écrire ça un jour!).</p>
<p><br clear="none" /></p>
<h4>Réviser, Améliorer, Peaufiner, Répéter</h4>
<p>Maintenant que j&rsquo;ai couché sur papier (numérique) toutes les informations associées à mon idée, on pourrait penser que je suis à peu près à 60% du processus d&rsquo;écriture. Malheureusement, c&rsquo;est loin d&rsquo;être le cas, et de façon réaliste, je dirais que je n&rsquo;ai fait qu&rsquo;environ 30%.</p>
<p>C&rsquo;est à ce moment qu&rsquo;entre en piste un processus itératif de révision et d&rsquo;amélioration, plutôt long et fastidieux. C&rsquo;est l&rsquo;étape la plus longue de la rédaction d&rsquo;un article, mais aussi la plus importante, c&rsquo;est là que la structure de l&rsquo;article va prendre forme. Je réorganise mes pensées de manière logique afin que le contenu soit facile à lire et à suivre pour mes lecteurs. Les retours à la ligne, les paragraphes, les sections, les titres et les sous-titres apparaîtront naturellement au fil des révisions. Il est tout à fait acceptable de supprimer une section si vous réalisez qu&rsquo;elle ne s’intègre pas avec le reste, ou de développer une section si certains détails ont été omis, ou même de réécrire des pans entiers de texte.</p>
<p>Il est important d&rsquo;adapter le ton de voix et de le garder cohérent à travers tous vos articles. Si c&rsquo;est votre propre blog, c&rsquo;est quelque chose auquel vous ne penserez sûrement pas, mais imaginez que vous écrivez un article dans un blog d&rsquo;une revue scientifique dont le contenu est écrit par plusieurs auteurs, écrire une blague est probablement la dernière chose que vous voudriez faire&#8230;</p>
<p>A noter que j&rsquo;arrête d&rsquo;utiliser le simple éditeur de texte au profit de l&rsquo;éditeur de blog en ligne, ainsi je peux donc utiliser le mode aperçu et voir le rendu final de l&rsquo;article. C&rsquo;est important, car cette étape ne se concentre plus uniquement sur le texte, mais je pense aussi aux images que j&rsquo;aimerais intégrer, aux liens que j&rsquo;aimerais inclure et à la mise en forme que j&rsquo;aimerais appliquer.</p>
<p><br clear="none" /></p>
<p><strong>Le Visuel</strong></p>
<p>Lorsque vous ajoutez des images, n&rsquo;en faites pas trop. Non seulement l&rsquo;ajout d&rsquo;images aura un impact non négligeable sur la bande passante, mais pourra également causer une certaine distraction pour vos lecteurs. Dans la plupart des cas, une image en haut de l&rsquo;article suffira.</p>
<p>Pour rechercher l&rsquo;image parfaite et si vous n&rsquo;êtes pas satisfait de vos propres photos, vous pourriez être tenté d&rsquo;utiliser Google Images, mais il existe bien d&rsquo;autres ressources disponibles, qui vous éviteront notamment toute forme de violation du droit d&rsquo;auteur.</p>
<ul>
<li><a href="https://unsplash.com/" target="_blank" title="Unsplash" rel="noopener noreferrer">Unsplash</a></li>
<li><a href="https://www.pexels.com/" target="_blank" title="Pexels" rel="noopener noreferrer">Pexels</a></li>
<li><a href="https://thenounproject.com/" target="_blank" title="TITRE" rel="noopener noreferrer">The Noun Project</a></li>
</ul>
<p>Peut-être devez-vous créer un diagramme ou un schéma? Personnellement, j&rsquo;utilise PowerPoint, ce n&rsquo;est peut-être pas le meilleur outil, mais il a un rendu que j’apprécie et je suis très familier avec la suite Office. Au cas où j&rsquo;aurais besoin de générer un schéma plus technique, j&rsquo;utilise également <a href="https://plantuml.com/" target="_blank" title="PlantUML" rel="noopener noreferrer">PlantUML</a>. Cela dépendra vraiment de ce sur quoi vous écrivez et de votre domaine d&rsquo;expertise, bref, choisissez l&rsquo;outil que vous préférez!</p>
<p><br clear="none" /></p>
<p><strong>Liens</strong></p>
<p>Lorsque vous ajoutez des liens, n&rsquo;en faites pas trop. Le lien est l&rsquo;outil fondamental pour naviguer sur Internet, il aide à référencer les sites Web incluant le vôtre, mais l&rsquo;ajout de nombreux liens pourrait être distrayant et votre lecteur pourrait finir par penser que vous faites de la publicité plutôt que de fournir du contenu informatif.</p>
<p>Lorsque vous ajoutez des liens, assurez-vous qu&rsquo;ils ont tous une utilité. Aident-ils le lecteur à obtenir plus de contexte? Permettent-ils au lecteur d&rsquo;accéder à un outil que vous avez mentionné? Il est très important d&rsquo;étiqueter correctement votre lien et de ne pas utiliser le typique « cliquez ici » qui ne contient aucun contexte.</p>
<p>A l&rsquo;inverse, ce n&rsquo;est pas la fin du monde si votre article ne contient aucun lien ou seulement quelques-uns. Cependant, je suggérerais d&rsquo;avoir au moins une section en bas de l&rsquo;article avec une liste de liens utiles. Cela peut être à titre de référence (c&rsquo;est aussi une façon de remercier les auteurs dont vous vous êtes peut-être inspiré), mais cela peut également être utile si le lecteur souhaite aller plus loin sur le sujet.</p>
<p><br clear="none" /></p>
<p><strong>Mise en page</strong></p>
<p>Lorsque vous ajoutez la mise en forme, n&rsquo;en faites pas trop. La cohérence et la simplicité sont des concepts clés.</p>
<p>Vous pouvez utiliser plusieurs niveaux pour différencier les titres principaux des sous-titres. Personnellement, je me limite à 2 niveaux maximum. Si vous avez besoin de plus, votre article est peut-être trop complexe et il faudrait peut-être envisager de le décomposer en une série d&rsquo;articles.</p>
<p>En général, espacez votre texte et évitez les phrases longues et complexes qui ont tendance à générer des pavés. Utilisez des listes à puces quand cela a du sens, pas partout.</p>
<p>Certaines mises en forme de texte mineures comme le gras et l&rsquo;italique peuvent être utiles, mais à utiliser avec parcimonie.</p>
<ul>
<li>Le gras peut souligner une idée et attirer l&rsquo;attention du lecteur.</li>
<li>L&rsquo;italique peut être utilisé pour introduire un terme technique ou pour citer un texte.</li>
</ul>
<p><br clear="none" /></p>
<h4>Dernière Revue</h4>
<p>A ce stade, il est primordial d&rsquo;utiliser le mode aperçu de votre éditeur de blog, ainsi vous pourrez vérifier qu&rsquo;il n&rsquo;y a pas de liens cassés, que les images sont rendues correctement au bon endroit dans les bonnes dimensions, que la mise en forme et l&rsquo;espacement fonctionnent comme prévu, etc.</p>
<p>Je dois admettre que j&rsquo;utilise Word pour la vérification de mon orthographe et grammaire, je copie le contenu complet dans un document Word, puis je répercute les éventuelles corrections suggérées dans l&rsquo;article. Un outil plus sophistiqué comme <a title="Grammarly" href="https://www.grammarly.com/" target="_blank" rel="noopener noreferrer">Grammarly</a> ou <a title="Antidote" href="https://www.antidote.info/" target="_blank" rel="noopener noreferrer">Antidote</a> peut également être une aide précieuse, ces outils s&rsquo;intègrent directement dans votre navigateur donc vous n&rsquo;aurez même pas besoin de transférer le contenu.</p>
<p>Si vous connaissez quelqu&rsquo;un prêt à vous aider et relire votre article, cela peut être un collègue, un ami ou un membre de votre famille, demandez-lui! Il est toujours bon d&rsquo;avoir des yeux supplémentaires sur votre travail. Personnellement, je saute cette étape et fais ma propre revue. Mais faire comme moi peut être légèrement risqué, surtout si vous publiez au nom de votre entreprise par exemple. Je suis à peu près sûr d&rsquo;avoir de nombreux articles publiés avec des fautes, c&rsquo;est particulièrement vrai dans la version anglaise de mes anciens articles (j&rsquo;espère que mon anglais s&rsquo;est amélioré depuis). Encore une fois, ce n&rsquo;est pas la fin du monde, surtout si cela se produit sur un blog personnel, vous avez déjà pris du temps pour écrire et partager vos connaissances, et votre lecteur ne vous jugera pas pour cela.</p>
<p>Comme le titre l&rsquo;indique, il s&rsquo;agit d&rsquo;une dernière revue, alors ne révisez pas encore et encore. Je sais qu&rsquo;il peut être tentant d&rsquo;améliorer à nouveau votre texte. Je pense que ça peut être mieux comme ça. Je pense que je suis allé trop dans les détails dans cette partie et pas assez dans celle-là. La formulation n&rsquo;est pas super ici. Et si j&rsquo;utilisais cette phrase à la place? Soyons honnêtes, il y a peu de chance que vous soyez pleinement satisfait.</p>
<p>Puisque vous avez déjà passé plusieurs heures sur votre article, il est temps de lâcher prise et de cliquer sur le bouton de publication! Ah, enfin, n&rsquo;oubliez pas de trouver un bon titre, il doit être court, accrocheur et véhiculer l&rsquo;idée principale de votre article.</p>
<p><br clear="none" /></p>
<h4>Traduction facultative</h4>
<p>Dans mon cas, je n&rsquo;ai pas encore fini, je dois aussi traduire l&rsquo;article en français avant de publier.</p>
<p>Bien que le français soit ma langue maternelle, je prends des raccourcis pour accélérer le processus de traduction et j&rsquo;utilise Google Translate. Je peux donc partir d&rsquo;une base et d&rsquo;un texte déjà traduit que je peux ensuite relire, reformuler quelques phrases ici et là. La traduction automatique n&rsquo;est pas parfaite, mais je dois dire qu&rsquo;elle est plutôt bonne, je dirais qu&rsquo;environ 70% du contenu est généralement laissé intact ou avec des modifications mineures.</p>
<p>A moins que je doive recréer quelques schémas en français, la traduction est probablement la partie la plus rapide à faire, puisque je garde les mêmes images, le texte et la mise en forme, et le français est évidemment plus facile pour moi&#8230;</p>
<p class="center"><img data-recalc-dims="1" decoding="async" title="Processus écrire article" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00099/write-article-process-fr.png?w=568&#038;ssl=1" alt="Processus écrire article"  /></p>
<p><br clear="none" /></p>
<p>Bon blog!</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2022/12/05/how-to-write-a-blog-post-at-least-my-way/">Comment écrire un article de blog? En tout cas à ma façon!</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2014/01/09/list-favourite-android-apps/" rel="bookmark" title="Liste de mes applications Android favorites">Liste de mes applications Android favorites</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/09/03/windows-7-test/" rel="bookmark" title="Test de Windows 7">Test de Windows 7</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/11/11/do-you-need-a-good-cover-for-this-winter-eclemma/" rel="bookmark" title="EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver">EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2010/04/04/maven-site-one-step-further/" rel="bookmark" title="Plus loin avec le Maven Site">Plus loin avec le Maven Site</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2022/12/05/how-to-write-a-blog-post-at-least-my-way/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5264</post-id>	</item>
		<item>
		<title>Attaques de robots: vous n&#8217;êtes pas seul&#8230;</title>
		<link>https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/</link>
					<comments>https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Tue, 20 Apr 2021 15:42:31 +0000</pubDate>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[attaque]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[gestion des incidents]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[sécurité]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5179</guid>

					<description><![CDATA[<p>&#160;English version available Remarque J&#8217;ai publié cet article pour la première fois sur le blog tech d&#8217;Expedia Group sur Medium (en anglais): Bot Attacks: You are not alone&#8230; Dans un article récent, Security Magazine a déclaré que 1,3 milliard attaques de robots ont été détectées au troisième trimestre 2020. Ce n&#8217;est pas une surprise. Nous [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/">Attaques de robots: vous n&rsquo;êtes pas seul&#8230;</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-related-none yarpp-template-list'>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2021/04/20/bot-attacks-you-are-not-alone/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Remarque</strong><br />
J&rsquo;ai publié cet article pour la première fois sur le blog tech d&rsquo;Expedia Group sur Medium (en anglais): <a href="https://medium.com/expedia-group-tech/bot-attacks-you-are-not-alone-d8b3290342bd" target="_blank" title="Bot Attacks: You are not alone..." rel="noopener noreferrer">Bot Attacks: You are not alone&#8230;</a>
</div>
<p>Dans un article récent, Security Magazine a déclaré que <a href="https://www.securitymagazine.com/articles/93920-3-billion-bot-attacks-were-detected-in-q3-of-2020" target="_blank" title="1.3 billion bot attacks were detected in Q3 of 2020" rel="noopener noreferrer">1,3 milliard attaques de robots ont été détectées au troisième trimestre 2020</a>. Ce n&rsquo;est pas une surprise. Nous ne sommes pas seuls. Vous n&rsquo;êtes pas seul. </p>
<p>L&rsquo;année dernière, l&rsquo;équipe Opex Excellence d&rsquo;Expedia Group a passé en revue tous les incidents survenus en production ayant impacté le site Hotels.com. Nous avons couvert une période de 12 mois et nous avons identifié les <strong>attaques de robots</strong> comme étant l&rsquo;une des menaces les plus importantes. </p>
<blockquote><p>Anything that can go wrong will go wrong — Murphy&rsquo;s law</p></blockquote>
<p>Dans cet article, je vais définir et expliquer ce que sont les robots et les attaques de robots. J&rsquo;espère que cela vous permettra d&rsquo;acquérir des connaissances pour mieux comprendre cette menace qui plane sur votre site web, afin que vous puissiez mettre en place un ensemble de stratégies et solutions pour prévenir et atténuer l&rsquo;impact d&rsquo;une attaque si vous y êtes confronté. </p>
<blockquote><p>Know the enemy and know yourself, in a hundred battles you will never be in peril — Sun Tzu, The Art of War</p></blockquote>
<p class="center"><img data-recalc-dims="1" decoding="async" title="Bots - Photo par Eric Krull sur Unsplash" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00098/bots-banner.png?resize=550%2C246&#038;ssl=1" alt="Bots - Photo par Eric Krull sur Unsplash" width="550" height="246" /></p>
<h3>Qu&rsquo;est ce qu&rsquo;une attaque de robots?</h3>
<p>Le premier type d&rsquo;attaque de robots qui vient généralement à l&rsquo;esprit est l&rsquo;attaque de type <strong>déni de service</strong> (Denial of Service &#8211; DoS) ou DDoS (lorsqu&rsquo;elle est distribuée). Une attaque DDoS affecte généralement l&rsquo;ensemble du site, les erreurs se produisant en cascade, rendant le site indisponible. L&rsquo;attaquant envoie un grand nombre de requêtes (par exemple, en effectuant simultanément une énorme quantité de requêtes GET / POST sur des URLs aléatoires) afin de surcharger les services sous-jacents à tel point qu&rsquo;ils ne peuvent plus gérer le trafic. Les services commencent à répondre aux requêtes avec des réponses en timeout ou en erreur. Evidemment, cela affecte également les requêtes venant de clients légitimes &#8211; dans notre cas, des clients qui tentent de réserver leur séjour à l&rsquo;hôtel.</p>
<p>Un autre type d&rsquo;attaque, légèrement plus ciblé, est une attaque de type <strong>scraping</strong>. Un robot d&rsquo;exploration (crawler) peut scanner différentes pages afin d&rsquo;extraire des informations spécifiques. Ceci est également connu sous le nom de data scraping. Ces robots ciblent généralement vos données d&rsquo;inventaire, par exemple tous les détails des hôtels avec les informations de contact, ou les différents prix pour des dates spécifiques. Parfois, il peut même s&rsquo;agir de l&rsquo;intégralité du contenu de certaines pages de votre site web, afin de les reproduire à l&rsquo;identique pour préparer une attaque de phishing.</p>
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Dans l&rsquo;idéal, l&rsquo;attaquant ne veut pas être vu quand il scanne et récupère des informations. Bien souvent, il essaiera de dissimuler ses traces en attaquant sur une plus longue durée, par exemple sur plusieurs jours pour éviter une augmentation du trafic soudaine qui pourrait déclencher une alerte et une investigation du côté de la victime. A moins que l&rsquo;attaque ne soit sophistiquée et ne provienne de différentes machines, elle est en général assez facile à identifier lorsqu&rsquo;il y a un nombre anormalement élevé de requêtes provenant de la même adresse IP (ou plage d&rsquo;adresses IP) au niveau Edge. Je donnerai plus de détails sur le niveau Edge dans la partie suivante.</p></blockquote>
<p><br clear="none" /></p>
<p>Si les attaques de type DoS et scraping ont une portée <strong>étendue</strong>, dans le sens où elles s&rsquo;attaquent à des pans entiers du site, nous constatons également des attaques <strong>chirurgicales</strong> ciblant des pages et fonctionnalités spécifiques.</p>
<p>Les attaques spécialisées sont bien plus précises et ciblent généralement une page ou une fonctionnalité spécifique de votre site. Voici quelques cas réels auxquels nous avons été confrontés:</p>
<ul>
<li>Une attaque sur la page de réservation, lorsque l&rsquo;attaquant tente de trouver des coupons en générant et en essayant plusieurs codes, en espérant pouvoir trouver et exploiter un pattern. Cette attaque utilise la force brute.</li>
<li>Une attaque sur la page de connexion, lorsque l&rsquo;attaquant tente plusieurs combinaisons de login et de mot de passe. L&rsquo;idée est d&rsquo;avoir accès aux comptes utilisateurs et aux données confidentielles, ou ce que nous appelons Account Take Over (ATO). Cela utilise également la force brute.</li>
<li>Une attaque sur la page de l&rsquo;application mobile, lorsque l&rsquo;attaquant tente d&rsquo;envoyer un grand nombre de SMS à des numéros de téléphone aléatoires ou faux. Il est assez courant de nos jours d&rsquo;inviter les utilisateurs à télécharger une application sur leur appareil mobile en envoyant un SMS contenant le lien vers l&rsquo;application sur l&rsquo;App Store. Le site web ciblé finira par payer de l&rsquo;argent, car le service de messagerie est généralement géré par un fournisseur tiers et chaque SMS envoyé a un coût.</li>
</ul>
<p>Générale ou spécifique, une attaque peut être basique ou sophistiquée. Un exemple d&rsquo;<strong>attaque basique</strong> est une personne qui essaie désespérément de trouver un code de réduction en envoyant des dizaines de requêtes à un service de coupons. Les attaques de base sont difficiles à repérer, mais faciles à bloquer: vous pouvez bloquer l&rsquo;adresse IP avec une règle WAF (Web Application Firewall). Le risque reste faible.</p>
<p>Et il y a les <strong>attaques sophistiquées</strong>, elles peuvent être distribuées et étendues sur des milliers de machines situées dans différents pays et utilisant des technologies de script avancées, comme un navigateur headless. Le niveau d&rsquo;impact et de risque est beaucoup plus élevé, mais ils sont évidemment plus faciles à repérer comme elles sont associées à une montée en charge soudaine du trafic.</p>
<p class="center"><img data-recalc-dims="1" decoding="async" title="Matrice de risque d'attaque de robots" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00098/bot-attack-risk-matrix-fr.png?resize=550%2C454&#038;ssl=1" alt="Matrice de risque d'attaque de robots" width="550" height="454" /></p>
<h3>Doit-on bloquer tous les robots?</h3>
<p>Evidemment non! Tous les robots ne sont pas mauvais, certains sont même bienveillants.</p>
<ul>
<li>Il existe les <strong>robots d&rsquo;exploration</strong> (spider et crawler bots) des moteurs de recherche populaires tels que Google Search ou Microsoft Bing. Si vous les bloquez, l&rsquo;indexation du site sera fortement impactée, le trafic légitime se dégradera avec le temps et la popularité du site diminuera.</li>
<li>Il existe également les <strong>robots commerciaux</strong> (ad bots, par exemple, le robot Google AdSense), pour proposer des publicités personnalisées aux utilisateurs, y compris les publicités pour votre propre site.</li>
<li>Il y a les <strong>robots de données</strong> (data bots) comme les agrégateurs de contenu et de flux, et il y a aussi le <a href="https://archive.org/web/" target="_blank" title="Archive bot" rel="noopener noreferrer">robot archiveur</a> qui construit la plus grande archive Internet.</li>
<li>Il existe aussi les <strong>robots de copyright</strong>, qui traquent plagiat et vol de propriété intellectuelle. Vous avez peut-être rencontré l&rsquo;un d&rsquo;entre eux si vous avez essayé d&rsquo;uploader une vidéo sur YouTube avec votre musique préférée en arrière-plan. Vous réalisez alors rapidement que Google l&rsquo;a supprimée, en vous rappelant poliment que vous ne pouvez utiliser aucun contenu protégé.</li>
<li>Il existe également des <strong>robots de surveillance</strong> pour vous assurer que votre site est en bonne santé et vous signaler quand ce n&rsquo;est pas le cas. Par exemple, Akamai, Datadog, etc. utilisent des robots pour s&rsquo;assurer que votre site répond correctement.</li>
</ul>
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Vous ne devez bloquer aucun de ces robots, car ils ne sont pas mauvais, et généralement ils ne sont pas agressifs, et en plus ils contribuent à Internet. Néanmoins, si vous pensez que votre trafic légitime en souffre, au lieu de les bloquer, il est préférable de mettre en place une stratégie de limitation de débit pour atténuer leur impact. Plus de détails à ce sujet dans la partie suivante à propos du niveau Edge.</p></blockquote>
<p>Si tous ces robots sont des tiers, vous pouvez parfois avoir votre propre robot. Dans notre cas, un <strong>robot interne</strong> vérifie régulièrement les pages de destination pour s&rsquo;assurer qu&rsquo;il n&rsquo;y a pas de liens morts ou de redirections inutiles. Nous ne voulons donc certainement pas le bloquer!</p>
<h3>Que faire contre les attaques?</h3>
<p>Nous pouvons empêcher les attaques au <strong>niveau Edge</strong> et les atténuer au <strong>niveau Applicatif</strong>.</p>
<p class="center"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Niveaux Edge et Applicatif" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00098/edge-application-levels.png?resize=550%2C374&#038;ssl=1" alt="Niveaux Edge et Applicatif" width="550" height="374" /></p>
<h4>Utilisation du fichier <em>robots.txt</em></h4>
<p>La première chose qui peut vous venir à l&rsquo;esprit lorsque vous souhaitez manipuler des robots est le fichier <em>robots.txt</em>. Il est présent sur chaque site web et il existe depuis des lustres. Il s&rsquo;agit d&rsquo;un fichier texte accessible publiquement à la racine de votre site. Il spécifie les règles pour tous les robots accédant à votre site. Ces règles définissent les pages que les robots peuvent et ne peuvent pas explorer, et quels liens ils doivent et ne doivent pas suivre.</p>
<p>Les robots bienveillants suivront ces règles. Par exemple, si un propriétaire de site web ne souhaite pas qu&rsquo;une certaine page de son site apparaisse dans les résultats de recherche Google, il peut écrire une règle pour celle-ci, et le robot d&rsquo;exploration de Google n&rsquo;indexera pas cette page. Bien que le fichier <em>robots.txt</em> ne puisse pas appliquer ces règles lui-même, les robots bienveillants sont programmés pour rechercher ce fichier et suivre les règles avant de faire quoi que ce soit d&rsquo;autre. Cela se base sur un code d&rsquo;honneur en quelque sorte.</p>
<p>Les mauvais robots malveillants ne suivront évidemment aucune de vos règles. Au contraire, ils le liront souvent pour savoir quel contenu un site tente de leur interdire, puis accéderont à ce contenu. Ainsi, la gestion des robots nécessite une approche plus active que la simple définition des règles de comportement des robots dans le fichier <em>robots.txt</em>. C&rsquo;est ce que nous allons voir dans la partie suivante.</p>
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Le fichier <em>robots.txt</em> peut également être utilisé comme un piège, en exposant un leurre qui permet d&rsquo;exposer les robots malveillants. Le leurre peut être une page du site interdite aux robots par le fichier <em>robots.txt</em>. Les robots bienveillants liront le fichier <em>robots.txt</em> et éviteront cette page, alors que les mauvais robots exploreront cette page. En suivant les informations des robots qui accèdent à cette page piégée, les robots malveillants peuvent être identifiés et bloqués. Source: <a href="https://www.cloudflare.com/en-gb/learning/bots/what-is-bot-management/" target="_blank" title="What is bot management by Cloudflare" rel="noopener noreferrer">Cloudflare</a></p></blockquote>
<p><br clear="none" /></p>
<h4>Gestion avancée des robots</h4>
<p>Le principal rempart contre les mauvais robots est la gestion des robots au niveau Edge. Cette défense est beaucoup plus avancée que le fichier <em>robots.txt</em>. J&rsquo;ai pris cette liste sur <a href="https://www.cloudflare.com/en-gb/learning/bots/what-is-bot-management/" target="_blank" title="What is bot management by Cloudflare" rel="noopener noreferrer">Cloudflare</a> mais les fonctionnalités seront similaires pour tout autre outil Edge:</p>
<ul>
<li>Différencie les robots par rapport aux visiteurs humains (à l&rsquo;aide de l&rsquo;analyse comportementale et potentiellement de l&rsquo;apprentissage automatique)</li>
<li>Calcule la réputation des robots</li>
<li>Identifie les adresses IP d&rsquo;origine des robots et les bloque en fonction de la réputation IP</li>
<li>Analyse le comportement des robots</li>
<li>Ajoute les robots bienveillants aux listes d&rsquo;autorisation</li>
<li>Ajoute les robots malveillants aux listes de blocage</li>
<li>Challenge les robots potentiels via un test CAPTCHA, une injection JavaScript ou d&rsquo;autres méthodes</li>
<li>Limite le taux de requêtes d&rsquo;un robot potentiel sur-utilisant un service</li>
<li>Ralentit les requêtes de robot, également connu sous le nom de &lsquo;Tarpitting&rsquo; (voir la définition ci-dessous)</li>
<li>Refuse l&rsquo;accès à certains contenus ou ressource pour les robots malveillants</li>
<li>Diffuse du contenu alternatif ou mis en cache aux robots</li>
</ul>
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> &lsquo;Tarpitting&rsquo; est une fonctionnalité intéressante. Cela signifie ajouter un délai artificiel à la requête. C&rsquo;est généralement bien plus efficace que le blocage, car le robot ne saura pas qu&rsquo;il a été découvert, mais l&rsquo;attaque ralentira considérablement car moins de requêtes atteindront le niveau Applicatif, car elles pourraient expirer au niveau Edge. La limitation de débit peut également être une autre bonne stratégie que vous voudriez peut-être envisager.</p></blockquote>
<p>Lorsque vous choisissez un gestionnaire de robot avancé, vous pouvez utiliser un fournisseur tiers populaire tel que <a href="https://www.akamai.com/uk/en/products/security/bot-manager.jsp" target="_blank" title="Bot manager par Akamai" rel="noopener noreferrer">Akamai</a> ou <a href="https://www.cloudflare.com/products/bot-management/" target="_blank" title="Bot management par Cloudflare" rel="noopener noreferrer">Cloudflare</a>.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Aucun impact sur le code de l&rsquo;application.</li>
<li>Une règle de robot est relativement rapide à déployer avec un effet immédiat.</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>La plupart des inconvénients résident dans le fait que ce sont des outils tiers.</li>
<li>Il y a un coût de licence.</li>
<li>Les règles de robot ne peuvent être définies que par rapport à des paramètres génériques tels que le user-agent, l&rsquo;adresse IP, l&rsquo;URL, etc.</li>
<li>Ils impliquent parfois un processus d&rsquo;approbation lourd, par ex. l&rsquo;ajout d&rsquo;une nouvelle règle nécessitera des personnes extérieures à l&rsquo;entreprise ainsi que des personnes internes disposant d&rsquo;une autorisation spéciale.</li>
<li>Une nouvelle règle peut avoir des effets secondaires. A moins de bloquer une adresse IP unique, il est très difficile d&rsquo;être sûr que cela ne bloquera aucun trafic légitime.</li>
<li>La gestion des règles peut être fastidieuse au fil du temps.</li>
<li>Accès et visibilité partiels pour les équipes applicatives.</li>
</ul>
<p>La plupart des inconvénients peuvent être contournés si vous utilisez votre propre outil Edge interne. C&rsquo;est particulièrement intéressant lorsqu&rsquo;il est utilisé en supplément d&rsquo;un outil Edge tiers. C&rsquo;est un investissement lourd et toutes les entreprises ne pourront pas se le permettre, mais cela donnera beaucoup plus de flexibilité et ouvrira des possibilités.</p>
<ul>
<li>Possibilité de définir des règles fonctionnelles liées à votre business.</li>
<li>Possibilité d&rsquo;ajouter une règle temporaire ponctuelle pour atténuer une attaque que vous pouvez supprimer peu de temps après la fin de l&rsquo;attaque.</li>
<li>Possibilité de centraliser la surveillance Edge et de mettre les informations à la disposition de chaque équipe.</li>
</ul>
<p><br clear="none" /></p>
<h4>Hiérarchisation du trafic</h4>
<p>L&rsquo;idée ici n&rsquo;est pas de remplacer votre outil Edge principal, mais d&rsquo;ajouter une logique de priorisation des robots après ce premier rempart. Un tel outil agira comme une file d&rsquo;attente de hiérarchisation afin que les <strong>requêtes de robot à faible valeur soient dépriorisées</strong> en faveur des requêtes d&rsquo;utilisateurs réels qui ont une valeur commerciale plus élevée, avec une réservation potentielle dans notre cas.</p>
<blockquote><p>Requêtes des utilisateurs > Requêtes des robots internes > Requêtes des robots bienveillants externes</p></blockquote>
<blockquote><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Netflix applique des concepts similaires que vous pouvez lire dans <a href="https://netflixtechblog.com/keeping-netflix-reliable-using-prioritized-load-shedding-6cc827b02f94" target="_blank" title="Keeping Netflix Reliable Using Prioritized Load Shedding" rel="noopener noreferrer">Keeping Netflix Reliable Using Prioritized Load Shedding</a> (en anglais).</p></blockquote>
<p><br clear="none" /></p>
<h4>Mise en cache</h4>
<p>Nous avons parlé de gestion de robot, mais il y a autre chose que la couche Edge peut vous fournir, à savoir la possibilité de mettre en cache le contenu. Nous référons généralement cela à un Content Delivery Network (CDN). L&rsquo;idée est de <strong>proposer des pages mises en cache aux robots bienveillants plutôt que de générer de nouvelles pages</strong>.</p>
<p>Nous avons fait des expérimentations l&rsquo;année dernière et cela a considérablement réduit le trafic vers certains de nos services Backend sans affecter le référencement du site. Cette année, nous cherchons à généraliser cette approche.</p>
<p><br clear="none" /></p>
<h4>Atténuation au niveau applicatif</h4>
<p>La gestion des robots au niveau de l&rsquo;application signifie qu&rsquo;une attaque de robots a pu passer entre les mailles du filet au-delà du niveau de protection supérieur fourni par l&rsquo;Edge.</p>
<p>Les solutions dont nous disposons à ce niveau ne sont que des <strong>solutions d&rsquo;atténuation</strong> afin d&rsquo;être proactif et de réduire au maximum les conséquences d&rsquo;une attaque.</p>
<p>Malheureusement nous savons que cela va arriver tôt ou tard, et même plusieurs fois, nous devons donc nous y préparer. Heureusement, ce que nous savons, c&rsquo;est que les attaques de robots ne durent pas éternellement. Une attaque sophistiquée coûte une quantité importante de ressources à l&rsquo;attaquant, et comme les ressources coûtent de l&rsquo;argent. Tant que nous faisons en sorte que l&rsquo;attaquant dépense plus de valeur qu&rsquo;il n&rsquo;en obtient, nous sommes certains que l&rsquo;attaque se stoppera d&rsquo;elle-même.</p>
<p>Il y a différentes actions que nous pouvons entreprendre, pour la plupart il s&rsquo;agit de bonnes pratiques&#8230;</p>
<ul>
<li>Tout d&rsquo;abord, lors du <strong>coding</strong> de l&rsquo;application, il faut éviter d&rsquo;avoir un code de grande complexité, de bloquer des threads, etc. Une bonne idée est de séparer les ports d&rsquo;application et de gestion. Si vous utilisez le même port, en cas d&rsquo;attaque de robots, le service sera tellement surchargé qu&rsquo;il ne pourra pas répondre aux healthchecks et votre plate-forme d&rsquo;infrastructure pensera que le service est défectueux. Même si cela ne résout pas tous vos problèmes, le fait d&rsquo;avoir un port distinct peut atténuer ce problème.</li>
<li>Avoir un <strong>état d&rsquo;esprit chaotique</strong> (chaos engineering) est important. Pour les services critiques, assurez-vous d&rsquo;avoir des <strong>tests de charge et de stress</strong> en place dans votre pipeline. Cela permet de garantir que vos services sont suffisamment résilients et que vous avez identifié des fuites de mémoire potentielles dans votre code, des goulots d&rsquo;étranglement atteignant les services en aval ou les sources de données. En cas de problème, vous souhaitez toujours fournir une réponse dégradée pour atténuer l&rsquo;impact sur le client. Vous pouvez également mettre en place un mécanisme de mise en cache.</li>
<li> Assurez-vous de <strong>tirer parti de votre infrastructure</strong>. Si vous utilisez Kubernetes, vous pouvez jeter un oeil à l&rsquo;<strong>autoscaling</strong>. Soyez vigilant lorsque vous l&rsquo;activez. Assurez-vous que la configuration du service est bien pensée et conforme à ses dépendances. En effet, configurer un nombre élevé de pods et considérer le travail terminé sera une erreur, car vous partagerez également la charge avec vos dépendances en aval et, si elles ne sont pas préparées pour cela, vous déplacerez fondamentalement le goulot d&rsquo;étranglement plus profondément dans la pile sans le résoudre. Cela peut également vous coûter plus cher si votre infrastructure est hébergée sur un fournisseur de cloud comme AWS. Assurez-vous également que vos pods sont prêts à recevoir du trafic une fois qu&rsquo;ils sont exposés à l&rsquo;attaque. Une <strong>warm up routine</strong> comme <a href="https://opensource.expediagroup.com/mittens/" target="_blank" title="Mittens" rel="noopener noreferrer">Mittens</a> pourra être utile, en particulier pour les applications qui mettent du temps à démarrer.</li>
</ul>
<p>Il existe également d&rsquo;autres stratégies au niveau applicatif qui ne sont pas liées à la configuration et à l&rsquo;infrastructure. Certaines reproduisent ce que l&rsquo;on trouve avec une solution de gestion de robot au niveau Edge:</p>
<ul>
<li>Mécanisme Captcha. Une méthode courante consiste à afficher un captcha à l&rsquo;utilisateur s&rsquo;il y a trop de tentatives, ou à cibler les attaques liées aux comptes utilisateurs.</li>
<li>Mécanisme d&rsquo;authentification. Si vos API sont publiques, vous pouvez ajouter une authentification, simple comme &lsquo;Basic Auth&rsquo; ou plus complexe comme &lsquo;CSRF Token&rsquo;. Mais vous devez être conscient que cela ajoutera de la complexité à votre système et que vous devez donc trouver un équilibre, par exemple, demandez-vous si les informations exposées par votre API sont suffisamment sensibles pour être protégées.</li>
<li>Mécanisme de mise en cache, de blocage et de limitation du débit. Cela peut être assez complexe à réaliser et à maintenir, en particulier dans une architecture micro-service, mais je préfère le mentionner, car cela pourrait être une solution potentielle si vous n&rsquo;avez pas d&rsquo;outil Edge ou si vous travaillez sur une application monolithique.</li>
</ul>
<p><br clear="none" /></p>
<h4>Observabilité, Surveillance et Alerte</h4>
<p>Enfin, il est très important que vous ayez une observabilité appropriée en place sur votre site. Toutes les attaques de robots qui deviennent suffisamment sérieuses et commencent à exercer une forte pression sur votre système devraient déclencher automatiquement un ensemble d&rsquo;alertes.</p>
<p><strong>Au niveau Edge:</strong> </p>
<ul>
<li>Alerte sur les règles de robots lorsqu&rsquo;une règle créée récemment bloque trop de trafic ou, au contraire, lorsqu&rsquo;une règle n&rsquo;a bloqué aucun trafic au cours des &lsquo;n&rsquo; derniers mois et peut être réexaminée pour une éventuelle suppression.</li>
<li>Alerte lorsque le trafic du robot (bon ou mauvais) est beaucoup plus élevé que d&rsquo;habitude.</li>
</ul>
<p><strong>Au niveau des applications et de l&rsquo;infrastructure:</strong></p>
<ul>
<li>Alerte sur l&rsquo;auto-scaling et le nombre d&rsquo;instances. Par exemple, quand Kubernetes ajoute 5 nouveaux pods au cours des 5 dernières minutes et que ce n&rsquo;est pas Black Friday, il y a probablement quelque chose de louche&#8230;</li>
<li>Alerte sur le temps et le statut des réponses lorsque le service commence à répondre lentement et/ou avec des erreurs. Je vous recommande de lire <a href="https://medium.com/expedia-group-tech/creating-monitoring-dashboards-1f3fbe0ae1ac" target="_blank" title="Creating Monitoring Dashboards" rel="noopener noreferrer">Creating Monitoring Dashboards</a> (en anglais), qui couvre tout ce que vous devez savoir sur le monitoring.</li>
<li>Vous pouvez également configurer certaines alertes au niveau des logs. Cela peut être utile si vous n&rsquo;exposez pas certaines métriques dans votre application et si vous utilisez un outil avancé de gestion de logs comme Splunk.</li>
</ul>
<h3>Le mot de la fin</h3>
<p>J&rsquo;espère que cet article vous a été utile et que vous avez maintenant une meilleure connaissance des robots et des attaques qu&rsquo;ils peuvent impliquer.</p>
<p>Je n&rsquo;ai discuté d&rsquo;aucune solution miracle ici, car il n&rsquo;existe pas un outil anti-robot parfait pour tout le monde. Mais il y a toujours place à l&rsquo;amélioration pour prévenir et atténuer les attaques de robots.</p>
<p>Ah&#8230; Et bonne chance pour la prochaine attaque! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f44b.png" alt="👋" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f916.png" alt="🤖" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/">Attaques de robots: vous n&rsquo;êtes pas seul&#8230;</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-related-none yarpp-template-list'>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5179</post-id>	</item>
		<item>
		<title>Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</title>
		<link>https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/</link>
					<comments>https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Sun, 28 Jun 2020 17:07:44 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[flagger]]></category>
		<category><![CDATA[grafana]]></category>
		<category><![CDATA[helm]]></category>
		<category><![CDATA[istio]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5137</guid>

					<description><![CDATA[<p>&#160;English version available Mise à jour 17 Octobre 2020 : Utilisation de versions plus récentes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article est le troisième de la série consacrée à Flagger. En bref, Flagger est un outil de livraison progressive qui automatise le processus de livraison des applications s&#8217;exécutant sur Kubernetes. Il [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/">Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="bookmark" title="Flagger &#8211; Déploiements Canary sur Kubernetes">Flagger &#8211; Déploiements Canary sur Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" rel="bookmark" title="Flagger &#8211; Premiers pas avec Istio et Kubernetes">Flagger &#8211; Premiers pas avec Istio et Kubernetes</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Mise à jour</strong><br />
<strong>17 Octobre 2020 : </strong> Utilisation de versions plus récentes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2).
</div>
<p class="left" style="padding-right:15px;"><a href="https://flagger.app/" target="_blank" title="Logo Flagger" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Logo Flagger" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/flagger-logo.png?resize=180%2C180&#038;ssl=1" alt="Logo Flagger" width="180" height="180" /></a></p>
<p>Cet article est le troisième de la série consacrée à <a href="https://flagger.app/" target="_blank" title="Flagger" rel="noopener noreferrer">Flagger</a>. En bref, Flagger est un outil de livraison progressive qui automatise le processus de livraison des applications s&rsquo;exécutant sur Kubernetes. Il réduit le risque d&rsquo;introduire une nouvelle version logicielle en production en augmentant progressivement le trafic vers la nouvelle version tout en mesurant les métriques et en exécutant des tests de conformité.</p>
<p>Assurez-vous d&rsquo;avoir un cluster Kubernetes avec le service mesh Istio qui tourne sur votre machine en local. Sinon, lisez <a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" title="Flagger – Premiers pas avec Istio et Kubernetes">le premier article: Flagger – Premiers pas avec Istio et Kubernetes</a>. Vous devez également vous familiariser avec Flagger et MHS, vous trouverez tous les détails dans <a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" title="Flagger – Déploiements Canary sur Kubernetes">le second article: Flagger – Déploiements Canary sur Kubernetes</a>.</p>
<p>Dans ce troisième tutoriel, nous nous concentrerons sur l&rsquo;installation de Grafana pour Flagger et sur la façon dont vous pouvez surveiller vos déploiements Canary sans avoir à utiliser Kubernetes (c&rsquo;est-à-dire en vous passant du Kube dashboard ou l&rsquo;outil de ligne de commande <code>kubectl</code>).</p>
<div class="info"><strong class="label">Remarque</strong><br />
Ce guide est un « hands-on » et peut être suivi pas à pas par les utilisateurs sous MacOS. Il nécessitera quelques ajustements si vous utilisez un PC sous Windows ou Linux. Il est important de signaler que cet article ne s&rsquo;attardera pas sur les concepts et technologies en détail donc si vous n&rsquo;êtes pas familier avec Docker, Kubernetes, Helm ou Istio, je vous conseille fortement de vous documenter avant de poursuivre votre lecture.
</div>
<p><br clear="none" /></p>
<h4>Installation de Grafana</h4>
<p>Flagger fournit un tableau de bord Grafana prêt à l&#8217;emploi pour monitorer tous les déploiements Canary dans votre cluster.</p>
<p>Installons Grafana en exécutant cette commande. Nous installons Grafana dans le namespace <code>istio-system</code>.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> upgrade -i flagger-grafana flagger/grafana \<br />--namespace=istio-system \<br />--set url=http://prometheus:9090 \<br />--set user=admin \<br />--set password=changeme<br /></div>

<blockquote><p>
Référence: <a href="https://docs.flagger.app/usage/monitoring" target="_blank" title="Monitorer Flagger" rel="noopener noreferrer">Monitorer Flagger</a><br />
Flagger dépend des métriques fournies par Istio et de Prometheus (dans notre cas, nous supposons qu&rsquo;Istio est installé dans le namespace <code>istio-system</code>).
</p></blockquote>
<p>Après quelques secondes, vous devriez recevoir une confirmation que Grafana pour Flagger a bien été installé. Depuis le Kube dashboard, vérifiez que le pod Flagger Grafana est présent et a démarré dans <code>istio-system</code>.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/flagger-grafana-deployed-new.png?ssl=1" rel="shadowbox[sbpost-5137];player=img;" title="Grafana pour Flagger est déployé dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/flagger-grafana-deployed-new-thumbnail.png?resize=550%2C315&#038;ssl=1" alt="Grafana pour Flagger est déployé dans votre cluster" title="Grafana pour Flagger est déployé dans votre cluster" width="550" height="315" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Grafana pour Flagger est déployé dans votre cluster</p></div>
<p>Pour exposer Grafana, exécutez:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> -n istio-system port-forward svc/flagger-grafana 3000:80<br /></div>

<p>Vous pouvez ainsi y accéder avec votre navigateur à l&rsquo;adresse <a href="http://localhost:3000/d/flagger-istio/istio-canary" target="_blank" title="Grafana Dashboard" rel="noopener noreferrer">http://localhost:3000/d/flagger-istio/istio-canary</a>. Utilisez l&rsquo;identifiant et le mot de passe que vous avez spécifiés auparavant (<code>admin</code> / <code>changeme</code>).</p>
<blockquote><p>
Notez que, lorsque nous utilisons Istio, nous utilisons le tableau de bord Istio Canary. Il existe d&rsquo;autres tableaux de bord disponibles car Flagger est compatible avec d&rsquo;autres service mesh.
</p></blockquote>
<p><br clear="none" /></p>
<h4>Exécution de déploiements Canary</h4>
<p>Si vous avez suivi l&rsquo;article précédent, assurez-vous de sélectionner <code>application</code> pour Namespace et d&rsquo;associer <code>mhs-primary</code> à Primary et <code>mhs</code> à Canary.</p>
<p>Ensuite, réessayez <a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" title="Flagger - Canary deployments on Kubernetes">les différentes expériences que nous avions réalisées dans l&rsquo;article précédent</a> et surveiller le tableau de bord Grafana en même temps, en particulier:</p>
<ul>
<li>Expérience 1 – Déploiement réussi de MHS v1.1.2</li>
<li>Expérience 2 – Déploiement en échec de MHS version v1.1.3</li>
</ul>
<p><br clear="none" /></p>
<h4>Résultats</h4>
<p>Jetez un oeil à cette capture d&rsquo;écran que j&rsquo;ai prise lors de l&rsquo;expérience 1 lorsque le déploiement Canary s&rsquo;est bien déroulé et que la nouvelle version a été déployée. J&rsquo;ai annoté et ajouté des explications à la capture, il est donc plus facile de comprendre les graphiques.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/canary-success-fr.png?ssl=1" rel="shadowbox[sbpost-5137];player=img;" title="Un déploiement Canary réussi"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/canary-success-fr-thumbnail.png?resize=550%2C701&#038;ssl=1" alt="Un déploiement Canary réussi" title="Un déploiement Canary réussi" width="550" height="701" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Un déploiement Canary réussi</p></div>
<p>Et voici une capture d&rsquo;écran similaire pour l&rsquo;expérience 2 lorsque le déploiement Canary n&rsquo;a pas réussi et que la nouvelle version n&rsquo;a pas été déployée.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/canary-fail-fr.png?ssl=1" rel="shadowbox[sbpost-5137];player=img;" title="Un déploiement Canary non réussi"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00097/canary-fail-fr-thumbnail.png?resize=550%2C714&#038;ssl=1" alt="Un déploiement Canary non réussi" title="Un déploiement Canary non réussi" width="550" height="714" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Un déploiement Canary non réussi</p></div>
<p>Félicitations, vous êtes arrivé à la fin de ce troisième tutoriel!</p>
<p><br clear="none" /></p>
<h4>Nettoyage des ressources</h4>
<p>Vous pouvez supprimer l&rsquo;application MHS et son namespace. Nous pouvons aussi supprimer Istio et Flagger car c&rsquo;est le dernier article de cette série.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> delete mhs --namespace application<br /></div>


<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces application<br /></div>


<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> delete flagger --namespace flagger-system<br /></div>


<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces flagger-system<br /></div>


<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/prometheus.yaml<br /></div>


<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">istioctl</span> manifest generate --set profile=demo <span class="wp-shkshell-special">|</span> <span class="wp-shkshell-command">kubectl</span> delete -f -<br /></div>


<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces istio-system<br /></div>

<p>Vous pouvez aussi arrêter le cluster Kubernetes en décochant la case et redémarrant Docker Desktop.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/">Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="bookmark" title="Flagger &#8211; Déploiements Canary sur Kubernetes">Flagger &#8211; Déploiements Canary sur Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" rel="bookmark" title="Flagger &#8211; Premiers pas avec Istio et Kubernetes">Flagger &#8211; Premiers pas avec Istio et Kubernetes</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5137</post-id>	</item>
		<item>
		<title>Flagger &#8211; Déploiements Canary sur Kubernetes</title>
		<link>https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/</link>
					<comments>https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Tue, 19 May 2020 18:56:08 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[flagger]]></category>
		<category><![CDATA[helm]]></category>
		<category><![CDATA[istio]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5131</guid>

					<description><![CDATA[<p>&#160;English version available Mise à jour 17 Octobre 2020 : Utilisation de versions plus récentes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article est le deuxième de la série consacrée à Flagger. En bref, Flagger est un outil de livraison progressive qui automatise le processus de livraison des applications s&#8217;exécutant sur Kubernetes. Il [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/">Flagger &#8211; Déploiements Canary sur Kubernetes</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" rel="bookmark" title="Flagger &#8211; Premiers pas avec Istio et Kubernetes">Flagger &#8211; Premiers pas avec Istio et Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/" rel="bookmark" title="Flagger &#8211; Monitorer vos déploiements Canary avec Grafana">Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2020/05/19/flagger-canary-deployments-on-kubernetes/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Mise à jour</strong><br />
<strong>17 Octobre 2020 : </strong> Utilisation de versions plus récentes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2).
</div>
<p class="right" style="padding-left:15px;"><a href="https://flagger.app/" target="_blank" title="Logo Flagger" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Logo Flagger" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/flagger-logo.png?resize=180%2C180&#038;ssl=1" alt="Logo Flagger" width="180" height="180" /></a></p>
<p>Cet article est le deuxième de la série consacrée à <a href="https://flagger.app/" target="_blank" title="Flagger" rel="noopener noreferrer">Flagger</a>. En bref, Flagger est un outil de livraison progressive qui automatise le processus de livraison des applications s&rsquo;exécutant sur Kubernetes. Il réduit le risque d&rsquo;introduire une nouvelle version logicielle en production en augmentant progressivement le trafic vers la nouvelle version tout en mesurant les métriques et en exécutant des tests de conformité.</p>
<p>Assurez-vous d&rsquo;avoir un cluster Kubernetes avec le service mesh Istio qui tourne sur votre machine en local. Sinon, lisez <a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" title="Flagger – Premiers pas avec Istio et Kubernetes">le premier article: Flagger – Premiers pas avec Istio et Kubernetes</a>.</p>
<p>Dans ce deuxième tutoriel, nous nous concentrerons sur l&rsquo;installation de Flagger et lancerons plusieurs déploiements canary de l&rsquo;application <a href="https://github.com/eexit/mirror-http-server" target="_blank" title="Mirror HTTP Server" rel="noopener noreferrer">Mirror HTTP Server</a> (MHS). N&rsquo;oubliez pas que cette application très simple peut simuler des réponses valides ou invalides en fonction de la requête en entrée. C&rsquo;est exactement ce dont nous avons besoin pour tester les capacités de Flagger. Nous couvrirons à la fois les scénarios type « happy path » (rollout) et « unhappy path » (rollback).</p>
<div class="info"><strong class="label">Remarque</strong><br />
Ce guide est un « hands-on » et peut être suivi pas à pas par les utilisateurs sous MacOS. Il nécessitera quelques ajustements si vous utilisez un PC sous Windows ou Linux. Il est important de signaler que cet article ne s&rsquo;attardera pas sur les concepts et technologies en détail donc si vous n&rsquo;êtes pas familier avec Docker, Kubernetes, Helm ou Istio, je vous conseille fortement de vous documenter avant de poursuivre votre lecture.
</div>
<p><br clear="none" /></p>
<h4>Installation de Flagger</h4>
<p>Installons Flagger en exécutant ces commandes.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> create ns flagger-system<br /></div>

<p>Nous installons Flagger dans son propre namespace <code>flagger-system</code>.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> repo add flagger https://flagger.app<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> apply -f https://raw.githubusercontent.com/weaveworks/flagger/master/artifacts/flagger/crd.yaml<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> upgrade -i flagger flagger/flagger \<br />--namespace=flagger-system \<br />--set crd.create=false \<br />--set meshProvider=istio \<br />--set metricsServer=http://prometheus.istio-system:9090<br /></div>

<blockquote><p>
Référence: <a href="https://docs.flagger.app/install/flagger-install-on-kubernetes" target="_blank" title="Installation de Flagger sur Kubernetes" rel="noopener noreferrer">Installation de Flagger sur Kubernetes</a><br />
Flagger dépend des métriques fournies par Istio et de Prometheus (dans notre cas, nous supposons qu&rsquo;Istio est installé dans le namespace <code>istio-system</code>).<br />
Tous les paramètres d&rsquo;installation sont disponibles dans <a href="https://github.com/fluxcd/flagger/blob/main/charts/flagger/README.md" target="_blank" title="Fichier readme de Flagger sur GitHub" rel="noopener noreferrer">le fichier readme de Flagger sur GitHub</a>.<br />
Nous ne spécifions pas le numéro de version, ce qui signifie que l&rsquo;on utilisera la dernière version disponible dans le repository (<code>1.2.0</code> lorsque j&rsquo;écris cet article).
</p></blockquote>
<p>Après quelques secondes, vous devriez recevoir un message confirmant que Flagger a été installé. Depuis le Kube dashboard, vérifiez qu&rsquo;un nouveau namespace <code>flagger-system</code> a bien été créé et que le pod Flagger est en cours d&rsquo;exécution.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/flagger-deployed-new.png?ssl=1" rel="shadowbox[sbpost-5131];player=img;" title="Flagger est déployé dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/flagger-deployed-new-thumbnail.png?resize=550%2C316&#038;ssl=1" alt="Flagger est déployé dans votre cluster" title="Flagger est déployé dans votre cluster" width="550" height="316" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Flagger est déployé dans votre cluster</p></div>
<p><br clear="none" /></p>
<h4>Expérience 0 &#8211; Initialisation avec le déploiement canary de MHS v1.1.1</h4>
<p>Mirror HTTP Server est <a href="https://hub.docker.com/r/eexit/mirror-http-server/tags" target="_blank" title="Tags MHS" rel="noopener noreferrer">disponible en plusieurs versions</a>. Pour tester la fonctionnalité de déploiement canary de Flagger, nous basculerons entre la version <code>1.1.1</code>, <code>1.1.2</code> et <code>1.1.3</code> de MHS (la dernière version lorsque j&rsquo;écris cet article).</p>
<p>Avant de déployer MHS, créons un nouveau namespace <code>application</code>, nous ne voulons pas utiliser celui par défaut à la racine du cluster (c&rsquo;est une bonne pratique). Le nom est un peu trop générique, mais suffisant pour ce tutoriel, en général vous utiliserez le nom de l&rsquo;équipe ou le nom d&rsquo;un regroupement de fonctionnalités.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> create ns application<br /></div>

<p>N&rsquo;oublions pas d&rsquo;activer Istio sur ce nouveau namespace:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> label namespace application istio-injection=enabled<br /></div>

<p>Pour déployer MHS via Flagger, j&rsquo;ai créé un <a href="https://helm.sh/docs/topics/charts/" target="_blank" title="Helm Chart" rel="noopener noreferrer">Helm chart</a>.</p>
<p><a href="https://github.com/fabianpiau/mhs-canary-chart" target="_blank" title="MHS Canary Helm Chart" rel="noopener noreferrer">Ce chart de « type canary »</a> a été créé en se basant sur <a href="https://github.com/fabianpiau/mhs-chart" target="_blank" title="MHS Helm Chart" rel="noopener noreferrer">le chart précédent sans Flagger</a> qui lui-même avait été créé avec la commande <code>helm create mhs-chart</code>, puis adapté. Dans ce chart de « type canary », j&rsquo;ai fait quelques ajustements supplémentaires <a href="https://github.com/fabianpiau/mhs-canary-chart/commit/8947788253a1b02e91eaca6ed46d5f89d5b6dc5e" target="_blank" title="Premier commit" rel="noopener noreferrer">pour utiliser 2 répliquas au lieu de 1 pour rendre le déploiement plus réaliste et utiliser la version <code>1.1.1</code></a>, j&rsquo;ai également <a href="https://github.com/fabianpiau/mhs-canary-chart/commit/e92d8fcc3fa1257bd02370eaae17dcc9fde76378" target="_blank" title="Second commit" rel="noopener noreferrer">ajouté la ressource canary</a> où la magie opère.</p>
<p>Clonez le repo contenant le chart:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">git</span> clone https://github.com/fabianpiau/mhs-canary-chart.git<br /></div>

<p>Et installez MHS:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">cd</span> mhs-canary-chart<br />helm install --name mhs --namespace application ./mhs<br /></div>

<p>Après quelques instants, si vous regardez le tableau de bord, vous devriez voir 2 répliquas de MHS dans le namespace <code>application</code>.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/mhs-1.1.1-deployed-new.png?ssl=1" rel="shadowbox[sbpost-5131];player=img;" title="MHS 1.1.1 est déployé dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/mhs-1.1.1-deployed-new-thumbnail.png?resize=550%2C315&#038;ssl=1" alt="MHS 1.1.1 est déployé dans votre cluster" title="MHS 1.1.1 est déployé dans votre cluster" width="550" height="315" class="size-medium wp-image-257" /></a><p class="wp-caption-text">MHS 1.1.1 est déployé dans votre cluster</p></div>
<blockquote><p>
Il est important de noter qu&rsquo;aucune analyse canary n&rsquo;a été effectuée et que la version a été automatiquement promue. Ce n&rsquo;était pas un « vrai » déploiement canary.<br />
Pourquoi? Parce que Flagger a besoin de s&rsquo;initialiser la première fois que nous faisons un déploiement canary de l&rsquo;application. Assurez-vous donc que la version que vous déployez avec Flagger la première fois est entièrement testée et fonctionne bien!<br />
Vous pouvez également penser que cette promotion automatique s&rsquo;est produite, car il n&rsquo;y avait pas de version initiale de l&rsquo;application dans le cluster. Bien que ce soit évidemment une bonne raison, il est important de noter que, même si nous avions une version précédente auparavant (par exemple <code>1.1.0</code>), la version canary <code>1.1.1</code> aurait aussi été automatiquement promue sans analyse.
</p></blockquote>
<p>Vous pouvez quand même consulter les événements canary avec:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> -n application describe canary/mhs<br /></div>

<p>Vous devriez avoir une sortie similaire sans analyse canary:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">Events</span>:<br />Type     Reason  Age                  From     Message<br />----     ------  ----                 ----     -------<br />Warning  Synced  2m29s                flagger  mhs-primary.application not ready: waiting for rollout to finish: observed deployment generation less then desired generation<br />Normal   Synced  92s (x2 over 2m30s)  flagger  all the metrics providers are available!<br />Normal   Synced  92s                  flagger  Initialization done! mhs.application<br /></div>

<p>Ou vous pouvez également consulter directement les logs de Flagger:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">export</span> FLAGGER_POD_NAME=$(<span class="wp-shkshell-command">kubectl</span> get pods --namespace flagger-system -l <span class="wp-shkshell-string">"app.kubernetes.io/name=flagger,app.kubernetes.io/instance=flagger"</span> -o jsonpath="{.items[<span class="wp-shkshell-command">0</span>].metadata.name}")<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> -n flagger-system logs <span class="wp-shkshell-variable">$FLAGGER_POD_NAME</span><br /></div>

<p>Si vous regardez de plus près le tableau de bord Kube, vous devriez voir plusieurs ressources <code>mhs</code> et <code>mhs-primary</code>:</p>
<ul>
<li><code>mhs-primary</code> sont les instances principales (c.-à-d. non canary). Flagger ajoute automatiquement le suffixe <code>-primary</code> pour les différencier des instances canary.</li>
<li><code>mhs</code> sont les instances canary. Elles n&rsquo;existent que pendant le déploiement et disparaîtront une fois le déploiement canary terminé. C&rsquo;est pourquoi, dans la capture d&rsquo;écran ci-dessus, vous ne voyez pas de pod <code>mhs</code> canary (c.-à-d. 0/0 pod).</li>
</ul>
<blockquote><p>
Pourquoi cette convention de nommage? J&rsquo;ai demandé directement à l&rsquo;équipe de Flagger et il y a <a href="https://github.com/fluxcd/flagger/issues/522" title="Use of a -canary suffix for the canary pods instead of a -primary suffix on the normal pods" target="_blank" rel="noopener noreferrer">une contrainte technique</a>.
</p></blockquote>
<p>Flagger est maintenant correctement initialisé et MHS est déployé sur votre cluster. Vous pouvez utiliser le terminal pour confirmer que MHS est accessible (grâce à la <a href="https://github.com/fabianpiau/mhs-canary-chart/blob/master/mhs/templates/gateway.yaml" title="Istio Gateway for MHS" target="_blank" rel="noopener noreferrer">Passerelle Istio</a>):</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -I -H Host:mhs.example.com <span class="wp-shkshell-string">'http://localhost'</span><br /></div>

<p>Vous devriez recevoir une réponse HTTP 200 OK:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">HTTP</span>/1.1 200 OK<br />x-powered-by: Express<br />date: Sun, 17 May 2020 16:47:33 GMT<br />x-envoy-upstream-service-time: 10<br />server: istio-envoy<br />transfer-encoding: chunked<br /></div>

<p>Et:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -I -H Host:mhs.example.com -H X-Mirror-Code:500 <span class="wp-shkshell-string">'http://localhost'</span><br /></div>

<p>devrait retourner une réponse HTTP 500:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">HTTP</span>/1.1 500 Internal Server Error<br />x-powered-by: Express<br />date: Sun, 17 May 2020 16:48:09 GMT<br />x-envoy-upstream-service-time: 12<br />server: istio-envoy<br />transfer-encoding: chunked<br /></div>

<p><br clear="none" /></p>
<h4>Expérience 1 &#8211; Déploiement canary de MHS v1.1.2</h4>
<p>Nous allons installer une version plus récente <code>1.1.2</code>. Vous devez éditer manuellement le fichier <code>mhs-canary-chart/mhs/values.yaml</code> et remplacer <code>tag: 1.1.1</code> par <code>tag: 1.1.2</code> (<a href="https://github.com/fabianpiau/mhs-canary-chart/blob/master/mhs/values.yaml#L9" target="_blank" title="Ligne à mettre à jour" rel="noopener noreferrer">cette ligne</a>).</p>
<p>Ensuite:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">cd</span> mhs-canary-chart<br />helm upgrade mhs --namespace application ./mhs<br /></div>

<p>Alors que le déploiement canary est en cours, il est très important de générer du trafic vers MHS. Sans trafic, Flagger considérera que quelque chose s&rsquo;est mal passé avec la nouvelle version et fera un rollback automatique pour retourner à la précédente version. Evidemment, vous n&rsquo;aurez pas besoin de cette étape supplémentaire dans un environnement de production qui reçoit en permanence du trafic réel.</p>
<p>Exécutez cette commande dans un autre terminal pour générer ce trafic artificiel:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">while</span> (true)<span class="wp-shkshell-special">;</span> <span class="wp-shkshell-command">do</span> curl -I -H Host:mhs.example.com <span class="wp-shkshell-string">'http://localhost'</span> <span class="wp-shkshell-special">;</span> <span class="wp-shkshell-command">sleep</span> 0.5 <span class="wp-shkshell-special">;</span> <span class="wp-shkshell-command">done</span><br /></div>

<p>Vérifiez le Kube dashboard, vous devriez voir le pod canary avec la nouvelle version <code>1.1.2</code> à un moment donné:</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/mhs-1.1.2-canary-deployment-in-progress-new.png?ssl=1" rel="shadowbox[sbpost-5131];player=img;" title="MHS 1.1.2 en cours de déploiement canary dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/mhs-1.1.2-canary-deployment-in-progress-new-thumbnail.png?resize=550%2C315&#038;ssl=1" alt="MHS 1.1.2 en cours de déploiement canary dans votre cluster" title="MHS 1.1.2 en cours de déploiement canary dans votre cluster" width="550" height="315" class="size-medium wp-image-257" /></a><p class="wp-caption-text">MHS 1.1.2 en cours de déploiement canary dans votre cluster</p></div>
<p>Vérifiez les événements canary avec la même commande que précédemment:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> -n application describe canary/mhs<br /></div>

<p>Après un certain temps (environ 6 minutes), vous devriez avoir une sortie d&rsquo;événements similaire:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">Events</span>:<br />Type     Reason  Age                From     Message<br />----     ------  ----               ----     -------<br />Warning  Synced  30m                flagger  mhs-primary.application not ready: waiting for rollout to finish: observed deployment generation less then desired generation<br />Normal   Synced  29m (x2 over 30m)  flagger  all the metrics providers are available!<br />Normal   Synced  29m                flagger  Initialization done! mhs.application<br />Normal   Synced  10m                flagger  New revision detected! Scaling up mhs.application<br />Normal   Synced  9m16s              flagger  Starting canary analysis for mhs.application<br />Normal   Synced  9m16s              flagger  Advance mhs.application canary weight 10<br />Normal   Synced  8m16s              flagger  Advance mhs.application canary weight 20<br />Normal   Synced  7m16s              flagger  Advance mhs.application canary weight 30<br />Normal   Synced  6m16s              flagger  Advance mhs.application canary weight 40<br />Normal   Synced  5m16s              flagger  Advance mhs.application canary weight 50<br />Normal   Synced  4m16s              flagger  Copying mhs.application template spec to mhs-primary.application<br />Normal   Synced  3m16s              flagger  Routing all traffic to primary<br />Normal   Synced  2m16s              flagger  (combined from similar events): Promotion completed! Scaling down mhs.application<br /></div>

<p>La livraison canary s&rsquo;est déroulée avec succès. Vous avez maintenant la version <code>1.1.2</code> installée sur tous les pods primary et le pod canary a été supprimé.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/mhs-1.1.2-deployed-new.png?ssl=1" rel="shadowbox[sbpost-5131];player=img;" title="MHS 1.1.2 est déployé dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00096/mhs-1.1.2-deployed-new-thumbnail.png?resize=550%2C315&#038;ssl=1" alt="MHS 1.1.2 est déployé dans votre cluster" title="MHS 1.1.2 est déployé dans votre cluster" width="550" height="315" class="size-medium wp-image-257" /></a><p class="wp-caption-text">MHS 1.1.2 est déployé dans votre cluster</p></div>
<blockquote><p>
Pourquoi ce déploiement a-t-il duré environ 6 minutes? Parce qu&rsquo;il inclut une analyse canary de 5 minutes. Au cours de cette analyse, le trafic a été augmenté de manière progressive vers le pod canary. Le trafic canary a augmenté de 10% toutes les 1 minute jusqu&rsquo;à atteindre 50% du trafic global. L&rsquo;analyse est configurable et définie dans le <a href="https://github.com/fabianpiau/mhs-canary-chart/blob/master/mhs/templates/canary.yaml" target="_blank" title="Ressource canary" rel="noopener noreferrer">fichier canary.yaml</a> qui a été ajouté au chart.
</p></blockquote>
<p>Voici la configuration de l&rsquo;analyse:</p>
<pre class="brush: yaml; title: ; notranslate">
  analysis:
    # intervalle entre chaque incrémentation de trafic et prises des mesures
    interval: 1m
    # pourcentage de trafic max routé vers le canary - pourcentage (0-100)
    maxWeight: 50
    # pas d'incrément canary - pourcentage (0-100)
    stepWeight: 10
    # nombre maximum d'échecs de vérification des métriques avant un rollback (global pour toutes les prises de mesures)
    threshold: 5
    metrics:
      - name: request-success-rate
        # pourcentage avant que le taux de réussite soit considéré comme ayant échoué (0-100)
        thresholdRange:
          min: 99
        # intervalle entre chaque prise de mesure de la métrique taux de réussite
        interval: 30s
      - name: request-duration
        # durée maximale P99 en millisecondes avant que le temps de réponse soit considéré comme ayant échoué
        thresholdRange:
          max: 500
        # intervalle entre chaque prise de mesure de la métrique temps de réponse
        interval: 30s
</pre>
<blockquote><p>
Notre analyse canary utilise les 2 métriques de base fournies par Istio / Prometheus (taux de réussite + temps de réponse). Il est possible de définir vos propres métriques personnalisées. Dans ce cas, elles devront être fournies par votre application. Votre application devra exposer un endpoint Prometheus qui inclura vos métriques personnalisées. Et vous pourrez <a href="https://docs.flagger.app/usage/metrics#prometheus" target="_blank" title="Métriques personnalisées dans l'analyse canary" rel="noopener noreferrer">mettre à jour la configuration de l&rsquo;analyse de Flagger pour les utiliser avec votre propre requête PromQL</a>. Notez que cela va au-delà de ce guide qui utilise uniquement les métriques de base.
</p></blockquote>
<p><br clear="none" /></p>
<h4>Expérience 2 &#8211; Déploiement canary  de MHS version v1.1.3</h4>
<p>Encore une fois, vous devez éditer manuellement le fichier <code>mhs-canary-chart/mhs/values.yaml</code> et remplacer la ligne <code>tag: 1.1.2</code> par <code>tag: 1.1.3</code>.</p>
<p>Ensuite:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">cd</span> mhs-canary-chart<br />helm upgrade mhs --namespace application ./mhs<br /></div>

<p>Nous générons du trafic artificiel:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">while</span> (true)<span class="wp-shkshell-special">;</span> <span class="wp-shkshell-command">do</span> curl -I -H Host:mhs.example.com <span class="wp-shkshell-string">'http://localhost'</span> <span class="wp-shkshell-special">;</span>  curl -I -H Host:mhs.example.com -H X-Mirror-Code:500 <span class="wp-shkshell-string">'http://localhost'</span> <span class="wp-shkshell-special">;</span> <span class="wp-shkshell-command">sleep</span> 0.5 <span class="wp-shkshell-special">;</span> <span class="wp-shkshell-command">done</span><br /></div>

<blockquote><p>
Cette fois, nous générons également du trafic non valide pour nous assurer que le taux de réussite des requêtes diminue!
</p></blockquote>
<p>Vérifiez les événements canary avec la même commande que précédemment:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> -n application describe canary/mhs<br /></div>

<p>Après un certain temps (environ 6 minutes), vous devriez avoir une sortie d&rsquo;événements similaire:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">Normal</span>   Synced  8m23s (x2 over 20m)  flagger  New revision detected! Scaling up mhs.application<br />Normal   Synced  7m23s (x2 over 19m)  flagger  Advance mhs.application canary weight 10<br />Normal   Synced  7m23s (x2 over 19m)  flagger  Starting canary analysis for mhs.application<br />Warning  Synced  6m23s                flagger  Halt mhs.application advancement success rate 57.14% <span class="wp-shkshell-special"><</span> 99%<br />Warning  Synced  5m24s                flagger  Halt mhs.application advancement success rate 0.00% <span class="wp-shkshell-special"><</span> 99%<br />Warning  Synced  3m24s                flagger  Halt mhs.application advancement success rate 71.43% <span class="wp-shkshell-special"><</span> 99%<br />Warning  Synced  2m24s                flagger  Halt mhs.application advancement success rate 50.00% <span class="wp-shkshell-special"><</span> 99%<br />Warning  Synced  84s                  flagger  Halt mhs.application advancement success rate 63.64% <span class="wp-shkshell-special"><</span> 99%<br />Warning  Synced  24s                  flagger  Rolling back mhs.application failed checks threshold reached 5<br />Warning  Synced  24s                  flagger  Canary failed! Scaling down mhs.application<br /></div>

<p>Et vous êtes toujours sur la version <code>1.1.2</code>.</p>
<blockquote><p>
Flagger a décidé de stopper et ne pas propager la version <code>1.1.3</code> car il n&rsquo;a pas pu effectuer une analyse canary réussie et le seuil d&rsquo;erreur a était atteint, 5 fois (en effet, à chaque fois, environ 50% des requêtes se sont terminées par une réponse HTTP 500). Flagger a simplement redirigé tout le trafic vers les instances primary et supprimé le pod canary.
</p></blockquote>
<p>Félicitations, vous êtes arrivé à la fin de ce deuxième tutoriel!</p>
<p><br clear="none" /></p>
<h4>Observations</h4>
<p>Avant de faire du nettoyage dans notre cluster, terminons par une liste d&rsquo;observations:</p>
<ul>
<li>La suppression d&rsquo;un déploiement supprimera tous les pods (canary / primary). Et nous ne nous retrouvons pas avec des ressources orphelines.</li>
<li>Prometheus est un prérequis. Sans lui, l&rsquo;analyse canary ne fonctionnera pas.</li>
<li>Il n&rsquo;est pas possible de relancer un déploiement canary sur la même version s&rsquo;il vient d&rsquo;échouer. Cela vous oblige à changer et incrémenter la version (même s&rsquo;il s&rsquo;agissait d&rsquo;un problème de configuration et non d&rsquo;un problème de code).</li>
<li>Le processus de désactivation de Flagger n&rsquo;est pas aussi simple que de supprimer la ressource canary du chart et de déployer une nouvelle version. Si vous supprimez la ressource canary, Flagger ne déclenchera pas le processus canary, il changera la version dans <code>mhs</code> et supprimera <code>mhs-primary</code> mais, <code>mhs</code> a 0 pod, ce qui rendra votre service indisponible! Vous devez être prudent et adopter un processus de désactivation manuelle approprié. Récement, l&rsquo;équipe Flagger a ajouté une propriété <code>revertOnDeletion</code> que vous pouvez activer pour pallier à ce problème. Vous pouvez vous référer à la doc pour <a href="https://docs.flagger.app/usage/how-it-works#canary-finalizers" target="_blank" title="Flagger canary finalizer" rel="noopener noreferrer">plus de détail sur ce canary finalizer</a>.</li>
<li>Après plusieurs déploiements, il semble que certains événements peuvent manquer, la commande Kubernetes <code>describe</code> les accumule (<code>x&lt;int&gt; over &lt;int&gt;m</code>) et parfois, l&rsquo;ordre n&rsquo;est pas conservé et/ou certains événements ne s&rsquo;affichent pas. Vous pouvez consulter le statut Flagger concernant la phase du canary (les états finis sont <code>Initialized</code>, <code>Succeeded</code> ou <code>Failed</code>). Le mieux est de regarder directement les logs sur le pod Flagger, car elles sont toujours plus précises et complètes.</li>
<li>L&rsquo;analyse canary doit être configurée pour s&rsquo;exécuter sur une courte période (c.-à-d. pas plus de 30 minutes) pour tirer profit d&rsquo;un véritable déploiement continu et éviter de publier une nouvelle version alors qu&rsquo;un déploiement canary pour la précédente est toujours en cours. Dans le cas où vous souhaitez tester une version canary sur plusieurs heures ou même jours, vous devriez peut-être repenser votre cas d&rsquo;utilisation et Flagger pourrait ne pas être le meilleur choix.</li>
<li>Nous l&rsquo;avons déjà mentionné, mais c&rsquo;est important: la première fois que vous déployez avec Flagger (comme avec l&rsquo;expérience 0), l&rsquo;outil doit s&rsquo;initialiser (statut <code>Initialized</code>) et n&rsquo;effectuera aucune analyse.</li>
</ul>
<p><br clear="none" /></p>
<h4>Nettoyage des ressources</h4>
<p>Vous pouvez supprimer l&rsquo;application MHS et son namespace.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> delete mhs --namespace application<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces application<br /></div>

<p>Nous vous recommandons de laisser Flagger et Istio en place pour gagner du temps dans le prochain tutoriel. Si toutefois vous souhaitez tout supprimer maintenant, vous pouvez exécuter les commandes suivantes.</p>
<p>Supprimer Flagger:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> delete flagger --namespace flagger-system<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces flagger-system<br /></div>

<p>Supprimer Istio et Prometheus:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/prometheus.yaml<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">istioctl</span> manifest generate --set profile=demo <span class="wp-shkshell-special">|</span> <span class="wp-shkshell-command">kubectl</span> delete -f -<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces istio-system<br /></div>

<p><br clear="none" /></p>
<h4>Et après?</h4>
<p>Le <a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/" title="Flagger – Monitorer vos déploiements Canary avec Grafana">prochain article</a> se concentrera sur le <a href="https://grafana.com/" target="_blank" title="Site de Grafana" rel="noopener noreferrer">Tableau de bord Grafana</a> fourni prêt à l&#8217;emploi par Flagger qui est un ajout intéressant. Il vous fera gagner du temps, car vous n&rsquo;aurez pas besoin d&rsquo;exécuter manuellement des commandes <code>kuberctl</code> pour vérifier le résultat de vos déploiements canary. Stay tuned! En attendant, vous pouvez arrêter le cluster Kubernetes en décochant la case et redémarrant Docker Desktop. Votre ordinateur peut prendre une pause bien méritée.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/">Flagger &#8211; Déploiements Canary sur Kubernetes</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" rel="bookmark" title="Flagger &#8211; Premiers pas avec Istio et Kubernetes">Flagger &#8211; Premiers pas avec Istio et Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/" rel="bookmark" title="Flagger &#8211; Monitorer vos déploiements Canary avec Grafana">Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5131</post-id>	</item>
		<item>
		<title>Flagger &#8211; Premiers pas avec Istio et Kubernetes</title>
		<link>https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/</link>
					<comments>https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Sat, 02 May 2020 17:40:37 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[flagger]]></category>
		<category><![CDATA[helm]]></category>
		<category><![CDATA[istio]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5125</guid>

					<description><![CDATA[<p>&#160;English version available Mise à jour 17 Octobre 2020 : Utilisation de versions plus récentes (Helm 3, Kube 18, Istio 1.7). Cette série d&#8217;articles est consacrée à Flagger, un outil qui s&#8217;intègre à l&#8217;écosystème de la plateforme d&#8217;orchestration de container Kubernetes pour faire des déploiements automatisés et sera un pas de plus en direction d&#8217;un [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/">Flagger &#8211; Premiers pas avec Istio et Kubernetes</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="bookmark" title="Flagger &#8211; Déploiements Canary sur Kubernetes">Flagger &#8211; Déploiements Canary sur Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/" rel="bookmark" title="Flagger &#8211; Monitorer vos déploiements Canary avec Grafana">Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/09/17/choose-the-web-hosting-service-that-fits-your-needs/" rel="bookmark" title="Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins">Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2020/05/02/flagger-get-started-with-istio-and-kubernetes/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Mise à jour</strong><br />
<strong>17 Octobre 2020 : </strong> Utilisation de versions plus récentes (Helm 3, Kube 18, Istio 1.7).
</div>
<p>Cette série d&rsquo;articles est consacrée à <a href="https://flagger.app/" target="_blank" title="Flagger" rel="noopener noreferrer">Flagger</a>, un outil qui s&rsquo;intègre à l&rsquo;écosystème de la plateforme d&rsquo;orchestration de container <a href="https://kubernetes.io/" target="_blank" title="Kubernetes" rel="noopener noreferrer">Kubernetes</a> pour faire des déploiements automatisés et sera un pas de plus en direction d&rsquo;un processus de déploiement continu.</p>
<p>Cet article est le premier de la série et aussi celui qui aborde le moins Flagger&#8230; Il vous permettra de prendre en main Kubernetes sur votre environnement local en déployant une application qui sera accessible par l&rsquo;intermédiaire d&rsquo;une passerelle <a href="https://istio.io/" target="_blank" title="Istio" rel="noopener noreferrer">Istio</a>.</p>
<div class="info"><strong class="label">Remarque</strong><br />
Ce guide est un « hands-on » et peut être suivi pas à pas par les utilisateurs sous MacOS. Il nécessitera quelques ajustements si vous utilisez un PC sous Windows ou Linux. Il est important de signaler que cet article ne s&rsquo;attardera pas sur les concepts et technologies en détail donc si vous n&rsquo;êtes pas familier avec Docker, Kubernetes, Helm ou Istio, je vous conseille fortement de vous documenter avant de poursuivre votre lecture.
</div>
<p><br clear="none" /></p>
<h4>Docker</h4>
<p>Installez Docker en installant l&rsquo;application <a href="https://hub.docker.com/editions/community/docker-ce-desktop-mac/" target="_blank" title="Docker for Mac" rel="noopener noreferrer">Docker Desktop for Mac</a>, vous pouvez vous référer au <a href="https://docs.docker.com/docker-for-mac/install/" target="_blank" title="Installer Docker for Mac" rel="noopener noreferrer">guide officiel d&rsquo;installation</a>. Pour les utilisateurs de Windows, l&rsquo;application équivalente « Docker for Windows » existe.</p>
<p>Pour la suite, nous allons également utiliser Docker for Mac pour mettre en place le cluster Kubernetes en local. Notez que ce tutoriel a été testé avec <a href="https://docs.docker.com/docker-for-mac/release-notes/#docker-desktop-community-2400" target="_blank" title="Docker for Mac 2.4.0.0" rel="noopener noreferrer">Docker for Mac 2.4.0.0</a> qui embarque un cluster Kubernetes en version 1.18.8.</p>
<blockquote><p>
Si vous utilisez une version différente, la technologie évolue rapidement et je ne peux donc pas garantir que les commandes utilisées dans cette série d&rsquo;articles fonctionneront sans ajustement.
</p></blockquote>
<p><br clear="none" /></p>
<h4>Mirror HTTP Server</h4>
<p>Quelques mots sur l&rsquo;application <a href="https://github.com/eexit/mirror-http-server" target="_blank" title="Mirror HTTP Server" rel="noopener noreferrer">Mirror HTTP Server</a> que nous allons utiliser dans cette série d&rsquo;articles.</p>
<p>MHS est une application JavaScript basée sur <a href="https://nodejs.org/" target="_blank" title="Node.js" rel="noopener noreferrer">Node.js</a> utilisant le framework <a href="https://expressjs.com/" target="_blank" title="Express" rel="noopener noreferrer">Express</a> très simple qui permet de personnaliser la réponse HTTP reçue en spécifiant des headers HTTP dans la requête. L&rsquo;image Docker est <a href="https://hub.docker.com/r/eexit/mirror-http-server" target="_blank" title="Mirror HTTP Server Docker Image" rel="noopener noreferrer">disponible publiquement sur le Docker Hub</a>. Vous pouvez consulter le <a href="https://github.com/eexit/mirror-http-server" target="_blank" title="Mirror HTTP Server" rel="noopener noreferrer">repo Github du projet</a> pour en savoir plus, notez que je n&rsquo;en suis pas l&rsquo;auteur.</p>
<p>Cette mini application est exactement ce dont nous avons besoin pour tester les capacités de Flagger pour simuler des réponses 200 OK et des réponses 500 Internal Server Error.</p>
<p>Récupérons l&rsquo;image Docker:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">docker</span> pull eexit/mirror-http-server<br /></div>

<p>Lançons un container qui l&rsquo;utilise:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">docker</span> run -itp 8080:80 eexit/mirror-http-server<br /></div>

<p>Puis testons son bon fonctionnement:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -I <span class="wp-shkshell-string">'http://localhost:8080'</span><br /></div>

<p>Vous devriez recevoir une réponse HTTP 200 OK:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">HTTP</span>/1.1 200 OK<br />X-Powered-By: Express<br />Date: Fri, 01 May 2020 17:57:17 GMT<br />Connection: keep-alive<br /></div>

<p>Alors que:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -I -H X-Mirror-Code:500 <span class="wp-shkshell-string">'http://localhost:8080'</span><br /></div>

<p>retournera une réponse HTTP 500:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">HTTP</span>/1.1 500 Internal Server Error<br />X-Powered-By: Express<br />Date: Fri, 01 May 2020 17:57:45 GMT<br />Connection: keep-alive<br /></div>

<blockquote><p>
Pour plus de simplicité, nous utilisons la commande curl, mais vous pouvez utiliser votre outil préféré comme <a href="https://www.postman.com/" target="_blank" title="Postman" rel="noopener noreferrer">Postman</a>.
</p></blockquote>
<p><br clear="none" /></p>
<h4>Kubernetes</h4>
<p>Maintenant que vous avez installé Docker for Mac, avoir un cluster Kubernetes qui tourne en local ne sera qu&rsquo;une simple formalité. Il vous suffit de cocher une case!</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/docker-for-mac-enable-new.png?ssl=1" rel="shadowbox[sbpost-5125];player=img;" title="Activer Kubernetes avec Docker for Mac"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/docker-for-mac-enable-new-thumbnail.png?resize=550%2C349&#038;ssl=1" alt="Activer Kubernetes avec Docker for Mac" title="Activer Kubernetes avec Docker for Mac" width="550" height="349" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Activer Kubernetes avec Docker for Mac</p></div>
<p>Si la lumière est verte, alors votre cluster Kubernetes a démarré avec succès. Attention, cela prend pas mal de ressources donc ne vous affolez pas si le ventilateur tourne à plein régime et que cela prend un peu de temps pour démarrer&#8230;</p>
<p><br clear="none" /></p>
<h4>Kube dashboard</h4>
<p>Nous allons installer notre première application dans notre cluster Kubernetes.</p>
<p>Kubernetes via Docker ne fournit pas Kube dashboard par défaut, vous devez l&rsquo;installer vous-même. Ce tableau de bord est très pratique et donne une vision graphique de ce que se passe dans votre cluster et vous évitera d&rsquo;avoir à saisir des commandes <code>kubectl</code>.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml<br /></div>

<p>Le tableau de bord est protégé, mais vous pouvez utiliser l&rsquo;utilisateur par défaut pour y accéder. Générez un token pour cet utilisateur:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> -n kube-system describe secret default <span class="wp-shkshell-special">|</span> <span class="wp-shkshell-command">grep</span> token: <span class="wp-shkshell-special">|</span> <span class="wp-shkshell-command">awk</span> <span class="wp-shkshell-string">'{print <span class="wp-shkshell-variable">$2</span>}'</span><br /></div>

<p>Copiez le token.</p>
<blockquote><p>
Vous devrez réutiliser cette commande et / ou le token copié si votre session a expiré, cela se produit lorsque vous n&rsquo;interagissez pas avec le tableau de bord pendant un petit moment.
</p></blockquote>
<p>Enfin, créer un proxy pour accéder au tableau de bord à partir du navigateur (cette commande devra s&rsquo;exécuter indéfiniment):</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> proxy<br /></div>

<p>Si vous accédez à http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login et utilisez le token que vous avez copié pour vous authentifier, vous devriez voir cet écran.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/kube-dashboard-new.png?ssl=1" rel="shadowbox[sbpost-5125];player=img;" title="Tableau de bord Kubernetes"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/kube-dashboard-new-thumbnail.png?resize=550%2C316&#038;ssl=1" alt="Tableau de bord Kubernetes" title="Tableau de bord Kubernetes" width="550" height="316" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Tableau de bord Kubernetes</p></div>
<p><br clear="none" /></p>
<h4>Helm</h4>
<p>Nous utilisons <a href="https://brew.sh/" target="_blank" title="Homebrew" rel="noopener noreferrer">Homebrew</a> pour l&rsquo;installation de Helm. Homebrew est un  gestionnaire de paquets très pratique disponible pour Mac.</p>
<p>Nous allons utiliser <a href="https://helm.sh/" target="_blank" title="Helm" rel="noopener noreferrer">Helm</a> pour installer Istio et l&rsquo;application MHS dans notre cluster. Helm est un peu l&rsquo;équivalent de Homebrew, mais pour Kubernetes. Nous utilisons la version 3. Helm vous évitera d&rsquo;avoir à saisir de nombreuses commandes <code>kubectl apply</code>.</p>
<p>Installons Helm 3 avec:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">brew</span> install helm@3<br /></div>

<p>Pour vérifier que Helm a bien été installé:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> version<br /></div>

<p>Vous devriez avoir en sortie (notez que Helm 3.3.4 est la dernière version au moment de la rédaction):</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">version</span>.BuildInfo{Version:"v3.3.4", GitCommit:"a61ce5633af99708171414353ed49547cf05013d", GitTreeState:"dirty", GoVersion:"go1.15.2"}<br /></div>

<p><br clear="none" /></p>
<h4>Istio &#038; Prometheus</h4>
<p>Maintenant, installons le Service Mesh Istio. Pour des explications et les avantages à utiliser un Service Mesh, je vous invite à lire la <a href="https://istio.io/latest/about/service-mesh/" target="_blank" title="Qu'est ce qu'Istio" rel="noopener noreferrer">documentation officielle</a>. </p>
<p>Tout d&rsquo;abord, vous devez augmenter les limites de mémoire de votre Kubernetes via Docker, sinon vous allez rencontrer des problèmes de déploiement. Vos ventilateurs vont s&rsquo;en remettre, ne vous inquiétez pas&#8230;</p>
<p>Voici ma configuration:</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/docker-for-mac-config-new.png?ssl=1" rel="shadowbox[sbpost-5125];player=img;" title="Configuration Kubernetes de Docker for Mac pour Istio"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/docker-for-mac-config-new-thumbnail.png?resize=550%2C349&#038;ssl=1" alt="Configuration Kubernetes de Docker for Mac pour Istio" title="Configuration Kubernetes de Docker for Mac pour Istio" width="550" height="349" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Configuration Kubernetes de Docker for Mac pour Istio</p></div>
<p>J&rsquo;ai suivi les <a href="https://istio.io/latest/docs/setup/platform-setup/docker/" target="_blank" title="Recommandations Docker Desktop pour Istio" rel="noopener noreferrer">recommandations Docker Desktop pour Istio</a>.</p>
<p>Passons à l&rsquo;installation d&rsquo;Istio 1.7.3 (la dernière version au moment de la rédaction). Tout d&rsquo;abord, téléchargez les sources:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -L https://istio.io/downloadIstio <span class="wp-shkshell-special">|</span> <span class="wp-shkshell-command">ISTIO_VERSION</span>=1.7.3 sh -<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">cd</span> istio-1.7.3<br /></div>

<p>Ajoutez le client <code>istioctl</code> à votre path:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">export</span> PATH=<span class="wp-shkshell-variable">$PWD</span>/bin:<span class="wp-shkshell-variable">$PATH</span><br /></div>

<p>Installez Istio avec le client fourni, on utilise le <a href="https://istio.io/latest/docs/setup/additional-setup/config-profiles/" rel="noopener noreferrer" title="Istio Installation Configuration Profiles" target="_blank">profil de démo</a>:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">istioctl</span> install --set profile=demo<br /></div>

<p>Après quelques minutes, vous devriez avoir un message confirmant qu&rsquo;Istio a bien été installé. Et voilà!</p>
<blockquote><p>
Pour installer la dernière version d&rsquo;Istio, vous pouvez simplement remplacer la première ligne par <code>curl -L https://istio.io/downloadIstio | sh -</code>.
</p></blockquote>
<p>Ajoutez Prometheus car c&rsquo;est un prérequis pour Flagger:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/prometheus.yaml<br /></div>

<p>A partir du tableau de bord Kube, vérifiez qu&rsquo;un nouveau namespace a été créé <code>istio-system</code> et qu&rsquo;il contient les outils Istio dont <a href="https://prometheus.io/" target="_blank" title="Prometheus" rel="noopener noreferrer">Prometheus</a>.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/istio-deployed-new.png?ssl=1" rel="shadowbox[sbpost-5125];player=img;" title="Istio est déployé dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/istio-deployed-new-thumbnail.png?resize=550%2C316&#038;ssl=1" alt="Istio est déployé dans votre cluster" title="Istio est déployé dans votre cluster" width="550" height="316" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Istio est déployé dans votre cluster</p></div>
<blockquote><p>
Pourquoi Prometheus est-il important? Car c&rsquo;est un composant indispensable pour Flagger qui fournira les métriques pour montrer si la nouvelle version de votre application est en bonne santé ou non et ainsi la promouvoir ou au contraire faire un rollback. Je reviendrais en détail sur tout cela dans le prochain article.
</p></blockquote>
<p><br clear="none" /></p>
<h4>Déploiement de Mirror HTTP Server</h4>
<p>Avant de déployer MHS, créons un nouveau namespace <code>application</code>, nous ne voulons pas utiliser celui par défaut à la racine du cluster (c&rsquo;est une bonne pratique). Le nom est un peu trop générique, mais suffisant pour ce tutoriel, en général vous utiliserez le nom de l&rsquo;équipe ou le nom d&rsquo;un regroupement de fonctionnalités.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> create ns application<br /></div>

<p>N&rsquo;oublions pas d&rsquo;activer Istio sur ce nouveau namespace:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> label namespace application istio-injection=enabled<br /></div>

<p>Pour déployer MHS, j&rsquo;ai créé un <a href="https://helm.sh/docs/topics/charts/" target="_blank" title="Helm Chart" rel="noopener noreferrer">Helm chart</a>.</p>
<p><a href="https://github.com/fabianpiau/mhs-chart" target="_blank" title="MHS Helm Chart" rel="noopener noreferrer">Ce chart</a> a été créé avec la commande <code>helm create mhs-chart</code>, que j&rsquo;ai ensuite adapté pour <a href="https://github.com/fabianpiau/mhs-chart/commit/bb992384546ad2dfc231c6264629d23cea7203e4" target="_blank" title="Premier commit" rel="noopener noreferrer">récupérer la dernière image de MHS</a>. J&rsquo;ai également ajouté un <a href="https://github.com/fabianpiau/mhs-chart/commit/ecbde2e254e8887b3ed73b081ea5a763860e6ce6" target="_blank" title="Second commit" rel="noopener noreferrer">fichier gateway.yaml pour la configuration de la passerelle Istio</a> afin que l&rsquo;application soit accessible en dehors du cluster.</p>
<p>Clonez le repo contenant le chart:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">git</span> clone https://github.com/fabianpiau/mhs-chart.git<br /></div>

<p>Et installez MHS:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">cd</span> mhs-chart<br />helm install --name mhs --namespace application ./mhs<br /></div>

<p>Après quelques instants, si vous regardez le tableau de bord, vous devriez voir 1 replica de MHS dans le namespace <code>application</code>.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/mhs-deployed-new.png?ssl=1" rel="shadowbox[sbpost-5125];player=img;" title="MHS est déployé dans votre cluster"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00095/mhs-deployed-new-thumbnail.png?resize=550%2C316&#038;ssl=1" alt="MHS est déployé dans votre cluster" title="MHS est déployé dans votre cluster" width="550" height="316" class="size-medium wp-image-257" /></a><p class="wp-caption-text">MHS est déployé dans votre cluster</p></div>
<p>Vous avez maintenant 1 pod de MHS en cours d&rsquo;exécution dans votre cluster Kubernetes. Le pod est exposé au monde extérieur via une passerelle Istio.</p>
<p>Pour tester, utilisons les commandes similaires précédemment utilisées contre le container docker:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -I -H Host:mhs.example.com <span class="wp-shkshell-string">'http://localhost'</span><br /></div>

<p>Vous devriez recevoir une réponse HTTP 200 OK qui a été manipulé par le composant <a href="https://www.envoyproxy.io/" target="_blank" title="Envoy proxy" rel="noopener noreferrer">Envoy</a>, le proxy utilisé par Istio:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">HTTP</span>/1.1 200 OK<br />x-powered-by: Express<br />date: Fri, 01 May 2020 17:37:19 GMT<br />x-envoy-upstream-service-time: 17<br />server: istio-envoy<br />transfer-encoding: chunked<br /></div>

<p>Et:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">curl</span> -I -H Host:mhs.example.com -H X-Mirror-Code:500 <span class="wp-shkshell-string">'http://localhost'</span><br /></div>

<p>devrait retourner une réponse HTTP 500:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">HTTP</span>/1.1 500 Internal Server Error<br />x-powered-by: Express<br />date: Fri, 01 May 2020 17:38:34 GMT<br />x-envoy-upstream-service-time: 2<br />server: istio-envoy<br />transfer-encoding: chunked<br /></div>

<p>Félicitations, vous êtes arrivé à la fin de ce premier tutoriel! </p>
<blockquote><p>
Pour information, vous pouvez également accéder à MHS avec votre navigateur préféré si vous exécutez d&rsquo;abord une commande proxy pour exposer le pod:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">export</span> POD_NAME=$(<span class="wp-shkshell-command">kubectl</span> get pods --namespace application -l <span class="wp-shkshell-string">"app.kubernetes.io/name=mhs,app.kubernetes.io/instance=mhs"</span> -o jsonpath="{.items[<span class="wp-shkshell-command">0</span>].metadata.name}")<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> port-forward --namespace application <span class="wp-shkshell-variable">$POD_NAME</span> 8080:80<br /></div>

<p>Ensuite, accédez à <a href="http://localhost:8080/" target="_blank" title="Localhost MHS" rel="noopener noreferrer">http://localhost:8080/</a>.</p>
<p>Vous devriez voir une&#8230; page blanche. C&rsquo;est normal, MHS ne renvoie aucun body dans la réponse, il n&rsquo;y a aucune sortie HTML!
</p></blockquote>
<p><br clear="none" /></p>
<h4>Nettoyage des ressources</h4>
<p>Vous pouvez supprimer l&rsquo;application MHS et son namespace.</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">helm</span> delete mhs --namespace application<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces application<br /></div>

<p>Nous ne supprimons pas Istio / Prometheus car nous en aurons besoin dans le prochain article, mais si vous souhaitez libérer des ressources, vous pouvez utiliser ces commandes:</p>

<div class="wp-shkshell"><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/prometheus.yaml<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">istioctl</span> manifest generate --set profile=demo <span class="wp-shkshell-special">|</span> <span class="wp-shkshell-command">kubectl</span> delete -f -<br /><span class="wp-shkshell-prompt"></span> <br /><span class="wp-shkshell-prompt"></span> <span class="wp-shkshell-command">kubectl</span> delete namespaces istio-system<br /></div>

<p><br clear="none" /></p>
<h4>Et après?</h4>
<p>Le <a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="noopener" title="Flagger – Déploiements Canary sur Kubernetes">prochain article</a> détaillera l&rsquo;installation de Flagger et son utilisation via des déployments de type « canary release » de différentes versions de MHS. Stay tuned! En attendant, vous pouvez arrêter le cluster Kubernetes en décochant la case et redémarrant Docker Desktop. Votre ordinateur peut prendre une pause méritée.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/">Flagger &#8211; Premiers pas avec Istio et Kubernetes</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="bookmark" title="Flagger &#8211; Déploiements Canary sur Kubernetes">Flagger &#8211; Déploiements Canary sur Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/06/28/flagger-monitor-your-canary-deployments-with-grafana/" rel="bookmark" title="Flagger &#8211; Monitorer vos déploiements Canary avec Grafana">Flagger &#8211; Monitorer vos déploiements Canary avec Grafana</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/09/17/choose-the-web-hosting-service-that-fits-your-needs/" rel="bookmark" title="Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins">Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2020/05/02/flagger-get-started-with-istio-and-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5125</post-id>	</item>
		<item>
		<title>CoderDojo Expedia à Londres</title>
		<link>https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/</link>
					<comments>https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Mon, 22 Jul 2019 17:37:13 +0000</pubDate>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[coderdojo]]></category>
		<category><![CDATA[développeur]]></category>
		<category><![CDATA[informatique]]></category>
		<category><![CDATA[londres]]></category>
		<category><![CDATA[métier]]></category>
		<category><![CDATA[panorama]]></category>
		<category><![CDATA[programmeur]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5079</guid>

					<description><![CDATA[<p>&#160;English version available Mercredi dernier, Expedia a organisé le premier CoderDojo dans nos bureaux de Londres. CoderDojo est un groupe communautaire de clubs bénévoles permettant aux jeunes de 7 à 17 ans de se réunir et d&#8217;apprendre à créer des projets sympas basés sur les nouvelles technologies. Le « Dojo » est libre d&#8217;accès et gratuit. Quel [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/">CoderDojo Expedia à Londres</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/06/computing-jobs-simplified-overview/" rel="bookmark" title="Panorama simplifié des métiers de l&rsquo;informatique">Panorama simplifié des métiers de l&rsquo;informatique</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/02/20/fosdem-2013-impressions/" rel="bookmark" title="Retour sur Fosdem 2013">Retour sur Fosdem 2013</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2019/07/22/expedia-coderdojo-in-london/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Mercredi dernier, Expedia a organisé le premier <a href="https://coderdojo.com/" target="_blank" title="Site CoderDojo" rel="noopener noreferrer">CoderDojo</a> dans nos bureaux de Londres.</p>
<p class="center"><a href="https://coderdojo.com/" target="_blank" title="Logo CoderDojo" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Logo CoderDojo" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-logo.png?resize=460%2C160&#038;ssl=1" alt="Logo CoderDojo" width="460" height="160" /></a></p>
<p>CoderDojo est un groupe communautaire de clubs bénévoles permettant aux jeunes de 7 à 17 ans de se réunir et d&rsquo;apprendre à créer des projets sympas basés sur les nouvelles technologies.</p>
<p>Le « Dojo » est libre d&rsquo;accès et gratuit. Quel que soit votre niveau d&rsquo;expérience, que vous soyez novice en matière de programmation ou que vous ayez une idée de projet que vous souhaiteriez concrétiser, vous êtes le bienvenu!</p>
<p><br clear="none" /></p>
<p>Pour cette première session, nous avions environ 10 participants âgés de 7 à 13 ans.</p>
<p>Tout d&rsquo;abord, pour « briser la glace » entre les participants, nous avons joué au jeu « deux vérités et un mensonge » en mentionnant trois choses que nous avions faites au cours de la journée. J’étais plutôt satisfait de voir la plupart des enfants tomber dans mon piège quand j&rsquo;annonce que j&rsquo;ai joué à la PlayStation au travail et leur révèle que ce n&rsquo;était pas le mensonge&#8230; :)</p>
<p>Ensuite, nous avons organisé différentes activités en fonction de l&rsquo;intérêt des enfants:</p>
<ul>
<li><a href="https://scratch.mit.edu/" target="_blank" title="Site Scratch" rel="noopener noreferrer">Scratch</a>, glisser / déposer des blocs au lieu d’écrire du code traditionnel, pour faire voler un hippopotame ou construire des projets plus complexes</li>
<li>Apprendre des compétences de base en algorithmie en se basant sur des jeux <a href="https://code.org/starwars" target="_blank" title="Building Star Wars games with Code" rel="noopener noreferrer">Star Wars</a> ou <a href="https://studio.code.org/s/flappy/reset" target="_blank" title="Code your own Flappy game" rel="noopener noreferrer">Flappy Bird</a></li>
<li>Utiliser le kit <a href="https://microbit.org/" target="_blank" title="Site Micro:bit" rel="noopener noreferrer">BBC Micro:Bit</a> pour créer des jeux ou simuler des émotions de robot</li>
</ul>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-1.jpg?ssl=1" rel="shadowbox[sbpost-5079];player=img;" title="CoderDojo @ Expedia Londres"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-1-thumbnail.png?resize=550%2C404&#038;ssl=1" alt="CoderDojo @ Expedia Londres" title="CoderDojo @ Expedia Londres" width="550" height="404" class="size-medium wp-image-257" /></a><p class="wp-caption-text">CoderDojo @ Expedia Londres</p></div>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-2.jpg?ssl=1" rel="shadowbox[sbpost-5079];player=img;" title="CoderDojo @ Expedia Londres"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-2-thumbnail.png?resize=550%2C404&#038;ssl=1" alt="CoderDojo @ Expedia Londres" title="CoderDojo @ Expedia Londres" width="550" height="404" class="size-medium wp-image-257" /></a><p class="wp-caption-text">CoderDojo @ Expedia Londres</p></div>
<p>A la fin de l&rsquo;activité, les enfants ont été invités à montrer ce qu&rsquo;ils ont accompli au cours de la dernière heure. C&rsquo;était très agréable de voir la majorité d&rsquo;entre eux heureux et enthousiastes pour prendre la parole, présenter et répondre aux éventuelles questions.<br />
Le partage des connaissances et la collaboration sont des compétences essentielles pour le futur.</p>
<p>En résumé, c&rsquo;était amusant pour les enfants, mais aussi pour les mentors!</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-3.jpg?ssl=1" rel="shadowbox[sbpost-5079];player=img;" title="Mentors CoderDojo: Veli, Alice, Adam, Ana, Fabian, Nicola"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00094/coderdojo-3-thumbnail.png?resize=550%2C404&#038;ssl=1" alt="Mentors CoderDojo: Veli, Alice, Adam, Ana, Fabian, Nicola" title="Mentors CoderDojo: Veli, Alice, Adam, Ana, Fabian, Nicola" width="550" height="404" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Mentors CoderDojo: Veli, Alice, Adam, Ana, Fabian, Nicola</p></div>
<p>Après avoir reçu des retours positifs et spontanés de la part de certains participants à la fin, nous pouvons affirmer que cette première expérience est un succès. Nous avons évidemment une marge de progression et déjà de nouvelles idées en tête pour la prochaine session.</p>
<p>Nous prévoyons d&rsquo;organiser un « Dojo » mensuel, le 3ème mercredi de chaque mois, ce qui signifie que le prochain sera le 21 août.</p>
<p>Que vous soyez un enfant, un parent ou un mentor, nous espérons vous voir bientôt au deuxième « Dojo »! Plus d&rsquo;infos et inscription sur <a href="https://zen.coderdojo.com/dojos/gb/london-borough-of-islington-london/angel-london-expedia-group" target="_blank" title="London Angel Expedia CoderDojo" rel="noopener noreferrer">London Angel Expedia CoderDojo</a>.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/">CoderDojo Expedia à Londres</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/06/computing-jobs-simplified-overview/" rel="bookmark" title="Panorama simplifié des métiers de l&rsquo;informatique">Panorama simplifié des métiers de l&rsquo;informatique</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/02/20/fosdem-2013-impressions/" rel="bookmark" title="Retour sur Fosdem 2013">Retour sur Fosdem 2013</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5079</post-id>	</item>
		<item>
		<title>Etre bénévole à Devoxx4Kids</title>
		<link>https://blog.fabianpiau.com/fr/2019/05/06/volunteering-at-devoxx4kids/</link>
					<comments>https://blog.fabianpiau.com/fr/2019/05/06/volunteering-at-devoxx4kids/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Mon, 06 May 2019 11:47:51 +0000</pubDate>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[développeur]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[devoxx4kids]]></category>
		<category><![CDATA[informatique]]></category>
		<category><![CDATA[londres]]></category>
		<category><![CDATA[métier]]></category>
		<category><![CDATA[panorama]]></category>
		<category><![CDATA[programmeur]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=5050</guid>

					<description><![CDATA[<p>&#160;English version available Devoxx4Kids est un « spin-off » de la conférence Devoxx pour les développeurs, à quelques différences près: l&#8217;événement dure une journée, n&#8217;inclut pas de conférences, mais se concentre sur des ateliers et, bien sûr, est conçu pour les enfants (âgés de 10 à 14 ans). L&#8217;année dernière, je me suis porté volontaire pour le [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2019/05/06/volunteering-at-devoxx4kids/">Etre bénévole à Devoxx4Kids</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/" rel="bookmark" title="CoderDojo Expedia à Londres">CoderDojo Expedia à Londres</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2012/01/21/firefox-nightly-aurora-beta-desktop-mobile-esr-co/" rel="bookmark" title="Firefox Nightly, Aurora, Beta, Desktop, Mobile, ESR &#038; Co.">Firefox Nightly, Aurora, Beta, Desktop, Mobile, ESR &#038; Co.</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2019/05/06/volunteering-at-devoxx4kids/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p class="center"><a href="https://www.devoxx4kids.org/" target="_blank" title="Devoxx4Kids" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Logo Devoxx4Kids" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00093/devoxx4kids-logo-medium.png?resize=556%2C202&#038;ssl=1" alt="Logo Devoxx4Kids" width="556" height="202" /></a></p>
<p><a href="https://www.devoxx4kids.org/" target="_blank" title="Website Devoxx4Kids" rel="noopener noreferrer">Devoxx4Kids</a> est un « spin-off » de la conférence <a href="https://devoxx.com/" target="_blank" title="Website Devoxx" rel="noopener noreferrer">Devoxx</a> pour les développeurs, à quelques différences près: l&rsquo;événement dure une journée, n&rsquo;inclut pas de conférences, mais se concentre sur des ateliers et, bien sûr, est conçu pour les enfants (âgés de 10 à 14 ans).</p>
<p>L&rsquo;année dernière, je me suis porté volontaire pour le <a href="https://www.facebook.com/devoxx4kidsuk" target="_blank" title="Page Facebook de Devoxx4Kids UK" rel="noopener noreferrer">Devoxx4Kids de Londres</a> et c&rsquo;était plutôt fun. J&rsquo;aime l&rsquo;informatique et les enfants, alors c&rsquo;est une bonne motivation! Jouer avec <a href="https://scratch.mit.edu/" target="_blank" title="Website Scratch" rel="noopener noreferrer">Scratch</a>, faire en sorte que <a href="https://www.softbankrobotics.com/emea/en/nao" target="_blank" title="Website Nao le robot" rel="noopener noreferrer">Nao le robot</a> danse et parle, programmer quelques <a href="https://www.lego.com/mindstorms" target="_blank" title="Website Lego Mindstorms" rel="noopener noreferrer">Lego Mindstorms</a> pour des batailles, etc. Vous retournez presque en enfance le temps d&rsquo;une journée!</p>
<p>C&rsquo;est une très bonne initiative pour inculquer les compétences de base nécessaires en ingénierie et en programmation à la plus jeune génération afin qu&rsquo;elle découvre ce qu&rsquo;est l&rsquo;informatique de manière efficace et pratique. Cette expérience peut également leur apprendre des qualités comme la patience, le partage et l&rsquo;écoute.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00093/devoxx4kids-collage.jpg?ssl=1" rel="shadowbox[sbpost-5050];player=img;" title="Devoxx4Kids 2018 à Londres - Collage"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00093/devoxx4kids-collage-thumbnail.png?resize=550%2C377&#038;ssl=1" alt="Devoxx4Kids 2018 à Londres - Collage" title="Devoxx4Kids 2018 à Londres - Collage" width="550" height="377" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Devoxx4Kids 2018 à Londres - Collage</p></div>
<p>Devoxx4Kids est également une bonne occasion d&rsquo;enseigner aux enfants que la technologie n&rsquo;est pas uniquement réservée aux garçons et que les filles ne sont pas en reste. Comme ils sont jeunes, ils sont beaucoup moins formatés par les stéréotypes. En tant que lecteur de ce blog et probablement adulte, vous ne serez pas surpris que quelqu&rsquo;un travaillant dans l&rsquo;informatique puisse être associé à un gars barbu et geek tapant des lignes de code dans le noir avec son café et un fond d&rsquo;écran sexy&#8230;</p>
<p class="center"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Ingénieur informaticien stéréotypé" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00093/nerdy-guy-frame.png?resize=411%2C366&#038;ssl=1" alt="Ingénieur informaticien stéréotypé" width="411" height="366" /></p>
<p>Blague à part, Devoxx4kids aura lieu samedi prochain (le 11 mai) à Londres. Malheureusement, je ne serai pas en mesure d&rsquo;assister et d&rsquo;aider cette année, je vais donc rater le <a href="https://sphero.com/products/sphero-bolt" target="_blank" title="Website Sphero BOLT" rel="noopener noreferrer">Sphero BOLT</a> et la <a href="https://www.amazon.co.uk/Kano-Harry-Potter-Coding-Kit/dp/B07C7X8LG9" target="_blank" title="Website baguette de codage magique Harry Potter" rel="noopener noreferrer">baguette de codage magique d&rsquo;Harry Potter</a>. Mais n&rsquo;hésitez pas, si vous êtes intéressé et libre ce jour-là, je dirais qu&rsquo;il n&rsquo;est jamais trop tard pour faire du bénévolat. Vous trouverez tous les détails sur la <a href="https://www.eventbrite.com/e/devoxx4kids-uk-london-may-2019-tickets-57921482714" target="_blank" title="Page Eventbrite Devoxx4Kids UK à Londres le 11 Mai" rel="noopener noreferrer">page de l&rsquo;événement</a> ou pouvez les contacter via <a href="https://www.facebook.com/devoxx4kidsuk" target="_blank" title="Page Facebook de Devoxx4Kids UK" rel="noopener noreferrer">Facebook</a> ou <a href="https://twitter.com/devoxx4kidsuk" target="_blank" title="Twitter de Devoxx4Kids UK" rel="noopener noreferrer">Twitter</a>.</p>
<p>Si vous ne vivez ni à Londres ni même au Royaume-Uni, il existe de nombreux Devoxx4Kids dans le monde, contactez celui qui se trouve près de chez vous, je suis sûr qu&rsquo;ils seront ravis de recevoir votre aide!</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00093/devoxx4kids-group-photo.jpg?ssl=1" rel="shadowbox[sbpost-5050];player=img;" title="Devoxx4Kids 2018 à Londres - Photo de groupe"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00093/devoxx4kids-group-photo-thumbnail.jpg?resize=550%2C149&#038;ssl=1" alt="Devoxx4Kids 2018 à Londres - Photo de groupe" title="Devoxx4Kids 2018 à Londres - Photo de groupe" width="550" height="149" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Devoxx4Kids 2018 à Londres - Photo de groupe</p></div>
<p>The article <a href="https://blog.fabianpiau.com/fr/2019/05/06/volunteering-at-devoxx4kids/">Etre bénévole à Devoxx4Kids</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2019/07/22/expedia-coderdojo-in-london/" rel="bookmark" title="CoderDojo Expedia à Londres">CoderDojo Expedia à Londres</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2012/01/21/firefox-nightly-aurora-beta-desktop-mobile-esr-co/" rel="bookmark" title="Firefox Nightly, Aurora, Beta, Desktop, Mobile, ESR &#038; Co.">Firefox Nightly, Aurora, Beta, Desktop, Mobile, ESR &#038; Co.</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2019/05/06/volunteering-at-devoxx4kids/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5050</post-id>	</item>
		<item>
		<title>Une migration Java 11 réussie</title>
		<link>https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/</link>
					<comments>https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/#comments</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Thu, 27 Dec 2018 11:45:00 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[migration]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4998</guid>

					<description><![CDATA[<p>&#160;English version available Cet article résume le travail que nous avons accompli au sein de mon équipe pour migrer nos micro-services de Java 8 à Java 11 pour le site Hotels.com. En résumé, pour chacun de nos services, nous avons suivi les étapes suivantes: Compiler le code avec Java 11 Démarrer le service (compatible Java [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/">Une migration Java 11 réussie</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/" rel="bookmark" title="QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java">QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" rel="bookmark" title="QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2011/10/13/java-ee-cdi-vs-spring/" rel="bookmark" title="Java EE &#038; CDI vs. Spring">Java EE &#038; CDI vs. Spring</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2018/12/27/a-java-11-migration-successful-story/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Cet article résume le travail que nous avons accompli au sein de mon équipe pour migrer nos micro-services de Java 8 à Java 11 pour le site Hotels.com.</p>
<p>En résumé, pour chacun de nos services, nous avons suivi les étapes suivantes:</p>
<ul>
<li>Compiler le code avec Java 11</li>
<li>Démarrer le service (compatible Java 11) sur Java 8</li>
<li>Démarrer le service sur Java 11</li>
</ul>
<blockquote><p>En réalité, nous avons eu quelques étapes supplémentaires. Lorsque nous avons commencé la migration, Java 11 n’était pas encore disponible, nous ne pouvions utiliser que Java 10.<br />
L&rsquo;hypothèse était la suivante: si le code compile avec Java 10, la migration vers Java 11 ne demandera pas beaucoup de travail, car le changement le plus important à propos de la modularité a été introduit avec Java 9 et le projet Jigsaw. Heureusement, ce fut le cas!</p></blockquote>
<p><br clear="none" /></p>
<div style="max-width: 560px" class="wp-caption aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00092/star-wars-lightsaber-upgrade.png?resize=550%2C186&#038;ssl=1" alt="Mise à jour du sabre laser Star Wars..." title="Mise à jour du sabre laser Star Wars..." width="550" height="186" class="size-medium wp-image-257" /><p class="wp-caption-text">Mise à jour du sabre laser Star Wars...</p></div>
<p><br clear="none" /></p>
<h4>1. Compiler le code avec Java 11</h4>
<p>C&rsquo;est la partie qui a pris le plus de temps. En effet, nous avons dû monter en version la plupart des frameworks et des outils que nous utilisions. En particulier, nous avons dû gérer la migration de Spring Boot 1 à 2 et de Spring 4 à 5. S&rsquo;agissant de versions majeures, nous avons dû prendre en compte quelques modifications importantes.</p>
<p><strong>Spring Boot</strong></p>
<p>Pour Spring Boot 2, les guides de migration officiels de <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes" target="_ blank" title="Notes de version de Spring Boot 2.0" rel="noopener noreferrer">Spring Boot 2.0</a> et <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes" target="_ blank" title="Notes de version de Spring Boot 2.1" rel="noopener noreferrer">Spring Boot 2.1</a> sont bien écrits et détaillés.</p>
<ul>
<li>Le <a href="https://github.com/spring-projects/spring-boot/issues/13151" target="_blank" title="Mécanisme de priorité des profils avec Spring Boot 2" rel="noopener noreferrer">chargement des profils a évolué</a></li>
<li>Le <a href="https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0" target="_blank" title="Spring Boot Relaxed Binding 2.0" rel="noopener noreferrer">relaxed binding des propriétés est un peu moins relaxed</a></li>
<li>Certaines propriétés ont été renommées et d&rsquo;autres sont indisponibles (par exemple, la propriété <code>security.basic.enabled</code> doit être remplacée par un <code>WebSecurityConfigurerAdapter</code>)</li>
<li>Certains endpoints ont été renommés (par exemple, actuator healthchecks)</li>
<li>L&rsquo;overriding de bean est maintenant désactivé par défaut. Comme nous l&rsquo;utilisions dans nos tests d&rsquo;intégration, nous avons dû le réactiver avec la nouvelle propriété  <code>spring.main.allow-bean-definition-overriding</code>.</li>
</ul>
<p><strong>Spring</strong></p>
<p>La <a href="https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x" target="_ blank" title="Mise à niveau vers Spring Framework 5. x " rel="noopener noreferrer">migration vers Spring 5</a> était plutôt simple du point de vue du code avec quelques changements mineurs. La partie la plus compliquée était liée au fait que le projet était legacy et que nous devions gérer une configuration Spring en XML complexe et la migration vers Dropwizard Metrics 4.</p>
<p><strong>Divers</strong></p>
<p>Il peut arriver que des frameworks ne soient toujours pas compatibles avec Java 9+ car ils ne sont pas activement maintenus par la communauté. Dans notre cas, nous avons dû trouver une solution de contournement pour Cassandra Unit. Nous ne voulions pas investir de temps dans un changement de framework DB de test car nous prévoyons de passer à DynamoDB.</p>
<p>Nous avons également dû faire face au « Maven dependency hell » car certaines dépendances obligatoires tiraient d&rsquo;anciennes dépendances non compatibles avec Java 9+. Dans la plupart des cas, l&rsquo;ajout d&rsquo;exclusions dans le POM a résolu le problème.</p>
<p><strong>Environnement local</strong></p>
<p>En local, nous avons ajouté quelques alias à notre fichier de profil bash pour passer d’une version de Java à  une autre.</p>
<pre class="brush: bash; light: true; title: ; notranslate">
alias setjava8=&quot;export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/&quot;
alias setjava10=&quot;export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home/&quot;
alias setjava11=&quot;export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home/&quot;
</pre>
<p>Sous IntelliJ, le changement de version de Java peut être effectué à partir des paramètres du projet (la liste déroulante « Project SDK »).</p>
<p><strong>Environnement IC</strong></p>
<p>Du côté de l&rsquo;Intégration Continue (nous utilisons Bamboo), nous avons mis à jour l&rsquo;agent pour qu&rsquo;il utilise Java 11.<br />
Nous avons constaté qu’il n’était pas possible d’avoir des versions différentes de l’agent pour les plans de branche et le plan principal (master), car la configuration du plan est globale. Cela signifie que la mise à jour de l&rsquo;agent vers Java 11 cassera le plan principal si quelqu&rsquo;un d&rsquo;autre commite sur master (par exemple, une nouvelle fonctionnalité ou un correctif de bogue totalement indépendant de la migration vers Java 11).<br />
Pour atténuer ce problème et éviter un build rouge, il était important pour nous de nous assurer que le projet était compilable avec Java 11 et que tous les tests passaient localement avant d&rsquo;effectuer la mise à jour de l&rsquo;agent, ceci afin de merger rapidement la branche concernant la migration Java. Une autre option consisterait à remettre temporairement l&rsquo;agent à Java 8 une fois que le plan de branche est vert sur Java 11 sans oublier de le rebasculer sur Java 11 juste avant le merge.</p>
<p><br clear="none" /></p>
<h4>2. Démarrer le service (compatible Java 11) sur Java 8</h4>
<p>Une fois que tout a été corrigé, mergé et que le build principal est au vert, nous nous sommes assuré que la version compatible Java 11 fonctionnait correctement dans nos environnements de test. En gros, nous nous assurions que rien ne soit cassé… Nous avions des tests unitaires, d&rsquo;intégration et des tests end-to-end, autant dire que notre niveau de confiance était assez élevé. Comme on est jamais trop prudent, nous avons effectué des tests exploratoires manuels sur l’API, avec quelques requêtes exotiques et autres cas en marge afin de nous assurer que le service se comportait correctement. Nous avons également consulté les log et les tableaux de bord Grafana pour s&rsquo;assurer que tout fonctionnait bien.</p>
<p>La prochaine étape consistait à pousser cette nouvelle version en production. Le service fonctionnait toujours avec Java 8, même si le code était compatible (et compilé) avec Java 11, nous ne voulions pas introduire trop de changements en même temps, nous n’aimons pas les versions risquées après tout. Nous avons traité cette version avec un soin supplémentaire en raison de la refactorisation importante et des multiples montées en version. Après avoir examiné les tableaux de bord Grafana pendant quelques jours, en comparant les métriques avant et après la migration, nous avons constaté que tout s&rsquo;était bien passé.</p>
<p><br clear="none" /></p>
<h4>3. Démarrer le service sur Java 11</h4>
<p>Le but était d&rsquo;exécuter le service sur Java 11. En théorie, ce serait aussi simple que de mettre à jour le fichier Docker pour utiliser l&rsquo;image Java 11 et pousser l&rsquo;artifact en production. Cependant, dans la pratique, ce n’était pas si simple…</p>
<p>Tout d’abord, nous avons dû mettre à jour certains arguments de la JVM (le <a href="https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8180286" target="_blank" title="Remove the launchers data model flags" rel="noopener noreferrer">paramètre <code>-d64</code> est obsolète</a> et empêchera le service de démarrer, nous avons également dû mettre à jour l&rsquo;argument concernant les logs du Garbage Collector).</p>
<p>Ensuite, nous avons rapidement réalisé que les logs s&rsquo;étaient volatilisées dans Splunk pour notre environnement de production interne. En fait, elles apparaissaient dans le future alors qu&rsquo;il n&rsquo;y avait aucun soucis avec la production sur AWS. Nous avons dû mettre à jour la configuration logback pour corriger cette « distorsion temporelle » ;) en mettant à jour le <a href="https://logback.qos.ch/manual/layouts.html#date" target="_blank" title="Logback date patterns" rel="noopener noreferrer">date pattern</a> de <code>%d{ISO8601}</code> à <code>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ,UTC}</code>.</p>
<p>Une autre erreur étrange <code>VerifyError: Bad type on operand stack</code> a fait son apparition pendant le déploiement en production. AppDynamics empêchait le démarrage de certaines instances en raison d&rsquo;une manipulation exotique du bytecode. Pour des raisons encore inconnues, le déploiement échouait aléatoirement sur une des instances après avoir réussi sur plusieurs autres! Nous avons dû désactiver AppDynamics, ce qui nous convenait bien, car nous n’utilisons pas cet outil dans notre équipe.</p>
<p>Après la migration vers Java 11, nous avons également dû mettre à jour certains de nos tableaux de bord Grafana afin de refléter l&rsquo;utilisation d&rsquo;un nouveau Garbage Collector &#8211; G1.</p>
<p><br clear="none" /></p>
<h4>Conclusion</h4>
<p>Aujourd&rsquo;hui, 3 services fournissant les notifications utilisateur utilisant Spring Boot 2 et 1 service fournissant l&rsquo;en-tête et le pied de page du site utilisant Spring 5 fonctionnent sur Java 11, cela fait maintenant plusieurs semaines. Ils utilisent le Garbage Collector par défaut G1 et nous n&rsquo;avons rencontré aucun comportement étrange lié à la mémoire ou à tout autre problème de performance. Aussi, nous n’avons constaté aucune amélioration de nos temps de réponse. Mais maintenant nous utilisons une version Java LTS (support à long terme), la migration a été un succès.</p>
<p>Et après? <a href="https://openjdk.java.net/projects/jdk/12/" target="_blank" title="JDK 12" rel="noopener noreferrer">Java 12</a> sera publié en mars 2019. A ce jour, nous ne savons toujours pas si nous utiliserons cette version ou attendrons le prochain Java LTS. Cela dépendra probablement des fonctionnalités incluses.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/">Une migration Java 11 réussie</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/" rel="bookmark" title="QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java">QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" rel="bookmark" title="QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2011/10/13/java-ee-cdi-vs-spring/" rel="bookmark" title="Java EE &#038; CDI vs. Spring">Java EE &#038; CDI vs. Spring</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4998</post-id>	</item>
		<item>
		<title>Conseils pour sécuriser votre site WordPress</title>
		<link>https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/</link>
					<comments>https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Wed, 10 Oct 2018 17:43:41 +0000</pubDate>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[piratage]]></category>
		<category><![CDATA[pirate]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4945</guid>

					<description><![CDATA[<p>&#160;English version available Mise à jour 14 Janvier 2021 : Mise à jour des security headers, remplacement de « Feature-policy » par « Permissions-policy ». WordPress est l&#8217;un des systèmes de gestion de contenu (CMS) les plus populaires. Cette popularité signifie également que c&#8217;est une cible de choix pour les pirates. Dans cet article, je vais vous donner quelques [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/">Conseils pour sécuriser votre site WordPress</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2010/04/04/maven-site-one-step-further/" rel="bookmark" title="Plus loin avec le Maven Site">Plus loin avec le Maven Site</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/11/01/some-basic-rules-to-prevent-your-accounts-from-getting-hacked/" rel="bookmark" title="Quelques règles essentielles pour éviter de se faire pirater ses comptes">Quelques règles essentielles pour éviter de se faire pirater ses comptes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2012/05/11/first-steps-with-apache-camel/" rel="bookmark" title="Une première approche du Camel d&rsquo;Apache">Une première approche du Camel d&rsquo;Apache</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/15/optimize-your-website-for-print-in-5-minutes/" rel="bookmark" title="Optimiser votre site web pour l&rsquo;impression en 5 minutes">Optimiser votre site web pour l&rsquo;impression en 5 minutes</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2018/10/10/tips-to-make-your-wordpress-website-secure/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Mise à jour</strong><br />
<strong>14 Janvier 2021 : </strong> Mise à jour des security headers, remplacement de « Feature-policy » par « Permissions-policy ».
</div>
<p>WordPress est l&rsquo;un des systèmes de gestion de contenu (CMS) les plus populaires. Cette popularité signifie également que c&rsquo;est une cible de choix pour les pirates.<br />
Dans cet article, je vais vous donner quelques conseils pour protéger votre site web et éviter les attaques.</p>
<p><br clear="none" /></p>
<h4>1. Utiliser les dernières versions</h4>
<p>Cela est vrai pour WordPress, mais également pour toutes vos extensions. De nouvelles versions sont disponibles régulièrement. Si un plugin n&rsquo;a pas été mis à jour depuis un moment, il n&rsquo;est probablement plus maintenu et vous devriez sérieusement songer à le supprimer ou le remplacer. Dans une moindre mesure, ceci est également applicable pour votre thème.<br />
La version de PHP utilisée est également importante. Vérifiez auprès de votre fournisseur d&rsquo;hébergement que vous utilisez la dernière version de PHP (7.X), en particulier, <a href="https://www.php.net/supported-versions.php" target="_blank" title="Versions de PHP supportées" rel="noopener noreferrer">les versions 5.X ne seront plus supportées d&rsquo;ici la fin de l&rsquo;année</a>.<br />
Notez également que plus vous installez d&rsquo;extensions, plus vous prenez des risques, car votre configuration WordPress reposera sur davantage de code tiers. Vous ne devriez garder que les plugins dont vous avez vraiment besoin. Si un plugin est désactivé, ne conservez pas son code source et supprimez tous les fichiers associés.</p>
<p><br clear="none" /></p>
<h4>2. Utiliser des identifiants de connexion sécurisés</h4>
<p>Ne jamais utiliser l&rsquo;utilisateur admin par défaut. Si c&rsquo;est votre cas, désactivez ce compte et créez votre propre compte avec un nom d&rsquo;utilisateur personnalisé.<br />
Choisissez un <a href="https://blog.fabianpiau.com/fr/2013/11/01/some-basic-rules-to-prevent-your-accounts-from-getting-hacked/" target="_blank" title="Quelques règles essentielles pour éviter de se faire pirater ses comptes" rel="noopener noreferrer">mot de passe complexe</a>. Si plusieurs utilisateurs gèrent votre site Web, assurez-vous que les autorisations sont valides et évitez de donner le droit d’administration à tout le monde.</p>
<p><br clear="none" /></p>
<h4>3. Scanner votre site web</h4>
<p>C&rsquo;est un moyen facile et rapide de trouver des vulnérabilités et de voir si l&rsquo;un de vos plugins est vulnérable ou non. Vous pouvez utiliser ces 2 outils en ligne:</p>
<ul>
<li><a href="https://hackertarget.com/wordpress-security-scan/" target="_blank" title="WordPress Security Scan" rel="noopener noreferrer">WordPress Security Scan</a> (mon préféré avec un rapport détaillé)</li>
<li><a href="https://wpsec.com/" target="_blank" title="WPScans" rel="noopener noreferrer">WPSec</a></li>
</ul>
<p><br clear="none" /></p>
<h4>4. Utiliser des fichiers .htaccess pour protéger vos répertoires</h4>
<p>Le fichier <code>.htaccess</code> est un fichier de configuration pour le serveur. Il vous permet de définir des règles à suivre par celui-ci.</p>
<p>Par exemple, dans <code>/wp-content/uploads</code>, j&rsquo;ai créé le fichier <code>.htaccess</code> suivant:</p>
<pre class="brush: xml; title: ; notranslate">
# Refuser l'accès à tout par défaut
Order deny,allow
Deny from all

# Autoriser l'accès aux fichiers multimédia
&lt;FilesMatch '\.(jpg|jpeg|png|gif|bmp|zip|rar|pdf)$'&gt;
    Allow from all
&lt;/FilesMatch&gt;
</pre>
<p>Cette configuration garantit que seuls les fichiers multimédias sont accessibles à partir du navigateur. Tous les fichiers JavaScript et PHP seront non accessibles. Ce n&rsquo;est pas sans faille, car seule l&rsquo;extension est vérifiée, mais c&rsquo;est mieux que rien.</p>
<p>Pour éviter l&rsquo;exécution de code PHP malveillants dans certains dossiers (par exemple, dans <code>/wp-includes</code>), vous pouvez créer un autre fichier <code>.htaccess</code> avec le contenu suivant:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;Files *.php&gt;
Order allow,deny
Deny from all
&lt;/Files&gt;
</pre>
<p><br clear="none" /></p>
<h4>5. Vérifier les autorisations sur les fichiers et répertoires</h4>
<p>Assurez-vous que les fichiers critiques (<code>wp-config.php</code>, <code>php.ini</code>&#8230;) ne sont pas accessibles en écriture publiquement, mais en lecture seule. Seul le propriétaire devrait pouvoir écrire.</p>
<p><br clear="none" /></p>
<h4>6. Utiliser les « security headers »</h4>
<p>Vous pouvez consulter <a href="https://securityheaders.com/" target="_blank" title="Outil en ligne Security Headers" rel="noopener noreferrer">cet outil en ligne pour connaître quels headers vous supportez actuellement</a>.</p>
<p>Dans le dossier racine, mettez à jour le fichier <code>.htaccess</code> et ajoutez:</p>
<pre class="brush: xml; title: ; notranslate">
# Extra Security Headers
&lt;IfModule mod_headers.c&gt;
	Header set Strict-Transport-Security 'max-age=31536000; includeSubDomains'
	Header set X-XSS-Protection '1; mode=block'
	Header set X-Frame-Options 'sameorigin'
	Header set X-Content-Type-Options 'nosniff'
	Header unset Server
	Header always unset X-Powered-By
	Header unset X-Powered-By
	Header unset X-CF-Powered-By
	Header unset X-Mod-Pagespeed
	Header unset X-Pingback
&lt;/IfModule&gt;
</pre>
<p>Dans le fichier <code>wp-config.php</code>, ajoutez:</p>
<pre class="brush: xml; title: ; notranslate">
/** Extra Security */
header('X-Frame-Options: SAMEORIGIN');
header('X-XSS-Protection: 1; mode=block');
header('X-Content-Type-Options: nosniff');
header('Strict-Transport-Security:max-age=31536000; includeSubdomains; preload');
header('Referrer-Policy: no-referrer-when-downgrade');
header('Content-Security-Policy: upgrade-insecure-requests');
header('Permissions-Policy: autoplay=(), camera=(), encrypted-media=(), fullscreen=(), geolocation=(), microphone=(), midi=(), payment=()');
header_remove('X-Powered-By');
header_remove('Server');
header_remove('X-CF-Powered-By');
header_remove('X-Mod-Pagespeed');
header_remove('X-Pingback');
@ini_set('session.cookie_httponly', true);
@ini_set('session.cookie_secure', true);
@ini_set('session.use_only_cookies', true);
</pre>
<p><br clear="none" /></p>
<h4>7. Ne pas exposer trop d&rsquo;informations</h4>
<p>Dans le dossier racine de votre site Web, dans <code>php.ini</code>, ajoutez la ligne suivante:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
expose_php = Off
</pre>
<p>Votre version actuelle de PHP ne sera pas exposée.</p>
<p><br clear="none" /></p>
<h4>8. Sauvegarder votre site régulièrement</h4>
<p>Dernier conseil, mais non le moindre! Vous n&rsquo;avez pas besoin d&rsquo;un logiciel particulier ou d&rsquo;un plugin supplémentaire pour y parvenir.</p>
<ul>
<li>Avec votre outil FTP préféré (par exemple, <a href="https://filezilla-project.org/" target="_blank" title="Filezilla" rel="noopener noreferrer">Filezilla</a>), enregistrez tous les fichiers disponibles sur votre serveur.</li>
<li>Pour la base de données, utilisez la fonctionnalité de sauvegarde MySQL disponible. De nombreux hébergeurs fournissent un accès à phpMyAdmin, un outil en ligne.</li>
</ul>
<p>Je recommande de faire une sauvegarde tous les mois et de conserver l&rsquo;historique des 6 dernières sauvegardes dans un endroit sûr. Bien évidemment, cela dépend du volume d&rsquo;articles que vous écrivez et de l&rsquo;importance de vos données.</p>
<p><br clear="none" /></p>
<p>C&rsquo;est tout! Si vous avez fait tout ce qui précède, votre site Web devrait être plus résistant aux attaques. Dans le pire des cas, vous devriez pouvoir restaurer votre site facilement.</p>
<p>Bon blogage sécurisé!</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/">Conseils pour sécuriser votre site WordPress</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2010/04/04/maven-site-one-step-further/" rel="bookmark" title="Plus loin avec le Maven Site">Plus loin avec le Maven Site</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/11/01/some-basic-rules-to-prevent-your-accounts-from-getting-hacked/" rel="bookmark" title="Quelques règles essentielles pour éviter de se faire pirater ses comptes">Quelques règles essentielles pour éviter de se faire pirater ses comptes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2012/05/11/first-steps-with-apache-camel/" rel="bookmark" title="Une première approche du Camel d&rsquo;Apache">Une première approche du Camel d&rsquo;Apache</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/15/optimize-your-website-for-print-in-5-minutes/" rel="bookmark" title="Optimiser votre site web pour l&rsquo;impression en 5 minutes">Optimiser votre site web pour l&rsquo;impression en 5 minutes</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4945</post-id>	</item>
		<item>
		<title>Devoxx UK 2018 &#8211; Jour 2</title>
		<link>https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/</link>
					<comments>https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Wed, 06 Jun 2018 10:52:37 +0000</pubDate>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[londres]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4648</guid>

					<description><![CDATA[<p>&#160;English version available Cette année, j&#8217;ai assisté aux 2 jours de la conférence Devoxx UK à Londres les 10 et 11 mai. Cet article est un résumé des notes que j&#8217;ai prises pendant le deuxième jour. Vous pouvez lire l&#8217;article précédent à propos du premier jour. Et si vous souhaitez obtenir plus de détails sur [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/">Devoxx UK 2018 &#8211; Jour 2</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/" rel="bookmark" title="Attaques de robots: vous n&rsquo;êtes pas seul&#8230;">Attaques de robots: vous n&rsquo;êtes pas seul&#8230;</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/06/computing-jobs-simplified-overview/" rel="bookmark" title="Panorama simplifié des métiers de l&rsquo;informatique">Panorama simplifié des métiers de l&rsquo;informatique</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/" rel="bookmark" title="Architecture Microservices &#8211; Les bonnes pratiques">Architecture Microservices &#8211; Les bonnes pratiques</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2018/06/06/devoxx-uk-day-2/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Cette année, j&rsquo;ai assisté aux 2 jours de la conférence <a href="https://www.devoxx.co.uk/" target="_blank" title="Devoxx UK" rel="noopener noreferrer">Devoxx UK</a> à Londres les 10 et 11 mai. Cet article est un résumé des notes que j&rsquo;ai prises pendant le deuxième jour. Vous pouvez lire <a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" title="Devoxx UK 2018 - Day 1">l&rsquo;article précédent à propos du premier jour</a>. Et si vous souhaitez obtenir plus de détails sur un talk, vous pouvez regarder la vidéo associée.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00091/devoxx-3.jpg?ssl=1" rel="shadowbox[sbpost-4648];player=img;" title="Devoxx UK a eu lieu au Business Design Centre à Londres"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00091/devoxx-3-thumbnail.jpg?resize=550%2C367&#038;ssl=1" alt="Devoxx UK a eu lieu au Business Design Centre à Londres" title="Devoxx UK a eu lieu au Business Design Centre à Londres" width="550" height="367" class="size-medium wp-image-259" /></a><p class="wp-caption-text">Devoxx UK a eu lieu au Business Design Centre à Londres</p></div>
<p><br clear="none" /></p>
<h4>Deep Learning: The Future of Artificial Intelligence, avec Matthew Renze</h4>
<p>Par le passé, nous devions programmer un ordinateur de manière explicite, étape par étape, pour résoudre un problème (impliquant des instructions if-then, des boucles et d&rsquo;autres opérations logiques). A l&rsquo;avenir, les machines vont apprendre à résoudre un problème par elles-mêmes, nous devons juste leur fournir les données.</p>
<p><br clear="none" /></p>
<p><strong>Qu&rsquo;est ce que le Deep Learning?</strong></p>
<p>Deep Learning (apprentissage en profondeur en bon français) est une forme d&rsquo;Intelligence Artificielle (IA) qui utilise un type de Machine Learning (ML) appelé Réseau Neuronal Artificiel constitué de plusieurs couches cachées pour tenter d&rsquo;apprendre les représentations hiérarchiques des données sous-jacentes afin de faire des prédictions sur des données nouvelles.</p>
<p>L&rsquo;apprentissage automatique (ou Machine Learning) est essentiellement l&rsquo;utilisation des statistiques appliquées aux problèmes de l&rsquo;intelligence artificielle. Nous enseignons aux machines la résolution de problèmes en identifiant des modèles statistiques à partir des données.</p>
<p>Utilisation de <strong>Données</strong> (existantes) -> pour apprendre une <strong>Fonction</strong> -> afin d&rsquo;effectuer une <strong>Prédiction</strong> (sur des nouvelles données)</p>
<p>Un réseau de neurones est un algorithme ML basé sur une approximation très grossière de la façon dont nous pensons que le cerveau et les neurones fonctionnent (le cerveau est toujours une boîte noire pour les scientifiques).</p>
<p>Un neurone artificiel prend un ensemble d&rsquo;entrées, applique une fonction pour produire un ensemble de sorties. Nous représentons ce neurone mathématiquement (c&rsquo;est-à-dire que les entrées et les sorties sont des nombres) dans le but de l&rsquo;utiliser dans un modèle de calcul.</p>
<p>Un réseau de neurones est composé de plusieurs neurones organisés en différentes couches: la couche d&rsquo;entrée (les données que nous fournissons), 1 ou plusieurs couches cachées et la couche de sortie (la prédiction). Un réseau neuronal profond (deep neural network) a plus d&rsquo;une couche cachée. L&rsquo;utilisation de plus d&rsquo;une couche cachée permet principalement de modéliser une fonction beaucoup plus complexe qu&rsquo;avec une simple couche.</p>
<p><br clear="none" /></p>
<p><strong>Un exemple de Deep Learning</strong></p>
<p>Un exemple de réseau neuronal profond est un modèle de reconnaissance de personne basé sur une image. Les couches cachées inférieures représentent des formes abstraites comme les primitives géométriques (par exemple, les lignes horizontales et verticales) tandis que les couches intermédiaires représentent des entités plus complexes comme des parties spécifiques du corps (bouche, nez, oeil, etc.), le visage est représenté dans les couches cachées les plus hautes, pour être en mesure d&rsquo;identifier la personne. La précision augmente lorsque nous approchons de la dernière couche pour finalement être en mesure de faire une prédiction.</p>
<p><br clear="none" /></p>
<p><strong>Pourquoi parlons-nous de Deep Learning seulement maintenant?</strong></p>
<p>Après tout, le <a href="https://fr.wikipedia.org/wiki/Perceptron" target="_blank" title="Perceptron sur Wikipedia" rel="noopener noreferrer">premier algorithme ML Perceptron</a> a été créé en 1957, il y a plus de 60 ans!</p>
<ul>
<li>Nous vivons à l&rsquo;ère du Big Data. Au cours des deux dernières années, nous avons créé plus de données que pendant toute l&rsquo;histoire humaine. Nous n&rsquo;avons jamais eu autant de données disponibles, ces données sont essentielles pour entraîner des modèles complexes.</li>
<li>Les ordinateurs n&rsquo;ont jamais été aussi puissants: des processeurs plus rapides, plus de mémoire, des disques SSD. Nous pouvons aussi tirer parti de la puissance de calcul des GPU, les opérations matricielles sont nécessaires pour les graphismes des jeux vidéo, mais aussi pour le ML. Nous avons également accès à des technologies de calcul distribué où nous pouvons partager le traitement de données entre plusieurs machines.</li>
</ul>
<p><br clear="none" /></p>
<p><strong>Que pouvons-nous faire avec le Machine Learning?</strong></p>
<ul>
<li>Classification. Nous voulons prédire une variable discrète qui ne peut prendre qu&rsquo;un certain nombre de valeurs. Est-ce un chat ou un chien? Cet email est-il un spam ou non? Est-ce que cette personne a un cancer ou pas? Quelle est la catégorie de cet article?</li>
<li>Régression. Nous voulons prédire une variable continue qui a un nombre infini de valeurs possibles. A quel prix devrais-je vendre cette maison? Quel est le niveau de risque crédit pour ce demandeur?</li>
<li>Génération de texte. Générer le titre d&rsquo;un article, la description d&rsquo;une image en fonction de son contenu, convertir la voix en texte pour du sous-titrage automatique.</li>
<li>Génération d&rsquo;image. Simuler le vieillissement du visage, <a href="https://www.youtube.com/watch?v=IuygOYZ1Ngo" target="_blank" title="The Next Rembrandt" rel="nobox noopener noreferrer">peindre un nouveau Rembrandt</a> que même un expert ne pourrait pas identifier comme un faux, <a href="https://www.nytimes.com/interactive/2018/01/02/technology/ai-generated-photos.html" target="_blank" title="How an A.I. ‘Cat-and-Mouse Game’
Generates Believable Fake Photos" rel="noopener noreferrer">créer des célébrités</a> qui semblent familières, mais qui n&rsquo;existent pas, <a href="https://github.com/hanzhanggit/StackGAN" target="_blank" title="StackGAN: Text to Photo-realistic Image Synthesis" rel="noopener noreferrer">créer une image basée sur une description textuelle</a>.</li>
<li>Génération audio. <a href="https://www.youtube.com/watch?v=D5VN56jQMWM" target="_blank" title="Google Duplex: A.I. Assistant Calls Local Businesses To Make Appointments" rel="nobox noopener noreferrer">Mettre en relation un algorithme et un humain</a> lors d&rsquo;un appel téléphonique (Google Duplex), <a href="https://www.youtube.com/watch?v=I3l4XLZ59iw" target="_blank" title="#VoCo. Adobe MAX 2016 (Sneak Peeks) | Adobe Creative Cloud" rel="nobox noopener noreferrer">éditer votre voix</a> en fonction d&rsquo;un texte pour éviter de refaire un enregistrement dans le cas d&rsquo;une erreur dans votre speech.</li>
<li>Génération de vidéos. Basé sur des rushes de vidéos et d&rsquo;audios de Barack Obama, créer une <a href="https://www.youtube.com/watch?v=9Yq67CjDqvw" target="_blank" title="Synthesizing Obama: Learning Lip Sync from Audio" rel="nobox noopener noreferrer">nouvelle vidéo avec une synchronisation labiale gérée par l&rsquo;IA</a>.</li>
</ul>
<p>Si vous avez examiné plus en détail certains des exemples ci-dessus, vous avez probablement eu du mal à faire la différence entre un contenu réel et un contenu généré par ordinateur. C&rsquo;est assez effrayant quand on y pense et on peut à peine imaginer comment ça sera dans 10 ans!</p>
<p><br clear="none" /></p>
<p><strong>Comment puis-je commencer si je veux faire du ML dans mon entreprise?</strong></p>
<p><strong>Option 1 &#8211; Deep Learning as a Service</strong> (Google Cloud, AWS, Microsoft Cognitives, IBM Watson&#8230;)<br />
Cela implique qu&rsquo;une société tierce possède le modèle et les données. Vous pouvez interroger leur API avec vos nouvelles données afin de faire une prédiction.<br />
Cette option est utile pour les cas d&rsquo;utilisation restreints, si vous ne souhaitez pas réinventer la roue et utiliser un modèle déjà entrainé.<br />
Pour: Simple, rapide, peu coûteux<br />
Contre: Restriction sur les usages, éloigné (par exemple, vous n&rsquo;êtes pas protégé contre les pannes de réseau ou la latence), paiement à l&rsquo;usage (si votre utilisation augmente, le coût également)</p>
<p><strong>Option 2 &#8211; Deep Learning platform</strong> (Microsoft Azure, Cognitive Services&#8230;)<br />
Cette option est utile pour les cas d&rsquo;utilisation personnalisés. Vous uploadez vos données pour entraîner le modèle (transfert d&rsquo;apprentissage), puis vous pouvez interroger une API pour obtenir vos prévisions.<br />
Pour: Simple, rapide, peu coûteux<br />
Contre: Vous avez besoin de données d&rsquo;entraînement pour entraîner votre modèle, éloigné, paiement à l&rsquo;usage (par transaction pour la prédiction, mais aussi les transactions liées à l&rsquo;entraînement)</p>
<p><strong>Option 3 &#8211; Do it yourself</strong> (TensorFlow, Torch&#8230;)<br />
A utiliser si les options 1 et 2 ne suffisent pas. Vous créez votre propre algorithme à partir de zéro, fournissez les données et vous l&rsquo;hébergez vous-même.<br />
Pour: Personnalisé (vous pouvez optimiser et tuner le modèle comme vous l&rsquo;entendez), local, privé (au cas où vous avez affaire à des données sensibles)<br />
Contre: Complexe, pas mal de travail, cher</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/AktmFvRVPsI?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Teaching kids about machine learning, avec Dale Lane</h4>
<p>Dale a créé <a href="https://machinelearningforkids.co.uk/" target="_blank" title="Machine Learning for Kids" rel="noopener noreferrer">un site Web pour enseigner le Machine Learning aux enfants</a> en utilisant la plate-forme de programmation visuelle <a href="https://scratch.mit.edu/" target="_blank" title="Scratch - Imagine, Program, Share" rel="noopener noreferrer">Scratch</a>. Scratch est un moyen d&rsquo;aborder la programmation pour les enfants avec une interface simple où vous pouvez glisser/déposer des blocs représentant des opérations de programmation (boucles, déclarations if-then&#8230;) et les assembler pour créer une logique plus avancée. Dale utilise <a href="https://en.scratch-wiki.info/wiki/ScratchX" target="_blank" title="Experimental Extensions to Scratch!" rel="noopener noreferrer">ScratchX</a> (extensions expérimentales pour Scratch) et a créé de nouveaux blocs liés au Machine Learning (en utilisant IBM Watson sous le capot).</p>
<p><br clear="none" /></p>
<p>Il a imaginé de nombreux exercices pour que les enfants puissent appréhender les différents concepts de ML en utilisant des exemples concrets et amusants. Les exercices mélangent la reconnaissance de texte, de nombre et d&rsquo;image. Chaque exercice est généralement composé d&rsquo;une phase d&rsquo;entraînement du modèle depuis l&rsquo;application web et d&rsquo;une phase d&rsquo;évaluation avec la prédiction visualisable depuis Scratch. Vous pouvez également affiner les données d&rsquo;entraînement et voir les effets sur le modèle et sa prédiction.</p>
<ul>
<li>Créer un chatbot, par ex. un animal capable de répondre à des questions sur son espèce.</li>
<li>Prédire à partir de quel journal un article a été extrait en utilisant son titre.</li>
<li>Faire en sorte que Pacman évite les fantômes en jouant plusieurs fois au jeu. Plus vous jouez et entraînez le modèle, plus Pacman sera bon.</li>
<li>Catégoriser des images. Uploader des images de tasses et de voitures pour entraîner le modèle, de sorte qu&rsquo;il puisse classer une nouvelle image encore inconnue dans une de ces 2 catégories. Uploader des images de couverture de livres pour différentes catégories (science-fiction, romance, thriller&#8230;), de sorte que le modèle puisse prédire la catégorie d&rsquo;une nouvelle couverture. Pour rendre l&rsquo;exercice plus interactif, vous pouvez également uploader des images à partir de la webcam, par exemple prendre des photos de votre main pour le jeu pierre / papier / ciseaux et jouer contre l&rsquo;ordinateur. L&rsquo;algorithme reconnaîtra la forme que vous faites avec vos mains si vous l&rsquo;entraînez suffisamment.</li>
<li>Reconnaître un code postal écrit à la main pour savoir dans quelle ville le courrier doit être livré, un bon exemple tiré de la vraie vie.</li>
<li>Jouer au jeu « Où est Charlie? ». L&rsquo;ordinateur détecte automatiquement où Scratch le chat est situé dans une image.</li>
<li>Et beaucoup d&rsquo;autres exercices.</li>
</ul>
<p><br clear="none" /></p>
<p>Dale a également mentionné les problèmes liés à l&rsquo;IA:</p>
<ul>
<li>Les problèmes avec l&rsquo;arrière-plan ou les conditions météorologiques. Si c&rsquo;est évident pour un humain, un ordinateur peut commettre des erreurs idiotes si le jeu de données d&rsquo;entraînement est incomplet.</li>
<li>L&rsquo;histoire des chars russes où le modèle a été entraîné avec des images haute résolution pour les chars américains, mais avec des images basse résolution et floues pour les chars russes. Dans la réalité, le modèle s&rsquo;est avéré être mauvais pour identifier les chars.</li>
<li>Google photo peut ajouter automatiquement un texte pour décrire une image, certaines personnes noires se sont vu être qualifié de gorilles&#8230;</li>
<li>Un modèle qui peut conseiller des médicaments, mais qui est sponsorisé par un géant pharmaceutique. Que se passe-t-il si l&rsquo;entreprise demande d&rsquo;ajouter plus de références de son produit phare dans le jeu d&rsquo;entraînement, est-ce une bonne chose?</li>
</ul>
<ul>
<p>Il y a beaucoup de notions importantes autour de l&rsquo;éthique, des préjugés, du surajustement (overfitting) des modèles et de la qualité du jeu d&rsquo;entraînement. Il est important que les enfants comprennent cela par eux-mêmes, et habituellement c&rsquo;est le cas!</p>
<p><br clear="none" /></p>
<p>A la fin, Dale nous a donné quelques liens pour aller plus loin:</p>
<ul>
<li><a href="https://machinelearningforkids.co.uk" target="_blank" title="Machine Learning for Kids" rel="noopener noreferrer">Machine Learning for Kids</a> le site de Dale où vous pouvez trouver tous ses exercices.</li>
<li><a href="https://teachablemachine.withgoogle.com" target="_blank" title="Teachable Machine from Google" rel="noopener noreferrer">Teachable Machine from Google</a> pour entraîner un modèle avec votre webcam.</li>
<li><a href="https://quickdraw.withgoogle.com" target="_blank" title="Quick, Draw! from Google" rel="noopener noreferrer">Quick, Draw! from Google</a> pour reconnaître un dessin.</li>
<li><a href="https://www.moralmachine.net/" target="_blank" title="Moral Machine - MIT" rel="noopener noreferrer">Moral Machine from MIT</a> pour juger différentes situations impliquant une voiture autonome.</li>
</ul>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/h2KqwwfKOuY?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Easy Microservices with JHipster, avec Sendil Kumar N</h4>
<p>Cette présentation était une session de live-coding. J&rsquo;ai entendu parler de <a href="https://www.jhipster.tech/" target="_blank" title="JHipster, Generate your Spring Boot + Angular/React applications!" rel="noopener noreferrer">JHipster</a> depuis pas mal de temps, mais je n&rsquo;ai jamais eu l&rsquo;occasion de le voir en action et le fait que le projet ait été initié par un développeur français était une autre raison d&rsquo;y aller.</p>
<p>JHipster accélère la création de nouvelles applications en générant le code boilerplate et en gérant la majeure partie de la configuration (par exemple la configuration des fichiers Kubernetes, des POM Maven, etc.). Il s&rsquo;agit d&rsquo;un outil en ligne de commande avec lequel vous pouvez choisir de créer une application de type monolithe, un microservice ou un UAA (User Accounting and Authorizing service pour sécuriser votre app avec OAuth2). Une fois que vous avez choisi votre type d&rsquo;application, beaucoup d&rsquo;options s&rsquo;offrent à vous pour la stack technique: frontend, backend, source de données, build, logging, déploiement CI/CD, registre de service, documentation (par exemple <a href="https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/" title=" Swagger, la documentation API automatisée ">Swagger</a>) sans oublier les frameworks de tests.</p>
<p>Pour la démo, Sendil a créé une application Gateway qui interrogeait un microservice. Il a exécuté l&rsquo;application localement et l&rsquo;a ensuite déployé sur Google Cloud Platform (GCP) via Kubernetes, sans avoir à taper une seule ligne de code.</p>
<p>Choisir les frameworks et les technologies sera probablement la partie la plus difficile, car il y a tellement d&rsquo;options. Vous devez également garder à l&rsquo;esprit que vous devez affiner la configuration (par exemple, la configuration par défaut qu&rsquo;ils fournissent pour Kubernetes peut ne pas convenir à vos besoins).</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/zW4GOiZUKuE?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Troubleshooting &#038; Debugging Production Microservices in Kubernetes, avec Ray Tsang</h4>
<p>Ray nous montre une petite application de livre d&rsquo;or où un utilisateur peut poster un message avec un nom (« Guestbook service ») et recevoir également des salutations après avoir posté son message (« Hello service »). Il s&rsquo;agit d&rsquo;une application Spring Boot déployée sur Kubernetes, composée d&rsquo;une interface utilisateur et de 2 microservices (chacun a plusieurs instances). Une page d&rsquo;erreur 500 apparaît quand il essaye d&rsquo;y accéder en indiquant <code>null</code> et 404. Cette fois, ce n&rsquo;était pas un effet démo où la loi de Murphy en action et cela faisait bien partie de la présentation. Il a donc continué pour débugger l&rsquo;application et résoudre le problème étape par étape en utilisant <a href="https://cloud.google.com/products/" target="_blank" title="Products and Services provided by Google Cloud" rel="noopener noreferrer">différents outils fournis par Google Cloud Platform</a>.</p>
<p><br clear="none" /></p>
<p>En consultant les logs, il a pu identifier 2 instances du service gérant l&rsquo;interface utilisateur qui avaient beaucoup d&rsquo;erreurs par rapport aux autres instances. Kill/restart n&rsquo;est pas la solution, car elle n&#8217;empêchera pas l&rsquo;erreur de se reproduire. Il a donc décidé de sortir l&rsquo;une des instances défectueuses du load balancer avec une commande <code>kubectl</code> (une interface en ligne de commande pour exécuter des commandes sur les clusters Kubernetes) en changeant le flag <code>serving</code> à false. L&rsquo;idée est d&rsquo;isoler l&rsquo;instance du trafic de production et d&rsquo;être libre de la déboguer. Notez qu&rsquo;en désactivant cette instance, Kubernetes crée automatiquement une autre instance du service. Ensuite, il a configuré la redirection de port sur ce pod pour pouvoir interroger cette instance spécifique depuis son environnement local. Avec Stackdriver Trace, il était capable de tracer les appels et identifier la pile d&rsquo;appel. Filtrant sur les erreurs 5xx et cette instance particulière, il a alors réalisé qu&rsquo;un problème survenait au niveau du service « Hello service » et plus précisément quand l&rsquo;endpoint « hello » est appelé, dans certains cas, une réponse 404 est retournée. Cela semblait être le cas lorsque le nom était manquant. Pour confirmer le comportement, il a ajouté quelques lignes de logs à la volée pour afficher le nom et, en effet, celui-ci était vide et l&rsquo;application affichait l&rsquo;erreur. En fait, une validation manquait sur le formulaire pour rendre le nom obligatoire.</p>
<p><br clear="none" /></p>
<p>Pour récapituler, nous pouvons mentionner <a href="https://cloud.google.com/products/operations" target="_blank" title="Monitoring, logging, and diagnostics for applications on Cloud Platform and AWS" rel="noopener noreferrer">les 4 principaux outils de débogage fournis avec GCP</a>:</p>
<ul>
<li>Interroger et consulter les logs avec Stackdriver Logging (un outil similaire à Splunk)</li>
<li>Tracer la pile d&rsquo;appels avec Stackdriver Trace (un outil similaire à Zipkin)</li>
<li>Ajouter des logs et des breakpoints à la volée sur une instance en prod avec Stackdriver Debug</li>
<li>Accéder à l&rsquo;historique des erreurs http depuis les logs ainsi que diverses métriques sur les services (temps de réponse&#8230;) avec Stackdriver Monitoring</li>
</ul>
<p><br clear="none" /></p>
<p>La présentation fut intéressante, mais je peux juste regretter que le titre ne mentionnait pas le fait que la démo se basait principalement les outils commerciaux de Google Cloud, je pensais qu&rsquo;elle serait plus centrée sur Kubernetes. Mais cela vaut quand même la peine de savoir ce que Google fournit. Et je dois admettre qu&rsquo;ajouter des breakpoints et des logs dans le code d&rsquo;une instance en prod à partir d&rsquo;une interface web était assez impressionnant.</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/59yCUlQAe-s?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Fully serverless, a case study, avec Stephen Colebourne &#038; Chris Kent</h4>
<p>A OpenGamma, ils ont créé une nouvelle plate-forme financière basée sur AWS et décidé d&rsquo;utiliser les technologies serverless (<a href="https://aws.amazon.com/lambda/" target="_blank" title="AWS Lambda" rel="noopener noreferrer">AWS Lambda</a>).</p>
<p><br clear="none" /></p>
<p><strong>Qu&rsquo;est-ce que l&rsquo;informatique sans serveur et Lambda?</strong></p>
<p>Serverless est essentiellement lorsque l&rsquo;infrastructure est invisible, vous ne savez pas où le code s&rsquo;exécute et vous n&rsquo;avez pas le contrôle.<br />
Une AWS Lambda est fondamentalement constituée de 2 classes: une interface simple et son implémentation, où vous implémentez la méthode <code>handleRequest</code>. La Lambda est détruite une fois la méthode terminée.<br />
Vous packagez le code dans un JAR (qui inclut toutes les dépendances nécessaires) et l&rsquo;uploadez dans AWS pour qu&rsquo;elle soit exécutée.</p>
<p><br clear="none" /></p>
<p><strong>Comment déclencher une Lambda?</strong></p>
<ul>
<li>Vous pouvez utiliser <a href="https://aws.amazon.com/cloudwatch/" target="_blank" title="Amazon CloudWatch" rel="noopener noreferrer">CloudWatch</a> (similaire à un CRON).</li>
<li>Vous pouvez utiliser un événement. Il peut s&rsquo;agir d&rsquo;un appel d&rsquo;API REST, un fichier est enregistré dans AWS S3, un message arrive dans une queue, une ligne est ajoutée à une table ou un appel directement à partir d&rsquo;une autre Lambda&#8230;</li>
</ul>
<p><br clear="none" /></p>
<p><strong>Limites, des limites partout!</strong></p>
<p>Lorsque vous travaillez avec des Lambdas, vous devez être très prudent avec <a href="https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html" target="_blank" title="AWS Lambda Limits" rel="noopener noreferrer">les limites AWS Lambda</a>.</p>
<ul>
<li>Un délai d&rsquo;exécution par défaut: 5 minutes</li>
<li>Une quantité maximale de mémoire que vous pouvez utiliser: 3Go</li>
<li>Une taille maximale pour un fichier JAR que vous pouvez uploader: 50Mo</li>
<li>Un maximum d&rsquo;espace disque que vous pouvez utiliser: 512Mo</li>
</ul>
<p><br clear="none" /></p>
<p>Pour certains traitements lourds spécifiques, ils ont atteint la plupart de ces limites et ils ont dû trouver des solutions de contournement ou même des alternatives:</p>
<ul>
<li>L&rsquo;utilisation d&rsquo;<a href="https://aws.amazon.com/batch/" target="_blank" title="AWS Batch - Fully Managed Batch Processing at Any Scale" rel="noopener noreferrer">AWS Batch</a> au lieu de Lambda. L&rsquo;inconvénient est qu&rsquo;ils ne peuvent pas déclencher le traitement instantanément, par exemple lorsque vous soumettez un job Batch, il sera traité à un moment donné, mais vous ne pouvez pas supposer que cela sera instantané (cela peut prendre 2 ou même 10 minutes avant l&rsquo;exécution). Cette limitation n&rsquo;était pas un problème pour eux, évidemment cela ne marchera pas pour tout le monde.</li>
<li>Divisez et prétraitez autant que possible les données en entrée avant de les transmettre à la Lambda. La Lambda ne devrait pas avoir à faire de prétraitement lourd en CPU ou avec une empreinte mémoire forte. De plus, comme les données sont chargées à la demande, cela introduit un peu de latence, mais c&rsquo;était acceptable pour eux.</li>
<li>Au lieu de passer une copie des données entre les Lambdas qui peuvent être coûteuses en mémoire/réseau, ils sauvegardent les données dans S3 et ensuite utilisent une référence (métadonnées).</li>
</ul>
<p>La plateforme est actuellement constituée de 4 services, formés d&rsquo;un total de 23 Lambdas et 2 Batch.</p>
<p><br clear="none" /></p>
<p><strong>Retour d&rsquo;expérience</strong></p>
<p>La scalabilité automatique (automatic scaling) avec Lambda est le principal avantage. C&rsquo;est totalement transparent et géré par AWS. Quand il y a beaucoup de requêtes, des Lambdas sont créées et partagent la charge. Lorsque toutes les demandes ont été traitées, les Lambdas sont détruites (pour atteindre 0 lorsqu&rsquo;elles sont inactives). Cependant, ce n&rsquo;est pas une solution miracle, car vous pouvez avoir un goulot d&rsquo;étranglement à un autre niveau de votre système (par exemple, votre base de données est trop lente) et vous ne pourrez pas exploiter pleinement l&rsquo;élasticité des Lambdas.</p>
<p>Un inconvénient des Lambdas est le démarrage à froid (cold start), il leur faut du temps pour démarrer. En fait, une Lambda n&rsquo;est pas vraiment détruite une fois le traitement terminé, car elle peut être réutilisée pour la prochaine requête, AWS dispose d&rsquo;un mécanisme pour maintenir en vie, ce qui signifie que les Lambdas restent disponibles généralement quelques minutes après leur exécution. Ils ont donc décidé d&rsquo;appeler la Lambda avec un volume de données négligeable toutes les minutes pour la garder disponible et « tiède ». Évidemment, c&rsquo;est un hack et ce n&rsquo;est pas garanti que cela marchera encore dans le futur, mais Chris nous a dit que c&rsquo;était une pratique assez commune parmi les développeurs&#8230;</p>
<p>Pour le débogage, les choses ne sont pas faciles, vous devez déployer sur AWS pour tester votre code. De nos jours, il existe des bibliothèques et des frameworks pour vous aider.</p>
<p>Les logs des Lambdas sont indexées dans AWS CloudWatch Logs. D’après eux, l&rsquo;expérience utilisateur de cet outil n&rsquo;est pas génial, ils ont donc créé une Lambda pour copier les logs d&rsquo;AWS vers un outil d&rsquo;agrégation dédié: <a href="https://www.sumologic.com/" target="_blank" title="Sumo Logic: Log Management and Security Analytics, Continuous Intelligence" rel="noopener noreferrer">Sumo Logic</a>, un outil de type Splunk. Pour les alertes et le monitoring, ils utilisent CloudWatch Metrics et ils ont également configuré des alertes dans Sumo Logic pour faciliter la recherche dans les logs.</p>
<p>Construire une architecture à partir de petites pièces simples pousse la complexité ailleurs au niveau de l&rsquo;infrastructure (pendant la construction) et aussi vers les interactions entre les composants (pendant l&rsquo;exécution). Le monitoring et la mise en place d&rsquo;alertes sont également plus complexes à mesure que le système devient encore plus fragmenté. Il est important de garder à l&rsquo;esprit qu&rsquo;une Lambda a des limites très restrictives, aller au-dessus de l&rsquo;une d&rsquo;entre elles et votre Lambda sera tuée. Notez que les limites évoluent et sont levées au fil du temps. La technologie est encore jeune et l&rsquo;outillage et les frameworks disponibles assez limités, mais vu le niveau d&rsquo;excitation autour des Lambdas, il est clair que cela va s&rsquo;améliorer.</p>
<p>D&rsquo;un autre côté, vous n&rsquo;avez pas besoin de penser aux serveurs et à leur maintenance. L&rsquo;auto scaling est transparent et gère automatiquement la charge. Lambda vous permet de réaliser d&rsquo;importantes économies, par exemple, si votre système est spécifique à un pays, vous savez que le trafic sera très limité pendant la nuit. Enfin, le modèle de programmation est très simple, juste un fichier JAR juste une fonction.</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/8mj-Q_oknd8?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<p>Ce deuxième jour à Devoxx était génial, surtout les talks du matin sur le Machine Learning. Je suis sorti de ces 2 jours avec beaucoup d&rsquo;idées innovantes. Merci Devoxx UK et peut-être à l&rsquo;année prochaine!</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00091/devoxx-4.jpg?ssl=1" rel="shadowbox[sbpost-4648];player=img;" title="Keynote de clôture - Merci Devoxx UK!"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00091/devoxx-4-thumbnail.jpg?resize=550%2C367&#038;ssl=1" alt="Keynote de clôture - Merci Devoxx UK!" title="Keynote de clôture - Merci Devoxx UK!" width="550" height="367" class="size-medium wp-image-260" /></a><p class="wp-caption-text">Keynote de clôture - Merci Devoxx UK!</p></div>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/">Devoxx UK 2018 &#8211; Jour 2</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/" rel="bookmark" title="Attaques de robots: vous n&rsquo;êtes pas seul&#8230;">Attaques de robots: vous n&rsquo;êtes pas seul&#8230;</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/06/computing-jobs-simplified-overview/" rel="bookmark" title="Panorama simplifié des métiers de l&rsquo;informatique">Panorama simplifié des métiers de l&rsquo;informatique</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/" rel="bookmark" title="Architecture Microservices &#8211; Les bonnes pratiques">Architecture Microservices &#8211; Les bonnes pratiques</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4648</post-id>	</item>
		<item>
		<title>Devoxx UK 2018 &#8211; Jour 1</title>
		<link>https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/</link>
					<comments>https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Mon, 21 May 2018 21:46:35 +0000</pubDate>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[londres]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4587</guid>

					<description><![CDATA[<p>&#160;English version available Cette année, j&#8217;ai assisté aux 2 jours de la conférence Devoxx UK à Londres les 10 et 11 mai. Cet article est un résumé des notes que j&#8217;ai prises pendant le premier jour. Si vous souhaitez obtenir plus de détails sur un talk, vous pouvez regarder la vidéo associée. A Future without [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/">Devoxx UK 2018 &#8211; Jour 1</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" rel="bookmark" title="QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/02/20/fosdem-2013-impressions/" rel="bookmark" title="Retour sur Fosdem 2013">Retour sur Fosdem 2013</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2018/05/21/devoxx-uk-day-1/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Cette année, j&rsquo;ai assisté aux 2 jours de la conférence <a href="https://www.devoxx.co.uk/" target="_blank" title="Devoxx UK" rel="noopener noreferrer">Devoxx UK</a> à Londres les 10 et 11 mai. Cet article est un résumé des notes que j&rsquo;ai prises pendant le premier jour. Si vous souhaitez obtenir plus de détails sur un talk, vous pouvez regarder la vidéo associée.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00090/devoxx-1.jpg?ssl=1" rel="shadowbox[sbpost-4587];player=img;" title="Devoxx UK a eu lieu au Business Design Centre à Londres"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00090/devoxx-1-thumbnail.jpg?resize=550%2C367&#038;ssl=1" alt="Devoxx UK a eu lieu au Business Design Centre à Londres" title="Devoxx UK a eu lieu au Business Design Centre à Londres" width="550" height="367" class="size-medium wp-image-259" /></a><p class="wp-caption-text">Devoxx UK a eu lieu au Business Design Centre à Londres</p></div>
<p><br clear="none" /></p>
<h4>A Future without Servers, avec Danilo Poccia</h4>
<p><strong>Comment construire le meilleur logiciel avec la meilleure expérience utilisateur?</strong></p>
<p>Travailler « en arrière » à partir des besoins du client (work backwards). Avant de commencer toute implémentation:</p>
<ol>
<li>Ecrire le Communiqué de presse</li>
<li>Ecrire la FAQ</li>
<li>Définir l&rsquo;Expérience client</li>
<li>Ecrire le Manuel de l&rsquo;utilisateur</li>
</ol>
<p>L&rsquo;idée est de rendre votre système simple. Un système complexe était simple au début, il est devenu complexe!</p>
<p><strong>L&rsquo;architecture change:</strong></p>
<ul>
<li>Il y a 10 ans: nous splittons nos applications monolithes en utilisant XML et SOAP pour la communication</li>
<li>Il y a 5 ans: nous créons des architectures micro services en utilisant REST / JSON ou un protocole binaire pour la communication</li>
<li>Maintenant: nous construisons des architectures événementielles (event-driven) avec des fonctions éphémères</li>
</ul>
<p><strong>Qu&rsquo;en est-il des données?</strong></p>
<p>Les référentiels de données deviennent des sources d&rsquo;événements. Chaque événement est une information immuable du métier.</p>
<p>Il y a une évolution de ACID (Atomic, Consistent, Isolated, Durable) vers ACID 2.0 (Associative, Commutative, Idempotent, Distributed).</p>
<p>Avec la conception pilotée par les événements, nous pensons cause / effet plutôt que qui déclenche quoi: « Le service B est causé par A » au lieu de « Service A déclenche B ». Nous utilisons un mécanisme de notification et d&rsquo;accusé de réception.</p>
<p><strong>Alors, à quoi ressemblera le futur?</strong></p>
<p>Nous écrirons seulement le code de logique métier!</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/Ztjdnqf-674?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Let&rsquo;s Get Lazy: Exploring the Real Power of Streams, avec Venkat Subramaniam</h4>
<p>Venkat Subramaniam est un très bon speaker. C&rsquo;était la première fois que je l&rsquo;écoutais et j&rsquo;ai été impressionné par sa façon de présenter, je vous suggère de regarder une de ses vidéos.</p>
<p>Haskell est un langage paresseux par défaut, les opérations qui peuvent être différées le seront. Avec Scala, c&rsquo;est possible en utilisant le mot-clé « lazy ». Mais qu&rsquo;en est-il de Java? Le mot-clé « lazy » n&rsquo;existe pas, mais c&rsquo;est possible avec le code fonctionnel et les streams introduits avec Java 8.</p>
<p>Le code impératif a une cérémonie haute et une complexité accidentelle. Vous dites quoi faire et comment le faire.</p>
<p>Le code fonctionnel a moins de cérémonie et moins de complexité. Vous dites quoi faire et c&rsquo;est tout. Le code est très facile à lire de haut en bas.</p>
<p>Cependant, si le code est « joli », il peut ne pas être durable. Alors qu&rsquo;en est-il de la performance? Par exemple, est-ce que nous traitons toute la collection pour ne prendre que le premier élément? <code>FindFirst()</code> est l&rsquo;opération d&rsquo;exécution terminale. Jusqu&rsquo;à ce que nous l&rsquo;appelions, rien (c&rsquo;est-à-dire toutes les opérations intermédiaires) ne sera exécuté.</p>
<p>Un stream n&rsquo;exécute pas de fonction pour chaque objet de la collection, mais il exécute une collection de fonctions pour chaque objet, mais seulement quand c&rsquo;est nécessaire.</p>
<p>Un stream n&rsquo;est pas une collection d&rsquo;objets, c&rsquo;est une collection de fonctions.</p>
<p>Les lambdas sont stateless.</p>
<pre class="brush: java; highlight: [3]; title: ; notranslate">
List&lt;Integer&gt; numbers = Arrays.asList(1, 2, 3);
Stream&lt;Integer&gt; stream = numbers.stream()
                            .map (e -&gt; e * 2); // Ceci est une lambda
stream.forEach(System.out::println);
</pre>
<p>Les closures portent les états immuables, soyez très prudent en les utilisant.</p>
<pre class="brush: java; highlight: [4]; title: ; notranslate">
List&lt;Integer&gt; numbers = Arrays.asList(1, 2, 3);
final int factor = 2;
Stream&lt;Integer&gt; stream = numbers.stream()
                            .map (e -&gt; e * factor); // Ceci est une closure
stream.forEach(System.out::println);
</pre>
<p>La paresse rend possible l&rsquo;utilisation de stream infini, sinon le programme ci-dessous serait une boucle infinie.</p>
<pre class="brush: java; highlight: [1]; title: ; notranslate">
Stream&lt;Integer&gt; infiniteStream = Stream.iterate(0, e -&gt; e + 1);
List&lt;Integer&gt; numbers = infiniteStream 
                          .limit(5)
                          .collect(Collectors.toList());
</pre>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/ekFPGD2g-ps?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Kotlin for Java Programmers, avec Venkat Subramaniam</h4>
<p>Je suis resté dans la même salle, car j&rsquo;ai beaucoup apprécié le premier talk de Venkat. Avec la même façon de présenter, cette deuxième présentation était toute aussi bonne.</p>
<p>Comme je n&rsquo;ai jamais expérimenté Kotlin, c&rsquo;était une bonne introduction pour moi. Ce langage basé sur la JVM devient vraiment populaire de nos jours, d&rsquo;autant plus que Jetbrain le pousse pour être le langage principal pour la programmation Android. Venkat nous a donné beaucoup d&rsquo;astuces pour rendre le code concis et nous a suggéré de jouer nous-mêmes avec en utilisant le REPL (kotlinc). Sans doute moins verbeux que Java et livré avec des fonctionnalités intéressantes (notamment la gestion des null et le lazy&#8230;). Je vais probablement l&rsquo;essayer à un moment donné.</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/KvmlP3ReZcA?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>How to use AI and Java to train your application to recognize people by name, avec Ruth Yakubu</h4>
<p>Ruth nous a présenté <a href="https://azure.microsoft.com/en-gb/services/cognitive-services/face/" target="_blank" title="Microsoft Face API" rel="noopener noreferrer">Microsoft Face API</a> qui s’exécute sur la plate-forme de cloud computing Azure (bien évidement de Microsoft). Face API est l&rsquo;un des services « cognitifs » fournit par Microsoft, par ex. il existe un service pour reconnaître la parole et traiter le langage naturel.</p>
<p>Elle nous a montré une application écrite avec Spring Boot qui interagit avec Face API. Tout d&rsquo;abord, elle a uploadé une série de photos de l&rsquo;acteur Matthew McConaughey (si vous ne le connaissez pas, il était le personnage principal dans Interstellar) pour former le modèle. Puis elle a uploadé une nouvelle photo de lui et de sa femme que le système ne connaissait pas encore. L&rsquo;algorithme a reconnu l&rsquo;acteur avec une grande précision alors qu&rsquo;il ne savait pas qui était la femme l&rsquo;accompagnant, mais il a été capable de donner une description précise d&rsquo;elle (une femme souriante dans la trentaine, etc.).</p>
<p>Il est possible de créer votre propre algorithme d&rsquo;apprentissage automatique avec Java, par exemple en utilisant la bibliothèque <a href="https://deeplearning4j.konduit.ai" target="_blank" title="DeepLearning4J" rel="noopener noreferrer">DeepLearning4J</a>. Lors de la formation d&rsquo;un modèle, il est important de séparer les données en 2 groupes, les données d’entraînement (80%) et les données de test (20%) afin de pouvoir vérifier que votre modèle a une bonne prédiction. Il est également important d&rsquo;utiliser les GPUs et pas seulement les CPUs pour améliorer les performances, maintenant les bibliothèques en profitent, y compris <a href="https://deeplearning4j.konduit.ai/multi-project/explanation/configuration/backends" target="_blank" title="DeepLearning4J using the GPU" rel="noopener noreferrer">DL4J</a>.</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/bzSqrmefnV0?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Building a self-driving RC car, avec Tim van Eijndhoven</h4>
<p>Ce fut une présentation intéressante pour suivre l’expérience de Tim et son équipe qui se sont lancés dans la création d&rsquo;une voiture (jouet) autonome sans chauffeur basée sur un kit Radio Control (RC). Ils ont construit ce prototype dans le cadre d&rsquo;un challenge. L&rsquo;idée est que la voiture conduise de manière autonome et suive un itinéraire (tracé délimité par 2 lignes blanches) avec des courbes et des obstacles potentiels.</p>
<blockquote><p>Si Tesla peut le faire, alors pourquoi pas nous? À notre échelle, bien sûr&#8230;</p></blockquote>
<p>En plus du kit RC, ils ont ajouté un Raspberry Pi, un convertisseur de puissance/alimentation, une caméra et un mécanisme d&rsquo;arrêt d&rsquo;urgence (utile quand la voiture est hors de portée du WiFi et peut se crasher n&rsquo;importe où&#8230;). Le budget total est d&rsquo;environ 300 euros.</p>
<p>En ce qui concerne les technologies, ils ont utilisé:</p>
<ul>
<li>Vert.x, application réactive sur la JVM, événementielle et non bloquante</li>
<li>La librairie OpenCV (Computer Vision) pour traiter le flux vidéo en temps réel et s&rsquo;assurer que la voiture reste entre les lignes blanches</li>
</ul>
<p>Il y a beaucoup de choses à penser, l&rsquo;environnement est probablement la variable la plus incertaine. L&rsquo;algorithme peut se tromper en fonction de:</p>
<ul>
<li>La surface (moquette à motifs, carreaux, route sombre)</li>
<li>Le temps (ensoleillé, pluvieux, le programme est très sensible au changement de luminosité)</li>
<li>Et d&rsquo;autres facteurs (réflexion sur une fenêtre, effet miroir)</li>
</ul>
<p>Ils ont beaucoup d&rsquo;idées d&rsquo;amélioration pour le futur:</p>
<ul>
<li>Il n&rsquo;est pas nécessaire d&rsquo;analyser toutes les images provenant du flux vidéo (en particulier sur une ligne droite). Actuellement, ils analysent une image toutes les 100ms (pourquoi 100ms?) Car c&rsquo;est le temps qu&rsquo;il faut pour en traiter une)</li>
<li>Il n&rsquo;est pas nécessaire d&rsquo;analyser toute l&rsquo;image (certaines parties peuvent être ignorées, ce qui est au-dessus de l&rsquo;horizon n&rsquo;est pas nécessaire par exemple)</li>
<li>Déporter la logique de calcul sur la voiture elle-même au lieu d&rsquo;un ordinateur portable sur le WiFi, pour éviter la latence du réseau (cependant la puissance de calcul de Raspberry Pi peut être limitée)</li>
<li>Utiliser l&rsquo;IA et le Deep Learning pour que la voiture puisse apprendre à naviguer en utilisant des vidéos d&rsquo;entraînement: des vidéos lorsque la voiture est contrôlée à distance par un humain (cependant, cela peut prendre beaucoup de temps et de nombreuses vidéos seront nécessaires sur des circuits et avec des conditions différentes)</li>
</ul>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/oR_YHca8Mt0?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<h4>Cloud Native Java, part deux, avec Josh Long</h4>
<p>Josh est Spring Developer Advocate chez Pivotal, c&rsquo;était la première fois que j&rsquo;assistais à une de ses conférences. J&rsquo;ai vraiment apprécié et j&rsquo;ai été très impressionné par son débit de parole et de code simultané sans oublier de nombreuses blagues. Un brillant orateur.</p>
<p>Josh a utilisé <a href="https://start.spring.io/" title="https://start.spring.io/" target="_blank" rel="noopener noreferrer">https://start.spring.io/</a> pour générer un petit projet pour gérer des réservations en utilisant <a href="https://spring.io/projects/spring-cloud" target="_blank" title="Spring Cloud" rel="noopener noreferrer">Spring Cloud</a> (construit sur Spring Boot). Pourquoi devriez-vous utiliser cet outil en ligne pour initialiser votre projet? Regardez la vidéo pour obtenir la réponse de Josh, c&rsquo;est amusant!</p>
<p>Il a choisi Kotlin pour le service (car pourquoi pas?) avec des endpoints pour obtenir les messages et les réservations en utilisant un datastore réactif MongoDB. Le service chargeait les données de manière réactive pendant le démarrage.</p>
<p>Il a choisi Java pour le client en utilisant diverses technologies out-of-the-box grâce à Spring (Eureka, Spring Security, Hystrix pour le load balancer interne et gestion du fallback). Le client a pu interroger le service pour récupérer les données.</p>
<p>A la fin de la démo, il nous montre également une architecture sans serveur utilisant <a href="https://projectriff.io/" target="_blank" title="RIFF" rel="noopener noreferrer">RIFF</a>, un FaaS pour Kubernetes. Il a écrit une fonction pour transformer une chaîne de caractère en majuscules, puis utilise le terminal pour invoquer la fonction déployée sur Kubernetes. Il n&rsquo;a pas eu le temps de nous montrer l&rsquo;appel à partir d&rsquo;un service, mais nous avons compris le principe.</p>
<iframe loading="lazy" class="youtube-player" width="550" height="310" src="https://www.youtube.com/embed/GW656IAU5ZE?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
<p><br clear="none" /></p>
<p>Ma première journée à Devoxx était géniale, cette année j&rsquo;ai essayé d&rsquo;assister à des conférences plus innovantes sur le Serverless et le Machine Learning, un mélange live-coding et de théorie. Je posterai bientôt mon résumé du jour 2, alors stay tuned!</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00090/devoxx-2.jpg?ssl=1" rel="shadowbox[sbpost-4587];player=img;" title="Les lettres #DevoxxUK dans le hall"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00090/devoxx-2-thumbnail.jpg?resize=550%2C367&#038;ssl=1" alt="Les lettres #DevoxxUK dans le hall" title="Les lettres #DevoxxUK dans le hall" width="550" height="367" class="size-medium wp-image-260" /></a><p class="wp-caption-text">Les lettres #DevoxxUK dans le hall</p></div>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/">Devoxx UK 2018 &#8211; Jour 1</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" rel="bookmark" title="QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/02/20/fosdem-2013-impressions/" rel="bookmark" title="Retour sur Fosdem 2013">Retour sur Fosdem 2013</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4587</post-id>	</item>
		<item>
		<title>Wise, Revolut et Monzo, une petite révolution dans le monde des expatriés et voyageurs</title>
		<link>https://blog.fabianpiau.com/fr/2018/01/20/wise-revolut-and-monzo-small-revolution-for-travelers-and-expats/</link>
					<comments>https://blog.fabianpiau.com/fr/2018/01/20/wise-revolut-and-monzo-small-revolution-for-travelers-and-expats/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Sat, 20 Jan 2018 19:06:39 +0000</pubDate>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[banque]]></category>
		<category><![CDATA[outil]]></category>
		<category><![CDATA[société]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4444</guid>

					<description><![CDATA[<p>&#160;English version available Mise à jour 2024 : Mise a jour des liens de parrainage. 11 juin 2019 : Ajout de la carte Curve qui permet de combiner toutes vos cartes bancaires en une seule. 22 avril 2018 : Wise fournit maintenant une carte de débit pour ses comptes sans frontières. Pour ce premier article [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/01/20/wise-revolut-and-monzo-small-revolution-for-travelers-and-expats/">Wise, Revolut et Monzo, une petite révolution dans le monde des expatriés et voyageurs</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2014/09/17/choose-the-web-hosting-service-that-fits-your-needs/" rel="bookmark" title="Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins">Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="bookmark" title="Flagger &#8211; Déploiements Canary sur Kubernetes">Flagger &#8211; Déploiements Canary sur Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/11/01/some-basic-rules-to-prevent-your-accounts-from-getting-hacked/" rel="bookmark" title="Quelques règles essentielles pour éviter de se faire pirater ses comptes">Quelques règles essentielles pour éviter de se faire pirater ses comptes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/" rel="bookmark" title="Attaques de robots: vous n&rsquo;êtes pas seul&#8230;">Attaques de robots: vous n&rsquo;êtes pas seul&#8230;</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2018/01/20/wise-revolut-and-monzo-small-revolution-for-travelers-and-expats/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Mise à jour</strong><br />
<strong>2024 : </strong> Mise a jour des liens de parrainage.<br />
<strong>11 juin 2019 : </strong> Ajout de la carte Curve qui permet de combiner toutes vos cartes bancaires en une seule.<br />
<strong>22 avril 2018 : </strong> Wise fournit maintenant une <a href="https://wise.com/borderless/card" target="_blank" title="Carte de débit Wise" rel="noopener noreferrer">carte de débit pour ses comptes sans frontières</a>.
</div>
<p>Pour ce premier article de l&rsquo;année 2018, je vais vous présenter 3 services financiers éprouvés et utilisés par mes soins depuis plusieurs mois, voire années. Ils me permettent de réaliser d&rsquo;importantes économies sur mes transactions interdevises en évitant les frais de commissions élevés des banques traditionnelles. Cet article n&rsquo;est en aucun cas sponsorisé, mais je me permets quand même de glisser quelques liens de parrainage.</p>
<p>Pour ceux qui me connaissent ou me suivent, cela fait maintenant quelque temps que je vis en Angleterre, 3 ans déjà ! Il m&rsquo;arrive également de voyager à l&rsquo;étranger pour découvrir de nouveaux pays, de nouvelles cultures et accessoirement m&rsquo;échapper un peu du brouillard londonien…</p>
<p>Après avoir débarqué en Angleterre, j&rsquo;ai rapidement eu besoin d&rsquo;ouvrir un compte en banque sur place où la monnaie n&rsquo;est bien sûr pas l&rsquo;Euro, mais la Livre sterling.</p>
<p>Pour alimenter ce compte (en attendant mon premier salaire), j&rsquo;ai dû faire un transfert d&rsquo;argent de mon compte français vers mon compte anglais. A l&rsquo;époque pré-Brexit où la Livre était très forte, ce fut un peu douloureux… Et comme si ce n&rsquo;était pas suffisant, ma banque allait prendre sa part avec une commission assez exorbitante sur mon transfert interdevise. Loin de moi l&rsquo;idée de me faire doublement pigeonner, je me suis alors tourné vers Internet et parcouru quelques forums à la recherche de conseils. Mon choix s&rsquo;est alors rapidement porté sur <a href="https://wise.com/invite/amc/fabianp25" target="_blank" title="Wise" rel="noopener noreferrer">Wise</a> (anciennment connu sous le nom TransferWise).</p>
<p><br clear="none" /></p>
<p class="center"><a href="https://wise.com/invite/amc/fabianp25" target="_blank" title="Wise" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Wise" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00089/transferwise.png?resize=565%2C100&#038;ssl=1" alt="Wise" width="565" height="100" /></a></p>
<p>Le principe est simple et se base sur du bon sens. Les Anglais veulent parfois recevoir des euros, par exemple lorsqu&rsquo;ils voyagent en Europe ; et inversement, des Européens ont besoin de livres sterling quand ils viennent en Angleterre. Wise permet de mettre en relation ces demandes en servant d&rsquo;intermédiaire. L&rsquo;entreprise possède des comptes dans plusieurs devises et répartit les montants entre les personnes. Par exemple, pour un virement de 1000 euros vers un compte en livre (donc environ 900 livres à l&rsquo;heure actuelle), le système peut avoir besoin de 2 personnes (une personne qui veut convertir 400 livres en euro et une autre qui veut convertir 500 livres en euros) ou 3 personnes (qui veulent convertir 300 livres en euros chacune) ou 9 personnes (qui veulent convertir 100 livres chacune). Bref, vous avez compris le principe !</p>
<p>Une fois le compte de Wise enregistré auprès de votre banque traditionnelle (cela peut prendre plus ou moins de temps selon votre banque) et le transfert réalisé depuis votre compte d&rsquo;origine, vous recevrez l&rsquo;argent rapidement (en général en 1 jour) sur votre compte de destination.</p>
<p>Vous n&rsquo;aurez pas de frais, car votre compte d&rsquo;origine et le compte de Wise utilisent la même devise. Mais, sans surprise, Wise prend une commission, mais elle reste très négligeable (par exemple 5 euros pour un transfert de 1000 euros). Vous pouvez faire une simulation sur leur site, la commission est proportionnelle au montant du transfert.</p>
<p>Plus récemment, Wise a mis en place le compte borderless (sans frontières), à partir de ce « multicompte », vous pouvez recevoir des transferts de différentes devises de manière transparente, il suffit d&rsquo;un clic pour activer une devise et obtenir vos identifiants bancaires correspondants (IBAN / BIC) que vous pouvez ensuite transmettre à la personne qui vous doit de l&rsquo;argent. Depuis avril 2018, vous recevrez une carte de débit que vous pourrez utiliser pour payer n&rsquo;importe où avec votre compte sans frontières.</p>
<p>Il est important de noter que le transfert se fait au taux du marché. Comme il est possible de décider quand vous voulez faire le transfert, il est donc judicieux de le faire quand le taux est le plus avantageux pour vous. Dans mon cas, c&rsquo;était bien plus intéressant de faire des transferts de la Livre vers l&rsquo;Euro avant le Brexit.</p>
<p>Enfin, si j&rsquo;ai pris comme exemple la Livre et l&rsquo;Euro, de nombreuses devises sont supportées : le Franc suisse, le Dollar américain, le Yen japonais, etc.</p>
<p>N&rsquo;hésitez pas à regarder par vous-même et utilisez <a href="https://wise.com/invite/amc/fabianp25" target="_blank" title="Wise" rel="noopener noreferrer">mon lien de parrainage</a> pour ouvrir votre compte Wise (et votre premier transfert sera gratuit).</p>
<p><br clear="none" /></p>
<p>Même s&rsquo;ils fournissent une carte de débit, Wise a un grand intéret pour des transferts d&rsquo;argent entre vos comptes. Mais, quand n&rsquo;est-il de vos voyages à l&rsquo;étranger et de vos dépenses sur place ? Qui n&rsquo;a pas déjà payé des commissions élevées de la part de sa banque lors d&rsquo;un retrait à l&rsquo;étranger ou lors d&rsquo;un paiement par carte dans un restaurant ? Qui n&rsquo;a pas déjà fait un gros retrait à un distributeur pour éviter les frais fixes à chaque retrait, quitte à se promener avec une grosse somme d&rsquo;argent sur soi ? Si vous êtes curieux, le reste de l&rsquo;article va vous intéresser&#8230;</p>
<p><br clear="none" /></p>
<p class="center"><a href="https://revolut.com/referral/?referral-code=fabianv0x!AUG1-23-AR-H1" target="_blank" title="Revolut" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Revolut" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00089/revolut.png?resize=400%2C125&#038;ssl=1" alt="Revolut" width="400" height="125" /></a></p>
<p>Ouvrir un compte sur <a href="https://revolut.com/referral/?referral-code=fabianv0x!AUG1-23-AR-H1" target="_blank" title="Revolut" rel="noopener noreferrer">Revolut</a> prend alors tout son sens. C&rsquo;est une banque en ligne, ce qui veut dire qu&rsquo;il n&rsquo;y a pas de bureaux physiques, vous gérez tout vous-même depuis l&rsquo;application sur votre smartphone : du changement de code pin à la désactivation de la carte en passant par le changement de votre adresse. Revolut est gratuit, il vous faudra juste débourser une petite somme (5 euros) pour recevoir votre carte de débit multidevise chez soi, sauf si vous utilisez <a href="https://revolut.com/referral/?referral-code=fabianv0x!AUG1-23-AR-H1" target="_blank" title="Revolut" rel="noopener noreferrer">mon lien de parrainage</a> auquel cas la carte sera gratuite.</p>
<p>Vous pouvez faire la conversion de devises en avance depuis l&rsquo;application pour assurer votre taux de change (usage avancé) ou il sera automatiquement calculé en fonction du taux de change actuel et des usages de votre carte (personnellement, je trouve cela suffisant). Le taux de change est très faible et correspond au taux interbanque (c&rsquo;est donc un taux très bas proche de celui réel sans commission).</p>
<p>Revolut conseille fortement de garder un compte dans une banque traditionnelle dans le cas où la carte n&rsquo;est pas acceptée, c&rsquo;est une Visa donc cela ne devrait pas poser de problème, mais vous serez probablement content d&rsquo;avoir une autre carte sous la main, au cas où.</p>
<p>L&rsquo;application mobile est bien réalisée avec une répartition des dépenses par catégorie, une notification instantanée sur votre smartphone pour chaque dépense (utile dans le cas d&rsquo;un paiement sans contact pour vérifier le montant), la possibilité de rembourser une autre personne instantanément ou de partager une dépense facilement.</p>
<p>Je prends l&rsquo;exemple des voyages à l&rsquo;étranger, mais rien ne vous empêche de l&rsquo;utiliser tous les jours en créditant votre carte régulièrement. Vous pourrez ainsi voir vos dépenses par catégorie, mois par mois, et affiner votre budget.</p>
<p>Vous vous demandez où est l&rsquo;arnaque? Et bien, c&rsquo;est comme Wise, il n&rsquo;y en a pas vraiment ! Mais il existe des plafonds de retrait et de paiement par carte (journalier, hebdomadaire et mensuel). Franchement, à moins de voyager pendant 6 mois par an ou se débrouiller comme un manche pour étaler ses dépenses, cela devrait être suffisant pour vous. Et puis il est possible de souscrire à l&rsquo;option premium payante pour supprimer ou augmenter les plafonds et accéder à des services supplémentaires.</p>
<p>Revolut est une entreprise assez jeune en plein essor disponible dans plusieurs pays. De nouvelles fonctionnalités s&rsquo;ajoutent tous les mois (échange de crypto devises, proposition d&rsquo;assurance, de crédit, etc.).</p>
<p>Encore une fois, n&rsquo;hésitez pas à regarder par vous-même et utilisez <a href="https://revolut.com/referral/?referral-code=fabianv0x!AUG1-23-AR-H1" target="_blank" title="Revolut" rel="noopener noreferrer">mon lien de parrainage</a> pour ouvrir votre compte Revolut gratuitement. Il y a très peu de chance pour que vous le regrettiez.</p>
<p><br clear="none" /></p>
<p class="center"><a href="https://join.monzo.com/c/6y8bxhq" target="_blank" title="Monzo" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Monzo" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00089/monzo.png?resize=500%2C130&#038;ssl=1" alt="Monzo" width="500" height="130" /></a></p>
<p>Monzo est également une banque en ligne. Elle fournit un service très proche de celui de Revolut, à savoir la mise à disposition d&rsquo;une carte bancaire Mastercard (donc pas Visa) pour faire des paiements dans différentes devises avec le taux interbanque.</p>
<p>Je dois dire que je l&rsquo;utilise depuis plus longtemps et régulièrement que Revolut. Néanmoins, à l&rsquo;heure actuelle, le service n&rsquo;est disponible qu&rsquo;au Royaume-Uni. Contrairement à Revolut, il n&rsquo;y a pas de frais pour recevoir la carte, il n&rsquo;y a pas non plus d&rsquo;option payante, c&rsquo;est totalement gratuit.</p>
<p>Contrairement à Revolut, Monzo se concentre exclusivement sur l&rsquo;aspect dépense multidevise et reporting, donc pas d&rsquo;assurance, de crypto ou autres. Et il le fait très bien ! Personnellement je trouve l&rsquo;application pour smartphone un peu plus pratique. Ils ont eux aussi des plafonds, mais plus haut que sur Revolut.</p>
<p>Dans mon cas, le fait d&rsquo;utiliser les 2 services et d&rsquo;avoir 2 cartes bancaires permet indirectement de relever les plafonds. Aussi, il est possible que la carte Revolut ne passe pas chez un marchand à l&rsquo;étranger, alors que celle de Monzo fonctionne parfaitement, et inversement.</p>
<p>Vous pouvez utiliser <a href="https://join.monzo.com/c/6y8bxhq" target="_blank" title="Monzo" rel="noopener noreferrer">mon lien de parrainage</a> pour ouvrir votre compte Monzo et recevoir 5 livres sterling gratuitement.</p>
<p><br clear="none" /></p>
<p class="center"><a href="https://www.curve.com/join/#EKGQQJQN" target="_blank" title="Curve" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Curve" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00089/curve.png?resize=485%2C111&#038;ssl=1" alt="Curve" width="485" height="111" /></a></p>
<p>Enfin, mais pas des moindres, Curve est également une banque en ligne. Le point positif de cette carte est qu&rsquo;elle permet de regrouper toutes les autres. Si vous ne souhaitez pas emporter avec vous toutes vos cartes bancaires tout le temps: Revolut, Monzo ou autres cartes professionnelles ou personnelles, il est possible de n&rsquo;en utiliser qu&rsquo;une seule: la carte Curve. Depuis l&rsquo;application, un simple geste suffit pour sélectionner la carte qui sera active. C&rsquo;est efficace et rendra votre portefeuille un peu plus léger. Notez qu&rsquo;il peut y avoir quelques limitations en cas de litiges, mais cela conviendra pour une utilisation de tous les jours. Et puisque c&rsquo;est gratuit, pourquoi ne pas l&rsquo;essayer?</p>
<p>Vous pouvez utiliser <a href="https://www.curve.com/join/#EKGQQJQN" target="_blank" title="Curve" rel="noopener noreferrer">mon lien de parrainage</a> pour ouvrir votre compte et recevoir 5 euros gratuitement. Utilisez le code « EKGQQJQN » lors de la création de votre compte.</p>
<p><br clear="none" /></p>
<p>Une fois n&rsquo;est pas coutume, j&rsquo;ai peu abordé le côté technique, mais l&rsquo;article reste tout de même centré sur le côté nouvelles technologies dans le système bancaire, j&rsquo;espère qu&rsquo;il aura été une lecture intéressante. Cela montre que de petites startups (Fintech) peuvent faire bouger les lignes du paysage bancaire et façonner notre future.  Les banques traditionnelles doivent sans cesse innover pour rester dans la course, pas sûr qu&rsquo;elles ont toutes prise le virage à temps, les clients d&rsquo;hier ne sont plus les jeunes d&rsquo;aujourd&rsquo;hui.</p>
<p>Peut-être que vous aussi vous sauterez le pas vers la banque en ligne, avec un plus grand contrôle sur smartphone devenu un peu la norme à notre époque, et puis si en plus cela vous permet de faire des économies… Il n&rsquo;y a pas de raison de ne pas essayer !</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2018/01/20/wise-revolut-and-monzo-small-revolution-for-travelers-and-expats/">Wise, Revolut et Monzo, une petite révolution dans le monde des expatriés et voyageurs</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2014/09/17/choose-the-web-hosting-service-that-fits-your-needs/" rel="bookmark" title="Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins">Choisir la solution d&rsquo;hébergement web qui correspond à vos besoins</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2020/05/19/flagger-canary-deployments-on-kubernetes/" rel="bookmark" title="Flagger &#8211; Déploiements Canary sur Kubernetes">Flagger &#8211; Déploiements Canary sur Kubernetes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/11/01/some-basic-rules-to-prevent-your-accounts-from-getting-hacked/" rel="bookmark" title="Quelques règles essentielles pour éviter de se faire pirater ses comptes">Quelques règles essentielles pour éviter de se faire pirater ses comptes</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2021/04/20/bot-attacks-you-are-not-alone/" rel="bookmark" title="Attaques de robots: vous n&rsquo;êtes pas seul&#8230;">Attaques de robots: vous n&rsquo;êtes pas seul&#8230;</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2018/01/20/wise-revolut-and-monzo-small-revolution-for-travelers-and-expats/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4444</post-id>	</item>
		<item>
		<title>Autocomplétion pour Git</title>
		<link>https://blog.fabianpiau.com/fr/2017/05/20/autocomplete-for-git/</link>
					<comments>https://blog.fabianpiau.com/fr/2017/05/20/autocomplete-for-git/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Sat, 20 May 2017 13:27:42 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4233</guid>

					<description><![CDATA[<p>&#160;English version available Remarque Cette astuce ne fonctionne que pour les systèmes Unix (Linux, Mac OS&#8230;) Téléchargez le fichier git-completion.bash depuis Github. Ajoutez cette ligne à votre fichier de profil bash (par exemple .bashrc), je suppose que vous avez copié git-completion.bash à la racine de votre dossier home. source ~/git-completion.bash Si .bashrc n&#8217;existe pas, créez-le [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2017/05/20/autocomplete-for-git/">Autocomplétion pour Git</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2011/07/10/save-space-disk-with-chrome-chromium-or-how-not-to-lose-it/" rel="bookmark" title="Gagner de l&rsquo;espace disque avec Chrome / Chromium (ou comment ne pas en perdre&#8230;)">Gagner de l&rsquo;espace disque avec Chrome / Chromium (ou comment ne pas en perdre&#8230;)</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/11/11/do-you-need-a-good-cover-for-this-winter-eclemma/" rel="bookmark" title="EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver">EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2017/05/20/autocomplete-for-git/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<div class="info"><strong class="label">Remarque</strong><br />
Cette astuce ne fonctionne que pour les systèmes Unix (Linux, Mac OS&#8230;)
</div>
<p class="right" style="padding-left:15px;"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Logo Git" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00088/git-logo.png?resize=200%2C200&#038;ssl=1" alt="Logo Git" width="200" height="200" /></p>
<p>Téléchargez le fichier <a href="https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash">git-completion.bash</a> depuis Github.</p>
<p>Ajoutez cette ligne à votre fichier de profil bash (par exemple <code>.bashrc</code>), je suppose que vous avez copié <code>git-completion.bash</code> à la racine de votre dossier home.</p>
<pre>source ~/git-completion.bash</pre>
<p>Si <code>.bashrc</code> n&rsquo;existe pas, créez-le d&rsquo;abord.</p>
<p>Cette ligne va charger le script <code>git-completion.bash</code> automatiquement lorsque vous ouvrirez une session bash.</p>
<p>Vous pourrez ensuite compléter automatiquement toutes vos commandes Git (avec Tab), et aussi accéder à des raccourcis plus avancés comme par exemple la recherche de branches locales et distantes en commençant à saisir leur nom.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2017/05/20/autocomplete-for-git/">Autocomplétion pour Git</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2011/07/10/save-space-disk-with-chrome-chromium-or-how-not-to-lose-it/" rel="bookmark" title="Gagner de l&rsquo;espace disque avec Chrome / Chromium (ou comment ne pas en perdre&#8230;)">Gagner de l&rsquo;espace disque avec Chrome / Chromium (ou comment ne pas en perdre&#8230;)</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/11/11/do-you-need-a-good-cover-for-this-winter-eclemma/" rel="bookmark" title="EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver">EclEmma &#8211; Une bonne couverture pour l&rsquo;hiver</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2017/05/20/autocomplete-for-git/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4233</post-id>	</item>
		<item>
		<title>Swagger, la documentation API automatisée</title>
		<link>https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/</link>
					<comments>https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/#comments</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Wed, 01 Mar 2017 21:36:26 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[outil]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=4179</guid>

					<description><![CDATA[<p>&#160;English version available A l&#8217;heure où les projets informatiques se basent la plupart du temps sur une architecture orientée microservices, il n&#8217;est pas étonnant que les différents microservices soient développés et maintenus par des équipes différentes. Chaque service fournit une API (privée ou public) qui permet de communiquer avec le monde extérieur tout en garantissant [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/">Swagger, la documentation API automatisée</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/" rel="bookmark" title="Architecture Microservices &#8211; Les bonnes pratiques">Architecture Microservices &#8211; Les bonnes pratiques</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/07/02/doing-some-social-rest-with-hateoas/" rel="bookmark" title="Faire du REST social avec HATEOAS">Faire du REST social avec HATEOAS</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/06/23/api-rest-json-xml-http-uri-what-language-do-you-speak/" rel="bookmark" title="API, REST, JSON, XML, HTTP, URI&#8230; Vous parlez quelle langue en fait?">API, REST, JSON, XML, HTTP, URI&#8230; Vous parlez quelle langue en fait?</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2017/03/01/swagger-automated-api-documentation/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>A l&rsquo;heure où les projets informatiques se basent la plupart du temps sur <a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/" title="Architecture Microservices – Les bonnes pratiques">une architecture orientée microservices</a>, il n&rsquo;est pas étonnant que les différents microservices soient développés et maintenus par des équipes différentes.</p>
<p>Chaque service fournit une API (privée ou public) qui permet de communiquer avec le monde extérieur tout en garantissant l&rsquo;intégrité de ses données. De multiples appels imbriqués entre les microservices permettent de réaliser un traitement plus complexe. Il est très important d&rsquo;avoir une documentation à jour pour chacune de vos API. Qui n&rsquo;a jamais entendu un développeur dire à un autre « Cette doc n&rsquo;a pas été mise à jour depuis des mois, regarde le code directement! ».</p>
<p class="left" style="padding-right:15px;"><a href="https://swagger.io/tools/swagger-ui/" target="_blank" title="Swagger logo" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Swagger logo" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00087/swagger-logo.png?resize=200%2C200&#038;ssl=1" alt="Swagger logo" width="200" height="200" /></a></p>
<p><a href="https://swagger.io/tools/swagger-ui/" target="_blank" title="Site officiel de Swagger UI" rel="noopener noreferrer">Swagger UI</a> se conforme à cette affirmation. Il suffit d&rsquo;ajouter des annotations précises dans votre code et le framework s&rsquo;occupera de générer de manière semi-automatique toute la documentation de votre API. &lsquo;Semi-automatique&rsquo; car il ne peut pas écrire la documentation métier, vous devez donc l&rsquo;écrire vous-même, un peu comme si vous écrivez de la Javadoc.</p>
<p>La documentation générée par Swagger est donc mise à jour en même temps que le code. Par exemple, si vous ajoutez un nouveau paramètre à une méthode exposée, celui-ci sera automatiquement pris en compte et documenté avec les annotations adéquates. La documentation n&rsquo;est pas seulement un fichier HTML statique, elle permet de faire office de client HTTP (il n&rsquo;y a pas besoin d&rsquo;avoir <a href="https://www.postman.com/" target="_blank" title="Site officiel de Postman" rel="noopener noreferrer">Postman</a> installé par exemple) pour tester les différentes méthodes exposées par l&rsquo;API.</p>
<p>Vous pouvez regarder <a href="https://petstore.swagger.io/" target="_blank" title="Application Swagger exemple" rel="noopener noreferrer">l&rsquo;application exemple officielle (Petstore)</a> pour avoir un accès aux différentes fonctionnalités supportées, par exemple l&rsquo;authentification OAuth2.0 est supportée.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00087/swagger-pet-store.png?ssl=1" rel="shadowbox[sbpost-4179];player=img;" title="Exemple d'application avec Swagger"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00087/swagger-pet-store-thumbnail.png?resize=550%2C507&#038;ssl=1" alt="Exemple d'application avec Swagger" title="Exemple d'application avec Swagger" width="550" height="507" class="size-medium wp-image-257" /></a><p class="wp-caption-text">Exemple d'application avec Swagger</p></div>
<p>Cerise sur le gâteau si vous utilisez Spring MVC dans votre application, le <a href="http://springfox.github.io/springfox/" target="_blank" title="Site officiel du projet SpringFox" rel="noopener noreferrer">projet SpringFox</a> (surcouche Swagger) rend l&rsquo;intégration de Swagger très simple. En moins d&rsquo;une heure, vous devriez être capable de générer la documentation de votre API. Ensuite, vous pourrez ajouter des annotations optionnelles pour la rendre plus complète.</p>
<p>En adoptant Swagger sur l&rsquo;ensemble de vos microservices, il est fort à parier que la communication entre vos différentes équipes s’améliore. Désormais, vous n&rsquo;aurez qu&rsquo;un seul point d&rsquo;entrée, oubliez donc la page wiki mal-documentée qui avait tendance à prendre la poussière&#8230; En vous souhaitant une bonne documentation!</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/">Swagger, la documentation API automatisée</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/" rel="bookmark" title="Architecture Microservices &#8211; Les bonnes pratiques">Architecture Microservices &#8211; Les bonnes pratiques</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/07/02/doing-some-social-rest-with-hateoas/" rel="bookmark" title="Faire du REST social avec HATEOAS">Faire du REST social avec HATEOAS</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/06/23/api-rest-json-xml-http-uri-what-language-do-you-speak/" rel="bookmark" title="API, REST, JSON, XML, HTTP, URI&#8230; Vous parlez quelle langue en fait?">API, REST, JSON, XML, HTTP, URI&#8230; Vous parlez quelle langue en fait?</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4179</post-id>	</item>
		<item>
		<title>Architecture Microservices &#8211; Les bonnes pratiques</title>
		<link>https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/</link>
					<comments>https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/#comments</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Mon, 03 Oct 2016 06:00:15 +0000</pubDate>
				<category><![CDATA[Programmation agile]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[microservices]]></category>
		<guid isPermaLink="false">https://blog.fabianpiau.com/?p=3911</guid>

					<description><![CDATA[<p>&#160;English version available Je travaille sur une architecture microservices depuis assez longtemps maintenant et j&#8217;ai assisté à pas mal de conférences sur le sujet. Dans cet article, je veux rassembler mon expérience pour vous donner quelques conseils basés sur mon retour d&#8217;expérience. Chaque titre représente ce que vous ne devez pas faire suivi d&#8217;une description [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/">Architecture Microservices &#8211; Les bonnes pratiques</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/" rel="bookmark" title="Swagger, la documentation API automatisée">Swagger, la documentation API automatisée</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/07/23/doing-responsive-web-design-yes-but-easily/" rel="bookmark" title="Faire du Responsive Web Design: oui, mais simplement!">Faire du Responsive Web Design: oui, mais simplement!</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2016/10/03/microservices-architecture-best-practices/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Je travaille sur une architecture microservices depuis assez longtemps maintenant et j&rsquo;ai assisté à pas mal de conférences sur le sujet. Dans cet article, je veux rassembler mon expérience pour vous donner quelques conseils basés sur mon retour d&rsquo;expérience. Chaque titre représente ce que vous ne devez pas faire suivi d&rsquo;une description de ce que vous devriez faire à la place. Même si vous faites déjà des microservices sur votre projet, cela peut tout de même être une bonne lecture (je l&rsquo;espère) et un rafraîchissement de vos connaissances. Aussi, n&rsquo;hésitez pas à commenter l&rsquo;article et partager vos propres retours!</p>
<div class="info"><strong class="label">Disclaimer</strong><br />
Vous pouvez appeler une architecture microservices SOA (ou appelez la comme bon vous semble), mais je préfère utiliser le mot à la mode pour le référencement de mon blog. ;)
</div>
<p>L&rsquo;adoption d&rsquo;une architecture microservices n&rsquo;est pas si aisée. Ecrire des microservices, ce n&rsquo;est pas seulement coder, c&rsquo;est également un bouleversement des équipes et de la structure de l&rsquo;organisation.</p>
<p class="center"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Lego Microservices" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00086/lego.png?resize=550%2C196&#038;ssl=1" alt="Lego Microservices" width="550" height="196" /></p>
<p><br clear="none" /></p>
<h4>Extrait moi donc tout ce code complexe, il sera plus simple dans un microservice!</h4>
<p>L&rsquo;adoption est toujours un peu plus facile lorsqu&rsquo;elle commence sur un nouveau projet, quand on démarre de zéro. Si tel est votre cas, alors vous êtes chanceux! Si vous voulez casser une application monolithique en un ensemble de microservices, évitez de le faire en une seule fois, la manière big bang est le meilleur moyen de faire tout sauter. Essayez de regrouper l&rsquo;ensemble des fonctionnalités similaires qui peuvent être inclus au sein d&rsquo;un microservice. Assurez-vous que toutes ces fonctionnalités soient bien testées avant d&rsquo;engager votre refactoring. Si la couverture de code par les tests est faible, vous devez commencer par l&rsquo;écriture de tests. Cela vous permettra non seulement d&rsquo;améliorer le code du monolithe, mais vous réutiliserez ainsi ce code dans votre futur microservice. Gardez à l&rsquo;esprit que vous préparez l&rsquo;extraction, ce travail ne sera donc pas inutile.</p>
<p>Si vous ne disposez pas suffisamment de tests, vous allez faire les choses à l&rsquo;aveuglette et vous ne serez plus en mesure de vous assurer que vous n&rsquo;avez rien cassé, la régression est la dernière chose que vous voulez. Pour résumer, écrivez des tests d&rsquo;intégration autour du code que vous voulez extraire, ensuite vous pouvez commencer à extraire la fonctionnalité pour créer un microservice. Vos tests d&rsquo;intégration devront toujours être au vert, mais la plomberie derrière aura changé.</p>
<p>Commencez petit et facile au début. Et n&rsquo;ayez pas peur de dupliquer du code. Une fois que votre microservice est branché et fonctionne bien, vous pouvez supprimer le code dupliqué du monolithe. Faire de l&rsquo;<a href="https://fr.wikipedia.org/wiki/A/B_testing" target="_blank" title="Définition A/B testing" rel="noopener noreferrer">A/B testing</a> peut aussi aider, vous pouvez rerouter progressivement le trafic vers le nouveau microservice et voir comment le système réagit.</p>
<p><br clear="none" /></p>
<h4>Le piège du &lsquo;micro-monolith-service&rsquo;</h4>
<p>Gardez le microservice assez petit et pas trop complexe. Il n&rsquo;y a pas de réponse magique à la question combien de lignes de code pour un service pour être considéré comme un microservice? Cela se base plus sur le ressentiment et des bases techniques saines avec un design bien construit. Si un nouveau membre de l&rsquo;équipe a besoin d&rsquo;une journée pour comprendre le code et ce que votre microservice fait, alors vous avez probablement un souci. Quelques heures tout au plus devraient largement suffire.</p>
<p><br clear="none" /></p>
<h4>Vous devez parser un fichier XML, laissez-moi écrire un microservice pour ça!</h4>
<p>C&rsquo;est l&rsquo;autre extrême, il faut éviter de créer un microservice quand une simple librairie est suffisante. Vous ne voulez pas avoir une profondeur d&rsquo;appel trop grande (nombre de requêtes imbriquées). Si vous avez plus de 3 requêtes imbriquées, vous faites probablement des nanoservices. Un appel implique une latence réseau et une éventuelle défaillance. Si un microservice doit être déployé avec une API, une librairie sera directement intégrée sans surcoût opérationnel. Il y a donc un équilibre entre coût <a href="https://fr.wikipedia.org/wiki/Devops" title="Définition DevOps" target="_blank" rel="noopener noreferrer">DevOps</a> et complexité monolithique.</p>
<p><br clear="none" /></p>
<h4>Désolé, je ne peux pas vous aider, je n&rsquo;ai pas travaillé sur ce microservice&#8230;</h4>
<p>Il est impossible que toutes les équipes soient responsables de tous les microservices. La synchronisation et la communication entre vos équipes devient primordiale. J&rsquo;ai très souvent entendu le fait qu&rsquo;une équipe ne devrait pas être responsable d&rsquo;un microservice, et que tout le monde devrait être en mesure de changer et de travailler sur n&rsquo;importe quel microservice. Eh bien, en réalité ce n&rsquo;est pas vraiment le cas! Néanmoins, vous pouvez adopter quelques bonnes pratiques pour rendre ce concept plus facile.</p>
<p>A mon avis, une équipe responsable d&rsquo;un microservice signifie qu&rsquo;elle est responsable de la construction et de la bonne exécution. Quand quelque chose coince en production, l&rsquo;équipe devrait être le principal point de contact. Vous aurez juste à trouver une personne au sein de l&rsquo;équipe qui acceptera un appel à 5h du matin&#8230; Je plaisante ;)</p>
<p><br clear="none" /></p>
<h4>Spring, Dropwizard, Finagle, Clojure, faisons un mix de tout ça!</h4>
<p>Essayez de vous limiter à une stack technologique commune pour tous vos microservices. Je sais qu&rsquo;un grand avantage des microservices est que vous pouvez les construire avec n&rsquo;importe quel langage ou technologies. Mais les développeurs passionnés auront tendance à utiliser le dernier framework à la mode. Dans le long terme et avec l&rsquo;inévitable turn-over, la maintenance de vos microservices va devenir douloureuse et finir en cauchemar. Le passage de microservices entre les équipes va devenir très difficile, voire impossible. C&rsquo;est pour cela, je pense qu&rsquo;il est important de se limiter à un certain nombre de technologies.</p>
<p>De nombreuses technologies sont disponibles pour faire des microservices, vous devez utiliser quelque chose de fiable, maintenu, et ainsi de suite. Quelle sérialisation, texte ou binaire? REST, Thrift, SOAP? Solution open-source ou du fait-maison? Il n&rsquo;y a pas de bonne réponse. Comparez les différentes technologies, les avantages et les inconvénients, et utilisez la solution la plus appropriée pour votre besoin.</p>
<p>Dans le même temps, cette limitation ne devrait pas vous empêcher d&rsquo;innover. Ne vous limitez pas à ce que vous utilisez et maîtrisez déjà si vous pensez qu&rsquo;il y a une meilleure solution sur le marché. Essayez-la sur un nouveau microservice (de préférence non critique pour le système) avec un POC, puis en cas de succès, vous pouvez la propager à l&rsquo;ensemble du système.</p>
<p><br clear="none" /></p>
<h4>Qu&rsquo;en est-il du stockage des données?</h4>
<p>Vous pouvez être plus flexible sur le type de data store. C&rsquo;est une dépendance externe, et elle doit être adaptée en fonction des besoins (base de données relationnelle, noSQL, en mémoire, accès en lecture seule&#8230;).</p>
<p>Gardez vos data stores indépendants, chaque microservice est un gardien de ses données. Vous ne devriez jamais le contourner en liant un microservice au data store d&rsquo;un autre. Ce serait une très mauvaise conception. Dans le cas où vous êtes limité à une base de données, ça ne posera pas de problème car vous pouvez définir différents schémas pour chaque microservice afin de limiter les accès.</p>
<p><br clear="none" /></p>
<h4>Si un microservice tombe, tout mon système est en panne&#8230;</h4>
<p>Il est important de concevoir une bonne architecture, c&rsquo;est le socle technique qui supportera vos microservices. Pensez scalabilité, circuit breaker (pattern coupe circuit), service discovery (découverte des services) dès le début du projet, surtout pas un mois avant de mettre en production avec des milliers d&rsquo;utilisateurs potentiels. Vous devez toujours garder cela à l&rsquo;esprit à partir du jour 0. Certaines personnes peuvent argumenter sur ce point, et parfois vous pourriez avoir à convaincre le product owner qui ne voit pas de valeur business. Mais croyez-moi, plus vous attendez, plus vous aurez du pain sur la planche, et vous ne serez pas si confiant avec votre architecture tant que toutes ces tâches techniques ne seront pas complètes.</p>
<p>Vous avez affaire à de nombreuses requêtes distribuées sur le réseau, qui n&rsquo;est généralement pas très fiable, il faut imaginer un design résilient. Ceci est un état d&rsquo;esprit que l&rsquo;équipe se doit d&rsquo;adopter. Vous devez penser aux retries (plusieurs tentatives, en cas d&rsquo;échec, on réessaie sur une autre instance par exemple), aux appels idempotents et ainsi de suite. Mettre en place des retries n&rsquo;est pas aussi facile que de l&rsquo;expliquer, surtout quand l&rsquo;appel n&rsquo;est pas idempotent. A un certain point, vous aurez besoin d&rsquo;affiner la configuration des tentatives. Par exemple, éviter des retries au niveau inférieur si on réessaie déjà au niveau supérieur, ou bien adapter le délai d&rsquo;attente entre les tentatives au niveau supérieur, celui-ci devrait être plus grand que le délai d&rsquo;attente au niveau inférieur, etc. Tous vos microservices devraient exposer un ensemble d&rsquo;URL de type healthchecks et exposer des métriques utiles qu&rsquo;un outil de surveillance pourra utiliser (suivant un modèle basé sur des pull ou des push).</p>
<p>Il est également important de tester l&rsquo;infrastructure. Qu&rsquo;est-ce qui se passera si cette instance de microservice tombe? Vous devriez faire du <a href="https://en.wikipedia.org/wiki/Monkey_testing" target="_blank" title="Définition Monkey testing" rel="noopener noreferrer">Monkey testing</a> (c.-à-d. éteindre certains microservices au hasard), le système devrait réagir positivement et être encore capable de traiter et de servir les requêtes (en mode dégradé).</p>
<p><br clear="none" /></p>
<h4>Ok, je vais faire un &lsquo;grep&rsquo; sur la log pour voir ce qui s&rsquo;est passé hier&#8230; Attend&#8230; Il y a 50 logs ici!</h4>
<p>Avoir beaucoup de microservices implique beaucoup d&rsquo;interactions, et donc pas mal de log. Il sera difficile de déboguer si quelque chose a mal tourné en production. Où est-ce que ça s&rsquo;est passé? Quel fichier de log? Quel environnement? Les ops peuvent se perdre facilement&#8230; Essayez de faire un logging précis, surtout gardez un identifiant de corrélation pour être en mesure de retracer la pile d&rsquo;appel à travers les différents fichiers de log.</p>
<p>Soyez proactif et n&rsquo;attendez pas que le client se plaigne. Traquez toute stacktrace qui se produit, déclenchez des alertes et corrigez constamment tous les problèmes jusqu&rsquo;à ce que vos logs soient « nettoyées » et contiennent uniquement des informations utiles et précises. La mise en place d&rsquo;un outil de surveillance des logs (par exemple <a href="https://www.splunk.com/" target="_blank" title="Site de Splunk" rel="noopener noreferrer">Splunk</a>, <a href="https://www.elastic.co/kibana/" target="_blank" title="Site de Kibana" rel="noopener noreferrer">Kibana</a>&#8230;) aura du sens dans une architecture microservices.</p>
<p><br clear="none" /></p>
<h4>Nous ne pouvons pas tester, nous dépendons d&rsquo;un microservice pas encore prêt</h4>
<p>Lors de l&rsquo;écriture des tests d&rsquo;intégration, mockez toutes les dépendances externes au microservice. Surtout si une équipe est encore en train de développer un microservice dont vous dépendez. Vous ne voulez pas attendre qu&rsquo;ils aient fini. Par exemple, vous pouvez jeter un oeil à <a href="https://wiremock.org/" target="_blank" title="Site de Wiremock" rel="noopener noreferrer">Wiremock</a>. A l&rsquo;opposé, pour les tests de bout en bout (end-to-end), essayez de fournir des outils efficaces et rapides pour les exécuter localement, l&rsquo;utilisation de serveurs embarqués est une bonne façon d&rsquo;y parvenir.</p>
<p>Je l&rsquo;ai déjà mentionné, déployez souvent en production, surtout au début, et n&rsquo;attendez pas 6 mois pour déployer vos microservices. Même s&rsquo;ils ne sont pas (encore) utiles d&rsquo;un point de vue business, vous serez davantage en confiance lorsque vous travaillerez dessus, et alors vous pourrez implémenter la logique métier sans trop vous soucier de l&rsquo;architecture. Plus tôt vous testez en production, plus tôt vous pourrez déceler des bogues et être en mesure de les corriger rapidement.</p>
<p><br clear="none" /></p>
<h4>Nous allons concevoir l&rsquo;API comme ça pour l&rsquo;instant, au plus simple, nous la changerons plus tard</h4>
<p>Il est difficile d&rsquo;être agile lors de la conception d&rsquo;une API, surtout quand celle-ci est publique. Une fois qu&rsquo;une version a été livrée et commence à être utilisée, tout changement conséquent impliquera un changement de contrat de l&rsquo;API. Vous allez alors devoir versionner votre API et, finalement, devoir maintenir plusieurs versions en parallèle. Il est important de passer un peu de temps au début pour définir un bon contrat pour l&rsquo;API qui sera capable d&rsquo;évoluer sans breaking changes (idéalement). Cela semble Waterfall pour vous? Eh bien, c&rsquo;est probablement un peu le cas&#8230;</p>
<p>Toujours garder à l&rsquo;esprit qu&rsquo;il faut être rétrocompatible (même si les appels sont internes) et utiliser l&rsquo;API versioning. Par exemple, ne pas renommer un champ comme ça, mais suivre un processus un peu plus long mais sûr, vous devez ajouter le nouveau champ, gardez l&rsquo;ancien déprécié jusqu&rsquo;à ce que tous les clients soient migré, ensuite vous pouvez le supprimer.</p>
<p><br clear="none" /></p>
<h4>Les ops ont besoin d&rsquo;une journée pour déployer quelques microservices, comment est-ce possible?!</h4>
<p>L&rsquo;équipe opérationnelle doit changer de mentalité, au lieu de déployer et surveiller une grosse et unique application, ils devront gérer de nombreuses petites applications et s&rsquo;assurer qu&rsquo;il n&rsquo;y a pas de problème de communication. De quelques étapes manuelles, l&rsquo;équipe se retrouve avec de nombreuses étapes fastidieuses. Ils seront rapidement dépassés s&rsquo;ils gardent les mêmes habitudes, en particulier quand on sait que le nombre de microservices va croître au fil du temps.</p>
<p>Ils auront besoin d&rsquo;automatiser leur travail et éviter toute étape manuelle sujette à des erreurs humaines. L&rsquo;adoption d&rsquo;une architecture microservices vous oblige à faire du « vrai » DevOps. Le développeur doit participer à la mise en place de l&rsquo;architecture, il n&rsquo;est plus suffisant de donner un fichier et compter sur les ops pour faire le travail. Les développeurs doivent être impliqués. Idéalement, un ops sera dédié à l&rsquo;équipe pour s&rsquo;assurer que la configuration réseau est correcte, les health checks existent et fonctionnent, il participera aux stand-ups et pourra même avoir son bureau avec l&rsquo;équipe de dév. Il sera sans doute nécessaire de commencer à utiliser un outil de déploiement automatisé tel qu&rsquo;<a href="https://www.ansible.com/" target="_blank" title="Site de Ansible" rel="noopener noreferrer">Ansible</a>.</p>
<p><br clear="none" /></p>
<h4>Nous avons passé 6 mois sur cette architecture, elle fonctionne super bien&#8230; Par contre on a 50 utilisateurs!</h4>
<p>Dernier conseil, ne pas essayer de tout faire en même temps. Vous devez déjà gérer pas mal de problématiques. Vous pouvez mettre de côté certains points comme le self-healing (auto-guérison), le service discovery (découverte de service), circuit-breaker (coupe-circuit), auto-scaling, etc. L&rsquo;utilisation de retries et de multiples instances sera suffisant au début. Mais gardez à l&rsquo;esprit que vous devrez les mettre en oeuvre à un moment donné, surtout quand votre système sera une réussite et sera utilisé par des milliers d&rsquo;utilisateurs.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/">Architecture Microservices &#8211; Les bonnes pratiques</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/06/06/devoxx-uk-day-2/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 2">Devoxx UK 2018 &#8211; Jour 2</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2017/03/01/swagger-automated-api-documentation/" rel="bookmark" title="Swagger, la documentation API automatisée">Swagger, la documentation API automatisée</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/07/23/doing-responsive-web-design-yes-but-easily/" rel="bookmark" title="Faire du Responsive Web Design: oui, mais simplement!">Faire du Responsive Web Design: oui, mais simplement!</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2016/10/03/microservices-architecture-best-practices/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3911</post-id>	</item>
		<item>
		<title>FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs</title>
		<link>https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/</link>
					<comments>https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/#comments</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Sun, 24 Apr 2016 17:46:07 +0000</pubDate>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[drive]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[outil]]></category>
		<category><![CDATA[sondage]]></category>
		<guid isPermaLink="false">http://blog.fabianpiau.com/?p=3567</guid>

					<description><![CDATA[<p>&#160;English version available L&#8217;article Réaliser un sondage en ligne avec Google Forms / Drive / Docs reçoit régulièrement des commentaires. Je me suis aperçu que des questions reviennent souvent, j&#8217;ai donc décidé d&#8217;écrire cet article sous la forme d&#8217;une FAQ. Je ne me considère pas comme étant un expert sur Google Forms et Google peut [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/">FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2012/09/24/using-google-docs-to-create-an-online-survey/" rel="bookmark" title="Réaliser un sondage en ligne avec Google Forms / Drive / Docs">Réaliser un sondage en ligne avec Google Forms / Drive / Docs</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/01/01/free-online-mongodb-training/" rel="bookmark" title="Formation en ligne gratuite sur MongoDB">Formation en ligne gratuite sur MongoDB</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/" rel="bookmark" title="Faut-il se méfier de Google?">Faut-il se méfier de Google?</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/02/22/measure-analyze-website-audience-matomo/" rel="bookmark" title="Mesurer et analyser l&rsquo;audience de votre site avec Matomo">Mesurer et analyser l&rsquo;audience de votre site avec Matomo</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2016/04/24/faq-online-survey-with-google-docs-drive-forms/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p class="right" style="padding-left:15px;"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Sondage" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00085/survey.png?resize=244%2C280&#038;ssl=1" alt="Sondage" width="244" height="280" /></p>
<p>L&rsquo;article <a href="https://blog.fabianpiau.com/fr/2012/09/24/using-google-docs-to-create-an-online-survey/" title="Réaliser un sondage en ligne avec Google Forms / Drive / Docs">Réaliser un sondage en ligne avec Google Forms / Drive / Docs</a> reçoit régulièrement des commentaires. Je me suis aperçu que des questions reviennent souvent, j&rsquo;ai donc décidé d&rsquo;écrire cet article sous la forme d&rsquo;une FAQ. Je ne me considère pas comme étant un expert sur Google Forms et Google peut faire évoluer son produit à tout moment, rendant mes articles obsolètes. Néanmoins, cette FAQ apportera peut-être (et je l’espère) la réponse à votre question.</p>
<p><br clear="none" /></p>
<h4>Lorsqu&rsquo;un utilisateur souhaite répondre au questionnaire, il doit se connecter à son compte Google, est-ce normal?</h4>
<p>Vous devez désactiver l&rsquo;option « N&rsquo;autoriser qu&rsquo;une seule réponse par personne » qui oblige les personnes à se connecter avec (et posséder) un compte Google. Par contre, sans cette option, les personnes pourront potentiellement répondre plusieurs fois.</p>
<p><br clear="none" /></p>
<h4>Comment peut-on empêcher une personne de répondre plusieurs fois au sondage?</h4>
<p>Pour avoir plus de confiance dans les résultats, vous pouvez activer l&rsquo;option « N&rsquo;autoriser qu&rsquo;une seule réponse par personne ». Notez que les utilisateurs seront invités à se connecter à leur compte Google pour consulter et remplir le formulaire, mais leur nom d&rsquo;utilisateur réel ne sera pas enregistré.</p>
<p><br clear="none" /></p>
<h4>Je ne souhaite pas forcer mes utilisateurs à avoir un compte Google, y-a-t-il une alternative?</h4>
<p>Si vous ne souhaitez pas obliger vos utilisateurs à avoir un compte Google, une alternative consiste à utiliser <a href="https://support.google.com/docs/answer/2839588?hl=fr&#038;topic=1360904&#038;ctx=topic&#038;visit_id=1-636333044310156895-3354812221&#038;rd=1" target="_blank" title="Pré-remplir un formulaire">le pré-remplissage des formulaires</a>.</p>
<p>Par exemple, voici différents liens pour pré-remplir le champ « prénom » dans un sondage:</p>
<ul>
<li><a href="https://docs.google.com/forms/d/e/1FAIpQLSfMDnUWGkBJLlrHhyfqV8yY2fWihOz4FWFhIz8j0FjzxmC2Qw/viewform?entry.1000000=Fabian" target="_blank" title="Sondage avec le champ prénom pré-rempli avec Fabian">https://docs.google.com/forms/d/e/1FAIpQLSfMDnUWGkBJLlrHhyfqV8yY2fWihOz4FWFhIz8j0FjzxmC2Qw/viewform?entry.1000000=Fabian</a></li>
<li><a href="https://docs.google.com/forms/d/e/1FAIpQLSfMDnUWGkBJLlrHhyfqV8yY2fWihOz4FWFhIz8j0FjzxmC2Qw/viewform?entry.1000000=Caroline" target="_blank" title="Sondage avec le champ prénom pré-rempli avec Caroline">https://docs.google.com/forms/d/e/1FAIpQLSfMDnUWGkBJLlrHhyfqV8yY2fWihOz4FWFhIz8j0FjzxmC2Qw/viewform?entry.1000000=Caroline</a></li>
</ul>
<p>Vous noterez l&rsquo;URL qui change à la fin avec un paramètre additionnel. J&rsquo;ai pris le pré-remplissage d&rsquo;un seul champ, mais il est très facile de pré-remplir plusieurs champs (comme le nom, le prénom ou un email). Générez le lien à partir du menu pour obtenir la syntaxe des paramètres et ensuite vous pouvez modifier manuellement les paramètres avant d&rsquo;envoyer le lien. Si vous avez beaucoup de liens à envoyer, cela prendra un peu de temps, mais cela fonctionnera.</p>
<p>Attention, cela n’empêchera pas la personne de pouvoir modifier les informations pré-remplies après coup si elle le souhaite (directement depuis le formulaire ou en changeant l&rsquo;URL) ou de répondre au sondage plusieurs fois.</p>
<p>Il n&rsquo;est pas possible de cacher des champs, mais il y a une solution de contournement! Vous pouvez ajouter les champs nom et prénom sur une section du formulaire qui ne s&rsquo;affichera jamais. Il faut utiliser des sections dans votre formulaire et changer la navigation pour ne jamais afficher la section qui contient les champs cachés et passer directement à la suivante. Lisez les pages <a href="https://support.google.com/docs/answer/2839737?hl=fr" target="_blank" title="Ajouter du contenu à votre formulaire">Ajouter du contenu à votre formulaire</a> pour savoir comment ajouter une section et particulièrement cette page pour <a href="https://support.google.com/docs/answer/141062?hl=fr" target="_blank" title="Contrôler la navigation entre les différentes sections d'un formulaire">Contrôler la navigation entre les différentes sections d&rsquo;un formulaire</a>.<br />
Encore une fois, cela n’empêchera pas l&rsquo;utilisateur de changer manuellement l&rsquo;URL, mais beaucoup ne feront pas attention, surtout si vous utilisez un raccourcisseur d&rsquo;URL.<br />
Cela vous obligera à utiliser des sections, mais en général leur utilisation est une bonne chose pour éviter un long formulaire qui déroule toutes les questions sur une page unique.</p>
<p><br clear="none" /></p>
<h4>Est-il possible d&rsquo;inclure le questionnaire dans mon site?</h4>
<p>Oui, il est possible d&rsquo;inclure le formulaire dans votre site sous la forme d&rsquo;une <code>iFrame</code>. L&rsquo;option est disponible depuis le menu « Fichier ». Le menu génère un bout de code HTML que vous pouvez ensuite copier / coller dans une des pages de votre site. Vous pouvez aussi écrire le code manuellement, par exemple:</p>
<pre class="brush: xml; light: true; title: ; notranslate">
&lt;iframe src=&quot;https://docs.google.com/forms/d/1yuSGyvlNg-zevf5TaJO585G5xr9ekLFkn9qvIcXvbbQ/viewform?embedded=true&quot; width=&quot;760&quot; height=&quot;500&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot;&gt;Chargement...&lt;/iframe&gt;
</pre>
<p>Vous pouvez changer la taille de l&rsquo;<code>iFrame</code> et l&rsquo;URL pour l&rsquo;adapter à votre formulaire. Avec les valeurs <code>width="760"</code> et <code>height="500"</code>, l&rsquo;<code>iFrame</code> aura une hauteur de 500 pixels et une largeur de 760 pixels.</p>
<p><br clear="none" /></p>
<h4>Est-il possible d&rsquo;inclure le questionnaire directement dans un email?</h4>
<p>Oui, c&rsquo;est possible. Assurez-vous de cocher la case « Inclure le formulaire dans l&#8217;email » depuis le menu « Envoyer le formulaire ».</p>
<p><br clear="none" /></p>
<h4>Je voudrais pouvoir obtenir l&rsquo;adresse IP de chaque participant. Est-ce possible?</h4>
<p>Non, ce n&rsquo;est pas possible de tracer l&rsquo;adresse IP. Vous pouvez obliger l&rsquo;utilisateur à s’authentifier avant de pouvoir répondre au questionnaire, mais cela oblige l&rsquo;utilisateur à se connecter avec son compte Google.</p>
<p><br clear="none" /></p>
<h4>Est-il possible que les répondants modifient leurs réponses après avoir soumis le formulaire?</h4>
<p>Lors de la construction du formulaire, il y a une option sur la page de confirmation, « Modifier votre réponse : permet aux utilisateurs de modifier leurs réponses aux questions du formulaire ». Si cette option a été cochée, à la fin du questionnaire, la personne aura la page de confirmation avec un lien unique pour éditer ses réponses. Ce lien n&rsquo;est affiché qu&rsquo;une seul fois, si la personne ferme la fenêtre, elle ne pourra plus éditer ses réponses à nouveau. Vous trouverez plus d&rsquo;information sur la documentation officielle <a href="https://support.google.com/docs/answer/2839588?hl=fr" target="_blank" title="Envoyer un formulaire aux personnes à interroger">Envoyer un formulaire aux personnes à interroger</a>.</p>
<p><br clear="none" /></p>
<h4>Y-a-t-il un nombre maximum de réponses?</h4>
<p>Il n&rsquo;y a pas de limite particulière. Cependant, un formulaire a une <a href="https://support.google.com/drive/answer/37603?visit_id=1-636333046820323686-1884541626&#038;hl=fr&#038;rd=1" target="_blank" title="Fichiers pouvant être stockés dans Google Drive">limite de 2 millions de cellules</a>.</p>
<p><br clear="none" /></p>
<h4>Est-il possible de rediriger les utilisateurs vers un autre site une fois le formulaire soumis?</h4>
<p>Non, ce n&rsquo;est pas possible. Une bonne idée peut être de changer la page de confirmation à la fin de votre formulaire. Au lieu du classique « Votre réponse a été enregistrée », remplacez par une autre phrase invitant vos utilisateurs à cliquer sur un lien pour continuer.</p>
<p><br clear="none" /></p>
<h4>Est-il possible d&rsquo;imposer une date limite pour répondre au questionnaire?</h4>
<p>Il n&rsquo;y a pas de fonctionnalité toute faite pour cela. Mais rien ne vous empêche d&rsquo;ajouter une section de texte libre en haut du questionnaire pour indiquer que le questionnaire sera disponible jusqu&rsquo;au JJ/MM/AAAA. Et le jour J, vous <a href="https://support.google.com/docs/answer/139706?hl=fr" target="_blank" title="Afficher et gérer les réponses aux questions d'un formulaire">clôturez le questionnaire</a>. Cela aura le même effet.</p>
<p>Pour empêcher l&rsquo;envoi de nouvelles réponses, cliquez sur le bouton Accepter les réponses dans la barre d&rsquo;outils. Le bouton indiquera alors « Les réponses ne sont plus acceptées ». Pour réactiver l&rsquo;envoi de réponses, cliquez de nouveau sur ce bouton.<br />
Lorsqu&rsquo;un formulaire n&rsquo;accepte plus de réponse, les utilisateurs qui le consultent sont informés par un message que leurs réponses ne seront pas collectées. Pour personnaliser ce message, modifiez le texte qui s&rsquo;affiche sous le titre « Ce formulaire a été désactivé » dans la partie supérieure du formulaire.</p>
<p><br clear="none" /></p>
<h4>Est-il possible de créer un sondage multilingue?</h4>
<p>Ce n&rsquo;est pas possible, mais il y a plusieurs solutions de contournement qui peuvent être plus ou moins satisfaisantes.</p>
<p>Vous pouvez créer des formulaires différents, le lien sera différent, ainsi que le résumé des réponses. Il sera impossible de fusionner les résultats de manière automatique, il sera alors nécessaire de retravailler le tableau des réponses avec un tableur comme Excel (pour consolider les réponses).</p>
<p>Vous pouvez aussi ajouter une première question qui demande la langue de l&rsquo;utilisateur, ensuite vous affichez les sections suivantes dans la langue sélectionnée. L&rsquo;avantage, un lien unique pour tout le monde (pas de risque d&rsquo;erreur). L&rsquo;inconvénient, la question en français et la question en anglais seront des colonnes différentes car considérées comme des questions différentes (une cellule sur deux sera toujours vide), donc le résumé des réponses ne correspondra pas à vos attentes. Encore une fois, il faudra consolider les réponses manuellement.</p>
<p><br clear="none" /></p>
<h4>Est-il possible qu&rsquo;une personne commence à répondre à un questionnaire et puisse le reprendre plus tard?</h4>
<p>Non ce n&rsquo;est pas possible. Toutes les réponses sont enregistrées en une fois lors de la soumission du formulaire.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/">FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2012/09/24/using-google-docs-to-create-an-online-survey/" rel="bookmark" title="Réaliser un sondage en ligne avec Google Forms / Drive / Docs">Réaliser un sondage en ligne avec Google Forms / Drive / Docs</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/01/01/free-online-mongodb-training/" rel="bookmark" title="Formation en ligne gratuite sur MongoDB">Formation en ligne gratuite sur MongoDB</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/" rel="bookmark" title="Faut-il se méfier de Google?">Faut-il se méfier de Google?</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2014/02/22/measure-analyze-website-audience-matomo/" rel="bookmark" title="Mesurer et analyser l&rsquo;audience de votre site avec Matomo">Mesurer et analyser l&rsquo;audience de votre site avec Matomo</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/feed/</wfw:commentRss>
			<slash:comments>234</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3567</post-id>	</item>
		<item>
		<title>QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</title>
		<link>https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/</link>
					<comments>https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Thu, 14 Apr 2016 20:09:40 +0000</pubDate>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jigsaw]]></category>
		<category><![CDATA[qcon]]></category>
		<guid isPermaLink="false">http://blog.fabianpiau.com/?p=3520</guid>

					<description><![CDATA[<p>&#160;English version available Simon Ritter a donné une présentation sur le futur JDK 9 à QCon London. La politique de compatibilité de Java Il a commencé avec un fait intéressant: depuis longtemps, Java a une politique de compatibilité permanente. Si une application utilise uniquement des API prises en charge par une version N de Java, [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/">QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/06/computing-jobs-simplified-overview/" rel="bookmark" title="Panorama simplifié des métiers de l&rsquo;informatique">Panorama simplifié des métiers de l&rsquo;informatique</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2011/10/13/java-ee-cdi-vs-spring/" rel="bookmark" title="Java EE &#038; CDI vs. Spring">Java EE &#038; CDI vs. Spring</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" rel="bookmark" title="QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Simon Ritter a donné une présentation sur le futur JDK 9 à QCon London.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00084/jdk9-qcon-london.png?ssl=1" rel="shadowbox[sbpost-3520];player=img;" title="QCon London 2016 - Projet Jigsaw dans JDK 9 - La modularité arrive sur Java by Simon Ritter"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00084/jdk9-qcon-london-thumbnail.png?resize=550%2C365&#038;ssl=1" alt="QCon London 2016 - Projet Jigsaw dans JDK 9 - La modularité arrive sur Java" title="QCon London 2016 - Projet Jigsaw dans JDK 9 - La modularité arrive sur Java" width="550" height="365" class="size-medium wp-image-257" /></a><p class="wp-caption-text">QCon London 2016 - Projet Jigsaw dans JDK 9 - La modularité arrive sur Java</p></div>
<p><br clear="none" /></p>
<h4>La politique de compatibilité de Java</h4>
<p>Il a commencé avec un fait intéressant: depuis longtemps, Java a une politique de compatibilité permanente.<br />
Si une application utilise uniquement des API prises en charge par une version N de Java, elle devrait parfaitement fonctionner sur la version N+1, sans même devoir être recompilée.<br />
Voilà pourquoi, à ce jour, il y a:</p>
<ul>
<li>23 classes, 18 interfaces et 379 méthodes qui ont été dépréciées</li>
<li>Et rien qui n&rsquo;a été supprimé.</li>
</ul>
<p><br clear="none" /></p>
<h4>JDK 9 apporte des incompatibilités</h4>
<p>Le JDK est devenu de plus en plus lourd au fil des années. Les choses vont changer avec la version 9.</p>
<ul>
<li>Un petit nombre d&rsquo;API actuellement supportées sera supprimé</li>
<li>La structure binaire du JRE et JDK va changer (voire les détails ci-dessous)</li>
<li>Il est interdit d&rsquo;utiliser le caractère underscore <code>_</code> pour nommer une variable. C&rsquo;est maintenant un mot-clé réservé.</li>
<li>Il y aura un nouveau système de versionnage de sorte qu&rsquo;il sera plus facile de faire la distinction entre les versions majeures, mineures, ou les mises à jour liées à la sécurité ; par exemple, Java 9.1.2.1. Le format de versionnage actuel est difficile à comprendre, par exemple les versions 8u51 et 8u60 ne sont pas très explicites.</li>
</ul>
<p>La structure du JDK va changer. Le dossier JRE est supprimé, <code>tools.jar</code> et <code>rt.jar</code> ne seront plus présents, ces JARs contenaient pas mal de duplication.</p>
<div style="max-width: 372px" class="wp-caption aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Structure Pre-JDK 9" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00084/pre-jdk9-structure.png?resize=362%2C357&#038;ssl=1" alt="Structure pre-JDK 9" width="362" height="357" /><p class="wp-caption-text">Structure Pre-JDK 9</p></div>
<p>Pour mieux comprendre la structure pre-JDK 9, vous pouvez lire <a href="https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jdkfiles.html" target="_blank" title="JDK and JRE File Structure" rel="noopener noreferrer">JDK 8 and JRE File Structure</a>.</p>
<div style="max-width: 384px" class="wp-caption aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Structure JDK 9" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00084/jdk9-structure.png?resize=374%2C192&#038;ssl=1" alt="Structure JDK 9" width="374" height="192" /><p class="wp-caption-text">Structure JDK 9</p></div>
<p>La structure du JDK 9 est beaucoup plus propre.</p>
<p><a href="http://openjdk.java.net/jeps/260" target="_blank" title="JEP 260 proposal" rel="noopener noreferrer">JEP 260 proposal</a> est au coeur du JDK 9 et Jigsaw.</p>
<p>L&rsquo;idée est de rendre la plupart des API internes du JDK inaccessibles par défaut, mais en en laissant tout de même quelques-unes (celles qui sont largement utilisées et sont donc critiques) jusqu&rsquo;à ce qu&rsquo;elles soient remplacées.</p>
<p>Le but est d&rsquo;encapsuler toutes les API dépréciées dans un module, et finalement de s&rsquo;en débarrasser plus tard (JDK 10?).</p>
<blockquote><p>
Depuis la version 8 du JDK, un outil en ligne de commande existe pour analyser les dépendances de votre JAR ou de vos classes: <a href="https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool" target="_blank" title="Jdeps" rel="noopener noreferrer">jdeps</a>. Essayez-le! Il peut être utile pour savoir si vous utilisez encore des API internes du JDK. Vous devriez éviter d&rsquo;utiliser de telles dépendances, car elles peuvent être supprimées dans une future version du JDK.
</p></blockquote>
<p><br clear="none" /></p>
<h4>Jigsaw et les modules</h4>
<p>Nous parlons de module, mais qu&rsquo;est-ce que c&rsquo;est en fait?<br />
Jigsaw apporte de la modularité au JDK. Il rend Java plus évolutif et flexible, tout en améliorant la sécurité, la maintenabilité et la performance.<br />
Le JDK est divisé en modules, l&rsquo;idée est de prendre seulement ce dont on a besoin.</p>
<p><strong>Module</strong></p>
<p>Un module est un regroupement de code (collection de packages), il peut également contenir:</p>
<ul>
<li>Du code natif</li>
<li>Des ressources</li>
<li>Des données de configuration</li>
</ul>
<p><strong>Mon premier module</strong></p>
<p>Pour définir un module, vous devez créer un fichier <code>module-info.java</code>, qui contiendra (par exemple):</p>
<pre class="brush: java; light: true; title: ; notranslate">
module com.company.mymodule { 
  requires com.company.myothermodule; 
  requires java.sql; 
}
</pre>
<p>Vous pouvez avoir des dépendances transitives (un peu comme dans Maven) grâce au mot-clé <code>public</code>.</p>
<pre class="brush: java; light: true; title: ; notranslate">
module java.sql { 
  requires public java.logging; 
}
</pre>
<p>Cela signifie que si j&rsquo;ai une dépendance sur le module <code>java.sql</code>, je vais avoir accès à toutes les classes incluses dans <code>java.logging</code> (tout du moins tous les types marqués <code>public</code>).</p>
<p>Nous avons maintenant un graphe de dépendances des modules.</p>
<p><strong>Visibilité d&rsquo;un package</strong></p>
<p>Avec l&rsquo;utilisation du mot-clé <code>exports</code>.</p>
<pre class="brush: java; light: true; title: ; notranslate">
module com.company.myothermodule { 
  exports com.company.myothermodule.alpha;  
  exports com.company.myothermodule.beta; 
}
</pre>
<p>Ce qui est exporté est visible, ça ne l&rsquo;est pas par défaut!</p>
<p>Avec Java 9 et l&rsquo;arrivée des modules, nous devons redéfinir le mot-clé <code>public</code>. Il a maintenant plusieurs significations:</p>
<ul>
<li>Public à tout le monde</li>
<li>Public, mais seulement à des modules particuliers</li>
<li>Public, uniquement à l&rsquo;intérieur d&rsquo;un module</li>
</ul>
<p>Public ne signifie plus nécessairement accessible, c&rsquo;est un changement fondamental.<br />
Vous pouvez lire la <a href="http://openjdk.java.net/projects/jigsaw/spec/sotms/" target="_blank" title="spécification de Jigsaw" rel="noopener noreferrer">spécification de Jigsaw</a> pour en savoir plus.</p>
<p><strong>Compilation et exécution avec le « module path »</strong></p>
<p>Oubliez le <code>classpath</code>, il y a un nouveau paramètre <code>modulepath</code> (ou <code>-mp</code>) disponible avec la commande <code>javac</code> / <code>java</code>. Sa valeur contient un ou plusieurs répertoires qui contiennent les modules nécessaires pour compiler / exécuter votre application.</p>
<p>Enfin, notez qu&rsquo;il y aura des modules par défaut pour les fichiers JAR qui ne sont pas encore modularisés (module automatique).</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/">QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/06/computing-jobs-simplified-overview/" rel="bookmark" title="Panorama simplifié des métiers de l&rsquo;informatique">Panorama simplifié des métiers de l&rsquo;informatique</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2011/10/13/java-ee-cdi-vs-spring/" rel="bookmark" title="Java EE &#038; CDI vs. Spring">Java EE &#038; CDI vs. Spring</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" rel="bookmark" title="QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3520</post-id>	</item>
		<item>
		<title>QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</title>
		<link>https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/</link>
					<comments>https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Tue, 15 Mar 2016 23:49:30 +0000</pubDate>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[qcon]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">http://blog.fabianpiau.com/?p=3441</guid>

					<description><![CDATA[<p>&#160;English version available Juergen Hoeller, le co-fondateur du Framework Spring a fait une présentation la semaine dernière au QCon London. Commençons par un bref historique, le Framework Spring a été créé en 2002 avec une première version en 2004 (oui, c&#8217;était il y a 12 ans!), un bon bout de temps pour un framework qui [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/" rel="bookmark" title="QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java">QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2011/10/13/java-ee-cdi-vs-spring/" rel="bookmark" title="Java EE &#038; CDI vs. Spring">Java EE &#038; CDI vs. Spring</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Juergen Hoeller, le co-fondateur du <a href="https://spring.io/projects/spring-framework" target="_blank" title="Framework Spring" rel="noopener noreferrer">Framework Spring</a> a fait une présentation la semaine dernière au <a href="https://qconlondon.com/" target="_blank" title="site QCon London" rel="noopener noreferrer">QCon London</a>.</p>
<div style="max-width: 560px" class="wp-caption aligncenter"><a href="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00083/spring-5-qcon-london.jpg?ssl=1" rel="shadowbox[sbpost-3441];player=img;" title="QCon London 2016 - Spring Framework 5 - Preview &#038; Roadmap par Juergen Hoeller"><img data-recalc-dims="1" loading="lazy" decoding="async" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00083/spring-5-qcon-london-thumbnail.jpg?resize=550%2C365&#038;ssl=1" alt="QCon London 2016 - Spring Framework 5 - Preview &#038; Roadmap" title="QCon London 2016 - Spring Framework 5 - Preview &#038; Roadmap" width="550" height="365" class="size-medium wp-image-257" /></a><p class="wp-caption-text">QCon London 2016 - Spring Framework 5 - Preview & Roadmap</p></div>
<p><br clear="none" /></p>
<p>Commençons par un bref historique, le <a href="https://spring.io/projects/spring-framework" target="_blank" title="Framework Spring" rel="noopener noreferrer">Framework Spring</a> a été créé en 2002 avec une première version en 2004 (oui, c&rsquo;était il y a 12 ans!), un bon bout de temps pour un framework qui est encore largement utilisé et en cours de développement. Depuis sa création, l&rsquo;adoption et le nombre de projets au sein de Spring n&rsquo;ont jamais cessé de croître. Au début, Spring a été créé pour gérer des POJOs dans un conteneur léger en utilisant l&rsquo;injection de dépendances (en suivant le principe d&rsquo;<a href="https://fr.wikipedia.org/wiki/Inversion_de_contr%C3%B4le" title="définition Inversion de contrôle" target="_blank" rel="noopener noreferrer">Inversion de contrôle</a>), Spring était une alternative aux conteneurs JEE dits lourds tels que GlassFish ou WebSphere.</p>
<p><br clear="none" /></p>
<p>Spring est maintenant devenu un ensemble de projets disponibles pour satisfaire toutes les exigences du développement d&rsquo;une application. Spring est comme un jeu de <em>Legos</em>, vous pouvez sélectionner et assembler ces sous-projets comme des briques pour construire quelque chose de plus grand.</p>
<ul>
<li>Imaginez que vous avez besoin d&rsquo;utiliser une base de données, vous pouvez utiliser <a href="https://projects.spring.io/spring-data/" target="_blank" title="Spring Data" rel="noopener noreferrer">Spring Data</a></li>
<li>Vous avez besoin d&rsquo;une application sécurisée avec un système d&rsquo;authentification, il vous suffit d&rsquo;utiliser <a href="https://projects.spring.io/spring-security/" target="_blank" title="Spring Security" rel="noopener noreferrer">Spring Security</a></li>
<li>Vous voulez être en mesure de vous connecter à votre application par le biais des réseaux sociaux, <a href="https://docs.spring.io/spring-social/docs/current/reference/htmlsingle/" target="_blank" title="Spring Social" rel="noopener noreferrer">Spring Social</a> est là pour vous</li>
<li>Et ainsi de suite</li>
</ul>
<p>Vous pouvez jeter un oeil à la <a href="https://spring.io/projects" target="_blank" title="Projets Spring" rel="noopener noreferrer">liste complète des projets Spring</a>.</p>
<p><br clear="none" /></p>
<h4>Spring 4.3</h4>
<p>Avant de passer à Spring 5, Juergen a parlé de Spring 4. Quand j&rsquo;écris cet article, la version actuelle est 4.2.5. Une release candidate (RC) de Spring 4.3 sera disponible en mars 2016 suivie d&rsquo;une General availability (GA) en mai 2016. Cette version comprendra quelques changements pratiques:</p>
<ul>
<li>Dans le framework Spring core:<br />
L&rsquo;annotation <code>@autowired</code> utilisée pour injecter une dépendance sera implicite et sera donc désormais optionnelle</li>
<li>Dans Spring MVC (fait partie du core):<br />
La déclaration d&rsquo;un contrôleur MVC est simplifiée. Avant, <code>value</code> était le nom de l&rsquo;attribut à utiliser:</p>
<pre class="brush: java; light: true; title: ; notranslate">
@RequestMapping(value = &#039;/mypath&#039;, method = RequestMethod.POST)
</pre>
<p>Désormais, nous allons utiliser un nom plus significatif <code>path</code>:</p>
<pre class="brush: java; light: true; title: ; notranslate">
@RequestMapping(path = &#039;/mypath&#039;, method = RequestMethod.POST)
</pre>
<p>De nouvelles annotations font leur apparition, des raccourcis pour éviter de spécifier la méthode HTTP. Le nom de l&rsquo;attribut étant facultatif, la déclaration du contrôleur devient extrêmement simple.</p>
<pre class="brush: java; light: true; title: ; notranslate">
@PostMapping(&#039;/mypath&#039;)
</pre>
<p>Et l&rsquo;équivalent pour un <code>GET</code></p>
<pre class="brush: java; light: true; title: ; notranslate">
@GetMapping(&#039;/mypath&#039;)
</pre>
</li>
</ul>
<p><br clear="none" /></p>
<h4>Spring 5.0 annoncé</h4>
<p>Ensuite, Juergen a annoncé que Spring 5.0 sera disponible dans le courant de l&rsquo;année 2017 et compatible avec le JDK 8 et 9. Sur la roadmap, la version AG devrait être disponible en Mars 2017 (en même temps que le JDK 9 sera publié). Dans le cas où la release du JDK 9 serait retardée, Spring 5.0 le sera probablement aussi.</p>
<p><br clear="none" /></p>
<h4>Quelles sont les principales nouveautés de Spring 5?</h4>
<p>Il y a 3 thèmes clés qui vont modifier le framework:</p>
<ul>
<li>JDK 9 et les modules Jigsaw</li>
<li>Servlet 4.0 et HTTP/2</li>
<li>Architecture réactive</li>
</ul>
<p><br clear="none" /></p>
<h4>JDK 9 et l&rsquo;utilisation de Jigsaw</h4>
<p>En une phrase, <a href="http://openjdk.java.net/projects/jigsaw/" target="_blank" title="Jigsaw" rel="noopener noreferrer">Jigsaw</a> apporte de la modularité au JDK. Le JDK est divisé en modules et vous pouvez utiliser seulement ceux dont vous avez besoin pour créer votre application.</p>
<p>Le JDK sera livré avec un ensemble de modules, mais vous pouvez également définir vos propres modules. Pour définir un module, vous devez créer un fichier <code>module-info.java</code>:</p>
<pre class="brush: java; light: true; title: ; notranslate">
module my.app.db {
  requires java.sql;
  requires spring.jdbc;
}
</pre>
<p>A l&rsquo;intérieur d&rsquo;un module, vous spécifiez les modules dont vous avez besoin avec le mot-clé <code>requires</code>. Les modules gèrent les dépendances transitives, un peu comme Maven. Si j&rsquo;utilise le module <code>my.app.db</code> ci-dessus, je peux accéder à l&rsquo;ensemble des classes venant du module <code>java.sql</code>. Le principal avantage est que cela rend votre application plus modulaire en reposant sur un sous-ensemble de modules au lieu d&rsquo;un JDK complet.</p>
<p>Tous les jars de Spring 5 seront packagés avec ces métadonnées Jigsaw, le nom du module suivra les conventions déjà utilisées sur le repo Maven Central afin d&rsquo;éviter toute confusion (spring-context, spring-jdbc, spring-webmvc&#8230;). Il sera très facile de construire vos applications en spécifiant les modules Spring dont vous avez besoin.</p>
<p><br clear="none" /></p>
<h4>HTTP/2</h4>
<p>HTTP/1.1 est un vieux protocole (1999) et souffre de limitations. Dans le monde du front-end, nous utilisons des solutions de contournement, mais ce n&rsquo;est pas l&rsquo;idéal. Par exemple, pour éviter de surcharger le serveur avec de multiples requêtes lorsqu&rsquo;une page contient beaucoup d&rsquo;images, nous utilisons des sprites CSS (c.-à-d. combiner ces images dans un seul fichier que nous « découpons » ensuite côté client via CSS). Avec HTTP/2, le protocole est plus rapide car il permet des requêtes simultanées. Il y a d&rsquo;autres avantages que vous pouvez lire sur la FAQ <a href="https://http2.github.io/faq/" target="_blank" title="HTTP/2 Frequently Asked Questions" rel="noopener noreferrer">HTTP/2 Frequently Asked Questions</a>.</p>
<p>Comme l&rsquo;a déclaré Juergen, « Nous devons adopter HTTP/2 dans les terres de Java! »</p>
<p>Pour ce faire, Spring 5 utilisera la dernière version de la librairie Servlet, <a href="https://web.archive.org/web/20210508034255/https://blogs.oracle.com/theaquarium/servlet-40" target="_blank" title="Servlet 4.0" rel="noopener noreferrer">Servlet 4.0</a> qui:</p>
<ul>
<li>Impose le support pour HTTP/2 dans des conteneurs de servlet</li>
<li>Contient des fonctionnalités pour prioriser les Streams et le push de ressources via une API</li>
</ul>
<p><br clear="none" /></p>
<h4>Programmation réactive</h4>
<p>Un autre point fort a été l&rsquo;annonce de la création d&rsquo;un nouveau projet Spring appelé Spring Reactive. Ce sera un Spring MVC-like avec des endpoints basés sur une fondation réactive.</p>
<ul>
<li>Réutilisation de style de modèle de programmation de Spring MVC</li>
<li>Mais en acceptant ou en retournant des  reactive streams (par exemple, <a href="https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html" target="_blank" title="Reactor Mono publisher" rel="noopener noreferrer">Mono</a> &#8211; 1 élément, <a href="https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html" target="_blank" title="Reactor Flux publisher" rel="noopener noreferrer">Flux</a> &#8211; liste d&rsquo;éléments)</li>
</ul>
<p>Spring Reactive sera basé sur le <a href="https://github.com/reactor/reactor" target="_blank" title="Project Reactor Github" rel="noopener noreferrer">Project Reactor</a>, un ensemble de bibliothèques pour construire des applications réactives cloud-ready sur la JVM. Ce nouveau projet ne sera pas indépendant et sera inclus dans le noyau Spring Framework à un moment donné.</p>
<p>Juergen nous rappelle que le « Reactive arrive »:</p>
<ul>
<li>Pas de blocage de thread</li>
<li>Les drivers réactif pour les bases de données deviennent disponibles (PostgreSQL, Mongo, Couchbase&#8230;)</li>
<li>Il y a aussi des clients HTTP réactifs (Netty, Jetty, OkHttp&#8230;)</li>
</ul>
<blockquote><p>Note pour moi-même et peut-être aussi pour vous, il est important de se documenter sur le Reactive Programming et se familiariser avec les concepts. Il y a de grandes chances qu&rsquo;il se démocratise dans les années qui viennent.</p></blockquote>
<p><br clear="none" /></p>
<p>Enfin, Spring 5 utilisera toutes les dernières fonctionnalités introduites avec Java 8:</p>
<ul>
<li>Lambdas, références de méthode, méthodes par défaut dans les interfaces</li>
<li>Nouvelles classes utilitaires: <code>java.util.Optional</code>, <code>java.util.function</code>, <code>java.util.stream</code></li>
</ul>
<p><br clear="none" /></p>
<p>Evidemment, Spring 5 nécessite Java 8. Si votre projet utilise encore une ancienne version, vous devrez vous contenter de Spring 4.X. La bonne nouvelle est que Spring 4 aura un support étendu jusqu&rsquo;en 2020, de sorte que vous aurez encore un peu de temps pour migrer!</p>
<p><br clear="none" /></p>
<p>Les slides de la présentation sont disponibles sur le <a href="https://qconlondon.com/london-2016/system/files/presentation-slides/juergenhoeller-springframework5_0.pdf" target="_blank" title="Slides - QCon London 2016 - Spring Framework 5 - Preview &amp; Roadmap" rel="noopener noreferrer">site de QCon</a>.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/">QCon London 2016 &#8211; Spring Framework 5 &#8211; Preview et Roadmap</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2016/04/14/qcon-london-2016-project-jigsaw-in-jdk-9-modularity-comes-to-java/" rel="bookmark" title="QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java">QCon London 2016 &#8211; Projet Jigsaw dans JDK 9 &#8211; La modularité arrive sur Java</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/12/27/a-java-11-migration-successful-story/" rel="bookmark" title="Une migration Java 11 réussie">Une migration Java 11 réussie</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2011/10/13/java-ee-cdi-vs-spring/" rel="bookmark" title="Java EE &#038; CDI vs. Spring">Java EE &#038; CDI vs. Spring</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/05/21/devoxx-uk-day-1/" rel="bookmark" title="Devoxx UK 2018 &#8211; Jour 1">Devoxx UK 2018 &#8211; Jour 1</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2016/03/15/qcon-london-2016-spring-framework-5-preview-and-roadmap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3441</post-id>	</item>
		<item>
		<title>Les meilleurs outils gratuits pour tester et optimiser une application ou un site web</title>
		<link>https://blog.fabianpiau.com/fr/2015/11/15/the-best-free-and-online-tools-for-testing-and-optimizing-an-application-or-website/</link>
					<comments>https://blog.fabianpiau.com/fr/2015/11/15/the-best-free-and-online-tools-for-testing-and-optimizing-an-application-or-website/#comments</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Sun, 15 Nov 2015 17:58:52 +0000</pubDate>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[online tool]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">http://blog.fabianpiau.com/?p=3201</guid>

					<description><![CDATA[<p>&#160;English version available Voici quelques outils en ligne pour vous assurer que votre site web soit performant, ne contienne pas d&#8217;erreurs et soit optimisé pour le référencement. Ces trois caractéristiques sont très importantes car elles forment un cercle vertueux en se renforcant mutuellement. Aucune ne doit donc être négligée. Performance Après avoir analysé votre site, [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2015/11/15/the-best-free-and-online-tools-for-testing-and-optimizing-an-application-or-website/">Les meilleurs outils gratuits pour tester et optimiser une application ou un site web</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2010/04/04/maven-site-one-step-further/" rel="bookmark" title="Plus loin avec le Maven Site">Plus loin avec le Maven Site</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/" rel="bookmark" title="Conseils pour sécuriser votre site WordPress">Conseils pour sécuriser votre site WordPress</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/06/10/watin-an-automation-web-testing-tool/" rel="bookmark" title="WatiN, un outil pour tester les applications web">WatiN, un outil pour tester les applications web</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/15/optimize-your-website-for-print-in-5-minutes/" rel="bookmark" title="Optimiser votre site web pour l&rsquo;impression en 5 minutes">Optimiser votre site web pour l&rsquo;impression en 5 minutes</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2015/11/15/the-best-free-and-online-tools-for-testing-and-optimizing-an-application-or-website/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p>Voici quelques outils en ligne pour vous assurer que votre site web soit performant, ne contienne pas d&rsquo;erreurs et soit optimisé pour le référencement. Ces trois caractéristiques sont très importantes car elles forment un cercle vertueux en se renforcant mutuellement. Aucune ne doit donc être négligée.</p>
<p><br clear="none" /></p>
<p class="right" style="padding-left:15px;"><a href="https://gtmetrix.com/" target="_blank" title="GTMetrix" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" title="GTMetrix" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00082/speedometer.png?resize=175%2C175&#038;ssl=1" alt="GTMetrix" width="175" height="175" /></a></p>
<h4>Performance</h4>
<p>Après avoir analysé votre site, <a href="https://gtmetrix.com/" target="_blank" title="GTMetrix" rel="noopener">GTMetrix</a> vous donnera de précieux conseils pour améliorer sa performance.</p>
<ul>
<li>Minimiser les ressources à charger pour diminuer le nombre de requêtes HTTP (utilisation de <a href="https://spritegen.website-performance.org/" target="_blank" title="CSS sprites" rel="noopener">sprites</a>, fusion des fichiers)</li>
<li>Réduire la taille de vos ressources. Il existe de très bons compresseurs en ligne pour les <a href="https://tinypng.com/" target="_blank" title="TinyPNG" rel="noopener">images (TinyPNG)</a>, les <a href="https://www.toptal.com/developers/cssminifier/" target="_blank" title="CSS minifier" rel="noopener">fichiers CSS</a> et <a href="https://www.toptal.com/developers/javascript-minifier/" target="_blank" title="JS minifier" rel="noopener">Javascript</a>.</li>
<li>Spécifier les dimensions des images, le navigateur n&rsquo;a plus besoin de faire ce calcul</li>
<li>Utiliser le cache du navigateur</li>
</ul>
<p><br clear="none" /></p>
<p class="right" style="padding-left:15px;"><a href="https://seositecheckup.com/" target="_blank" title="SEO SiteCheckup" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" title="SEO SiteCheckup" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00082/seo.png?resize=500%2C208&#038;ssl=1" alt="SEO SiteCheckup" width="500" height="208" /></a></p>
<h4>Référencement et SEO</h4>
<p>Vous pouvez vérifier votre référencement avec <a href="https://seositecheckup.com/" target="_blank" title="SEO SiteCheckup" rel="noopener">SEO SiteCheckup</a>. Cet outil vous donnera de précieuses informations afin d&rsquo;améliorer la visibilité de votre site sur Internet.</p>
<ul>
<li>Utilisation des balises et attributs HTML standards (title, description, h1, h2, alt&#8230;)</li>
<li>Présence du plan du site (fichier sitemap)</li>
<li>Détection des liens cassés</li>
<li>Détection de l&rsquo;activité sociale liée à votre site, votre présence sur les réseaux sociaux</li>
</ul>
<p><br clear="none" /></p>
<p class="right" style="padding-left:15px;"><a href="https://www.w3.org/developers/tools/" target="_blank" title="Outils W3C" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Outils W3C" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00082/analytics.png?resize=300%2C200&#038;ssl=1" alt="Outils W3C" width="300" height="200" /></a></p>
<h4>Validation technique</h4>
<p>Vous devez aussi vous assurer que votre site est valide d&rsquo;un point de vue technique. Je vous conseille <a href="https://www.w3.org/developers/tools/" target="_blank" title="Outils W3C" rel="noopener">les outils officiels fournis par le World Wide Web Consortium (W3C)</a>. Chaque outil est spécifique pour un usage particulier. Par exemple, vous trouverez un outil pour valider:</p>
<ul>
<li><a href="https://validator.w3.org/" target="_blank" title="Validateur de fichiers HTML" rel="noopener">Les fichiers HTML</a></li>
<li><a href="https://jigsaw.w3.org/css-validator/" target="_blank" title="Validateur de fichiers CSS" rel="noopener">Les fichiers CSS</a></li>
<li><a href="https://validator.w3.org/checklink" target="_blank" title="Validateur de liens" rel="noopener">Les liens</a></li>
<li><a href="https://validator.w3.org/feed/" target="_blank" title="Validateur de flux RSS" rel="noopener">Votre flux RSS</a></li>
</ul>
<p>Il n&rsquo;est pas nécessaire de valider chacune de vos pages, une par une. La validation de la page d&rsquo;accueil est en général suffisante, les autres pages en découlant.</p>
<p><br clear="none" /></p>
<p class="right" style="padding-left:15px;"><a href="https://www.mail-tester.com/" target="_blank" title="Mail tester" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Mail tester" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00082/email.png?resize=150%2C150&#038;ssl=1" alt="Mail tester" width="150" height="150" /></a></p>
<h4>Email</h4>
<p>Votre application envoie des emails? Avec <a href="https://www.mail-tester.com/" target="_blank" title="Mail tester" rel="noopener">Mail tester</a>, vous pouvez tester la pertinence et le format de vos emails. Cet outil vous permettra de savoir si votre courrier est considéré comme indésirable par les clients de messagerie et vous donnera également des astuces pour éviter une telle situation.</p>
<ul>
<li>Le contenu doit s&rsquo;adapter à la taille de l&rsquo;écran (design responsive)</li>
<li>Un format texte alternatif doit être présent pour les clients email qui ne peuvent lire du HTML</li>
<li>La configuration de l&rsquo;authentification de vos emails doit être valide (SPF, DKIM)</li>
</ul>
<p class="center"><a href="https://www.w3.org/developers/tools/" target="_blank" title="Outils W3C" rel="noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Outils W3C" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00082/responsive.png?resize=273%2C160&#038;ssl=1" alt="Outils W3C" width="273" height="160" /></a></p>
<p><br clear="none" /></p>
<p>Pour vous donner une idée des résultats de votre site par rapport aux autres, la plupart des outils énoncés dans l&rsquo;article vous attribueront une note, à vous de jouer pour augmenter votre score!</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2015/11/15/the-best-free-and-online-tools-for-testing-and-optimizing-an-application-or-website/">Les meilleurs outils gratuits pour tester et optimiser une application ou un site web</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2010/04/04/maven-site-one-step-further/" rel="bookmark" title="Plus loin avec le Maven Site">Plus loin avec le Maven Site</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2018/10/10/tips-to-make-your-wordpress-website-secure/" rel="bookmark" title="Conseils pour sécuriser votre site WordPress">Conseils pour sécuriser votre site WordPress</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/06/10/watin-an-automation-web-testing-tool/" rel="bookmark" title="WatiN, un outil pour tester les applications web">WatiN, un outil pour tester les applications web</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2013/09/15/optimize-your-website-for-print-in-5-minutes/" rel="bookmark" title="Optimiser votre site web pour l&rsquo;impression en 5 minutes">Optimiser votre site web pour l&rsquo;impression en 5 minutes</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2015/11/15/the-best-free-and-online-tools-for-testing-and-optimizing-an-application-or-website/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3201</post-id>	</item>
		<item>
		<title>Faut-il se méfier de Google?</title>
		<link>https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/</link>
					<comments>https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/#respond</comments>
		
		<dc:creator><![CDATA[Fabian Piau]]></dc:creator>
		<pubDate>Mon, 25 May 2015 21:22:03 +0000</pubDate>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[vie privée]]></category>
		<guid isPermaLink="false">http://blog.fabianpiau.com/?p=3122</guid>

					<description><![CDATA[<p>&#160;English version available Google ancré dans nos quotidiens On ne compte plus les reportages relatant l&#8217;hégémonie de la firme américaine. Le succès de Google fascine, agace, fait peur. Comme la plupart des internautes, il se passe difficilement un jour sans que vous ne fassiez appel à un de leurs services, Google vous accompagne partout: Navigation [&#8230;]</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/">Faut-il se méfier de Google?</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2012/09/24/using-google-docs-to-create-an-online-survey/" rel="bookmark" title="Réaliser un sondage en ligne avec Google Forms / Drive / Docs">Réaliser un sondage en ligne avec Google Forms / Drive / Docs</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/" rel="bookmark" title="FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs">FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2012/07/25/open-street-map-better-map-than-google-maps/" rel="bookmark" title="Open Street Map, une meilleure carte que Google Maps?">Open Street Map, une meilleure carte que Google Maps?</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/08/19/google-wave/" rel="bookmark" title="Google Wave">Google Wave</a></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p><a class="lang" href="https://blog.fabianpiau.com/en/2015/05/25/should-we-be-wary-of-google/" title="Read in english"><strong class="labellang"><span class="en">&nbsp;</span>English version available</strong></a></p>
<p><br clear="none" /></p>
<p class="center"><img data-recalc-dims="1" loading="lazy" decoding="async" title="Logo Google" src="https://i0.wp.com/blog.fabianpiau.com/wp-content/uploads/post/00081/google-logo.png?resize=550%2C242&#038;ssl=1" alt="Logo Google" width="550" height="242" /></p>
<h4>Google ancré dans nos quotidiens</h4>
<p>On ne compte plus les reportages relatant l&rsquo;hégémonie de la firme américaine. Le succès de Google fascine, agace, fait peur. Comme la plupart des internautes, il se passe difficilement un jour sans que vous ne fassiez appel à un de leurs services, Google vous accompagne partout:</p>
<ul>
<li>Navigation sur Internet avec Google Chrome</li>
<li>Recherche sur Internet avec Google Web Search</li>
<li>Lecture de vos emails avec la messagerie Gmail</li>
<li>Prise de rendez-vous avec Google Calendar</li>
<li>Gestion de vos albums photo avec Picasa</li>
<li>Dialogue avec vos amis avec Google+ ou Google Hangouts</li>
<li>Lecture de vidéos avec YouTube</li>
<li>Lecture de livres avec Google Books</li>
<li>Gestion de vos documents avec Google Docs</li>
<li>Traduction d&rsquo;un article avec Google Translate</li>
<li>Planification de vos déplacements avec Google Maps</li>
<li>Gestion de votre téléphone, de vos contacts, de votre réveil (et plus) avec Android</li>
<li>Et toujours plus&#8230;</li>
</ul>
<p>Le géant se diversifie et est sur tous les fronts (domotique, robotique, automobile&#8230;). Il garde une stratégie cohérente basée sur la personne et l&rsquo;amélioration de la vie quotidienne. Vous pouvez regarder <a href="https://fr.wikipedia.org/wiki/Liste_des_acquisitions_de_Google" target="_blank" title="Liste des acquisitions de Google">la liste des acquisitions</a> pour vous en convaincre.</p>
<p><br clear="none" /></p>
<h4>Une recherche peut en cacher une autre</h4>
<p>Saviez-vous que Google mémorise toutes vos recherches? Google est capable de remonter dans votre historique de recherche jusqu&rsquo;à plusieurs années en arrière, à la seconde près. Le fait de savoir que vous avez recherché des informations sur votre futur voyage en Thaïlande le 10 août 2005 à 10h05 n&rsquo;est peut-être pas très utile pour vous, mais cette information et toutes les autres représentent une véritable mine d&rsquo;or pour le géant en lui permettant d&rsquo;établir votre profil très détaillé. Depuis les paramètres avancés de votre compte, il est pourtant possible de désactiver cette fonctionnalité. Ce n&rsquo;est pas l&rsquo;utilisateur lambda qui le fera, ce n&rsquo;est pas une coïncidence que ce paramètre soit activé par défaut. Une recherche sur Google est un geste qui peut paraitre banal et anodin, mais il ne l&rsquo;est pas tant que cela. Imaginez que vous faites des recherches sur:</p>
<ul>
<li>Les voitures et les comparatifs, Google déterminera que vous allez changer de voiture</li>
<li>La mode et les vêtements tout au long de l&rsquo;année, Google déterminera que vous travaillez dans ce secteur</li>
<li>Une maladie et des remèdes associés, Google déterminera que vous avez cette maladie</li>
<li>Des astuces pour économiser de l&rsquo;argent, Google déterminera que vous avez des fins de mois difficiles</li>
</ul>
<p>Travails, lieux d&rsquo;habitations, goûts musicaux, cinématographiques, culinaires, passions ou tendances politiques, ces exemples sont assez simples, mais en recoupant les informations, il est possible d&rsquo;aller très loin. Il devient ainsi possible de relater de manière très précise les événements de toute une vie. C&rsquo;est à en faire pâlir plus d&rsquo;un compte Facebook!</p>
<p><br clear="none" /></p>
<h4>Le produit, c&rsquo;est vous</h4>
<p>Sans vous en rendre compte, Google collecte en permanence des centaines d&rsquo;informations sur vous. Il construit et consolide les profils complets de nos vies, il en sait surement plus sur vous que votre propre mère ou peut être que vous-même. Les services de Google sont gratuits en échange de vos données personnelles, c&rsquo;est un contrat implicite que vous avez accepté (pas forcément lu) en créant votre compte. Les données collectées peuvent être revendues et utilisées pour des campagnes marketing ciblées, des statistiques, etc. Vous êtes donc la monnaie d&rsquo;échange du système, la vraie gratuité existe difficilement sur internet. Après tout, c&rsquo;est de bonne guerre!</p>
<p><br clear="none" /></p>
<h4>Attention, vous êtes filtré</h4>
<p>Le moteur de recherche affiche une liste personnalisée, en ne retenant que les résultats jugés pertinents en fonction de votre profil. Vous pouvez faire une expérience simple chez vous: lancez plusieurs recherches avec les mêmes mots clés, mais sur des comptes Google différents. Vous verrez sans doute des résultats légèrement différents, ils le seront d&rsquo;autant plus que les personnes sont différentes (sexe ou génération différente par exemple). A première vue, c&rsquo;est un aspect positif, car les résultats qui s&rsquo;affichent sont pertinents pour l&rsquo;utilisateur connecté, mais cela peut aussi être un danger à long terme. La première vocation d&rsquo;internet est l&rsquo;accès au savoir universel avec une censure limitée. Si vous intercalez un système de filtrage intelligent sur vos recherches, ce sont des articles ou même des pans entiers d&rsquo;internet dont vous ne connaitrez jamais l&rsquo;existence, car Google l&rsquo;a décidé. Le savoir et l&rsquo;accès à l&rsquo;information deviennent en quelque sorte limités, voire erronés.</p>
<p><br clear="none" /></p>
<h4>Je ne suis pas un anti-Google</h4>
<p>Ne vous méprenez pas, cet article n&rsquo;est en aucune façon un pamphlet contre Google. Je suis un utilisateur satisfait depuis des années et je n&rsquo;envisage en aucun cas de me passer de leurs services. Cet article est davantage une piqûre de rappel, il vaut mieux prendre le temps de configurer votre compte plutôt que de laisser Google décider à votre place. Malheureusement, je n&rsquo;ai pas de recette miracle pour continuer à utiliser Google tout en préservant son anonymat, ce n&rsquo;est pas compatible. Cependant, si je dois vous conseiller une alternative au moteur de recherche, je vous invite à essayer <a href="https://duckduckgo.com/" target="_blank" title="Moteur de recherche DuckDuckGo">DuckDuckGo</a>. Ce moteur de recherche a acquis une grande popularité ces dernières années en misant sur le respect de votre vie privée tout en assurant de bons résultats de recherche.</p>
<p>The article <a href="https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/">Faut-il se méfier de Google?</a> was written by Fabian Piau.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-list'>
<!-- YARPP List -->
<h3>Articles similaires:</h3><ol>
<li><a href="https://blog.fabianpiau.com/fr/2012/09/24/using-google-docs-to-create-an-online-survey/" rel="bookmark" title="Réaliser un sondage en ligne avec Google Forms / Drive / Docs">Réaliser un sondage en ligne avec Google Forms / Drive / Docs</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2016/04/24/faq-online-survey-with-google-docs-drive-forms/" rel="bookmark" title="FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs">FAQ &#8211; Sondage en ligne avec Google Forms / Drive / Docs</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2012/07/25/open-street-map-better-map-than-google-maps/" rel="bookmark" title="Open Street Map, une meilleure carte que Google Maps?">Open Street Map, une meilleure carte que Google Maps?</a></li>
<li><a href="https://blog.fabianpiau.com/fr/2009/08/19/google-wave/" rel="bookmark" title="Google Wave">Google Wave</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.fabianpiau.com/fr/2015/05/25/should-we-be-wary-of-google/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3122</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced (DONOTCACHEPAGE constant is defined) 
Minified using Disk
Mise en cache de la base de données de 2/203 requêtes en 0.094 secondes utilisant Disk (Request-wide DONOTCACHEDB constant defined)

Served from: blog.fabianpiau.com @ 2026-03-29 09:00:47 by W3 Total Cache
-->