<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://srombauts.eu/feed.xml" rel="self" type="application/atom+xml" /><link href="https://srombauts.eu/" rel="alternate" type="text/html" /><updated>2026-07-12T19:37:14+02:00</updated><id>https://srombauts.eu/feed.xml</id><title type="html">SRombauts.fr</title><subtitle>Comments from a tools developer, into C++, game engines and AI-assisted software engineering ;)</subtitle><author><name>Sébastien Rombauts</name></author><entry><title type="html">Reading list of 330 of the best books of science-fiction.</title><link href="https://srombauts.eu/2026/07/10/a-science-fiction-reading-list/" rel="alternate" type="text/html" title="Reading list of 330 of the best books of science-fiction." /><published>2026-07-10T00:00:00+02:00</published><updated>2026-07-10T00:00:00+02:00</updated><id>https://srombauts.eu/2026/07/10/a-science-fiction-reading-list</id><content type="html" xml:base="https://srombauts.eu/2026/07/10/a-science-fiction-reading-list/"><![CDATA[<p>I have recently bought a second e-ink reader for the familly, and I wanted a list of books to load on it!
I was trying to get ideas of science-fictions books that I loved reading when I was a kid, so that I would re-read some of them.
But even more, I would like my own kids to read some of them: they don’t have the exact same tests, and read only in French though.
And ideally, I would focus on the very bests: renwoned ones, very classic ones from the godlen age of SF,
to some of the most recent price wining books as well!</p>

<p>So it started with my current book shelve, some personal memories, a few online “list of best SF books” (in French)
and a series of iterative prompts on LLMs to expend it, refine it, etc.</p>

<p>I have now published a cleaned-up version as a permanent page:
<a href="/lectures-sf/">Les 330 meilleurs livres de science-fiction et fantasy</a>.
Warning: the page is in French, listing the French editions and is meant for
French-speaking readers.</p>

<p>Each entry has a theme and a one-line summary, so you can browse it instead of scanning bare titles.
And it comes with three guided reading paths: one for an adult who used to read a lot and
wants to get back into it (short books first, always a short story collection on the side, big cycles last),
one for a strong reader of 12 years oald, which climbs from Stefan Wul’s <em>Niourk</em> all the way to <em>Dune</em> over a year or two,
and one for a 13-year-old who prefer the romance but has a taste for fantasy as well.</p>

<p>I will most likely update it along the following weeks, months and years!</p>]]></content><author><name>Sébastien Rombauts</name></author><category term="books" /><category term="science-fiction" /><summary type="html"><![CDATA[I have recently bought a second e-ink reader for the familly, and I wanted a list of books to load on it! I was trying to get ideas of science-fictions books that I loved reading when I was a kid, so that I would re-read some of them. But even more, I would like my own kids to read some of them: they don’t have the exact same tests, and read only in French though. And ideally, I would focus on the very bests: renwoned ones, very classic ones from the godlen age of SF, to some of the most recent price wining books as well!]]></summary></entry><entry><title type="html">Astrophotography: Mount and Telescope setup time-lapse</title><link href="https://srombauts.eu/2023/02/20/astrophotography-mount-and-telescope-setup-time-lapse/" rel="alternate" type="text/html" title="Astrophotography: Mount and Telescope setup time-lapse" /><published>2023-02-20T00:00:00+01:00</published><updated>2023-02-20T00:00:00+01:00</updated><id>https://srombauts.eu/2023/02/20/astrophotography-mount-and-telescope-setup-time-lapse</id><content type="html" xml:base="https://srombauts.eu/2023/02/20/astrophotography-mount-and-telescope-setup-time-lapse/"><![CDATA[<p>I was asked to show how I setup my mount and telescope, so I recorded me accelerated 30 times, and shared it on YouTube:</p>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/XTB7xq6rVC4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p>Time-lapse of the setup of my old CGEM Celestron mount and the TS APO 65/420 refractor telescope, with an ASI178MM black and white camera (planetary, but cooled by a DIY Peltier module for longer exposure deep-sky imaging).</p>

<p>Taken on 2023-02-20 near Paris.</p>

<h2 id="part-1---25min-from-1842">Part 1 - 25min from 18:42</h2>

<p>Initial assembly and positioning of the mount, the scope, the heaters, the cameras, and all their cable.</p>

<p>Short break: I stopped the recording after approximately 25 minutes, while I had to wait for the night to fall, for the Polaris north star to appear in the sky.</p>

<h2 id="part-2---30-min-from-1926">Part 2 - 30 min from 19:26</h2>

<p>When Polaris (the north star) appears in the sky, it’s time to align the equatorial mount with the Earth’s axis of rotation.
After that, I point the mount successively to Venus &amp; Jupiter planets, a star I forgot, then Capella giant &amp; Betelgeuse supergiant stars, to calibrate precisely its orientation.</p>

<p>After that, I am ready to start my imaging sessions (from inside the house): tonight it’s the Monkey Head nebula (NGC 2174) in H-alpha (Hα, with a wavelength of 656, in the red).</p>

<h2 id="footnotes">Footnotes</h2>

<p>I’ll try to retake this in 4K and without the midle break. I should be able to get a better quality overrall.</p>

<p>TODO: I should also post a retrospective on how I built the little DIY Peltier module, and link it here.</p>]]></content><author><name>Sébastien Rombauts</name></author><category term="astrophotography" /><category term="video" /><summary type="html"><![CDATA[I was asked to show how I setup my mount and telescope, so I recorded me accelerated 30 times, and shared it on YouTube:]]></summary></entry><entry><title type="html">Power Shell cheat sheet</title><link href="https://srombauts.eu/2022/12/08/power-shell-cheat-sheet/" rel="alternate" type="text/html" title="Power Shell cheat sheet" /><published>2022-12-08T00:00:00+01:00</published><updated>2022-12-08T00:00:00+01:00</updated><id>https://srombauts.eu/2022/12/08/power-shell-cheat-sheet</id><content type="html" xml:base="https://srombauts.eu/2022/12/08/power-shell-cheat-sheet/"><![CDATA[<p>I figured that I should keep track of some useful command-line tools that I am learning, so I’ll write down them as blog posts and keep updating them.</p>

<p><em>edit 2026-05-25: added a few commands around finding which executable is actually being used on Windows, and a couple of related <code class="language-plaintext highlighter-rouge">PATH</code> debugging tricks.</em></p>

<h2 id="benchmarking-net-7">Benchmarking .NET 7</h2>

<p>I got started by this video</p>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/sa3XsvSiMtk" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<h3 id="measure-command">Measure-Command</h3>

<p>Default output of Measure-Command, using git.exe as a benchmark for a real-life native application:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PS C:\&gt; Measure-Command { git.exe --version | Out-Default }
git version 2.35.1.windows.2


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 47
Ticks             : 476314
TotalDays         : 5.51289351851852E-07
TotalHours        : 1.32309444444444E-05
TotalMinutes      : 0.000793856666666667
TotalSeconds      : 0.0476314
TotalMilliseconds : 47.6314
</code></pre></div></div>

<p>we can limit the result to TotalMilliseconds only:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PS C:\&gt; ( Measure-Command { git.exe --version } ).TotalMilliseconds
47.8714
</code></pre></div></div>

<p>comparing to a full C# command line application using .NET runtime, this time Plastic SCM</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PS C:\&gt; ( Measure-Command { cm.exe version } ).TotalMilliseconds
395.9726
</code></pre></div></div>

<p>with a simple C# console app I get better results (note that in this instance the Release build doesn’t run any faster):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PS C:\Workspace\NETConsoleApp1&gt; (Measure-Command {.\bin\Debug\net7.0\NETConsoleApp1.exe}).TotalMilliseconds
83.2977
</code></pre></div></div>

<p>Then, publishing as a <a href="https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/">Native application, Ahead Of Time (AOT) compilation of .NET 7.0</a>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet publish -r win-x64 -c Release -p:PublishAot=true
</code></pre></div></div>

<p>gives us a bigger application, but much faster to start:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PS C:\Workspace\NETConsoleApp1&gt; (Measure-Command {.\bin\Release\net7.0-windows7.0\win-x64\publish\NETConsoleApp1.exe}).TotalMilliseconds
24.717
</code></pre></div></div>

<h2 id="convertfrom-json">ConvertFrom-Json</h2>

<p>An equivalent to unix <code class="language-plaintext highlighter-rouge">| jq</code> Json reader/formatter in PowerShell</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl.exe http://localhost:18104/api/xxx -X GET -H "content-type: application/json" --header "Authorization: &lt;token&gt;" | ConvertFrom-Json
</code></pre></div></div>

<h2 id="find-which-executable-is-actually-being-used">Find which executable is actually being used</h2>

<p>In PowerShell, list <strong>all</strong> matches across <code class="language-plaintext highlighter-rouge">PATH</code>, in the order they would be resolved:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Get-Command cmake.exe -All | Select-Object Source
</code></pre></div></div>

<p>Or, the <code class="language-plaintext highlighter-rouge">cmd.exe</code> equivalent (also works from PowerShell since it is just an <code class="language-plaintext highlighter-rouge">.exe</code>):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>where cmake
</code></pre></div></div>

<h2 id="resolve-the-single-path-that-will-be-executed">Resolve the single path that <em>will</em> be executed</h2>

<p>If you just want the one binary that would actually run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(Get-Command cmake.exe).Path
</code></pre></div></div>

<h2 id="check-the-current-path-order">Check the current PATH order</h2>

<p>Useful right after the previous command, to understand <em>why</em> the wrong copy wins, listing one entry per line in resolution order:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$env:Path -split ';'
</code></pre></div></div>

<p>To filter only the likely culprits:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$env:Path -split ';' | Select-String -Pattern 'cmake'
</code></pre></div></div>

<p>And to do the same for the user-scoped or machine-scoped <code class="language-plaintext highlighter-rouge">PATH</code> :</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Environment]::GetEnvironmentVariable('PATH', 'User')    -split ';'
[Environment]::GetEnvironmentVariable('PATH', 'Machine') -split ';'
</code></pre></div></div>

<h2 id="list-environment-variables">List environment variables</h2>

<p>PowerShell exposes environment variables as a drive:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Get-ChildItem env:
Get-ChildItem env:Path
</code></pre></div></div>]]></content><author><name>Sébastien Rombauts</name></author><category term="tools" /><category term="command-line" /><category term="dotnet" /><summary type="html"><![CDATA[I figured that I should keep track of some useful command-line tools that I am learning, so I’ll write down them as blog posts and keep updating them.]]></summary></entry><entry><title type="html">DIY building an RC plane from Depron</title><link href="https://srombauts.eu/2022/11/26/diy-depron-rc-plane/" rel="alternate" type="text/html" title="DIY building an RC plane from Depron" /><published>2022-11-26T00:00:00+01:00</published><updated>2022-11-26T00:00:00+01:00</updated><id>https://srombauts.eu/2022/11/26/diy-depron-rc-plane</id><content type="html" xml:base="https://srombauts.eu/2022/11/26/diy-depron-rc-plane/"><![CDATA[<p>The idea to build my own quadcopter drone, or my own RC plane, has always been tempting. My main issue was the lack of a dedicated space to build, and more importantly, a space to fly.</p>

<p>I have not solved these, but at long last, I have started building my own plane (with the help of my kids :o)!</p>

<p>The Youtube video that got me started (in French, but see similar videos in English that also helped me) is:</p>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/qNyAMTq8BZ0" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<h2 id="cessna-172-characteristics">Cessna 172 characteristics</h2>

<h3 id="real">Real</h3>

<ul>
  <li>8.07m lenght from tip of the proppeler to the tail</li>
  <li>11.02m wingspan
    <ul>
      <li>2.54m to the break between wing flaps to ailerons</li>
    </ul>
  </li>
  <li>3.45m tail width</li>
  <li>2.72m height to the tip of the tail</li>
  <li>2.18m width between the wheels</li>
</ul>

<h3 id="model-17th">Model 1/7th</h3>

<ul>
  <li>101cm 1/8th length</li>
  <li>159cm 1/7th
    <ul>
      <li>?</li>
    </ul>
  </li>
  <li>50cm 1/7th</li>
  <li>?38cm?</li>
  <li>?</li>
</ul>

<h2 id="list-of-hardware">List of hardware</h2>

<h3 id="hardware">Hardware</h3>

<p>Some of this is optionnal, eg to make the plane looks good, some of it is tooling that can be reused for other projects.</p>

<ul>
  <li><a href="https://www.bricodepot.fr/nanterre/8-plaques-de-polystyrene-extrude-80-x-60-cm/prod53395/">Depron / Extruded Polystyrene Foam Sheets 6mm 80x60cm 8x (24.10€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B01191KS0K">Reinforced adhesive tape 50mm (17.06€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B08N2WXWXV">Red polypropylene adhesive tape 48mm x 66m (7.95€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B08MV8TB2H">White polypropylene adhesive tape 48mm x 66m (7.95€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B093H4GX4B">Steel cable 1mm x 20m (6.18€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B09QCZVP3L">Nylon clevis keper clip x20 (15.0€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B07CQS4PF1">Nylon hinge (6.00€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B081V87S98">Wheels 64mm 2x (10.47€)</a></li>
  <li><a href="https://www.miniplanes.fr/baguette-de-fibre-de-carbone-30-x-05-mm-pichler-c2466">Carbone fiber plate 3.0mm x 0.5mm x 1m (1.00€)</a></li>
  <li><a href="https://www.miniplanes.fr/jonc-carbone/rond/carbon-fibre-round-tube-40mm-20mm-1mt-jp5518416-p-7483.html">Carbone fiber tube 4.0mm x 1m (6.00€)</a></li>
</ul>

<h3 id="electronics">Electronics</h3>

<ul>
  <li><a href="https://www.amazon.fr/gp/product/B07BS7DFW3">1000KV Brushless Motor A2212 13T with 30A Brushless ESC Set 1045 Propeller Accessories Kit Mount (25.49€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B0B68N2HMV">DTXMX Flysky FS-iA6B 2.4GHz receiver (27.99€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B07CZ42862">Micro Servo 9g x5 (14.99€)</a></li>
  <li><a href="https://www.amazon.fr/gp/product/B09MHHLKPR">Y extension cables (10.50€)</a></li>
  <li>
    <p><a href="https://www.amazon.fr/gp/product/B07PC1YKVW">XT30 connectors x2x10 (8.99€)</a></p>
  </li>
  <li><a href="https://www.amazon.fr/gp/product/B07MY3DXPB">Servo tester (5.99€)</a></li>
</ul>

<h3 id="already-owned">Already owned</h3>

<p>Hardware I had for a few years, for <a href="/2019/07/28/beta75x-3s-whoop-quadcopter/">my tiny drone</a></p>

<ul>
  <li>Jumper T12 multi-protocol Tranceiver</li>
  <li>LiPo 3S 300mAh batteries (I will ideally need to switch to +1000mAh for ~100g batteries for longer flights)</li>
</ul>

<h2 id="weight-issue">Weight issue</h2>

<p>Nearly 3 weeks in the slow process, I discoverd that the plane was weighting already close to 800g without the battery, compared to the supposed ready-to-fly 600g.</p>

<ol>
  <li>I took a step back and weighted the equivalent of all the hot glue I had used so far; something like 5x20g is added to the plane :o ! That’s bad. So people are using Cyanocrylate (brittle) or dedicated UHU POR like foam glue.</li>
  <li>Then I weighted the white adhesive tape I had used compared to a new one; some aditional 80g where added to the frame! That’s super bad :(</li>
</ol>

<p>That’s a hard lesson to learn so far in the project. Going from +600 to +800, ie adding 33% more weight is a big issue especially for a beginer trainer airplane.</p>

<p>Now, this has muliple consequences;</p>

<h3 id="wheels">Wheels</h3>

<p>Landing wheels where never robust enough, but now with all the extra weight, they are bending way to much, and I had to make them more straight.</p>

<h3 id="balance-issue">Balance issue</h3>

<p>Now that’s not all!
With all this added weight, the plane is quite tail heavy, and this is also bad. Impossible to fly without adding more weight to the tip; I would need to buy bigger batteries and put them at the very front.</p>

<h3 id="solutions">Solutions</h3>

<p>So now, I’ll have to make sure to remove as much of the white adhesive tape, starting with the tail. And I’ll make sure to weight all what I remove to take note of what I am saving their. After that, removing further to the fuselage can help even more with the weight, but won’t play too much with the balance of the plane. Finaly, for the wings I think that I prefer to keep them like that for extra durability, but it will depend of my results with the above weight removal.</p>

<p>In order to move more weight to the front, it could be good to cut and reglue the motor support a centimeter toward the tip, which would move something like 80g. A good win! Just quite destructive, especially since I already cut &amp; reglue it once. In fact, there is probably too much glue to it.</p>

<p>Another option to consider would be to dig into the fuselage to cut through some pieces and remove some of them, especially remove some part that are glued in order to remove the glue with it. But I fear that this would be much more invasive, destructive &amp; maje the airplane more fragile.</p>

<p>But at this stage, it might be better to just fly the plane until I crash it to hard, and build another one from scratch with all this experience aquired.</p>

<h3 id="results">Results</h3>

<p>I was able to shave off ~28g from the tail and the rear of the fuselage. From a balance perspective it’s a game changer.</p>

<h2 id="other-similar-diy-videos">Other similar DIY videos</h2>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/LzZ4Oqk_J1Y" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/zecqJ_5iSmM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<h2 id="footnotes">Footnotes</h2>

<p>I’ll make sure to update this post with pictures of the work in progress.</p>

<p>Cheers!</p>]]></content><author><name>Sébastien Rombauts</name></author><category term="diy" /><category term="rc" /><summary type="html"><![CDATA[The idea to build my own quadcopter drone, or my own RC plane, has always been tempting. My main issue was the lack of a dedicated space to build, and more importantly, a space to fly.]]></summary></entry><entry><title type="html">I Joined Unity!</title><link href="https://srombauts.eu/2022/02/22/I-joined-unity/" rel="alternate" type="text/html" title="I Joined Unity!" /><published>2022-02-22T00:00:00+01:00</published><updated>2022-02-22T00:00:00+01:00</updated><id>https://srombauts.eu/2022/02/22/I-joined-unity</id><content type="html" xml:base="https://srombauts.eu/2022/02/22/I-joined-unity/"><![CDATA[<p>Hey, I have joined <a href="https://unity.com">Unity Technologies</a> as a Senior Software Engineer in the VCS Integrations team, part of DevOps! A significant part of my mission will be to integrate Plastic SCM into other application, starting with the <a href="/2016/04/25/unreal-engine-4-11-plastic-scm-source-control-provider/">Plastic SCM plugin for Unreal Engine</a> :)</p>

<p>This thanks to <a href="https://blog.unity.com/news/codice-software-joins-unity-technologies-to-bring-version-control-to-real-time-3d-workflows">Unity Technologies acquiring Codice Software to bring Plastic SCM version control to real-time 3D workflows</a> back in August 17, 2020.</p>

<blockquote class="twitter-tweet" data-theme="light"><p lang="en" dir="ltr">Hey, I have started working at <a href="https://twitter.com/unity?ref_src=twsrc%5Etfw">@Unity</a>!<br />Part of my job will be to improve <a href="https://twitter.com/plasticscm?ref_src=twsrc%5Etfw">@PlasticSCM</a> support in <a href="https://twitter.com/UnrealEngine?ref_src=twsrc%5Etfw">@UnrealEngine</a> ;)<br />Nice, right?</p>&mdash; Sébastien Rombauts (@SRombauts) <a href="https://twitter.com/SRombauts/status/1496159161775763471?ref_src=twsrc%5Etfw">February 22, 2022</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>]]></content><author><name>Sébastien Rombauts</name></author><category term="vcs" /><category term="unreal-engine" /><category term="unity" /><category term="community" /><summary type="html"><![CDATA[Hey, I have joined Unity Technologies as a Senior Software Engineer in the VCS Integrations team, part of DevOps! A significant part of my mission will be to integrate Plastic SCM into other application, starting with the Plastic SCM plugin for Unreal Engine :)]]></summary></entry><entry><title type="html">SQLiteC++ 3.0.0: C++11 is now required</title><link href="https://srombauts.eu/2020/01/31/SQLiteCpp-3.0.0/" rel="alternate" type="text/html" title="SQLiteC++ 3.0.0: C++11 is now required" /><published>2020-01-31T21:00:00+01:00</published><updated>2020-01-31T21:00:00+01:00</updated><id>https://srombauts.eu/2020/01/31/SQLiteCpp-3.0.0</id><content type="html" xml:base="https://srombauts.eu/2020/01/31/SQLiteCpp-3.0.0/"><![CDATA[<p><a href="https://github.com/SRombauts/SQLiteCpp">SQLiteC++</a> 3.0.0 is out. After years of keeping the code compatible with old compilers, C++11 is now required, which lets me drop a lot of conditional code and rely on the standard library.</p>

<p>Highlights:</p>

<ul>
  <li>C++11 is now the minimum, along with CMake 3.1 and Visual Studio 2015.</li>
  <li>Continuous integration moved to GitHub Actions, with Valgrind memcheck added on Travis CI.</li>
  <li><code class="language-plaintext highlighter-rouge">Database::backup()</code> now goes through the <code class="language-plaintext highlighter-rouge">Backup</code> class instead of a separate C implementation.</li>
  <li>Removed <code class="language-plaintext highlighter-rouge">Statement::isOk()</code>, deprecated back in 2.2.0 in favour of <code class="language-plaintext highlighter-rouge">hasRow()</code>.</li>
</ul>

<p>By this point the library had grown well beyond the small wrapper I <a href="/2012/04/04/SQLiteCpp-0.1.0/">started in 2012</a>: it is used in a lot of projects, and it is still maintained today (latest release 3.3.3 in May 2025). Code, documentation and examples on GitHub: <a href="https://github.com/SRombauts/SQLiteCpp">github.com/SRombauts/SQLiteCpp</a>.</p>

<p>Previous milestone: <a href="/2016/07/25/SQLiteCpp-2.0.0/">SQLiteC++ 2.0.0</a>.</p>

<p>edit: <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Written retrospectively in 2026 while documenting the SQLiteC++ milestones. The release and its date are real (see the project <a href="https://github.com/SRombauts/SQLiteCpp/blob/master/CHANGELOG.md">CHANGELOG</a>). <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sébastien Rombauts</name></author><category term="c++" /><category term="github" /><summary type="html"><![CDATA[SQLiteC++ 3.0.0 is out. After years of keeping the code compatible with old compilers, C++11 is now required, which lets me drop a lot of conditional code and rely on the standard library.]]></summary></entry><entry><title type="html">Beta75X 3S Tiny Whoop Quadcopter</title><link href="https://srombauts.eu/2019/07/28/beta75x-3s-whoop-quadcopter/" rel="alternate" type="text/html" title="Beta75X 3S Tiny Whoop Quadcopter" /><published>2019-07-28T00:00:00+02:00</published><updated>2019-07-28T00:00:00+02:00</updated><id>https://srombauts.eu/2019/07/28/beta75x-3s-whoop-quadcopter</id><content type="html" xml:base="https://srombauts.eu/2019/07/28/beta75x-3s-whoop-quadcopter/"><![CDATA[<p>I have always been interested in Radio Controlled cars, planes, and later in this new trend with drones! Not these drones that follow you or use GPS to film or take pictures of the ground; what I enjoy is free flight, acrobatics even! But living near Paris, there really isn’t a good option for these outdoor activities. Until… toothpick and tiny whoop mini drones are becoming a big thing!</p>

<p>I have finally ordered a <a href="https://betafpv.com/products/beta75x-whoop-quadcopter-3s">Beta75X 3S Tiny Whoop quadcopter drone from BetaFPV</a>. I won’t use if with FPV mask or goggles for now, until I know what I would like to do with it. I feel that’s the perfect format for me to start with; it’s usable by a begginer completely indoor, and then it’s also easy to try it outdoor even in very small areas. And finally, with it beeing so small, it’s also something easy to transport for a weekend or vacations, and enjoy anywhere.</p>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/ms1Se7y4E_Y?start=152" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<p>I am posting this to be able to share quickly with friends, and for me to find back all the technical details in no time.</p>

<h2 id="beta75x-3s-tiny-whoop-quadcopter">Beta75X 3S Tiny Whoop Quadcopter</h2>

<ul>
  <li>weight 45.3g</li>
  <li>1103 8000Kv brushless motors</li>
  <li>F4 2-4S AIO 12A Flight Controller (FC)</li>
  <li>Customized EOSV2 Camera, with 25/200mW VTX</li>
  <li>75mm between motors in diagnoal</li>
  <li>I choose the DSMX micro receiver</li>
</ul>

<p><img src="/assets/images/Beta75X-3S-Whoop-Quadcopter.webp" alt="BetaFPV Beta75X Whoop Quadcopter" /></p>

<h2 id="batteries-350mah-2s">Batteries 350mAh 2S</h2>

<ul>
  <li>I am actually starting with <a href="https://betafpv.com/products/350mah-2s-lipo-battery-2pcs">their 2S batteries</a> that should be easier to learn how to fly indoor
    <ul>
      <li>2S 7.4V 35C (70C peak)
        <ul>
          <li>the 8000Kv motors can thus reach ~59k RPM</li>
        </ul>
      </li>
      <li>350mAh</li>
      <li>weight 20g, dimensions 57x16x12mm</li>
      <li>XT30 connector, 20AWG wire</li>
      <li>JST-XH balance lead connector</li>
      <li>Flight time ~4 minutes</li>
    </ul>
  </li>
</ul>

<p><img src="/assets/images/BetaFPV-350mAh-2S-Battery.webp" alt="BetaFPV 350mAh 2S battery" /></p>

<h3 id="batteries-300mah-3s">Batteries 300mAh 3S</h3>

<ul>
  <li>The plan is to upgrade later to <a href="https://betafpv.com/products/300mah-3s-45c-lipo-battery-s-version-2pcs">their 3S batteries</a> to offer much increased power
    <ul>
      <li>3S 11.1V 45C
        <ul>
          <li>the 8000Kv motors can thus reach ~59k RPM</li>
        </ul>
      </li>
      <li>300mAh</li>
      <li>weight 26g</li>
    </ul>
  </li>
</ul>

<h2 id="jumper-t12-plus-radio-controller-and-transmitter">Jumper T12 Plus Radio Controller and Transmitter</h2>

<ul>
  <li><a href="https://www.jumper-rc.com/products/transmitters/t12-plus/">Jumper T12 Plus (hall) black</a></li>
  <li>2.4ghz Multi-Protocol Module, on the JR/FrSKY compatible module bay</li>
  <li>16 channels, 12 actuators:
    <ul>
      <li>4x Hall Effect Gimbals (ch1,2,3,4)</li>
      <li>2x 2-state switches</li>
      <li>4x 3-state switches</li>
      <li>2x aux wheels</li>
    </ul>
  </li>
  <li>Open TX Software</li>
  <li>1.7” LCD screen (tiny)</li>
  <li>Weight: 342g (without battery)</li>
  <li>2S lipo battery, through the JST-XH balance lead connector
    <ul>
      <li>I ordered an Azpro 2s 1000mAh 45C (5C charge)</li>
    </ul>
  </li>
  <li>Simulator mode: 3.5mm standard ppm output or USB HID</li>
</ul>

<p><img src="/assets/images/Jumper-T12-Plus-black.jpg" alt="Jumper T12 Plus (hall) black" /></p>

<h2 id="htrc-t240-duo-lipo-charger">HTRC T240 Duo Lipo Charger</h2>

<ul>
  <li>Dual charger, 1S-6S LiPo batteries (but also LiFe, NiCd, NiMh etc)</li>
  <li>LCD screen, programmable charge rates with memory, battery diagnostics</li>
  <li>240V AC or 12V DC input</li>
</ul>

<p><img src="/assets/images/T240-DUO-Battery-Charger.jpg" alt="T240 Duo Lipo Charger" /></p>

<h2 id="future">Future</h2>

<p>The firmware are open-source, and also configurable and programmable, which is especially important on the flight controller, so I might dig deeper into these.</p>

<p>As for the hardware, I might consider buying a FPV screen/mask to fly arround.
It is possible that I will wait instead for HD digital solution to take over, as the analog old school TV look of it is not my favorite…</p>

<p>I might one day opt for a bigger drone, into the cinewhoop category for example.</p>

<h3 id="rc-planes">RC Planes</h3>

<p>Edit December 2022: the future is there, and I have now built not one, but two RC planes!
See <a href="/2022/11/26/diy-depron-rc-plane/">DIY Depron RC Plane</a>.</p>]]></content><author><name>Sébastien Rombauts</name></author><category term="rc" /><summary type="html"><![CDATA[I have always been interested in Radio Controlled cars, planes, and later in this new trend with drones! Not these drones that follow you or use GPS to film or take pictures of the ground; what I enjoy is free flight, acrobatics even! But living near Paris, there really isn’t a good option for these outdoor activities. Until… toothpick and tiny whoop mini drones are becoming a big thing!]]></summary></entry><entry><title type="html">I Joined Darewise Entertainment!</title><link href="https://srombauts.eu/2018/04/04/I-joined-darewise-entertainment/" rel="alternate" type="text/html" title="I Joined Darewise Entertainment!" /><published>2018-04-04T00:00:00+02:00</published><updated>2018-04-04T00:00:00+02:00</updated><id>https://srombauts.eu/2018/04/04/I-joined-darewise-entertainment</id><content type="html" xml:base="https://srombauts.eu/2018/04/04/I-joined-darewise-entertainment/"><![CDATA[<p>I joined <a href="https://web.archive.org/web/20180105125515/https://www.darewise.com/">Darewise Entertainment</a> as a Senior Software Engineer in the tech team, to develop a new game codenamed <a href="https://www.pcgamer.com/project-c-is-a-sci-fi-mmo-from-thief-and-half-life-2-designers/">Project C</a>. I will be working with <a href="https://www.unrealengine.com/">Unreal Engine 4</a> and <a href="https://web.archive.org/web/20210922103550/https://ims.improbable.io/products/spatialos">SpatialOS</a> multiplayer middleware!</p>

<figure class="">
  <img src="/assets/images/Darewise-Project-C.jpg" alt="Project C key art: a wrecked alien starship in a desert, with the Project C logo" /><figcaption>
      Project C key art from the 2018 reveal (the game was later renamed Life Beyond).

    </figcaption></figure>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Today was my last day at my company, after many (many) years of good and loyal services... Next week I start at @WeDareWise as a senior programmer to work on <a href="https://twitter.com/UnrealEngine?ref_src=twsrc%5Etfw">@UnrealEngine</a> and <a href="https://twitter.com/Improbableio?ref_src=twsrc%5Etfw">@Improbableio</a>&#39;s <a href="https://twitter.com/hashtag/SpatiaOS?src=hash&amp;ref_src=twsrc%5Etfw">#SpatiaOS</a>! <a href="https://twitter.com/hashtag/ue4?src=hash&amp;ref_src=twsrc%5Etfw">#ue4</a> <a href="https://twitter.com/hashtag/dreamjob?src=hash&amp;ref_src=twsrc%5Etfw">#dreamjob</a></p>&mdash; Sébastien Rombauts (@SRombauts) <a href="https://twitter.com/SRombauts/status/979778872928595969?ref_src=twsrc%5Etfw">March 30, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>I had met recently their Technical Director while he was evaluating my <a href="/2016/04/25/unreal-engine-4-11-plastic-scm-source-control-provider/">Plastic SCM plugin for Unreal Engine 4</a> for use by the studio!</p>

<p>edit: <a href="https://www.pcgamer.com/project-c-is-a-sci-fi-mmo-from-thief-and-half-life-2-designers/">Project C</a> was first revealed in March 2018 and renamed <a href="https://www.pcgamer.com/project-c-gets-a-new-name-life-beyond-and-its-first-trailer/">Life Beyond</a> in 2019. Here is Darewise’s reveal trailer:</p>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/rgoZ4czOs38" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>]]></content><author><name>Sébastien Rombauts</name></author><category term="unreal-engine" /><category term="gamedev" /><summary type="html"><![CDATA[I joined Darewise Entertainment as a Senior Software Engineer in the tech team, to develop a new game codenamed Project C. I will be working with Unreal Engine 4 and SpatialOS multiplayer middleware!]]></summary></entry><entry><title type="html">Unreal Engine 4: use Swarm to distribute Lighting build on Local Network</title><link href="https://srombauts.eu/2017/11/10/ue4-use-swarm-distribute-lighting-build-network/" rel="alternate" type="text/html" title="Unreal Engine 4: use Swarm to distribute Lighting build on Local Network" /><published>2017-11-10T00:00:00+01:00</published><updated>2017-11-10T00:00:00+01:00</updated><id>https://srombauts.eu/2017/11/10/ue4-use-swarm-distribute-lighting-build-network</id><content type="html" xml:base="https://srombauts.eu/2017/11/10/ue4-use-swarm-distribute-lighting-build-network/"><![CDATA[<p>This is a quick tutorial on how to install and configure Unreal Engine 4’s Swarm Agent and Coordinator to distribute Lighting build (that is, UE4’s Lightmass’s ray-tracing precomputations, running on the CPU) across a Local Network of 64 bits Windows 10 machines. There are already a few good ressources on the subject, but I had to read through a bunch of them to pick all the needed information.</p>

<p><img src="/assets/images/Unreal-Engine-Building-Lighting.gif" alt="Building lighting..." /></p>

<h2 id="existing-online-documentation">Existing online documentation</h2>

<ol>
  <li><strong>Edit:</strong> There is now a brand new <a href="https://docs.unrealengine.com/en-US/RenderingAndGraphics/Lightmass/UnrealSwarmOverview/">official documentation of  <strong>Unreal Swarm</strong></a>!</li>
  <li>UDK’s documentation <a href="https://docs.unrealengine.com/udk/Three/Swarm.html">Unreal Swarm – Massive Application Distribution for Unreal Engine 3</a> is actually quite good, though not entirely up-to-date</li>
  <li>UE4’s documentation <a href="https://docs.unrealengine.com/latest/INT/Engine/Rendering/LightingAndShadows/Lightmass/">Lightmass Global Illumination</a>
is more high level, and lacking a section on Swarm Settings</li>
  <li><a href="https://iamsparky.wordpress.com/2010/08/24/tutorial-setting-up-swarm-for-multiple-machines/">Brian Goodsell’s Tutorial: Setting Up Swarm for Multiple Machines</a> is very good but slightly out-dated, not saying how to install the Swarm tools</li>
  <li><a href="http://niberspace.com/blog/benchmark-evaluation-of-ue4-distributed-swarm-lightmass-lightmap/">Niberspace’s Is UE4 Distributed Rendering Worth It?</a> gives information on the performances you can expect of it</li>
  <li><a href="https://pkisensee.wordpress.com/2015/11/06/baking-with-swarm/">Baking with Swarm</a> gives a lot of in-details technical information (but far too much)</li>
  <li>Edit: <a href="https://nerivec.github.io/old-ue4-wiki/pages/swarm-agent-troubleshooting.html">Swarm Agent Troubleshooting (wiki)</a> seems to be the source of some of the official documention :)</li>
  <li>Edit: And now, a great Youtube tutorial:</li>
</ol>

<!-- Courtesy of embedresponsively.com //-->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/30AtJT8yoR8" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<h2 id="what-is-swarm">What is Swarm</h2>

<p>The Swarm <strong>Agent</strong> is the process launched in the background (daemon) when you hit “Build Lighting” on your Unreal Engine Editor. That is, it is the application that bake your  lighting in the UE Lightmass. By default it uses your computer’s CPU cores to do so.</p>

<p>The Swarm <strong>Coordinator</strong> is a sibling process that you can launch manually to distribute your Lighting build on multiple Agents across the network.</p>

<h2 id="installation-of-agentcoordinator">Installation of Agent/Coordinator</h2>

<p>Installation on a Windows 7/8/10 64 bits up-to-date is straightforward:</p>

<ol>
  <li>You need the .NET 4.0 framework, which comes by default with any recent version of Windows.</li>
  <li>You should also deactivate the power saving/standby mode on every PC, else it will disable the Swarm Agent on the sleeping machines.</li>
</ol>

<p>Note that this should also work on Linux &amp; macOS with wine.</p>

<p>To install, you can either:</p>

<ol>
  <li>Use existing installation of Unreal Engine on each computers of the network. All versions are cross-compatible so you can distribute your Lightmass work to Swarm Agents of outdated UE4 installation without any problem.</li>
  <li>Or, on computers without UE4, just copy the content of the <strong>Engine/Binaries/DotNET</strong> folder. You don’t need all this files, and no subfolders, but the whole is only a few MB in size. Put this on a fast disk with more than 10 GB free space for Agent cache.</li>
</ol>

<figure class="">
  <img src="/assets/images/Swarm-Files.png" alt="List of files in the DotNet folder" /><figcaption>
      Content of the DotNet folder.

    </figcaption></figure>

<p>You need to choose an always-on machine, like a small/old server to act as the <strong>Swarm Coordinator</strong>. If you don’t have one, you can select any other Agent machine to host the Coordinator, but you should ensure that it stays online all the time you need it! On my use-case, I’ve selected my laptop (named “ASUS-I7”) to be the Coordinator, so that I can use it when away.</p>

<p>Lastly, you should ask the system to auto-start the Swarm Agent (and/or Coordinator on the selected machine) when the user log-in. To do so, put a shortcut to the executable on the Windows Startup folder, which is located here:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Users\x\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
</code></pre></div></div>

<h2 id="swarm-agent-settings">Swarm Agent Settings</h2>

<p>The Coordinator does not really need any settings. You need to accept the Windows Firewall request to let it communicate freely, though!</p>

<p>The Swarm Agent needs to be told how to distribute it’s work. To do that, launch the Swarm Agent if it is not already running, and double-click on it’s small icon hidden on the tray bar:</p>

<p>Go to the “Settings” tab of its UI:</p>
<figure class="">
  <img src="/assets/images/Swarm-Agent-Settings.png" alt="Swarm Agent Settings" /><figcaption>
      Swarm Agent Settings (after full configuration).

    </figcaption></figure>

<p>Here, the only important Settings are (in <strong>bold</strong> those you need to change):</p>

<ul>
  <li>AgentGroupName: Default (is fine)</li>
  <li><strong>AllowedRemoteAgentGroup: Default</strong> (to match, instead of DefaultDeployed)</li>
  <li><strong>AllowedRemoteAgentNames: *</strong> (to match everything, instead of RENDER*)</li>
  <li><strong>CoordinatorRemotingHost: ASUS-I7</strong> (name or IP of the Coordinator computer)</li>
</ul>

<p>Whenever you set the last one, the Coordinator should start to show the new Agent as soon as it connects across the network:</p>

<p><img src="/assets/images/Swarm-Coordinator-Available.png" alt="Swarm Coordinator Available" /></p>

<h2 id="usage">Usage</h2>

<p>Next time you build your lighting on any computer correctly configured, you should get your work distributed across multiple Agents, assuming that:</p>

<ol>
  <li>the Coordinator is up,</li>
  <li>other Agents are running, connected and Available (not Busy, Working, nor Dead),</li>
  <li>and your workload is big enough to distribute (enough mesh to bake lighting onto)</li>
</ol>

<p>At this stage, a look at the local Agent will tell show you the following Status:</p>
<figure class="">
  <img src="/assets/images/Swarm-Agent-Status.png" alt="Swarm Agent Settings" /><figcaption>
      Swarm Agent Status while Working.

    </figcaption></figure>

<p>A look at the Coordinator will tell you the Agent(s) involved in the work:</p>
<figure class="">
  <img src="/assets/images/Swarm-Coordinator-Status.png" alt="Swarm Agent Settings" /><figcaption>
      Swarm Coordinator with Working Agents.

    </figcaption></figure>

<p>I hope this can help, and show how all this is incredibly easy and worthy to setup!</p>]]></content><author><name>Sébastien Rombauts</name></author><category term="unreal-engine" /><category term="tutorial" /><summary type="html"><![CDATA[This is a quick tutorial on how to install and configure Unreal Engine 4’s Swarm Agent and Coordinator to distribute Lighting build (that is, UE4’s Lightmass’s ray-tracing precomputations, running on the CPU) across a Local Network of 64 bits Windows 10 machines. There are already a few good ressources on the subject, but I had to read through a bunch of them to pick all the needed information.]]></summary></entry><entry><title type="html">SQLiteC++ 2.0.0</title><link href="https://srombauts.eu/2016/07/25/SQLiteCpp-2.0.0/" rel="alternate" type="text/html" title="SQLiteC++ 2.0.0" /><published>2016-07-25T21:00:00+02:00</published><updated>2016-07-25T21:00:00+02:00</updated><id>https://srombauts.eu/2016/07/25/SQLiteCpp-2.0.0</id><content type="html" xml:base="https://srombauts.eu/2016/07/25/SQLiteCpp-2.0.0/"><![CDATA[<p><a href="https://github.com/SRombauts/SQLiteCpp">SQLiteC++</a> 2.0.0 is out, a bit over a year after <a href="/2015/05/03/SQLiteCpp-1.0.0/">1.0.0</a>. The major version bump is there because a few APIs changed in incompatible ways, but the interesting part is what changed under the hood.</p>

<p>Highlights:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">sqlite3.h</code> is no longer included from the public headers. The wrapper forward-declares what it needs, so your code can use SQLiteC++ without pulling the SQLite C header into your own include path.</li>
  <li>New <code class="language-plaintext highlighter-rouge">Statement::bindNoCopy()</code> methods that pass <code class="language-plaintext highlighter-rouge">SQLITE_STATIC</code> to SQLite, avoiding an internal copy of the bound string or blob when you can guarantee the buffer outlives the statement.</li>
  <li>Variadic-template <code class="language-plaintext highlighter-rouge">bind()</code> to bind several parameters in a single call.</li>
  <li><code class="language-plaintext highlighter-rouge">Database::VERSION</code> for the SQLiteC++ version known at compile time, plus <code class="language-plaintext highlighter-rouge">getLibVersion()</code> and <code class="language-plaintext highlighter-rouge">getLibVersionNumber()</code> for the SQLite version at runtime.</li>
  <li>Clearer exception messages, a <code class="language-plaintext highlighter-rouge">uint32_t</code> bind with <code class="language-plaintext highlighter-rouge">Column::getUint()</code>, and the bundled SQLite updated to 3.13.</li>
</ul>

<p>Code, documentation and examples on GitHub: <a href="https://github.com/SRombauts/SQLiteCpp">github.com/SRombauts/SQLiteCpp</a>.</p>

<p>edit: the next milestone is <a href="/2020/01/31/SQLiteCpp-3.0.0/">SQLiteC++ 3.0.0</a>.</p>

<p>note: <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Written retrospectively in 2026 while documenting the SQLiteC++ milestones. The release and its date are real (see the project <a href="https://github.com/SRombauts/SQLiteCpp/blob/master/CHANGELOG.md">CHANGELOG</a>). <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Sébastien Rombauts</name></author><category term="c++" /><category term="github" /><summary type="html"><![CDATA[SQLiteC++ 2.0.0 is out, a bit over a year after 1.0.0. The major version bump is there because a few APIs changed in incompatible ways, but the interesting part is what changed under the hood.]]></summary></entry></feed>