<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Nathan&apos;s Notepad - Articles</title>
        <description>Field notes from a software developer</description>
        <link>https://blog.nathanosman.com</link>
        <atom:link href="https://blog.nathanosman.com/feed.xml" rel="self" type="application/rss+xml" />
        
            <item>
                <title>Bluetooth in Snapcast</title>
                <description>&lt;p&gt;One of the things I’ve been experimenting with when building out my smart home is multi-room audio (the ability to play perfectly synchronized audio from multiple devices). Thankfully there is already a mature solution for routing and synchronizing audio: &lt;a href=&quot;https://github.com/snapcast/snapcast&quot;&gt;Snapcast&lt;/a&gt;. The only tricky part is getting audio from various sources and feeding it into the Snapcast server. In this article, we will take a look at Bluetooth audio via &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_Bluetooth_profiles#Advanced_Audio_Distribution_Profile_(A2DP)&quot;&gt;A2DP&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2026/03/28/bluetooth-in-snapcast.html</link>
            </item>
        
            <item>
                <title>An Exhaustive Look at the Portable Executable Format — Part 2 (Imports)</title>
                <description>&lt;p&gt;&lt;em&gt;Note: if you haven’t already read &lt;a href=&quot;/2024/09/15/an-exhaustive-look-at-the-portable-executable-format-part-1.html&quot;&gt;part 1&lt;/a&gt; of the series, I encourage you to quickly read through it before diving into this one. We will be expanding on the example from the article so it helps if you’re at least a little bit familiar with it.&lt;/em&gt;&lt;/p&gt;
</description>
                <pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2025/02/01/an-exhaustive-look-at-the-portable-executable-format-part-2.html</link>
            </item>
        
            <item>
                <title>An Exhaustive Look at the Portable Executable Format — Part 1 (Introduction)</title>
                <description>&lt;p&gt;Today, I’m going to be starting a new series exploring the &lt;a href=&quot;https://en.wikipedia.org/wiki/Portable_Executable&quot;&gt;portable executable&lt;/a&gt; format. I’ve been working a lot with the format lately, so I decided to document my journey in a series of articles. The series will begin with a fairly broad overview of the format and then subsequent articles will begin a deeper dive into the more complex topics — like imports, exports, debug data, exception handling, etc.&lt;/p&gt;
</description>
                <pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2024/09/15/an-exhaustive-look-at-the-portable-executable-format-part-1.html</link>
            </item>
        
            <item>
                <title>Running Windows 98 SE in qemu on Windows</title>
                <description>&lt;p&gt;It has (much to my regret) been several years since I last published something on my blog. This article will hopefully be the first of many more to come in the near future as I find more time to return to writing. I’m writing this article both to act as a reference to others who may be interested in retrocomputing and to serve as a set of notes for myself the next time I need to get a Windows VM up and running in qemu.&lt;/p&gt;
</description>
                <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2024/03/10/running-windows-98-se-in-qemu-on-windows.html</link>
            </item>
        
            <item>
                <title>Using windeployqt with CPack</title>
                <description>&lt;p&gt;Qt is an excellent toolkit for developing cross-platform applications in C++ and CMake/CPack is an excellent build system for C++ applications. The two work very well together and I have used them in a number of projects. Deploying the projects on Windows with CPack, however, requires some extra effort. This article will take a look at my approach to this problem.&lt;/p&gt;
</description>
                <pubDate>Fri, 24 Nov 2017 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2017/11/24/using-windeployqt-with-cpack.html</link>
            </item>
        
            <item>
                <title>A 1 KB Docker Container</title>
                <description>&lt;p&gt;No, that’s not a typo or a joke. I have created a Docker container containing a single Unix executable with no dependencies that occupies less than 1 KB of space on disk. There are no other files included in the container — not even libc.&lt;/p&gt;
</description>
                <pubDate>Thu, 28 Sep 2017 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2017/09/28/a-1-kb-docker-container.html</link>
            </item>
        
            <item>
                <title>Running Everything in Docker</title>
                <description>&lt;p&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; is a great way to run web applications and services in a container. With Docker, each container is isolated from the host which encourages composability and greatly improves security. In this article, I will describe how I prepared a number of services to run in Docker on one of my servers.&lt;/p&gt;
</description>
                <pubDate>Wed, 23 Aug 2017 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2017/08/23/running-everything-in-docker.html</link>
            </item>
        
            <item>
                <title>Building and Running Go Apps in Docker</title>
                <description>&lt;p&gt;With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CGO_ENABLED=0&lt;/code&gt; set, the Go compiler produces binaries with no runtime dependencies, not even libc. This greatly simplifies deploying the application in Docker since no base image is required. However, there are a few caveats and pitfalls that I would like to address in this article.&lt;/p&gt;
</description>
                <pubDate>Tue, 18 Jul 2017 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2017/07/18/building-and-running-go-apps-in-docker.html</link>
            </item>
        
            <item>
                <title>Building a Thermometer with an Arduino</title>
                <description>&lt;p&gt;In an attempt to better understand the effect of temperature and humidity in weather forecasting, I decided to build a small thermometer with an Arduino and a temperature sensor. In a future article, I will explore some of the data that I capture and the software that analyzes the data. This article will focus on the thermometer.&lt;/p&gt;
</description>
                <pubDate>Fri, 28 Apr 2017 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2017/04/28/building-a-thermometer-with-an-arduino.html</link>
            </item>
        
            <item>
                <title>Running Debian 0.91 in qemu</title>
                <description>&lt;p&gt;Yes, you read that right. In this article, I am going to detail the process of getting Debian 0.91 up and running in qemu on an Ubuntu 16.04 host. The adventure promises to be a fun one since Debian 0.91 was released in… 1994.&lt;/p&gt;
</description>
                <pubDate>Tue, 23 Aug 2016 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2016/08/23/running-debian-0-91-in-qemu.html</link>
            </item>
        
            <item>
                <title>Why I Stopped Buying Nexus Phones</title>
                <description>&lt;p&gt;I have always been a big fan of the Nexus product line. I first wrote about the Nexus 5 &lt;a href=&quot;/2014/01/30/nexus-5-a-review.html&quot;&gt;back in January of 2014&lt;/a&gt;. It was a truly excellent phone. When the Nexus 6 was released, I grabbed one of those as well and thoroughly enjoyed the increased screen size and turbo charge. That would prove to be the last Nexus phone I purchased.&lt;/p&gt;
</description>
                <pubDate>Fri, 01 Jul 2016 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2016/07/01/why-i-stopped-buying-nexus-phones.html</link>
            </item>
        
            <item>
                <title>Icon Themes</title>
                <description>&lt;p&gt;One of the most confusing aspects of packaging applications on Linux continues to be icon themes. Despite the simplicity of the original concept, getting your application’s icon to display correctly in a broad range of desktop environments continues to challenge even the best of programmers.&lt;/p&gt;
</description>
                <pubDate>Sun, 27 Mar 2016 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2016/03/27/icon-themes.html</link>
            </item>
        
            <item>
                <title>Building Packages in Raspbian with sbuild</title>
                <description>&lt;p&gt;Getting &lt;a href=&quot;https://wiki.debian.org/sbuild&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbuild&lt;/code&gt;&lt;/a&gt; up and running in Raspbian can be a tricky process. This article will describe the process from start to finish.&lt;/p&gt;
</description>
                <pubDate>Sat, 21 Nov 2015 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2015/11/21/building-packages-in-raspbian-with-sbuild.html</link>
            </item>
        
            <item>
                <title>Benchmarking Brotli</title>
                <description>&lt;p&gt;&lt;a href=&quot;https://github.com/google/brotli/&quot;&gt;Brotli&lt;/a&gt; is a new compression algorithm being introduced by Google. It’s gaining traction very quickly - there’s an &lt;a href=&quot;https://www.ietf.org/id/draft-alakuijala-brotli-05.txt&quot;&gt;IETF draft proposal&lt;/a&gt; for the data format. There are even plans to include Brotli as an accepted &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Encoding&lt;/code&gt; in Firefox 44:&lt;/p&gt;
</description>
                <pubDate>Tue, 22 Sep 2015 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2015/09/22/benchmarking-brotli.html</link>
            </item>
        
            <item>
                <title>Non-blocking Channels in Go</title>
                <description>&lt;p&gt;One of the latest projects I’ve been working on is a &lt;a href=&quot;https://github.com/hectane/hectane&quot;&gt;simple SMTP client&lt;/a&gt; written in Go. I’ve really enjoyed developing applications in Go since it provides concurrency primitives out-of-the-box. In this article, I’m going to describe a technique for sending any number of values on a channel without having the send block.&lt;/p&gt;
</description>
                <pubDate>Sun, 13 Sep 2015 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2015/09/13/non-blocking-channels-in-go.html</link>
            </item>
        
            <item>
                <title>BuildBot in Docker on a Raspberry Pi 2</title>
                <description>&lt;p&gt;In a &lt;a href=&quot;/2015/06/04/using-visual-c-express-with-buildbot.html&quot;&gt;previous article&lt;/a&gt;, I took a look at setting up a BuildBot slave on Windows. Today, I’m going to describe the process of creating a BuildBot slave for a &lt;a href=&quot;https://www.raspberrypi.org/products/raspberry-pi-2-model-b/&quot;&gt;Raspberry Pi 2&lt;/a&gt;. The easiest way to do this is by setting up the BuildBot slave as a &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; container.&lt;/p&gt;
</description>
                <pubDate>Fri, 05 Jun 2015 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2015/06/05/buildbot-in-docker-on-a-raspberry-pi-2.html</link>
            </item>
        
            <item>
                <title>Using Visual C++ Express with BuildBot</title>
                <description>&lt;p&gt;I recently began setting up &lt;a href=&quot;https://buildbot.quickmediasolutions.com/&quot;&gt;a small build farm&lt;/a&gt; for &lt;a href=&quot;https://github.com/nitroshare/qhttpengine&quot;&gt;a Qt library&lt;/a&gt; I was working on. Due to the nature of the library, it was important that the test suite run on as many different platforms and compilers as possible. After some research, I came to the conclusion that &lt;a href=&quot;http://buildbot.net/&quot;&gt;BuildBot&lt;/a&gt; was the ideal tool for the job.&lt;/p&gt;
</description>
                <pubDate>Thu, 04 Jun 2015 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2015/06/04/using-visual-c-express-with-buildbot.html</link>
            </item>
        
            <item>
                <title>Nexus 5 - A Review</title>
                <description>&lt;p&gt;Phew - it’s been a number of months since my last article. I have been extremely busy with all manner of different projects, including a new Firefox add-on named &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/rest-easy/&quot;&gt;REST Easy&lt;/a&gt;. I apologize for not writing sooner, but you would be surprised at how easy it is to get neck-deep in code for weeks on end. (Then again, you might &lt;em&gt;not&lt;/em&gt; be surprised.)&lt;/p&gt;
</description>
                <pubDate>Thu, 30 Jan 2014 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2014/01/30/nexus-5-a-review.html</link>
            </item>
        
            <item>
                <title>Writing Secure Server Applications with Qt</title>
                <description>&lt;p&gt;Qt is an excellent framework for developing cross-platform console and GUI applications. I have used the toolkit for developing a number of applications which are listed here on my website. I recently found myself faced with the task of developing a TCP server application which communicated with a set of clients in a secure fashion. Rather than reinventing the wheel, I decided to make use of Qt’s own SSL classes (&lt;a href=&quot;http://doc.qt.io/qt-4.8/qsslsocket.html&quot;&gt;QSslSocket&lt;/a&gt; for instance).&lt;/p&gt;
</description>
                <pubDate>Tue, 18 Sep 2012 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2012/09/18/writing-secure-server-applications-with-qt.html</link>
            </item>
        
            <item>
                <title>Using the Unity Web API</title>
                <description>&lt;p&gt;One of the exciting new features scheduled to be included in Ubuntu 12.10 (Quantal Quetzal) is the introduction of Web Apps. These consist of a UserScript that bridges the gap between the JavaScript code on the page and the user’s desktop. For example, a script written for Gmail might display a desktop notification when a new message arrives in the user’s inbox. Or perhaps a script written for MySpace would make use of the desktop media player interface to display Title / Artist / Track information for currently playing music.&lt;/p&gt;
</description>
                <pubDate>Sat, 21 Jul 2012 00:00:00 +0000</pubDate>
                <link>https://blog.nathanosman.com/2012/07/21/using-the-unity-web-api.html</link>
            </item>
        
    </channel>
</rss>
