<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <generator uri="https://11ty.dev/" version="3.1.6">Eleventy</generator>
  <title>Sylvain</title>
  <subtitle>Backend &amp; DevOps developer in Bordeaux</subtitle>
  <link href="https://www.sylvain.dev/en/feed.xml" rel="self"/>
  <link href="https://www.sylvain.dev/en/"/>
  
    <updated>2025-01-30T00:00:00Z</updated>
  
  
  <id>https://sylvain.dev/en/</id>
  <author>
    <name>Sylvain MÉTAYER</name>
    <email>bonjour@sylvain.dev</email>
  </author>
  
    
    <entry>
      <title>SnowCamp 2025</title>
      <link href="https://www.sylvain.dev/en/article/snowcamp-2025/"/>
      <updated>2025-01-30T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/snowcamp-2025/</id>
      <content type="html">
        <![CDATA[
      <p><img src="/images/snowcamp-2025.jpg" alt="A packed SnowCamp auditorium facing two speakers on stage and their slides"></p>
<p>For once, let’s start by putting ourselves in the shoes of tech event organizers. Like many other conferences this year, <a href="https://fr.linkedin.com/company/snowcamp-io">Snowcamp</a> struggled to find sponsors. So first of all, a very warm thank you to those who stayed loyal.</p>
<p>It’s a real problem, and it has already led other conferences to be cancelled. These events are our best way to learn, share, challenge our points of view and broaden our horizons. Let’s hope it’s only temporary; in the meantime, we want to give our full support to the organizers, who do an amazing job, as volunteers!</p>
<p>Now on to our takeaways from a few of the talks we attended with <a href="https://fr.linkedin.com/in/anaismoulin">Anaïs M.</a> and <a href="https://fr.linkedin.com/in/jerome-tama">Jérôme Tama</a>.</p>
<p>Thursday kicks off with a technical dissection of the XZ Utils backdoor by <a href="https://fr.linkedin.com/in/quentindunand">Quentin Dunand</a> and <a href="https://fr.linkedin.com/in/wassim-ahmedb">Wassim Ahmed-Belkacem</a>. They walk us through, step by step, how the backdoor was put in place. The talk is lively, and the step-by-step explanation makes the engineering behind it very clear.</p>
<p>Next up is <a href="https://fr.linkedin.com/in/jerome-tama">Jérôme Tama</a>, who invites us to take (or retake) our… refactoring license! We discover how OpenRewrite works and how it lets you make large-scale code changes simply and automatically.</p>
<p><a href="https://fr.linkedin.com/in/loic-gudet">Loic Gudet</a> then gives a live demo of a generative AI prototype themed around the “Paris 2024 Olympic Games”. Among other things, it’s a concrete way to show how user feedback is used to improve the answers, what it costs to maintain these AIs, and which tools are used to measure their effectiveness. An insightful talk to understand everything that goes into building a generative AI.</p>
<p>In the same slot, <a href="https://fr.linkedin.com/in/pvulliemin-platform-engineer/fr">Paul Vulliemin</a> and <a href="https://fr.linkedin.com/in/m%C3%A9lissa-pinon">Mélissa Pinon</a> share how they manage their teams’ development environments with a cloud solution, focusing on resource elasticity and fast onboarding for developers. After comparing the options they considered, they show us the one they picked, Coder, and how they rolled it out, with a demo of the tool’s features and its IDE integrations.</p>
<p>After these talks, it’s my turn to give my own talk, on SOPS, where I show how this tool can help you store your secrets securely in your Git repositories, even without access to an external Secret Manager or Vault.</p>
<p>After lunch, <a href="https://fr.linkedin.com/in/leogatellier">Léo Gatellier</a> and <a href="https://fr.linkedin.com/in/tim-ghibaudo-27401853">🚀 Tim Ghibaudo</a> give us an unfiltered account of their 3 years spent maintaining their Kubernetes cluster: what worked well and what still needs improving. With the goal of making development teams autonomous, they explain how they automated recurring tasks with scripts, CLIs and/or APIs to reduce manual work, while still meeting the ops team’s security requirements. Léo and Tim also stress that the biggest change isn’t just technical but organizational, and therefore needs proper support to succeed.</p>
<p>In the same slot, <a href="https://fr.linkedin.com/in/olivierleplus">Olivier Leplus</a> and <a href="https://fr.linkedin.com/in/yohanlasorsa/fr">Yohan Lasorsa</a> present more than 10 web features (with a soft spot for number 9 ¾), some of them available for years, little known and yet capable of making our lives easier. Whether it’s handling arrays or centering a div efficiently… this talk offers solutions to everyday problems.</p>
<p>To close the day, <a href="https://fr.linkedin.com/in/anaismoulin">Anaïs M.</a> takes the stage on a topic that is too rarely discussed, positive discrimination, sharing her own experiences and feelings and showing that although progress has been made, there is still a lot left to do!</p>
<p>These 2 days of conferences were a chance to discover new things but also to talk with many people, whether at the speakers’ dinner or over a coffee between talks. Thanks to everyone, attendees and speakers alike, for these great conversations!</p>
<p>We’d also like to thank <a href="https://fr.linkedin.com/in/brunolavit">Bruno Lavit</a> for the wonderful photos he took during this edition. And finally, a big thank you to <a href="https://fr.linkedin.com/company/onepoint">Onepoint</a> for enabling us to share our experience at these events!</p>

    ]]>
      </content>
      
        <category term="snowcamp"/>
      
        <category term="conference"/>
      
      
        <summary type="html">
          Our takeaways from SnowCamp 2025: the XZ Utils backdoor, OpenRewrite, generative AI, development environments with Coder, Kubernetes in production and little-known web features.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Our take on Build &amp; Deploy at Devoxx France 2024</title>
      <link href="https://www.sylvain.dev/en/article/devoxx-france-2024-build-deploy/"/>
      <updated>2024-05-30T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/devoxx-france-2024-build-deploy/</id>
      <content type="html">
        <![CDATA[
      <p><img src="/images/devoxx-france-2024.jpg" alt="Devoxx France 2024 banner: a humanoid robot sprinting on a running track"></p>
<p>After our colleagues’ write-ups, here is ours on the Build &amp; Deploy track of Devoxx France 2024.</p>
<p>And as every year, the least we can say is that there was plenty to choose from, with dozens of talks on how to package and deploy our applications! Without further ado, here are the topics in this category that stood out to <a href="https://dev.to/cfarges">@cfarges</a>, <a href="https://dev.to/jtama">@jtama</a> and me.</p>
<h2 id="gatewayapi%2C-10-ans-de-maturation-pour-une-nouvelle-api-kubernetes-(gatewayapi%2C-10-years-in-the-making-for-a-new-kubernetes-api)" tabindex="-1"><a class="heading-link" href="#gatewayapi%2C-10-ans-de-maturation-pour-une-nouvelle-api-kubernetes-(gatewayapi%2C-10-years-in-the-making-for-a-new-kubernetes-api)">GatewayAPI, 10 ans de maturation pour une nouvelle API Kubernetes (GatewayAPI, 10 years in the making for a new Kubernetes API)</a></h2>
<p>This year, <a href="https://www.linkedin.com/in/davinkevin/">Kévin Davin</a> came to talk to us about the Gateway API. &lt;3</p>
<p>With quite a bit of hindsight, the verdict is clear: the <em>Ingress</em> resource is not enough. It takes on too many responsibilities, isn’t specific enough, leaves each implementation free to make different choices for the same problem (poor portability), and doesn’t provide enough features either.</p>
<p>The Gateway API is <em>role</em>-oriented, with several <em>kinds</em>:</p>
<ul>
<li>The <em>GatewayClass</em>:: For the provider, the one who knows the network</li>
<li>The <em>Gateway</em> :: For the cluster operator, the one who knows the cluster 🤷</li>
<li>The <em>GRPCRoute</em> / <em>HTTPRoute</em>:: For developers, the ones who know the applications.</li>
</ul>
<p>Each person has their own skills, knowledge, responsibilities, and <em>kind</em>.</p>
<p>This API goes far enough to overlap significantly with some of the features offered by <em>service meshes</em> (including traffic splitting).</p>
<p><s class="dead-link" title="The replay video is no longer available">Replay</s></p>
<h2 id="multi-kubernetes%2C-multi-r%C3%A9gions%2C-au-secours-!-(multi-kubernetes%2C-multi-region%2C-help!)" tabindex="-1"><a class="heading-link" href="#multi-kubernetes%2C-multi-r%C3%A9gions%2C-au-secours-!-(multi-kubernetes%2C-multi-region%2C-help!)">Multi Kubernetes, Multi Régions, Au-secours ! (Multi Kubernetes, Multi Region, Help!)</a></h2>
<p>Through a REX (experience report) built around a fictional company, <a href="https://www.linkedin.com/in/aur%C3%A9lien-moreau-32075a105/">Aurélien Moreau</a> and <a href="https://www.linkedin.com/in/nicolas-lavacry-13a21415/">Nicolas Lavacry</a> present the needs of their new company: CASDAL. It has 2 markets, one in the US and one in France. How do you host this application?</p>
<p>We then learn how to deploy a Kubernetes environment across several regions, and why several clusters are needed to keep latency low, since Kubernetes doesn’t like latency when a continent separates its nodes. Their flawlessly executed demo takes us behind the scenes and shows the tools and methods to guarantee quality of service, low latency and data integrity!</p>
<p><a href="https://www.youtube.com/watch?v=ADp3fonoDWM">Replay</a></p>
<h2 id="notre-d%C3%A9pendance-%C3%A0-l%E2%80%99open-source-est-effrayante.-slsa%2C-sbom-et-sigstore-%C3%A0-la-rescousse-(our-dependency-on-open-source-is-scary.-slsa%2C-sbom-and-sigstore-to-the-rescue)" tabindex="-1"><a class="heading-link" href="#notre-d%C3%A9pendance-%C3%A0-l%E2%80%99open-source-est-effrayante.-slsa%2C-sbom-et-sigstore-%C3%A0-la-rescousse-(our-dependency-on-open-source-is-scary.-slsa%2C-sbom-and-sigstore-to-the-rescue)">Notre dépendance à l’Open Source est effrayante. SLSA, SBOM et Sigstore à la rescousse (Our dependency on Open Source is scary. SLSA, SBOM and Sigstore to the rescue)</a></h2>
<p>This very interesting talk shows how much we rely on third-party software and dependencies in our applications, over which we have no control. Does that mean we should use them without checking their integrity, leaving room for a middleman to inject malicious code during a packaging step of our application?</p>
<p><a href="https://www.linkedin.com/in/sabdelfettah/">Abdellfetah Sghiouar</a> then presents tools we can rely on to guarantee the traceability of our applications, such as cosign to sign our images before deploying them to our cluster, or SBOMs to list every package used in our application.</p>
<p><a href="https://www.youtube.com/watch?v=MEJ-ae_D8X4">Replay</a></p>
<h2 id="au-c%C5%93ur-de-la-ruche-ebpf!-(inside-the-ebpf-hive!)" tabindex="-1"><a class="heading-link" href="#au-c%C5%93ur-de-la-ruche-ebpf!-(inside-the-ebpf-hive!)">Au cœur de la ruche eBPF! (Inside the eBPF hive!)</a></h2>
<p>I had heard about eBPF several times without really knowing what it was. So this talk was an opportunity for me to dig into the subject! Although very technical, <a href="https://www.linkedin.com/in/aboullaite/">Mohammed Aboullaite</a> clearly explained how a kernel module works and how eBPF has evolved. I don’t think I’ll be writing my own kernel module tomorrow, but I now better understand all the “hype” around it and the value eBPF brings by making it easier to distribute a new module, with native performance and the same level of security.</p>
<p><a href="https://www.youtube.com/watch?v=XaBbxb0r0fc">Replay</a></p>
<h2 id="le-cauchemar-des-attaquants-%3A-une-infrastructure-sans-secret-(an-attacker%E2%80%99s-nightmare%3A-a-secretless-infrastructure)" tabindex="-1"><a class="heading-link" href="#le-cauchemar-des-attaquants-%3A-une-infrastructure-sans-secret-(an-attacker%E2%80%99s-nightmare%3A-a-secretless-infrastructure)">Le cauchemar des attaquants : une infrastructure sans secret (An attacker’s nightmare: a secretless infrastructure)</a></h2>
<p><a href="https://www.linkedin.com/in/thibault-lengagne-76a35583/">Thibault Lengagne</a> shows us how to use Vault and Boundary to get rid of most passwords<br>
in our environments while keeping a “Secure by design” approach and full traceability of every access to application components.</p>
<p>With a Zero-Credentials architecture, each user has a single password that gives access, through Boundary,<br>
to our applications. Combining Boundary and Vault makes it possible to create temporary credentials and keep full traceability of access, from development environments all the way to production.</p>
<p>Thibault shows us an architecture and the best practices that go with these concepts. Through several short demos, we start wanting to roll this out in our own environments, especially as our teams keep growing.</p>
<p>No more endless password rotations: we have one access, and the rest is handled by the policies defined in our infrastructure’s source code.</p>
<p><a href="https://www.youtube.com/watch?v=U3AL2pqPg3I">Replay</a></p>
<h2 id="check-list-ultime-pour-rendre-vos-app-cloud-native-(the-ultimate-checklist-to-make-your-apps-cloud-native)" tabindex="-1"><a class="heading-link" href="#check-list-ultime-pour-rendre-vos-app-cloud-native-(the-ultimate-checklist-to-make-your-apps-cloud-native)">Check-list ultime pour rendre vos app cloud native (The ultimate checklist to make your apps cloud native)</a></h2>
<p>In this talk, <a href="https://www.linkedin.com/in/katiahimeur/">Katia Himeur</a> goes over the various contexts that may lead us to move our applications to the “cloud”.</p>
<p>She reminds us that the definition of “cloud” can vary widely depending on who you’re talking to. The complexity, the plethora of available solutions (over 2,000 tools in the CNCF landscape, for example) and the diversity of providers must all be taken into account in a cloud project, whether for a new application<br>
or for migrating an existing one.</p>
<p>Part methodology, part experience report, Katia’s talk is a goldmine of information and inspiration on how to approach this kind of project.</p>
<p>The points she covers are as much about people as about technology, including team onboarding and change management. The main pain points of these projects are addressed: could this be the ultimate recipe?</p>
<p><a href="https://www.youtube.com/watch?v=3s-gtziZ3UU">Replay</a></p>
<h2 id="final-words" tabindex="-1"><a class="heading-link" href="#final-words">Final words</a></h2>
<p>Thanks to <a href="https://dev.to/onepoint">@onepoint</a> for allowing us to take part in this special event every year!<br>
Feel free to check out the other articles our colleagues published on the other tracks!</p>
<p>Read our full series of articles on Devoxx:</p>
<ol>
<li><a href="https://dev.to/onepoint/devoxx-france-2024-8o">Intro</a></li>
<li><a href="https://dev.to/onepoint/notre-retour-frontend-sur-devoxx-2024-1jgg">Frontend</a></li>
<li><a href="https://dev.to/onepoint/mais-oui-ia-de-la-data-a-devoxx-france-2024--4kpe">Data/AI</a></li>
<li><a href="https://dev.to/onepoint/notre-retour-backend-sur-devoxx-2024-4knc">Backend</a></li>
</ol>

    ]]>
      </content>
      
        <category term="devoxx"/>
      
        <category term="conference"/>
      
        <category term="kubernetes"/>
      
      
        <summary type="html">
          The Build &amp; Deploy talks that stood out to us at Devoxx France 2024: Gateway API, multi-region Kubernetes, supply chain, eBPF, Vault and Boundary.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>DevoxxFR 2023</title>
      <link href="https://www.sylvain.dev/en/article/devoxx-france-2023/"/>
      <updated>2023-04-27T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/devoxx-france-2023/</id>
      <content type="html">
        <![CDATA[
      <p><img src="/images/devoxx-france-2023.jpg" alt="Devoxx France banner: the Eiffel Tower at sunset, with drones flying overhead"></p>
<p>We came (back) to <a href="https://www.devoxx.fr/">DevoxxFR</a> for this 11th edition, and there was plenty to choose from! With an average of 8 talks/tools-in-action running in parallel, there’s something for everyone! Which works out well: since we all have different preferences, we were able to cover a good number of talks across various topics: front-end, AI, CI/CD, Kubernetes…</p>
<p>When there’s too much to choose from in the same slot, you can always count on the <a href="https://www.youtube.com/@DevoxxFRvideos">Devoxx YouTube channel</a>. Almost all the talks are already available as replays!</p>
<p>Out of everything we got to see, here is our top 5!</p>
<h2 id="top-5" tabindex="-1"><a class="heading-link" href="#top-5">Top 5</a></h2>
<h3 id="1st-in-our-%E2%9D%A4%EF%B8%8F-%E2%80%9Calice-au-pays-d%E2%80%99opentelemetry%E2%80%9D-(alice-in-opentelemetry-land)" tabindex="-1"><a class="heading-link" href="#1st-in-our-%E2%9D%A4%EF%B8%8F-%E2%80%9Calice-au-pays-d%E2%80%99opentelemetry%E2%80%9D-(alice-in-opentelemetry-land)">1<sup>st</sup> in our ❤️ “Alice au pays d’OpenTelemetry” (Alice in OpenTelemetry Land)</a></h3>
<p>This is an experience report on setting up observability in a project made of several software components. After introducing the concepts of observability and OpenTelemetry, <a href="https://dev.to/jtama">@jtama</a> iteratively walks us through his experience and the obstacles he ran into while taming this “magic collector” to unify our logs, traces and metrics.</p>
<p><a href="https://www.youtube.com/watch?v=0xSCUgHxZu0">YouTube replay</a><br>
<a href="https://jtama.github.io/alice-au-pays-d-opentelemetry/#/">Slides</a><br>
<s class="dead-link" title="The CFP website is no longer online">CFP page</s></p>
<h3 id="comprendre-et-utiliser-les-mod%C3%A8les-de-langage-d%E2%80%99ia-(understanding-and-using-ai-language-models)" tabindex="-1"><a class="heading-link" href="#comprendre-et-utiliser-les-mod%C3%A8les-de-langage-d%E2%80%99ia-(understanding-and-using-ai-language-models)">Comprendre et utiliser les modèles de langage d’IA (Understanding and using AI language models)</a></h3>
<p>This 3-hour deep-dive session by <a href="https://twitter.com/collet_seb">Sébastien Collet</a> introduces Machine Learning and Deep Learning models, how they work, their limits and how they have evolved in recent years.</p>
<p>It also focuses on predictive language models, which helps understand why models such as ChatGPT have the flaws that have been pointed out recently (hallucinations, toxicity…).</p>
<p>If you want a complete, accessible course for non-specialists, including a history of AI models, this talk is for you!</p>
<p><a href="https://www.youtube.com/watch?v=ZbWL2W53BXY">YouTube replay</a><br>
<a href="https://docs.google.com/presentation/d/e/2PACX-1vReIr93Udkzm3S0qn59AyFDYQjuXq0puGNYlFQYqDyoHqio_UgHbqQV1Qm4sUwt0ZeawfvGFdQOCHLc/pub#slide=id.g21f549ddc89_0_0">Slides</a><br>
<a href="https://github.com/sebastien-collet/talks/blob/master/Devoxx%20FR%202023/Ressources.md">GitHub repository</a><br>
<s class="dead-link" title="The CFP website is no longer online">CFP page</s></p>
<h3 id="une-architecture-gitops-from-scratch-%3A-gitlab%2C-ansible%2C-terraform%2C-kubernetes-et-aws-(a-gitops-architecture-from-scratch%3A-gitlab%2C-ansible%2C-terraform%2C-kubernetes-and-aws)" tabindex="-1"><a class="heading-link" href="#une-architecture-gitops-from-scratch-%3A-gitlab%2C-ansible%2C-terraform%2C-kubernetes-et-aws-(a-gitops-architecture-from-scratch%3A-gitlab%2C-ansible%2C-terraform%2C-kubernetes-and-aws)">Une Architecture GitOps from scratch : Gitlab, Ansible, Terraform, Kubernetes et AWS (A GitOps architecture from scratch: Gitlab, Ansible, Terraform, Kubernetes and AWS)</a></h3>
<p>In this 3-hour deep-dive session, <a href="https://www.twitter.com/@LoicOrtola">Loïc Ortola</a> and <a href="https://www.twitter.com/@AurelOps">Aurélien Moreau</a> from <a href="https://www.takima.fr/">Takima</a> take us on a dive into setting up a Kubernetes cluster with <em>Infrastructure as code</em>.</p>
<p>Each tool is justified by the role it plays. The talk gradually builds up a complex, multi-cluster infrastructure, from provisioning the infrastructure all the way to continuous deployment of the applications, in a 100% GitOps approach.</p>
<p><a href="https://www.youtube.com/watch?v=FyAD_-LAMLo">YouTube replay</a><br>
<a href="https://gitlab.com/takima-school/takione">Gitlab repository</a><br>
<s class="dead-link" title="The CFP website is no longer online">CFP page</s></p>
<h3 id="g%C3%A9opolitique-de-la-data-(the-geopolitics-of-data)" tabindex="-1"><a class="heading-link" href="#g%C3%A9opolitique-de-la-data-(the-geopolitics-of-data)">Géopolitique de la data (The geopolitics of data)</a></h3>
<p>In this 20-minute keynote, <a href="https://twitter.com/bayartb">Benjamin Bayart</a>, co-founder of La Quadrature du Net, uses various examples and plain-language explanations to describe what the geopolitics of data is and how European regulation on personal data protection has evolved.</p>
<p>He closes with the message that every software engineer is involved in the geopolitics of data.</p>
<p><a href="https://www.youtube.com/watch?v=EOOhYaGGArc">YouTube replay</a><br>
<s class="dead-link" title="The CFP website is no longer online">CFP page</s></p>
<h3 id="d%C3%A9mystifions-les-composants-internes-de-kubernetes-(demystifying-kubernetes-internals)" tabindex="-1"><a class="heading-link" href="#d%C3%A9mystifions-les-composants-internes-de-kubernetes-(demystifying-kubernetes-internals)">Démystifions les composants internes de Kubernetes (Demystifying Kubernetes internals)</a></h3>
<p>The goal of this talk is to show that Kubernetes isn’t an “automagic tool”, but that it relies on software components that are individually “simple” and that, put together, make Kubernetes robust.</p>
<p>Through a live demo, <a href="https://twitter.com/zwindler">Denis Germain</a> presents the various components that make up Kubernetes and what each one does, ending up with an application deployed on a “handmade” cluster!</p>
<p>If you want to know what’s behind a “kubectl apply -f mon-deploiement.yaml”, or understand how “etcd”, “api-server”, “controller-manager”, “scheduler”, “kubelet”, “containerd” or “CNI” work together, this talk is for you!</p>
<p><a href="https://www.youtube.com/watch?v=OCMNA0dSAzc">YouTube replay</a><br>
<a href="https://blog.zwindler.fr/talks/2023-demystifions-kubernetes/index.html">Slides</a><br>
<a href="https://github.com/zwindler/demystifions-kubernetes">GitHub repository with the demo</a><br>
<s class="dead-link" title="The CFP website is no longer online">CFP page</s></p>
<h3 id="select-%E2%80%98amazing_features%E2%80%99-from-%E2%80%9Cpostgresql%E2%80%9D" tabindex="-1"><a class="heading-link" href="#select-%E2%80%98amazing_features%E2%80%99-from-%E2%80%9Cpostgresql%E2%80%9D">SELECT ‘amazing_features’ FROM “postgresql”</a></h3>
<p>In this Tools in action, <a href="https://twitter.com/davinkevin">Kevin Davin</a> helps us (re)discover little-known or forgotten PostgreSQL features.</p>
<p>From performance to syntactic sugar and best practices, Kevin shows us the vast toolbox Postgres offers to help developers build faster, more maintainable applications.</p>
<p>He also points out a few bad practices that are nonetheless common when approaching this database as a newcomer.</p>
<p>Whether or not you use Postgres, this talk will show you its superpowers and make you want to give it a try.</p>
<p><a href="https://www.youtube.com/watch?v=I1rAkNDv1Ws">YouTube replay</a><br>
<a href="https://download.davinkevin.fr/presentations/select-amazing-features-from-postgresql/devoxxfr-2023/select-amazing-features-from-postgresql.pdf">Slides</a><br>
<a href="https://gitlab.com/davinkevin.fr/presentations/select-amazing_features-from-postgresql">Gitlab repository</a><br>
<s class="dead-link" title="The CFP website is no longer online">CFP page</s></p>
<h2 id="wrapping-up" tabindex="-1"><a class="heading-link" href="#wrapping-up">Wrapping up</a></h2>
<p>DevoxxFR is 3 days of talks: think of it as a marathon, not a sprint! Plan your schedule and keep some breaks to visit the many booths of the products and software we use every day (or that we got to discover), which are there to collect feedback and suggestions for improvement!</p>
<p>To make note-taking easier, we also built a small tool that automatically generates note templates from your favorites. <a href="https://github.com/cfrezier/devoxx2adoc/">The GitHub repository</a></p>
<p>Written by five of us, with the fabulous <a href="https://dev.to/cfrezier">@cfrezier</a> <a href="https://dev.to/cfarges">@cfarges</a> <a href="https://dev.to/jtama">@jtama</a> and <a href="https://dev.to/florianallainmat">@florianallainmat</a>!</p>
<p>We’d also like to say a big thank you to <a href="https://www.groupeonepoint.com">onepoint</a> for organizing these 3 great days!</p>
<p>Thanks! 😊</p>

    ]]>
      </content>
      
        <category term="devoxx"/>
      
        <category term="conference"/>
      
        <category term="kubernetes"/>
      
      
        <summary type="html">
          The talks that stood out to us at the 11th edition of DevoxxFR: OpenTelemetry, language models, GitOps, the geopolitics of data, Kubernetes and PostgreSQL.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>My First Meetup</title>
      <link href="https://www.sylvain.dev/en/article/meetup-terraform/"/>
      <updated>2022-02-05T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/meetup-terraform/</id>
      <content type="html">
        <![CDATA[
      <p>On February 1st, I gave my first live meetup talk with onepoint, on YouTube. The topic was “Terraform, REX d’un développeur” (Terraform, a developer’s experience report). For those who would like to watch it, the replay is available here: <a href="https://www.youtube.com/watch?v=GR_YJIfo8jg&amp;list=PLm-YYS9h2JhWiAZ5QuuJD6jyghWjkK09q&amp;index=27">YouTube link</a>.</p>
<p>I’m proud of myself, as I usually prefer being behind the camera. Being encouraged to share this experience report pushed me out of my comfort zone, and in the end, the key takeaway is that 45 minutes is both long and short :)</p>

    ]]>
      </content>
      
        <category term="onepoint"/>
      
        <category term="terraform"/>
      
        <category term="meetup"/>
      
      
        <summary type="html">
          On February 1st, I gave my first meetup talk, live on YouTube
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Recovering SQL dumps from a MySQL/MariaDB instance that won&#39;t start</title>
      <link href="https://www.sylvain.dev/en/article/recuperer-donnees-mysql/"/>
      <updated>2021-05-04T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/recuperer-donnees-mysql/</id>
      <content type="html">
        <![CDATA[
      <p>After a somewhat bumpy update of my Raspberry Pi, my MariaDB database would no longer start, reporting an error caused by the update. So I had a MySQL that refused to start and, of course, no backup!</p>
<p>However, I still had the <code>/var/lib/mysql</code> folder, which seemed intact. So I made a tar.gz of the folder and copied it to my machine to see what I could do with it.</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># create the tar.gz on the server</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"># copy it locally</span>
$ <span class="token function">scp</span> pi:~mysql.tar.gz <span class="token builtin class-name">.</span></code></pre>
<p>Once that was done, I used Docker and the mariadb image (version 10.3, the one running on my server, to avoid any incompatibility) to start a local mariadb instance with the data I had just recovered.</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># Extract the 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"># I'll need this folder later to retrieve my SQL dumps</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>The environment variable is required, otherwise the image won’t start, but keep in mind that you’ll have to use the password of your MySQL instance as it was on your server.</p>
<p>Once that’s done, just run the following command to connect to the container:</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>And finally, we can run mysqldump and store the output in the <code>/backup</code> folder we also mounted, so we can restore the data once the database is up and running again.</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>Hopefully this will be useful to others!</p>
<blockquote>
<p>And if you don’t have a recent backup, go back up your data right now :)</p>
</blockquote>

    ]]>
      </content>
      
        <category term="mysql"/>
      
      
        <summary type="html">
          After a somewhat bumpy update of my Raspberry Pi, my MariaDB database would no longer start
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Email alias manager</title>
      <link href="https://www.sylvain.dev/en/article/email-alias-manager/"/>
      <updated>2020-01-27T00:00:00Z</updated>
      <id>https://sylvain.dev/en/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="Deploy to Netlify"></a></p>
<h2 id="the-idea" tabindex="-1"><a class="heading-link" href="#the-idea">The idea</a></h2>
<p>Too much spam? Tired of handing out your email address to every service? Email aliases to the rescue!</p>
<p>Following an idea from <a href="https://web.archive.org/web/20200814055750/https://adrienchinour.me/">Adrien Chinour</a>, I decided to build my own small alias manager for my email addresses. The goal is to quickly generate aliases so you don’t have to give out your real email address when signing up on random websites. That way, if a site sends a bit too much email for your taste, if you no longer use the service, or if unsubscribing turns into an obstacle course, you just delete the alias, and no more unwanted email!</p>
<p>Since my domains are managed by <a href="https://gandi.net">Gandi</a>, I looked into how to work with my email addresses and create aliases through their <a href="https://api.gandi.net/docs/">API</a>.</p>
<p>As for the tech stack, I used <a href="https://angular.io">Angular</a> and <a href="https://netlify.com">Netlify</a> serverless functions (in NodeJS) to handle the calls to the Gandi API.</p>
<p>The principle is very simple: you log in with a password, predefined in the environment variables of the Netlify serverless functions, you get a JWT signed with a secret known only to the serverless functions, and from then on you are considered authenticated. Since I don’t need to handle multiple users, this fits my use case.</p>
<p>Once authenticated, the serverless functions fetch the list of domains along with the mailboxes associated with them, and you land on the following screen, which lets you manage the aliases of each mailbox.</p>
<p><img src="/images/alias-email-desktop.png" alt="Desktop view: for each mailbox on the domain, the list of its aliases with Copy and Delete buttons, and a field to add a new one"></p>
<h2 id="what%E2%80%99s-next" tabindex="-1"><a class="heading-link" href="#what%E2%80%99s-next">What’s next</a></h2>
<p>In case other Gandi customers would like to use this project, I tried to integrate OAuth2 so that people could log in through Gandi. It also helped me better understand how OAuth2 works.</p>
<p>So I requested the creation of an application, which gave me an <code>applicationId</code> and an <code>applicationSecret</code> to set up authentication. To test this locally, I used an <a href="https://github.com/axa-group/oauth2-mock-server">OAuth2 mock server built by AXA</a></p>
<p>Unfortunately, Gandi’s v5 API is still in beta and its authentication provider doesn’t yet allow access to domains and mailboxes. 😢</p>
<p>Until that becomes available, I’ve left my work on a <a href="https://github.com/sylvainmetayer/alias-gandi-angular/tree/feature/oauth2">dedicated branch</a>.</p>
<p>I also added a one-click Netlify deploy button for anyone who wants to use this small project. You will still need to generate your own <a href="https://web.archive.org/web/20200110154834/https://docs.gandi.net/fr/noms_domaine/utilisateurs_avances/api.html">API key from your Gandi account settings</a> and fill in a few environment variables, described below.</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>GANDI_API_KEY</td>
<td>Gandi API key</td>
</tr>
<tr>
<td>JWT_SECRET</td>
<td>A random string used as the JWT secret</td>
</tr>
<tr>
<td>LOGIN_PASSWORD</td>
<td>The password you want to log in with</td>
</tr>
<tr>
<td>GANDI_API_HOST</td>
<td>The root URL of the Gandi API: <code>api.gandi.net</code></td>
</tr>
<tr>
<td>GANDI_API_VERSION</td>
<td>The Gandi API version: <code>/v5</code></td>
</tr>
</tbody>
</table>
<p>To generate the JWT secret, the following command can come in handy</p>
<p><code>cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1</code></p>
<p>The project’s source code is available on <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">
          Too much spam? Tired of handing out your email address to every service? Email aliases to the rescue!
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Gem: FontAwesome SVG</title>
      <link href="https://www.sylvain.dev/en/article/jekyll-gem-svg-fontawesome/"/>
      <updated>2018-11-30T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/jekyll-gem-svg-fontawesome/</id>
      <content type="html">
        <![CDATA[
      <h2 id="the-need" tabindex="-1"><a class="heading-link" href="#the-need">The need</a></h2>
<p>I wanted to use <a href="http://fontawesome.com/">FontAwesome</a> without bundling the whole library, which is rather heavy.</p>
<p>So I looked for a way to include only the icons I actually use, and that’s how I ended up figuring out how to write a Jekyll plugin.</p>
<p><a href="https://jekyllrb.com/docs/plugins/your-first-plugin/">The documentation</a> is quite thorough, which helped me get up to speed with Jekyll quickly.</p>
<h2 id="implementation" tabindex="-1"><a class="heading-link" href="#implementation">Implementation</a></h2>
<p>Since I only wanted to display icons, I went with 2 <code>Tag</code>s, which let you define a tag and pass parameters to it.</p>
<p>I pass my first tag the type of icon I want (regular, solid or brand) and its name, and it generates the matching HTML<sup class="footnote-ref"><a href="#fn1" id="fnref1"><span class="visually-hidden">note </span>1</a></sup> markup for the icon. All that’s left is to fetch the icon’s SVG<sup class="footnote-ref"><a href="#fn2" id="fnref2"><span class="visually-hidden">note </span>2</a></sup> definition and include it in a namespace at the bottom of the HTML page.</p>
<p>To do this, I add the icons I use to the Jekyll page data, in a simple array.</p>
<p>The second tag is where I collect all the icons used on the page and fetch their SVG definitions.</p>
<p>I first wrote this plugin in the simplest possible way, using Jekyll’s <code>_plugins</code> directory. Once it worked, I wanted to turn it into a Gem published on <a href="https://rubygems.org/">RubyGems</a>, so that it’s available to everyone, should it be useful to anyone :blush:.</p>
<p>Creating a Gem was fairly easy, as the <a href="https://bundler.io/v1.17/guides/creating_gem.html">Bundler</a> guide is very detailed.</p>
<p>I tried to follow Ruby conventions as closely as possible, but since I’m not familiar with the language, I’m open to any feedback to improve the code!</p>
<p>I still need to test it more thoroughly and handle error cases, which are handled rather optimistically for now!</p>
<h2 id="usage" tabindex="-1"><a class="heading-link" href="#usage">Usage</a></h2>
<p>Here is how to use it:</p>
<p>To display an icon, use the following tag. The code below renders the <a href="https://fontawesome.com/icons/twitter?style=brands">Twitter</a> icon.</p>
<pre class="language-erb"><code class="language-erb">{% fa_svg fab.fa-twitter %}</code></pre>
<p>Here is the result:</p>
<p>{% fa_svg fab.fa-twitter %}</p>
<p>Then add the tag that generates the SVG sprite sheet somewhere shared by every page (usually a footer).</p>
<pre class="language-erb"><code class="language-erb">{% fa_svg_generate %}</code></pre>
<h2 id="links" tabindex="-1"><a class="heading-link" href="#links">Links</a></h2>
<p>If you want to look at the code, it’s available in this <a href="https://github.com/sylvainmetayer/jekyll-fontawesome-svg">repository</a>.</p>
<p>To download the Gem, <a href="https://rubygems.org/gems/jekyll-fontawesome-svg">head over here</a>!</p>
<hr class="footnotes-sep">
<section class="footnotes" aria-label="Notes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>HyperText Markup Language <a href="#fnref1" class="footnote-backref" aria-label="Retour au texte (note 1)">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Scalable Vector Graphics <a href="#fnref2" class="footnote-backref" aria-label="Retour au texte (note 2)">↩︎</a></p>
</li>
</ol>
</section>

    ]]>
      </content>
      
        <category term="jekyll"/>
      
        <category term="ruby"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          I wanted to use FontAwesome without bundling the whole library, which is rather heavy.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Latex Starter Kit</title>
      <link href="https://www.sylvain.dev/en/article/latex-starterkit/"/>
      <updated>2018-11-01T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/latex-starterkit/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/sylvainmetayer/LaTeX-starterkit">Source code (GitHub)</a></p>
<p>I built this personal project to have a template ready whenever I write documents with LaTeX.</p>
<p>It also uses <a href="https://travis-ci.org/">Travis CI</a> to automatically build the PDF when a tag is pushed to the GitHub repository, and runs a basic spell check.</p>

    ]]>
      </content>
      
        <category term="latex"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          I built this personal project to have a template ready whenever I write documents with LaTeX.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Configuring a server with Ansible</title>
      <link href="https://www.sylvain.dev/en/article/ansible/"/>
      <updated>2018-09-15T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/ansible/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/EPSIBordeaux/ansible-deployment">Source code (GitHub)</a></p>
<p><a href="https://www.ansible.com/">Visit the Ansible website</a></p>
<p>I built this personal project to get familiar with Ansible and be able to recreate an identical server without any human intervention.</p>
<p>Ansible seemed like an interesting choice because it doesn’t require installing an agent on the target server to deploy to it. Only Python is required, and most Linux servers, if not all of them, ship with Python out of the box. On top of that, playbooks (sets of instructions) are written in <a href="http://yaml.org/">YAML</a>, which is easy to read and write.</p>
<p>I tried to make the various playbooks as modular as possible, so that adding features stays simple.</p>
<p>This project lets you:</p>
<ul>
<li>Deploy a server and secure it with SSH keys, Fail2Ban and iptables.</li>
<li>Deploy some of the applications I built during my studies (to try out several kinds of deployment, whether PHP or NodeJS applications)</li>
<li>Set up monitoring with <a href="https://mmonit.com/monit/">Monit</a></li>
<li>Automatically configure a web server (Nginx) and request HTTPS certificates from <a href="https://letsencrypt.org/">Let’s Encrypt</a>, renewals included.</li>
</ul>
<p>The project isn’t finished yet: for instance, backing up and restoring the data of the installed applications still needs to be handled. <a href="https://github.com/EPSIBordeaux/ansible-deployment/issues">You can contribute to the project here</a>.</p>

    ]]>
      </content>
      
        <category term="devops"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          I built this personal project to get familiar with Ansible and be able to recreate an identical server without any human intervention.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>TBM Interruption Tracker Bot</title>
      <link href="https://www.sylvain.dev/en/article/tbm-interruption/"/>
      <updated>2018-02-14T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/tbm-interruption/</id>
      <content type="html">
        <![CDATA[
      <p><a href="https://github.com/sylvainmetayer/tbm_interruption_tracker">Source code (GitHub)</a> <a href="https://twitter.com/tbm_issues_bot">Twitter account: @tbm_issues_bot</a></p>
<p>I built this bot to keep track of service interruptions on the Bordeaux tramway.</p>
<p>The information comes from the official Twitter accounts of TBM (the Bordeaux public transport network): the bot looks for keywords in their tweets to count the days without interruptions.</p>
<p><img src="/images/tbm_tracker_bot.jpg" alt="The bot's profile picture: tram tracks crossing over cobblestones" title="The bot tweets every day at 6 p.m."></p>

    ]]>
      </content>
      
        <category term="ruby"/>
      
        <category term="twitter"/>
      
        <category term="bot"/>
      
      
        <summary type="html">
          I built this bot to keep track of service interruptions on the Bordeaux tramway.
        </summary>
      
    </entry>
  
    
    <entry>
      <title>Building a personal data discovery tool</title>
      <link href="https://www.sylvain.dev/en/article/cartographie-gdpr/"/>
      <updated>2017-02-01T00:00:00Z</updated>
      <id>https://sylvain.dev/en/article/cartographie-gdpr/</id>
      <content type="html">
        <![CDATA[
      <p>During my work-study placement at Atos, as part of the DAWIN professional bachelor’s degree (Licence Professionnelle DAWIN), I developed the first version of a tool for finding personal data in the context of the <a href="https://web.archive.org/web/20170123025715/http://www.eugdpr.org/">GDPR</a> (General Data Protection Regulation)</p>
<p>The project was built in Python by a team of three.</p>
<p>We worked with agile methods (<a href="https://fr.wikipedia.org/wiki/Scrum_(d%C3%A9veloppement)">SCRUM</a>) to build a tool able to adapt to several <a href="https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle">RDBMSs</a>.</p>

    ]]>
      </content>
      
        <category term="atos"/>
      
        <category term="python"/>
      
        <category term="projet"/>
      
      
        <summary type="html">
          During my work-study placement at Atos, as part of the DAWIN professional bachelor&#39;s degree, I developed the first version of a tool for finding personal data in the context of the GDPR
        </summary>
      
    </entry>
  
</feed>