<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dayio.dev</title><link>https://dayio.dev/</link><description>Recent content on Dayio.dev</description><generator>Hugo</generator><language>en-us</language><copyright>© Dayio</copyright><lastBuildDate>Sun, 17 May 2026 11:15:03 +0200</lastBuildDate><atom:link href="https://dayio.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Decoding GPS signal with GO (part 3)</title><link>https://dayio.dev/posts/decoding-gps-signals-with-go-part-3/</link><pubDate>Sun, 17 May 2026 11:15:03 +0200</pubDate><guid>https://dayio.dev/posts/decoding-gps-signals-with-go-part-3/</guid><description>&lt;p&gt;In the last article, we saw how to catch the satellite’s signal using our gold codes and some trickery to handle their movements in the sky using Doppler compensation and phase shifting. However, this comes at a cost. It&amp;rsquo;s slow as hell. And we need to improve this if we want to decode our packets fast.&lt;/p&gt;
&lt;h2 id="the-need-for-speed-acquisition-optimization"&gt;The Need for Speed (Acquisition Optimization)&lt;/h2&gt;
&lt;p&gt;First, let&amp;rsquo;s benchmark the first version:&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-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Now&lt;/span&gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &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; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prn&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;prn&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;prn&lt;/span&gt;&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 style="color:#a6e22e"&gt;bestPhase&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;bestDoppler&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;snr&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gps&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Acquire&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;outputComplex&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;prn&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;sampleRate&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&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; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Processing took %v\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Since&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;now&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;/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;$ make run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go build -o bin/gps-decoder cmd/gps-decoder/main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./bin/gps-decoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Satellite PRN &lt;span style="color:#ae81ff"&gt;05&lt;/span&gt; found ! Phase: &lt;span style="color:#ae81ff"&gt;792&lt;/span&gt; | Doppler: -5000.00 | SNR: 8.71
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Satellite PRN &lt;span style="color:#ae81ff"&gt;14&lt;/span&gt; found ! Phase: &lt;span style="color:#ae81ff"&gt;636&lt;/span&gt; | Doppler: -2000.00 | SNR: 12.41
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Satellite PRN &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; found ! Phase: &lt;span style="color:#ae81ff"&gt;587&lt;/span&gt; | Doppler: 4000.00 | SNR: 11.78
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Satellite PRN &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; found ! Phase: &lt;span style="color:#ae81ff"&gt;906&lt;/span&gt; | Doppler: 0.00 | SNR: 16.16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Satellite PRN &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt; found ! Phase: &lt;span style="color:#ae81ff"&gt;1140&lt;/span&gt; | Doppler: 0.00 | SNR: 13.52
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Satellite PRN &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; found ! Phase: &lt;span style="color:#ae81ff"&gt;1168&lt;/span&gt; | Doppler: 5000.00 | SNR: 8.11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Processing took 52.352300506s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="goroutines-to-the-rescue"&gt;Goroutines to the rescue&lt;/h3&gt;
&lt;p&gt;Alright, 52 seconds on an AMD Ryzen 7 PRO 6850U with 8 cores and 16 threads is slow. So now we will run the acquire method concurrently. To do so, we will define a struct for our acquisition data and then distribute them on a channel for later use. This way, we will use all of our cores.&lt;/p&gt;</description></item><item><title>Decoding GPS signal with GO (part 2)</title><link>https://dayio.dev/posts/decoding-gps-signals-with-go-part-2/</link><pubDate>Sat, 09 May 2026 16:12:12 +0800</pubDate><guid>https://dayio.dev/posts/decoding-gps-signals-with-go-part-2/</guid><description>&lt;p&gt;I&amp;rsquo;ve started by analyzing what I&amp;rsquo;ll use and not use, for my personal enrichment I don&amp;rsquo;t want to use a GPS or a library that will do it all for me and play Lego bricks.&lt;/p&gt;
&lt;p&gt;First of all, we need a structure for our project and a pretty Makefile to help us automate some things&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gps-decoder/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── bin/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── cmd/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── gps-decoder/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── data/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── internal/ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── dsp/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── gps/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── go.mod
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── LICENSE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Makefile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── README.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ll split the DSP (Digital Signal Processing) and GPS processing in separate folders as the I/Q Signal can be used without GPS and vice versa.&lt;/p&gt;</description></item><item><title>Decoding GPS signal with GO (part 1)</title><link>https://dayio.dev/posts/decoding-gps-signals-with-go-part-1/</link><pubDate>Mon, 27 Apr 2026 13:48:32 +0200</pubDate><guid>https://dayio.dev/posts/decoding-gps-signals-with-go-part-1/</guid><description>&lt;p&gt;&lt;em&gt;Disclaimer: I&amp;rsquo;m not a spatial engineer and I&amp;rsquo;m learning as write this article, I have notions of linear Algebra that&amp;rsquo;s it&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="introduction-the-gps-geometry-paradox"&gt;Introduction: The GPS Geometry Paradox&lt;/h2&gt;
&lt;p&gt;I was out for a run yesterday, and looking down at my Garmin watch, I wondered how can a device this small pinpoint my exact location, pace and elevation so precisely ?&lt;/p&gt;
&lt;p&gt;I looked into how the Global Positioning System (GPS) works, and the underlying concept is pretty clever. In pure theory, you only need signals from three satellites to calculate a 2D position (latitude and longitude). One satellite gives you the current time, two give you a line of position and with three, by measuring the tiny differences in the arrival times of their radio signals, you can estimate your exact position on Earth.&lt;/p&gt;</description></item><item><title>No More Coding Games</title><link>https://dayio.dev/posts/no-more-coding-games/</link><pubDate>Fri, 10 Apr 2026 14:24:03 +0200</pubDate><guid>https://dayio.dev/posts/no-more-coding-games/</guid><description>&lt;p&gt;I love solving complex problems. Genuinely. Whether it&amp;rsquo;s architecting a backend capable of handling massive loads, debugging a failed cluster, or dumping a hardware EEPROM to read the firmware. Put me in front of a technical wall, and I&amp;rsquo;ll find a way through, over, or under it.&lt;/p&gt;
&lt;p&gt;But over the years, I&amp;rsquo;ve developed a severe fatigue for the bureaucracy polluting our industry. What we call &amp;ldquo;Tech&amp;rdquo; today too often morphs into an assembly line where micromanagement replaces an engineer&amp;rsquo;s common sense.&lt;/p&gt;</description></item><item><title>Fixing Logitech M575 Glitch</title><link>https://dayio.dev/posts/fixing-logitech-m575-glitch/</link><pubDate>Tue, 07 Apr 2026 15:10:00 +0200</pubDate><guid>https://dayio.dev/posts/fixing-logitech-m575-glitch/</guid><description>&lt;p&gt;I use a Logitech M575 as my main cursor device because a trackball is far more comfortable to use and does not hurt the carpal tunnel at all, switching from a mouse to a trackball completely stopped the pain. It takes around one or two days to adapt. However, after its only benefits, you can use your &amp;ldquo;mouse&amp;rdquo; on any surface (plane, bed, &amp;hellip;), don&amp;rsquo;t need a lot of space, it&amp;rsquo;s close to the keyboard and does not move so no useless movements, etc&amp;hellip;&lt;/p&gt;</description></item><item><title>Why Docker Swarm is still My Go-To in 2026</title><link>https://dayio.dev/posts/why-docker-swarm-is-still-my-go-to-in-2026/</link><pubDate>Tue, 17 Feb 2026 22:49:15 +0200</pubDate><guid>https://dayio.dev/posts/why-docker-swarm-is-still-my-go-to-in-2026/</guid><description>&lt;p&gt;I still remember the early days of containerization. Back then, I deployed a DC/OS cluster for production apps with Marathon, all running on top of Mesos. Kubernetes already existed, but it was incredibly complex for my needs and too hard to set up.&lt;/p&gt;
&lt;p&gt;I followed the trends and the evolution of K8s for a long time. I wrote manifests for all my apps, set up CD pipelines with ArgoCD and FluxCD (why not both ?), and tested managed K8s with autoscaling. But something just felt off. I’m a &amp;ldquo;simple&amp;rdquo; backend engineer who does a lot of sysadmin and DevOps work, and Kubernetes simply felt like overkill.&lt;/p&gt;</description></item><item><title>About</title><link>https://dayio.dev/about/</link><pubDate>Fri, 23 Jan 2026 10:34:12 +0200</pubDate><guid>https://dayio.dev/about/</guid><description>&lt;p&gt;I don’t fit into a specific &amp;ldquo;Developer&amp;rdquo; or &amp;ldquo;Ops&amp;rdquo; bucket. I build entire ecosystems from the ground up, from the physical layer to the application logic.&lt;/p&gt;
&lt;p&gt;For me, engineering is about connecting the dots across the entire stack. I’m just as comfortable wiring an industrial warehouse with 500m of cable and dozens of Wi-Fi APs as I am architecting the multi-tenant WMS and E-commerce platform that runs on top of it and managing it&amp;rsquo;s cloud infrastructure.&lt;/p&gt;</description></item></channel></rss>