<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notebook</title><link>http://blog.cmac4603.dev/</link><description>Recent content on Notebook</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 29 Aug 2026 14:28:29 +0100</lastBuildDate><atom:link href="http://blog.cmac4603.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Neovim and Rustaceanvim With Esp Toolchain</title><link>http://blog.cmac4603.dev/posts/nvim-and-rustaceanvim-with-esp-toolchain/</link><pubDate>Sat, 29 Aug 2026 14:28:29 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/nvim-and-rustaceanvim-with-esp-toolchain/</guid><description>&lt;p&gt;I was trying to get cargo to use the custom &lt;code&gt;esp&lt;/code&gt; toolchain from Espressif, but use &lt;code&gt;stable&lt;/code&gt; for rust-analyzer because the &lt;code&gt;esp&lt;/code&gt; toolchain does not include a rust-analyzer component.&lt;/p&gt;
&lt;p&gt;Neovim has a built-in option to load user-defined config at the project level called &lt;code&gt;excr&lt;/code&gt;, which can be enabled with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim.o.exrc &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#75715e"&gt;-- enable project local config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this enabled, the following &lt;code&gt;.nvim.lua&lt;/code&gt; will merge the global configuration I have set for &lt;code&gt;vim.g.rustaceanvim&lt;/code&gt; (and this is helpful because I have settings for use with the &lt;code&gt;bacon-lsp&lt;/code&gt; as well):&lt;/p&gt;</description></item><item><title>ESP32-C5 Programmable Usb</title><link>http://blog.cmac4603.dev/posts/esp32-c5-programmable-usb/</link><pubDate>Sun, 23 Aug 2026 13:04:17 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/esp32-c5-programmable-usb/</guid><description>&lt;p&gt;TL;DR: it can&amp;rsquo;t be done.&lt;/p&gt;
&lt;p&gt;The USB peripheral on ESP32-C5 is non-programmable and only supports serial/JTAG (unless they release a new MCU).&lt;/p&gt;</description></item><item><title>Adding Environment Variables to Linux GUI Apps</title><link>http://blog.cmac4603.dev/posts/adding-environment-variables-to-linux-gui-apps/</link><pubDate>Mon, 17 Aug 2026 21:37:22 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/adding-environment-variables-to-linux-gui-apps/</guid><description>&lt;p&gt;Find the app your looking for:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo find / -type f -iname &lt;span style="color:#e6db74"&gt;&amp;#34;*myapp*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nvim /usr/share/applications/org.myapp.MyApp.desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll want to look for the &lt;code&gt;Exec&lt;/code&gt; key, and prepend the env vars to the app command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Exec=env MY_ENV_VAR=hello my-app-cmd %U
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Trouble.nvim Filtering by Lsp</title><link>http://blog.cmac4603.dev/posts/trouble.nvim-filtering-by-lsp/</link><pubDate>Sun, 09 Aug 2026 16:58:13 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/trouble.nvim-filtering-by-lsp/</guid><description>&lt;h2 id="filtering-by-lsp-aka-source"&gt;Filtering by LSP aka &amp;ldquo;source&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;I like cSpell, but I don&amp;rsquo;t need a spell checker in my &lt;a href="https://github.com/folke/trouble.nvim"&gt;trouble.nvim&lt;/a&gt; diagnostics window. This can also be used for other LSPs/sources, but cSpell is the only LSP I want to keep around, just not when I toggle &lt;code&gt;trouble.nvim&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;folke/trouble.nvim&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; opts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; diagnostics &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(items)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; vim.tbl_filter(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; source &lt;span style="color:#f92672"&gt;=&lt;/span&gt; item[&lt;span style="color:#e6db74"&gt;&amp;#34;item.source&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;or&lt;/span&gt; (item.item &lt;span style="color:#f92672"&gt;and&lt;/span&gt; item.item.source)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; (source &lt;span style="color:#f92672"&gt;and&lt;/span&gt; string.find(string.lower(source), &lt;span style="color:#e6db74"&gt;&amp;#34;cspell&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;, items)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>ESP32, Embassy &amp; Sockets</title><link>http://blog.cmac4603.dev/posts/esp32-embassy-sockets/</link><pubDate>Sun, 09 Aug 2026 12:02:50 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/esp32-embassy-sockets/</guid><description>&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;I was running a webserver (&lt;a href="https://crates.io/crates/picoserve"&gt;picoserve&lt;/a&gt;), but I was only able to run one worker; somewhere in the picoserve code I was running into a panic from &lt;a href="https://docs.rs/smoltcp/latest/smoltcp/iface/struct.SocketSet.html#method.add"&gt;SocketSet add&lt;/a&gt; function, specifically this panic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mut&lt;/span&gt; self.sockets {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ManagedSlice::Borrowed(_) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;panic!&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;adding a socket to a full SocketSet&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#[cfg(feature = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;alloc&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ManagedSlice::Owned(sockets) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sockets.push(SocketStorage { inner: None });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sockets.len() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; put(index, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mut&lt;/span&gt; sockets[index], socket)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The problem, I &lt;em&gt;eventually&lt;/em&gt; figured out, was that the network stack created with &lt;a href="https://crates.io/crates/embassy-net"&gt;&lt;code&gt;embassy-net&lt;/code&gt;&lt;/a&gt; was being initialized with 3 sockets: one for DHCP, one for DNS, and one for the rest of the code.&lt;/p&gt;</description></item><item><title>Lily T-Dongle S3 SD Card Pins</title><link>http://blog.cmac4603.dev/posts/lily-t-dongle-s3-sd-card-pins/</link><pubDate>Sun, 19 Jul 2026 10:28:54 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/lily-t-dongle-s3-sd-card-pins/</guid><description>&lt;h2 id="sd-card-pin-numbers-for-use-with-spi"&gt;SD Card pin numbers for use with SPI&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;LilyGo Pin Name&lt;/th&gt;
 &lt;th&gt;GPIO #&lt;/th&gt;
 &lt;th&gt;SPI&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D0&lt;/td&gt;
 &lt;td&gt;14&lt;/td&gt;
 &lt;td&gt;MISO&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D1&lt;/td&gt;
 &lt;td&gt;17&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D2&lt;/td&gt;
 &lt;td&gt;21&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_D3&lt;/td&gt;
 &lt;td&gt;18&lt;/td&gt;
 &lt;td&gt;CS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_CLK&lt;/td&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;SCK&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SDMMC_CMD&lt;/td&gt;
 &lt;td&gt;16&lt;/td&gt;
 &lt;td&gt;MOSI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; spi_bus &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Spi::new(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; peripherals.&lt;span style="color:#66d9ef"&gt;SPI2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; spi::master::Config::default()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .with_frequency(Rate::from_khz(&lt;span style="color:#ae81ff"&gt;400&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .with_mode(spi::Mode::_0),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.unwrap()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.with_sck(peripherals.&lt;span style="color:#66d9ef"&gt;GPIO12&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// clk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.with_mosi(peripherals.&lt;span style="color:#66d9ef"&gt;GPIO16&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// cmd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.with_miso(peripherals.&lt;span style="color:#66d9ef"&gt;GPIO14&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// d0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.into_async();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; sd_cs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Output::new(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; peripherals.&lt;span style="color:#66d9ef"&gt;GPIO18&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// d3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Level::High,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OutputConfig::default().with_pull(Pull::Up),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; spi_dev &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ExclusiveDevice::new(spi_bus, sd_cs, Delay).unwrap();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; sdcard &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SdCard::new(spi_dev, Delay);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Hyprctl Moving Workspace Between Monitors</title><link>http://blog.cmac4603.dev/posts/hyprctl-moving-workspace-between-monitors/</link><pubDate>Thu, 25 Jun 2026 09:48:06 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/hyprctl-moving-workspace-between-monitors/</guid><description>&lt;p&gt;Hyprland recently migrated to lua, and this changed the inputs &lt;code&gt;hyprctl&lt;/code&gt; required, so this is just a quick note about how to move workspaces between monitors if you have more than one.&lt;/p&gt;
&lt;p&gt;The old command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hyprctl dispatch moveworkspacetomonitor &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;New:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hyprctl dispatch &lt;span style="color:#e6db74"&gt;&amp;#39;hl.dsp.workspace.move({ workspace = 2, monitor = 1 })&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://wiki.hypr.land/Configuring/Basics/Dispatchers/"&gt;Dispatcher documentation&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Flashing ESP32 Mini SD Card</title><link>http://blog.cmac4603.dev/posts/flashing-esp32-mini-sd-card/</link><pubDate>Sun, 21 Jun 2026 18:40:16 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/flashing-esp32-mini-sd-card/</guid><description>&lt;p&gt;For most ESP32 projects, a microSD card should be formatted to FAT32.&lt;/p&gt;
&lt;p&gt;FAT32 only supports microSD cards up to 32GB.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# find the sd card with lsblk, then unmount it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo umount /dev/mmcblk0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# format in fat32 command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkfs.vfat -F32 /dev/mmcblk0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Serial Console in the Terminal</title><link>http://blog.cmac4603.dev/posts/serial-console-in-the-terminal/</link><pubDate>Thu, 11 Jun 2026 10:42:43 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/serial-console-in-the-terminal/</guid><description>&lt;p&gt;Instructions on how to connect to a device over serial USB port in the terminal on Arch with either &lt;code&gt;minicom&lt;/code&gt; or &lt;code&gt;tio&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Beforehand, ensure your user is in these groups (if adding, reboot machine).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# adding your user to these groups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG dialout tty uucp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="with-minicom"&gt;With minicom&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install the &lt;a href="https://archlinux.org/packages/extra/x86_64/minicom/"&gt;&lt;code&gt;minicom&lt;/code&gt;&lt;/a&gt; serial communication program.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -Sy minicom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connect to device over serial comms (here it is at &lt;code&gt;/dev/ttyUSB0&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>OpenVPN on Arch</title><link>http://blog.cmac4603.dev/posts/openvpn-on-arch/</link><pubDate>Tue, 09 Jun 2026 12:26:29 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/openvpn-on-arch/</guid><description>&lt;h2 id="import-using-systemctl"&gt;Import using systemctl&lt;/h2&gt;
&lt;p&gt;Copy OpenVPN client file to &lt;code&gt;/etc&lt;/code&gt; directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp client.ovpn /etc/openvpn/client/myvpnconf.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Systemctl&amp;rsquo;s &lt;code&gt;enable&lt;/code&gt; command turns on the service on boot, the &lt;code&gt;--now&lt;/code&gt; flag also starts the service immediately:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# note the filename after @&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable --now openvpn-client@myvpnconf.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will start the VPN service with that configuration on boot, but this won&amp;rsquo;t integrate with networkmanager.&lt;/p&gt;
&lt;h2 id="integrating-vpn-connections--with-networkmanager"&gt;Integrating VPN connections with networkmanager&lt;/h2&gt;
&lt;h3 id="disable-the-original-systemctl-service-if-added-previously"&gt;Disable the original systemctl service (if added previously)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl disable --now openvpn-client@myvpnconf.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="import-openvpn-connection"&gt;Import OpenVPN connection&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmcli connection import type openvpn file myvpnconf.ovpn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="edit-the-connection-to-add-username--password"&gt;Edit the connection to add username &amp;amp; password&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmcli connection modify myvpnconf &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +vpn.data &lt;span style="color:#e6db74"&gt;&amp;#34;connection-type=password-tls, username=&lt;/span&gt;$USERNAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vpn.user-name $USERNAME &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +vpn.secrets &lt;span style="color:#e6db74"&gt;&amp;#34;password=&lt;/span&gt;$PASSWORD&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="automatically-connect-to-vpn"&gt;Automatically connect to VPN&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;List connections&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmcli connection
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME UUID TYPE DEVICE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zrh-003 d46e4a92-778e-4792-b085-e1f638ecb8e3 vpn enp1s0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enp1s0 1715b889-3c47-3e21-a86f-94ce207297a9 ethernet enp1s0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tun0 7405f329-255d-4b50-b98d-c2e865a443a4 tun tun0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Edit connection by adding the VPN UUID&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# note if device name doesn&amp;#39;t work use the UUID of the connection (not the VPN)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmcli c edit enp1s0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmcli&amp;gt; set connection.secondaries d46e4a92-778e-4792-b085-e1f638ecb8e3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nmcli&amp;gt; save persistent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connection &lt;span style="color:#e6db74"&gt;&amp;#39;enp1s0&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;1715b889-3c47-3e21-a86f-94ce207297a9&lt;span style="color:#f92672"&gt;)&lt;/span&gt; successfully updated.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Connecting to ESP32</title><link>http://blog.cmac4603.dev/posts/connecting-to-esp32/</link><pubDate>Tue, 09 Jun 2026 08:45:33 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/connecting-to-esp32/</guid><description>&lt;link rel="stylesheet" href="http://blog.cmac4603.dev/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous"&gt;
 &lt;div class="admonition note"&gt;
 &lt;div class="admonition-header"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"&gt;&lt;path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/&gt;&lt;/svg&gt;
 &lt;span&gt;Note&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="admonition-content"&gt;
 &lt;p&gt;The hardware in this example is the &lt;a href="https://esp-rs.github.io/esp-rust-board/"&gt;&lt;code&gt;ESP32-C3-DevKit-RUST-1&lt;/code&gt;&lt;/a&gt; on Arch&lt;/p&gt;</description></item><item><title>Serial Port Access on Arch</title><link>http://blog.cmac4603.dev/posts/serial-port-access-on-arch/</link><pubDate>Sat, 30 May 2026 09:35:24 +0100</pubDate><guid>http://blog.cmac4603.dev/posts/serial-port-access-on-arch/</guid><description>&lt;p&gt;For access to microcontrollers, such as the ESP32, permissions are required to enable flashing devices etc. If having issues, but seeing the port connected, check the port first (in my example the port was &lt;code&gt;/dev/ttyACM0&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l /dev/ttyACM0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;crw-rw---- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root uucp 166, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; May &lt;span style="color:#ae81ff"&gt;27&lt;/span&gt; 21:05 /dev/ttyACM0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice the group &lt;code&gt;uucp&lt;/code&gt; has access, we just need to add ourselves to it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG uucp $USER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A restart may be required for this to take effect.&lt;/p&gt;</description></item></channel></rss>