<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Antoine Boucher</title><link>https://antoineboucher.info/CV/blog/</link><description>Recent content in Home on Antoine Boucher</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 18 Apr 2026 12:00:00 -0400</lastBuildDate><atom:link href="https://antoineboucher.info/CV/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Exploring movie similarities with vector search algorithms</title><link>https://antoineboucher.info/CV/blog/posts/vector-databases-similar-movies/</link><pubDate>Mon, 13 Apr 2026 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/vector-databases-similar-movies/</guid><description>&lt;p&gt;This page is a &lt;strong&gt;single walkthrough&lt;/strong&gt; of a movie-similarity thread: embeddings and nearest neighbors, then a second engine with &lt;strong&gt;two vector meanings&lt;/strong&gt;, then &lt;strong&gt;retrieval + generation&lt;/strong&gt; tied to your own rows. Short animated walkthroughs from that work live in the companion notebooks and Medium series rather than in this static site bundle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At a glance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 1 —&lt;/strong&gt; Build a &lt;strong&gt;PostgreSQL + pgvector&lt;/strong&gt; catalog from structured movie data; run &lt;strong&gt;kNN in SQL&lt;/strong&gt; with cosine (and other) distances.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2 —&lt;/strong&gt; Reuse “vectors = similarity” with &lt;strong&gt;Qdrant + MovieLens&lt;/strong&gt;: &lt;strong&gt;dense&lt;/strong&gt; text embeddings for “movies like this phrasing,” &lt;strong&gt;sparse&lt;/strong&gt; rating vectors for “users like you.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3 —&lt;/strong&gt; Use the same pgvector-backed rows as the &lt;strong&gt;retrieval layer&lt;/strong&gt; for a small &lt;strong&gt;RAG&lt;/strong&gt; flow (&lt;strong&gt;LangChain&lt;/strong&gt; + &lt;strong&gt;Ollama&lt;/strong&gt;): question → top rows → grounded answer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="visualizations"&gt;Visualizations&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Part 1 — pgvector / SQL: exploring similar movies from embeddings and distance metrics.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>From BMC to pitch — QcES journey notes (Spring 2024)</title><link>https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/</link><pubDate>Mon, 13 Apr 2026 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/"&gt;Full article in French&lt;/a&gt;&lt;/strong&gt; — same slug; you can also switch to &lt;strong&gt;FR&lt;/strong&gt; in the header.&lt;/p&gt;
&lt;h2 id="at-a-glance"&gt;At a glance&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Business Model Canvas (BMC)&lt;/strong&gt; describes how an organization &lt;strong&gt;creates, delivers, and captures&lt;/strong&gt; value; it answers three questions: &lt;strong&gt;desirability&lt;/strong&gt;, &lt;strong&gt;feasibility&lt;/strong&gt;, and &lt;strong&gt;viability&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You usually start with &lt;strong&gt;customer segments&lt;/strong&gt; and &lt;strong&gt;value proposition&lt;/strong&gt;, then iterate—the model &lt;strong&gt;evolves&lt;/strong&gt; with the market.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segmentation&lt;/strong&gt; makes the market &lt;strong&gt;concrete&lt;/strong&gt; (B2B vs B2C, crisp criteria) instead of vague labels (“doctors”, “parents”).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interviews&lt;/strong&gt; are for &lt;strong&gt;discovery&lt;/strong&gt;: the goal is to &lt;strong&gt;learn&lt;/strong&gt;, not to sell; &lt;strong&gt;connect&lt;/strong&gt;, don’t convince—and stay attached to the &lt;strong&gt;problem&lt;/strong&gt;, not your first idea of the solution.&lt;/li&gt;
&lt;li&gt;Structured &lt;strong&gt;feedback&lt;/strong&gt; (strengths + one growth angle) and a &lt;strong&gt;short spoken pitch&lt;/strong&gt; (no slides) clarify the idea early.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;product roadmap&lt;/strong&gt; is a &lt;strong&gt;strategic view over time&lt;/strong&gt;, not a detailed project plan; it aligns vision, audience, horizon, metrics, and resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PoC&lt;/strong&gt;, &lt;strong&gt;prototype&lt;/strong&gt;, and &lt;strong&gt;MVP&lt;/strong&gt; play different roles: technology check, user interaction learning, then a &lt;strong&gt;first market version&lt;/strong&gt; you can stress-test with real users or buyers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Market and value proposition&lt;/strong&gt;: account for external forces (macro, industry, trends) and express value as &lt;strong&gt;offer + customer benefit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A solid &lt;strong&gt;pitch&lt;/strong&gt; often follows &lt;strong&gt;Hook → Believe → Join&lt;/strong&gt;: lead with the problem, show credibility and differentiation, then make a &lt;strong&gt;specific ask&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;This is a personal write-up based on QcES materials (Spring 2024 cohort) and facilitators; it is not an official program document.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Python library for MarketWatch virtual trading</title><link>https://antoineboucher.info/CV/blog/posts/marketwatch-python-trading/</link><pubDate>Mon, 13 Apr 2026 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/marketwatch-python-trading/</guid><description>&lt;p&gt;I published &lt;strong&gt;&lt;a href="https://pypi.org/project/marketwatch/"&gt;marketwatch&lt;/a&gt;&lt;/strong&gt; on PyPI: a small Python client for the &lt;a href="https://www.marketwatch.com"&gt;MarketWatch&lt;/a&gt; &lt;strong&gt;virtual stock game&lt;/strong&gt; (paper trading), not live brokerage access. If you want to script watchlists, pull game or portfolio data, or experiment with automation against the game, it wraps the flows in a straightforward API.&lt;/p&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Package:&lt;/strong&gt; &lt;a href="https://pypi.org/project/marketwatch/"&gt;pypi.org/project/marketwatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://antoinebou12.github.io/marketwatch/"&gt;antoinebou12.github.io/marketwatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source &amp;amp; issues:&lt;/strong&gt; &lt;a href="https://github.com/antoinebou12/marketwatch"&gt;github.com/antoinebou12/marketwatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-it-can-do"&gt;What it can do&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create and manage &lt;strong&gt;watchlists&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Read &lt;strong&gt;game&lt;/strong&gt; details and settings&lt;/li&gt;
&lt;li&gt;Inspect &lt;strong&gt;portfolio&lt;/strong&gt;, positions, and pending orders&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buy&lt;/strong&gt; and &lt;strong&gt;sell&lt;/strong&gt; (in-game)&lt;/li&gt;
&lt;li&gt;Fetch the &lt;strong&gt;leaderboard&lt;/strong&gt; for a game&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Useful if you are exploring automated strategies or small bots &lt;strong&gt;inside the game’s rules&lt;/strong&gt;—see the docs for method names and return shapes.&lt;/p&gt;</description></item><item><title>Dimension (mathlib)</title><link>https://antoineboucher.info/CV/blog/projects/dimension/</link><pubDate>Mon, 13 Apr 2026 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/dimension/</guid><description>&lt;h1 id="dimension"&gt;Dimension&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Dimension"&gt;&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/Dimension" alt="GitHub last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Dimension"&gt;Repository&lt;/a&gt; · &lt;a href="https://docs.rs/mathlib"&gt;mathlib on docs.rs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mathlib&lt;/strong&gt; is a Rust crate for dense and sparse linear algebra, decompositions, 3D math, clustering, graph algorithms, transforms, and more—with &lt;strong&gt;WebAssembly&lt;/strong&gt; demos and optional &lt;strong&gt;SIMD&lt;/strong&gt; / &lt;strong&gt;GPU&lt;/strong&gt; features. The Dimension repo wraps that crate alongside kinematics, physics, rendering experiments, and documentation.&lt;/p&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd mathlib &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd mathlib &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See the root &lt;a href="https://github.com/antoinebou12/Dimension#readme"&gt;README&lt;/a&gt; and &lt;a href="https://github.com/antoinebou12/Dimension/blob/main/docs/DOCS.md"&gt;docs/DOCS.md&lt;/a&gt; for architecture and examples.&lt;/p&gt;</description></item><item><title>ESP32-7SEG</title><link>https://antoineboucher.info/CV/blog/projects/esp32-7seg/</link><pubDate>Mon, 13 Apr 2026 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/esp32-7seg/</guid><description>&lt;h1 id="esp32-7seg"&gt;ESP32-7SEG&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/ESP32-7SEG"&gt;&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/ESP32-7SEG" alt="GitHub last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/ESP32-7SEG"&gt;Repository&lt;/a&gt; · &lt;a href="https://github.com/antoinebou12/ESP32-7SEG/blob/main/LICENSE"&gt;MIT License&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Firmware for an &lt;strong&gt;ESP32 FireBeetle&lt;/strong&gt; that drives an &lt;strong&gt;Adafruit 7-segment display&lt;/strong&gt; (I2C backpack) and exposes a &lt;strong&gt;local web interface&lt;/strong&gt; for timer modes and WiFi management.&lt;/p&gt;
&lt;h2 id="web-interface"&gt;Web interface&lt;/h2&gt;
&lt;p&gt;The built-in server serves a &lt;strong&gt;Timer Control&lt;/strong&gt; panel in the browser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stopwatch&lt;/strong&gt; and &lt;strong&gt;Countdown&lt;/strong&gt; modes&lt;/li&gt;
&lt;li&gt;Quick presets: &lt;strong&gt;10 Min&lt;/strong&gt;, &lt;strong&gt;5 Min&lt;/strong&gt;, &lt;strong&gt;1 Min&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Manual &lt;strong&gt;minutes&lt;/strong&gt; and &lt;strong&gt;seconds&lt;/strong&gt; fields plus &lt;strong&gt;Start&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reset WiFi&lt;/strong&gt; to clear stored credentials when you need to re-provision the device&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ESP32 FireBeetle (v1.0)&lt;/li&gt;
&lt;li&gt;Adafruit 7-segment display with I2C backpack&lt;/li&gt;
&lt;li&gt;Breadboard and jumper wires (SCL, SDA, VCC, GND)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software"&gt;Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platformio.org/"&gt;PlatformIO&lt;/a&gt; project; see &lt;a href="https://github.com/antoinebou12/ESP32-7SEG/blob/main/platformio.ini"&gt;&lt;code&gt;platformio.ini&lt;/code&gt;&lt;/a&gt; in the repo for board and library configuration.&lt;/li&gt;
&lt;li&gt;The repository also includes &lt;strong&gt;Android&lt;/strong&gt; and &lt;strong&gt;firmware&lt;/strong&gt; subprojects for a fuller stack around the same device.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/antoinebou12/ESP32-7SEG.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ESP32-7SEG
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open the project in PlatformIO (or Arduino IDE with equivalent libraries), build, and flash the ESP32. After boot, check the &lt;strong&gt;serial monitor&lt;/strong&gt; for the device IP address, then open it in a browser on the same network to use the web UI.&lt;/p&gt;</description></item><item><title>GraphQuon 2025 — University of Toronto</title><link>https://antoineboucher.info/CV/blog/posts/graphquon-2025-university-of-toronto/</link><pubDate>Sat, 15 Nov 2025 10:00:00 -0500</pubDate><guid>https://antoineboucher.info/CV/blog/posts/graphquon-2025-university-of-toronto/</guid><description>&lt;p&gt;&lt;strong&gt;GraphQuon&lt;/strong&gt; is the annual Quebec–Ontario pre-SIGGRAPH workshop. The &lt;strong&gt;2025&lt;/strong&gt; edition took place &lt;strong&gt;15–16 November 2025&lt;/strong&gt; at the &lt;strong&gt;University of Toronto&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Series page: &lt;a href="https://www.dgp.toronto.edu/graphquon/"&gt;Dynamic Graphics Project — GraphQuon&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>A Method to Install Python Packages for Add-ons &amp; Plugins in Blender (Windows, Blender 4.2+)</title><link>https://antoineboucher.info/CV/blog/posts/blender-python-packages/</link><pubDate>Sat, 08 Feb 2025 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/blender-python-packages/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Blender is a powerhouse for 3D creation, offering a Python API that allows users to extend its functionality with scripts, add-ons, and plugins. However, one challenge developers face is &lt;strong&gt;installing external Python packages&lt;/strong&gt; within Blender’s &lt;strong&gt;isolated Python environment&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Unlike system-wide Python installations, Blender bundles its own Python interpreter, making standard package installations tricky. This article presents &lt;strong&gt;a more general and robust method&lt;/strong&gt; to install Python dependencies for Blender add-ons and plugins — ensuring a smooth workflow across different versions.&lt;/p&gt;</description></item><item><title>GraphQuon 2024 — ÉTS (Montréal)</title><link>https://antoineboucher.info/CV/blog/posts/graphquon-2024-ets/</link><pubDate>Sat, 09 Nov 2024 09:00:00 -0500</pubDate><guid>https://antoineboucher.info/CV/blog/posts/graphquon-2024-ets/</guid><description>&lt;p&gt;&lt;strong&gt;GraphQuon&lt;/strong&gt; (formerly MOTOGRAPH) is the annual Quebec–Ontario pre-SIGGRAPH workshop for East-Canadian computer graphics labs. The &lt;strong&gt;2024&lt;/strong&gt; edition ran &lt;strong&gt;9–10 November 2024&lt;/strong&gt; at &lt;strong&gt;École de technologie supérieure (ÉTS)&lt;/strong&gt; in Montréal.&lt;/p&gt;
&lt;p&gt;Official site: &lt;a href="https://graphquon.github.io/"&gt;graphquon.github.io&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Multiple Technical Indicators Backtesting on Multiple Tickers using Python</title><link>https://antoineboucher.info/CV/blog/posts/multiple-indicators-backtesting/</link><pubDate>Thu, 30 May 2024 15:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/multiple-indicators-backtesting/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this report, we present an experiment with technical indicators using the BatchBacktesting project available on GitHub at the following link: &lt;a href="https://github.com/AlgoETS/BatchBacktesting"&gt;BatchBacktesting&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="installing-dependencies"&gt;Installing Dependencies&lt;/h2&gt;
&lt;p&gt;To get started, install the necessary libraries:&lt;/p&gt;
&lt;p&gt;!pip install numpy httpx richp&lt;/p&gt;
&lt;h2 id="importing-modules"&gt;Importing Modules&lt;/h2&gt;
&lt;p&gt;Here are the modules to import for the script:&lt;/p&gt;
&lt;p&gt;import pandas as pd&lt;br&gt;
import numpy as np&lt;br&gt;
from datetime import datetime&lt;br&gt;
import httpx&lt;br&gt;
import concurrent.futures&lt;br&gt;
import glob&lt;br&gt;
import warnings&lt;br&gt;
from rich.progress import track&lt;/p&gt;</description></item><item><title>Economics of LEGO Sets with Data Science</title><link>https://antoineboucher.info/CV/blog/posts/economics-lego-data-science/</link><pubDate>Thu, 30 May 2024 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/economics-lego-data-science/</guid><description>&lt;p&gt;As a data enthusiast and LEGO fan, I decided to delve into the world of LEGO using historical data. My goal was to understand the trends, pricing, and characteristics of LEGO sets over time. Using datasets from Rebrickable and analysis tools like Pandas, Matplotlib, and Scikit-Learn, I conducted a comprehensive analysis. Here’s a journey through the history and economics of LEGO sets.&lt;/p&gt;
&lt;h2 id="dataset-overview"&gt;Dataset Overview&lt;/h2&gt;
&lt;p&gt;The datasets used for this analysis include various aspects of LEGO sets, parts, and themes:&lt;/p&gt;</description></item><item><title>Experimenting with technical indicators using Python and backtesting</title><link>https://antoineboucher.info/CV/blog/posts/experimentation-indicateurs-backtesting/</link><pubDate>Tue, 14 May 2024 20:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/experimentation-indicateurs-backtesting/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this report, we present an experiment with technical indicators using the BatchBacktesting project available on GitHub at the following link: &lt;a href="https://github.com/AlgoETS/BatchBacktesting"&gt;BatchBacktesting&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="installing-dependencies"&gt;Installing Dependencies&lt;/h2&gt;
&lt;p&gt;To get started, install the necessary libraries:&lt;/p&gt;
&lt;p&gt;!pip install numpy httpx richp&lt;/p&gt;
&lt;h2 id="importing-modules"&gt;Importing Modules&lt;/h2&gt;
&lt;p&gt;Here are the modules to import for the script:&lt;/p&gt;
&lt;p&gt;import pandas as pd&lt;br&gt;
import numpy as np&lt;br&gt;
from datetime import datetime&lt;br&gt;
import httpx&lt;br&gt;
import concurrent.futures&lt;br&gt;
import glob&lt;br&gt;
import warnings&lt;br&gt;
from rich.progress import track&lt;/p&gt;</description></item><item><title>Making Caddy, AWS EC2, CloudWatch, Step Functions, and Lambda Work Together</title><link>https://antoineboucher.info/CV/blog/posts/caddy-ec2-cloudwatch-lambda/</link><pubDate>Tue, 14 May 2024 18:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/caddy-ec2-cloudwatch-lambda/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Creating a robust and scalable web infrastructure can be both complex and costly. However, with the right tools and a little bit of creativity, you can build a cost-effective and efficient solution. In this article, we will walk through setting up a Caddy web server on AWS EC2, integrating it with AWS CloudWatch for monitoring, and using AWS Step Functions and Lambda to automate and streamline operations. This guide aims to provide a comprehensive approach to setting up a low-cost dashboard using these technologies.&lt;/p&gt;</description></item><item><title>A Journey to AWS Certified Cloud Practitioner</title><link>https://antoineboucher.info/CV/blog/posts/aws-certified-cloud-practitioner/</link><pubDate>Tue, 14 May 2024 16:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/aws-certified-cloud-practitioner/</guid><description>&lt;p&gt;I’m thrilled to share that I’ve recently obtained the AWS Certified Cloud Practitioner certification from Amazon Web Services (AWS)! This accomplishment represents a significant milestone in my professional journey, and I want to take this opportunity to highlight some of the incredible tools that made this achievement possible.&lt;/p&gt;
&lt;p&gt;AWS Skill Builder and AWS Cloud Quest were instrumental in my preparation, providing an engaging and comprehensive learning experience. In this article, I’ll share my study plan and how these AWS tools can help anyone aiming to enhance their cloud computing skills.&lt;/p&gt;</description></item><item><title>Predicting Stock Prices with Monte Carlo Simulations</title><link>https://antoineboucher.info/CV/blog/posts/predicting-stock-prices-monte-carlo/</link><pubDate>Tue, 14 May 2024 09:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/predicting-stock-prices-monte-carlo/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In finance, decisions are rarely about a single “forecast” price: they are about &lt;strong&gt;ranges&lt;/strong&gt;, &lt;strong&gt;tail risk&lt;/strong&gt;, and &lt;strong&gt;how wrong&lt;/strong&gt; simple models can be. This article walks through a &lt;strong&gt;Monte Carlo path simulation&lt;/strong&gt; in Python: we estimate drift and volatility from historical closes, simulate many future price paths (a geometric Brownian–style discrete step), and summarize the result as a &lt;strong&gt;distribution&lt;/strong&gt;—the right object for risk-style questions (bands, percentiles, coverage against a hold-out period).&lt;/p&gt;</description></item><item><title>Kinectron + p5.js — sketch controls and GIF export</title><link>https://antoineboucher.info/CV/blog/posts/kinectron-p5-sketch-gif/</link><pubDate>Fri, 15 Mar 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/kinectron-p5-sketch-gif/</guid><description>&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;This tutorial will guide you through setting up a Kinectron sketch in p5.js, which includes functionality for stopping and playing the sketch, as well as saving it as a GIF.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Basic knowledge of JavaScript and p5.js.&lt;/li&gt;
&lt;li&gt;Kinectron library installed.&lt;/li&gt;
&lt;li&gt;p5.js library installed.&lt;/li&gt;
&lt;li&gt;Have a Kinect v2 or Azure Kinect DK.&lt;/li&gt;
&lt;li&gt;Have a Kinectron server running.&lt;/li&gt;
&lt;li&gt;Have a local or online environment that supports JavaScript and p5.js.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-1-set-up-your-environment"&gt;Step 1: Set Up Your Environment&lt;/h3&gt;
&lt;p&gt;Ensure you have the p5.js and Kinectron libraries included in your HTML file.&lt;/p&gt;</description></item><item><title>Byzantium’s first workshop — Solidity and an ERC-20 token on Ethereum</title><link>https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/</link><pubDate>Mon, 11 Mar 2024 18:30:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/</guid><description>&lt;p&gt;&lt;strong&gt;Byzantium&lt;/strong&gt; ran its &lt;strong&gt;first Ethereum workshop&lt;/strong&gt;: a hands-on session where attendees went from a &lt;strong&gt;Solidity / ERC-20&lt;/strong&gt; starter (via &lt;strong&gt;OpenZeppelin&lt;/strong&gt;) to &lt;strong&gt;deploying a token&lt;/strong&gt; and &lt;strong&gt;swapping transfers&lt;/strong&gt; with each other. &lt;strong&gt;Khalil Anis Zabat&lt;/strong&gt; led the session.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/"&gt;Full article in French&lt;/a&gt;&lt;/strong&gt; (same slug — you can also switch to &lt;strong&gt;FR&lt;/strong&gt; in the header).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/posts/antoineboucher12_retour-sur-notre-tout-premier-workshop-activity-7173128307155156992-tQy4"&gt;LinkedIn thread / Byzantium recap&lt;/a&gt; · &lt;a href="https://lnkd.in/e-9T5-MX"&gt;Deployed contract (short link)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to the facilitator and everyone who joined.&lt;/p&gt;</description></item><item><title>Create a portfolio with Hugo (week 1)</title><link>https://antoineboucher.info/CV/blog/posts/portfolio-hugo-week-1/</link><pubDate>Sat, 06 Jan 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/portfolio-hugo-week-1/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome to my personal blog, a chronicle of my journey in developing a multifaceted portfolio using Hugo. As a software engineer, I am excited to share the nuances of building a dynamic and interactive website, where my professional skills intersect with personal passions. This inaugural post marks the beginning of a series in which I&amp;rsquo;ll delve into various aspects of web development, data analysis, and the integration of advanced web technologies.&lt;/p&gt;</description></item><item><title>Egg-Stuffed Bella Mushrooms with Goat Cheese and Spinach</title><link>https://antoineboucher.info/CV/blog/recipes/champignon/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/recipes/champignon/</guid><description>&lt;h1 id="egg-stuffed-bella-mushrooms-with-goat-cheese-and-spinach"&gt;Egg-Stuffed Bella Mushrooms with Goat Cheese and Spinach&lt;/h1&gt;
&lt;h2 id="category"&gt;Category&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Vegetarian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main Ingredient:&lt;/strong&gt; Mushrooms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preparation Time:&lt;/strong&gt; 1 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooking Time:&lt;/strong&gt; 5 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total Time:&lt;/strong&gt; 6 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servings:&lt;/strong&gt; 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;3 Large bella mushrooms (price: 1.99$)&lt;/li&gt;
&lt;li&gt;2 Eggs (price: 0.50$)&lt;/li&gt;
&lt;li&gt;100g Goat cheese (price: 1.99$)&lt;/li&gt;
&lt;li&gt;1 Handful of spinach (price: 0.50$)&lt;/li&gt;
&lt;li&gt;Salt (price: 0.01$)&lt;/li&gt;
&lt;li&gt;Avocado oil (price: 0.01$)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="prices"&gt;Prices&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Total price: 5.00$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="instructions"&gt;Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Preheat your pan with avocado oil.&lt;/li&gt;
&lt;li&gt;Remove the stems from the mushrooms, place them cap-side down in the pan.&lt;/li&gt;
&lt;li&gt;Crack an egg into each mushroom cap.&lt;/li&gt;
&lt;li&gt;Season with salt, add spinach around the mushrooms.&lt;/li&gt;
&lt;li&gt;Cover and cook until eggs are set.&lt;/li&gt;
&lt;li&gt;Crumble goat cheese over the mushrooms and eggs.&lt;/li&gt;
&lt;li&gt;Serve hot with sliced avocado.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="review"&gt;Review&lt;/h2&gt;
&lt;p&gt;⭐⭐⭐⭐ - &amp;ldquo;Juicy and easy to make. This vegetarian dish is a delightful blend of textures and flavors. Perfect for a healthy, satisfying meal!&amp;rdquo;&lt;/p&gt;</description></item><item><title>Spinach, goat cheese, honey and walnut tart</title><link>https://antoineboucher.info/CV/blog/recipes/spinach-goat-cheese-walnut-tart/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/recipes/spinach-goat-cheese-walnut-tart/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/recipes/spinach-goat-cheese-walnut-tart/featured.jpg" alt="Spinach and goat cheese savory tart"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a href="https://unsplash.com/photos/1546833999-b9f581a1996d"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="category"&gt;Category&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Vegetarian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main ingredient:&lt;/strong&gt; Spinach &amp;amp; goat cheese&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preparation time:&lt;/strong&gt; ~25 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooking time:&lt;/strong&gt; ~35 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total time:&lt;/strong&gt; ~60 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servings:&lt;/strong&gt; 6–8&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pastry&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 round shortcrust or all-butter puff pastry (~230 g), thawed if frozen&lt;br&gt;
(or enough homemade dough for a 23–25 cm tart tin)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Filling&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;400 g fresh spinach (or 250 g frozen, thawed and squeezed dry)&lt;/li&gt;
&lt;li&gt;1 tbsp olive oil or butter&lt;/li&gt;
&lt;li&gt;2 eggs&lt;/li&gt;
&lt;li&gt;100 ml heavy cream (or crème fraîche)&lt;/li&gt;
&lt;li&gt;150 g soft goat cheese (chèvre), crumbled&lt;/li&gt;
&lt;li&gt;50 g walnuts, lightly toasted and chopped&lt;/li&gt;
&lt;li&gt;1 small garlic clove, finely grated (optional)&lt;/li&gt;
&lt;li&gt;Salt, black pepper, pinch of nutmeg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Finish&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>LiDAR apartment scan with Rhino on iPhone</title><link>https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/</link><pubDate>Tue, 02 Jan 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;We used the Rhino app on an iPhone with LiDAR to scan our apartment and make clearer decisions about layout and furniture.&lt;/p&gt;
&lt;h3 id="lidar-and-rhino"&gt;LiDAR and Rhino&lt;/h3&gt;
&lt;p&gt;LiDAR captures depth quickly; Rhino on iPhone turns those scans into workable 3D geometry for review on device.&lt;/p&gt;
&lt;h3 id="process"&gt;Process&lt;/h3&gt;
&lt;p&gt;We walked room by room while the phone mapped space; Rhino updated the model as we moved.&lt;/p&gt;
&lt;h3 id="screenshots"&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/images/Screenshot-from-2024-01-02-22-41-35.png" alt="Scan workflow"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/images/Screenshot-from-2024-01-02-22-42-01.png" alt="Model review"&gt;&lt;/p&gt;
&lt;h3 id="still-frames-from-the-scan"&gt;Still frames from the scan&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/images/1781a950-9e10-4bcd-b142-1711d9e73881.jpg" alt="Room capture"&gt;&lt;/p&gt;</description></item><item><title>HDR-10bpp-Display-Test</title><link>https://antoineboucher.info/CV/blog/projects/hdr-10bpp-display-test/</link><pubDate>Mon, 01 Jan 2024 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/hdr-10bpp-display-test/</guid><description>&lt;h2 id="hdr-10bpp-display-test"&gt;HDR-10bpp-Display-Test&lt;/h2&gt;
&lt;p&gt;The HDR-10bpp-Display-Test is a simple yet effective way to verify the HDR 4K display capabilities on Linux systems, specifically testing the color depth of 10 bits per channel. This test is essential for anyone looking to ensure the highest quality display performance on their Linux environment.&lt;/p&gt;
&lt;h3 id="getting-started"&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/hdr-10bpp-display-test"&gt;HDR-10bpp-Display-Test&lt;/a&gt;: A test project for HDR 4K display on Linux.&lt;/p&gt;
&lt;h4 id="prerequisites"&gt;Prerequisites&lt;/h4&gt;
&lt;p&gt;Before running the test, ensure your system has the following software installed:&lt;/p&gt;</description></item><item><title>Media box (Docker Compose)</title><link>https://antoineboucher.info/CV/blog/projects/mediaboxdockercompose/</link><pubDate>Mon, 01 Jan 2024 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/mediaboxdockercompose/</guid><description>&lt;p&gt;&lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose"&gt;&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/MediaBoxDockerCompose" alt="GitHub last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose"&gt;Repository&lt;/a&gt; · &lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose/blob/master/LICENSE"&gt;MIT License&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Compose-first homelab media stack: fetch content (torrents and Usenet), route it through *Arr apps, add subtitles where needed, then serve libraries with &lt;strong&gt;Plex&lt;/strong&gt; or &lt;strong&gt;Jellyfin&lt;/strong&gt;, with optional request and monitoring UIs. Configuration is meant to live under a shared &lt;code&gt;ROOT&lt;/code&gt; tree on disk as in the repo’s &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="whats-in-the-stack"&gt;What’s in the stack&lt;/h2&gt;
&lt;p&gt;Grouped roughly by role (see the &lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose/blob/master/docker-compose.yml"&gt;compose file&lt;/a&gt; for images and volumes):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Download clients &amp;amp; indexers&lt;/strong&gt; — Deluge, NZBGet, Jackett, NZBHydra2, Prowlarr&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt; — Sonarr, Radarr, Lidarr, Bazarr, CouchPotato; Readarr (books); Whisparr; Tdarr (transcoding)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Libraries &amp;amp; requests&lt;/strong&gt; — Plex, Jellyfin, Ombi, Jellyseerr, Tautulli&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extras&lt;/strong&gt; — Stash (specialized library organizer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ops&lt;/strong&gt; — Netdata, Dashmachine, Filebrowser&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://docs.docker.com/get-docker/"&gt;Docker&lt;/a&gt; and Compose on the host.&lt;/li&gt;
&lt;li&gt;Clone the repo and configure environment variables (see the repo &lt;code&gt;.env&lt;/code&gt; and paths like &lt;code&gt;ROOT&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;From the project directory:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/antoinebou12/MediaBoxDockerCompose.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd MediaBoxDockerCompose
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If your setup still uses the older CLI, &lt;code&gt;docker-compose up -d&lt;/code&gt; matches what the &lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose#readme"&gt;README&lt;/a&gt; describes.&lt;/p&gt;</description></item><item><title>RetroArch Web Games</title><link>https://antoineboucher.info/CV/blog/projects/retroarch-web-games/</link><pubDate>Mon, 01 Jan 2024 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/retroarch-web-games/</guid><description>&lt;h2 id="retroarch-web-games"&gt;RetroArch Web Games&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/retroarch-web-games"&gt;retroarch-web-games&lt;/a&gt;: Docker Retroarch Web with pre-downloaded games.&lt;/p&gt;
&lt;p&gt;This repository offers a self-hosted RetroArch web player, allowing you to enjoy classic NES, SNES, Genesis, and Gameboy games right in your browser. Set up is a breeze with our Docker container.&lt;/p&gt;
&lt;h3 id="features"&gt;Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pre-loaded Games&lt;/strong&gt;: Enjoy a variety of games for NES, SNES, Genesis, and Gameboy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted Web Player&lt;/strong&gt;: Easily host the RetroArch player on your own server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy Deployment&lt;/strong&gt;: Utilize Docker for straightforward setup and deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-project"&gt;Related project&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://antoinebou12.github.io/FlashGames/"&gt;FlashGames&lt;/a&gt; — A small collection of legacy Flash games preserved for modern browsers with Ruffle.&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/antoinebou12/FlashGames"&gt;antoinebou12/FlashGames&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how-to-use"&gt;How to Use&lt;/h3&gt;
&lt;p&gt;To get started, run the Docker image with the following command:&lt;/p&gt;</description></item><item><title>My journey in software engineering</title><link>https://antoineboucher.info/CV/blog/posts/software-engineering-journey/</link><pubDate>Sat, 30 Dec 2023 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/software-engineering-journey/</guid><description>&lt;p&gt;This site’s bio sums up the slice of the field I care about most: &lt;strong&gt;backend&lt;/strong&gt;, &lt;strong&gt;platform&lt;/strong&gt;, and &lt;strong&gt;DevSecOps&lt;/strong&gt;. This post is a longer look at how I think about that journey — not a timeline of jobs, but the ideas that kept showing up once I stopped treating “shipping features” as the only scoreboard.&lt;/p&gt;
&lt;h2 id="from-features-to-systems"&gt;From features to systems&lt;/h2&gt;
&lt;p&gt;Early on, progress often feels linear: tickets closed, endpoints added, screens shipped. That work matters. Over time, though, the interesting problems sit one level up: how services talk to each other, how failures propagate, how a change in one team’s repo affects everyone else on Monday morning. Backend engineering stops being “write the handler” and becomes “design something that stays understandable when you’re not in the room.”&lt;/p&gt;</description></item><item><title>Portfolio</title><link>https://antoineboucher.info/CV/blog/projects/porfolio/</link><pubDate>Sat, 30 Dec 2023 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/porfolio/</guid><description>&lt;h2 id="portfolio-project"&gt;Portfolio Project&lt;/h2&gt;
&lt;p&gt;This project is about creating a personal portfolio website using Hugo. You can view the project &lt;a href="https://github.com/antoinebou12/portfolio"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Creating a professional résumé with JSON Resume</title><link>https://antoineboucher.info/CV/blog/posts/professional-resume-json-resume/</link><pubDate>Sat, 10 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/professional-resume-json-resume/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In today&amp;rsquo;s digital world, having an online resume is crucial for showcasing your professional profile. One effective way to create an online resume is by using the JSON Resume npm package. This package allows you to write your resume in JSON and then export it to various formats such as HTML, PDF, or even integrate it into your personal website.&lt;/p&gt;
&lt;h2 id="json-resume-format"&gt;JSON Resume Format&lt;/h2&gt;
&lt;p&gt;JSON Resume is a community-driven open-source initiative to create a JSON-based standard for resumes. The format is lightweight and easy to use, making it perfect for building tools around it.&lt;/p&gt;</description></item><item><title>D2C OpenAI plugin — diagrams with PlantUML, Mermaid, and D2</title><link>https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/</guid><description>&lt;p&gt;Github: &lt;a href="https://lnkd.in/en3dSVuQ"&gt;https://lnkd.in/en3dSVuQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Plugin URL: &lt;a href="https://lnkd.in/exVNZMnT"&gt;https://lnkd.in/exVNZMnT&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;D2COpenAIPlugin is a plugin for ChatGPT that enables users to generate diagrams using PlantUML, Mermaid, D2. This plugin enhances the capabilities of ChatGPT by providing a seamless way to create diverse and creative diagrams.&lt;/p&gt;
&lt;p&gt;For a &lt;strong&gt;prompt-in-the-chat&lt;/strong&gt; workflow (AIPRM template, cache hit/miss sequence examples, and canvas-tool tips), see &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/"&gt;Diagram prompts with ChatGPT and AIPRM&lt;/a&gt;&lt;/strong&gt; — complementary to this plugin-based approach.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/images/1692387139389.jpeg" alt="1692387139389.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;🤖 ChatGPT UML Plugins - DEMO&lt;/p&gt;</description></item><item><title>Diagram prompts with ChatGPT and AIPRM (PlantUML, Mermaid, and more)</title><link>https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/</guid><description>&lt;p&gt;The &lt;a href="https://www.aiprm.com/"&gt;AIPRM&lt;/a&gt; browser extension gives you reusable prompt templates inside ChatGPT. Combined with a small &lt;strong&gt;structured prompt&lt;/strong&gt; (diagram type, what to draw, why, and which tool), you get consistent output whether you want text-first formats like &lt;strong&gt;PlantUML&lt;/strong&gt; or &lt;strong&gt;Mermaid&lt;/strong&gt;, or a recipe for redrawing the same flow in a canvas tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/"&gt;Full article in French&lt;/a&gt;&lt;/strong&gt; (same slug — you can also switch to &lt;strong&gt;FR&lt;/strong&gt; in the site header).&lt;/p&gt;
&lt;h2 id="aiprm-prompt-template-copy-and-adapt"&gt;AIPRM prompt template (copy and adapt)&lt;/h2&gt;
&lt;p&gt;Fill one line per dimension. You can paste the block below into ChatGPT (with or without AIPRM) and edit the bracketed values.&lt;/p&gt;</description></item><item><title>Expo Manger Santé 2023 — olives, kiosks, and discoveries</title><link>https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/</guid><description>&lt;p&gt;I recently took part in &lt;strong&gt;Expo Manger Santé 2023&lt;/strong&gt; at &lt;strong&gt;Place des Congrès&lt;/strong&gt; in Montreal. Event photos were taken by &lt;strong&gt;OS7Media&lt;/strong&gt; (&lt;a href="mailto:os7mediamatrix@gmail.com"&gt;os7mediamatrix@gmail.com&lt;/a&gt;) — thank you for the shots used here.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/images/antoine1.jpeg" alt="Antoine1"&gt;
&lt;img src="https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/images/antoine2.jpeg" alt="Antoine2"&gt;&lt;/p&gt;
&lt;h2 id="a-successful-sales-endeavor"&gt;A Successful Sales Endeavor&lt;/h2&gt;
&lt;p&gt;As a salesman, I am passionate about the rich, savory taste of olives and their health benefits. Over two days, I had the opportunity to share this passion with attendees, which translated into remarkable sales, netting $300. It was not just about the sales, though; it was about the connections made and the stories shared over the love of olives.&lt;/p&gt;</description></item><item><title>GitHub Copilot session at Cédille (with GitHub &amp; Arctiq)</title><link>https://antoineboucher.info/CV/blog/posts/github-copilot-cedille-session/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/github-copilot-cedille-session/</guid><description>&lt;p&gt;At &lt;strong&gt;Cédille&lt;/strong&gt;, we hosted a session with &lt;strong&gt;GitHub&lt;/strong&gt; and &lt;strong&gt;Arctiq&lt;/strong&gt; focused on &lt;strong&gt;GitHub Copilot&lt;/strong&gt; and AI-assisted development. Highlights included &lt;strong&gt;Copilot Chat&lt;/strong&gt; with &lt;code&gt;/createNotebook&lt;/code&gt; for quick Jupyter notebooks from existing code, and pointers to &lt;strong&gt;&lt;a href="https://githubnext.com"&gt;GitHub Next&lt;/a&gt;&lt;/strong&gt; experiments.&lt;/p&gt;
&lt;p&gt;Thanks to speakers &lt;strong&gt;Thierry Madkaud&lt;/strong&gt; and &lt;strong&gt;Eldrick Wega&lt;/strong&gt;, and to everyone who joined.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/github-copilot-cedille-session/"&gt;Full article in French&lt;/a&gt;&lt;/strong&gt; (same slug — you can also switch to &lt;strong&gt;FR&lt;/strong&gt; in the header).&lt;/p&gt;</description></item><item><title>Live chat and support platforms compared (3CX, ManyChat, Kommunicate, Chatwoot)</title><link>https://antoineboucher.info/CV/blog/posts/livechat-platform-notes/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/livechat-platform-notes/</guid><description>&lt;p&gt;These notes come from comparing options for &lt;strong&gt;website live chat&lt;/strong&gt;, &lt;strong&gt;chatbots&lt;/strong&gt;, and a &lt;strong&gt;shared support inbox&lt;/strong&gt;. The products below are not interchangeable: some are full communications stacks, others are marketing automation, and one is an open-source helpdesk. &lt;strong&gt;Pricing, channels, and features change often&lt;/strong&gt;—treat this as orientation, then confirm on each vendor’s site.&lt;/p&gt;
&lt;h2 id="3cx"&gt;3CX&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.3cx.com"&gt;3CX&lt;/a&gt; is primarily &lt;strong&gt;UCaaS / PBX&lt;/strong&gt; (phones, meetings, extensions). Its &lt;strong&gt;web live chat&lt;/strong&gt; and related widgets sit in that same ecosystem, which helps if you already route voice and chat through 3CX and want one vendor for queues and agents.&lt;/p&gt;</description></item><item><title>Run:ai on AWS — webinar notes (inference &amp; autoscaling)</title><link>https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/</guid><description>&lt;p&gt;Notes from the &lt;strong&gt;Run:ai&lt;/strong&gt; webinar on running and scaling &lt;strong&gt;inference&lt;/strong&gt; workloads on &lt;strong&gt;AWS&lt;/strong&gt; (Americas). Run:ai focuses on scheduling, visibility, and efficiency for GPU-backed models in shared environments.&lt;/p&gt;
&lt;h2 id="dashboard"&gt;Dashboard&lt;/h2&gt;
&lt;p&gt;Overview of jobs and resource usage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/dashboard.jpeg" alt="Dashboard"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/dashboard1.jpeg" alt="Dashboard (alternate view)"&gt;&lt;/p&gt;
&lt;h2 id="cli"&gt;CLI&lt;/h2&gt;
&lt;p&gt;Command-line operations and automation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/cli.jpeg" alt="CLI"&gt;&lt;/p&gt;
&lt;h2 id="models-and-load"&gt;Models and load&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/model.jpeg" alt="Model view"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/multi.jpeg" alt="Multi-instance / scaling"&gt;&lt;/p&gt;
&lt;h2 id="workload-management"&gt;Workload management&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/managing.jpeg" alt="Managing workloads"&gt;&lt;/p&gt;
&lt;h2 id="infrastructure-view"&gt;Infrastructure view&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/servers.jpeg" alt="Servers"&gt;&lt;/p&gt;
&lt;h2 id="demo"&gt;Demo&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/demo.jpeg" alt="Demo"&gt;&lt;/p&gt;
&lt;h2 id="challenges"&gt;Challenges&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/images/challenges.jpeg" alt="Challenges slide"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For product details, see the official &lt;strong&gt;Run:ai&lt;/strong&gt; documentation and &lt;strong&gt;AWS&lt;/strong&gt; marketplace or partner listings.&lt;/p&gt;</description></item><item><title>Snapchat Lens Creator</title><link>https://antoineboucher.info/CV/blog/posts/snapchat-lens-creator/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/snapchat-lens-creator/</guid><description>&lt;p&gt;&lt;em&gt;Updated April 2026 with current Lens Insights figures.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To date, my Snapchat lenses have accumulated &lt;strong&gt;6.21M plays&lt;/strong&gt;, &lt;strong&gt;12.11M views&lt;/strong&gt;, &lt;strong&gt;616.4k shares&lt;/strong&gt;, and &lt;strong&gt;6,893 favorites&lt;/strong&gt; (all-time, Lens Insights). That started as a personal interest in AR filters and grew into paid work on &lt;strong&gt;Fiverr&lt;/strong&gt; alongside my own experiments.&lt;/p&gt;
&lt;p&gt;Between &lt;strong&gt;2017 and 2020&lt;/strong&gt; I shipped &lt;strong&gt;42 lenses&lt;/strong&gt; for myself and clients. A few that carried the most usage include &lt;strong&gt;Go Crazy Facetime&lt;/strong&gt; (~2.9M plays), &lt;strong&gt;Face Ghosting&lt;/strong&gt; (~1.2M plays), and &lt;strong&gt;BIG SMILE&lt;/strong&gt; (~520k plays).&lt;/p&gt;</description></item><item><title>Snowflake Data-for-Breakfast Conference Insights</title><link>https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/</guid><description>&lt;p&gt;Notes from the Snowflake Data-for-Breakfast conference on the Snowflake Cloud Data Platform, data warehousing, integration, and analytics—including a strong keynote from Infostrux.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/images/governed.jpeg" alt="Conference materials"&gt;&lt;/p&gt;
&lt;h2 id="key-takeaways"&gt;Key takeaways&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/images/menu.jpeg" alt="Event menu"&gt;&lt;/p&gt;
&lt;h3 id="global-data-operations"&gt;Global data operations&lt;/h3&gt;
&lt;p&gt;A healthcare customer case study showed Snowflake managing secure data operations across three continents, simplifying partner data sharing while keeping high availability and strong SLAs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/images/sharethrough.jpeg" alt="Data sharing"&gt;&lt;/p&gt;
&lt;p&gt;Cloud data platforms remain a practical backbone for consolidation and analytics; this event was a useful snapshot of where Snowflake is heading.&lt;/p&gt;</description></item><item><title>Renpho scale, Home Assistant, and reverse-engineering the API</title><link>https://antoineboucher.info/CV/blog/posts/renpho-health-api-blueprint/</link><pubDate>Sun, 10 Oct 2021 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/renpho-health-api-blueprint/</guid><description>&lt;h2 id="inspiration-from-bryan-johnsons-blueprint-protocol"&gt;Inspiration from Bryan Johnson’s &amp;ldquo;Blueprint Protocol&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Personal health tracking, for me, started with Bryan Johnson’s &amp;ldquo;Blueprint Protocol&amp;rdquo;—a push for self-quantification that matched how I already thought about fitness. I wanted the same granularity for my own body, and a Renpho scale with bio-impedance turned out to be a practical way to get a steady stream of numbers beyond simple weight.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/renpho-health-api-blueprint/images/blueprint.jpg" alt="Blueprint Protocol Inspiration"&gt;&lt;/p&gt;
&lt;h2 id="forking-hass-renpho-and-the-home-assistant-ecosystem"&gt;Forking hass-renpho and the Home Assistant ecosystem&lt;/h2&gt;
&lt;p&gt;I found &lt;code&gt;hass-renpho&lt;/code&gt;, a custom integration that pulls Renpho scale data into Home Assistant. The project had gone quiet, and with the original maintainer unavailable I forked it to extend support for more of the metrics the hardware exposes.&lt;/p&gt;</description></item><item><title>D2COpenAIPlugin</title><link>https://antoineboucher.info/CV/blog/projects/d2copenaiplugin/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/d2copenaiplugin/</guid><description>&lt;h1 id="d2copenaiplugin"&gt;D2COpenAIPlugin&lt;/h1&gt;
&lt;p&gt;You can view the project &lt;a href="https://github.com/antoinebou12/D2COpenAIPlugin/tree/main"&gt;here&lt;/a&gt;
You can use the plugin &lt;a href="https://openai-uml-plugin.vercel.app"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Join the &lt;a href="https://openai.com/waitlist/plugins"&gt;ChatGPT plugins waitlist here&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;D2COpenAIPlugin is a plugin for ChatGPT that enables users to generate diagrams using PlantUML or Mermaid. This plugin enhances the capabilities of ChatGPT by providing a seamless way to create diverse and creative diagrams.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/antoinebou12/UMLOpenAIPlugin/main/docs/DiagramGeneratorPlugin.gif" alt="https://github.com/antoinebou12/UMLOpenAIPlugin/docs/DiagramGeneratorPlugin.gif"&gt;
&lt;img src="https://github.com/antoinebou12/D2COpenAIPlugin/assets/13888068/638e6ef6-b006-4f63-a7b8-b765fc0d8a41" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Generate diagrams using PlantUML or Mermaid&lt;/li&gt;
&lt;li&gt;Seamless integration with ChatGPT&lt;/li&gt;
&lt;li&gt;User-friendly interface for creating diagrams&lt;/li&gt;
&lt;li&gt;Enhances the versatility of ChatGPT&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Before using the plugin, make sure to have the following prerequisites installed:&lt;/p&gt;</description></item><item><title>DasherControl</title><link>https://antoineboucher.info/CV/blog/projects/dashcontrol/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/dashcontrol/</guid><description>&lt;h1 id="dashercontrol"&gt;DasherControl&lt;/h1&gt;
&lt;p&gt;Another Interactive Configurable Dashboard with Customisable GridItem with IFrame and Bookmark and other cool features with basic Container Controller for Docker made with Vuejs and Rust (rocket).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"&gt;
&lt;img src="https://img.shields.io/github/workflow/status/antoinebou13/DasherControl/build" alt="GitHub Workflow Status"&gt;
&lt;img src="https://img.shields.io/github/v/release/antoinebou13/DasherControl" alt="GitHub release (latest by date)"&gt;&lt;/p&gt;
&lt;h2 id="why-"&gt;Why &amp;hellip;&lt;/h2&gt;
&lt;p&gt;Everything is a web app that can be installed with a docker in a container. I want to manage all my web applications on one dashboard like Sonarr and Jellyfin without opening like 10 tabs in chrome (rip my ram). When using services like Portainer or the Docker CLI, it&amp;rsquo;s long to set up a reverse proxy with SSL to secure your homelab. So I want to write widgets (Applets) that can do all my tasks that I do on the daily when managing my homelab. Also, I want to make a simple dashboard with widgets (vuejs component) like Windows Vista, but on the web and saved in a database.&lt;/p&gt;</description></item><item><title>File Classifier</title><link>https://antoineboucher.info/CV/blog/projects/fileclassifier/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/fileclassifier/</guid><description>&lt;h1 id="fileclassifier"&gt;FileClassifier&lt;/h1&gt;
&lt;p&gt;FileClassifier is a Python-based command-line tool that automatically organizes files in a specified directory into predefined categories based on their file types. The tool supports multiple file formats, such as images, documents, videos, and more. It also comes with an extendable classifier that allows you to add topic modeling for better organization.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automatic file organization based on file types.&lt;/li&gt;
&lt;li&gt;Predefined categories for common file formats.&lt;/li&gt;
&lt;li&gt;Extendable classifier with topic modeling support.&lt;/li&gt;
&lt;li&gt;Customizable output directory structure.&lt;/li&gt;
&lt;li&gt;Lightweight and easy to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install FileClassifier, simply clone the repository and install the required dependencies:&lt;/p&gt;</description></item><item><title>Movie Trailer Analyzer</title><link>https://antoineboucher.info/CV/blog/projects/movietraileranalyzer/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/movietraileranalyzer/</guid><description>&lt;p&gt;You can view the project &lt;a href="https://github.com/antoinebou12/MovieTrailerAnalyzer/tree/main"&gt;here&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PlantUMLApi</title><link>https://antoineboucher.info/CV/blog/projects/plantumlapi/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/plantumlapi/</guid><description>&lt;h1 id="plantumlapi"&gt;PlantUMLApi&lt;/h1&gt;
&lt;p&gt;Python interface with the PlantUML web. PlantUML is a library for generating UML diagrams from a simple text markup language.&lt;/p&gt;
&lt;p&gt;PyPlantUML is a simple remote client interface to a PlantUML server using the same custom encoding used by most other PlantUML clients.&lt;/p&gt;
&lt;p&gt;This client defaults to the public PlantUML server but can be used against any server.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install, run the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install plantumlapi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install git+https://github.com/antoinebou12/plantumlapi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="command-line-usage"&gt;Command Line Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;usage: plantuml.py &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-h&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-o OUT&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-s SERVER&lt;span style="color:#f92672"&gt;]&lt;/span&gt; filename &lt;span style="color:#f92672"&gt;[&lt;/span&gt;filename ...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Generate images from PlantUML defined files using PlantUML server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;positional arguments: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filename file&lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; to generate images from
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;optional arguments: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help show this help message and exit 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -o OUT, --out OUT directory to put the files into 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s SERVER, --server SERVER 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; server to generate from; defaults to plantuml.com 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; plantumlapi.plantumlapi &lt;span style="color:#f92672"&gt;import&lt;/span&gt; PlantUML
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create a PlantUML object, set the output directory and server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; PlantUML(url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://www.plantuml.com/plantuml/duml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Generate a diagram from a string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;process(&lt;span style="color:#e6db74"&gt;&amp;#34;@startuml&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;class Foo&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;@enduml&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker"&gt;Docker&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;from pyplantuml import PlantUML

# Create a PlantUML object, set the output directory and server
p = PlantUML(url=&amp;#34;http://localhost:8080/png&amp;#34;)

# Generate a diagram from a string
p.process(&amp;#34;@startuml\nclass Foo\n@enduml&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>RawAnalyser</title><link>https://antoineboucher.info/CV/blog/projects/rawanalyser/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/rawanalyser/</guid><description>&lt;p&gt;&lt;a href="https://github.com/antoinebou12/RawAnalyser"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="rawanalyser"&gt;RawAnalyser&lt;/h1&gt;
&lt;p&gt;RawAnalyser is a simple Python-based tool designed for analyzing raw images. It provides functionality for black and white clipping detection, gamma calculation, and flatness with vignette detection (Algolux).&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;You need to have Python 2.7 installed and the following libraries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;json&lt;/li&gt;
&lt;li&gt;time&lt;/li&gt;
&lt;li&gt;numpy&lt;/li&gt;
&lt;li&gt;scipy&lt;/li&gt;
&lt;li&gt;pyqt5&lt;/li&gt;
&lt;li&gt;argparse&lt;/li&gt;
&lt;li&gt;argcomplete&lt;/li&gt;
&lt;li&gt;watchdog&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;colorama&lt;/li&gt;
&lt;li&gt;plotly&lt;/li&gt;
&lt;li&gt;matplotlib&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Run the RawAnalyser script:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python RawAnalyser.py &amp;lt;pathfolder&amp;gt; &amp;lt;pointfile&amp;gt; --func &amp;lt;clipping,gamma,vignette,histogram,noHist,basic, default all&amp;gt; --bl &amp;lt;black level, default 1024&amp;gt; --vignette &amp;lt;pathvignette&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Start the GUI:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python GUI.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Check the value of the pixel and the color with the bayer pattern:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python RawPixel.pt input&amp;lt;file&amp;gt; x y --bitdepth &amp;lt;8,10,16,default 16&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="scripts-description"&gt;Scripts Description&lt;/h2&gt;
&lt;h3 id="rawanalyserpy"&gt;RawAnalyser.py&lt;/h3&gt;
&lt;p&gt;A script designed for checking black and white level of clipping in a raw image. You need to provide a path to the folder to be checked and a json file with the region of interest and the gray patches.&lt;/p&gt;</description></item><item><title>Serilog.Sinks.SentrySDK</title><link>https://antoineboucher.info/CV/blog/projects/serilog.sinks.sentrysdk/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/serilog.sinks.sentrysdk/</guid><description>&lt;h1 id="serilogsinkssentrysdk"&gt;Serilog.Sinks.SentrySDK&lt;/h1&gt;
&lt;p&gt;A Serilog sink for Sentry that simplifies error and log management in your applications.&lt;/p&gt;
&lt;p&gt;Based on &lt;a href="https://github.com/serilog-contrib/serilog-sinks-sentry"&gt;serilog-contrib/serilog-sinks-sentry&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="project-status"&gt;Project Status&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/tests.yml"&gt;&lt;img src="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/tests.yml/badge.svg" alt=".NET Core Test"&gt;&lt;/a&gt;
&lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/CI.yml"&gt;&lt;img src="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/CI.yml/badge.svg" alt=".NET Core CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/codeql.yml"&gt;&lt;img src="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/codeql.yml/badge.svg" alt="CodeQL"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/antoinebou12/Serilog.Sinks.SentrySDK"&gt;&lt;img src="https://codecov.io/gh/antoinebou12/Serilog.Sinks.SentrySDK/branch/main/graph/badge.svg?token=DKLJUGCpI4" alt="codecov"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="available-packages"&gt;Available Packages&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Package&lt;/th&gt;
 &lt;th&gt;Nuget&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Serilog.Sinks.SentrySDK&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK/"&gt;Package Link&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK/"&gt;&lt;img src="https://img.shields.io/nuget/v/Serilog.Sinks.SentrySDK.svg" alt="NuGet"&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Serilog.Sinks.SentrySDK.AspNetCore&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK.AspNetCore/"&gt;Package Link&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK.AspNetCore/"&gt;&lt;img src="https://img.shields.io/nuget/v/Serilog.Sinks.SentrySDK.AspNetCore.svg" alt="NuGet"&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;The library is available as a &lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK/"&gt;Nuget package&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can install it with the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dotnet add package Serilog.Sinks.SentrySDK
Install-Package Serilog.Sinks.SentrySDK
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="demos"&gt;Demos&lt;/h2&gt;
&lt;p&gt;Usage examples and demo-style snippets are maintained in the &lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK"&gt;GitHub repository README&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>WordUnveil</title><link>https://antoineboucher.info/CV/blog/projects/wordunveil/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/wordunveil/</guid><description>&lt;h1 id="wordsunveil"&gt;WordsUnveil&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://img.shields.io/badge/license-MIT-green" alt="License"&gt;
&lt;img src="https://img.shields.io/badge/-RedwoodJS-B7410E?logo=redwoodjs" alt="Redwood"&gt;
&lt;img src="https://img.shields.io/badge/-GraphQL-E10098?logo=graphql" alt="GraphQL"&gt;
&lt;img src="https://img.shields.io/badge/-Prisma-2D3748?logo=prisma" alt="Prisma"&gt;
&lt;img src="https://img.shields.io/badge/-MySQL-4479A1?logo=mysql" alt="MySQL"&gt;&lt;/p&gt;
&lt;p&gt;WordsEnigma is a multilingual twist on the popular game Wordle, providing a fun and educational way to learn new languages. Built with advanced technologies for efficiency and a seamless gaming experience.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Development Setup&lt;/strong&gt;
WordsUnveil is a multilingual twist on the popular game Wordle, providing a fun and educational way to learn new languages. Built with advanced technologies for efficiency and a seamless gaming experience.&lt;/p&gt;
&lt;h2 id="getting-started-1"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Development Setup&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Networking evolution — building a home network lab</title><link>https://antoineboucher.info/CV/blog/posts/home-networking-evolution/</link><pubDate>Mon, 06 Sep 2021 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/home-networking-evolution/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome to a new chapter in my blog where I dive into the intricacies of building a robust home networking system. As a software engineer with a passion for networking protocols and efficient computing, I&amp;rsquo;ve embarked on a journey to design a system that balances performance, security, and cost-effectiveness. This post will detail my experiences and the technical decisions I made along the way.&lt;/p&gt;
&lt;h2 id="embracing-the-challenge-of-home-networking"&gt;Embracing the Challenge of Home Networking&lt;/h2&gt;
&lt;p&gt;My interest in networking began during my academic years, where I learned about various protocols such as IP, VPN, and IP7. Motivated by the high costs of cloud computing, I set out to build a home-based system. My goal was to use older computers, minimizing expenses on hardware and online services, while still achieving a high degree of functionality and efficiency.&lt;/p&gt;</description></item><item><title>MarketWatch API Python library</title><link>https://antoineboucher.info/CV/blog/projects/marketwatch/</link><pubDate>Mon, 06 Sep 2021 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/marketwatch/</guid><description>&lt;h1 id="marketwatch-api-python-library"&gt;Marketwatch API Python Library&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://img.shields.io/pypi/v/marketwatch" alt="PyPI"&gt;
&lt;img src="https://img.shields.io/pypi/pyversions/marketwatch" alt="PyPI - Python Version"&gt;
&lt;img src="https://img.shields.io/pypi/l/marketwatch" alt="PyPI - License"&gt;
&lt;img src="https://img.shields.io/pypi/dm/marketwatch" alt="PyPI - Downloads"&gt;
&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/marketwatch" alt="GitHub last commit"&gt;
&lt;a href="https://github.com/antoinebou12/marketwatch/actions/workflows/python-test.yml"&gt;&lt;img src="https://github.com/antoinebou12/marketwatch/actions/workflows/python-test.yml/badge.svg" alt="Python Test and Build"&gt;&lt;/a&gt;
&lt;img src="https://raw.githubusercontent.com/antoinebou12/marketwatch/main/.github/badge/coverage.svg" alt="Coverage"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.marketwatch.com"&gt;MarketWatch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antoinebou12.github.io/marketwatch/"&gt;Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A Python libary to interact with the MarketWatch Stock Market Game
Based on code from&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kevindong/MarketWatch_API/"&gt;https://github.com/kevindong/MarketWatch_API/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bwees/pymarketwatch"&gt;https://github.com/bwees/pymarketwatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="feature"&gt;Feature&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Logging in and out of the site&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting the current price of a stock&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting information about games on the site&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Buying, selling, shorting, and covering stocks in a game&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Creating, adding to, getting, and deleting watchlists&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting, adding to, and deleting items from a portfolio&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting and cancelling pending orders&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Checking if the game is down&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install marketwatch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install git+https://github.com/antoinebou12/marketwatch.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/antoinebou12/marketwatch.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;Here are some examples of how you can use the MarketWatch class:&lt;/p&gt;</description></item><item><title>CodePen demos (collection)</title><link>https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/</link><pubDate>Tue, 10 Jan 2017 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/</guid><description>&lt;p&gt;Small &lt;strong&gt;CodePen&lt;/strong&gt; experiments and two larger demos (Canvas and Three.js) below. Everything is a live embed so you can fork or read the source on CodePen.&lt;/p&gt;
&lt;style&gt;
 .codepen-pen-grid {
 display: grid;
 gap: 1.25rem;
 grid-template-columns: repeat(auto-fill, minmax(min(100%, 22rem), 1fr));
 }
 .codepen-pen-grid .codepen-grid-card {
 display: flex;
 flex-direction: column;
 min-width: 0;
 }
 .codepen-pen-grid .codepen-grid-card h3 {
 font-size: 1rem;
 font-weight: 600;
 margin: 0 0 0.35rem 0;
 line-height: 1.3;
 }
 .codepen-pen-grid .codepen-grid-card .codepen-grid-caption {
 font-size: 0.875rem;
 opacity: 0.85;
 margin: 0 0 0.75rem 0;
 line-height: 1.45;
 }
 .codepen-pen-grid .codepen-grid-card a.codepen-grid-open {
 margin-top: 0.5rem;
 font-size: 0.875rem;
 font-weight: 500;
 text-decoration: underline;
 text-underline-offset: 2px;
 }
 .codepen-pen-grid .codepen-grid-card a.codepen-grid-open:hover {
 opacity: 0.9;
 }
&lt;/style&gt;
&lt;div class="codepen-pen-grid not-prose my-8"&gt;&lt;div class="codepen-grid-card rounded-lg border border-black/10 bg-black/[0.02] p-3 dark:border-white/15 dark:bg-white/[0.03]"&gt;
 &lt;h3&gt;BMdzwx&lt;/h3&gt;
 &lt;p class="codepen-grid-caption"&gt;Compact front-end sketch—open on CodePen to see HTML, CSS, and JS.&lt;/p&gt;</description></item></channel></rss>