<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <generator uri="https://11ty.dev/" version="3.1.6">Eleventy</generator>
  <title>Sylvain METAYER</title>
  <subtitle>Développeur backend &amp; DevOps à Bordeaux</subtitle>
  <link href="https://www.sylvain.dev/feed.xml" rel="self"/>
  <link href="https://www.sylvain.dev/"/>
  
    <updated>2022-02-05T00:00:00Z</updated>
  
  
  <id>https://sylvain.dev</id>
  <author>
    <name>Sylvain METAYER</name>
    <email>bonjour@sylvain.dev</email>
  </author>
  
    
    <entry>
      <title>Premier Meetup</title>
      <link href="https://www.sylvain.dev/article/meetup-terraform/"/>
      <updated>2022-02-05T00:00:00Z</updated>
      <id>https://sylvain.dev/article/meetup-terraform/</id>
      <content type="html">
        <![CDATA[
      <p>J’ai eu l’occasion de faire mon premier meetup live avec onepoint le 1er février sur Youtube. Le sujet était : ‘Terraform, REX d’un développeur’. Pour celles et ceux qui souhaiteraient le regarder, je vous invite à le visionner en replay ici : <a href="https://www.youtube.com/watch?v=GR_YJIfo8jg&amp;list=PLm-YYS9h2JhWiAZ5QuuJD6jyghWjkK09q&amp;index=27">Lien Youtube</a>.</p>
<p>Je suis content de moi, qui préfère d’habitude être derrière la caméra. Le fait d’avoir été encouragé à réaliser ce retour d’expérience m’a permi de me dépasser et finalement, la chose à retenir est que 45min, c’est à la fois long et court :)</p>

    ]]>
      </content>
      
        <category term="onepoint"/>
      
        <category term="terraform"/>
      
        <category term="meetup"/>
      
      
        <summary type="html">
          J&#39;ai eu l&#39;occasion de faire mon premier meetup le 1er février sur Youtube
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Récupérer les dumps SQL depuis une instance MySQL/Mariadb qui ne démarre plus</title>
      <link href="https://www.sylvain.dev/article/recuperer-donnees-mysql/"/>
      <updated>2021-05-04T00:00:00Z</updated>
      <id>https://sylvain.dev/article/recuperer-donnees-mysql/</id>
      <content type="html">
        <![CDATA[
      <p>Suite à une mise à jour de mon raspberry pi qui s’est plus ou moins bien passée, ma base de données MariaDB ne démarrait plus, indiquant une erreur suite à la mise à jour. J’avais donc un MySQL qui refusait de démarrer, et bien sur, pas de backup !</p>
<p>Néanmoins, je disposais quand même du dossier <code>/var/lib/mysql</code> qui semblait intact. J’ai donc fait un tar.gz du dossier avant de le récupérer en local pour voir ce que je pouvais en faire.</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># on créé le tar.gz sur le serveur</span>
$ <span class="token function">sudo</span> <span class="token function">tar</span> <span class="token parameter variable">-zcvf</span> ~/mysql.tar.gz /var/lib/mysql
<span class="token comment"># on le récupère en local</span>
$ <span class="token function">scp</span> pi:~mysql.tar.gz <span class="token builtin class-name">.</span></code></pre>
<p>Une fois cela fait, j’ai utilisé Docker et l’image mariadb (dans la version 10.3, qui était celle utilisée sur mon serveur pour éviter toute incompatibilité) pour pouvoir lancer une instance locale de mariadb, avec les données récupérées précédemment.</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># Extraction du tar.gz</span>
$ <span class="token function">tar</span> <span class="token parameter variable">-xzvf</span> mysql.tar.gz
$ <span class="token builtin class-name">cd</span> var/lib
<span class="token comment"># J'aurais besoin de ce dossier pour récupérer mes dump SQL plus tard</span>
$ <span class="token function">mkdir</span> backup

$ <span class="token function">docker</span> run <span class="token parameter variable">--name</span> restore_mariadb <span class="token parameter variable">-v</span> <span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">pwd</span><span class="token variable">)</span></span>/data:/var/lib/mysql <span class="token parameter variable">-v</span> <span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">pwd</span><span class="token variable">)</span></span>:/backup <span class="token parameter variable">-e</span> <span class="token assign-left variable">MYSQL_ROOT_PASSWORD</span><span class="token operator">=</span>root <span class="token parameter variable">-d</span> mariadb:10.3</code></pre>
<p>La variable d’environnement est nécessaire sinon l’image ne démarrera pas, mais il faut bien garder en tête qu’il faudra indiquer le mot de passe de votre instance mySQL telle qu’elle était sur votre serveur.</p>
<p>Une fois cela fait, il suffit de lancer la commande suivante pour se connecter au conteneur :</p>
<pre class="language-bash"><code class="language-bash">$ <span class="token function">docker</span> <span class="token builtin class-name">exec</span> <span class="token parameter variable">-it</span> restore_mariadb <span class="token function">bash</span>
root@e11929a58f8b:/<span class="token comment"># mysql -u root -p</span>
Enter password:
Welcome to the MariaDB monitor.  Commands end with <span class="token punctuation">;</span> or <span class="token punctuation">\</span>g.
Your MariaDB connection <span class="token function">id</span> is <span class="token number">8</span>
Server version: <span class="token number">10.3</span>.23-MariaDB-1:10.3.23+maria~focal mariadb.org binary distribution

Copyright <span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token number">2000</span>, <span class="token number">2018</span>, Oracle, MariaDB Corporation Ab and others.

Type <span class="token string">'help;'</span> or <span class="token string">'\h'</span> <span class="token keyword">for</span> help. Type <span class="token string">'\c'</span> to <span class="token function">clear</span> the current input statement.

MariaDB <span class="token punctuation">[</span><span class="token punctuation">(</span>none<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token operator">></span></code></pre>
<p>Et enfin, on peut faire des mysqldump et stocker le résultats dans le dossier <code>/backup</code> que l’on a également monté pour pouvoir restaurer les données une fois la base de données de nouveau opérationnelle.</p>
<pre class="language-bash"><code class="language-bash">mysqldump <span class="token parameter variable">-u</span> root <span class="token parameter variable">-p</span> mabase <span class="token operator">></span> /backup/mysql.sql</code></pre>
<p>En espérant que cela puisse être utile à d’autres !</p>
<blockquote>
<p>Et si jamais vous n’en avez pas de récentes, allez faire une sauvegarde de vos données dès maintenant :)</p>
</blockquote>

    ]]>
      </content>
      
        <category term="mysql"/>
      
      
        <summary type="html">
          Suite à une mise à jour de mon raspberry pi qui s&#39;est plus ou moins bien passée, ma base de données MariaDB ne démarrait plus
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Gestionnaire d&#39;alias d&#39;emails</title>
      <link href="https://www.sylvain.dev/article/email-alias-manager/"/>
      <updated>2020-01-27T00:00:00Z</updated>
      <id>https://sylvain.dev/article/email-alias-manager/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://app.netlify.com/start/deploy?repository=https://github.com/sylvainmetayer/alias-gandi-angular"><img src="https://www.netlify.com/img/deploy/button.svg" alt=""></a></p>
<h2 id="l%E2%80%99id%C3%A9e" tabindex="-1"><a class="heading-link" href="#l%E2%80%99id%C3%A9e">L’idée</a></h2>
<p>Trop de spam ? Marre de donner son addresse email à chaque service ? Les alias mail sont là à la rescousse !</p>
<p>Suite à une idée d’<a href="https://adrienchinour.me">Adrien Chinour</a>, j’ai décidé de créer à mon tour un petit gestionnaire d’alias pour mes adresses emails. L’objectif est de pouvoir générer rapidement des alias afin de ne pas donner sa véritable adresse email lors d’inscription sur des sites divers. Ainsi, si l’on constate que le site envoie un peu trop de mail à notre goût, que l’on utilise plus le service, ou que réussir à se désinscrire relève du parcours du combattant, on supprime l’alias, et plus de mail indésirables !</p>
<p>Ayant mes domaines gérés par <a href="https://gandi.net">Gandi</a>, j’ai regardé comment interagir avec mes adresses emails pour créer des alias depuis leur <a href="https://api.gandi.net/docs/">API</a>.</p>
<p>Au niveau des technologies utilisées, j’ai utilisé <a href="https://angular.io">Angular</a> et les fonctions serverless de <a href="https://netlify.com">Netlify</a> (en NodeJS) afin de gérer les appels à l’API Gandi.</p>
<p>Le principe est très simple: on s’authentifie avec un mot de passe, prédéfini dans les variables d’environnements des fonctions serverless de Netlify, on obtient un JWT Token signé avec un secret connu seulement par les fonctions serverless, et on peut ensuite considéré que l’on est authentifié. N’ayant pas besoin de gérer plusieurs utilisateurs, cela convient à mon cas d’utilisation.</p>
<p>Une fois authentifé, les fonctions serverless se chargent de récupérer la liste des domaines, ainsi que la listes des boites mails associées à ces domaines et on arrive ensuite sur l’écran suivant, qui nous permet de gérer les alias de chaque boite mail.</p>
<p><img src="/images/alias-email-desktop.png" alt="Rendu bureau"></p>
<h2 id="la-suite" tabindex="-1"><a class="heading-link" href="#la-suite">La suite</a></h2>
<p>Dans le cas ou d’éventuels clients de Gandi souhaiteraient utiliser ce projet, j’ai tenté d’intégrer l’Oauth2, afin de permettre de s’authentifier via Gandi. Cela m’a également permis de comprendre mieux le fonctionnement de l’Oauth2.</p>
<p>J’ai donc demandé la création d’une application, obtenant ainsi un <code>applicationId</code> et un <code>applicationSecret</code> me permettant de mettre en place l’authentification. Afin de tester cela en local, j’ai utilisé un <a href="https://github.com/axa-group/oauth2-mock-server">mock oauth2 réalisé par le groupe AXA</a></p>
<p>Malheureusement, l’API v5 de Gandi est encore en beta et le fournisseur d’authentification ne permet pas encore d’interagir avec les domaines et boites mails. 😢</p>
<p>En attendant que cela soit disponible, j’ai laissé mon travail disponible sur une <a href="https://github.com/sylvainmetayer/alias-gandi-angular/tree/feature/oauth2">branche dédiée</a>.</p>
<p>J’ai également ajouté un bouton de déploiement Netlify en un clic pour ceux souhaitant se servir de ce petit projet. Il faudra néanmoins générer sa propre clé d’<a href="https://docs.gandi.net/fr/noms_domaine/utilisateurs_avances/api.html">API depuis les paramètres de son compte Gandi</a> et renseigner quelques variables d’environnement, décrite ci-dessous.</p>
<table>
<thead>
<tr>
<th>Paramètre</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>GANDI_API_KEY</td>
<td>Clé d’API Gandi</td>
</tr>
<tr>
<td>JWT_SECRET</td>
<td>Une chaine de caractères aléatoire utilisée comme secret JWT</td>
</tr>
<tr>
<td>LOGIN_PASSWORD</td>
<td>Le mot de passe souhaité pour se connecter</td>
</tr>
<tr>
<td>GANDI_API_HOST</td>
<td>La racine de l’URL de l’API Gandi : <code>api.gandi.net</code></td>
</tr>
<tr>
<td>GANDI_API_VERSION</td>
<td>La version de l’API Gandi : <code>/v5</code></td>
</tr>
</tbody>
</table>
<p>Pour générer le JWT Secret, la commande suivante peut être utile</p>
<p><code>cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1</code></p>
<p>Les sources du projet sont disponibles sur <a href="https://github.com/sylvainmetayer/alias-gandi-angular">Github</a></p>

    ]]>
      </content>
      
        <category term="projet"/>
      
        <category term="angular"/>
      
        <category term="serverless"/>
      
      
        <summary type="html">
          Trop de spam ? Marre de donner son addresse email à chaque service ? Les alias mail sont là à la rescousse !
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Suivi mémoire</title>
      <link href="https://www.sylvain.dev/article/suivi-memoire/"/>
      <updated>2019-06-01T00:00:00Z</updated>
      <id>https://sylvain.dev/article/suivi-memoire/</id>
      <content type="html">
        <![CDATA[
      <h1 id="suivi-m%C3%A9moire" tabindex="-1"><a class="heading-link" href="#suivi-m%C3%A9moire">Suivi mémoire</a></h1>
<p>Bien que n’ayant pas communiqué sur le suivi de mon mémoire comme cela était [indiqué ici]({ post_url 2019-03-17-memoire }), j’ai bien avancé sur ce dernier. Je vais lister ici mes avancées et ce qu’il me reste à faire.</p>
<p>Tout d’abord, la génération du PDF final était pour moi quelque chose que je souhaitais de façon automatique. Je voulais pouvoir disposer à tout moment de 3 versions présentables. Une version dite de “travail”, sur laquelle je retrouve toutes mes notes en cours, une version numérique, avec des marges assez faible, et une version papier avec des marges plus importantes, pour permettre une meilleure lisibilité lors de l’impression. J’ai donc utilisé <a href="https://travis-ci.org/">Travis CI</a> afin de pouvoir générer ces 3 documents à chaque tag sur mon dépôt.</p>
<p>J’ai également cherché à appliquer les bonnes pratiques LaTeX, avec l’utilisation du paquet <a href="https://ctan.org/pkg/nag">nag</a> qui permet de relever certaines erreurs et propose des corrections pour ces dernières.</p>
<p>Pour faciliter une diffusion plus facile de mon mémoire, j’ai mis en place une redirection vers la dernière version disponible accessible via le lien suivant : <a href="https://memoire.epsi.sylvainmetayer.fr">https://memoire.epsi.sylvainmetayer.fr</a></p>
<p>Un changement important à noter est le changement de ma problématique, afin d’éviter un potentiel hors sujet et de me restreindre à un périmètre trop petit. La nouvelle problématique est la suivante : <strong>Comment l’automatisation peut-elle permettre d’améliorer le cycle de vie d’une application ?</strong>. Concernant le travail sur mon mémoire, j’ai finalisé le plan, qui comporte donc 3 parties.</p>
<ol>
<li>Le cycle de vie d’une application</li>
<li>L’intérêt de la mise en place d’une démarche d’automatisation, via une étude de cas</li>
<li>L’automatisation du cycle de vie d’une application</li>
</ol>
<p>La première partie est désormais bien avancée et la deuxième partie nécessite encore un peu de travail et de reformulation. La troisième partie dispose de la plupart des idées et concepts que je souhaite aborder, il ne restera plus qu’à l’écrire.</p>
<p>Prochaine deadline, 28 juin, ou je présenterais une version (normalement) finalisée à mon tuteur. Comme indiqué dans l’article précédent, je suis preneur de vos retour, tant sur le fond que sur la forme !</p>

    ]]>
      </content>
      
        <category term="epsi"/>
      
        <category term="blog"/>
      
      
        <summary type="html">
          Avancée de la réalisation de mon mémoire de fin d&#39;études pour l&#39;EPSI
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Rédaction d&#39;un mémoire de fin d&#39;étude</title>
      <link href="https://www.sylvain.dev/article/memoire/"/>
      <updated>2019-03-17T00:00:00Z</updated>
      <id>https://sylvain.dev/article/memoire/</id>
      <content type="html">
        <![CDATA[
      <p>Ma dernière année d’étude à l’EPSI Bordeaux signifie également la rédaction d’un mémoire. Afin d’assurer un suivi efficace des tuteurs EPSI, il est demandé aux étudiants de donner des états d’avancements, à des dates jalons, afin que les tuteurs puissent recadrer l’étudiant s’il part dans une mauvaise direction.</p>
<p>J’ai donc décidé de rédiger sur ce blog les avancées de mon mémoire, afin de permettre de garder une trace des étapes de réalisation de ce dernier.</p>
<p>L’objectif est de publier un article, même court, par semaine, indiquant les recherches effectuées, les difficultés rencontrées, notes diverses et variées…</p>
<p>Aux niveaux des différents jalons imposés, les voici :</p>
<ul>
<li>[x] 29 mars - première point sur mon mémoire avec mon tuteur EPSI</li>
<li>[ ] 26 avril - 2ème point sur mon mémoire avec mon tuteur EPSI</li>
<li>[ ] 31 mai - 3ème point sur mon mémoire avec mon tuteur EPSI</li>
<li>[ ] 28 juin - 4ème point sur mon mémoire avec mon tuteur EPSI</li>
<li>[ ] 15 juillet - Rendu du mémoire</li>
<li>[ ] Début Septembre - Soutenance de mémoire</li>
</ul>
<p>Concernant le document attendu pour le premier rendez-vous tuteur, voici ci-dessous les éléments attendus.</p>
<h2 id="le-contexte-de-l%E2%80%99alternance-ainsi-que-les-activit%C3%A9s-men%C3%A9es-en-stage-ou-alternance-et-le-sujet-principal-des-missions-d%E2%80%99alternance" tabindex="-1"><a class="heading-link" href="#le-contexte-de-l%E2%80%99alternance-ainsi-que-les-activit%C3%A9s-men%C3%A9es-en-stage-ou-alternance-et-le-sujet-principal-des-missions-d%E2%80%99alternance">Le contexte de l’alternance ainsi que les activités menées en stage ou alternance et le sujet principal des missions d’alternance</a></h2>
<p>J’effectue mon alternance au sein de <a href="https://groupeonepoint.com">onepoint</a>.</p>
<p>Le projet sur lequel je travaille actuellement comporte une équipe de 5 personnes, et nous effectuons le MCO<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup> ainsi que l’ajout de fonctionnalités d’une application web de certification et d’audit pour un client, Bureau Veritas. Cette application est développée avec Symfony (PHP) pour le back-office et AngularJS pour le front-office. De plus, l’architecture du projet est basée sur Docker.</p>
<p>Le back-office était initialement en Symfony 2, et nous avons procédé à sa montée de version, passant ainsi de PHP5 à PHP7 et de Symfony 2.8 à Symfony 3.4.</p>
<p>Également, j’interviens ponctuellement sur le front-office, après avoir reçu une formation en interne, pour des correctifs mineurs.</p>
<p>J’ai également mis en place un LDAP avec un container Docker dans l’environnent de développement, afin de pouvoir tester le comportement du LDAP sans avoir à atteindre les tests en recette ou en plateforme d’intégration.</p>
<p>J’ai auparavant travaillé sur 2 projets.</p>
<p>Le premier était un projet pour un client qui restera inconnu, pour des clauses commerciales liées au contrat. Ce projet consistait à la refonte d’un espace membre, avec un système de souscription, d’avantage, de quizz et de campagne email avec l’aide d’Adobe Campaign. Ce projet a été réalisé avec Drupal 8, un CMS<sup class="footnote-ref"><a href="#fn2" id="fnref2">2</a></sup> PHP.</p>
<p>Le second projet est un ensemble de sous projet, consistant à la refonte des sites de la région Nouvelle-Aquitaine, également sous Drupal 8. Ce choix était une contrainte client, puisque tous les utilisateurs (rédacteurs, traducteurs, …) sont déjà habitués à l’interface d’administration de Drupal 7, et qu’un changement aurait impliqué des frais de formation à un nouvel outil, pas forcément nécessaire et valable.</p>
<p>Les sites auquels j’ai participé sont la refonte du <a href="https://transports.nouvelle-aquitaine.fr/fr">site des transport de la région</a> ainsi que la première version d’une régie publicitaire.</p>
<h2 id="le-sujet-ou-projet-d%E2%80%99%C3%A9tude-envisag%C3%A9" tabindex="-1"><a class="heading-link" href="#le-sujet-ou-projet-d%E2%80%99%C3%A9tude-envisag%C3%A9">Le sujet ou projet d’étude envisagé</a></h2>
<p>Concernant mon avancée, j’ai défini mon sujet, qui est le suivant : <strong>Comment l’automatisation peut permettre de réduire les erreurs humaines dans la mise en oeuvre d’une application ?</strong></p>
<p>Ce sujet va donc concerner en grande partie le déploiement et l’intégration continue d’une application (web, étant donné qu’il s’agit du domaine dans lequel je travaille), du poste du développeur, en passant par les tests automatisés, intégration, recette, pré-production et jusqu’à la phase de production.</p>
<p>Néanmoins, je compte également aborder le sujet de l’automatisation au sein d’une équipe de développeur, afin de faciliter le travail de chacun, et réduire les potentielles erreurs manuelles, que ce soit au niveau des hooks git, des linters, de l’automatisation possible avec des IDE, …</p>
<p>Je compte également parler de l’automatisation au niveau de l’entreprise, sa mise en place, les personnes réticentes à convaincre pour mettre en place de tel système, le pour et le contre, ainsi que les impacts possible sur les KPI<sup class="footnote-ref"><a href="#fn3" id="fnref3">3</a></sup>.</p>
<h2 id="les-comp%C3%A9tences-professionnelles-acquises-ou-en-cours-d%E2%80%99acquisition-pour-ce-sujet-ou-projet-d%E2%80%99%C3%A9tude" tabindex="-1"><a class="heading-link" href="#les-comp%C3%A9tences-professionnelles-acquises-ou-en-cours-d%E2%80%99acquisition-pour-ce-sujet-ou-projet-d%E2%80%99%C3%A9tude">Les compétences professionnelles acquises ou en cours d’acquisition pour ce sujet ou projet d’étude</a></h2>
<p>Ce sujet sera donc assez théorique, mais portera également une partie pratique.</p>
<p>D’une part avec la légère l’expérience personnelle que j’ai avec ce domaine, ou j’ai automatisé certains projets, tel que par exemple <a href="/article/projets-epsi/#bot-telegram">qu’un chatbot réalisé en 4ème année</a>, ou encore <a href="/article/ansible">ma découverte d’Ansible</a>, avec lequel j’ai automatisé l’installation d’un serveur Debian.</p>
<p>D’autre part avec le projet sur lequel je suis en train de travailler lors de mon alternance à <a href="https://groupeonepoint.com">onepoint</a>. L’objectif est de faire plus ou moins une refonte, ou du moins une amélioration de la chaine d’industrialisation.</p>
<p>Ce projet va être pour moi une opportunité de pouvoir me confronter à des problématiques réelles d’entreprises, et monter en compétences sur tous les domaines concernant l’intégration et le déploiement continu. Ce projet devrait être lancé dans les semaines à venir.</p>
<h2 id="une-%C3%A9bauche-de-plan" tabindex="-1"><a class="heading-link" href="#une-%C3%A9bauche-de-plan">Une ébauche de plan</a></h2>
<p>Une première ébauche de plan à déjà été effectuée en décembre, et a continuée d’être agrémentée d’idées, remaniée, …</p>
<p>Le brouillon est disponible <a href="https://github.com/sylvainmetayer/epsi-memoire/issues/8">sur Github</a>, et en voici son contenu, à ce jour :</p>
<ol start="0">
<li>Introduction</li>
<li>Historique</li>
<li>Pourquoi automatiser</li>
<li>Etat de l’art</li>
<li>Automatiser un projet
<ol>
<li>Localement</li>
<li>Intégration continue</li>
<li>Déploiement continu</li>
<li>Tests</li>
</ol>
</li>
<li>Bénéfices constatés</li>
<li>Limites</li>
<li>Conclusion</li>
</ol>
<p><a href="https://github.com/sylvainmetayer/epsi-memoire/releases/latest">Le PDF de l’état actuel de mon mémoire peut-être consulté ici</a></p>
<h2 id="une-premi%C3%A8re-liste-bibliographique-d%C3%A9taill%C3%A9e" tabindex="-1"><a class="heading-link" href="#une-premi%C3%A8re-liste-bibliographique-d%C3%A9taill%C3%A9e">Une première liste bibliographique détaillée</a></h2>
<p>Je suis ainsi en train de lire deux livres :</p>
<ul>
<li>The Phoenix Project, plus sur la partie gestion de projet, qui aborde les interactios entres les différentes personnes impliquées dans un projet, et les conditions de succès d’un projet.</li>
<li>The DevOps Handbook, que je viens de commencer, traitant du monde DevOps, et de la façon de déployer des applications de façon continue.</li>
</ul>
<p>De plus, le livre <a href="https://leanpub.com/6cloud/">Le plan Copenhague</a> est un livre numérique, en cours de rédaction, très intéressant sur la façon de migrer des sites sous “Le cloud”.</p>
<p>Le site <a href="https://12factor.net/">12Factor</a> contient également des ressources intéressantes.</p>
<p>Je prévois également de lire un livre traitant d’Ansible, afin d’en savoir plus à ce sujet.</p>
<p>Voici pour cette première édition à propos de mon avancée sur mon mémoire.</p>
<p>Si vous avez des retours ou idées d’amélioration, remarques constructives, n’hésitez pas à laisser un commentaire ou [contactez moi](mailto:?subject=Commentaire sur le mémoire) !</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Maintien en condition opérationnelle <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Content Management System <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p>Key Performance Indicator, indicateur clé de performance <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="epsi"/>
      
      
        <summary type="html">
          Ma dernière année d&#39;étude à l&#39;EPSI Bordeaux signifie également la rédaction d&#39;un mémoire. Afin d&#39;assurer un suivi efficace des tuteurs EPSI, il est demandé aux étudiants de donner des états d&#39;avancements, à des dates jalons, afin que les tuteurs puissent recadrer l&#39;étudiant s&#39;il part dans une mauvaise direction.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Gem : FontAwesome SVG</title>
      <link href="https://www.sylvain.dev/article/jekyll-gem-svg-fontawesome/"/>
      <updated>2018-11-30T00:00:00Z</updated>
      <id>https://sylvain.dev/article/jekyll-gem-svg-fontawesome/</id>
      <content type="html">
        <![CDATA[
      <h2 id="besoin" tabindex="-1"><a class="heading-link" href="#besoin">Besoin</a></h2>
<p>Je souhaitais utiliser <a href="http://fontawesome.com/">FontAwesome</a> sans pour autant intégrer toute la librairie, assez lourde.</p>
<p>J’ai donc cherché un moyen de n’inclure que les icônes utilisés, et c’est comme cela que je suis venu à chercher comment créer un plugin Jekyll.</p>
<p><a href="https://jekyllrb.com/docs/plugins/your-first-plugin/">La documentation</a> est assez bien fournie, ce qui m’a permis de rapidement prendre en main Jekyll.</p>
<h2 id="r%C3%A9alisation" tabindex="-1"><a class="heading-link" href="#r%C3%A9alisation">Réalisation</a></h2>
<p>Ne souhaitant que afficher des icones, je me suis tourné sur 2 <code>Tag</code>, qui permettent de définir une balise et de lui passer des paramètres.</p>
<p>Ainsi, je passe à mon premier tag le type de l’icone que je souhaite utiliser (regular, solid ou brand), ainsi que son nom, et je génère la balise HTML<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup> correspondant à l’icone. Il ne me reste donc plus qu’à récupérer la définition SVG<sup class="footnote-ref"><a href="#fn2" id="fnref2">2</a></sup> de l’icône et l’inclure dans un namespace, en bas de la page HTML.</p>
<p>Pour cela, j’ai ajouté au données de la page Jekyll les icones que j’utilise, dans un simple tableau.</p>
<p>C’est lors de l’usage du deuxième tag que je récupère tous les icones utilisés sur la page, et que je vais récupérer la définition SVG de l’icône.</p>
<p>J’ai tout d’abord réalisé ce plugin très simplement, en utilisant le répertoire <code>_plugins</code> de Jekyll. Mais une fois fonctionnel, j’ai souhaité en faire une Gem, mise à disposition sur <a href="https://rubygems.org/">RubyGems</a>, pour qu’elle soit disponible pour tous, si elle venait à être utile à certains :blush:.</p>
<p>La création d’une Gem à été assez simple, le guide de <a href="https://bundler.io/v1.17/guides/creating_gem.html">Bundler</a> étant très bien détaillé.</p>
<p>J’ai essayé d’être le plus en accord avec les conventions du langage Ruby, mais n’étant pas familier avec ce dernier, je suis ouvert à toute remarques pour améliorer le code !</p>
<p>Il me reste à tester l’application de façon plus détaillée et à gérer les cas d’erreurs, qui sont pour le moment gérés de façon optimiste !</p>
<h2 id="usage" tabindex="-1"><a class="heading-link" href="#usage">Usage</a></h2>
<p>L’usage est le suivant :</p>
<p>Lorsque l’on souhaite afficher un icone, il faut utiliser le tag suivant. Le code ci-dessous va générer l’icone <a href="https://fontawesome.com/icons/twitter?style=brands">Twitter</a>.</p>
<pre class="language-erb"><code class="language-erb">{% fa_svg fab.fa-twitter %}</code></pre>
<p>Voici le résultat :</p>
<p>{% fa_svg fab.fa-twitter %}</p>
<p>Il faut ensuite ajouter à un endroit commun à toutes les pages (en général un footer), le tag de génération de la feuille SVG.</p>
<pre class="language-erb"><code class="language-erb">{% fa_svg_generate %}</code></pre>
<h2 id="liens" tabindex="-1"><a class="heading-link" href="#liens">Liens</a></h2>
<p>Si vous voulez voir le code, il est disponible sur ce <a href="https://github.com/sylvainmetayer/jekyll-fontawesome-svg">dépôt</a>.</p>
<p>Pour télécharger la Gem, c’est <a href="https://rubygems.org/gems/jekyll-fontawesome-svg">par ici</a> !</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>HyperText Markup Language <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Scalable Vector Graphics <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="jekyll"/>
      
        <category term="ruby"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          Je souhaitais utiliser FontAwesome sans pour autant intégrer toute la librairie, assez lourde.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Ajout des commentaires sur le site</title>
      <link href="https://www.sylvain.dev/article/ajout-commentaires/"/>
      <updated>2018-11-18T00:00:00Z</updated>
      <id>https://sylvain.dev/article/ajout-commentaires/</id>
      <content type="html">
        <![CDATA[
      <p>Les commentaires sont maintenant disponible sur le site !</p>
<p>Comme indiqué dans <a href="/article/site-personnel-v2">l’article précédent</a>, je cherchais désormais à intégrer une solution de commentaire, tout en évitant les solutions peu respectueuse de notre vie privée.</p>
<p>Mon choix s’était alors porté sur <a href="https://posativ.org/isso/">isso</a>, bien qu’il existe de nombreuses alternatives<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup>.</p>
<p>La chose que j’ai apprécié avec Isso, en plus du fait qu’il est libre et auto-hébergé, est qu’il ne requiert aucune inscription pour commenter. Il est possible d’indiquer son nom, site web et adresse email (qui ne sera jamais publiée), chaque champ étant optionnel. Une modération est également possible (étant donné que j’ai fait le choix de laisser la possibilité de commenter anonymement, j’ai également fait le choix d’activer la modération avant publication).</p>
<h2 id="installation" tabindex="-1"><a class="heading-link" href="#installation">Installation</a></h2>
<p>L’installation a été assez simple, de nombreux tutoriels<sup class="footnote-ref"><a href="#fn2" id="fnref2">2</a></sup> existent sur internet et la <a href="https://posativ.org/isso/docs/install/">documentation</a> est assez claire.</p>
<p>Voici les différentes étapes pour installer isso.</p>
<ol>
<li>
<p>Installer les dépendances Python et virtualenv.</p>
<blockquote>
<p>Bien que virtualenv ne soit pas obligatoire, il est recommandé afin d’éviter d’interférer avec les dépendances existantes sur le système.</p>
</blockquote>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> build-essential python-dev python-pip virtualenv</code></pre>
</li>
<li>
<p>Une fois les dépendances installées, on initialise un environnement virtualenv</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> virtualenv /opt/isso</code></pre>
<p>On active l’environnemment, en tant que root.</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">su</span>
<span class="token builtin class-name">source</span> /opt/isso/bin/activate</code></pre>
<blockquote>
<p>Etant donné que <code>/opt</code> n’est pas accessible en écriture aux utilisateurs, on utilise sudo. Mais rien n’empêche de l’installer dans le répertoire personnel de l’utilisateur.</p>
</blockquote>
</li>
<li>
<p>Installation des dépendances</p>
<pre class="language-bash"><code class="language-bash">pip <span class="token function">install</span> isso gunicorn</code></pre>
<p>On peut désormais quitter virtualenv.</p>
<pre class="language-bash"><code class="language-bash">deactivate</code></pre>
</li>
</ol>
<h2 id="configuration" tabindex="-1"><a class="heading-link" href="#configuration">Configuration</a></h2>
<p>On ne souhaite pas que isso soit exécuté en tant que root car s’il venait à y avoir une faille, l’attaquant aurait alors tous les droits. On va donc créer un utilisateur dédié et lui donner les droits sur les répertoires nécessaire (log et données). On créé également un répertoire <code>/etc/isso</code> qui contiendra les différentes configurations.</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> adduser isso
<span class="token function">sudo</span> <span class="token function">mkdir</span> /var/lib/isso /var/log/isso
<span class="token function">sudo</span> <span class="token function">chown</span> isso:isso /var/lib/isso
<span class="token function">sudo</span> <span class="token function">chown</span> isso:isso /var/log/isso
<span class="token function">sudo</span> <span class="token function">mkdir</span> /etc/isso</code></pre>
<p>Il reste maintenant à configurer Isso. Mon cas d’usage est le suivant : je souhaite avoir deux sites, un pour l’environnement de développement, l’autre pour la production. Voici ma configuration (<code>/etc/isso/isso.cfg</code> et <code>/etc/isso/isso.prod.cfg</code>).</p>
<p>La documentation du site isso ne semble pas à jour, pour des détails sur chaque paramètre, il est préférable de se référer à <a href="https://github.com/posativ/isso/blob/master/docs/docs/configuration/server.rst">la documentation présente sur Github</a></p>
<pre class="language-ini"><code class="language-ini"><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">general</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">dbpath</span> <span class="token punctuation">=</span> <span class="token value attr-value">/var/lib/isso/prod.comments.db</span>
<span class="token comment"># Etant donné que je configure plusieurs sites, il est nécessaire de mettre une valeur au champ name</span>
<span class="token key attr-name">name</span> <span class="token punctuation">=</span> <span class="token value attr-value">main</span>
<span class="token key attr-name">host</span> <span class="token punctuation">=</span> <span class="token value attr-value">https://sylvainmetayer.fr</span>
<span class="token key attr-name">max-age</span> <span class="token punctuation">=</span> <span class="token value attr-value">15m</span>
<span class="token comment"># Pour recevoir les notifications de nouveaux commentaires par email</span>
<span class="token key attr-name">notify</span> <span class="token punctuation">=</span> <span class="token value attr-value">smtp</span>
<span class="token key attr-name">reply-notifications</span><span class="token punctuation">=</span><span class="token value attr-value">false</span>
<span class="token key attr-name">log-file</span> <span class="token punctuation">=</span>
<span class="token comment"># Permet d'accéder à une interface d'administration permettant de visualiser les commentaires et de les approuver/rejeter/supprimer.</span>
<span class="token key attr-name">admin_password</span> <span class="token punctuation">=</span> <span class="token value attr-value">MySuperSecurePassword</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">moderation</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">enabled</span> <span class="token punctuation">=</span> <span class="token value attr-value">true</span>
<span class="token key attr-name">purge-after</span> <span class="token punctuation">=</span> <span class="token value attr-value">30d</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">server</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">listen</span> <span class="token punctuation">=</span> <span class="token value attr-value">http://localhost:8080</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">smtp</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">username</span> <span class="token punctuation">=</span> <span class="token value attr-value">me@mon.email.fr</span>
<span class="token comment"># Malheureusement, le mot de passe doit être en clair.</span>
<span class="token comment"># Il est donc recommandé de créer un compte email dédié pour l'envoi des notifications.</span>
<span class="token key attr-name">password</span> <span class="token punctuation">=</span> <span class="token value attr-value">MonMotDePasseEmail</span>
<span class="token key attr-name">host</span> <span class="token punctuation">=</span> <span class="token value attr-value">mail.gandi.net</span>
<span class="token key attr-name">port</span> <span class="token punctuation">=</span> <span class="token value attr-value">587</span>
<span class="token key attr-name">security</span> <span class="token punctuation">=</span> <span class="token value attr-value">starttls</span>
<span class="token comment"># L'adresse qui reçoit les notifications</span>
<span class="token key attr-name">to</span> <span class="token punctuation">=</span> <span class="token value attr-value">you@your.email.com</span>
<span class="token key attr-name">from</span> <span class="token punctuation">=</span> <span class="token value attr-value">me@mon.email.fr</span>
<span class="token key attr-name">timeout</span> <span class="token punctuation">=</span> <span class="token value attr-value">10</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">guard</span><span class="token punctuation">]</span></span>
<span class="token comment"># Enable basic spam protection features, e.g. rate-limit per IP address (/24</span>
<span class="token comment"># for IPv4, /48 for IPv6).</span>
<span class="token key attr-name">enabled</span> <span class="token punctuation">=</span> <span class="token value attr-value">true</span>
<span class="token key attr-name">ratelimit</span> <span class="token punctuation">=</span> <span class="token value attr-value">2</span>
<span class="token key attr-name">direct-reply</span> <span class="token punctuation">=</span> <span class="token value attr-value">2</span>
<span class="token key attr-name">reply-to-self</span> <span class="token punctuation">=</span> <span class="token value attr-value">false</span>
<span class="token key attr-name">require-author</span> <span class="token punctuation">=</span> <span class="token value attr-value">false</span>
<span class="token key attr-name">require-email</span> <span class="token punctuation">=</span> <span class="token value attr-value">false</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">markup</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">options</span> <span class="token punctuation">=</span> <span class="token value attr-value">strikethrough, autolink, fenced_code, no_intra_emphasis</span>
<span class="token comment"># default, only a, blockquote, br, code, del, em, h1, h2, h3, h4, h5, h6, hr,</span>
<span class="token comment"># ins, li, ol, p, pre, strong, table, tbody, td, th, thead and ul are allowed.</span>
<span class="token key attr-name">allowed-elements</span> <span class="token punctuation">=</span>
<span class="token key attr-name">allowed-attributes</span> <span class="token punctuation">=</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">hash</span><span class="token punctuation">]</span></span>
<span class="token comment"># Utilisé pour générer des identicons sur les commentaires</span>
<span class="token key attr-name">salt</span> <span class="token punctuation">=</span> <span class="token value attr-value">SaltDe25Caractère</span>
<span class="token key attr-name">algorithm</span> <span class="token punctuation">=</span> <span class="token value attr-value">pbkdf2</span></code></pre>
<p>La configuration pour le site de développemnt est identique, il suffit donc de copier/coller le fichier et d’éditer quelques champs.</p>
<pre class="language-ini"><code class="language-ini"><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">general</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">dbpath</span> <span class="token punctuation">=</span> <span class="token value attr-value">/var/lib/isso/dev.comments.db</span>
<span class="token key attr-name">name</span> <span class="token punctuation">=</span> <span class="token value attr-value">development</span>
<span class="token key attr-name">host</span> <span class="token punctuation">=</span> <span class="token value attr-value">https://development_url</span></code></pre>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">chown</span> root: /etc/isso/isso.cfg
<span class="token function">sudo</span> <span class="token function">chown</span> root: /etc/isso/isso.prod.cfg</code></pre>
<p>Une fois la configuration terminée, il faut configurer le service pour qu’il démarre au lancement de l’OS.</p>
<p>On créé donc le script de démarrage du service dans <code>/opt/isso/isso-start.sh</code></p>
<pre class="language-bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
<span class="token builtin class-name">set</span> <span class="token parameter variable">-e</span>
<span class="token builtin class-name">source</span> /opt/isso/bin/activate
<span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">LANG</span></span><span class="token operator">=</span>C.UTF-8
<span class="token builtin class-name">export</span> <span class="token assign-left variable">ISSO_SETTINGS</span><span class="token operator">=</span><span class="token string">"/etc/isso/isso.cfg;/etc/isso/isso.prod.cfg"</span>
<span class="token builtin class-name">exec</span> gunicorn <span class="token parameter variable">-n</span> gunicorn-isso <span class="token parameter variable">-b</span> <span class="token number">127.0</span>.0.1:8080 <span class="token parameter variable">--preload</span> <span class="token parameter variable">-w</span> <span class="token number">2</span> --log-file /var/log/isso/isso.log isso.dispatch <span class="token operator"><span class="token file-descriptor important">2</span>>></span>/var/log/isso/isso.log</code></pre>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">chown</span> root: /opt/isso/isso-start.sh
<span class="token function">sudo</span> <span class="token function">chmod</span> <span class="token number">755</span> /opt/isso/isso-start.sh</code></pre>
<p>On créé maintenant le service.</p>
<pre class="language-ini"><code class="language-ini"><span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Unit</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">Description</span><span class="token punctuation">=</span><span class="token value attr-value">isso commenting system</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Service</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">ExecStart</span><span class="token punctuation">=</span><span class="token value attr-value">/opt/isso/isso-start.sh</span>

<span class="token key attr-name">Restart</span><span class="token punctuation">=</span><span class="token value attr-value">on-failure</span>
<span class="token key attr-name">TimeoutSec</span><span class="token punctuation">=</span><span class="token value attr-value">1</span>
<span class="token key attr-name">User</span><span class="token punctuation">=</span><span class="token value attr-value">isso</span>

<span class="token key attr-name">LimitNOFILE</span><span class="token punctuation">=</span><span class="token value attr-value">16384</span>
<span class="token key attr-name">LimitNPROC</span><span class="token punctuation">=</span><span class="token value attr-value">16384</span>
<span class="token key attr-name">LimitLOCKS</span><span class="token punctuation">=</span><span class="token value attr-value">16384</span>

<span class="token comment"># ensures that the service process and all its children can never gain new</span>
<span class="token comment"># privileges.</span>
<span class="token key attr-name">NoNewPrivileges</span><span class="token punctuation">=</span><span class="token value attr-value">true</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">Install</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">WantedBy</span><span class="token punctuation">=</span><span class="token value attr-value">multi-user.target</span></code></pre>
<p>On redémarre <code>systemctl</code> et on active isso au démarrage, puis on le lance !</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">chown</span> root: /lib/systemd/system/isso.service
<span class="token function">sudo</span> <span class="token function">chmod</span> <span class="token number">644</span> /lib/systemd/system/isso.service
<span class="token function">sudo</span> systemctl daemon-reload
<span class="token function">sudo</span> systemctl <span class="token builtin class-name">enable</span> isso
<span class="token function">sudo</span> systemctl start isso</code></pre>
<p>Il reste maintenant à configurer le reverse proxy (nginx dans mon cas).</p>
<pre class="language-nginx"><code class="language-nginx"><span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>
    <span class="token directive"><span class="token keyword">proxy_pass</span> http://127.0.0.1:8080/</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_redirect</span> default</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_set_header</span> Host <span class="token variable">$host</span></span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Host <span class="token variable">$host</span></span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Server <span class="token variable">$host</span></span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Real-IP <span class="token variable">$remote_addr</span></span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-For <span class="token variable">$proxy_add_x_forwarded_for</span></span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Proto <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>Les headers sont importants, puisque s’ils ne sont pas présents, isso enverra des emails avec des liens pointant vers <code>localhost:8080</code> et ne fonctionnera pas bien côté client.</p>
<p>Il ne reste maintenant plus qu’à configurer notre client ! Voici le code que j’ai ajouté dans mon fichier <code>_layouts/post.html</code>. J’ai également ajouté un attribut <code>enable_comments</code> dans mes posts, lorsque je souhaite activer les commentaires.</p>
<p>Le script est chargé en asynchrone, afin de ne pas gêner le chargement de la page.</p>
<pre class="language-js"><code class="language-js">
<span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">if</span> page<span class="token punctuation">.</span>enable_comments <span class="token operator">%</span><span class="token punctuation">}</span>
    <span class="token operator">&lt;</span>hr<span class="token operator">></span>
    <span class="token operator">&lt;</span>h2<span class="token operator">></span>Commentaires<span class="token operator">&lt;</span><span class="token operator">/</span>h2<span class="token operator">></span>
    <span class="token operator">&lt;</span>script <span class="token keyword">async</span>
    data<span class="token operator">-</span>isso<span class="token operator">=</span><span class="token string">"{{site.isso.url}}"</span>
    data<span class="token operator">-</span>isso<span class="token operator">-</span>id<span class="token operator">=</span><span class="token string">"{{page.id}}"</span>
    data<span class="token operator">-</span>isso<span class="token operator">-</span>feed<span class="token operator">=</span><span class="token string">"true"</span>
    src<span class="token operator">=</span><span class="token string">"{{site.isso.script}}"</span><span class="token operator">></span><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">></span>

    <span class="token operator">&lt;</span>section id<span class="token operator">=</span><span class="token string">"isso-thread"</span><span class="token operator">></span><span class="token operator">&lt;</span><span class="token operator">/</span>section<span class="token operator">></span>
    <span class="token operator">&lt;</span>hr<span class="token operator">></span>
<span class="token punctuation">{</span><span class="token operator">%</span> endif <span class="token operator">%</span><span class="token punctuation">}</span>
</code></pre>
<p>Pour plus d’informations que les paramètres disponibles côté client, <a href="https://github.com/posativ/isso/blob/master/docs/docs/configuration/client.rst">voir la documentation sur Github</a>.</p>
<p>⚠ Lorsqu’un fil de commentaire est vide (ce qui est le cas lorsqu’un article ne contient pas encore de commentaire), isso répond avec une erreur HTTP 404, ce qui peut faire croire qu’une page est manquante ou invalide. <a href="https://github.com/posativ/isso/issues/301">Une issue est ouverte sur le dépôt Github</a> pour renvoyer un code HTTP 204 (no content) à la place.</p>
<p>Et voici le résultat !</p>
<p><img src="/images/isso.png" alt="Affichage des commentaires"></p>
<blockquote>
<p>Ce n’est qu’une image, les commentaires se trouvent plus bas 😉</p>
</blockquote>
<blockquote>
<p>Edit 16.07.2020 : Les commentaires ne sont pour le moment plus disponibles. Migration vers Eleventy en cours, ils devraient être remplacés à l’aide des Webmentions d’ici les prochaines semaines/mois.</p>
</blockquote>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p><a href="https://lisakov.com/projects/open-source-comments/">Voici un site répertoriant plusieurs solutions existant</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p><a href="https://blog.phusion.nl/2018/08/16/isso-simple-self-hosted-commenting-system/">Ce tutoriel très similaire à cet article m’a été bien utile</a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="jekyll"/>
      
        <category term="blog"/>
      
      
        <summary type="html">
          Les commentaires sont maintenant disponible sur le site
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Nouvelle version du site 💥</title>
      <link href="https://www.sylvain.dev/article/site-personnel-v2/"/>
      <updated>2018-11-15T00:00:00Z</updated>
      <id>https://sylvain.dev/article/site-personnel-v2/</id>
      <content type="html">
        <![CDATA[
      <!-- {\% include toc.html %\} -->
<h2 id="le-passage-de-php-%C3%A0-jekyll" tabindex="-1"><a class="heading-link" href="#le-passage-de-php-%C3%A0-jekyll">Le passage de PHP à Jekyll</a></h2>
<p>Après quelques années d’existence, mon ancien site commençait à vieillir.</p>
<p>(<a href="https://github.com/sylvainmetayer/sylvainmetayer-old">Les sources de mon ancien site sont toujours disponibles sur Github</a>, mais remontent à l’époque de mon DUT, soyez indulgents ! 😁)</p>
<p>De plus, <a href="/article/l-effet-parthenay">le premier et unique article</a> présent sur ce site n’était même pas hébergé sur ce site, mais sur un sous-domaine (désormais inexistant) et avec la plateforme <a href="https://ghost.org/fr/">Ghost</a> (qui est un excellent logiciel libre au passage !).</p>
<p>Cela faisait donc deux sites à maintenir, pour un trafic plus que faible 😀 !</p>
<p>Le choix de PHP avait été fait à l’époque car il s’agissait du seul langage que je maitrisais.</p>
<p>En y réfléchissant, pour effectuer une refonte du site, j’ai listé les points que je souhaitais avoir.</p>
<h3 id="1.-des-performances-am%C3%A9lior%C3%A9es" tabindex="-1"><a class="heading-link" href="#1.-des-performances-am%C3%A9lior%C3%A9es">1. Des performances améliorées</a></h3>
<p>Pour cette refonte, je souhaitais obtenir des performances dignes de ce nom. N’ayant pas de logique côté serveur (puisque le but de ce site est simplement de servir du contenu, pas d’effectuer un traitement dessus ou de traiter des données externe), le choix d’un langage côté serveur ne me semblait plus très cohérent.</p>
<p>Etant donné que j’ai que du contenu statique, pourquoi ne pas envoyer au client un simple fichier HTML, plutôt que de consommer du temps CPU et des processus PHP pour générer une page d’une faible complexité ? Pourquoi ne pas construire une fois toutes les pages nécessaire, pour n’avoir plus qu’à les servir ensuite, supprimant le temps de génération de la page côté serveur ?</p>
<p>J’ai donc commencé à creuser la question des générateurs de sites et en ai trouvé plusieurs (le très bon site <a href="https://www.staticgen.com/">StaticGen</a> m’a beaucoup aidé à trouver des ressources et des avis). C’est ainsi que mon choix s’est porté sur <a href="https://jekyllrb.com/">Jekyll</a>.</p>
<p>Voici une illustration des performances actuelles du site, ainsi qu’un rapport <a href="https://www.dareboost.com/fr/report/d_5bec937de967905e05bb64cb">Dareboost</a>. Je suis assez satisfait du résultat, même s’il me reste du travail à faire dessus (mais comme le produit parfait n’existe pas, le site parfait n’existe pas non plus ! 😜)</p>
<p><img src="/images/speed-test.png" alt="Google page Speed résultat"></p>
<h3 id="2.-le-contenu-prime-sur-le-design-(pour-moi)" tabindex="-1"><a class="heading-link" href="#2.-le-contenu-prime-sur-le-design-(pour-moi)">2. Le contenu prime sur le design (pour moi)</a></h3>
<p>Je suis un très mauvais designer et l’intégration CSS est pour moi un vrai calvaire.</p>
<p>C’est d’ailleurs pour cela que je suis parti d’un template Jekyll que j’ai ensuite adapté à mes besoins.</p>
<blockquote>
<p><a href="https://github.com/sergiokopplin/indigo">Le thème de base que j’ai utilisé peut être consulté ici</a></p>
</blockquote>
<p>Néanmoins, je ne voulais pas d’un thème complexe, qui allait ainsi influer sur les performances du site (plus il y a de CSS et de JS, plus le site sera long à charger pour l’utilisateur). C’est pourquoi le thème que j’ai choisi n’intègre aucun javascript. Ainsi, seule une feuille de style, quelques emojis provenant de Github, et une feuille SVG<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup> sont chargées en plus du contenu.</p>
<blockquote>
<p>Je n’exclus pas d’utiliser du javascript lorsque je ferai évoluer le site, mais je vais tenter d’en limiter au maximum l’usage.</p>
</blockquote>
<p>Certes, le thème du site semblera au mieux austère à certains, au pire hideux à d’autres, … Mais au moins, le site est lisible sur (presque, je n’ai pas de montre connectée pour tester !) tous les supports et charge rapidement 😀</p>
<h3 id="3.-la-r%C3%A9daction-doit-se-faire-en-markdown-et-une-s%C3%A9paration-style%2Fcontenu-doit-exister" tabindex="-1"><a class="heading-link" href="#3.-la-r%C3%A9daction-doit-se-faire-en-markdown-et-une-s%C3%A9paration-style%2Fcontenu-doit-exister">3. La rédaction doit se faire en <a href="https://fr.wikipedia.org/wiki/Markdown">Markdown</a> et une séparation style/contenu doit exister</a></h3>
<p>C’est également l’une des raisons qui m’a poussé vers les générateurs de site statiques.</p>
<p>J’aime beaucoup le markdown, et m’en sert beaucoup en cours pour ma prise de note. Il s’agit d’un langage extrêmement simple pour la rédaction, et en même temps, très puissant.</p>
<p>Concernant la séparation style/contenu, les <code>layouts</code> de Jekyll répondent parfaitement à ce besoin.</p>
<h3 id="4.-s%C3%A9curit%C3%A9" tabindex="-1"><a class="heading-link" href="#4.-s%C3%A9curit%C3%A9">4. Sécurité</a></h3>
<p>Je souhaitais un site qui ne sera pas facilement corrompu. Avec des pages HTML, aucune faille PHP / Node / Java / (mettez le nom de votre langage préféré ic) possible. Avec un générateur de site statique, on génère le contenu une fois, on publie le résultat et on sert le contenu, c’est tout !</p>
<p>Concernant l’hébergement, je me suis tout d’abord dis que j’allais profiter de l’hébergement avec <a href="https://pages.github.com/">Github Pages</a>. Cela fonctionne très simplement, même avec un domaine personnel, puisqu’il suffit simplement d’utiliser le gestionnaire DNS de son registrar pour faire pointer le domaine sur l’IP de Github Page.</p>
<p>Néanmoins, cela un inconvénient majeur à mon sens : la maîtrise des paramètres du site est impossible, que cela soit au niveau du cache, des headers de sécurité, … Github empêche toute modification des headers sur les sites hébergés par Github Pages<sup class="footnote-ref"><a href="#fn2" id="fnref2">2</a></sup></p>
<p>Au final, nous ne sommes jamais aussi bien servi que par soi-même, j’ai donc utilisé <a href="https://travis-ci.org/">Travis CI</a> pour déployer le site généré sur mon petit <a href="https://www.raspberrypi.org/">Raspberry</a> avec un Rsync : pas besoin de plus compliqué, cela me suffit amplement. Un serveur web devant, un certificat <a href="https://letsencrypt.org">Let’s Encrypt</a> et voilà !</p>
<p>J’ai ainsi pu obtenir une note convenable, selon <a href="https://observatory.mozilla.org/analyze/sylvainmetayer.fr">l’observatoire Mozilla</a> et <a href="https://cryptcheck.fr/https/sylvainmetayer.fr">Cryptcheck</a>. Il me reste néanmoins un peu de travail à faire sur les <a href="https://developer.mozilla.org/fr/docs/Web/HTTP/CSP">CSP (Content Security Policy)</a>, ce concept n’est pas évident à appréhender 😣 !</p>
<h3 id="5.-seo" tabindex="-1"><a class="heading-link" href="#5.-seo">5. SEO</a></h3>
<p>Il s’agit de ma première réelle expérience SEO<sup class="footnote-ref"><a href="#fn3" id="fnref3">3</a></sup> et Jekyll offre de nombreux plugins<sup class="footnote-ref"><a href="#fn4" id="fnref4">4</a></sup> permettant de générer des sitemap, un flux <a href="https://fr.wikipedia.org/wiki/RSS">RSS</a>, des métadonnées, … J’ai donc essayé de tirer profit de cela au maximum.</p>
<h2 id="workflow" tabindex="-1"><a class="heading-link" href="#workflow">Workflow</a></h2>
<p>Mon processus de développement est assez simple :</p>
<ul>
<li>Je développe en local mes articles et pages.</li>
<li>Le code est versionné sur <a href="https://github.com/sylvainmetayer/sylvainmetayer">Github</a></li>
<li>Travis s’assure de la qualité du site, avec des tests de validité des liens et des images, ainsi que la structure des pages HTML.</li>
<li>Travis déploie une version (correspondant à la branche master) de production.</li>
<li>Je déploie également avec une autre branche une version de développement, qui me permet de tester le site avant d’effectuer un merge sur master :smiley:</li>
</ul>
<h2 id="un-nouveau-site%2C-pour-quoi-faire" tabindex="-1"><a class="heading-link" href="#un-nouveau-site%2C-pour-quoi-faire">Un nouveau site, pour quoi faire</a></h2>
<p>Ce site va principalement me servir à exposer mes projets réalisés, et à effectuer ma veille technologique. J’y écrirais des articles sur mes expériences de développement, afin de garder une trace de ce qui m’est arrivé. Je ne m’impose cependant aucun rythme de publication, il est donc possible que le site reste quelques mois sans nouveaux contenus.</p>
<h2 id="evolutions" tabindex="-1"><a class="heading-link" href="#evolutions">Evolutions</a></h2>
<p>Ce site est fonctionnel, mais pourtant il me reste quelques petits éléments à améliorer/régler.</p>
<h3 id="syst%C3%A8me-de-commentaire" tabindex="-1"><a class="heading-link" href="#syst%C3%A8me-de-commentaire">Système de commentaire</a></h3>
<p>Etant sur un site statique, il n’est pas possible d’inclure des commentaires directement, puisqu’il n’y a aucun traitement côté serveur.</p>
<p>Evidemment, il est possible d’intégrer des solutions tel que <a href="https://disqus.com/">Disqus</a> ou encore <a href="https://developers.facebook.com/docs/plugins/comments/">Facebook Comments</a> mais ces solutions étant peu protectrice de notre vie privée, j’ai préféré chercher une alternative.</p>
<p>Après quelques recherches, j’ai trouvé 2 solutions :</p>
<ol>
<li><a href="https://posativ.org/isso/">Isso</a></li>
<li><a href="https://staticman.net/">Staticman</a></li>
</ol>
<p>Le premier est un serveur de commentaire basique et léger écrit en Python. Je n’ai pas encore eu beaucoup de temps à consacrer à ce sujet, notament pour l’auto-héberger, mais je pense qu’il s’agit d’une très bonne solution et risque de me pencher dessus dans les prochaines semaines !</p>
<p>Le deuxième semblait très prometteur mais malheureusement victime de son succès. En effet, il s’agit d’un bot Github, interagissant avec le dépôt Github, et qui ajoute les commentaires directement dans la branche <code>master</code> ou créé une pull request si une approbation est nécessaire avant la publication des commentaire.</p>
<p>De plus, comme indiqué sur leur site, cet outil s’intègre très bien avec Jekyll et Github. Néanmoins, il utilise l’API Github, et étant un projet public commençant à prendre de l’ampleur, les limitations de l’API Github semble bloquer/ralentir ce projet, entrainant de nombreuses erreurs.</p>
<p>Une solution pour parer au problème serait d’auto-héberger le projet avec une clé d’API Github personnelle mais semble beaucoup pour “simplement des commentaires”, même si j’aimais beaucoup l’idée de pouvoir avoir des pull request pour chaque commentaire !</p>
<blockquote>
<p>Edit : Les commentaires sont maintenant disponible ! 💥</p>
<p><a href="/article/ajout-commentaires">Voir l’article</a></p>
</blockquote>
<h2 id="conclusion" tabindex="-1"><a class="heading-link" href="#conclusion">Conclusion</a></h2>
<p>Merci à tous d’avoir lu cet article, j’espère qu’il vous aura plu.</p>
<p>Si vous avez des remarques, n’hésitez pas à me faire vos retours !</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Scalable Vector Graphics <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Ce qui n’est en soit pas une mauvaise chose, si une totale liberté était donné à tous, ils se retrouveraient sûrement avec des sites mal configurés dans certains cas et leur infrastructure pourrait alors être compromise ! <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p><a href="https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche">Définition Wikipédia du SEO</a> <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn4" class="footnote-item"><p>Pour en citer quelques uns : <code>jekyll-sitemap</code>, <code>jekyll-seo-tag</code> et <code>jekyll-feed</code> <a href="#fnref4" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="jekyll"/>
      
        <category term="blog"/>
      
      
        <summary type="html">
          Après quelques années d&#39;existence, mon ancien site commençait à vieillir.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Latex Starter Kit</title>
      <link href="https://www.sylvain.dev/article/latex-starterkit/"/>
      <updated>2018-11-01T00:00:00Z</updated>
      <id>https://sylvain.dev/article/latex-starterkit/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/sylvainmetayer/LaTeX-starterkit">Sources (Github)</a></p>
<p>Ce projet personnel a été réalisé pour disposer d’un modèle lors de la réalisation d’écrits avec LateX.</p>
<p>Il utilise également <a href="https://travis-ci.org/">Travis CI</a> afin de générer automatiquement le PDF lors du tag sur le dépôt Github et permet d’effectuer une vérification orthographique basique.</p>

    ]]>
      </content>
      
        <category term="latex"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          Ce projet personnel a été réalisé pour disposer d&#39;un modèle lors de la réalisation d&#39;écrits avec LateX.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Configuration d&#39;un serveur avec Ansible</title>
      <link href="https://www.sylvain.dev/article/ansible/"/>
      <updated>2018-09-15T00:00:00Z</updated>
      <id>https://sylvain.dev/article/ansible/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/EPSIBordeaux/ansible-deployment">Sources (Github)</a></p>
<p><a href="https://www.ansible.com/">Consulter le site d’Ansible</a></p>
<p>J’ai réalisé ce projet personnel afin de me familiariser avec Ansible et pouvoir récréer un serveur à l’identique sans intervention humaine.</p>
<p>Le choix d’Ansible m’a semblé intéressant car il ne nécessite pas l’installation d’un agent sur le serveur cible pour effectuer le déploiement. Seul Python est requis, et la plupart, pour ne pas dire la totalité des serveurs linux dispose de python de base. De plus, la syntaxe pour écrire les playbooks (jeu d’instructions) est du <a href="http://yaml.org/">YAML</a>, simple à lire et à écrire.</p>
<p>J’ai tenté de réaliser les différents playbooks de façon la plus modulaire possible, rendant l’ajout de fonctionnalités simple.</p>
<p>Ce projet permet ainsi de :</p>
<ul>
<li>Déployer un serveur et le sécuriser avec des clés SSH, Fail2Ban, Iptables.</li>
<li>Déployer certaines applications réalisées lors de ma formation (afin de tester plusieurs type de déploiement, que ce soit des applications en PHP ou en NodeJS)</li>
<li>Mettre en place une solution de monitoring avec <a href="https://mmonit.com/monit/">Monit</a></li>
<li>Configurer automatique un serveur Web (Nginx) et effectuer des demandes de certificats HTTPS auprès de <a href="https://letsencrypt.org/">Let’s Encrypt</a> de façon automatique, y compris pour le renouvellement.</li>
</ul>
<p>Le travail sur ce projet n’est pas encore terminé, puisqu’il reste encore par exemple à gérer la question de la sauvegarde et de la restauration des données des différentes applications installées. <a href="https://github.com/EPSIBordeaux/ansible-deployment/issues">Vous pouvez contribuer au projet à cette adresse</a>.</p>

    ]]>
      </content>
      
        <category term="devops"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          J&#39;ai réalisé ce projet personnel afin de me familiariser avec Ansible et pouvoir récréer un serveur à l&#39;identique sans intervention humaine.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>TBM Interruption Tracker Bot</title>
      <link href="https://www.sylvain.dev/article/tbm-interruption/"/>
      <updated>2018-02-14T00:00:00Z</updated>
      <id>https://sylvain.dev/article/tbm-interruption/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/sylvainmetayer/tbm_interruption_tracker">Sources (Github)</a> <a href="https://twitter.com/tbm_issues_bot">Compte Twitter : @tbm_issues_bot</a></p>
<p>J’ai réalisé ce bot afin de permettre un suivi des interruptions des Trams Bordelais.</p>
<p>Les informations sont récupérées depuis les comptes officiels twitter de TBM, et repère des mots clés afin de compter les jours sans interruptions.</p>
<p><img src="/images/tbm_tracker_bot.jpg" alt="Photo de profil du Bot" title="Le bot tweete tout les jours, à 18h."></p>

    ]]>
      </content>
      
        <category term="ruby"/>
      
        <category term="twitter"/>
      
        <category term="bot"/>
      
      
        <summary type="html">
          J&#39;ai réalisé ce bot afin de permettre un suivi des interruptions des Trams Bordelais.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Projets réalisés en LP DAWIN</title>
      <link href="https://www.sylvain.dev/article/projets-dawin/"/>
      <updated>2017-07-31T00:00:00Z</updated>
      <id>https://sylvain.dev/article/projets-dawin/</id>
      <content type="html">
        <![CDATA[
      <p>Le présent article liste les différents projets que j’ai pu réaliser durant mon année de licence professionnelle DAWIN<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup> à l’IUT de Gradignan. Ces projets ont été réalisés la plupart du temps en binôme ou en groupe.</p>
<h2 id="agent-ready" tabindex="-1"><a class="heading-link" href="#agent-ready">Agent Ready</a></h2>
<p><a href="https://github.com/sylvainmetayer/agent-ready/">Sources (Github)</a> <a href="https://agent-ready.pages.dev/">Voir le jeu</a></p>
<p>Le but de ce projet était de réaliser un ‘Jeu dont vous êtes le héros’ avec diverses actions, tout en utilisant jQuery.</p>
<p>Ce projet a été réalisé lors de ma licence professionnelle DAWIN.</p>
<p><img src="/images/agent-ready.png" alt="Page d'accueil du jeu Agent Ready"></p>
<h2 id="macbernick" tabindex="-1"><a class="heading-link" href="#macbernick">Macbernick</a></h2>
<p><a href="https://github.com/mlcdf/macbernik/">Sources (Github)</a> <a href="https://mlcdf.github.io/macbernik/">Voir le jeu</a></p>
<p>Ce projet a été réalisé durant ma licence professionnelle DAWIN.</p>
<p>Il a été réalisé durant une semaine (Janvier 2017) avec 6 autres étudiants nous a initié au déroulement d’un projet agile, de l’idée à la livraison du projet.</p>
<p>Il s’agit d’un jeu sur navigateur dans lequel on joue contre l’ordinateur (plusieurs niveaux de difficultés) ou à 2 joueurs (localement) pour obtenir le plus de points possible.</p>
<p><img src="/images/macbernick.png" alt="MacBernick"></p>
<h2 id="tetris" tabindex="-1"><a class="heading-link" href="#tetris">Tetris</a></h2>
<p><a href="https://github.com/sylvainmetayer/tetris">Sources (Github)</a> <a href="https://play.google.com/store/apps/details?id=fr.sylvainmetayer.tetris">Télécharger le jeu</a></p>
<p>Projet universitaire réalisé afin de se familiariser avec le développement d’application Android.</p>
<p>Le but était de réaliser un Tetris. Le jeu a ensuite été publié sur le PlayStore et est disponible au téléchargement.</p>
<p><img src="/images/tetris.png" alt="Illustration du tetris"></p>
<h2 id="semaine-innovante" tabindex="-1"><a class="heading-link" href="#semaine-innovante">Semaine Innovante</a></h2>
<p><a href="https://github.com/sylvainmetayer/semaine-innovante-dawin">Sources (Github)</a></p>
<p>La semaine innovante fait partie de la formation DAWIN, durant laquelle le but est de réaliser une application innovante.</p>
<p>Une grande liberté nous a été donné pour réaliser les projets et nous avons eu à disposition différents outils.</p>
<p>Nous avons travaillé sur le fitbit, et plus particulièrement le <a href="https://www.fitbit.com/fr/charge2">Fitbit Charge 2</a> qui intègre un capteur cardiaque. Nous avons ainsi réalisé une application permettant d’effectuer un <a href="https://fr.wikipedia.org/wiki/Test_de_Ruffier">test de Ruffier</a> et d’afficher les résultats en récupérant les données via l’API de Fitbit.</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Développement d’Application Web et Innovation Numérique <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="android"/>
      
        <category term="javascript"/>
      
        <category term="fitbit"/>
      
        <category term="dawin"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          Le présent article liste les différents projets que j&#39;ai pu réaliser durant mon année de licence professionnelle DAWIN à l&#39;IUT de Gradignan
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Projets réalisés - EPSI Bordeaux</title>
      <link href="https://www.sylvain.dev/article/projets-epsi/"/>
      <updated>2017-07-31T00:00:00Z</updated>
      <id>https://sylvain.dev/article/projets-epsi/</id>
      <content type="html">
        <![CDATA[
      <p>Le présent article liste une partie des projets que j’ai pu réaliser durant mes deux années à l’EPSI Bordeaux. La plupart du code réalisé sur ces deux années est disponible au sein de l’organisation Github <a href="https://github.com/EPSIBordeaux">EPSIBordeaux</a></p>
<h2 id="open-innovation" tabindex="-1"><a class="heading-link" href="#open-innovation">Open innovation</a></h2>
<blockquote>
<p>25 février 2019</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/memoryProject">Sources (Github)</a> <a href="https://expo.io/@sylvainmetayer/memoryProject">Tester l’application</a></p>
<p>Ce projet, réalisé en équipe s’inscrivait dans la démarche Open Innovation de l’EPSI, impliquant plusieurs promotions et nécessitant donc d’être organisé. L’objectif était de réaliser un jeu de “Jeu dont vous êtes le héro” sur mobile, en laissant la possiblité de personnaliser simplement le parcours de jeu.</p>
<p>Nous avons développé la première version avec <a href="https://facebook.github.io/react-native/">React Native</a> afin de fournir un support pour Android et iOS.</p>
<h2 id="ar-cube" tabindex="-1"><a class="heading-link" href="#ar-cube">AR-Cube</a></h2>
<blockquote>
<p>1 février 2019</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/ar-cube">Sources (Github)</a> <a href="https://epsibordeaux.github.io/ar-cube/">Testez le sur mobile !</a></p>
<p>Ce projet, réalisé avec une équipe de 4 personnes avait pour objectif d’être une introduction à la réalité augmentée.</p>
<p>A l’aide de la librairie Javascript <a href="https://github.com/jeromeetienne/AR.js">AR.js</a>, il fallait réaliser le dessin d’un cube en réalité virtuelle, lorsque les marqueurs était détécté à l’aide de la caméra du téléphone utilisé. Il fallait également que ce dernier puisse évoluer si l’on venait à bouger le téléphone.</p>
<p>Pour tester le résultat, imprimez le patron du cube présent sur le dépôt Github. Colorier les faces de différentes couleurs et rendez-vous sur <a href="https://epsibordeaux.github.io/ar-cube/">cette adresse</a> depuis votre mobile. Après avoir autorisé l’usage de la caméra, pointez votre téléphone vers le patron et observez le résultat !</p>
<h2 id="earthquake" tabindex="-1"><a class="heading-link" href="#earthquake">Earthquake</a></h2>
<blockquote>
<p>1 février 2019</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/earthquake">Sources (Github)</a> <a href="https://epsibordeaux.github.io/earthquake/">Voir le résultat</a></p>
<p>Ce projet, réalisé avec une équipe de 3 personnes avait pour objectif d’être une introduction à WebGL</p>
<p>A l’aide de la librairie Javascript <a href="https://threejs.org/">three.js</a>, il fallait réaliser une carte du monde indiquant les différents séimes (récupéré à l’aide de l’API <a href="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.geojson">Earthquake.usgs.gov</a>) ainsi que leur gravité/épicentre.</p>
<h2 id="pong" tabindex="-1"><a class="heading-link" href="#pong">Pong</a></h2>
<blockquote>
<p>30 septembre 2018</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/temps-reel">Sources (Github)</a></p>
<p>Ce projet, réalisé en binome durant ma formation à l’EPSI avait pour but de concevoir un jeu avec un système temps réel.</p>
<p>Nous avons donc décidé de réaliser un pong, en utilisant l’API mise à notre disposition pour ce projet.</p>
<p><img src="/images/pong.png" alt="Illustration du jeu de Pong"></p>
<h2 id="syst%C3%A8me-expert" tabindex="-1"><a class="heading-link" href="#syst%C3%A8me-expert">Système Expert</a></h2>
<blockquote>
<p>20 mai 2018</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/epsi-expert-system">Sources (Github)</a></p>
<p>Ce projet avait pour but de concevoir un système expert capable de détecter des formes (rectangle, carré, triangle, …).</p>
<p>Pour ce faire, nous avions à notre dispositions une base de fait et de règles. Pour résoudre le problème, nous ajoutons nos faits et faisons tourner notre algorithme avec la base de règles, qui va comparer les différentes conditions et retourner la bonne réponse.</p>
<p>Le projet a été réalisé avec NodeJS et a été testé avec <a href="https://www.cypress.io/">Cypress</a>.</p>
<h2 id="bot-telegram" tabindex="-1"><a class="heading-link" href="#bot-telegram">Bot Telegram</a></h2>
<blockquote>
<p>30 mars 2018</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/Telegram_Bot">Sources (Github)</a> <a href="https://telegram.me/EPSI_UsainBot"><s>Parler avec le Bot</s> Bot hors ligne</a></p>
<p>Ce projet, réalisé en binome, avait pour but de réaliser un chatbot de recrutement.</p>
<p>Nous avons choisi de réaliser ce bot sur la plateforme <a href="https://telegram.org/">Telegram</a>. L’objectif du bot était de poser quelques questions de développement puis de réseau afin de déterminer le niveau du candidat. Si le candidat a un niveau suffisant, alors une proposition lui ai faite et il est invité à renseigner ses coordonnées pour être recontacté. Dans le cas contraire, on lui demande s’il souhaite laisser ses coordonnées afin d’être recontacté lorsque de nouvelle offres seront disponibles.</p>
<h2 id="machine-learning" tabindex="-1"><a class="heading-link" href="#machine-learning">Machine Learning</a></h2>
<blockquote>
<p>20 février 2018</p>
</blockquote>
<p><a href="https://github.com/EPSIBordeaux/epsi-expert-system">Sources (Github)</a></p>
<p>Ce projet, réalisé en binome durant ma formation à l’EPSI avait pour but de découvrir le fonctionnement des algorithmes de machine learning.</p>
<video controls muted preload="metadata" width="600" height="400">
<p><source src="/images/machine_learning.mp4"
            type="video/mp4"></p>
<p>Désolé, votre navigateur ne permet pas de lire la vidéo.</p>
</video>

    ]]>
      </content>
      
        <category term="android"/>
      
        <category term="javascript"/>
      
        <category term="php"/>
      
        <category term="epsi"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          Le présent article liste les différents projets que j&#39;ai pu réaliser durant mes deux années à l&#39;EPSI Bordeaux
        </summary>
      
    </entry>
  
    
    <entry>
      <title>L&#39;effet Parthenay</title>
      <link href="https://www.sylvain.dev/article/l-effet-parthenay/"/>
      <updated>2017-03-28T00:00:00Z</updated>
      <id>https://sylvain.dev/article/l-effet-parthenay/</id>
      <content type="html">
        <![CDATA[
      <blockquote>
<p>Traduction de l’article “The Parthenay Effect: How a Small French Town Might Save Civilization” paru le 27/3/2017 sur <a href="https://www.huffingtonpost.com/entry/the-parthenay-effect-how-a-small-french-town-might_us_58d810c8e4b0c0980ac0e73f?">The Huffington Post</a></p>
</blockquote>
<blockquote>
<p>⚠ Avertissement<br>
Je ne suis ni traducteur, ni bilingue. Mon objectif est de fournir une traduction de cet article  pour les personnes ayant des difficultés avec l’anglais. Bien qu’ayant tenté de traduire au mieux cet article, je ne peux garantir l’exactitude de ce qui suit.</p>
<p>Tous les droits sur cet article, ainsi que les photos, reviennent à sa rédactrice <a href="https://www.huffingtonpost.com/author/rebecca-novick">Rebecca Novick</a>.</p>
</blockquote>
<p><img src="/images/parthenay-1.jpg" alt="Rue de la vau Saint-Jacques" title="Rue Saint Jacques, le passage du pèlerin par Parthenay sur le pèlerinage de Saint Jacques de Compostelle"></p>
<p>Le printemps dernier, j’ai déménagé à Parthenay, une ville de 11.000 habitants, ce qui est un petit peu plus qu’un village. Il est normal que vous n’en ayez jamais entendu parler. Même mes amis français ont du chercher ou cela se situait. C’est également une commune, ou plutôt ce qui est appelé une “communauté de communes” avec 6 communes voisines. Elle est situé dans le département des Deux-Sèvres, au coeur de la Nouvelle Aquitaine et au sud de la vallée de la Loire. La ville de Parthenay à une beauté ancienne avec peu de lignes droites et beaucoup de paniers à fleurs et de toits en tuiles rouges. Les gens marchent souvent avec tellement de baguettes à la main que vous vous demandez comment il peuvent toutes les manger. Il y a même des distributeurs de baguette automatique, prêt pour ces inévitables urgences. Pour ceux qui vivent dans les villages environnants, une fourgonnette livre du pain fraîchement cuit à votre porte (vous pouvez également acheter la moitié d’une baguette pour 47 centimes). Il y a tellement de gens qui élèvent des poulets que des oeufs frais sont constamment échangé entre voisins, et peu daigneraient consommer ceux élevés en batterie. Même ma maison située dans l’hyper-centre de la ville est paisible parmi ces bourdonnements d’oiseaux qui rappellent à nombre d’entre nous des souvenirs d’enfants. J’avais voyagé pendant quelques mois en Inde une fois,  et j’étais habituée à beaucoup de chaos et d’agitation. Il m’a fallu quelques mois pour m’habituer à cette nouvelle tranquillité.</p>
<blockquote>
<p>“C’est tellement calme ici”, disais-je à un ami. “C’est l’heure du déjeuner” me répondit-il. Puis, souriant, il ajouta : “Ça sera encore plus calme après le déjeuner.”</p>
</blockquote>
<p>La seule fois ou mon sommeil a été interrompu par une perturbation humaine fut durant une nuit d’été, pendant un festival de musique. J’ai été réveillée à 3 heures du matin par le bruit d’un jeune homme homme qui jouait de la guitare et chantait une ballade française dans la rue, sous la fenêtre de ma chambre. J’étais ici, heureuse, avant de retomber dans les bras de Morphée.</p>
<p>Parthenay repose dans une courbe de la rivière du Thouet, vieux français pour “Tranquille”. Établi au milieu du 11ème siècle, ces charmantes maisons médiévales et son château donne l’impression de la terre du Milieu croisée avec le château de Tintagel (<em>Note du traducteur : Tintagel est une localité et une paroisse civile de la côte nord-ouest du comté de Cornouailles en Angleterre.</em>). Parthenay est située dans l’une des Gâtines de la France. Le mot ‘Gâtine’ est connu dans la légende arthurienne pour être un endroit stérile et déserté. La prophétie dit que la terre deviendra fertile une fois la quête du Saint Graal achevée. Le nom fait référence au granit rocheux qui rend l’agriculture difficile. Mais il est riche en faune. (<em>traduction manquante</em>). Ses haies abritent des lapins et ses chênes et hêtres sont des postes de sentinelles pour les buses. Ses champs sont remplis de moutons mais aussi de la superbe  race locale de vaches, la “Parthenaise”, rousse et musclées. Les terres du Sud Deux-Sèvres sont de loin bien plus cultivables. Des champs de tournesol offre une vue magnifique en été. Le blé, l’avoine, les pommes de terre, les pommes et les noix sont cultivées en abondance et le marché aux légumes du mercredi est rempli d’agriculteurs vendant des fromages de chèvres locaux et des tomates de la taille d’une balle de tennis. Vingt ans plus tôt, le gouvernement français payait les agriculteurs pour qu’il laissent leur terre en jachère un an afin qu’ils puissent recommencer sans pesticides. Ce léger mouvement pour les produits bio a reçu assez peu d’attention.</p>
<p>Des méandres amènent sur un moulin abandonné ou sur un ruisseau bouillonnant, des chênes ou encore une église à moitié oubliée. Aucune industrie dans les environs et l’air purifiant des eaux de l’Atlantique, je n’hésite pas à inspirer profondément l’air de Gâtine dans mes poumons. J’ai vécu à Londres, Los Angeles et New Delhi. Ici, je peux respirer d’une façon que j’avais presque oubliée. J’ai un jour été choquée de voir une canette de Coca-Cola flotter dans le Thouet. C’était parce que ce déchet était une aberration que je l’ai remarqué.</p>
<p><img src="/images/parthenay-2.jpg" alt="Le Thouet" title="La rivière du Thouet un jour d'été."></p>
<p>J’ai vécu une grande partie de ma vie dans les montagnes et je pensais qu’elles me manqueraient, mais les ciels de Gâtine sont infinis, à tel point que les nuages deviennent ici des montagnes, formant les gammes de la chaine de l’Himalaya. Le soleil prend tellement de temps à se lever que vous pouvez vous amuser des heures durant avec des palettes kaléidoscopiques de violet, vermillon, topaze et mangenta. Une étendue non obstruée vers l’Ouest offre aux habitants de la Gâtine ce que j’appelle “Le second soleil”, surtout en été. Alors que le soleil descend, aux alentours de vingt heures, il tombe souvent derrière une nuée de nuages mais comme il n’y a pas de bâtiment bloquant la vue à l’horizon, il ré-émerge une demie heure plus tard, offrant jusqu’à deux heures supplémentaires de sa lumière. Cette topographie explique pourquoi Parthenay enregistre le deuxième plus grand temps d’ensoleillement dans toute la France. Ce ciel spacieux et le peu de pollution lumineuse sont fait pour les amateurs d’astronomie. Une fois, en Aout, un groupe d’amis et moi avons conduit jusqu’à un endroit surnommé la “colline du lapin” et avons regardé en silence les météores des Perséides exécuter leur ballet argenté à travers le firmament</p>
<p><img src="/images/parthenay-3.jpg" alt="Le ciel de Parthenay aux aurores" title="Le ciel de Parthenay aux aurores."></p>
<p>Parthenay et ses environs ont été en grande partie protégés du développement rongeant le monde moderne. Après avoir échappé à la pollution et à l’architecture sans âme, les <a href="https://www.parthenaisiens.fr/">Parthenaisiens</a> (habitants de Parthenay) ont aussi surpassé les nombreuses formes de cynismes et narcissismes ravageant le psychisme moderne. Le rythme de vie est simple, respectueux, calme, et cela fournit le cadre parfait pour cette espèce en voie de disparition, le temps.</p>
<p>Je me promène régulièrement ici, en explorant les passages étroits et les escaliers de pierre qui relient la ville ensemble, tout en jetant un oeil aux vieilles portes en bois qui s’ouvrent sur les vergers de pommiers et les jardins d’herbes médiévales. Je m’allonge dans l’herbe et j’entends les champs des grives et des merles, l’odeur de l’herbe et de la terre dans mes narines. Je me sens comme j’ai autrefois été une enfant. J’ai entrepris des projets photos avec Parthenay comme sujet. Elle est profondément photogénique mais sans la vanité des grandes villes françaises. Je l’étudie sous différentes lumières et différentes saisons, sous beaucoup d’angles,et j’écris à propos d’elle dans mon <a href="https://theparthenayproject.com">blog, le “Projet Parthenay”</a>. La ville a été nommé Ville d’Arts et d’Histoire. De nombreux artistes vivent ici, un nombre impressionnant de professeurs de Yoga et de Qi Gong ainsi qu’une communauté d’invalides indépendante.</p>
<p>Alors que je me promène dans les rues le soir, ma caméra à mes côtés, les chats sautent des murs, se frottent contre mes jambes pour une caresse. Les locaux sont assis dans des cafés sirotant le café noir en parcourant les journaux locaux ou en partageant une blague sur les minuscules verres de Rosé (à la différence des Britanniques, les Français tiennent l’alcool. A ce jour, je n’ai entendu qu’une histoire d’état d’ivresse sur la voie publique, ce qui a alimenté les conversations des semaines durant, tellement cela était rare).</p>
<blockquote>
<p>Il est tout à fait normal de saluer plutôt que d’ignorer un étranger ici. Mêmes les jeunes vous saluent lorsque vous leur passez devant.</p>
</blockquote>
<p>Mais la ville ne prospère pas. Les enseignes ferment à un rythme alarmant et presque toutes les rus sont à vendre, les vitrines converties en mini galeries d’art. Les anciennes industries textiles ont disparues, ainsi que le train, qui a transporté ses derniers passagers il y a 23 ans. Une zone commerciale à la périphérie de la ville a aspiré la quasi totalité des commerces du centre ville. (<em>traduction manquante</em>). Les quelques touristes qui arrivent à cet endroit (au détour d’une sortie en vélo le plus souvent) marchent comme s’ils avaient trébuchés sur leur propre conte de fées. Parthenay est une beauté endormie, attendant d’être réveillée.</p>
<p><img src="/images/parthenay-4.jpg" alt="Porte Saint-Jacques" title="Porte Saint Jacques, sur le Thouet, ancienne porte de pèlerinage de Parthenay"></p>
<p>Pourtant, cela n’a pas toujours été le cas. Parthenay était autrefois une ville marchande, capitale de la Gâtine Vendéenne. Pendant des siècles, c’était une étape importante sur le Camino de Compostela, le pèlerinage à la crypte de Saint Jacques, censé avoir le pouvoir de pardonner tous les pêchés, qui traversait toute la France et se terminait à la Cathédrale de Santiago de Compostela au nord ouest de l’Espagne. Depuis les années 1980, le Camino, ou la “voie” a connu une renaissance spectaculaire attirant près de 300.000 pèlerins modernes par an, venant du monde entier. L’itinéraire original prenait des mois à effectuer, mais de nos jours, même les plus aventureux commencent leur voyage près de la frontière espagnole, le long des Pyrénées, sur la frontière Française. Pourtant, j’imagine des réfugiés  du fascisme arrivant comme des pèlerins par l’ancienne voie de la Porte Saint Jacques, qui se dresse au dessus de la rivière, accueillant les naufragés de cette triste civilisation en déclin.</p>
<p>Les matins d’automne, la brume recouvrent les rues et les champs. La ville fortifiée de Parthenay est construite sur une légende. Il est dit qu’elle a été créée par la baguette d’une femme magique, nommé Mélusine. Il y a trois couches de fortifications faites à partir de granit. En effet, c’est un endroit digne de protection. Il y a plus une éthique de vie qu’une éthique de travail ici. La seule chose ouverte le dimanche est l’église. Les déjeuner durent deux à trois heures et sont considérés comme un moment sacré. Même les restaurants sont fermés le lundi et beaucoup ne sont ouverts que quelques heures par semaines, avec des écriteaux sur leurs portes disant “Heure d’ouverture 14-17h le mercredi”. Oui, il peut être compliqué de faire quelque chose. Mais ça va, puisqu’il y a le temps de le faire ici.</p>
<p><img src="/images/parthenay-5.jpg" alt="Le Thouet, vu depuis les murs du chateau" title="Le Thouet, vu depuis les murs du château."></p>
<p>Est-ce que j’exagère ? Oui, mais seulement un peu. Bien sur, de mauvaises choses arrivent, même à Parthenay. Il y a de la méchanceté ici également. Il y a des commérages et de la jalousie. Ce n’est pas pour tout le monde. Il n’y a pas d’hypermarché, seulement une petite salle de cinéma, et peu de grandes chaînes industrielles. L’heure de pointe sont quelques Peugeot qui se bousculent pour une place. Pas même un Starbucks (chut !), ce qui est ironique puisque leur logo est basé sur la dame à queue de poisson, Mélusine, elle-même. Mais il y a plus que ça. Je suis d’un côté effrayée d’en parler, et de l’autre effrayer de ne pas en parler. Si la ville dors, pourquoi ne pas la laisser dormir ? Récemment, un des mes amis discutait à propos d’<a href="https://fr.wikipedia.org/wiki/Hylozo%C3%AFsme">hylozoïsme</a>, la théorie comme quoi les objets inanimés auraient une conscience et peuvent, dans une certaine mesure faire leur propres choix. Une ville peut-elle choisir ses résidents ? J’aime à penser que les pierres et brouillards de Parthenay sont en quelques sortes capable de décider qui vient, et qui pourra s’installer ici. Comme nos gouvernements continue de nous décevoir, nous devons créer plus de communautés intentionnelles dans le monde.</p>
<p>Pour moi, Parthenay est comme un refuge dans cette tempête. Ici, j’apprends à dérouler les noeuds  de mon passé, à embrasser la paix sous toutes ses formes. Je me souviens de la maison d’Elrond dans le Seigneur des Anneaux qui accueillait les voyageurs épuisés et leur fournissait un endroit ou ils pouvaient retrouver leur énergie ainsi que leur inspiration. Comme l’écrit Tolkien, ‘Si seulement il y avait une cure pour la fatigue, la peur et la tristesse.’</p>
<p>Parthenay est ma maison d’Elrond. Pourrait-elle être la votre ?</p>

    ]]>
      </content>
      
        <category term="autres"/>
      
        <category term="parthenay"/>
      
      
        <summary type="html">
          L&#39;effet Parthenay : Comment une petite ville pourrait bien sauver la civilisation française.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Développement d&#39;une solution de recherche de données personnelles</title>
      <link href="https://www.sylvain.dev/article/cartographie-gdpr/"/>
      <updated>2017-02-01T00:00:00Z</updated>
      <id>https://sylvain.dev/article/cartographie-gdpr/</id>
      <content type="html">
        <![CDATA[
      <p>Lors de mon alternance à Atos en Licence Professionnelle DAWIN, j’ai eu l’occasion de développer la première version d’un outil de recherche de données personnelles dans le cadre du <a href="https://eugdpr.org/">GDPR</a> (General Data Protection Regulation)</p>
<p>Le projet a été réalisé en Python avec une équipe de trois personnes.</p>
<p>J’ai travaillé avec les les méthodes agiles (<a href="https://fr.wikipedia.org/wiki/Scrum_(d%C3%A9veloppement)">SCRUM</a>) afin de réaliser un outil capable de s’adapter à plusieurs <a href="https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle">SGBDR</a>.</p>

    ]]>
      </content>
      
        <category term="atos"/>
      
        <category term="python"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          Lors de mon alternance à Atos en Licence Professionnelle DAWIN, j&#39;ai eu l&#39;occasion de développer la première version d&#39;un outil de recherche de données personnelles dans le cadre du GDPR
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Nuit de l&#39;info</title>
      <link href="https://www.sylvain.dev/article/nuit-info/"/>
      <updated>2016-12-02T00:00:00Z</updated>
      <id>https://sylvain.dev/article/nuit-info/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/Clovis-Portron/Nuit-info2016">Source de l’édition 2016 ( Char Ibout; )</a></p>
<p>La nuit de l’info réunit étudiants, enseignants et entreprises afin de réaliser en une nuit une application web sur un thème national donné.</p>
<p>Accompagné d’une équipe de 14 personnes, j’ai eu l’occasion de participer à l’édition 2015 à Bordeaux.</p>
<p>J’ai également participé à l’édition 2016 de cet évènement, toujours à Bordeaux, accompagné d’une équipe de 10 personnes.</p>

    ]]>
      </content>
      
        <category term="dawin"/>
      
        <category term="dut-info"/>
      
      
        <summary type="html">
          La nuit de l&#39;info réunit étudiants, enseignants et entreprises afin de réaliser en une nuit une application web sur un thème national donné.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Projets réalisés en DUT Info</title>
      <link href="https://www.sylvain.dev/article/projets-dut-info/"/>
      <updated>2016-06-30T00:00:00Z</updated>
      <id>https://sylvain.dev/article/projets-dut-info/</id>
      <content type="html">
        <![CDATA[
      <p>Le présent article liste les différents projets que j’ai pu réaliser durant mes années de DUT Informatique à Limoges. Ces projets ont été réalisés la plupart du temps en binôme, ou en groupe.</p>
<h2 id="bataille-navale" tabindex="-1"><a class="heading-link" href="#bataille-navale">Bataille navale</a></h2>
<p><a href="https://github.com/sylvainmetayer/BatailleNavale">Source (Github)</a> <a href="https://github.com/sylvainmetayer/BatailleNavale/blob/master/versionGraphique.jar?raw=true">Version Graphique (.jar)</a></p>
<p>Réalisé en binome entre Mars et Mai 2015, ce projet nous a permis de nous familiariser avec Java Swing et de consituer nos premières interfaces graphiques.</p>
<p>Le jeu se joue à deux joueurs, avec la possibilité de sauvegarder les parties.</p>
<p>Il était demandé de réaliser une version console et une version graphique du jeu.</p>
<p><img src="/images/bataille_navale.jpg" alt="Image de bataille navale"></p>
<h2 id="betisier-de-l%E2%80%99iut" tabindex="-1"><a class="heading-link" href="#betisier-de-l%E2%80%99iut">Betisier de l’IUT</a></h2>
<p><a href="https://github.com/sylvainmetayer/Betisier-TP">Source (Github)</a> <a href="https://betisier.sylvainmetayer.fr/">Voir le site</a></p>
<p>Ce projet universitaire constituait une découverte du PHP. Il consistait à réaliser un site rassemblant les perles de profs, permettant leur ajout, notation par des élèves, …</p>
<p>Un module d’administration était également demandé, afin de gérer entre autres les utilisateurs, et mettre un système de modération sur les citations.</p>
<p>Ce projet a été réalisé entre Octobre et Décembre 2015.</p>
<p><img src="/images/betisier.gif" alt="Image du Betisier de l'IUT du Limousin"></p>
<h2 id="gemao" tabindex="-1"><a class="heading-link" href="#gemao">GEMAO</a></h2>
<p><a href="https://gitlab.com/TheoG/ProjetTuteure/tree/Pedagogie">Sources (Gitlab)</a></p>
<p>GEMAO<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup> est un projet tuteuré qui consistait à réaliser une application permettant la gestion d’une école de musique avec JavaEE.</p>
<p>Il s’agissait de la continuité d’un projet commencé l’année dernière par un autre groupe d’étudiants.</p>
<p>Réalisé en groupe (5 étudiants) pour l’école de musique Anacrouse, située à La Chapelle Saint Ursin, de Septembre 2015 à Avril 2016.</p>
<p><img src="/images/gemao.png" alt="GEMAO"></p>
<h2 id="pygame" tabindex="-1"><a class="heading-link" href="#pygame">Pygame</a></h2>
<p><a href="https://github.com/sylvainmetayer/pygame">Source (Github)</a></p>
<p>Ce projet universitaire consistait à réaliser un mini-jeu en réseau, à l’aide des librairies PyGame et PodSixNet.</p>
<p>Il a été réalisé entre Février et Avril 2016.</p>
<p><img src="/images/pygame.jpg" alt="Le jeu Pygame en image"></p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Gestion d’Ecole de Musique Assistée par Ordinateur <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="java"/>
      
        <category term="php"/>
      
        <category term="python"/>
      
        <category term="dut-info"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          Le présent article liste les différents projets que j&#39;ai pu réaliser durant mes années de DUT Informatique à Limoges
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Rapport DUT Informatique</title>
      <link href="https://www.sylvain.dev/article/memoire-dut/"/>
      <updated>2016-06-20T00:00:00Z</updated>
      <id>https://sylvain.dev/article/memoire-dut/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://gitlab.com/ocyhc/memoire-dut-info/tree/master">Sources (Gitlab)</a> <a href="https://gitlab.com/ocyhc/memoire-dut-info/blob/master/main.pdf">Voir le PDF</a></p>
<p>Ce mémoire détaille le travail réalisé durant mon stage au sein de <a href="https://www.nextmedia.fr/">NextMedia</a>, effectué d’avril à Juillet 2016.</p>
<p>J’y ai réalisé la refonte de l’administration du site vitrine de la société, ainsi qu’un gestionnaire de version pour le produit phare de la société : <a href="https://www.quizzbox.com/fr/">un boitier de vote interactif, Quizzbox</a>. Ce site permet ainsi aux différents client de Quizzbox de pouvoir télécharger les versions du logiciel sur une plateforme, et d’avoir un suivi des mises à jour disponible.</p>
<p>Pour ce projet, j’ai également été amené à générer des miniatures à partir d’un document PowerPoint, pour pouvoir afficher un aperçu du document sur le site.</p>
<p><img src="/images/rapport_dut.png" alt="Page de garde de mon rapport de stage de DUT Informatique"></p>

    ]]>
      </content>
      
        <category term="dut-info"/>
      
      
        <summary type="html">
          Ce mémoire détaille le travail réalisé durant mon stage au sein de Nextmedia
        </summary>
      
    </entry>
  
</feed>