<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hello, I&#39;m Jonah on jonah.id</title>
    <link>https://jonah.id/</link>
    <description>Recent content in Hello, I&#39;m Jonah on jonah.id</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 16 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://jonah.id/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Anki Deck for AWC Weather Symbols</title>
      <link>https://jonah.id/posts/awc-symbols-flash-cards/</link>
      <pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/posts/awc-symbols-flash-cards/</guid>
      <description>&lt;p&gt;Shared: &lt;a href=&#34;https://ankiweb.net/shared/info/2142527470&#34;&gt;https://ankiweb.net/shared/info/2142527470&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;weather-symbols-for-graphical-aviation-forecasts&#34;&gt;Weather Symbols for Graphical Aviation Forecasts&lt;/h1&gt;&#xA;&lt;p&gt;This is a deck containing the graphical symbols and METAR/TAF codes for various weather conditions and chart features. It is produced from the &lt;a href=&#34;https://aviationweather.gov/gfa/help/#symbols&#34;&gt;AviationWeather.gov website&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;reproductionupdate-instructions&#34;&gt;Reproduction/Update Instructions:&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Navigate to &lt;a href=&#34;https://aviationweather.gov/gfa/help/#symbols&#34;&gt;https://aviationweather.gov/gfa/help/#symbols&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Open the browser inspector&lt;/li&gt;&#xA;&lt;li&gt;Paste the script at the bottom into the console&lt;/li&gt;&#xA;&lt;li&gt;Copy the text output&lt;/li&gt;&#xA;&lt;li&gt;Paste into a text file and save as a .csv file&lt;/li&gt;&#xA;&lt;li&gt;Use &amp;ldquo;Import File&amp;rdquo; feature in Anki Desktop. All options should be set automatically.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Script:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Designing the Orange Pi Enclosure</title>
      <link>https://jonah.id/posts/ultimate-home-box-update-2/</link>
      <pubDate>Sun, 05 May 2024 20:51:00 -0700</pubDate>
      <guid>https://jonah.id/posts/ultimate-home-box-update-2/</guid>
      <description>&lt;p&gt;With the pivot to a new SBC, a new enclosure is in order.&lt;/p&gt;&#xA;&lt;p&gt;To meet my adjusted goals (including no custom cabling and a more comfortable&#xA;assembly), I&amp;rsquo;ve made some adjustments to the approach.  The biggest is the&#xA;separation of the back peripheral panel.  On the last design, it was not easy to&#xA;get the board in/out of the enclosure because the ports needed to protrude into&#xA;the peripheral holes.  In this design, the back panel is built into the bottom&#xA;part, which means the board only need to fit into one port panel at a time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Switching the Home Box to Orange Pi</title>
      <link>https://jonah.id/posts/ultimate-home-box-update-1/</link>
      <pubDate>Sat, 27 Apr 2024 18:53:00 -0700</pubDate>
      <guid>https://jonah.id/posts/ultimate-home-box-update-1/</guid>
      <description>&lt;p&gt;After running into too many roadblocks on this project (due to my tight design&#xA;constraints) and burning out, I&amp;rsquo;ve finally come back to this project with&#xA;renewed interest.  The hardware space has improved since I left off, and I&amp;rsquo;m&#xA;willing to make some compromises this time to increase the chances of following&#xA;through to completion.&lt;/p&gt;&#xA;&lt;p&gt;New constraint: &lt;strong&gt;no soldering or custom cable making&lt;/strong&gt;.  If I can&amp;rsquo;t buy a&#xA;component off-the-shelf (besides the 3D printed enclosure), too bad, figure out&#xA;something else.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Doorbell</title>
      <link>https://jonah.id/posts/doorbell/</link>
      <pubDate>Mon, 11 Mar 2024 05:39:27 +0000</pubDate>
      <guid>https://jonah.id/posts/doorbell/</guid>
      <description>&lt;h2 id=&#34;intro--assets&#34;&gt;Intro &amp;amp; Assets&lt;/h2&gt;&#xA;&lt;p&gt;A hardware and software project to monitor/control my building&amp;rsquo;s doorbell/lock panel.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href=&#34;https://sr.ht/~jonahbron/doorbell&#34;&gt;sr.ht/~jonahbron/doorbell&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;motivation--background&#34;&gt;Motivation &amp;amp; Background&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m never home when the mail comes.&lt;/p&gt;&#xA;&lt;p&gt;I love the USPS and use them whenever I have a choice for shipping.  They have&#xA;the key to my building&amp;rsquo;s lobby.  UPS and Fedex do not.  Package theft is not&#xA;uncommon, thus they often &lt;strong&gt;will not&lt;/strong&gt; leave a package if nobody answers the&#xA;door.  They almost always deliver during weekday in work hours, which is pretty&#xA;reasonable considering the delivery workers are&amp;hellip; &lt;em&gt;working&lt;/em&gt;.  The problem is&#xA;that &lt;em&gt;I&amp;rsquo;m&lt;/em&gt; working &lt;em&gt;too&lt;/em&gt;.  And not at home.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ultimate Home Box: Plan</title>
      <link>https://jonah.id/posts/ultimate-home-box-plan/</link>
      <pubDate>Fri, 23 Dec 2022 10:41:40 -0800</pubDate>
      <guid>https://jonah.id/posts/ultimate-home-box-plan/</guid>
      <description>&lt;p&gt;There should be a box in every home.&lt;/p&gt;&#xA;&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;&#xA;&lt;p&gt;There have been some major benefits to the centralization of always-on computing power (i.e. &lt;em&gt;the cloud&lt;/em&gt;).  The ability to shift resources from one customer to another as needed means a net reduction in actual resources needed.  Allowing fewer companies to specialize in the skill of maintaining compute infrastructure results in less skill duplication, and so lower costs.&lt;/p&gt;&#xA;&lt;p&gt;But it comes with some vulnerabilities too, mainly to the customer.  Those vulnerabilities include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hacking the Rollova: The Nuclear Option</title>
      <link>https://jonah.id/posts/hack-rollova-2/</link>
      <pubDate>Sat, 01 May 2021 13:40:47 -0700</pubDate>
      <guid>https://jonah.id/posts/hack-rollova-2/</guid>
      <description>&lt;p&gt;(&lt;a href=&#34;https://jonah.id/posts/hack-rollova&#34;&gt;part one&lt;/a&gt; of hacking the Rollova 2.0)&lt;/p&gt;&#xA;&lt;p&gt;Not being satisfied with giving up (and always keen to acquire a new tool), I decided to take the nuclear option: remove the original MCU and replace it with a suitable equivalent.&lt;/p&gt;&#xA;&lt;p&gt;Having already determined with a fair level of certainty that the original is an STM32L series MCU, I ordered a &lt;a href=&#34;https://www.digikey.com/en/products/detail/stmicroelectronics/STM32L562CET6/11591190&#34;&gt;STM32L562&lt;/a&gt;.  It has 512KB of flash, which should be plenty for anything I might want to put on here.  This job &lt;em&gt;could&lt;/em&gt; be done with just a soldering iron, but my research indicated that a hot air rework station would be better for SMD soldering.  I picked up the &lt;a href=&#34;https://www.sparkfun.com/products/14557&#34;&gt;one from Sparkfun&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>This does not end well</title>
      <link>https://jonah.id/posts/hack-rollova/</link>
      <pubDate>Thu, 01 Apr 2021 19:12:54 -0700</pubDate>
      <guid>https://jonah.id/posts/hack-rollova/</guid>
      <description>&lt;p&gt;For my birthday, I was given a &lt;a href=&#34;https://www.hozodesign.com/product-page/rollova-v2-0&#34;&gt;Rollova 2.0&lt;/a&gt;.  It is an electronic measuring tape, except that instead of a physical tape, the circumference orbits.  The number of revolutions are measured, and converted to a linear distance which is shown on an LCD.  It also has the ability to store measurments that the user has taken.  It&amp;rsquo;s a neat gadget, but to me the potential was entirely untapped.&lt;/p&gt;&#xA;&lt;p&gt;The product&amp;rsquo;s website advertises that it has an STM32 microcontroller unit (MCU).  This is a fairly common family of 32-bit ARM chips made by STMicroelectronics.  Inspired by the now famed &lt;a href=&#34;https://twitter.com/Foone/status/1302820468819288066&#34;&gt;Doom on a pregnancy test&lt;/a&gt;, I determined to hack this thing.  After all, it has plenty of inputs: a rotation encoder, and two buttons.  That&amp;rsquo;s gotta be enough to play doom, or at least something simpler like &lt;a href=&#34;https://en.wikipedia.org/wiki/Snake_(video_game_genre)&#34;&gt;Snake&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Rust</title>
      <link>https://jonah.id/posts/building-rust/</link>
      <pubDate>Fri, 22 May 2020 22:11:20 +0000</pubDate>
      <guid>https://jonah.id/posts/building-rust/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve compiled the Rust compiler a lot of times now.  That&amp;rsquo;s necessary because the &lt;a href=&#34;https://github.com/avr-rust/rust&#34;&gt;AVR fork of  Rust&lt;/a&gt; is not officially supported, and the fork does not distribute a release.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s been a huge pain, and very often I find myself unable to compile it for one reason or another (wrong branch, mismatching compiler versions, etc.).  To relieve myself (and hopefully others), I&amp;rsquo;ve created a Docker image designed with the ability to &lt;em&gt;reliably&lt;/em&gt; compile Rust.  It&amp;rsquo;s on Docker Hub.&lt;/p&gt;</description>
    </item>
    <item>
      <title>USB Serial Mod</title>
      <link>https://jonah.id/posts/usb-serial-mod/</link>
      <pubDate>Sun, 15 Mar 2020 21:21:17 +0000</pubDate>
      <guid>https://jonah.id/posts/usb-serial-mod/</guid>
      <description>&lt;p&gt;A project I&amp;rsquo;m working on with the &lt;a href=&#34;https://www.sparkfun.com/products/13678&#34;&gt;ESP8266&lt;/a&gt; requires a USB module.  The &lt;a href=&#34;https://www.sparkfun.com/products/15096&#34;&gt;one I bought&lt;/a&gt; from Sparkfun has a USB C port, and 6 pin-outs.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TX&lt;/li&gt;&#xA;&lt;li&gt;RX&lt;/li&gt;&#xA;&lt;li&gt;DTR&lt;/li&gt;&#xA;&lt;li&gt;CTS&lt;/li&gt;&#xA;&lt;li&gt;VCC&lt;/li&gt;&#xA;&lt;li&gt;GND&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://jonah.id/img/original_face.jpg&#34; alt=&#34;original module face&#34;&gt;&#xA;&lt;img src=&#34;https://jonah.id/img/original_back.jpg&#34; alt=&#34;original module back&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, to be able to &lt;a href=&#34;https://www.instructables.com/id/FTDI-ESP8266-Definitive-Wiring/&#34;&gt;wire up the ESP for flashing&lt;/a&gt;, the ESP needs access to the RTS pin, which is not made available by this usb/serial breakout.  However, the &lt;a href=&#34;https://cdn.sparkfun.com/assets/9/3/0/2/e/ch3402CDS.pdf&#34;&gt;chip itself&lt;/a&gt; &lt;strong&gt;does&lt;/strong&gt; have that pin.&lt;/p&gt;&#xA;&lt;p&gt;With some inspiration from others, and some &lt;a href=&#34;https://electronics.stackexchange.com/q/475855/240043&#34;&gt;confirmation of the concept&lt;/a&gt;, I decided to add an extra terminal soldered to the correct pin on the chip.  I tested by holding the jumper manually, and it worked great.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resume</title>
      <link>https://jonah.id/resume/</link>
      <pubDate>Sat, 08 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/resume/</guid>
      <description>&lt;h1 id=&#34;jonah-dahlquist&#34;&gt;Jonah Dahlquist&lt;/h1&gt;&#xA;&lt;p&gt;My excellent problem solving skills and broad experience allow me to develop elegant, creative solutions.  My interpersonal and communication skills make me an outstanding team member, both productively and socially.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working UDP Listener in Rust (finally)</title>
      <link>https://jonah.id/posts/smart-plug-prototype-2.3/</link>
      <pubDate>Wed, 31 Jul 2019 02:35:35 +0000</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-2.3/</guid>
      <description>&lt;p&gt;After much wailing and gnashing of teeth, I figured out what the problem with my program was.  The W5500 driver&amp;rsquo;s ability to edit registers is not broken, it was my own mistake.  In my simple example set up to write/read to/from a register, I forgot to alter the configuration of the SPI instance to match what the W5500 chip expects.  Fixing this instantly yielded results.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/jonahbron/smart-plug/blob/0655b0671ad76788fccc0043198b9e15e715d753/src/main.rs&#34;&gt;https://github.com/jonahbron/smart-plug/blob/0655b0671ad76788fccc0043198b9e15e715d753/src/main.rs&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello from Arduino!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;initialized&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;activated&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;IP: 192.168.86.30&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;This gave me new-found hope in the possibility of using the driver and not needing to implement my own.  So I pushed forward to try receiving a UDP packet again.  After messing around with the same compiler/linker errors I&amp;rsquo;ve been getting around the library, I found that passing in a buffer 16 bytes in length or less fixes the problem with &lt;code&gt;receive&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>W5500 Driver for Rust Embedded-HAL on AVR</title>
      <link>https://jonah.id/posts/smart-plug-prototype-2.2/</link>
      <pubDate>Sun, 28 Jul 2019 23:10:57 +0000</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-2.2/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; &lt;em&gt;this post is kind of hopeless, so &lt;a href=&#34;https://jonah.id/posts/smart-plug-prototype-2.3&#34;&gt;skip to the next one&lt;/a&gt; in which I figure out the problem!&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;In the last post, I was optimistic that implementing a SPI library for my AVR chip would get the currently-available &lt;a href=&#34;https://crates.io/crates/w5500&#34;&gt;W5500&lt;/a&gt; Embedded-HAL driver crate working.  Alas, after much testing and experimentation, I have not been successful in making it do&amp;hellip; well, anything.  Even the simple task of &lt;a href=&#34;https://github.com/jonahbron/smart-plug/blob/e206e6f42505e2d76a3043fc9fc54416712d9715/src/main.rs&#34;&gt;writing to a single register&lt;/a&gt; and reading it back out does not behave as expected.  The value read back is just zeros.  Serial output:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rust on Arduino</title>
      <link>https://jonah.id/posts/smart-plug-prototype-2.1/</link>
      <pubDate>Sun, 14 Jul 2019 02:00:00 +0000</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-2.1/</guid>
      <description>&lt;p&gt;Last time we started writing some C code using the Arduino IDE.  Arduino IDE provides a great interface, and it&amp;rsquo;s an excellent way to get started writing embedded code.  However, it has a drawback for me: I don&amp;rsquo;t want to write in C.  Instead, I would prefer to take this opportunity to learn Rust.  Because Rust&amp;rsquo;s run-time performance can be comparable to C and I&amp;rsquo;ve been wanting to learn it for a while, this seems like a really good opportunity to try it out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 2.0</title>
      <link>https://jonah.id/posts/smart-plug-prototype-2.0/</link>
      <pubDate>Wed, 05 Jun 2019 05:00:00 +0000</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-2.0/</guid>
      <description>&lt;p&gt;Now that we have a working proof-of-concept, it&amp;rsquo;s time to take this project into the prototype stage.  I&amp;rsquo;ve demonstrated that the idea can work using off-the-shelf components.  Now it&amp;rsquo;s time to start simplifying and refining the product.  That means bye-bye Beaglebone Black, and hello Arduino.  An entire computer and OS is wholly unnecessary for a task as simple as this.  Arduino is the most popular (and best supported) platform of which I&amp;rsquo;m aware for developing embedded systems. There may be a point at which this project outgrows even that, but for now it will do what we need.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sherman Hill Internet</title>
      <link>https://jonah.id/posts/sherman-hill-internet/</link>
      <pubDate>Fri, 31 May 2019 10:40:00 +0000</pubDate>
      <guid>https://jonah.id/posts/sherman-hill-internet/</guid>
      <description>&lt;h1 id=&#34;my-internet-sucks&#34;&gt;My Internet sucks.&lt;/h1&gt;&#xA;&lt;p&gt;Well, it&amp;rsquo;s not that bad.  But it&amp;rsquo;s not great either.  I can only buy up to 80Mbps, and have a monthly data cap of 400GB per month.  I hit the cap every month.&lt;/p&gt;&#xA;&lt;p&gt;This is by design.  Because Mediacom is the only cable provider in the area, the service they provide must be just poor enough and just expensive enough to maximize the profit of the company while avoiding attempts at competition.  While I cannot begrudge them for this (that&amp;rsquo;s the system in place currently), I don&amp;rsquo;t have to like it.  I want to do something about it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 1.0</title>
      <link>https://jonah.id/posts/smart-plug-prototype-1.0/</link>
      <pubDate>Thu, 04 Apr 2019 19:07:00 +0000</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-1.0/</guid>
      <description>&lt;p&gt;The initial proof-of-concept is officially working.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://drive.google.com/file/d/1fkCyx7EDGuDs7JvjRQtmBLukcbOCs4CI/preview&#34; width=&#34;640&#34; height=&#34;480&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;p&gt;The above video demonstrates the POC working as expected end-to-end.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Client &amp;lt;-&amp;gt; Router &amp;lt;-&amp;gt; Powerline Ethernet &amp;lt;-&amp;gt; Microcomputer &amp;lt;-&amp;gt; Relay &amp;lt;-&amp;gt; Appliance (i.e. lamp)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Without any wireless technology, we were able to control a lamp that&amp;rsquo;s ultimately only plugged into the wall.&lt;/p&gt;&#xA;&lt;p&gt;The full list of materials is:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Material&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: right&#34;&gt;Cost&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;a href=&#34;https://www.sparkfun.com/products/14236&#34;&gt;High-voltage Electrical Relay&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;$27&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;a href=&#34;https://beagleboard.org/black&#34;&gt;Beaglebone Black&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;$55&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;a href=&#34;https://www.newegg.com/Product/Product.aspx?Item=N82E16833704165&#34;&gt;TP-Link AV600 Powerline Ethernet Adapter (pair)&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;$38&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;$120&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Here is the update on the improvments we&amp;rsquo;re trying to make with this approach.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 0.6</title>
      <link>https://jonah.id/posts/smart-plug-prototype-0.6/</link>
      <pubDate>Fri, 29 Mar 2019 19:01:00 -0500</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-0.6/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re almost there to the full POC.  Here we connect the Beaglebone up via Ethernet directly to the LAN.  Once that&amp;rsquo;s done, we can open a TCP connection over WiFi from a laptop, now with no physical connection between server and client.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://drive.google.com/file/d/1pk6UfXwz_iU5bWBvdE8A6V0znRD2xYeS/preview&#34; width=&#34;640&#34; height=&#34;480&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;p&gt;We&amp;rsquo;re so close to the POC now.  The last step is to connect the Beaglebone over powerline Ethernet (i.e. HomePlug AV).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 0.5</title>
      <link>https://jonah.id/posts/smart-plug-prototype-0.5/</link>
      <pubDate>Wed, 27 Mar 2019 23:27:00 -0500</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-0.5/</guid>
      <description>&lt;p&gt;Here we finally do the real thing.  We wire up a GPIO pin and a ground pin to a commercial relay&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://drive.google.com/file/d/147PooDApdCjSMBWq2lId-SU7fgmn9Adr/preview&#34; width=&#34;640&#34; height=&#34;480&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;p&gt;Using the control protocol written for the Beaglebone&amp;rsquo;s onboard LEDs (and pointing the code to a different pin), we can now fully control a lamp remotely.  We now have a usable prototype; however, this is only a demo of controlled, high-voltage switching.  There are a couple more steps before we have a full proof-of-concept.  The next is controlling over the home network, not over a USB network.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 0.4</title>
      <link>https://jonah.id/posts/smart-plug-prototype-0.4/</link>
      <pubDate>Fri, 22 Mar 2019 14:16:00 -0500</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-0.4/</guid>
      <description>&lt;p&gt;In this verison, we&amp;rsquo;ve now created a server that can open a duplex communication channel with a client.  The server will send update the client on its state every 10 seconds, or any time its state changes.  State is represented as a UTF-8 encoded &lt;code&gt;0&lt;/code&gt; (&lt;em&gt;off&lt;/em&gt;) or &lt;code&gt;1&lt;/code&gt; (&lt;em&gt;on&lt;/em&gt;) byte.  In addition to the server updates, the client can at any point send a &lt;code&gt;0&lt;/code&gt; or a &lt;code&gt;1&lt;/code&gt; to the server, which will change the state of the light &lt;strong&gt;and&lt;/strong&gt; update all other connected clients.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 0.3</title>
      <link>https://jonah.id/posts/smart-plug-prototype-0.3/</link>
      <pubDate>Fri, 22 Mar 2019 09:20:00 -0500</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-0.3/</guid>
      <description>&lt;p&gt;The next phase of usefullness is turning the light off.  In this next version, we keep track of whether the light is on or off, and toggle it upon receiving a TCP connection.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://drive.google.com/file/d/1gkeDwNNlzpETgMwUO65NuXKhjvVRWdnX/preview&#34; width=&#34;640&#34; height=&#34;480&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;bonescript&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;net&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;net&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR0&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR1&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR2&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR3&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LOW&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pinMode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OUTPUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;digitalWrite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;createServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Received connection&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Boolean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;digitalWrite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;listen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;9999&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Ready for commands&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;This works, but it&amp;rsquo;s fairly crude.  What would be better is defined protocol beyond just listening for connections.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 0.2</title>
      <link>https://jonah.id/posts/smart-plug-prototype-0.2/</link>
      <pubDate>Fri, 22 Mar 2019 09:14:00 -0500</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-0.2/</guid>
      <description>&lt;p&gt;This next phase of the prototype is adding the ability to control the light over a network.  Importing Node&amp;rsquo;s standard &lt;code&gt;net&lt;/code&gt; package allows us to listen for simple TCP connections, and to activate the light in response.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://drive.google.com/file/d/1zpUTqGZSKM60myb134qOw6M71Yd0yZ84/preview&#34; width=&#34;640&#34; height=&#34;480&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;p&gt;The way we&amp;rsquo;re communicating with our application is with Telnet.  Telnet is a simple application that can open a TCP socket and provide an interactive text-based interface for sending and receiving data.  Here we&amp;rsquo;re not even using it to send any data, it&amp;rsquo;s only being used to connect and immediately close, and that connection being established is enough of a command at this point.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Plug Prototype 0.1</title>
      <link>https://jonah.id/posts/smart-plug-prototype-0.1/</link>
      <pubDate>Fri, 22 Mar 2019 08:58:00 -0500</pubDate>
      <guid>https://jonah.id/posts/smart-plug-prototype-0.1/</guid>
      <description>&lt;p&gt;After busting out the old Beaglebone Black and writing a few lines of JavaScript, I have a super simple LED toggle sequence on a timer running.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://drive.google.com/file/d/1j9PDkXjvDpBtkJv1rMKwIasJ5EYlrM8V/preview&#34; width=&#34;640&#34; height=&#34;480&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;p&gt;All it does is run a timer that switches the LEDs on and off at a fixed rate.  Obviously nowhere near useful, but this is a simple building block.  Next up we need to be able to control it.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;bonescript&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;net&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;net&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR0&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR1&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR2&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;USR3&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pinMode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OUTPUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;on_led_index&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;setInterval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;digitalWrite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;on_led_index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LOW&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;on_led_index&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;on_led_index&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;digitalWrite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;on_led_index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;HIGH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Smart Plug Intro</title>
      <link>https://jonah.id/posts/smart-plug-intro/</link>
      <pubDate>Thu, 21 Mar 2019 04:26:30 +0000</pubDate>
      <guid>https://jonah.id/posts/smart-plug-intro/</guid>
      <description>&lt;p&gt;Consummer smart plugs/bulbs available currently are exclusively controlled over WiFi.  While easy for the user in some ways, I see several drawbacks in it.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bandwidth usage&lt;/strong&gt; - Having many smart plugs in your home means lots of devices using up WiFi bandwidth.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ease of setup&lt;/strong&gt; - Smart plugs must be given the SSID/password.  This is usually done by an app that connects to a hotspot created by the plug which then configures it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Usable scenarios&lt;/strong&gt; - Good WiFi signal is needed at that point for it to be usable.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt; - The plug must contain WiFi hardware, increasing the cost of materials (and by extension, the cost of the product).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I have a vision for an alternative product that I&amp;rsquo;m certain I would buy myself were it available.  This vision lies at the intersection between powerline Ethernet (i.e. HomePlug AV) and smart devices.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://jonah.id/dir/otherfile/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/dir/otherfile/</guid>
      <description>&lt;a href=&#34;https://jonah.id/newindex.html&#34;&gt;&lt;/a&gt;&#xA;&lt;a href=&#34;../newindex.html&#34;&gt;&lt;/a&gt;&#xA;&lt;a href=&#34;./yetanother.html&#34;&gt;&lt;/a&gt;&#xA;&lt;a href=&#34;yetanother.html&#34;&gt;&lt;/a&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://jonah.id/dir/yetanother/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/dir/yetanother/</guid>
      <description></description>
    </item>
    <item>
      <title></title>
      <link>https://jonah.id/enum1/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/enum1/</guid>
      <description>&lt;h1 id=&#34;hello&#34;&gt;Hello&lt;/h1&gt;&#xA;&lt;p&gt;world&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://jonah.id/newindex/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/newindex/</guid>
      <description>&lt;a href=&#34;dir/otherfile.html&#34;&gt;&lt;/a&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://jonah.id/otherfile/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/otherfile/</guid>
      <description>&lt;a href=&#34;newindex.html&#34;&gt;&lt;/a&gt;</description>
    </item>
    <item>
      <title>Autumn Leaves Candle</title>
      <link>https://jonah.id/alcandle/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/alcandle/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://jonah.id/alcandle&#34;&gt;jonah.id/alcandle&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This candle was hand-made by me, Jonah.  It is made of hybrid paraffin/vegetable wax, mixed with approximately 1 tablespoon of &amp;ldquo;autumn leaves&amp;rdquo; fragrance oil per pound of wax.  The wick is made of wood, fastened to the bottom of the vessel with a small metal clip.  The vessel itself is a threaded glass jar, paired with a metal lid.&lt;/p&gt;&#xA;&lt;p&gt;The containing jar can be reused.  Any excess wax inside after use can be totally removed with dish detergent.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quire-to-Git Notes</title>
      <link>https://jonah.id/quire-to-git-notes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/quire-to-git-notes/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;markdown&lt;/li&gt;&#xA;&lt;li&gt;front-matter&lt;/li&gt;&#xA;&lt;li&gt;show the comment log, as a rough work log&lt;/li&gt;&#xA;&lt;li&gt;maybe even pull it git logs?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Could make as an app just for myself, or could make as a public service.&lt;/p&gt;&#xA;&lt;p&gt;Considerations if made public&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Needs hosting; if it needs to commit directly to a Git repo&lt;/li&gt;&#xA;&lt;li&gt;Can do a shallow clone with fetch&lt;/li&gt;&#xA;&lt;li&gt;Needs to be authorized with Quire for each user&lt;/li&gt;&#xA;&lt;li&gt;Needs to have authentication for Git repo (ssh only?)&lt;/li&gt;&#xA;&lt;li&gt;It must have storage for auth per user&lt;/li&gt;&#xA;&lt;li&gt;Could use cloud free tier and serverless if git can run&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;There is a Node library for interacting with Git, but it only supports HTTP remotes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sine Tattoo</title>
      <link>https://jonah.id/sine-tat/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/sine-tat/</guid>
      <description>&lt;p&gt;I have a tattoo that is the first 5 curves in the series that approaches a&#xA;square wave.  I chose this because 1) it looks cool, and 2) computers have&#xA;been a substantial part of my life and the idea of the clock cycles passing&#xA;from my body to the machine is neat.  The reason it&#39;s the sine series is that&#xA;a real microchip clock composes multiple sine waves from oscillating&#xA;piezoelectric crystals to produce the square wave clock signal.  I chose a&#xA;count of 5 because it is a good balance between producing a usefully square&#xA;wave and having so many curves that they obscure each-other.&lt;/p&gt;</description>
    </item>
    <item>
      <title>This File Came from Quire</title>
      <link>https://jonah.id/quire-to-git/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/quire-to-git/</guid>
      <description>&lt;p&gt;I drafted this task in Quire and it was published automatically.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://git.sr.ht/~jonahbron/quire-to-git&#34;&gt;https://git.sr.ht/~jonahbron/quire-to-git&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Winter Function 2022 Gift</title>
      <link>https://jonah.id/wf22/gift/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/wf22/gift/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://jonah.id/wf22/gift&#34;&gt;jonah.id/wf22/gift&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;All guests to the &lt;a href=&#34;https://jonah.id/wf22&#34;&gt;Winter Function 2022&lt;/a&gt; were given a gift bag.  The entire gift is either recyclable or compostable in nature.  It consists of a black paper sack with a handle, a hand-made hot cocoa mix, and a hand-made candle.&lt;/p&gt;&#xA;&lt;h2 id=&#34;candle&#34;&gt;Candle&lt;/h2&gt;&#xA;&lt;p&gt;The candle is made of approximately 150 grams of hybrid paraffin/vegetable&#xA;wax, mixed with a low amount of &amp;ldquo;autumn leaves&amp;rdquo; fragrance oil.  The wick is made of wood, fastened to the bottom of the vessel with a small metal clip.  The vessel itself is a threaded straight-sided 8oz glass jar, paired with a metal lid.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Winter Function 2023 Gift Bag</title>
      <link>https://jonah.id/wf23/bag/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/wf23/bag/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://jonah.id/wf23/bag&#34;&gt;jonah.id/wf23/bag&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;All guests to the &lt;a href=&#34;https://jonah.id/wf23&#34;&gt;Winter Function 2023&lt;/a&gt; were given a gift bag.  The&#xA;entire gift is either recyclable or compostable in nature.  It consists of a&#xA;paper sack with a handle, a hand-made hot cocoa mix, home-made dairy-free&#xA;coconut macaroons, and a hand-poured candle.&lt;/p&gt;&#xA;&lt;h2 id=&#34;candle&#34;&gt;Candle&lt;/h2&gt;&#xA;&lt;p&gt;The candle is made of hybrid paraffin/coconut/vegetable wax, mixed with a low&#xA;amount of mahogany teakwood fragrance oil (to be frank, I could have used more,&#xA;it&amp;rsquo;s more faint than I would like).  The wick is made of wood, fastened to the&#xA;bottom of the vessel with a small metal clip.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zero Trust Stateless Secret Santa 🎅🥸</title>
      <link>https://jonah.id/secret-santa/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://jonah.id/secret-santa/</guid>
      <description>&lt;div id=&#34;ui&#34;&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2&gt;About&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;This is a zero-trust Secret Santa algorithm &amp;amp; implementation.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The goal is to create a single web page that can distribute assignments via&#xA;out-of-band communications executed by the participants, with no server-side&#xA;state, and no ability to alter or observe the results besides one&#39;s own.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is done in three cycles:&lt;/p&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Accumulating a collection of public keys:&lt;/strong&gt; each subject&#xA;receives a hyperlink, which then gives them a hyperlink to send to the next&#xA;subject.  The new hyperlink contains a newly generated public key, the private&#xA;key of which has been saved into a browser cookie. The public key is first&#xA;encrypted with a public key provided by subject A.  This prevents any agents&#xA;from inferring key ownership by elimination.  By the end of the cycle, all&#xA;subjects have inserted their public key into the URL.  This insertion is done in&#xA;a securely random order to conceal key ownership from subject A.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Assignment encryption:&lt;/strong&gt; subject A uses its private key&#xA;to decrypt all subject public keys.  Each subject again receives a hyperlink,&#xA;which generates a new hyperlink to send to the next subject.  The new hyperlink&#xA;contains the subject&#39;s own name, encrypted twice: once with the next shuffled&#xA;subject&#39;s public key, and again with the public key proveded by subject A.  This&#xA;prevents any agents from inferring assignment origin by elimination.  By the&#xA;end of the cycle, every subject has inserted an assignment into the URL.  This&#xA;insertion is done in a securely random order to conceal key ownership from&#xA;subject A.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Assignment distribution:&lt;/strong&gt; subject A uses its private key&#xA;to decrypt all assignments.  Each subject receives a hyperlink one final time,&#xA;which includes all encrypted assignments.  Each subject can decrypt only their&#xA;own, shows the user their assiged name, and the same link to pass to the next&#xA;subject.  After this third cycle, everyone is aware of who they are assigned,&#xA;and has no possible knowledge of any other assignments.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;p&gt;An extra layer of complexity is introduced by the ability for &lt;em&gt;some&lt;/em&gt;&#xA;agents to infer the ownership of a key.  Specifically the second agent and the&#xA;second-to-last agent can know who the first key&#39;s owner is and the last keys&#xA;owner, respectively.  This can be resolved by encrypting the public keys and the&#xA;assignments with another public key, generated by the first agent.  Only when&#xA;all keys or assignments are added are they all decrypted by the first agent in&#xA;the ring.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
