<?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>Mon, 13 Apr 2026 15:40:00 -0400</lastBuildDate><atom:link href="https://antoineboucher.info/CV/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Compiler pipeline, language genealogy, and why grammars matter</title><link>https://antoineboucher.info/CV/blog/posts/compiler-design-textbook-figures/</link><pubDate>Mon, 13 Apr 2026 15:40:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/compiler-design-textbook-figures/</guid><description>&lt;p&gt;These figures come from a &lt;strong&gt;programming languages / compiler design&lt;/strong&gt; textbook I was reading for a course. I kept the photos as a single reference page: how compilation is staged, how today’s languages relate historically, and where &lt;strong&gt;syntax&lt;/strong&gt; stops being enough — you need &lt;strong&gt;precedence rules&lt;/strong&gt;, &lt;strong&gt;disambiguation&lt;/strong&gt; for things like &lt;code&gt;else&lt;/code&gt;, and &lt;strong&gt;attributes&lt;/strong&gt; for semantics such as types.&lt;/p&gt;
&lt;h2 id="compiler-pipeline"&gt;Compiler pipeline&lt;/h2&gt;
&lt;p&gt;The usual story: &lt;strong&gt;source program&lt;/strong&gt; → &lt;strong&gt;lexical analyzer&lt;/strong&gt; (tokens) → &lt;strong&gt;syntax analyzer&lt;/strong&gt; (parse trees) → &lt;strong&gt;intermediate code&lt;/strong&gt; (with &lt;strong&gt;semantic analysis&lt;/strong&gt;) → optional &lt;strong&gt;optimization&lt;/strong&gt; → &lt;strong&gt;code generator&lt;/strong&gt; → &lt;strong&gt;machine code&lt;/strong&gt; on a &lt;strong&gt;computer&lt;/strong&gt;, plus &lt;strong&gt;input data&lt;/strong&gt; and &lt;strong&gt;results&lt;/strong&gt;. A &lt;strong&gt;symbol table&lt;/strong&gt; sits beside the front phases and feeds the back end.&lt;/p&gt;</description></item><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 is a single walkthrough of a &lt;strong&gt;movie similarity&lt;/strong&gt; thread: &lt;strong&gt;Part 1&lt;/strong&gt; stores embeddings in &lt;strong&gt;PostgreSQL + pgvector&lt;/strong&gt; and runs nearest-neighbor search in SQL; &lt;strong&gt;Part 2&lt;/strong&gt; uses &lt;strong&gt;Qdrant&lt;/strong&gt; with &lt;strong&gt;MovieLens&lt;/strong&gt; (dense text vectors for semantic search and sparse rating vectors for collaborative-style recommendations); &lt;strong&gt;Part 3&lt;/strong&gt; turns the same pgvector-backed catalog into the retrieval layer for a small &lt;strong&gt;RAG&lt;/strong&gt; pipeline with &lt;strong&gt;LangChain&lt;/strong&gt; and &lt;strong&gt;Ollama&lt;/strong&gt;. Below are short GIFs from that work (&lt;code&gt;movie-similarities-1.gif&lt;/code&gt; … &lt;code&gt;3.gif&lt;/code&gt; in this page bundle).&lt;/p&gt;</description></item><item><title>Dimension — a Rust math stack around mathlib</title><link>https://antoineboucher.info/CV/blog/posts/dimension-mathlib-rust/</link><pubDate>Mon, 13 Apr 2026 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/dimension-mathlib-rust/</guid><description>&lt;h2 id="what-it-is"&gt;What it is&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Dimension"&gt;Dimension&lt;/a&gt; is a monorepo I use to experiment with numerical code in Rust. The piece that holds most of the public API is &lt;strong&gt;mathlib&lt;/strong&gt;: a linear-algebra-focused crate with dense and sparse matrices, vectors, standard decompositions (SVD, Cholesky, LU, PCA), solvers, and a large set of building blocks for graphics-style math (3D types, quaternions, dual quaternions, cameras, easing, curves).&lt;/p&gt;
&lt;p&gt;The repo also pulls in related crates for simulation and tooling—kinematics, physics, geometry, rendering demos, neural bits, and a small site that packages some of the WASM demos—so mathlib stays the shared numeric core while other folders explore how that core feels in real programs.&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;
&lt;p&gt;&lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="https://antoineboucher.info/CV/blog/posts/dimension-mathlib-rust/"&gt;Dimension — a Rust math stack around mathlib&lt;/a&gt;&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>Software lifecycle notes — GOALS, waterfall, and verification vs validation</title><link>https://antoineboucher.info/CV/blog/posts/software-engineering-textbook-figures/</link><pubDate>Mon, 13 Apr 2026 08:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/software-engineering-textbook-figures/</guid><description>&lt;p&gt;These pages are from a &lt;strong&gt;software engineering&lt;/strong&gt; textbook I used in coursework. I grouped the figures here as a single reference: &lt;strong&gt;goal-oriented planning&lt;/strong&gt;, how the &lt;strong&gt;waterfall&lt;/strong&gt; model sequences activities (with &lt;strong&gt;verification and validation&lt;/strong&gt; paired to each phase), an &lt;strong&gt;incremental&lt;/strong&gt; variant, the textbook’s list of &lt;strong&gt;life-cycle subgoals&lt;/strong&gt;, a reminder that &lt;strong&gt;method advice depends on context&lt;/strong&gt;, and a short &lt;strong&gt;ethics&lt;/strong&gt; passage about impact on people.&lt;/p&gt;
&lt;h2 id="goals-approach-figure-3-1"&gt;GOALS approach (Figure 3-1)&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;GOALS&lt;/strong&gt; flowchart is a top-down pattern: set &lt;strong&gt;overall life-cycle goals&lt;/strong&gt; (functions, constraints, schedule, usability, maintainability), &lt;strong&gt;analyze&lt;/strong&gt; the problem and sketch solution structure, &lt;strong&gt;separate concerns&lt;/strong&gt; into subgoals, &lt;strong&gt;develop&lt;/strong&gt; solutions for each subgoal in parallel where possible, then &lt;strong&gt;validate&lt;/strong&gt; those solutions against the other goals and &lt;strong&gt;iterate&lt;/strong&gt; until the decision “all goals satisfied?” is yes.&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>ChatGPT plugin with FastAPI — implementation outline</title><link>https://antoineboucher.info/CV/blog/posts/fastapi-chatgpt-plugin-overview/</link><pubDate>Sat, 01 Jun 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/fastapi-chatgpt-plugin-overview/</guid><description>&lt;p&gt;OpenAI-style &lt;strong&gt;plugins&lt;/strong&gt; expose an HTTP API described by an &lt;strong&gt;OpenAPI&lt;/strong&gt; document so ChatGPT can call your tools safely. &lt;strong&gt;FastAPI&lt;/strong&gt; generates OpenAPI for you, which fits this model well.&lt;/p&gt;
&lt;h2 id="1-define-the-api-in-fastapi"&gt;1. Define the API in FastAPI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Routes return &lt;strong&gt;JSON&lt;/strong&gt; with stable shapes (no ambiguous free text where structure matters).&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;summaries and descriptions&lt;/strong&gt; on paths and fields — they help the model choose the right tool.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-publish-openapijson"&gt;2. Publish &lt;code&gt;openapi.json&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;FastAPI serves &lt;strong&gt;&lt;code&gt;/openapi.json&lt;/code&gt;&lt;/strong&gt; by default; the plugin manifest points at this URL (or a static copy you version).&lt;/li&gt;
&lt;li&gt;Keep schemas &lt;strong&gt;tight&lt;/strong&gt;: enums, required fields, and examples reduce bad calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-plugin-manifest"&gt;3. Plugin manifest&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Host &lt;strong&gt;&lt;code&gt;ai-plugin.json&lt;/code&gt;&lt;/strong&gt; (or the format required by the current OpenAI developer docs) over &lt;strong&gt;HTTPS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Manifest references your API base URL and OpenAPI location.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-auth"&gt;4. Auth&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Prefer &lt;strong&gt;OAuth&lt;/strong&gt; or &lt;strong&gt;API keys&lt;/strong&gt; as documented for your integration; never commit secrets.&lt;/li&gt;
&lt;li&gt;Validate tokens inside FastAPI dependencies or middleware.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-deploy"&gt;5. Deploy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; endpoint reachable from OpenAI’s servers.&lt;/li&gt;
&lt;li&gt;Logging and &lt;strong&gt;idempotency&lt;/strong&gt; for side-effecting routes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-test-manually"&gt;6. Test manually&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Call routes with &lt;code&gt;curl&lt;/code&gt; or HTTPie using the same payloads the model will send.&lt;/li&gt;
&lt;li&gt;Iterate on descriptions and constraints before exposing wide traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Details change with OpenAI’s platform updates — always follow the latest &lt;strong&gt;plugin / tools / actions&lt;/strong&gt; documentation when wiring production apps.&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>Responsive step progress bar (jQuery + CSS)</title><link>https://antoineboucher.info/CV/blog/posts/tutorial-jquery-step-progress-bar/</link><pubDate>Mon, 12 Feb 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/tutorial-jquery-step-progress-bar/</guid><description>&lt;p&gt;This code creates a responsive progress bar with four steps. It uses jQuery for dynamic text changes and CSS for styling. Here&amp;rsquo;s a breakdown of its functionality:&lt;/p&gt;
&lt;h3 id="html-structure"&gt;HTML Structure&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The progress bar is wrapped inside a &lt;code&gt;div&lt;/code&gt; with the class &lt;code&gt;progressbar_container&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An unordered list (&lt;code&gt;ul&lt;/code&gt;) with the class &lt;code&gt;progressbar&lt;/code&gt; represents the progress bar.&lt;/li&gt;
&lt;li&gt;Each step in the progress bar is an &lt;code&gt;li&lt;/code&gt; element with the class &lt;code&gt;progressbar_node&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The current step is highlighted by adding the class &lt;code&gt;current_node&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="css-styling"&gt;CSS Styling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;.progressbar_container&lt;/code&gt; is styled to position the progress bar, manage its size, and center it.&lt;/li&gt;
&lt;li&gt;Each &lt;code&gt;.progressbar_node&lt;/code&gt; represents a step in the progress bar.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;:before&lt;/code&gt; pseudo-element of &lt;code&gt;.progressbar_node&lt;/code&gt; creates circular step indicators with numbers.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;:after&lt;/code&gt; pseudo-element creates connecting lines between the steps.&lt;/li&gt;
&lt;li&gt;The current and completed steps are highlighted with a darker color and a solid border.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="javascript-functionality"&gt;JavaScript Functionality&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On document ready (&lt;code&gt;$(document).ready&lt;/code&gt;), the previous steps to the current step are marked as completed using the class &lt;code&gt;activated_node&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A resize event listener (&lt;code&gt;$(window).resize&lt;/code&gt;) changes the text of the first step based on the window&amp;rsquo;s width. It toggles between &amp;ldquo;PASSENGER&amp;rdquo; and &amp;ldquo;PASSENGER DETAILS&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensure you have included the jQuery library to use the jQuery syntax.&lt;/li&gt;
&lt;li&gt;The resizing functionality helps maintain responsiveness, providing a better experience on different screen sizes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="example-usage"&gt;Example Usage&lt;/h3&gt;
&lt;p&gt;To use this progress bar, include the provided HTML in your document. Ensure your CSS is properly linked, and the jQuery library is included for the JavaScript to work correctly.&lt;/p&gt;</description></item><item><title>Screen capture in the browser (getDisplayMedia)</title><link>https://antoineboucher.info/CV/blog/posts/tutorial-webrtc-screen-capture/</link><pubDate>Sat, 10 Feb 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/tutorial-webrtc-screen-capture/</guid><description>&lt;h3 id="tutorial-building-a-screen-capture-utility-with-html-css-and-javascript"&gt;Tutorial: Building a Screen Capture Utility with HTML, CSS, and JavaScript&lt;/h3&gt;
&lt;h4 id="introduction"&gt;Introduction&lt;/h4&gt;
&lt;p&gt;This tutorial demonstrates how to create a screen capture utility in a web application. We will use HTML for the structure, CSS for styling, and JavaScript for functionality.&lt;/p&gt;
&lt;h4 id="prerequisites"&gt;Prerequisites&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Basic understanding of HTML, CSS, and JavaScript&lt;/li&gt;
&lt;li&gt;A modern web browser with support for &lt;code&gt;getDisplayMedia&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="html-setup"&gt;HTML Setup&lt;/h4&gt;
&lt;p&gt;First, we create the HTML structure with buttons for starting and stopping the screen capture and a section to display the video.&lt;/p&gt;</description></item><item><title>CodePen demos (collection)</title><link>https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/</link><pubDate>Wed, 10 Jan 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/</guid><description>&lt;p&gt;Small experiments and UI demos published on CodePen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/BMdzwx"&gt;Pen — BMdzwx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/details/xMXNyy"&gt;Details — xMXNyy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/MLEdxr"&gt;Canvas blackboard — MLEdxr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/JxrqQx"&gt;Pen — JxrqQx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/byVQKJ"&gt;Pen — byVQKJ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/jjzxER"&gt;Pen — jjzxER&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/qzQpYg"&gt;Pen — qzQpYg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/ZEENwWB"&gt;Pen — ZEENwWB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/antoinebou13/pen/rNoqVOj"&gt;Three.js wave — rNoqVOj&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Longer write-ups for some of these live under &lt;strong&gt;Posts&lt;/strong&gt; (blackboard and Three.js tutorials).&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="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>GPT-4 vs GPT-3.5 — capabilities and API cost framing</title><link>https://antoineboucher.info/CV/blog/posts/gpt4-api-costs-overview/</link><pubDate>Mon, 10 Apr 2023 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/gpt4-api-costs-overview/</guid><description>&lt;p&gt;&lt;img src="https://media.licdn.com/dms/image/D5612AQHKus7rY_HvVQ/article-cover_image-shrink_720_1280/0/1681059889367?e=1709769600&amp;amp;v=beta&amp;amp;t=39LUP6caikwBW_QeEC7T-2peoci56x6v9xzNtCPdWxQ" alt="Article cover image" title="Cover Image for AI Article"&gt;&lt;/p&gt;
&lt;p&gt;As artificial intelligence continues to advance, more and more companies are incorporating AI-powered chatbots into their customer service systems. These chatbots can handle a wide range of customer inquiries, from simple questions to more complex issues. However, the cost of implementing and maintaining such chatbots is an important factor to consider. In this article, we will calculate the costs of using GPT-4 and GPT-3.5-turbo models with a message cap of 25 messages every 3 hours for one month of usage, considering the same average prompt sizes (50 to 200 tokens).&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>Network architecture — Lucidchart to PlantUML C4</title><link>https://antoineboucher.info/CV/blog/posts/home-network-plantuml-c4/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/home-network-plantuml-c4/</guid><description>&lt;p&gt;I&amp;rsquo;ve recently embarked on a journey to overhaul my home network setup. The transition from Draw.io to PlantUML C4 for creating deployment diagrams has been a game-changer. 🏡&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/home-network-plantuml-c4/images/1688937735221.jpeg" alt="1688937733753.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;PlantUML C4 offers a text-based 📝approach that integrates seamlessly with version control systems, making it an ideal tool for infrastructure as code (IaC)🏗️ .&lt;/p&gt;
&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/home-network-plantuml-c4/images/1688937733753.jpeg" alt="1688937733753.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;I am also moving to Cloudflare for DNS management ✅
I gonna also use Terraform and Github action as CD🔁&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;Demos demonstrating how to use this library can be found &lt;a href="demos/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;h3 id="adding-the-sentry-sink"&gt;Adding the Sentry Sink&lt;/h3&gt;
&lt;p&gt;Add the Sentry sink to your Serilog logger configuration, so that the logs will be sent to your Sentry instance. The Sentry DSN must be provided.&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>Date range picker web component (jQuery + plugin)</title><link>https://antoineboucher.info/CV/blog/posts/tutorial-date-range-picker-component/</link><pubDate>Fri, 05 Feb 2016 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/tutorial-date-range-picker-component/</guid><description>&lt;p&gt;This walkthrough is from the jQuery-and-Moment era: you wrap two text inputs in a custom element &lt;code&gt;&amp;lt;daterangepicker-two-input&amp;gt;&lt;/code&gt;, register it with &lt;code&gt;customElements.define&lt;/code&gt;, and hand the container off to the Date Range Picker plugin. Newer stacks usually reach for native &lt;code&gt;&amp;lt;input type=&amp;quot;date&amp;quot;&amp;gt;&lt;/code&gt;, flatpickr, or framework date components — but plenty of dashboards shipped in the mid-2010s (and many still in maintenance) look exactly like this.&lt;/p&gt;
&lt;h3 id="tutorial-creating-a-custom-date-range-picker-element"&gt;Tutorial: Creating a Custom Date Range Picker Element&lt;/h3&gt;
&lt;h4 id="introduction"&gt;Introduction&lt;/h4&gt;
&lt;p&gt;You end up with a small reusable tag that opens the familiar range calendar UI (check-in / check-out style) while keeping the markup consistent across pages.&lt;/p&gt;</description></item><item><title>Custom countdown timer (HTML, CSS, JavaScript)</title><link>https://antoineboucher.info/CV/blog/posts/tutorial-custom-countdown-timer/</link><pubDate>Mon, 01 Feb 2016 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/tutorial-custom-countdown-timer/</guid><description>&lt;p&gt;This is a straight DOM-and-&lt;code&gt;setInterval&lt;/code&gt; countdown: minutes in, tick down, start and reset, and a short audio clip when it hits zero — the sort of thing that showed up in every “learn JavaScript” blog around 2016 before frameworks swallowed the front page.&lt;/p&gt;
&lt;h3 id="tutorial-building-a-custom-countdown-timer"&gt;Tutorial: Building a Custom Countdown Timer&lt;/h3&gt;
&lt;h4 id="step-1-setting-up-the-html-structure"&gt;Step 1: Setting Up the HTML Structure&lt;/h4&gt;
&lt;p&gt;First, we&amp;rsquo;ll create the basic structure of the timer. This includes input fields for minutes, a display for the countdown, and buttons to start and reset the timer.&lt;/p&gt;</description></item><item><title>Three.js 3D wave animation (CodePen tutorial)</title><link>https://antoineboucher.info/CV/blog/posts/codepen-threejs-wave-tutorial/</link><pubDate>Thu, 07 Jan 2016 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/codepen-threejs-wave-tutorial/</guid><description>&lt;h2 id="codepen-demo"&gt;CodePen demo&lt;/h2&gt;
&lt;div class="not-prose my-6 w-full overflow-hidden rounded-lg border border-black/10 dark:border-white/10"&gt;
 &lt;iframe
 title="CodePen embed"
 src="https://codepen.io/antoinebou13/embed/rNoqVOj?default-tab=result"
 style="width:100%; height: 480px;"
 loading="lazy"
 allowfullscreen="true"
 &gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;This walkthrough builds a &lt;strong&gt;3D wave animation&lt;/strong&gt; with &lt;strong&gt;Three.js&lt;/strong&gt;: scene, camera, WebGL renderer, a grid of cubes, and a simple undulating motion — the sort of “look, WebGL in the browser” demo that fit right in with 2016 Three.js + CodePen articles. Use the embed above to tweak it live.&lt;/p&gt;
&lt;h4 id="setting-up-the-scene"&gt;Setting Up the Scene&lt;/h4&gt;
&lt;p&gt;First, let&amp;rsquo;s set up the basic components of any Three.js scene: the scene itself, a camera, and a WebGL renderer. Add the following code to initialize these components:&lt;/p&gt;</description></item><item><title>HTML5 Canvas blackboard (CodePen tutorial)</title><link>https://antoineboucher.info/CV/blog/posts/codepen-blackboard-canvas-tutorial/</link><pubDate>Thu, 07 Jan 2016 11:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/codepen-blackboard-canvas-tutorial/</guid><description>&lt;h2 id="codepen-demo"&gt;CodePen demo&lt;/h2&gt;
&lt;div class="not-prose my-6 w-full overflow-hidden rounded-lg border border-black/10 dark:border-white/10"&gt;
 &lt;iframe
 title="CodePen embed"
 src="https://codepen.io/antoinebou13/embed/MLEdxr?default-tab=result"
 style="width:100%; height: 480px;"
 loading="lazy"
 allowfullscreen="true"
 &gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This tutorial walks through a simple interactive blackboard with &lt;strong&gt;HTML5 Canvas&lt;/strong&gt; and plain JavaScript: drawing, pulling in images via the File API, and clearing the board. It matches the kind of step-by-step CodePen write-up that was everywhere around 2016. Use the embed above to see the finished behavior.&lt;/p&gt;
&lt;h2 id="setting-up-the-canvas"&gt;Setting Up the Canvas&lt;/h2&gt;
&lt;p&gt;First, we need to set up the HTML5 canvas element. This is where all the drawing will take place.&lt;/p&gt;</description></item><item><title>Draggable, sortable image bubbles (Messenger-style)</title><link>https://antoineboucher.info/CV/blog/posts/tutorial-jquery-messenger-image-bubbles/</link><pubDate>Thu, 07 Jan 2016 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/tutorial-jquery-messenger-image-bubbles/</guid><description>&lt;h3 id="tutorial-creating-draggable-and-sortable-images-with-jquery"&gt;Tutorial: Creating Draggable and Sortable Images with jQuery&lt;/h3&gt;
&lt;h4 id="introduction"&gt;Introduction&lt;/h4&gt;
&lt;p&gt;This walkthrough uses jQuery and jQuery UI to build circular “bubble” avatars you can drag and reorder — the same ingredients that showed up in countless demos when Messenger-style circles and sortable lists were everywhere (roughly the ES5 + jQuery era, ~2016). Handy for legacy pages or if you want the recipe in one place.&lt;/p&gt;
&lt;h4 id="prerequisites"&gt;Prerequisites&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Basic knowledge of HTML, CSS, and JavaScript&lt;/li&gt;
&lt;li&gt;jQuery and jQuery UI library&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="html-structure"&gt;HTML Structure&lt;/h4&gt;
&lt;p&gt;We start by setting up our HTML structure with two unordered lists (&lt;code&gt;ul&lt;/code&gt;) and list items (&lt;code&gt;li&lt;/code&gt;) containing images.&lt;/p&gt;</description></item></channel></rss>