<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>James Grogan</title>
    <link>https://jmsgrogan.com/</link>
    <description>James Grogan</description>
    <item>
      <title>Down in the Pi-hole</title>
      <link>https://jmsgrogan.com/blogs/technical/down_in_the_pihole.html</link>
      <guid>https://jmsgrogan.com/blogs/technical/down_in_the_pihole.html</guid>
      <pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="post">
<header class="post-header">
<h1>Down in the Pi-hole</h1>
<time datetime="2026-03-28">2026-03-28</time>
</header>

<p>A couple of months ago I made the ill-fated decision to upgrade my pi-hole from version 5 to 6. Since then, my local DNS resolution has stopped working on devices other than the Pi.</p>
<p>Searching online didn't show up much - the odd forum post where someone changes a seemingly arbitrary setting and things magically work for them. Not so satisfying. So, I figure why not take a deeper dive into how the pi-hole works.</p>
<p>First, the problem. If I run <code>dig blah.home @&lt;pi address&gt;</code> on my laptop I get a timeout error on <code>pi-address#53</code>, where <code>blah.home</code> is in my list of custom DNS entries in the pihole admin page. If I run it on my Pi then it resolves the IPV4 address just fine. Looking at pihole's logs, in both cases the custom DNS file is consulted and the address is found for the A record. On the Pi a AAAA record is also checked. Now, you may say...firewall! Which would be reasonable except external addresses are resolving just fine on that port, as well as CNAME entries.</p>
<p>So what is going on? Well pi-hole serves DNS queries using its FTL server, which is a fork of <code>dnsmasq</code>. So first stop is figuring out how that works. You can enable packet dumping but my pcap game is not strong and I figure looking at packets won't be enough to tell me what exactly is going on.</p>
<p>I already had <code>dnsmasq</code> installed on the Pi and launched it with:</p>
<div class="highlight"><pre><span></span>dnsmasq<span class="w"> </span>-h<span class="w"> </span>-d<span class="w"> </span>-q<span class="w"> </span>-p<span class="w"> </span><span class="m">5353</span><span class="w"> </span>-A<span class="w"> </span>/domain.name/192.168.0.10
</pre></div>
<p>Here <code>-A</code> is a custom name-address mapping and <code>-h d -q</code> enable 'no-hosts mode', 'no-daemon mode' and 'log query mode' respectively.</p>
<p>On the client side if I then run:</p>
<div class="highlight"><pre><span></span>dig<span class="w"> </span>domain.name<span class="w"> </span>@192.168.0.10<span class="w"> </span>-p<span class="w"> </span><span class="m">5353</span>
</pre></div>
<p>I get on the server:</p>
<div class="highlight"><pre><span></span>dnsmasq: query[A] grafana.home from 192.168.0.74
dnsmasq: config grafana.home is 192.168.0.10
</pre></div>
<p>and on the client:</p>
<div class="highlight"><pre><span></span>;; QUESTION SECTION:
;grafana.home.			IN	A

;; ANSWER SECTION:
grafana.home.		0	IN	A	192.168.0.10

;; Query time: 7 msec
;; SERVER: 192.168.0.10#5353(192.168.0.10) (UDP)
</pre></div>
<p>All as expected. If I try the same with my Pi I get:</p>
<div class="highlight"><pre><span></span>;; communications error to 192.168.0.10#53: timed out
;; communications error to 192.168.0.10#53: timed out
;; communications error to 192.168.0.10#53: timed out

; &lt;&lt;&gt;&gt; DiG 9.19.24 &lt;&lt;&gt;&gt; navidrome.home @192.168.0.10 -p53
;; global options: +cmd
;; no servers could be reached
</pre></div>
<p>What gives here? I should at least see some sort of resolution error somewhere - rather than a refusal to respond at all.</p>
<p>Since there isn't much to go on in the logs let's see if we can build FTL and poke around - following: https://docs.pi-hole.net/ftldns/compile/. I had some trouble building mbdtls due to a seemingly defective archive download link - but otherwise this went fine.</p>
<p>Now we can run directly against the FTL development version:</p>
<div class="highlight"><pre><span></span>sudo<span class="w"> </span>service<span class="w"> </span>pihole-FTL<span class="w"> </span>stop
sudo<span class="w"> </span>pihole-FTL<span class="w"> </span>debug
</pre></div>
<p>Some extra logging revealed that the wrapped dnsmasq version was indeed trying to send a message via its <code>sndmsg</code> call. So - time to take a look at some packets after all. Using <code>tcpdump</code> on the pi and my laptop, e.g.:</p>
<div class="highlight"><pre><span></span>sudo<span class="w"> </span>tcpdump<span class="w"> </span>-i<span class="w"> </span>wlp2s0<span class="w"> </span>host<span class="w"> </span><span class="m">192</span>.168.0.10<span class="w"> </span>and<span class="w"> </span>port<span class="w"> </span><span class="m">53</span>
</pre></div>
<p>I could see the Pi sending a response back to the A record request - but that there was no response coming on the laptop.</p>
<div class="highlight"><pre><span></span>15:37:04.236194 IP rex.local.42138 &gt; raspberrypi.domain: 33845+ [1au] A? navidrome.home. (55)
15:37:04.319626 IP rex.local.34406 &gt; raspberrypi.domain: 64344+ PTR? 10.0.168.192.in-addr.arpa. (43)
15:37:04.327971 IP raspberrypi.domain &gt; rex.local.34406: 64344* 1/0/0 PTR raspberrypi. (68)
15:37:09.238439 IP rex.local.41264 &gt; raspberrypi.domain: 33845+ [1au] A? navidrome.home. (55)
15:37:14.244129 IP rex.local.34274 &gt; raspberrypi.domain: 33845+ [1au] A? navidrome.home. (55)
15:37:19.328530 IP rex.local.46479 &gt; raspberrypi.domain: 61373+ PTR? 10.0.168.192.in-addr.arpa. (43)
15:37:19.351417 IP raspberrypi.domain &gt; rex.local.46479: 61373* 1/0/0 PTR raspberrypi. (68)
</pre></div>
<div class="highlight"><pre><span></span>15:39:54.619470 IP raspberrypi.domain &gt; rex.59592: 51011* 1/0/1 A 192.168.0.10 (59)
15:39:59.622195 IP rex.36985 &gt; raspberrypi.domain: 51011+ [1au] A? navidrome.home. (55)
15:39:59.622504 IP raspberrypi.domain &gt; rex.36985: 51011* 1/0/1 A 192.168.0.10 (59)
15:40:04.627099 IP rex.51835 &gt; raspberrypi.domain: 51011+ [1au] A? navidrome.home. (55)
</pre></div>
</article>
]]></description>
    </item>
    <item>
      <title>End of Year Recap 2025</title>
      <link>https://jmsgrogan.com/blogs/technical/end_of_year_recap_2025.html</link>
      <guid>https://jmsgrogan.com/blogs/technical/end_of_year_recap_2025.html</guid>
      <pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="post">
<header class="post-header">
<h1>End of Year Recap 2025</h1>
<time datetime="2025-12-22">2025-12-22</time>
</header>

<p>This is the second year of my 'end of year recaps', this time for 2025.</p>
<p>As a high-level summary of the year, I didn't make the progress I'd hoped for in my 2025 goals, owing to a combination of increased professional workload and some health issues.</p>
<p>The increased professional workload was 'ok', in the sense that a lot of it involved building interesting things and learning new technologies. In particular:</p>
<ul>
<li>I was involved in setting up a new 'platform engineering' team - which has involved a lot of mentoring, process development and design and build of some foundational tooling.</li>
<li>My main work project involves building a collaboration portal including elements for project proposal review and data sharing. We didn't have a template for building something like this at my employer so a lot of things have had to be set up from scratch</li>
<li>I tried to continue tipping along with several smaller work projects, including in quantum computing, environmental science and machine learning</li>
</ul>
<p>Of course, I had some new goals and toys to add to my existing 2024 ones, in particular Linux mobile, I picked up a OnePlus 6 and am running PostmarketOs on it.</p>
<p>My goals for 2025 still carry over many of my unfinished ones from 2024, but there is a gradual convergence toward a coherent set of projects I want to take on. Namely building my own tooling for:</p>
<ul>
<li>blogging (like every developer on the planet)</li>
<li>music and video cataloging and playing - Navidrome is nice but doesn't do everything I want as a single service</li>
<li>photo cataloging - again, Immich is great but the rate of change and feature addition is getting a bit overwhelming for me. I like to have control!</li>
<li>family tree (building the tech and collecting the data) - this is a new project and one I'd really like to make a dent in</li>
<li>Contact and calendar management - including learning CalDav - Nextcloud is just too complex and  enterprise focused for what I want</li>
<li>File management - including WebDav. Again, Nextcloud is great for something enterprisey but I'd like to really understand and control my stack.</li>
</ul>
<p>So - this is a lot of new projects, some of which also need clients if I want to consume them on my Linux phone. One silver lining is that I've been building up a 'reusable' set of components on my work projects - which are open-source. So my plan is to focus on getting core functionality for these projects together using Django and Angular. Really I'd like something lighter and more exotic than these frameworks in the long term - but to make progress I need to reuse the stack I've invested a lot of time in in the last year.</p>
<p>The next big question is around infrastructure. Next year I'm going to need to upskill in Kubernetes and Ansible at work. I could, and probably should, use them for my side projects. However I still really want to play with more niche and maybe forward-looking tooling in my side-projects - particularly Guix and the LISP ecosystem. So I'll probably try to define and run the infrastructure and services I'm using in Guix at some point during the year, maybe not exactly at the start. This has the added bonus of having a clear impetus to learn Emacs LISP and really get my IDE set up the way I want, which isn't something I've achieved so far.</p>
<p>On the non-technical side I hope to make more progress in the veggie-patch. I grew some veggies in 2025 but my mobility limited what could be done. I'm hoping to add a couple of new raised boxes in 2026 and grow a bit more.</p>
<p>So here's my technical stack and roadmap plans for 2026:</p>
<ul>
<li>Blogging platform - Django and Angular</li>
<li>Switch from Navidrome to a custom built multi-media tool</li>
<li>Switch from Immich to a custom photo management tool</li>
<li>Switch from Nextcloud to custom contact, calendar and file management tools</li>
<li>Build a family tree tool - Django and Angular</li>
<li>Auth central auth with Keycloak</li>
<li>Add GotoSocial, or maybe learn enough Activity Pub to do something myself and move my Mastodon account there</li>
<li>Keep chugging along with Forgejo</li>
<li>Set up a proper monitoring stack</li>
<li>Set up wireguard properly - so I can host from my Pi through a light VPS</li>
<li>Move toward a coherent infrastructure management approach - hopefully with Guix</li>
<li>Write necessary client apps for my phone - likely with Rust and GTK</li>
<li>Sort out Podcast app - either contribute to GNOME Podcast or write something, there are a good few features I'd like</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Switching to Emacs — 18 months in</title>
      <link>https://jmsgrogan.com/blogs/technical/emacs_eighteen_months_in.html</link>
      <guid>https://jmsgrogan.com/blogs/technical/emacs_eighteen_months_in.html</guid>
      <pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="post">
<header class="post-header">
<h1>Switching to Emacs — 18 months in</h1>
<time datetime="2025-12-22">2025-12-22</time>
</header>

<p>This is a post about switching IDE to <code>emacs</code>, what's gone well and what's been a struggle so far.</p>
<p>I started using <code>emacs</code> approximately 18 months ago, switching over from VS Code. My main reason for switching was getting nervy about the dominance of VS Code (which I still think is an excellent IDE) and general fatigue around tooling enshittifaction, privacy invasion and AI integration.</p>
<p>What's gone well?:</p>
<ul>
<li>Much less mouse - I learned <code>vim</code> keybindings and have set up a tiling window manager (Amethyst/Sway), which have both been a productivity and comfort revelation</li>
<li>Treemacs and Projectile - I'm using emacs as an IDE and have a lot of projects - this has been a comforable way to manage them, even more so than in VS Code.</li>
<li>No sore pinky - I remapped my Caps Key and with Evil mode my pinky is in good shape</li>
<li>Packages and LSP - There have been packages and modes for most languages, frameworks and tools that I've needed (Angular, Containers, Python, Markdown) and at a basic level they've worked ok</li>
</ul>
<p>What's been a struggle:</p>
<ul>
<li>Keybindings - Evil mode is relatively comfortable, but I still end up fat-fingering often and doing weird and unrecoverable (in an 'undo' rather than 'document loss' sense) things to the buffer. There can be an impedance mismatch with evil vs. native bindings and documentation which can be a pain for learning and tutorials.</li>
<li>Lisp - Despite several starts I haven't made progress learning it yet, maybe because it's so different from what I'm used to (Python, C++). This makes it hard to customize and fully control my environment.</li>
<li>Web Development - I have trouble with LSP freezes and crashes with Angular. The Angular LSP devs seem only interested in supporting the 'official' VS Code use-case which makes getting fixes difficult.</li>
</ul>
<p>Some blasphemy:</p>
<ul>
<li>I haven't picked up <code>magit</code> - I have a very simple git flow and am pretty used to it - using magit for it feels like slowing down</li>
<li>I haven't picked up Org Mode - I want most of my writing to be in Markdown, often required for collaboration with colleagues. I guess Markdown Mode covers a reasonable number of Org features. I'm too disorganised to have todo lists - maybe some day.</li>
<li>Interactions are a bit slow - I haven't done any optimization but plan to eventually. That said, VS Code is snappy without needing to tinker and as far as I understand I'm limited to a single thread, which makes me think there is only so much optimization that can be done.</li>
<li>I'm using Vim more - now that I'm more comfortable with Vim bindings I'm often using it for quick document edits or server work, rather than launching emacs.</li>
</ul>
<p>What's next?</p>
<ul>
<li>Get better at navigation and using tooling - I'm still not using search, refactoring and code-base navigation tooling and bindings very well.</li>
<li>Target evil to certain modes - In some modes (e.g. Info) the evil bindings are getting in the way, I should configure them to be active for a limited set of modes</li>
<li>Learn some Emacs debugging, profiling and Lisp</li>
</ul>
<p>To wrap up - my <code>emacs</code> journey has gone well so far and there are no regrets with the switch, especially since VS Code appears to be gradually enshittifying as expected. It's been a good bit of work getting to a basic comfort level and I feel like I still have a long way to go. Maybe I'll do another update at the 5 year mark.</p>
</article>
]]></description>
    </item>
    <item>
      <title>Troubleshooting</title>
      <link>https://jmsgrogan.com/articles/troubleshooting.html</link>
      <guid>https://jmsgrogan.com/articles/troubleshooting.html</guid>
      <pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Troubleshooting</h1>
</header>

<h3 id="wifi">Wifi</h3>
<ul>
<li>bbs.archlinux.org/viewtopic.php?id=273440</li>
<li>https://bugzilla.kernel.org/show_bug.cgi?id=215496</li>
</ul>
<h3 id="touchpad">Touchpad</h3>
<ul>
<li>https://www.dell.com/support/kbdoc/en-ie/000150104/precision-xps-ubuntu-general-touchpad-mouse-issue-fix</li>
</ul>
<h3 id="raspberry-pi">Raspberry Pi</h3>
<ul>
<li>https://github.com/raspberrypi/linux/issues/6049</li>
</ul>
<h2 id="linux-phone">Linux Phone</h2>
<p>My Linux phone, a OnePlus6 running PostmarketOS has developed a few issues in the past months. So I'm going to try to troubleshoot them.</p>
<h3 id="no-headphone-audio">No Headphone Audio</h3>
<p>First, headphones - wired or Bluetooth no longer played audio - even though they are shown as the default device and GNOME's sound test plays on them. I had many happy months of listening to music and podcasts with then phone - which one day just came to a stop. I don't think it was related to an update - so what gives?</p>
<p>Let's connect to the phone. On the phone:</p>
<div class="highlight"><pre><span></span>sudo<span class="w"> </span>service<span class="w"> </span>sshd<span class="w"> </span>start

<span class="c1"># Find the IP address</span>
ip<span class="w"> </span>addr
</pre></div>
<p>On my laptop:</p>
<div class="highlight"><pre><span></span>ssh<span class="w"> </span>&lt;phone_user&gt;@&lt;phone_ip&gt;
</pre></div>
<p>Now, we have some fun dealing with the Linux audio zoo. At the lowest level there is ALSA. We can use the <code>aplay</code> command to list devices and play sound. To list devices:</p>
<div class="highlight"><pre><span></span>aplay<span class="w"> </span>-l
</pre></div>
<p>there I couldn't find my headphones. Under <code>aplay -L</code> the 'PulseAudio Sound Server' is showing the default - even though I think pipewire is running too.</p>
<p>We can use <code>pactl</code> for PulseAudio. First, we check the available cards:</p>
<pre><code>pactl list cards
</code></pre>
<p>This lists the built-in ALSA card as 'Card 0' with Earpiece, Speaker, and Headphone ports under a single HIFI profile - with the latter having lowest priority.</p>
<p>'Card 1' is the <code>bluez</code> card and driver - i.e. the bluetooth headset. The Bluetooth headset is showing an 'ad2p sink' and 'handsfree head unit' as its profiles and headphone-output as relevant output port.</p>
<p>Listed clients include the <code>pactl</code>, <code>Gnome settings</code>, Gnome <code>podcasts</code> app.</p>
<p>Now, the interesting bit - the Podcast app under <code>sink-inputs</code> is playing on 'Sink 1' - which is the Built-In Speaker. Why is this? I set it to play on the Bluetooth sink using <code>pactl move-sink</code> and hey presto - now the full sink management logic is working again - apps are playing on the default sink, even after plugging things in and out or restarting the phone. Why? Sorry, I have no idea, it seems like some sort of messed up PulseAudio caching..</p>
</article>
]]></description>
    </item>
    <item>
      <title>Linux Mobile — First Time</title>
      <link>https://jmsgrogan.com/blogs/technical/linux_mobile_first_time.html</link>
      <guid>https://jmsgrogan.com/blogs/technical/linux_mobile_first_time.html</guid>
      <pubDate>Mon, 21 Jul 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="post">
<header class="post-header">
<h1>Linux Mobile — First Time</h1>
<time datetime="2025-07-21">2025-07-21</time>
</header>

<p>I recently (yesterday) installed PostmarketOS with Phosh on a refurbished OnePlus 6. Since this is my first time using a Linux phone I thought it might be useful to track the issues I hit - since you tend to lose the 'noob-insights' as you get more used to a new platform (for better or worse).</p>
<h2 id="problems">Problems</h2>
<ul>
<li>Can't launch new software in Software app</li>
</ul>
<p>One of the first things I wanted to do with the Linux phone was show off on social media that I was using a Linux phone, how basic of me. I tried to install a Mastodon client through the Software App and one called 'Pinafore' showed up. After some awkward UI wrangling it marked as Installed. However it doesn't show up anywhere on the phone UI, including the Software app. If I try to launch it from the 'Installed' splash then the Install splash for the Software app itself opens. In the end I did my showing off through the web browser for now.</p>
<p>I didn't look for an issue report for this one yet - but of course maybe most people go straight to the console and use a list like this: https://wiki.postmarketos.org/wiki/Applications_by_function (In the end I installed <code>tuba</code> for this.</p>
<ul>
<li>Can't set a pin-like password</li>
</ul>
<p>The OS comes with a preset pin-like (short, numerical) password. Naturally you will want to change it pretty early on.</p>
<p>Gnome Settings seems like an intuitive place to do it, it has a User profile and a UI to change the password. However it only accepts relatively long alphanumeric passwords, as you might expect on desktop. This doesn't work on mobile - you want to pick up your phone and unlock it pretty quick.</p>
<p>The workaround is to open a console and use <code>passwd</code>.</p>
<p>I found a defect report here: https://gitlab.postmarketos.org/postmarketOS/pmaports/-/issues/2902 but it is marked as an upstream bug - I don't understand enough yet to know which upstream. I haven't found other reports yet (but am still getting up to speed on issue trackers).</p>
<ul>
<li>Occasionally can't select file in web browser - clipped UI</li>
</ul>
<p>While continuing my quest to show off on social media I tried to share a screengrab on Mastodon via Firefox. This worked fine via the File picker on first attempt. Since I messed up the post I tried a second time but now the File picker was sized larger than the screen and I was stuck.</p>
<p>I didn't look for an issue report yet and am not fully sure how reproducible this is.</p>
<ul>
<li>Battery level not working</li>
</ul>
<p>The battery is shown as always charging - I'm pretty sure I saw this in an FAQ/common issues - so will need to dig it out.</p>
<h2 id="nuisances">Nuisances</h2>
<ul>
<li>Multiple settings apps</li>
</ul>
<p>I tried to turn off haptic feedback for the keyboard. I got there in the end but it was awkward finding the setting in the multiple setting apps.</p>
<ul>
<li>Camera not working</li>
</ul>
<p>This is probably a 'Problem' for others but I don't tend to use it much. However one of the reasons for going for the One Plus 6 was the camera support. I'm probably missing something from an FAQ/common issues for this - but 'out of the box', no camera.</p>
</article>
]]></description>
    </item>
    <item>
      <title>Linux Mobile Apps</title>
      <link>https://jmsgrogan.com/articles/linux_mobile_apps.html</link>
      <guid>https://jmsgrogan.com/articles/linux_mobile_apps.html</guid>
      <pubDate>Wed, 09 Jul 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Linux Mobile Apps</h1>
</header>

<h2 id="writing-a-linux-mobile-app">Writing a Linux Mobile App</h2>
<p>I recently got my hands on a Linux mobile running Phosh and PostmarketOS and am pretty happy with it. However there are a bunch of apps and features that I'd like, particularly integrations with Immich for photos and Navidrome for music streaming.</p>
<p>The most common Linux mobile apps seem to be based in the GNOME ecosystem, using <code>gtk</code> as a base UI toolkit and <code>libadwaita</code> for combined desktop and mobile UI support. I've spent plenty of time working with Qt before - but this is a first dip into the world of GTK.</p>
<p>Apparently new native applications should consider Rust over C and C++ (which I'm pretty familiar with). So, this seems like a good time to try to pick up some Rust as well. This (old) intro for C++ people seems useful: https://fasterthanli.me/articles/a-half-hour-to-learn-rust</p>
<h2 id="setting-up-the-development-environment">Setting up the Development Environment</h2>
<p>First, I want to set up a development environment. I'm using Guix, which will make this reproducible - although I hear doesn't play so nicely with Rust.</p>
<p>Let's get a Rust environment going in Guix shell. First I use <code>guix search</code> to see if I can find something claiming to be a rust toolchain:</p>
<pre><code>guix search rust
</code></pre>
<p>It looks like a package called <code>rust</code> will do the job:</p>
<pre><code>guix shell rust
</code></pre>
<p>I'm aware of Rust bindings for GTK (there is even a <a href="https://gtk-rs.org/gtk4-rs/git/book/">book</a>). It seems like <code>rust-gtk4</code> will do the job. As I build up shell packages it is time to start a manifest:</p>
<pre><code>guix shell rust rust-gtk4 --export-manifest &gt; manifest.scm
</code></pre>
<p>and load the shell with:</p>
<pre><code>guix shell -m manifest.scm
</code></pre>
<p>I may later regret this, but I'm going to try to bundle the project with <code>meson</code> so will add <code>meson</code> and <code>pkg-config</code> to the environment.</p>
<p>Following the <code>gtk-rs</code> book I start with a hello-world:</p>
<div class="highlight"><pre><span></span><span class="k">use</span><span class="w"> </span><span class="n">gtk</span><span class="p">::</span><span class="n">prelude</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>
<span class="k">use</span><span class="w"> </span><span class="n">gtk</span><span class="p">::{</span><span class="n">glib</span><span class="p">,</span><span class="w"> </span><span class="n">Application</span><span class="p">};</span>

<span class="k">const</span><span class="w"> </span><span class="n">APP_ID</span><span class="p">:</span><span class="w"> </span><span class="kp">&amp;</span><span class="kt">str</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"org.gtk_rs.HelloWorld1"</span><span class="p">;</span>

<span class="k">fn</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nc">glib</span><span class="p">::</span><span class="n">ExitCode</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="c1">// Create a new application</span>
<span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">app</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Application</span><span class="p">::</span><span class="n">builder</span><span class="p">().</span><span class="n">application_id</span><span class="p">(</span><span class="n">APP_ID</span><span class="p">).</span><span class="n">build</span><span class="p">();</span>

<span class="w">    </span><span class="c1">// Run the application</span>
<span class="w">    </span><span class="n">app</span><span class="p">.</span><span class="n">run</span><span class="p">()</span>
<span class="p">}</span>
</pre></div>
<p>Now we hit some issues. First, I need some Rust support in my Emacs and second, unsurprisingly, this doesn't compile with <code>rustc</code> since it doesn't know the path to the <code>gtk</code> crate. The <a href="https://github.com/emacs-rustic/rustic#automatic-server-installation">emacs rustic</a> package with <a href="https://rust-analyzer.github.io/book/">rust-analyzer</a> seem to be the way to go.</p>
<p>So, how do I combine <code>gtk</code>, <code>rust</code> and <code>meson</code> - well it seems like some horrible mix of cargo and meson boilerplat: captured here https://gitlab.gnome.org/World/Rust/gtk-rust-template/-/tree/master with more background here: https://coaxion.net/blog/2023/04/building-a-gstreamer-plugin-in-rust-with-meson-instead-of-cargo/</p>
<p>Let's go for it.</p>
</article>
]]></description>
    </item>
    <item>
      <title>Guix</title>
      <link>https://jmsgrogan.com/articles/guix.html</link>
      <guid>https://jmsgrogan.com/articles/guix.html</guid>
      <pubDate>Wed, 09 Jul 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Guix</h1>
</header>

<h2 id="guix">Guix</h2>
<p>Guix is a package manager and derived Operating System based on the ideas of reproducible builds ands free software and the Guile Scheme language.</p>
<p>Using Guix an Operating System and user profiles can be defined declaratively in Scheme. This includes system services, using the GNU Shepherd init system and config file environment through the GNU Home module.</p>
<p>Thanks to the use of reproducible builds Guix is useful for setting up clean development environments with or without full container isolation.</p>
<h3 id="setting-up-a-minimal-sway-environment">Setting up a minimal Sway environment</h3>
<p>Guix allows the development of a minimal computing environment by allowing easy rollbacks to previous generations, allowing experimentation and through tooling like <code>guix graph</code> which can show where dependencies are coming from.</p>
<p>Sway is a reasonably minimal tiling window manager based on Wayland, with good support in Guix.</p>
<p>While a Sway session can be launched through the login shell, it can be nicer to use a login system. <code>greetd</code> is often used for this purpose, with a Sway based 'greeter'. To set this up it is neccessary to set up <code>greetd</code> as a system service in the operating system definition.</p>
<h3 id="guix-shell">Guix Shell</h3>
<p>Guix Shell is a tool used to manage, amongst other things, development environments. You can invoke it with:</p>
<div class="highlight"><pre><span></span>guix<span class="w"> </span>shell
</pre></div>
<p>to launch the environment.</p>
<p>Typically you will want some packages in the environment, for example for a gcc toolchain you can add:</p>
<div class="highlight"><pre><span></span>guix<span class="w"> </span>shell<span class="w"> </span>gcc-toolchain
</pre></div>
<p>You can manage the packages in the environment with a manifest file. To create an initial one do:</p>
<div class="highlight"><pre><span></span>guix<span class="w"> </span>shell<span class="w"> </span>--export-manifest
</pre></div>
<p>You can then append packages to the manifest list as needed.</p>
<h3 id="further-reading">Further Reading</h3>
<ul>
<li>https://guix.gnu.org/en/blog/2023/dissecting-guix-part-1-derivations/</li>
<li>Raspberry pi example:  https://codeberg.org/guix/guix/src/commit/757aefeaa4df338e0564044ba344f1daa81c5f10/gnu/system/examples/raspberry-pi-64.tmpl</li>
<li>Sway and Guix: gofranz.com/blog/all-in-on-sway/</li>
<li>Sample user setup: https://github.com/MorganJamesSmith/dotfilehttps://bugzilla.kernel.org/show_bug.cgi?id=215496s/blob/master/.config/guix/config.scm</li>
<li>akirakyle.com/config/guix</li>
<li>Sway example: https://gitlab.com/endocrin/guix-sway/-/blob/master/guix-sway-config.scm?ref_type=heads</li>
<li>Sway example: https://gitlab.com/mbakke/guix-sway-example</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Benches</title>
      <link>https://jmsgrogan.com/articles/benchs.html</link>
      <guid>https://jmsgrogan.com/articles/benchs.html</guid>
      <pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Benches</h1>
</header>

<p>I like to keep track of places I've travelled to through the medium of bench photos. Here are some of the said benchs.</p>
</article>
]]></description>
    </item>
    <item>
      <title>Linux Mobile Packaging</title>
      <link>https://jmsgrogan.com/articles/linux_mobile_packaging.html</link>
      <guid>https://jmsgrogan.com/articles/linux_mobile_packaging.html</guid>
      <pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Linux Mobile Packaging</h1>
</header>

<p>This article has some notes on packaging a graphical Linux mobile app. Particularly with <code>phosh</code> and <code>postmarketos</code>.</p>
<p>Here are some links:</p>
<p>PostmarketOs Packaging:</p>
<ul>
<li>https://wiki.postmarketos.org/wiki/Developing_with_postmarketOS</li>
<li>https://wiki.postmarketos.org/wiki/Packaging</li>
</ul>
<p>Alpine packaging:</p>
<ul>
<li>https://wiki.alpinelinux.org/wiki/APKBUILD_Reference</li>
<li>https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package</li>
</ul>
<p>Librem/Purism Docs:</p>
<ul>
<li>https://developer.puri.sm/Librem5/Apps/Packaging_Apps/index.html</li>
<li>https://developer.puri.sm/Librem5/Apps/Publishing/index.html</li>
</ul>
<p>Other Apps:</p>
<ul>
<li>https://forums.ankiweb.net/t/packaging-anki-desktop-for-aarch64-alpine-linux-postmarket-os/6152</li>
<li>https://nemomobile.net/pages/Packaging_Glacier_for_postmarketOS/</li>
</ul>
<h3 id="postmarketos-setup">PostmarketOS Setup</h3>
<ul>
<li>Experience blog: https://connolly.tech/posts/2023_12-10-im-daily-driving-postmarketos-pt1/</li>
<li>Qualcom Sdm845: https://gitlab.com/sdm845-mainline</li>
<li>https://gist.github.com/stuzenz/63a7cac6b396a740b6f1fd470bf30edd</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Forge Federation</title>
      <link>https://jmsgrogan.com/articles/forge_federation.html</link>
      <guid>https://jmsgrogan.com/articles/forge_federation.html</guid>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Forge Federation</h1>
</header>

<p>This article is a work in progress review of 'Forge Federation'. I'm writing it to learn about the technologies and groups involved. Eventually I hope to be able to contribute to some of this work - I'm using the article to get up to speed on the area.</p>
<p>The term 'Forge' is used to describe web based code repositories with additional features to support collaborative software development, for example 'pull requests' or issue tracking.</p>
<p>At the moment Github is almost ubiquitously used as a Forge. Ubiquity of any platform, regardless of its current values, is already a problem in my books. It is healthy to have viable alternatives for many reasons. However ubiquity of a closed-source commercial platform is to me very problematic, particularly when it is used to host critical open source software projects.</p>
<p>There are alternative forges, (fully) open source ones are naturally of interest. Codeberg is a nice example. The problem is that this forge is centralized - someone has to pay to keep the lights on and it is a single point of weakness for attack on software projects. The Codeberg service runs on the Frogejo software platform, which is a fork of the open-core (partially open source but with proprietary paid extras) Gitea platform.</p>
<p>Federation of Web Activities is an approach to build decentralized services and platforms. It is showing lots of promise in the area of Social Media, e.g. with Mastodon, Pixelfed, Peertube and a healthy collection of others. Many are built on the 'Activity Pub' procotol.</p>
<p>Forgejo has a current initiative to support federation based on Activity Pub. Its most recent feature is '<a href="https://codeberg.org/forgejo/forgejo/pulls/1680">federated stars</a>', with <a href="https://codeberg.org/forgejo/forgejo/pulls/6740">federated unstar</a> next. There is a long <a href="https://codeberg.org/forgejo/forgejo/issues?labels=79349">roadmap</a> (including tag <a href="https://codeberg.org/forgejo/forgejo/pulls?labels=79349">forgejo/federation</a>) toward having a fully federated forge. I think this work to enable Forge federation is foundationally important to allow open source projects to escape the Github trap and the Forgejo project is well placed to deliver it. So, I want to get involved.</p>
<p>To do so in a reasonable way I want to:</p>
<ol>
<li>review the following:</li>
</ol>
<ul>
<li>How Go works</li>
<li>How Forgejo works</li>
<li>How Activity Pub works</li>
<li><a href="https://forgefed.org/">Forgefed</a> and <a href="https://codeberg.org/ForgeFed/Vervis/src/commit/7368ef7c8255aea3eadeea4c5b028389a18d5c99/FEDERATION.md#5-ed25519-actor-keys">Vervis</a></li>
<li>Forgefriends https://f3.forgefriends.org/</li>
<li>How federation in Forgejo works
<ul>
<li>UI https://gitea.com/xy/gitea/issues/8</li>
</ul>
</li>
</ul>
<p>in this article.</p>
<ol start="2">
<li>
<p>set up a Forgejo development environment so I can play around with things, I haven't thought of the best way to do that yet. My own 'production' Forgejo setup is still very basic.</p>
</li>
<li>
<p>see if I can find some good first issues in the Forgejo federation backlog, including helping with tests, documentation or setting up some infrastructure.</p>
</li>
</ol>
</article>
]]></description>
    </item>
    <item>
      <title>Linux Tools</title>
      <link>https://jmsgrogan.com/articles/linux_tools.html</link>
      <guid>https://jmsgrogan.com/articles/linux_tools.html</guid>
      <pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Linux Tools</h1>
</header>

<h2 id="logging-and-monitoring">Logging and Monitoring</h2>
<ul>
<li>rsyslog</li>
<li><a href="https://en.wikipedia.org/wiki/Syslog">syslog</a>: RFC5424</li>
</ul>
<p><code>/var/log/syslog</code>
<code>/var/log</code></p>
<ul>
<li>
<p>eBPF</p>
</li>
<li>
<p>Zabbix</p>
</li>
<li>
<p>Influx</p>
</li>
<li>
<p>Grafana</p>
</li>
<li>
<p>Prometheus (+ Grafana + Loki as stack)</p>
</li>
<li>
<p>timescaleDB</p>
</li>
<li>
<p>AlertManager</p>
</li>
<li>
<p>Loki</p>
</li>
<li>
<p>Graphite</p>
</li>
<li>
<p>Spiceworks</p>
</li>
<li>
<p>Crowdsec</p>
</li>
<li>
<p>Netdata</p>
</li>
<li>
<p>NodeExtractor/NodeExporter</p>
</li>
<li>
<p>ELK - Elasticsearch, Kibana, Logstash</p>
</li>
</ul>
<p>https://grafana.com/blog/2016/01/05/logs-and-metrics-and-graphs-oh-my/</p>
<p>Setting up Grafana: https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/</p>
<p>Setting up Prometheus: https://github.com/prometheus/prometheus</p>
<p>Some things to measure:</p>
<ul>
<li>apt status (for security/critical updates that haven't been run yet)</li>
<li>reboot needed (presence of /var/run/reboot-required)</li>
<li>fail2ban jail status (how many are in each of our defined jails)</li>
<li>CPU usage</li>
<li>MySQL active, long-running processes, number of queries</li>
<li>iostat numbers</li>
<li>disk space</li>
<li>SSL cert expiration date</li>
<li>domain expiration date</li>
<li>reachability (ping, domain resolution, specific string in an HTTP request)</li>
<li>Application-specific checks (WordPress, Drupal, CRM, etc)</li>
<li>postfix queue size</li>
</ul>
<ul>
<li>apt/yum/fwupd/... pending updates</li>
<li>mailqueue length, root's mailbox size: this is an indicator for stuff going wrong silently</li>
<li>pending reboot after kernel update</li>
<li>certain kinds of log entries (block device read error, OOMkills, core dumps).</li>
<li>network checksum errors, dropped packets, martians</li>
<li>presence or non-presence of USB devices: desktops should have keyboard and mouse. servers usually shouldn't. usb storage is sometimes forbidden.</li>
</ul>
<h3 id="further-reading">Further Reading</h3>
<ul>
<li>https://www.redhat.com/en/blog/log-aggregation-rsyslog</li>
</ul>
<h2 id="auto-updates">Auto updates</h2>
</article>
]]></description>
    </item>
    <item>
      <title>Linux Internals</title>
      <link>https://jmsgrogan.com/articles/linux_internals.html</link>
      <guid>https://jmsgrogan.com/articles/linux_internals.html</guid>
      <pubDate>Sat, 04 Jan 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Linux Internals</h1>
</header>

<p>This article is my attempt to explain Linux internals to myself and act as a structured way of keeping notes.</p>
<p>Linux is an operating system kernel - which is distinct from the user-space where user applications will run. The kernel directly interfaces with hardware via its firmware and associated drivers. It also manages resources for sharing by user applications. Other open-source kernels that may be of interest are those based on BSD and the GNU Hurd microkernel.</p>
<p>The <a href="https://www.kernel.org/doc/html/v4.13/index.html">Linux kernel</a> can be interacted with or controlled from user space by means of a File based API or a C API which aim to be POSIX compatible.</p>
<p>The types of hardware interfaced in the kernel include:</p>
<ul>
<li>graphics</li>
<li>audio</li>
<li>memory</li>
<li>cpu</li>
<li>gpu</li>
<li>network</li>
<li>keyboard and mouse</li>
<li>storage and i/o peripherals</li>
</ul>
<p>with the kernel handling control messages including power messages for associated devices.</p>
<p>As part of its resource management the kernel includes:</p>
<ul>
<li>filesystems and virtual file management</li>
<li>memory management functionality</li>
<li>process scheduling and interprocess communication</li>
<li>networking</li>
<li>security</li>
<li>media support</li>
</ul>
<p>In the user-space of operating systems that use the Linux kernel (will controversially refer to as Linux distros for brevity) some foundational elements and applications are:</p>
<ul>
<li>an init system - often <code>systemd</code> and previously collections of 'sysvinit scripts' or niche alternatives like <code>shepherd</code>.</li>
<li>system daemons for administrative services</li>
<li>a graphics system - oten <code>wayland</code> now replacing <code>x org</code></li>
<li>an audo or multimedia system - <code>pipewire</code> is becoming a common replacement for <code>pulseaudio</code> and others</li>
<li>a terminal emulator and shell</li>
<li>network interface management, such as ethernet or wifi</li>
<li>a package manager</li>
<li>a bootloader</li>
</ul>
<h2 id="apis">APIs</h2>
<p>https://en.wikipedia.org/wiki/Linux_kernel_interfaces#Linux_API</p>
<p>The kernel tries to follow the <a href="https://en.wikipedia.org/wiki/POSIX">Portable Operating System Interface (POSIX)</a> and <a href="https://en.wikipedia.org/wiki/Single_UNIX_Specification">Single Unix Specification</a> where applicable.</p>
<h3 id="file-based">File Based</h3>
<p>Device drivers are interacted with in directories:</p>
<ul>
<li><code>/dev</code> https://en.wikipedia.org/wiki/Device_file#DEVFS</li>
<li><code>/sys</code></li>
</ul>
<p>Processes are interacted with in:</p>
<ul>
<li><code>/proc</code></li>
<li><code>/proc/sys</code></li>
</ul>
<h3 id="system-calls-and-similar">System calls and similar</h3>
<p>https://en.wikipedia.org/wiki/System_call</p>
<p><code>ioctl</code> (input/output control) is a system call for device specific io operations.</p>
<ul>
<li><code>sysctl</code> (system control)</li>
<li><code>ioctl</code> (io control)</li>
<li><code>fcntl</code> (file control)</li>
</ul>
<p>Other communication mechanisms include <a href="https://en.wikipedia.org/wiki/Netlink">netlink</a> sockets which allow IPC between both kernel and userspace programs. It is designed to be a more flexible successor to <code>ioctl</code>.</p>
<h2 id="user-space">User Space</h2>
<h3 id="init-systems">Init Systems</h3>
<h4 id="systemd">Systemd</h4>
<p>Important utilities:</p>
<ul>
<li><code>systemctl</code></li>
<li><code>journalctl</code></li>
<li><code>notify</code></li>
<li><code>loginctl</code></li>
<li><code>systemd-boot</code></li>
</ul>
<p>Important daemons:</p>
<ul>
<li><code>systemd</code></li>
<li><code>journald</code></li>
<li><code>resolved</code></li>
<li><code>networkd</code></li>
<li><code>logind</code></li>
<li><code>user-session</code></li>
<li><code>udevd</code></li>
</ul>
<p>Important libraries:</p>
<ul>
<li><code>libnotify</code></li>
<li><code>libudev</code></li>
</ul>
<h3 id="devices">Devices</h3>
<p>Devices are managed in user space with the <code>udev</code> utility - which has the following parts:</p>
<ul>
<li>libudev which can be used as a library for device info</li>
<li>udevd daemon for managing the <code>/dev</code> virtual file hierarchy</li>
<li>the <code>udevadm</code> command line utility for admin and diagnostics</li>
</ul>
<h3 id="window-management-and-device-input-events">Window management and device input events</h3>
<p>Wayland and X are the two most common display servers on Linux systems. They both follow a client-server approach, where the latter in Wayland can be part of the compositor.</p>
<p>Display servers can react to device input events via the <code>libinput</code> library, which in turn uses <code>libevdev</code> to handle evdev <code>ioctls</code> from the kernel.</p>
<h3 id="network">Network</h3>
<p><a href="https://en.wikipedia.org/wiki/Iptables">iptables</a> allows configuration of IP packet filter rules in the Linux kernel firewall, which are implemented as <a href="https://en.wikipedia.org/wiki/Netfilter">netfilter</a> modules. nftables is a newer userspace utility that replaces iptables and similar.</p>
<p><code>netfilter</code> operates by providing hooks to be called at different stages of packet processing, allowing decisions to be made on the fate of the packet. The user-space side of <code>iptables</code> has the concept of 'tables' - which define some function to perform on a packet and 'chains' which correspond to when the functions will be applied, mapping to the netfiler hooks. Chains has a priority controlling their order of application on the netfilter hooks.</p>
<p>The following are the netfilter hooks and corresponding built-in iptable chains:</p>
<ul>
<li><code>NF_IP_PRE_ROUTING</code> / <code>PREROUTING</code></li>
<li><code>NF_IP_LOCAL_IN</code> / <code>INPUT</code></li>
<li><code>NF_IP_FORWARD</code> / <code>FORWARD</code></li>
<li><code>NF_IP_LOCAL_OUT</code> / <code>OUTPUT</code></li>
<li><code>NF_IP_POST_ROUTING</code> / <code>POSTROUTING</code></li>
</ul>
<p>The following are the available iptable tables:</p>
<ul>
<li><code>nat</code>: network address translation</li>
<li><code>filter</code> : Where a packet can proceed or not - essentially firewalling</li>
<li><code>mangle</code>: IP header modification</li>
<li><code>raw</code>: allows marking packets as part of a connection</li>
<li><code>security</code>: used in SELinux and similar applications</li>
</ul>
<p>iptable rules are placed in a specific chain of a specific table. Rules have a 'matching' component and a 'target' component, which gives an action. The actions can be terminating which stops chain evaluation or non-terminating.</p>
<p><a href="https://en.wikipedia.org/wiki/Avahi_(software)">avahi</a> is a zero-configuration networking implementation (allows network service use by freshly networked computers or peripherals) including multicast DNS and DNS service discovery. Apples' Bonjour and Systemd's <code>systemd-resolved</code> are other implementations.</p>
<p>The Desktop-Bus (DBus) is a user space middleware allowing communication between multiple processes (e.g. IPC).</p>
<ul>
<li>
<p>https://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works</p>
</li>
<li>
<p>https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture</p>
</li>
<li>
<p>https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to-secure-your-servers</p>
</li>
<li>
<p>https://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject</p>
</li>
</ul>
<h3 id="audio">Audio</h3>
<p>ALSA (Advanced Linux Sounds Architecture) - has both kernel and user-space elements, the later with alsa-lib.</p>
<p>Pipewire is a new low-level multimedia framework.</p>
<h3 id="power-managemenr">Power Managemenr</h3>
<p>UPower (previously DeviceKit-power) is a power manement middleware - it spawns <code>upowerd</code>.</p>
<p>Systemd has some session and power management through its logind. The elogind is a standalone fork of this logind.</p>
<p>The <code>systemctl suspend</code> analogue for elogind is <code>loginctl suspend</code>.</p>
<h3 id="other">Other</h3>
<ul>
<li>avahi</li>
<li>dbus</li>
<li>udisks</li>
<li>cgroups</li>
<li>autofs</li>
<li>kdbus</li>
<li>Plokit (Policy Kit) https://en.wikipedia.org/wiki/Polkit</li>
<li>Pluggable Authentication Module (PAM) https://en.wikipedia.org/wiki/Pluggable_Authentication_Module</li>
<li>Name Service Switch (NSS) https://en.wikipedia.org/wiki/Name_Service_Switch</li>
<li>procfs https://en.wikipedia.org/wiki/Procfs</li>
<li>sysfs https://en.wikipedia.org/wiki/Sysfs</li>
</ul>
<h2 id="kernel-space">Kernel Space</h2>
<h3 id="input-events">Input events</h3>
<ul>
<li>evdev</li>
<li><code>/dev/input</code></li>
</ul>
<h3 id="filesystems">Filesystems</h3>
<ul>
<li>
<p>ext4</p>
</li>
<li>
<p>btrfs</p>
</li>
<li>
<p>xfs</p>
</li>
<li>
<p>jfs</p>
</li>
<li>
<p>fat32</p>
</li>
<li>
<p>FUSE</p>
</li>
</ul>
<h3 id="storage">Storage</h3>
<ul>
<li>SCSI</li>
<li>libATA</li>
</ul>
<h3 id="virtualization">Virtualization</h3>
<ul>
<li>KVM</li>
<li>Xen</li>
</ul>
<h3 id="process-management">Process Management</h3>
<ul>
<li><code>clone(2)</code> and <code>clone3(2)</code></li>
<li><code>futex(7)</code> and <code>futex(2)</code></li>
<li>Completely Fair Scheduler</li>
<li>https://en.wikipedia.org/wiki/Earliest_eligible_virtual_deadline_first_scheduling</li>
<li>Native Posix Thread Library (NPTL) is kernel side of pthreads</li>
</ul>
<h3 id="security">Security</h3>
<ul>
<li>Linux Security Modules</li>
<li>SELinux</li>
<li>AppArmor</li>
<li>POSIX ACLs</li>
</ul>
<h3 id="memory">Memory</h3>
<ul>
<li>DMA buffers</li>
</ul>
<h3 id="audio-1">Audio</h3>
<ul>
<li>Advanced Linux Sound Architecture (ALSA)</li>
</ul>
<h3 id="graphics">Graphics</h3>
<ul>
<li>Direct Rendering Manager (DRM)</li>
<li>Kernel Mode Setting (KMS)</li>
</ul>
<h3 id="network-1">Network</h3>
<ul>
<li>New API</li>
<li>mac80211</li>
<li><a href="https://en.wikipedia.org/wiki/Netfilter">Netfiler</a></li>
</ul>
<h3 id="power-and-control">Power and Control</h3>
<ul>
<li>ACPI https://en.wikipedia.org/wiki/ACPI</li>
</ul>
<h3 id="pam-and-login">PAM and Login</h3>
<ul>
<li>https://kl.wtf/posts/2022/03/12/login-managers-an-introduction.html#pluggable-authentication-modules</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Computer Networking</title>
      <link>https://jmsgrogan.com/articles/computer_networking.html</link>
      <guid>https://jmsgrogan.com/articles/computer_networking.html</guid>
      <pubDate>Sat, 04 Jan 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Computer Networking</h1>
</header>

<p>This is a work in progress article I'm using to build up my understanding of computer networking.</p>
<h2 id="standards">Standards</h2>
<h3 id="osi-model"><a href="https://en.wikipedia.org/wiki/OSI_model">OSI model</a></h3>
<p>The Open Systems Interconnection model is a basis for standards development in systems interconnection.</p>
<h4 id="physical-layer">Physical Layer</h4>
<p>Converts digital bits into electrical, radio or optical signals</p>
<ul>
<li>NIC: Network Interface Controller</li>
<li>Ethernet hub</li>
<li>Network switch</li>
<li>Physical transmission media</li>
</ul>
<p>Standards at this layer include Bluetooth, Ethernet, USB</p>
<h4 id="data-link-layer">Data link layer</h4>
<ul>
<li>Medium Access Control Address (MAC) https://en.wikipedia.org/wiki/MAC_address</li>
<li>Logical link control (LLC)</li>
</ul>
<h4 id="others">Others</h4>
<ul>
<li>network</li>
<li>transport</li>
<li>session</li>
<li>presentation</li>
<li>application</li>
</ul>
<h3 id="ieee-802"><a href="https://en.wikipedia.org/wiki/IEEE_802">IEEE 802</a></h3>
<p>Family of standards for local area networks (LANs) and other types.</p>
<h2 id="terms">Terms</h2>
<ul>
<li>Packet filtering</li>
<li>Network address translation (NAT)
<ul>
<li>masquerading</li>
<li>port forwarding</li>
<li>redirection</li>
</ul>
</li>
<li>Port translation</li>
</ul>
<h2 id="internet-protocol-suite">Internet Protocol Suite</h2>
<ul>
<li>RFC 1122</li>
<li>RFC 1123</li>
</ul>
<h3 id="link-layer">Link Layer</h3>
<ul>
<li>Address Resolution Procotol (ARP) https://en.wikipedia.org/wiki/Address_Resolution_Protocol</li>
</ul>
<h3 id="transport-layer">Transport Layer</h3>
<ul>
<li>TCP</li>
<li>UDP</li>
<li>QUIC</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Interesting Tools</title>
      <link>https://jmsgrogan.com/articles/interesting_tools.html</link>
      <guid>https://jmsgrogan.com/articles/interesting_tools.html</guid>
      <pubDate>Thu, 02 Jan 2025 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Interesting Tools</h1>
</header>

<h2 id="shell">Shell</h2>
<ul>
<li><a href="https://github.com/tmux/tmux/wiki">tmux</a></li>
</ul>
<h2 id="backup">Backup</h2>
<ul>
<li><a href="https://restic.net/">Restic</a></li>
</ul>
<h2 id="music">Music</h2>
<ul>
<li><a href="https://github.com/sublime-music/sublime-music">Sublime Music</a></li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Self Hosting</title>
      <link>https://jmsgrogan.com/articles/self_hosting.html</link>
      <guid>https://jmsgrogan.com/articles/self_hosting.html</guid>
      <pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Self Hosting</h1>
</header>

<h2 id="self-hosting">Self Hosting</h2>
<p>This article is intended to be an ever-evolving guide to setting up a self-hosting solution, put together as I try out and learn various steps myself.</p>
<h3 id="location">Location</h3>
<p>I want to host with my own hardware where feasible, mostly so I have control over costs but general control and independence reasons are appealing also.</p>
<p>I don't have a static IP and don't really want the fuss of getting one, nor making my home IP publically visible. For this reason I've opted to run a small VPS on an external hosting provider to act as a public gateway to locally hosted content. I also want to run a VPN on this VPS, so I can access services only visible to my home network while away from it. For the external provider I went with <a href="https://www.hetzner.com/">Hetzner</a> for reasons of price, reputation and that they are based in Europe. I wasn't too happy with the extent of personal data they collect during registration but understand why they do it.</p>
<h3 id="hardware">Hardware</h3>
<p>I have a hodge-podge of old hardware laying around and where possible am trying to use that over buying anything new. That said, my Raspberry Pi was ancient and I don't think it was up to the task of running my planned services, so I grabbed a Raspberry Pi 5 with 8 GB RAM. I had a couple of old SSDs - one 256 GB and one 2 TB, so hooked them up via PCIe to USB connectors. The Pi is running on WiFi at the moment, although I could attach it to Ethernet over the house wiring if there is a performance issue.</p>
<h3 id="public-host">Public Host</h3>
<p>I'm running a Debian image on a small Hetzner VPS. This hosts public facing services, such as my personal website and Forgejo code repository.</p>
<h3 id="home-network">Home Network</h3>
<p>My home network just consists of a Raspberry Pi based server for now - with access from various laptops, mobile clients and a Smart Tv. I don't have any short term plans to add to that. It isn't exposed to the public internet but is planned to be accessible by VPN.</p>
<h4 id="operating-system">Operating System</h4>
<p>For now, I've gone with the default Debian image for the Raspberry Pi. I wasn't too careful setting it up so have ended up with a full blown desktop installation. Hopefully in future I can eventually get <a href="https://guix.gnu.org/">Guix</a> running on there, which I'm currently happily using on my laptop.</p>
<h4 id="core-services">Core Services</h4>
<p>These are the core services that support access, monitoring and security on my system.</p>
<h5 id="dns">DNS</h5>
<p>I'm using <a href="https://docs.pi-hole.net/">pi-hole</a> for ad blocking and am planning to also use it for  internal DHCP/DNS management on my home network.</p>
<p>For starters I set it up to act as a DHCP server. Before starting I needed to configure the pi to get a static IP, this is through <code>/etc/network/interfaces</code>.</p>
<p>Then I followed option 'Alternative 1' on the pi-hole getting started docs:</p>
<div class="highlight"><pre><span></span>git<span class="w"> </span>clone<span class="w"> </span>--depth<span class="w"> </span><span class="m">1</span><span class="w"> </span>https://github.com/pi-hole/pi-hole.git<span class="w"> </span>Pi-hole
<span class="nb">cd</span><span class="w"> </span><span class="s2">"Pi-hole/automated install/"</span>
sudo<span class="w"> </span>bash<span class="w"> </span>basic-install.sh
</pre></div>
<p>Finally I forced my router's DHCP server to only assign one IP, a fixed one to the pi and then enabled DHCP serving on the Pi.</p>
<h4 id="vpn-wireguard">VPN: Wireguard</h4>
<p>I want to use Wireguard to allow access to services on my home network that are not intended to be public. It will also allow serving of services that are meant to be public via the VPS and reverse proxy.</p>
<p>https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-20-04</p>
<h4 id="backup">Backup</h4>
<p>Considering rsync or BorgBackup</p>
<h4 id="updates">Updates</h4>
<p>Manual or watchtower</p>
<h4 id="monitoring">Monitoring</h4>
<p>Undecided</p>
<h3 id="services">Services</h3>
<h4 id="credentials">Credentials</h4>
<p>Vaultwarden</p>
<h4 id="email">Email</h4>
<p>Custom self host for receive with, custom and gmail for sending</p>
<h4 id="photos">Photos</h4>
<p>Immich</p>
<h4 id="music">Music</h4>
<p>Navidrome</p>
<h4 id="documents">Documents</h4>
<p>Nextcloud</p>
<h4 id="calendar-contacts-notes">Calendar, Contacts, Notes</h4>
<p>Nextcloud</p>
<h4 id="code">Code</h4>
<p>Forgejo</p>
<h4 id="personal-site">Personal Site</h4>
<p>Proxied through VPN and reverse proxy</p>
<h4 id="social">Social</h4>
<p>Self host Mastodon or GoToSocial</p>
</article>
]]></description>
    </item>
    <item>
      <title>End of Year Recap 2024</title>
      <link>https://jmsgrogan.com/blogs/technical/end_of_year_recap_2024.html</link>
      <guid>https://jmsgrogan.com/blogs/technical/end_of_year_recap_2024.html</guid>
      <pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="post">
<header class="post-header">
<h1>End of Year Recap 2024</h1>
<time datetime="2024-12-18">2024-12-18</time>
</header>

<p>This is a recap of some technical projects I've picked up, started or finished in 2024 and things I'd like to pick up in 2025.</p>
<h2 id="relevant-background">Relevant Background</h2>
<p>I'm a software developer with an interest in free software, open science, minimalism and yak shaving. I've been using Linux for about 15 years and finally rid myself of all things Windows some time last year.</p>
<p>I had mostly used Ubuntu for personal computing and a little CentOS/RedHat at work, but started looking around for other distros when they introduced Snaps and killed CentOS 8 respectively, cementing my feelings that corporate distros should only be used for corporate things. My distro search included brief spells with:</p>
<ul>
<li>Debian - found packages too out of date</li>
<li>Fedora - found dnf slow on my clunky old laptop</li>
<li>Gentoo - never got it fully set up correctly</li>
</ul>
<p>before settling on Arch some time in 2023.</p>
<p>I've primarily worked with GUI tools including IDEs and heavy mouse use, dropping to the terminal only when needed.</p>
<h2 id="2024-recap">2024 Recap</h2>
<h3 id="operating-systems">Operating Systems</h3>
<p>I had been running Arch for much of 2023 using Wayland and <code>suckless</code> tools as much as possible, e.g. <code>dwl</code>. The system was stable but I struggled with the keyboard focused flow and sometimes needing a tool in a hurry - e.g. joining a wifi network on the road and trying to remember the terminal commands to do so.</p>
<p>I switched to Debian Sid early in the year - with the lofty goal of being able to contribute useful defect reports and maybe being able to get involved in some package maintenance. I switched back to GNOME and mousing about at the same time, which was a bit of a relief although floating windows did start to grate a bit.</p>
<p>I learned about Guix and along with being interested in learning Emacs decided to give the Guix System a shot, around March some time. I found the initial setup a bit tricky - since I needed some non-free kernel bits, but (presumably with some thanks to previous Gentoo experience) eventually pulled a system together. It has been rock solid since and I think my distro hopping days are over for now.</p>
<p>The big appeals of Guix to me are:</p>
<ul>
<li>having control over the assembly of the system and being able to build something minimal</li>
<li>having a clean language to configure the system (Guile Scheme)</li>
<li>its free software and community focus</li>
<li>use of an alternative to SystemD - I think competition and having choice are healthy and I'm not running an enterprise on my laptop</li>
<li>maybe some day using GNU Hurd - did I mention the yak shaving?</li>
</ul>
<p>With the switch to Guix I switched to Sway as a window-manager, rather than <code>dwl</code>. Interestingly it is more minimal than I had thought feature-wise, properly setting up <code>sway-lock</code> and <code>sway-idle</code> are still on my todo list. This allowed me to remove a lot of GNOME and GDM things from my Guix setup (with David Wilson's awesome blog, videos and repo doing most of the heavy lifting). There is still a long way to go in terms of my understanding the lower level Linux userspace before chopping more off my Guix config, but that is what 2025 is for.</p>
<h3 id="ides">IDEs</h3>
<p>Switching IDE was definitely my biggest and most time-consuming technical project of 2024. I haven't been happy with my IDE choices - basically ever. The Eclipse IDE was one of the first I used for Python and C++. It is free software and I'm grateful to the developers for building it, but I found every single aspect of it painful to use, from crashes to lockups and runaway resource use while indexing to a painful plugin management system, and did I mention the Java?</p>
<p>After many years of using Eclipse I used Visual Studio while working on a Windows-centric product for several years. It was adequate but I don't like the Microsoft C++ development environment for several reasons. Once I no longer had to write code for Windows I switched to VS Code on all platforms. VS Code is an amazing IDE, performance is great and tooling and plugins 'just work'. In my current role I write tutorials and best practice documentation for other developers and the general public. I'm really not a fan of Microsoft and although there is 'free' VS Codium with some of the nasties stripped out I'm wary of the now dominance of VS Code and the possibility of a web-browser like co-option of standards by a small number of large corporations. so, it didn't feel good to me to make documentation with this IDE as the prominent option.</p>
<p>This left me with the choice of Emacs and the Vi ecosystem. Since I was trying out Guix at the same time and was interested in the idea of LISP I decided to give Emacs a try. The experience is worthy of a dedicated post - but needless to say that transition was hugely time consuming and challenging - but I'm out the other side now and things are looking good. Once again I'm finally satisfied I've found a platform I can stick with for a long time.</p>
<h3 id="self-hosting-and-de-googling">Self Hosting and De-Googling</h3>
<p>2024 has been a good year for first steps at self-hosting and degoogling. Some of the things I set up have been:</p>
<ul>
<li>Moving from Github to Codeberg and then primarily a self-hosted Forgejo instance</li>
<li>Moving my personal site from Github pages and Python pelican generator to a custom generator and self-hosted server</li>
<li>Making a self-hosted dynamic website for my wedding with CSS and Vanilla JS</li>
<li>Moving all of my credentials to Bitwarden</li>
<li>Moving my mail from Google to Migadu</li>
<li>Dropping my Spotify and using Bandcamp, with self-hosted Navidrome for listening</li>
<li>Archiving my photos via Immich self-hosting</li>
<li>Setting up a Raspberry Pi for local self-hosting</li>
<li>Running pi-hole for DNS blackholing and DHCP</li>
</ul>
<h3 id="languages">Languages</h3>
<p>2024 hasn't been very active for picking up new languages or language features. I mostly got back up to speed with recent developments in Typescript (and Angular) and Python. For Python the main things I picked up were the packaging system changes (e.g. Pyproject.toml), use of linters and the typing system (which I'm enjoying).</p>
<p>I did learn a bit about RPM packaging at the start of the year, which is possibly forgotten by now.</p>
<p>One change I did make was trying out more functional approaches to programming. I learned programming via OOP and have been using that everywhere. For some Python projects I've tried a more functional approach with immutable data classes and functions without side-effects and it has been pretty satisfying - I'm going to go further down this road in 2025 with language choices.</p>
<h3 id="side-projects-and-open-source-contributions">Side Projects and Open Source Contributions</h3>
<p>2024 has been a mixed to disappointing year on the side projects front. For several (at least 5) years now I've been trying to build a library of 'things from scratch', e.g. a :</p>
<ul>
<li>compiler</li>
<li>build system (e.g. make)</li>
<li>pdf, png, midi, wav, svg, xml, json, yaml readers and writers</li>
<li>3d renderer</li>
<li>GUI system</li>
<li>static site generator (including markdown, html parsers)</li>
<li>web server and client</li>
</ul>
<p>I had originally written them in modern C++, but it didn't feel 'from scratch' enough. So I wrote replacements for STL containers and memory management - basically seeing if I could run something without the C++ standard library. If you are shouting 'why?!' right now - know that I am too.</p>
<p>The original goal of this 'from scratch' library was to build tooling for myself to use - since I mostly end up hitting rough edges or things I don't like about other tools. That and of course the 'for fun' or yak shaving element. However with Emacs and increased comfort in keyboard-driven workflows I need this tooling less now. I hope to use pieces of this library in 2025, while learning some of the other languages, particularly C, Rust and Guile Scheme.</p>
<p>The side project I did get completed was a website for my wedding. This was a 'from scratch' HTML/CSS/Vanilla JS frontend with a Cherrypy backend. It came out looking fairly ok, although building it at the same time as planning a wedding was probably unwise.</p>
<p>I am still yet to contribute to a (non-work) collaborative open source project - not good. Hopefully that will change in 2025.</p>
<h3 id="analysis-and-theory">Analysis and Theory</h3>
<p>I haven't spent much time brushing up on analytical or theoretical skills this year - I've had a brief interaction with computational mechanics again, namely crystal plasticity theory but I can see more theoretical research on the horizon in 2025.</p>
<h3 id="sustainability">Sustainability</h3>
<p>I grew my own vegetables in my small back garden this year including setting up a chunky box-planter. This was very successful and should hopefully be back next year.</p>
<p>I cycle to work most days but it has been a tough year for bike maintenance. I have a weird racer bike and seemingly need to do most maintenance myself - anything that can break on the bike has this year. Learning how to fix each issue has been slow.</p>
<h2 id="2025-plans">2025 Plans</h2>
<p>And so, the lofty plans for 2025...</p>
<h3 id="operating-systems-1">Operating Systems</h3>
<ul>
<li>Write up how low-level Linux ecosystem services work and fit together (e.g. PAM, elogind, DBus, Wayland seats) in the context of Guix, so I learn about them</li>
<li>Handle power management on my laptop - including Sway Idle, at the moment I don't know how to suspend or check if it is in low power mode
<ul>
<li>Add a little icon to sway bar for charging</li>
</ul>
</li>
<li>Handle sound management on laptop - currently I have no keyboard control over sound levels</li>
<li>Learn about and implement Guix Home</li>
<li>Further customize and simplify my Guix config (yes, nice and vague)</li>
<li>Learn about Nix and Nix Home for my work Mac</li>
</ul>
<h3 id="ides-1">IDEs</h3>
<ul>
<li>Try to not depend on treemacs so much - try dired only or similar</li>
<li>Add email handling to Emacs config</li>
<li>Learn more Emacs and Vim keyboard shortcuts - particularly document navigation and search</li>
<li>Learn basic regex</li>
<li>Learn and document how Emacs packaging works</li>
<li>Learn magit properly</li>
<li>Find a comfortable way to work with Emacs shell</li>
<li>Find a comfortable way to browse web with Emacs</li>
<li>Learn to use a LISP REPL in Emacs</li>
<li>Learn Python and C debugging and profiling in Emacs</li>
<li>Come up with a comfortable Emacs and Vim config for remote terminal sessions.</li>
<li>Troubleshoot slow initial file search in Emacs on Mac</li>
<li>Link Emacs forge support with forgejo</li>
</ul>
<h3 id="self-hosting">Self Hosting</h3>
<ul>
<li>Set up a backup solution</li>
<li>Expose locally hosted services via Wireguard and cloud instance</li>
<li>Set up Nextcloud for documents, calendar and contacts</li>
<li>Set up own mail server for receive</li>
<li>Move forgejo to local hosting and set up a Foregejo runner</li>
<li>Set up service monitoring</li>
<li>Set up local network monitoring and altering</li>
<li>Network my USB printer via an RPI</li>
</ul>
<h3 id="languages-1">Languages</h3>
<p>This is the area where I have most FOMO in terms of what to spend my time on (FWIW I have zero FOMO on not learning AI APIs or prompt engineering). There is such a rich environment of modern languages and development ecosystems to choose from and it seems there is plenty of scope for exciting developments.</p>
<p>At a meta level - I would like to learn how compilers work and programming language theory and design, but I'm not sure 2025 will allow me to go too deep there.</p>
<h4 id="c">C</h4>
<p>Of course, I 'known' C - I've written snippets of code and tutorials in it and have lots of C++ experience, but I don't 'know know' C. I've never written enough of it to have to deal with complexities, edge cases or to have thought about code style. I'd like to learn more of it since it is still foundational to low-level Linux utilities - which I want to understand, modify and maybe contribute to. This year I'd like to write a full side-project or two in C.</p>
<h4 id="rust">Rust</h4>
<p>I like the idea of Rust and I'm tired of C++ and its package management disaster zone. Still, I'm wary of Rust's own approach to package management - seemingly following the 'pip' and 'npm' roads. I'm also wary of static linking and the complex build and compile ecosystem. While I do think it is possible in theory to write moderately safe C++ with suitable use of its modern pointers, I have sadly been exposed to large C++ projects in the real world.</p>
<p>So overall, the future is looking bright for Rust and all impressions I've read are that the language itself is pleasant to use. So, I'm on board. Hopefully I can get a project or two completed in Rust this year.</p>
<h4 id="guile-scheme">Guile Scheme</h4>
<p>I'm quite sure I want to learn some Lisp - I've read too much on how different, powerful and fun it is not to and would like to build up my functional programming skills. Since it is now powering my operating system and IDE, it would seem important to know a bit too.</p>
<p>From reading around Scheme seems a well regarded Lisp dialect to pick up, and given my 'free software' leanings and use of Guix then Guile Scheme seems a good implementation. So, hopefully some Guile Scheme projects are on the horizon too.</p>
<p>I'm curious about more 'powerful' dialects I've heard about too, like Racket and Clojure although they may be for another year - along with Haskell on the functional programming odyssey.</p>
<h3 id="side-projects-and-open-source-contributions-1">Side Projects and Open Source Contributions</h3>
<h4 id="personal-site">Personal Site</h4>
<p>I'd like to get my personal site into better shape as a blog, including:</p>
<ul>
<li>supporting blog posts</li>
<li>supporting RSS</li>
<li>looking a bit nicer</li>
</ul>
<p>Currently it is being built using Python - I'm thinking about using Scheme instead, possibly with Rust for Markdown parsing - which is related to another project of interest.</p>
<p>For blog posts, some I'd like to cover include:</p>
<ul>
<li>A review of the Supercomputing conference SC24</li>
<li>A retrospective on moving from Vs Code to Emacs</li>
<li>A review of my vegetable patch experience</li>
</ul>
<p>I'd also like to start making some videos - so some OBs practice is on the cards.</p>
<h4 id="open-source">Open Source</h4>
<p>I'd like to contribute to Forgejo and particularly efforts around federation. I think that is a really promising feature for Open Science (which I think has no business depending on Github) where labs or institutes host their own forges with rich linked data features that Github will never build.</p>
<p>I'd also like to contribute to Guix - I'm not sure how yet but maybe I can do something useful around infrastructure or testing.</p>
<h4 id="creative">Creative</h4>
<p>I'd like to get back making 3d renders and some electronic music - I'm not sure what form they'll take yet - maybe I can involve Scheme somehow.</p>
<h4 id="analysis-and-theory-1">Analysis and Theory</h4>
<p>Some areas I'd like to cover more:</p>
<ul>
<li>Continuum Mechanics, Crystal Plasticity Theory and Finite Element solvers - getting back up to speed</li>
<li>Implementation of digitial quantum simulators - e.g. how to solve quantum circuits on classical computers</li>
<li>How transformers work in Machine Learning - my ML knowledge pretty much stops in 2017</li>
</ul>
<h2 id="and-beyond">And Beyond...</h2>
<p>What is the big plan or picture? Basically:</p>
<ul>
<li>having a minimal, contrarian computing setup that I understand well and have a good degree of control over. Something involving Guix, Hurd, Emacs etc.</li>
<li>having a comfortable setup for creative activities: writing, 3D rendering, video creation and music creation</li>
<li>having a low footprint hosting setup - both financial cost and resource use-wise</li>
<li>keeping up-to-date with modern technology and being able to tell hype from genuinely interesting progress</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Interesting Blogs</title>
      <link>https://jmsgrogan.com/articles/interesting_blogs.html</link>
      <guid>https://jmsgrogan.com/articles/interesting_blogs.html</guid>
      <pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Interesting Blogs</h1>
</header>

<p>This is a collection of some blogs I've found interesting. Sometimes I move specific links into more dedicated articles.</p>
<ul>
<li><a href="https://blog.linuxgrrl.com">MÁIRÍN DUFFY</a>: Open design, Senior principal interaction designer at Red Hat.</li>
<li><a href="https://austinhenley.com/blog/25yearsofai.html">Austin Henley</a>: Developer tooling in academia and industry.</li>
<li><a href="https://shkspr.mobi/blog/">Terence Eden</a>: General tech ranting</li>
<li><a href="https://neilzone.co.uk/">Neil Brown</a>: Open source stuff and self-hosting - good level of technical detail</li>
<li><a href="https://brennan.io/">Stephen Brennan</a>: Low level C stuff</li>
<li><a href="https://nullprogram.com/">Chris Wellons</a>: C and C++ programming</li>
<li><a href="https://lambdaland.org/posts/">Ashton Wiersdorf</a>: Programming language design - lispy stuff</li>
<li><a href="https://leon_plickat.srht.site/writing/index.html">Leon Plickat</a>: Linux systems tooling, programming</li>
<li><a href="https://www.futurile.net/">Futurile</a>: Guix stuff</li>
</ul>
</article>
]]></description>
    </item>
    <item>
      <title>Interesting Sites</title>
      <link>https://jmsgrogan.com/articles/interesting_sites.html</link>
      <guid>https://jmsgrogan.com/articles/interesting_sites.html</guid>
      <pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate>
      <description><![CDATA[<article class="article">
<header class="article-header">
<h1>Interesting Sites</h1>
</header>

<p>This is an unstructured list of web-sites I find interesting. I keep them here rather than as a collection of browser bookmarks as I find this format easier to structure. Some get pulled into more structured articles as references or 'further reading' and eventually removed from this list. So in a way, this is sort of a 'to-do list' or staging area.</p>
<h2 id="tech-compilations">Tech compilations</h2>
<ul>
<li><a href="https://digitalsuperpowers.com/book/">Digital Superpowers</a></li>
<li><a href="https://aosabook.org/en/index.html">Arch overview open source</a></li>
<li><a href="https://github.com/codecrafters-io/build-your-own-x">Build your own x</a></li>
<li><a href="https://olano.dev/blog/my-software-bookshelf/">My Software Bookshelf</a></li>
</ul>
<h2 id="compilers">Compilers</h2>
<ul>
<li><a href="https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html">LLVM Tutorial</a></li>
<li><a href="https://vector-of-bool.github.io/2017/01/21/cmrc.html">Resource compiler</a></li>
<li><a href="https://www.gnu.org/software/bison/manual/bison.html">Bison</a></li>
<li><a href="https://4zm.org/2024/12/25/a-simple-elf.html">ELF Format</a></li>
</ul>
<h2 id="assembly">Assembly</h2>
<ul>
<li><a href="https://jameshfisher.com/2018/03/10/linux-assembly-hello-world/">Asm hello world</a></li>
<li><a href="https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl">Linux syscall list</a></li>
</ul>
<h2 id="languages">Languages</h2>
<ul>
<li><a href="https://pymotw.com/3/">Python module of the week</a></li>
<li><a href="https://www.trickster.dev/post/lesser-known-parts-of-python-standard-library/">Lesser known parts of the Python standard library</a></li>
<li><a href="https://cs3110.github.io/textbook/chapters/preface/about.html">OCaml Book</a></li>
<li><a href="https://nullprogram.com/blog/2023/10/08/#strings">C Coding Style</a></li>
<li><a href="https://lambdaland.org/posts/2024-11-21_powerful_or_safe_languages/">Language power with Racket</a></li>
</ul>
<h2 id="file-formats">File Formats</h2>
<ul>
<li><a href="https://datatracker.ietf.org/doc/html/rfc1950">Zlib spec</a></li>
<li><a href="https://marknelson.us/posts/1997/01/01/zlib-engine.html">zlib overview</a></li>
<li><a href="http://www.libpng.org/pub/png/spec/1.2/png-1.2.pdf">PNG spec</a></li>
<li><a href="https://www.rfc-editor.org/rfc/rfc1951.pdf">Deflate spec</a></li>
<li><a href="http://zarb.org/~gc/html/libpng.html">png tutorial</a></li>
</ul>
<h2 id="file-systems">File Systems</h2>
<ul>
<li><a href="https://www.highgo.ca/2022/07/22/how-to-setup-lustre-file-system-and-run-postgres-on-it/">Lustre</a></li>
</ul>
<h2 id="data-structures">Data Structures</h2>
<ul>
<li><a href="https://www.cs.odu.edu/~zeil/cs361/latest/Public/vectorImpl/index.html">Implementing a vector</a></li>
</ul>
<h2 id="shell">Shell</h2>
<ul>
<li><a href="https://github.com/bobbyiliev/introduction-to-bash-scripting">Introduction to bash scripting</a></li>
<li><a href="https://clig.dev/#help">Command Line Interface Guidelines</a></li>
<li><a href="https://jvns.ca/blog/2024/07/08/readline/">Terminal text</a></li>
<li><a href="http://www.linusakesson.net/programming/tty/index.php">TTY demystified</a></li>
<li><a href="https://brennan.io/2015/01/16/write-a-shell-in-c/">Write a shell in C</a></li>
<li><a href="https://weiyen.net/articles/useful-macos-cmd-line-utilities/">Mac CLI Tips</a></li>
<li><a href="https://rwblickhan.org/newsletters/command-line-tools-i-like-2022/">Command line tools</a></li>
</ul>
<h2 id="graphics">Graphics</h2>
<ul>
<li><a href="https://paulbourke.net/geometry/polygonmesh/">Polygons and meshes</a></li>
<li><a href="https://www.x.org/releases/X11R7.6/doc/libxcb/tutorial/index.html">xcb</a></li>
<li><a href="https://xcb.freedesktop.org/tutorial/">xcb</a></li>
<li><a href="https://xcb.freedesktop.org/opengl/#index5h1">opengl</a></li>
<li><a href="https://www.linuxjournal.com/content/introduction-opengl-programming">opengl</a></li>
<li><a href="https://bleuje.com/animationsite/2023_1/">cool animations</a></li>
<li><a href="https://github.com/2Retr0/GodotOceanWaves">Ocean waves</a></li>
<li><a href="https://thebookofshaders.com/">Book of Shaders</a></li>
<li><a href="https://github.com/psenough/teach_yourself_demoscene_in_14_days">Demoscene</a></li>
<li><a href="https://iquilezles.org/">More demoscene</a></li>
<li><a href="https://demobasics.pixienop.net/">Demoscene basics</a></li>
</ul>
<h2 id="audio">Audio</h2>
<ul>
<li><a href="http://www.personal.kent.edu/~sbirch/Music_Production/MP-II/MIDI/midi_file_format.htm">Midi format</a></li>
<li><a href="https://web.archive.org/web/20141227205754/http://www.sonicspot.com:80/guide/midifiles.html">midi format</a></li>
<li><a href="http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html">Midi format</a></li>
<li><a href="https://alsa-project.org/wiki/Tutorials_and_Presentations">alsa</a></li>
</ul>
<h2 id="text-editors">Text Editors</h2>
<ul>
<li><a href="https://www.linuxfoundation.org/blog/blog/classic-sysadmin-vim-101-a-beginners-guide-to-vim">Sysadmin guide to vim</a></li>
<li><a href="https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/">Sample emacs config</a></li>
<li><a href="https://leon_plickat.srht.site/writing/painless-mail-imaps-smtp-gnus-emacs/article.html">Email in emacs</a></li>
</ul>
<h2 id="networking">Networking</h2>
<ul>
<li><a href="https://www.cs.rpi.edu/~moorthy/Courses/os98/Pgms/socket.html">sockets</a></li>
<li><a href="https://www.jmarshall.com/easy/http/">http made easy</a></li>
<li><a href="https://taggart-tech.com/wireguard/">Wireguard for private network</a></li>
<li><a href="https://mwl.io/nonfiction/tools">Sysadmin tools</a></li>
</ul>
<h2 id="database">Database</h2>
<ul>
<li><a href="https://mrkaran.dev/posts/barreldb/">Writing a kv store</a></li>
</ul>
<h2 id="containers">Containers</h2>
<ul>
<li><a href="https://optimizedbyotto.com/post/linux-containers-docker/">Linux containers</a></li>
</ul>
<h2 id="web">Web</h2>
<ul>
<li><a href="https://alignedleft.com/tutorials/d3/drawing-divs">Drawing divs</a></li>
<li><a href="https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/">Dockerizing Django</a></li>
</ul>
<h2 id="database-1">Database</h2>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Database_storage_structures">Database storage structures</a></li>
</ul>
<h2 id="publishing">Publishing</h2>
<ul>
<li><a href="https://texdoc.org/serve/memdesign/0">A Few Notes on Book Design</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/MathML/Fonts">MathMl fonts</a></li>
<li><a href="https://behdad.org/text2024/">Text rendering</a></li>
<li><a href="https://www.amazon.co.uk/Visual-Display-Quantitative-Information/dp/0961392142">The Visual Display of Quantitative Information</a></li>
</ul>
<h2 id="architecture-and-design">Architecture and Design</h2>
<ul>
<li><a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html">Clean Coder Blog</a></li>
</ul>
<h2 id="security">Security</h2>
<ul>
<li><a href="https://github.blog/security/vulnerability-research/uncovering-gstreamer-secrets/">Fuzzing GStreamer</a></li>
<li><a href="https://joshua.hu/">Joshua Rogers</a></li>
</ul>
<h2 id="maths">Maths</h2>
<ul>
<li><a href="https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf">The Matrix Cookbook</a></li>
<li><a href="https://tensorcookbook.com/">The Tensor Cookbook</a></li>
</ul>
<h2 id="machine-learning">Machine Learning</h2>
<ul>
<li><a href="https://rish-01.github.io/blog/posts/ml_estimation/">MLE</a></li>
<li><a href="https://www.ruder.io/optimizing-gradient-descent/">Gradient Descent Overview</a></li>
<li><a href="https://nrehiew.github.io/blog/2024/">Generative Models Overview</a></li>
</ul>
<h2 id="linked-data">Linked Data</h2>
<ul>
<li><a href="https://ws-dl.blogspot.com/2024/11/2024-11-13-doi-uri-scheme-utility-or.html">DOI URI Scheme</a></li>
</ul>
<h2 id="games">Games</h2>
<ul>
<li><a href="https://github.com/alxyng/flappybird">Flappy Bird C Clone</a></li>
</ul>
<h2 id="operating-systems">Operating Systems</h2>
<ul>
<li><a href="http://crn.hopto.org/unix/">Unix History</a></li>
</ul>
<h3 id="guix">Guix</h3>
<ul>
<li><a href="https://www.draketo.de/software/guix-work.html">Soft dev environment blog</a></li>
</ul>
<h2 id="live-and-minimalist-computing">Live and Minimalist Computing</h2>
<ul>
<li><a href="https://albertzak.com/run-build-grow/">Emacs like editor on steroids</a></li>
<li><a href="https://offby1.website/posts/uv-direnv-and-simple-envrc-files.html">Direnv and .envrc files</a></li>
</ul>
<h2 id="hardware">Hardware</h2>
<ul>
<li><a href="https://www.peterzimon.com/hog/">Making an analogue synth</a></li>
</ul>
<h2 id="gardening">Gardening</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=9R-utqpmwmE">Planning a vegetable garden for beginners</a></li>
</ul>
</article>
]]></description>
    </item>
  </channel>
</rss>
