<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering notes, shipped in public on Riccardo Dal Fiume</title><link>https://dalfiume.io/</link><description>Recent content in Engineering notes, shipped in public on Riccardo Dal Fiume</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 RICCARDO DAL FIUME / DALFIUME.IO</copyright><lastBuildDate>Fri, 15 Oct 2021 10:00:00 +0200</lastBuildDate><atom:link href="https://dalfiume.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Sky-High Data: Architecting a Mechatronic System for Environmental UAVs</title><link>https://dalfiume.io/posts/uav-environmental-sampling/</link><pubDate>Fri, 15 Oct 2021 10:00:00 +0200</pubDate><guid>https://dalfiume.io/posts/uav-environmental-sampling/</guid><description>&lt;p&gt;Environmental monitoring is changing rapidly with unmanned aerial vehicles (UAVs). I worked on a specialized amphibious UAV platform built for georeferenced water sampling and real-time chemical analysis in rivers and open basins. The mechatronics, airframe, and much of the onboard electronics were developed by others; my contribution was focused on ground-side software and on how the embedded stack should be structured.&lt;/p&gt;

&lt;h2 class="relative group"&gt;The Amphibious Mechatronic Challenge
 &lt;div id="the-amphibious-mechatronic-challenge" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-amphibious-mechatronic-challenge" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Unlike camera-only drones, this UAV had to land on water, operate against river currents up to 2 m/s, and interact with the environment physically.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://dalfiume.io/posts/uav-environmental-sampling/images/drone.png"/></item><item><title>Extract timesheet from iCal</title><link>https://dalfiume.io/posts/extract-timesheet-from-ical/</link><pubDate>Mon, 20 Sep 2021 12:00:59 +0200</pubDate><guid>https://dalfiume.io/posts/extract-timesheet-from-ical/</guid><description>&lt;p&gt;Consulting and project work often live in the calendar first: blocks for clients, meetings, and focus time. Turning that into a &lt;strong&gt;timesheet&lt;/strong&gt; or a billing summary usually means retyping or awkward copy-paste from Google Calendar, Outlook, or Apple Calendar into a spreadsheet. Exporting &lt;strong&gt;iCalendar&lt;/strong&gt; (&lt;code&gt;.ics&lt;/code&gt;) is built into most of those products; the missing piece is a lightweight way to &lt;strong&gt;reshape&lt;/strong&gt; that export into tabular data you can sum and attach to an invoice.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://dalfiume.io/posts/extract-timesheet-from-ical/images/statistics.png"/></item><item><title>GitLab CI/CD pipeline for Keil uVision</title><link>https://dalfiume.io/posts/gitlab-ci-cd-pipeline-for-keil-uvision/</link><pubDate>Sun, 19 Sep 2021 21:32:59 +0200</pubDate><guid>https://dalfiume.io/posts/gitlab-ci-cd-pipeline-for-keil-uvision/</guid><description>&lt;p&gt;This is a practical setup I use to build Keil uVision projects automatically with &lt;a href="https://docs.gitlab.com/ee/ci/" target="_blank" rel="noreferrer"&gt;GitLab CI/CD&lt;/a&gt;.&lt;br&gt;
The goal is simple: every commit should produce a reproducible firmware build, with logs and binaries attached as artifacts.&lt;/p&gt;
&lt;p&gt;If you work on embedded systems, this gives you fast feedback on broken builds and avoids &amp;ldquo;works on my machine&amp;rdquo; problems.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Prerequisites
 &lt;div id="prerequisites" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#prerequisites" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Before creating the pipeline, ensure:&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://dalfiume.io/posts/gitlab-ci-cd-pipeline-for-keil-uvision/images/cpu-board.png"/></item><item><title>Riccardo Dal Fiume</title><link>https://dalfiume.io/contacts/riccardodalfiume/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dalfiume.io/contacts/riccardodalfiume/</guid><description>&lt;section class="bm-contacts-page" aria-label="Contacts" data-nosnippet&gt;
 &lt;div class="bm-block"&gt;
 &lt;a class="bm-cli-link" href="https://dalfiume.io/contacts/"&gt;Back to contacts&lt;/a&gt;
 &lt;/div&gt;

 &lt;header class="bm-block bm-contacts-hero"&gt;
 &lt;div class="bm-contacts-summary"&gt;
 &lt;p class="bm-kicker"&gt;CONTACTS&lt;/p&gt;
 &lt;h2 class="bm-contacts-person"&gt;Riccardo Dal Fiume&lt;/h2&gt;
 &lt;p class="meta"&gt;Use this page to save my contact card or reach out directly.&lt;/p&gt;
 &lt;/div&gt;
 &lt;img
 class="bm-contacts-hero-thumb"
 src="https://dalfiume.io/contacts/riccardodalfiume/headshot_bn.png"
 alt="Riccardo Dal Fiume portrait"
 loading="lazy"
 decoding="async"
 /&gt;
 &lt;/header&gt;

 &lt;section class="bm-block" aria-label="Contact channels"&gt;
 &lt;p class="bm-kicker"&gt;Contact&lt;/p&gt;
 &lt;dl class="bm-contacts-table"&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;Mobile&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;&lt;a href="tel:+393385390822"&gt;+39 338 5390822&lt;/a&gt;&lt;/dd&gt;
 &lt;/div&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;Website&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;&lt;a href="https://dalfiume.io"&gt;dalfiume.io&lt;/a&gt;&lt;/dd&gt;
 &lt;/div&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;Email&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;
 &lt;button type="button" class="bm-expertise-reveal" data-email-b64="cmljY2FyZG9AZGFsZml1bWUuaW8="&gt;Reveal&lt;/button&gt;
 &lt;a class="bm-expertise-contact-email bm-hidden" href="#" rel="nofollow noopener noreferrer"&gt;&lt;/a&gt;
 &lt;/dd&gt;
 &lt;/div&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;PEC&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;
 &lt;button type="button" class="bm-expertise-reveal" data-email-b64="cmljY2FyZG9kYWxmaXVtZUBwZWMuaXQ="&gt;Reveal&lt;/button&gt;
 &lt;a class="bm-expertise-contact-email bm-hidden" href="#" rel="nofollow noopener noreferrer"&gt;&lt;/a&gt;
 &lt;/dd&gt;
 &lt;/div&gt;
 &lt;/dl&gt;

 &lt;div class="bm-block bm-contacts-download"&gt;
 &lt;a class="bm-cli-link" href="https://dalfiume.io/contacts/riccardodalfiume/riccardo-dal-fiume.vcf" rel="nofollow"&gt;
 Download contact (.vcf)
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;/section&gt;

 &lt;section class="bm-block" aria-label="Billing details"&gt;
 &lt;p class="bm-kicker"&gt;Billing details&lt;/p&gt;
 &lt;dl class="bm-contacts-table"&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;P.IVA&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;IT03186761205&lt;/dd&gt;
 &lt;/div&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;CF&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;DLFRCR91P08C265K&lt;/dd&gt;
 &lt;/div&gt;
 &lt;div class="bm-contacts-row"&gt;
 &lt;dt class="bm-contacts-label"&gt;SDI&lt;/dt&gt;
 &lt;dd class="bm-contacts-value"&gt;M5UXCR1&lt;/dd&gt;
 &lt;/div&gt;
 &lt;/dl&gt;
 &lt;/section&gt;
&lt;/section&gt;

&lt;script&gt;
 document.addEventListener("DOMContentLoaded", function () {
 document.querySelectorAll(".bm-expertise-reveal").forEach(function (button) {
 button.addEventListener("click", function () {
 try {
 var encoded = button.getAttribute("data-email-b64");
 var email = window.atob(encoded || "");
 if (!email) return;
 var container = button.parentElement;
 var link = container.querySelector(".bm-expertise-contact-email");
 link.textContent = email;
 link.setAttribute("href", "mailto:" + email);
 link.classList.remove("bm-hidden");
 button.classList.add("bm-hidden");
 } catch (_err) {}
 });
 });
 });
&lt;/script&gt;</description></item></channel></rss>