<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title> - Posts</title>
      <link>https://rmdd.net/posts/</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://rmdd.net/posts/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 01 Aug 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Bind mounts are useful on NixOS</title>
          <pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate>
          <author>Raymond Douglas</author>
          <link>https://rmdd.net/posts/2026/bind-mounts-nixos/</link>
          <guid>https://rmdd.net/posts/2026/bind-mounts-nixos/</guid>
          <description xml:base="https://rmdd.net/posts/2026/bind-mounts-nixos/">&lt;p&gt;Often, a NixOS module will not surface an option for overriding the default filesystem path for that module&#x27;s persistence. Labeled &lt;code&gt;dataDir&lt;&#x2F;code&gt; or &lt;code&gt;stateDir&lt;&#x2F;code&gt;, this option is useful for placing stateful data in a known location for backups or other organizational reasons.&lt;&#x2F;p&gt;
&lt;p&gt;In the case of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;blob&#x2F;nixos-unstable&#x2F;nixos&#x2F;modules&#x2F;services&#x2F;networking&#x2F;unifi.nix&quot;&gt;Unifi module&lt;&#x2F;a&gt; there is no such exposed option. Though Nix&#x2F;NixOS has several solutions to this predicament.&lt;&#x2F;p&gt;
&lt;p&gt;In the module definition there is a clear &lt;code&gt;let&lt;&#x2F;code&gt; variable for &lt;code&gt;stateDir&lt;&#x2F;code&gt; already. But, &lt;code&gt;let&lt;&#x2F;code&gt; expressions cannot be overridden by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;manual&#x2F;nixpkgs&#x2F;unstable&#x2F;#sec-pkg-overrideAttrs&quot;&gt;overrideAttrs&lt;&#x2F;a&gt;. And &lt;code&gt;${stateDir}&lt;&#x2F;code&gt; is called ten times in the module, and frequently interpolated into strings. It would be very annoying to override each calling attribute just to change this path.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;em&gt;right&lt;&#x2F;em&gt; thing to do is to open a pull request against Nixpkgs to surface &lt;code&gt;dataDir&lt;&#x2F;code&gt; as an option, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;pull&#x2F;478785&quot;&gt;which someone did in January&lt;&#x2F;a&gt;. And it&#x27;s clean because it only concerns the &lt;code&gt;&#x2F;data&lt;&#x2F;code&gt; subpath in the modules &lt;code&gt;stateDir&lt;&#x2F;code&gt; root. The rest of the contents in &lt;code&gt;stateDir&lt;&#x2F;code&gt; are not crucial for persistence.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        BindPaths = [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          [...]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;         &amp;quot;${cfg.dataDir}:${stateDir}&#x2F;data&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          [...]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But in the interim I will leverage &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.nixos.org&#x2F;wiki&#x2F;Filesystems#Bind_mounts&quot;&gt;filesystem bind mounts&lt;&#x2F;a&gt;, referencing the hard coded path in the module.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; }:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  services&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;unifi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    openFirewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; = false;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;  fileSystems&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;var&#x2F;lib&#x2F;unifi&#x2F;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    device&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;&#x2F;persist&#x2F;unifi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; # Where I tend to keep things.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    fsType&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;none&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt;    options&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; [ &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;&amp;quot; ]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pretty readable and understandable!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Civic inheritance</title>
          <pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate>
          <author>Raymond Douglas</author>
          <link>https://rmdd.net/posts/2026/civic-inheritance/</link>
          <guid>https://rmdd.net/posts/2026/civic-inheritance/</guid>
          <description xml:base="https://rmdd.net/posts/2026/civic-inheritance/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rmdd.net&#x2F;posts&#x2F;2026&#x2F;civic-inheritance&#x2F;monterey-meter.jpeg&quot; alt=&quot;A standalone parking meter&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Here in San Luis Obispo, the downtown area&#x27;s street parking has largely migrated to license plate-tied &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.slocity.org&#x2F;government&#x2F;department-directory&#x2F;public-works&#x2F;parking-services&#x2F;how-to-pay-for-on-street-parking&quot;&gt;pay stations and a &lt;em&gt;PayByPhone&lt;&#x2F;em&gt; mobile app&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;When I began frequenting this area about ten years ago each designated street parking spot had a parking meter like you see above. It accepted coins, cards (chip or strip), and—more recently—contactless forms of payment.&lt;&#x2F;p&gt;
&lt;p&gt;A given parking meter represented a one-to-one relationship with its physically adjacent parking spot. Associating a license plate with the parking payment was wholly unnecessary. The spatial association was obvious, and clearly enforceable by the city.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.paybyphone.com&#x2F;&quot;&gt;&lt;em&gt;PayByPhone&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; isn&#x27;t a bad mobile app by any means. It even lets you pay for parking &lt;em&gt;without creating an account&lt;&#x2F;em&gt; (!), and remembers your vehicle&#x2F;license plate history via local device storage.&lt;&#x2F;p&gt;
&lt;p&gt;My most salient complaint—outside of its obvious contributions to mass surveillance—is that this license plate and database-driven parking system is anti-social.&lt;&#x2F;p&gt;
&lt;p&gt;In the previous era, I could pre-pay for 45 minutes of parking whilst only needing 15 of those minutes. The remaining 30 minutes would remain associated with that parking spot and be &lt;em&gt;civically inherited&lt;&#x2F;em&gt; by the next person to park there.&lt;&#x2F;p&gt;
&lt;p&gt;It was a passive pay-it-forward scheme and it was amazing.&lt;&#x2F;p&gt;
&lt;p&gt;Arriving at a parking meter that had 25 minutes of remaining time from the previous person&#x27;s transaction was like winning a tiny lottery. And with the roles reversed, it was the philanthropic mini-rush of giving &lt;code&gt;$1.30&lt;&#x2F;code&gt; of value to a stranger.&lt;&#x2F;p&gt;
&lt;p&gt;San Luis Obispo still has a number of these older meters at the edges of downtown. And when parking is necessary, I like to seek them out over the more modern alternative.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A modified Casio F-91W</title>
          <pubDate>Sat, 21 Jan 2023 00:00:00 +0000</pubDate>
          <author>Raymond Douglas</author>
          <link>https://rmdd.net/posts/2023/sensor-watch/</link>
          <guid>https://rmdd.net/posts/2023/sensor-watch/</guid>
          <description xml:base="https://rmdd.net/posts/2023/sensor-watch/">&lt;p&gt;Having had—and seldom worn—an Apple watch since 2019 or so, I often found myself &lt;em&gt;liking&lt;&#x2F;em&gt; the idea of a smarter-than-typical watch but never quite aligned with the notification-heavy and tethered nature of the modern smart watch.&lt;&#x2F;p&gt;
&lt;p&gt;A few months ago I came across &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.jgc.org&#x2F;2022&#x2F;10&#x2F;pimping-my-casio-with-oddly-specific.html&quot;&gt;this blog post&lt;&#x2F;a&gt; by John Graham-Cumming in which he performs a literal engine swap of his &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Casio_F-91W&quot;&gt;Casio F-91W&lt;&#x2F;a&gt; with a mainboard from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sensorwatch.net&quot;&gt;Sensor Watch&lt;&#x2F;a&gt; (purchased from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;oddly-specific-objects&#x2F;sensor-watch&quot;&gt;their Crowd Supply page&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;This sweet little board is a drop-in replacement featuring:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;An ARM Cortex M0+ microprocessor&lt;&#x2F;li&gt;
&lt;li&gt;About a year&#x27;s worth of battery life on a single &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Button_cell&quot;&gt;CR2016&lt;&#x2F;a&gt; cell&lt;&#x2F;li&gt;
&lt;li&gt;A very accurate 32.768 KHz crystal&lt;&#x2F;li&gt;
&lt;li&gt;Red-ish, green-ish, and yellow-ish LED backlighting&lt;&#x2F;li&gt;
&lt;li&gt;Access to the original piezo buzzer with some light soldering&lt;&#x2F;li&gt;
&lt;li&gt;A 9-pin connector to access the I&lt;sup&gt;2&lt;&#x2F;sup&gt;C bus and five GPIO for additional sensing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So yes, I ordered an F-91W and a Sensor Watch mainboard with a thermistor sensor board.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;surgery&quot;&gt;Surgery&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rmdd.net&#x2F;posts&#x2F;2023&#x2F;sensor-watch&#x2F;1.jpeg&quot; alt=&quot;Casio with Sensor Watch PCB&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;What&#x27;s nice is that all you need to perform this transplant is a small Phillips screwdriver, some tweezers (a nice-to-have), and a soldering iron&#x2F;solder to move over the piezo buzzer clip.&lt;&#x2F;p&gt;
&lt;p&gt;This video from the creator, Jose Castillo, is more than adequate to get things moving:&lt;&#x2F;p&gt;
&lt;div class=&quot;video&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;Zr0pKeC2VFU&quot;
        webkitallowfullscreen
        mozallowfullscreen
        allowfullscreen&gt;
    &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rmdd.net&#x2F;posts&#x2F;2023&#x2F;sensor-watch&#x2F;2.jpeg&quot; alt=&quot;Casio with back plate removed&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rmdd.net&#x2F;posts&#x2F;2023&#x2F;sensor-watch&#x2F;3.jpeg&quot; alt=&quot;Backside of Sensor Watch PCB&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;firmware&quot;&gt;Firmware&lt;&#x2F;h3&gt;
&lt;p&gt;By building and flashing the community &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sensorwatch.net&#x2F;docs&#x2F;movement&#x2F;&quot;&gt;Movement&lt;&#x2F;a&gt; firmware onto the board, you can leverage their toolchain to configure general functionality, and even &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sensorwatch.net&#x2F;docs&#x2F;movement&#x2F;newface&#x2F;&quot;&gt;design your own watch faces&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If all you&#x27;re interested in is choosing and ordering the set of existing watch faces, you can do so via &lt;code&gt;movement&#x2F;movement_config.h&lt;&#x2F;code&gt; and re-compile&#x2F;re-flash the firmware.&lt;&#x2F;p&gt;
&lt;p&gt;My current watch face array:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8FBCBB;&quot;&gt; watch_face_t&lt;&#x2F;span&gt;&lt;span&gt; watch_faces&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;[] =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    simple_clock_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    countdown_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    stopwatch_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    thermistor_readout_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; &#x2F;* Requires the thermistor sensor board *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    thermistor_logging_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #616E88;&quot;&gt; &#x2F;* ^^^ *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    pulsometer_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    day_one_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    sunrise_sunset_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    moon_phase_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    preferences_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    set_time_face&lt;&#x2F;span&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #ECEFF4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #81A1C1;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The Sensor Watch board has exposed traces such that you can plug it directly into a USB Micro B cable and flash new firmware via the build-in UF2 bootloader. Easy.&lt;&#x2F;p&gt;
&lt;p&gt;Docs are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sensorwatch.net&#x2F;docs&#x2F;firmware&#x2F;&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;enjoyment&quot;&gt;Enjoyment&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rmdd.net&#x2F;posts&#x2F;2023&#x2F;sensor-watch&#x2F;4.jpeg&quot; alt=&quot;Casio on wrist showing temperature&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I highly recommend this project if you&#x27;re losing interest in smart watches, but still like the idea of a tiny ARM computer on your wrist.&lt;&#x2F;p&gt;
&lt;p&gt;My Crowd Supply order shipped within a week—so this project is seemingly no longer in the pre-order phase!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Intel X520: Enabling unsupported transceivers</title>
          <pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate>
          <author>Raymond Douglas</author>
          <link>https://rmdd.net/posts/2020/unsupported-sfp-intel-x520/</link>
          <guid>https://rmdd.net/posts/2020/unsupported-sfp-intel-x520/</guid>
          <description xml:base="https://rmdd.net/posts/2020/unsupported-sfp-intel-x520/">&lt;p&gt;Having recently set up a new-to-me Dell R720 in a colocation provider&#x27;s environment—in my quest to &quot;own&quot; the whole stack from metal to service—I ran into an issue with not being able to use generic or Cisco-coded SFP+&#x2F;SFP trancseivers in the included &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.intel.com&#x2F;content&#x2F;www&#x2F;us&#x2F;en&#x2F;products&#x2F;docs&#x2F;network-io&#x2F;ethernet&#x2F;network-adapters&#x2F;ethernet-x520-server-adapters-brief.html&quot;&gt;Intel X520&lt;&#x2F;a&gt; network card. &lt;code&gt;dmesg&lt;&#x2F;code&gt; kept indicating that the transceiver was &lt;em&gt;unsupported&lt;&#x2F;em&gt;. Because of impatience and other factors, I decided to dig a bit and see what it would take to enable support for good &#x27;ol grab bag generic SFP+&#x2F;SFP transceivers.&lt;&#x2F;p&gt;
&lt;p&gt;I came across &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;forums.servethehome.com&#x2F;index.php?threads&#x2F;patching-intel-x520-eeprom-to-unlock-all-sfp-transceivers.24634&#x2F;&quot;&gt;this article&lt;&#x2F;a&gt; on the ServeTheHome forums where user NathanA had already dug to the bottom of this issue, and fortunately came out the other side with a solution.&lt;&#x2F;p&gt;
&lt;p&gt;NathanA discovered—via datasheets, mailing lists, and discussion threads—that a particular bit in a particular byte of the NIC EEPROM needs to be flipped in order to allow any SFP. In the Linux ixgbe driver, the byte in question is referred to as &lt;code&gt;IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The steps to flip this bit, and thus allowing &quot;unsupported&quot; SFPs, is as follows:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Note: I am in no way liable for any permanent damaged caused by running the following commands on your Intel NIC!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;identify-current-value-of-offset-0x58&quot;&gt;Identify current value of offset 0x58&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sudo ethtool -e eno1 offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0x58&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; length&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;          Values&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;------&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;          ------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;0x0058:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;         fc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;write-the-new-value-to-the-card-s-eeprom&quot;&gt;Write the new value to the card&#x27;s EEPROM&lt;&#x2F;h3&gt;
&lt;p&gt;The new hex value below is identical to simply flipping the last binary bit in the &lt;code&gt;fc&lt;&#x2F;code&gt; hex value.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sudo ethtool -E eno1 magic&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0x10fb8086&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0x58&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0xfd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;let-s-check-if-we-were-successful&quot;&gt;Let&#x27;s check if we were successful&lt;&#x2F;h3&gt;
&lt;p&gt;If the output of the command below returns the &lt;em&gt;new&lt;&#x2F;em&gt; value of our &lt;code&gt;0x58&lt;&#x2F;code&gt; offset, we should be good to go!&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D8DEE9; background-color: #2E3440;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; sudo ethtool -e eno1 offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 0x58&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt; length&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B48EAD;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;Offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;          Values&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;------&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;          ------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88C0D0;&quot;&gt;0x0058:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A3BE8C;&quot;&gt;         fd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What&#x27;s best about this EEPROM change is that is survives reboots, poweroffs, and will enable usage of unsupported SFPs in non-Unix operating systems.&lt;&#x2F;p&gt;
&lt;p&gt;And, to return the EEPROM to its original state, simply write the old hex value back to the &lt;code&gt;0x58&lt;&#x2F;code&gt; offset and call it a day.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
