<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.solace.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kc</id>
	<title>SolaceWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.solace.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kc"/>
	<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Special:Contributions/Kc"/>
	<updated>2026-10-22T19:59:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.10</generator>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Raspberry_Pi_Pico_(RP2040)&amp;diff=83</id>
		<title>Raspberry Pi Pico (RP2040)</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Raspberry_Pi_Pico_(RP2040)&amp;diff=83"/>
		<updated>2026-10-22T18:50:31Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Raspberry-Pi-RP2040-Pico-PCB-Top-Bottom-1.jpg|Pi Pico Board Photos&lt;br /&gt;
File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Pinout-1 1.png|Pi Pico Pinout Diagram&lt;br /&gt;
File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Schematic-1.png|Pi Pico Schematic&lt;br /&gt;
File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Mechanical-1 1.png|Pi Pico Physical Layout&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Schematic-1.png&amp;diff=82</id>
		<title>File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Schematic-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Schematic-1.png&amp;diff=82"/>
		<updated>2026-10-22T18:47:32Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pi Pico Board Schematic&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Pico-PCB-Top-Bottom-1.jpg&amp;diff=81</id>
		<title>File:Raspberry-Pi-RP2040-Pico-PCB-Top-Bottom-1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Pico-PCB-Top-Bottom-1.jpg&amp;diff=81"/>
		<updated>2026-10-22T18:46:20Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pi Pico board photos&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Pinout-1_1.png&amp;diff=80</id>
		<title>File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Pinout-1 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Pinout-1_1.png&amp;diff=80"/>
		<updated>2026-10-22T18:45:10Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pinout diagram of the Pi Pico&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=79</id>
		<title>Microcontrollers</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=79"/>
		<updated>2026-10-22T14:50:10Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My first ever microcontroller was the Parallax Basic Stamp BS2SX, thanks to ads in the early-90s computer magazines I was reading at the time.  Thankfully, both I and the industry have come a long way since then, but the BS2SX is actually pretty neat.  I built a [[PocketDial|battery-powered wardialer]] using just it and some discrete components.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheat sheets for my current favorite microcontrollers:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The [[BluePill|BluePill STM32F103CT8C6]] board.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Espressif notes / projects / links:&lt;br /&gt;
&lt;br /&gt;
* The Espressif [[ESP8266]]&lt;br /&gt;
* [[T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals]]&lt;br /&gt;
* [https://tasmota.github.io/docs/ Tasmota] is my favorite home automation firmware.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Raspberry Pi Pico (RP2040)]]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Raspberry_Pi_Pico_(RP2040)&amp;diff=78</id>
		<title>Raspberry Pi Pico (RP2040)</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Raspberry_Pi_Pico_(RP2040)&amp;diff=78"/>
		<updated>2026-10-21T22:01:20Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Mechanical-1 1.png|thumb|444x444px|Pi Pico Physical Layout]]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Mechanical-1_1.png&amp;diff=77</id>
		<title>File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Mechanical-1 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:Raspberry-Pi-RP2040-Microcontroller-Pico-Board-Mechanical-1_1.png&amp;diff=77"/>
		<updated>2026-10-21T22:00:24Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Raspberry Pi Pico physical layout&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Raspberry_Pi_Pico_(RP2040)&amp;diff=76</id>
		<title>Raspberry Pi Pico (RP2040)</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Raspberry_Pi_Pico_(RP2040)&amp;diff=76"/>
		<updated>2026-10-21T21:32:06Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=75</id>
		<title>Microcontrollers</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=75"/>
		<updated>2026-10-21T21:28:16Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My first ever microcontroller was the Parallax Basic Stamp BS2SX, thanks to ads in the early-90s computer magazines I was reading at the time.  Thankfully, both I and the industry have come a long way since then, but the BS2SX is actually pretty neat.  I built a [[PocketDial|battery-powered wardialer]] using just it and some discrete components.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheat sheets for my current favorite microcontrollers:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The [[BluePill|BluePill STM32F103CT8C6]] board.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Espressif notes / projects / links:&lt;br /&gt;
&lt;br /&gt;
* The Espressif [[ESP8266]]&lt;br /&gt;
* [[T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals]]&lt;br /&gt;
* [https://tasmota.github.io/docs/ Tasmota] is my favorite home automation firmware.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Raspberry Pi Pico (RP2040)&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=PocketDial&amp;diff=74</id>
		<title>PocketDial</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=PocketDial&amp;diff=74"/>
		<updated>2025-10-31T20:39:37Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot;  [tbd]&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[tbd]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=73</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=73"/>
		<updated>2025-03-12T23:34:40Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:K.C. Budd.jpg|thumb|274x274px]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
* Youtube: https://www.youtube.com/@phreakmonkey/videos &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On Content:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Have you noticed that there are topics here that aren&#039;t links?  Bear with me, I&#039;m just starting to fill this out, but I will randomly and sporadically add topics and pages.  A note on content:  &#039;&#039;Mostly, this is a repository to hold links, discoveries, and cheatsheets.&#039;&#039;  There&#039;s a balance between providing valuable information and &#039;&#039;needlessly repeating existing / available documentation&#039;&#039;, and for the most part I&#039;m going to err on the part of &#039;&#039;not repeating that which is widely available and/or obvious&#039;&#039;.   &lt;br /&gt;
&lt;br /&gt;
Some notable exceptions to this will be where I add things that I get frustrated searching for often, like &#039;&#039;pinout diagrams of common microcontrolers&#039;&#039; and &#039;&#039;tidbits of information that tend to be mostly available on ephemeral forums / blogs&#039;&#039;.  So, what you won&#039;t find here is a repeat of, say, algorithms that are in the famous &#039;&#039;CLRS Introduction to Algorithms Book&#039;&#039;, but you are likely to find &#039;&#039;tips for dealing with the eccentricities of a particular implementation of something in my environment&#039;&#039;.  Vague and subjective, I know, but hey - the world is both analog and chaotic.  :-P   &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[Aviation|My Aviation page.]] I&#039;m a licensed pilot and an aircraft owner. &lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
* CAD / Maker / 3D Printing&lt;br /&gt;
** [[Printrbot 3D Printer]]&lt;br /&gt;
** [[OpenSCAD &amp;amp; designs]]&lt;br /&gt;
* Linux / System Administration / Networking&lt;br /&gt;
** (IPv4) [[GeoIP restriction in Linux with xtables]]&lt;br /&gt;
** [[Restoring the GRUB bootloader on LVM-encrypted Debian 12]]&lt;br /&gt;
** [[Adventures with IPv6]]&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:K.C._Budd.jpg&amp;diff=72</id>
		<title>File:K.C. Budd.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:K.C._Budd.jpg&amp;diff=72"/>
		<updated>2025-03-12T23:34:08Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;me&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Adventures_with_IPv6&amp;diff=71</id>
		<title>Adventures with IPv6</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Adventures_with_IPv6&amp;diff=71"/>
		<updated>2025-03-01T01:31:43Z</updated>

		<summary type="html">&lt;p&gt;Kc: Initial creation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IPv6, like Dippin&#039; Dots and net-positive fusion power, seems to be &amp;quot;the future.&amp;quot;  So I decided I should probably have some.&lt;br /&gt;
&lt;br /&gt;
These are my notes for how I&#039;m doing home-network IPv6.  YMMV.&lt;br /&gt;
&lt;br /&gt;
=== Obtaining IPv6 Addresses from Spectrum ===&lt;br /&gt;
My router, which is actually a multi-homed Debian 12 fanless mini-PC, was easily able to just obtain an IPv6 address from Spectrum for its external interface via the standard Router Advertisement (RA) exchange.  Woohoo!  That, however, doesn&#039;t do much good for the multiple subnets of machines &#039;&#039;behind&#039;&#039; the router.  Especially since [https://youtu.be/bvWRMAU6V-c We Don&#039;t Talk About NAT] in IPv6.&lt;br /&gt;
&lt;br /&gt;
==== Tangent- Subnet Masks and Network Sizes ====&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;The standard network subnet for IPv6 addresses is /64&#039;&#039;&#039;&#039;&#039;.  My first thought was &amp;quot;Wow, that&#039;s 64 bits (18 bajillion!) host addresses.  I&#039;ll just &#039;&#039;split that up!&#039;&#039;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
BZZT!  WRONG ANSWER!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I mean, sure, you can happily divide a /64 into 16 different /68 networks, and still have a bajillion addresses in each one, but &#039;&#039;amazingly this causes problems with lots of IPv6 stacks, as they assume the network is /64.&#039;&#039;  Why?  Because there&#039;s crazy standards for calculating ephemeral &amp;quot;temporary&amp;quot; scoped IPv6 addresses on top of the MAC-address derived &amp;quot;permanent&amp;quot; global addresses, and those algos seems to assume (in most? all? cases) the availability of the entire 64 bits of host address space.  I&#039;ve had trouble finding specific technical documentation around this for the plethora of Desktop and Mobile OS stacks, so suffice it to say &amp;quot;sticking with what the OS expects, which is a /64 network, just turned out to be easier.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Obtaining Network Addresses ====&lt;br /&gt;
I tried a few variants of the built-in methods in &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
Specifically:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iface IFNAME inet6 auto&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
would get me an external IPv6 address, but not internal ones for my subnets.  Ultimately I figured out that Spectrum uses a combination of DHCPv6 to assign network addresses &amp;amp; subnets, but RA to publish gateways and DNS servers.  The key seemed to be that I have to specifically ask Spectrum for:&lt;br /&gt;
&lt;br /&gt;
- A &amp;quot;normal&amp;quot; IPv6 address for the external inferface&lt;br /&gt;
&lt;br /&gt;
- IPv6 Prefix Delegation (a subnet)&lt;br /&gt;
&lt;br /&gt;
- With a &amp;quot;hint&amp;quot; for the length I want.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The command to do this with /etc/network/interfaces , given an external address of enp1s0 , looks like this:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
iface enp1s0 inet6 manual&lt;br /&gt;
  up /usr/sbin/dhclient -6 -v -pf /run/dhclient6.enp1s0.pid -lf /var/lib/dhcp/dhclient6.enp1s0.leases -I -P --prefix-len-hint 60 -N -df /var/lib/dhcp/dhclient.enp1s0.leases enp1s0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;-P --prefix-len-hint NN&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
specifies we want a PD address block with a subnet mask of NN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-N&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
specifies we also want a &amp;quot;normal&amp;quot; IPv6 address for the external interface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once the interface is brought up, you can see the &amp;quot;normal&amp;quot; dynamic IPv6 address in the address assignments for enp1s0&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
2: enp1s0: &amp;lt;BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:e2:[...]&lt;br /&gt;
    [...]&lt;br /&gt;
    inet6 2600:6c4e:7008:[...]&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;And you can see the PD block in the /var/lib/dhcp/dhclient6.enp1s0.leases file under the &amp;lt;code&amp;gt;ia-pd xx:xx:xx:xx {&amp;lt;/code&amp;gt; block in the lease outputs.&lt;br /&gt;
&lt;br /&gt;
Great!  But wait.  What do we do with that ::/60 address block once we get it? &lt;br /&gt;
&lt;br /&gt;
=== Assigning the Prefix Delegation (PD) Subnets ===&lt;br /&gt;
{to be continued} [2025-02-28.  Update within 7 days - KCB]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=MediaWiki:Realme-config.json&amp;diff=70</id>
		<title>MediaWiki:Realme-config.json</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=MediaWiki:Realme-config.json&amp;diff=70"/>
		<updated>2025-02-01T05:54:07Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot;{ 	&amp;quot;Main Page&amp;quot;: &amp;quot;https://infosec.exchange/@phreakmonkey&amp;quot; }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
	&amp;quot;Main Page&amp;quot;: &amp;quot;https://infosec.exchange/@phreakmonkey&amp;quot;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=69</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=69"/>
		<updated>2025-01-27T17:41:04Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
* Youtube: https://www.youtube.com/@phreakmonkey/videos &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On Content:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Have you noticed that there are topics here that aren&#039;t links?  Bear with me, I&#039;m just starting to fill this out, but I will randomly and sporadically add topics and pages.  A note on content:  &#039;&#039;Mostly, this is a repository to hold links, discoveries, and cheatsheets.&#039;&#039;  There&#039;s a balance between providing valuable information and &#039;&#039;needlessly repeating existing / available documentation&#039;&#039;, and for the most part I&#039;m going to err on the part of &#039;&#039;not repeating that which is widely available and/or obvious&#039;&#039;.   &lt;br /&gt;
&lt;br /&gt;
Some notable exceptions to this will be where I add things that I get frustrated searching for often, like &#039;&#039;pinout diagrams of common microcontrolers&#039;&#039; and &#039;&#039;tidbits of information that tend to be mostly available on ephemeral forums / blogs&#039;&#039;.  So, what you won&#039;t find here is a repeat of, say, algorithms that are in the famous &#039;&#039;CLRS Introduction to Algorithms Book&#039;&#039;, but you are likely to find &#039;&#039;tips for dealing with the eccentricities of a particular implementation of something in my environment&#039;&#039;.  Vague and subjective, I know, but hey - the world is both analog and chaotic.  :-P   &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[Aviation|My Aviation page.]] I&#039;m a licensed pilot and an aircraft owner. &lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
* CAD / Maker / 3D Printing&lt;br /&gt;
** [[Printrbot 3D Printer]]&lt;br /&gt;
** [[OpenSCAD &amp;amp; designs]]&lt;br /&gt;
* Linux / System Administration / Networking&lt;br /&gt;
** (IPv4) [[GeoIP restriction in Linux with xtables]]&lt;br /&gt;
** [[Restoring the GRUB bootloader on LVM-encrypted Debian 12]]&lt;br /&gt;
** [[Adventures with IPv6]]&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=OpenSCAD_%26_designs&amp;diff=68</id>
		<title>OpenSCAD &amp; designs</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=OpenSCAD_%26_designs&amp;diff=68"/>
		<updated>2025-01-27T17:40:57Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot;My preferred modeling software is [https://openscad.org/ OpenScad] OpenSCAD 2021.01   Why?  It&amp;#039;s a parametric, &amp;#039;&amp;#039;code based&amp;#039;&amp;#039; 3D modelling platform.  The DSL is super simple yet supports extensible design like external modules and functions.  I&amp;#039;ve found it a lot easier to use for designing functional parts and models than the larger GUI-based design systems.   I currently primarily upload my models to [https://cults3d.com/ Cults3D], which I mi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My preferred modeling software is [https://openscad.org/ OpenScad]&lt;br /&gt;
[[File:OpenSCAD.png|thumb|OpenSCAD 2021.01]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Why?  It&#039;s a parametric, &#039;&#039;code based&#039;&#039; 3D modelling platform.  The DSL is super simple yet supports extensible design like external modules and functions.  I&#039;ve found it a lot easier to use for designing functional parts and models than the larger GUI-based design systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I currently primarily upload my models to [https://cults3d.com/ Cults3D], which I migrated to during the great [https://www.reddit.com/r/3Dprinting/comments/x00n2t/why_are_people_moving_away_from_thingiverse/ Makerbot Takeover of Thingiverse controversy] of the mid 2010s.  I don&#039;t personally have any beef with Makerbot, but the site got demonstrably worse and hard to use under their management.   Most of my models are still there, I just tend to publish primarily elsewhere because it works better.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I might eventually put all my models on [https://github.com/phreakmonkey/ GitHub], since it natively supports rendering .STL files now, and I can better organize them there.  I&#039;ll add that to this list when I do.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://cults3d.com/en/users/phreakmonkey/3d-models My Cults3D repository (primary)]&lt;br /&gt;
&lt;br /&gt;
[https://www.thingiverse.com/phreakmonkey/designs My Thingiverse repository]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:OpenSCAD.png&amp;diff=67</id>
		<title>File:OpenSCAD.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:OpenSCAD.png&amp;diff=67"/>
		<updated>2025-01-27T17:39:32Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenSCAD window showing a model&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Aviation&amp;diff=66</id>
		<title>Aviation</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Aviation&amp;diff=66"/>
		<updated>2025-01-25T20:45:35Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I&#039;ve been an aviation enthusiast for as long as I can remember, starting with Microsoft Flight Simulator 2.0 on the IBM PCjr when I was ten years old.  I obtained my FAA Private Pilot Certificate in October, 2001 after training at [https://www.theflightschool.com/ Flight School of Gwinnett] at [https://www.airnav.com/airport/KLZU KLZU], and my Instrument Rating in 2015 with [https://www.iflyifr.com/ PIC Schools].&lt;br /&gt;
&lt;br /&gt;
[[File:FS20.png|alt=Microsoft Flight Simulator 2.0|thumb|How it started]]&lt;br /&gt;
[[File:Cockpit2.jpg|thumb|How it&#039;s going]]&lt;br /&gt;
As of January 2025 I have about 1300 hours as Pilot-in-Command.&lt;br /&gt;
&lt;br /&gt;
== My Aircraft ==&lt;br /&gt;
I previously owned a Cessna 172 Skyhawk and currently own a Cessna T210 Centurion.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N2720L&#039;&#039;&#039; (Owned September 11, 2002 - October, 2018) ====&lt;br /&gt;
1967 Cessna 172H&lt;br /&gt;
&lt;br /&gt;
* Engine: Continental O-300-D&lt;br /&gt;
* Seats: 4&lt;br /&gt;
* Useful load: ~950 lbs.&lt;br /&gt;
[[File:N2720L.jpg|thumb|N2720L]]&lt;br /&gt;
[[File:79B.jpg|alt=Cessna T210|thumb|N6779B]]&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N6779B&#039;&#039;&#039; (Owned June 2018 - present) ====&lt;br /&gt;
1978 Cessna T210M &lt;br /&gt;
&lt;br /&gt;
* Engine: Continental Turbo TSIO-520-R&lt;br /&gt;
* Seats: 6&lt;br /&gt;
* Useful Load: ~1500 lbs.&lt;br /&gt;
&lt;br /&gt;
== Online Resources ==&lt;br /&gt;
I plan most of my flights using [https://skyvector.com/ SkyVector]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Aviation&amp;diff=65</id>
		<title>Aviation</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Aviation&amp;diff=65"/>
		<updated>2025-01-25T20:45:12Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= K.C.&#039;s Aviation Page =&lt;br /&gt;
I&#039;ve been an aviation enthusiast for as long as I can remember, starting with Microsoft Flight Simulator 2.0 on the IBM PCjr when I was ten years old.  I obtained my FAA Private Pilot Certificate in October, 2001 after training at [https://www.theflightschool.com/ Flight School of Gwinnett] at [https://www.airnav.com/airport/KLZU KLZU], and my Instrument Rating in 2015 with [https://www.iflyifr.com/ PIC Schools].&lt;br /&gt;
&lt;br /&gt;
[[File:FS20.png|alt=Microsoft Flight Simulator 2.0|thumb|How it started]]&lt;br /&gt;
[[File:Cockpit2.jpg|thumb|How it&#039;s going]]&lt;br /&gt;
As of January 2025 I have about 1300 hours as Pilot-in-Command.&lt;br /&gt;
&lt;br /&gt;
== My Aircraft ==&lt;br /&gt;
I previously owned a Cessna 172 Skyhawk and currently own a Cessna T210 Centurion.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N2720L&#039;&#039;&#039; (Owned September 11, 2002 - October, 2018) ====&lt;br /&gt;
1967 Cessna 172H&lt;br /&gt;
&lt;br /&gt;
* Engine: Continental O-300-D&lt;br /&gt;
* Seats: 4&lt;br /&gt;
* Useful load: ~950 lbs.&lt;br /&gt;
[[File:N2720L.jpg|thumb|N2720L]]&lt;br /&gt;
[[File:79B.jpg|alt=Cessna T210|thumb|N6779B]]&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N6779B&#039;&#039;&#039; (Owned June 2018 - present) ====&lt;br /&gt;
1978 Cessna T210M &lt;br /&gt;
&lt;br /&gt;
* Engine: Continental Turbo TSIO-520-R&lt;br /&gt;
* Seats: 6&lt;br /&gt;
* Useful Load: ~1500 lbs.&lt;br /&gt;
&lt;br /&gt;
== Online Resources ==&lt;br /&gt;
I plan most of my flights using [https://skyvector.com/ SkyVector]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Aviation&amp;diff=64</id>
		<title>Aviation</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Aviation&amp;diff=64"/>
		<updated>2025-01-25T20:44:40Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=K.C.&#039;s Aviation Page=&lt;br /&gt;
&lt;br /&gt;
I&#039;ve been an aviation enthusiast for as long as I can remember, starting with Microsoft Flight Simulator 2.0 on the IBM PCjr when I was ten years old.  I obtained my FAA Private Pilot Certificate in October, 2001 after training at [https://www.theflightschool.com/ Flight School of Gwinnett] at [https://www.airnav.com/airport/KLZU KLZU], and my Instrument Rating in 2015 with [https://www.iflyifr.com/ PIC Schools].&lt;br /&gt;
&lt;br /&gt;
[[File:FS20.png|alt=Microsoft Flight Simulator 2.0|thumb|How it started]]&lt;br /&gt;
[[File:Cockpit2.jpg|thumb|How it&#039;s going]]&lt;br /&gt;
As of January 2025 I have about 1300 hours as Pilot-in-Command.&lt;br /&gt;
&lt;br /&gt;
== My Aircraft ==&lt;br /&gt;
I previously owned a Cessna 172 Skyhawk and currently own a Cessna T210 Centurion.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N2720L&#039;&#039;&#039; (Owned September 11, 2002 - October, 2018) ====&lt;br /&gt;
1967 Cessna 172H&lt;br /&gt;
&lt;br /&gt;
* Engine: Continental O-300-D&lt;br /&gt;
* Seats: 4&lt;br /&gt;
* Useful load: ~950 lbs.&lt;br /&gt;
[[File:N2720L.jpg|thumb|N2720L]]&lt;br /&gt;
[[File:79B.jpg|alt=Cessna T210|thumb|N6779B]]&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N6779B&#039;&#039;&#039; (Owned June 2018 - present) ====&lt;br /&gt;
1978 Cessna T210M &lt;br /&gt;
&lt;br /&gt;
* Engine: Continental Turbo TSIO-520-R&lt;br /&gt;
* Seats: 6&lt;br /&gt;
* Useful Load: ~1500 lbs.&lt;br /&gt;
&lt;br /&gt;
== Online Resources ==&lt;br /&gt;
I plan most of my flights using [https://skyvector.com/ SkyVector]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Aviation&amp;diff=63</id>
		<title>Aviation</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Aviation&amp;diff=63"/>
		<updated>2025-01-25T20:44:21Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=K.C.&#039;s Aviation Page=&lt;br /&gt;
&lt;br /&gt;
I&#039;ve been an aviation enthusiast for as long as I can remember, starting with Microsoft Flight Simulator 2.0 on the IBM PCjr when I was ten years old.  I obtained my FAA Private Pilot Certificate in October, 2001 after training at [https://www.theflightschool.com/ Flight School of Gwinnett] at [https://www.airnav.com/airport/KLZU KLZU], and my Instrument Rating in 2015 with [https://www.iflyifr.com/ PIC Schools].&lt;br /&gt;
&lt;br /&gt;
[[File:FS20.png|alt=Microsoft Flight Simulator 2.0|thumb|How it started]]&lt;br /&gt;
[[File:Cockpit2.jpg|thumb|How it&#039;s going]]&lt;br /&gt;
As of January 2025 I have about 1300 hours as Pilot-in-Command.&lt;br /&gt;
&lt;br /&gt;
== My Aircraft ==&lt;br /&gt;
I previously owned a Cessna 172 Skyhawk and currently own a Cessna T210 Centurion.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N2720L&#039;&#039;&#039; &#039;&#039;&#039;(Owned September 11, 2002 - October, 2018)&#039;&#039;&#039; ====&lt;br /&gt;
1967 Cessna 172H&lt;br /&gt;
&lt;br /&gt;
* Engine: Continental O-300-D&lt;br /&gt;
* Seats: 4&lt;br /&gt;
* Useful load: ~950 lbs.&lt;br /&gt;
[[File:N2720L.jpg|thumb|N2720L]]&lt;br /&gt;
[[File:79B.jpg|alt=Cessna T210|thumb|N6779B]]&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;N6779B&#039;&#039;&#039; (Owned June 2018 - present) ====&lt;br /&gt;
1978 Cessna T210M &lt;br /&gt;
&lt;br /&gt;
* Engine: Continental Turbo TSIO-520-R&lt;br /&gt;
* Seats: 6&lt;br /&gt;
* Useful Load: ~1500 lbs.&lt;br /&gt;
&lt;br /&gt;
== Online Resources ==&lt;br /&gt;
I plan most of my flights using [https://skyvector.com/ SkyVector]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=62</id>
		<title>Microcontrollers</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=62"/>
		<updated>2025-01-25T20:16:23Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My first ever microcontroller was the Parallax Basic Stamp BS2SX, thanks to ads in the early-90s computer magazines I was reading at the time.  Thankfully, both I and the industry have come a long way since then, but the BS2SX is actually pretty neat.  I built a [[PocketDial|battery-powered wardialer]] using just it and some discrete components.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheat sheets for my current favorite microcontrollers:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The [[BluePill|BluePill STM32F103CT8C6]] board.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Espressif notes / projects / links:&lt;br /&gt;
&lt;br /&gt;
* The Espressif [[ESP8266]]&lt;br /&gt;
* [[T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals]]&lt;br /&gt;
* [https://tasmota.github.io/docs/ Tasmota] is my favorite home automation firmware.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=BluePill&amp;diff=61</id>
		<title>BluePill</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=BluePill&amp;diff=61"/>
		<updated>2025-01-25T20:15:11Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
The BluePill is an inexpensive Arduino style microcontroller board built around the STMicroelectronics ARM Cortex-M3 [https://www.st.com/resource/en/datasheet/stm32f103rc.pdf STM32F103CT6] microcontroller. &lt;br /&gt;
&lt;br /&gt;
[[File:BluePill pinout.png|frameless|501x501px]]&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
The 32-bit microcontroller runs at 72MHz, has 20k of RAM, 128k of flash, and a shitload of GPIO pins.  At around $5 each, it&#039;s basically superior to all the Arduino options, at a fraction of the price.&lt;br /&gt;
&lt;br /&gt;
VBAT/5V can accept from 3 - 5VDC. &lt;br /&gt;
&lt;br /&gt;
3V3 pins can alternatively be used to power the chip directly (nothing on the board requires 5V)&lt;br /&gt;
&lt;br /&gt;
VBAT is not connected directly to USB P+.  &#039;&#039;&#039;Do not power it from one of the pins and from the USB port at the same time.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The digital I/O pins are 5V tolerant so long as you don&#039;t use the internal pullups.  The analog ADC is, of course, not 5V tolerant.  Best just stick to 3v3 for everything if you can.&lt;br /&gt;
&lt;br /&gt;
== Flashing ==&lt;br /&gt;
The USB port is basically useless.  &lt;br /&gt;
&lt;br /&gt;
* Connect a TTL-Serial adapter connected to UART1 (Pins PA9 &amp;amp; PA10 above, A9 A10 on the silkscreen).&lt;br /&gt;
* Set the &amp;quot;boot&amp;quot; jumper (top) to 1 (rightmost position).&lt;br /&gt;
* Press the [RESET] button&lt;br /&gt;
* Start your upload&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The program will execute immediately upon uploading, but not upon reset until you set the &amp;quot;boot&amp;quot; jumper back to 0.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PlatformIO Configuration&#039;&#039;&#039; ===&lt;br /&gt;
&#039;&#039;platform: ststm32; board: bluepill_f103c8; framework: arduino&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;platformio.ini&#039;&#039;&#039;  settings using arduino framework and TTL Serial Upload:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[env:bluepill_f103c8]&lt;br /&gt;
platform = ststm32&lt;br /&gt;
board = bluepill_f103c8&lt;br /&gt;
framework = arduino&lt;br /&gt;
upload_protocol = serial&lt;br /&gt;
upload_port = /dev/ttyUSB0 # correct as needed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;GPIOs&#039;&#039;&#039; ==&lt;br /&gt;
PA0 - PA15, PB0 - PB15, PC13 - PC15.&lt;br /&gt;
&lt;br /&gt;
The Arduino library references them directly by name (e.g. PA0).&lt;br /&gt;
&lt;br /&gt;
Any IO pin can be an interrupt driver, and there are &#039;&#039;&#039;16&#039;&#039;&#039; external interrupts configurable.&lt;br /&gt;
&lt;br /&gt;
[https://www.electronicshub.org/working-with-interrupts-in-stm32f103c8t6/ Good reference on interrupts on the STM32F103C8T6]&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Analog Measurement (0-3v3)&#039;&#039;&#039; ===&lt;br /&gt;
The 10 analog input pins are &#039;&#039;&#039;12-bit&#039;&#039;&#039; resolution (0-4096 int).&lt;br /&gt;
&lt;br /&gt;
Analog inputs:  PA0 - PA7, PB0, PB1&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PWM Output&#039;&#039;&#039; ===&lt;br /&gt;
There are 15 PWM outputs total.&lt;br /&gt;
&lt;br /&gt;
PA0 - PA3, PA6 - PA10, PB0 - PB1, PB6 - PB9&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;!! First set the PWM settings for the chip in your setup():&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
analogWriteResolution(8); # of bits of PWM resolution, max 16 bits&lt;br /&gt;
analogWriteFrequency(1000); # PWM frequency in Hz, max unknown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Then you can use &amp;lt;code&amp;gt;analogWrite(PIN, VALUE)&amp;lt;/code&amp;gt; as per usual.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;N.B.:  If you want to drive a PWM output from an analog reading, you can just set the analogWriteResolution to 12 and then you don&#039;t have to map the values!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
The user-definable LED on the board is sink-ground through PC13.   Set PC13 LOW to turn it on.  &#039;&#039;&#039;Note: PC13 is not a PWM output.&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=60</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=60"/>
		<updated>2025-01-25T20:08:41Z</updated>

		<summary type="html">&lt;p&gt;Kc: /* Hobbies and Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
* Youtube: https://www.youtube.com/@phreakmonkey/videos &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On Content:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Have you noticed that there are topics here that aren&#039;t links?  Bear with me, I&#039;m just starting to fill this out, but I will randomly and sporadically add topics and pages.  A note on content:  &#039;&#039;Mostly, this is a repository to hold links, discoveries, and cheatsheets.&#039;&#039;  There&#039;s a balance between providing valuable information and &#039;&#039;needlessly repeating existing / available documentation&#039;&#039;, and for the most part I&#039;m going to err on the part of &#039;&#039;not repeating that which is widely available and/or obvious&#039;&#039;.   &lt;br /&gt;
&lt;br /&gt;
Some notable exceptions to this will be where I add things that I get frustrated searching for often, like &#039;&#039;pinout diagrams of common microcontrolers&#039;&#039; and &#039;&#039;tidbits of information that tend to be mostly available on ephemeral forums / blogs&#039;&#039;.  So, what you won&#039;t find here is a repeat of, say, algorithms that are in the famous &#039;&#039;CLRS Introduction to Algorithms Book&#039;&#039;, but you are likely to find &#039;&#039;tips for dealing with the eccentricities of a particular implementation of something in my environment&#039;&#039;.  Vague and subjective, I know, but hey - the world is both analog and chaotic.  :-P   &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[Aviation|My Aviation page.]] I&#039;m a licensed pilot and an aircraft owner. &lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
* CAD / Maker / 3D Printing&lt;br /&gt;
** [[Printrbot 3D Printer]]&lt;br /&gt;
** OpenSCAD &amp;amp; designs&lt;br /&gt;
* Linux / System Administration / Networking&lt;br /&gt;
** (IPv4) [[GeoIP restriction in Linux with xtables]]&lt;br /&gt;
** [[Restoring the GRUB bootloader on LVM-encrypted Debian 12]]&lt;br /&gt;
** [[Adventures with IPv6]]&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=59</id>
		<title>Restoring the GRUB bootloader on LVM-encrypted Debian 12</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=59"/>
		<updated>2025-01-25T20:08:23Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Microsoft&#039;s latest Windows 11 update decided to blow away my dual-boot config because Microsoft apparently hasn&#039;t been involved in an antitrust lawsuit recently enough.  (Seriously, I liken this to buying a Ford vehicle and then discovering that it actively disables any non-Ford vehicles also parked in your driveway.  Not cool, Microsoft.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyhow, since I run Debian 12 with LVM and an encrypted root filesystem, recovering the grub bootloader was a very manual process.  I&#039;m adding the steps I used here for my own future reference.  Yours will probably be different.  This assumes you know your way around Linux, hardware device mappings, &amp;amp;etc.  Please don&#039;t ask me for help recovering your own system unless you&#039;re also offering me $200/hr for my time.&lt;br /&gt;
&lt;br /&gt;
# Boot Debian 12 install media, Advanced Options, &amp;quot;Rescue Mode&amp;quot;&lt;br /&gt;
# Follow the prompts but then &amp;quot;continue with no root filesystem&amp;quot;, drop to an installer shell&lt;br /&gt;
# The encrypted LVM logical volume should already be in /dev/mapper.  Open it with: (substitude the Logical Volume name for $LVNAME)&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cryptsetup luksOpen /dev/mapper/$LVNAME $LVNAME_crypt&lt;br /&gt;
mount /dev/mapper/$LVNAME_crypt /mnt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Double check &amp;lt;code&amp;gt;/mnt/etc/fstab&amp;lt;/code&amp;gt; to make sure the root fs name you used in cryptsetup is the one also here.  If not, &amp;lt;code&amp;gt;unmount /mnt&amp;lt;/code&amp;gt;, close the luksCrypt mapping, and go back to step 3 but use the correct root mount point name for the mapping.&lt;br /&gt;
# &amp;lt;code&amp;gt;fdisk -l /dev/nvme0n1&amp;lt;/code&amp;gt;  (or whatever your drive is) to find the /boot and /boot/EFI partitions&lt;br /&gt;
# mount them under the new rootfs:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount /dev/nvme0n1p4 /mnt/boot&lt;br /&gt;
mount /dev/nvme0n1p1 /mnt/boot/efi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Attach all the virtual filesystems needed to make everything function:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount --bind /proc /mnt/proc&lt;br /&gt;
mount --bind /dev /mnt/dev&lt;br /&gt;
mount --bind /dev/pts /mnt/dev/pts&lt;br /&gt;
mount --bind /sys /mnt/sys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;    9. Mount efivarfs under efivars&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount -t efivarfs none /sys/firmware/efi/efivars&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Reinstall grub on the drive (not on one of the partitions) &#039;&#039;&#039;&#039;&#039;substitute your primary drive device for nvme0n1&#039;&#039;&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-install /dev/nvme0n1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# exit chroot and reboot to get back into your orphaned Debian OS.&lt;br /&gt;
# Boot into Debian 12&lt;br /&gt;
# Re-enable os-prober in &amp;lt;code&amp;gt;/etc/default/grub&amp;lt;/code&amp;gt;&lt;br /&gt;
# Rebuilt grub.cfg and reinstall it:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-mkconfig &amp;gt;/boot/grub/grub.cfg&lt;br /&gt;
grub-install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Now everything should be back to the way it was.  Bill, I&#039;ll send you an invoice for the two hours of my morning you just stole from me.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=58</id>
		<title>Restoring the GRUB bootloader on LVM-encrypted Debian 12</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=58"/>
		<updated>2025-01-25T20:02:55Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Microsoft&#039;s latest Windows 11 update decided to blow away my dual-boot config because Microsoft apparently hasn&#039;t been involved in an antitrust lawsuit recently enough.  (Seriously, I liken this to buying a Ford vehicle and then discovering that it actively disables any non-Ford vehicles also parked in your driveway.  Not cool, Microsoft.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyhow, since I run Debian 12 with LVM and an encrypted root filesystem, recovering the grub bootloader was a very manual process.  I&#039;m adding the steps I used here for my own future reference.  Yours will probably be different.  This assumes you know your way around Linux, hardware device mappings, &amp;amp;etc.  Please don&#039;t ask me for help recovering your own system unless you&#039;re also offering me $200/hr for my time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Boot Debian 12 install media, Advanced Options, &amp;quot;Rescue Mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Follow the prompts but then &amp;quot;continue with no root filesystem&amp;quot;, drop to an installer shell&lt;br /&gt;
&lt;br /&gt;
3. The encrypted LVM logical volume should already be in /dev/mapper.  Open it with: (substitude the Logical Volume name for $LVNAME)&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cryptsetup luksOpen /dev/mapper/$LVNAME $LVNAME_crypt&lt;br /&gt;
mount /dev/mapper/$LVNAME_crypt /mnt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;4. Double check &amp;lt;code&amp;gt;/mnt/etc/fstab&amp;lt;/code&amp;gt; to make sure the root fs name you used in cryptsetup is the one also here.  If not, &amp;lt;code&amp;gt;unmount /mnt&amp;lt;/code&amp;gt;, close the luksCrypt mapping, and go back to step 3 but use the correct root mount point name for the mapping.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;code&amp;gt;fdisk -l /dev/nvme0n1&amp;lt;/code&amp;gt;  (or whatever your drive is) to find the /boot and /boot/EFI partitions&lt;br /&gt;
&lt;br /&gt;
6. mount them under the new rootfs:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount /dev/nvme0n1p4 /mnt/boot&lt;br /&gt;
mount /dev/nvme0n1p1 /mnt/boot/efi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;7. Attach all the virtual filesystems needed to make everything function:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount --bind /proc /mnt/proc&lt;br /&gt;
mount --bind /dev /mnt/dev&lt;br /&gt;
mount --bind /dev/pts /mnt/dev/pts&lt;br /&gt;
mount --bind /sys /mnt/sys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;8. &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
9. Mount efivarfs under efivars &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount -t efivarfs none /sys/firmware/efi/efivars&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;10. Reinstall grub on the drive (not on one of the partitions) &#039;&#039;&#039;&#039;&#039;substitute your primary drive device for nvme0n1&#039;&#039;&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-install /dev/nvme0n1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;11. exit chroot and reboot to get back into your orphaned Debian OS.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:  I wasn&#039;t able to get grub-prober to find the Windows boot manager in rescue mode, so this returns the system to being able to boot Debian but not to the original multiboot.&#039;&#039;&#039; &amp;lt;/blockquote&amp;gt;12. Boot into Debian 12&lt;br /&gt;
&lt;br /&gt;
13. Re-enable os-prober in /etc/default/grub&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-mkconfig &amp;gt;/boot/grub/grub.cfg&lt;br /&gt;
grub-install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Now everything should be back to the way it was.  Bill, I&#039;ll send you an invoice for the two hours of my morning you just stole from me.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=57</id>
		<title>Restoring the GRUB bootloader on LVM-encrypted Debian 12</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=57"/>
		<updated>2025-01-25T20:01:52Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Microsoft&#039;s latest Windows 11 update decided to blow away my dual-boot config because Microsoft apparently hasn&#039;t been involved in an antitrust lawsuit recently enough.  (Seriously, I liken this to buying a Ford vehicle and then discovering that it actively disables any non-Ford vehicles also parked in your driveway.  Not cool, Microsoft.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyhow, since I run Debian 12 with LVM and an encrypted root filesystem, recovering the grub bootloader was a very manual process.  I&#039;m adding the steps I used here for my own future reference.  Yours will probably be different.  This assumes you know your way around Linux, hardware device mappings, &amp;amp;etc.  Please don&#039;t ask me for help recovering your own system unless you&#039;re also offering me $200/hr for my time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Boot Debian 12 install media, Advanced Options, &amp;quot;Rescue Mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Follow the prompts but then &amp;quot;continue with no root filesystem&amp;quot;, drop to an installer shell&lt;br /&gt;
&lt;br /&gt;
3. The encrypted LVM logical volume should already be in /dev/mapper.  Open it with: (substitude the Logical Volume name for $LVNAME)&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cryptsetup luksOpen /dev/mapper/$LVNAME $LVNAME_crypt&lt;br /&gt;
mount /dev/mapper/$LVNAME_crypt /mnt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;4. Double check &amp;lt;code&amp;gt;/mnt/etc/fstab&amp;lt;/code&amp;gt; to make sure the root fs name you used in cryptsetup is the one also here.  If not, &amp;lt;code&amp;gt;unmount /mnt&amp;lt;/code&amp;gt;, close the luksCrypt mapping, and go back to step 3 but use the correct root mount point name for the mapping.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;code&amp;gt;fdisk -l /dev/nvme0n1&amp;lt;/code&amp;gt;  (or whatever your drive is) to find the /boot and /boot/EFI partitions&lt;br /&gt;
&lt;br /&gt;
6. mount them under the new rootfs:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount /dev/nvme0n1p4 /mnt/boot&lt;br /&gt;
mount /dev/nvme0n1p1 /mnt/boot/efi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;7. Attach all the virtual filesystems needed to make everything function:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount --bind /proc /mnt/proc&lt;br /&gt;
mount --bind /dev /mnt/dev&lt;br /&gt;
mount --bind /dev/pts /mnt/dev/pts&lt;br /&gt;
mount --bind /sys /mnt/sys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;8. &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Mount efivarfs under efivars &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount -t efivarfs none /sys/firmware/efi/efivars&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;9. Reinstall grub on the drive (not on one of the partitions) &#039;&#039;&#039;&#039;&#039;substitute your primary drive device for nvme0n1&#039;&#039;&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-install /dev/nvme0n1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;10. exit chroot and reboot to get back into your orphaned Debian OS.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:  I wasn&#039;t able to get grub-prober to find the Windows boot manager in rescue mode, so this returns the system to being able to boot Debian but not to the original multiboot.&#039;&#039;&#039; &amp;lt;/blockquote&amp;gt;11. Boot into Debian 12&lt;br /&gt;
&lt;br /&gt;
14. Re-enable os-prober in /etc/default/grub&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-mkconfig &amp;gt;/boot/grub/grub.cfg&lt;br /&gt;
grub-install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Now everything should be back to the way it was.  Bill, I&#039;ll send you an invoice for the two hours of my morning you just stole from me.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=56</id>
		<title>Restoring the GRUB bootloader on LVM-encrypted Debian 12</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Restoring_the_GRUB_bootloader_on_LVM-encrypted_Debian_12&amp;diff=56"/>
		<updated>2025-01-25T20:01:06Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot;Microsoft&amp;#039;s latest Windows 11 update decided to blow away my dual-boot config because Microsoft apparently hasn&amp;#039;t been involved in an antitrust lawsuit recently enough.  (Seriously, I liken this to buying a Ford vehicle and then discovering that it actively disables any non-Ford vehicles also parked in your driveway.  Not cool, Microsoft.)   Anyhow, since I run Debian 12 with LVM and an encrypted root filesystem, recovering the grub bootloader was a very manual process...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Microsoft&#039;s latest Windows 11 update decided to blow away my dual-boot config because Microsoft apparently hasn&#039;t been involved in an antitrust lawsuit recently enough.  (Seriously, I liken this to buying a Ford vehicle and then discovering that it actively disables any non-Ford vehicles also parked in your driveway.  Not cool, Microsoft.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyhow, since I run Debian 12 with LVM and an encrypted root filesystem, recovering the grub bootloader was a very manual process.  I&#039;m adding the steps I used here for my own future reference.  Yours will probably be different.  This assumes you know your way around Linux, hardware device mappings, &amp;amp;etc.  Please don&#039;t ask me for help recovering your own system unless you&#039;re also offering me $200/hr for my time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Boot Debian 12 install media, Advanced Options, &amp;quot;Rescue Mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Follow the prompts but then &amp;quot;continue with no root filesystem&amp;quot;, drop to an installer shell&lt;br /&gt;
&lt;br /&gt;
3. The encrypted LVM logical volume should already be in /dev/mapper.  Open it with: (substitude the Logical Volume name for $LVNAME)&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cryptsetup luksOpen /dev/mapper/$LVNAME $LVNAME_crypt&lt;br /&gt;
mount /dev/mapper/$LVNAME_crypt /mnt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;5. Double check &amp;lt;code&amp;gt;/mnt/etc/fstab&amp;lt;/code&amp;gt; to make sure the root fs name you used in cryptsetup is the one also here.  If not, &amp;lt;code&amp;gt;unmount /mnt&amp;lt;/code&amp;gt;, close the luksCrypt mapping, and go back to step 3 but use the correct root mount point name for the mapping.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;code&amp;gt;fdisk -l /dev/nvme0n1&amp;lt;/code&amp;gt;  (or whatever your drive is) to find the /boot and /boot/EFI partitions&lt;br /&gt;
&lt;br /&gt;
7. mount them under the new rootfs:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount /dev/nvme0n1p4 /mnt/boot&lt;br /&gt;
mount /dev/nvme0n1p1 /mnt/boot/efi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;8. Attach all the virtual filesystems needed to make everything function:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount --bind /proc /mnt/proc&lt;br /&gt;
mount --bind /dev /mnt/dev&lt;br /&gt;
mount --bind /dev/pts /mnt/dev/pts&lt;br /&gt;
mount --bind /sys /mnt/sys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;9. &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Mount efivarfs under efivars &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mount -t efivarfs none /sys/firmware/efi/efivars&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;11. Reinstall grub on the drive (not on one of the partitions) &#039;&#039;&#039;&#039;&#039;substitute your primary drive device for nvme0n1&#039;&#039;&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-install /dev/nvme0n1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;12. exit chroot and reboot to get back into your orphaned Debian OS.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:  I wasn&#039;t able to get grub-prober to find the Windows boot manager in rescue mode, so this returns the system to being able to boot Debian but not to the original multiboot.&#039;&#039;&#039; &amp;lt;/blockquote&amp;gt;13. Boot into Debian 12&lt;br /&gt;
&lt;br /&gt;
14. Re-enable os-prober in /etc/default/grub&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grub-mkconfig &amp;gt;/boot/grub/grub.cfg&lt;br /&gt;
grub-install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Now everything should be back to the way it was.  Bill, I&#039;ll send you an invoice for the two hours of my morning you just stole from me.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=GeoIP_restriction_in_Linux_with_xtables&amp;diff=55</id>
		<title>GeoIP restriction in Linux with xtables</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=GeoIP_restriction_in_Linux_with_xtables&amp;diff=55"/>
		<updated>2025-01-25T19:50:22Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&amp;lt;big&amp;gt;Original blog post: https://www.phreakmonkey.com/2022/01/howto-geoip-restrictions-for-amazon.html&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
I originally wrote about the process (above) for doing IPv4 GeoIP restriction to a host / service using [https://xtables-addons.sourceforge.net/ xtables-addons] and [https://www.maxmind.com/en/geoip-databases Maxmind&#039;s GeoIP database] with Amazon Linux 2.  This approach worked but had the huge drawback of needing to update, compile, and install xtables-addons manually &#039;&#039;every time there was a kernel update&#039;&#039;, which was easy to overlook - thereby leaving you suddenly with no GeoIP restrictions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Whether GeoIP restrictions are worth it at all is a subject of debate.  By and large I&#039;ve abandoned the approach, as they&#039;re super easy to circumvent for a dedicated attacker anyway, and how much value to you really get by limiting opportunistic attackers via geofencing?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That said, here&#039;s an amended, easier way to do GeoIP IPv4 with Debian (12.x as of this writing):&lt;br /&gt;
&lt;br /&gt;
== Basic steps ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;apt get xtables-addons-common&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt get cpan&amp;lt;/code&amp;gt; &lt;br /&gt;
** &amp;lt;code&amp;gt;cpan install&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cpan Text::CSV Text::CSV_XS Net::CIDR::Lite&amp;lt;/code&amp;gt;&lt;br /&gt;
* Download a &amp;lt;code&amp;gt;Maxmind GeoLite2-Country-CSV&amp;lt;/code&amp;gt; database and extract it&lt;br /&gt;
* &amp;lt;code&amp;gt;mkdir /usr/share/xt_geoip&amp;lt;/code&amp;gt;&lt;br /&gt;
* from the extracted GeoLite2 database directory, run &amp;lt;code&amp;gt;/usr/libexec/xtables-addons/xt_geoip_build_maxmind -s&amp;lt;/code&amp;gt; to install the database where the kernel module can find it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If all goes well, now you&#039;re all set-up.  You can now use the &amp;lt;code&amp;gt;-m geoip&amp;lt;/code&amp;gt; directive in iptables rules.  E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;# iptables -A INPUT -p tcp --dport 443 -m geoip ! --source-country US -j DROP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will drop all TCP port 443 packets that originate from outside the United States.&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Localhost (127.0.0.0/8) is outside any known geography.  Allow it before your GeoIP blocking rules&lt;br /&gt;
* Some remote services aren&#039;t GeoIP friendly.  &#039;&#039;&#039;LetsEncrypt / Acme Certificate Verficiation&#039;&#039;,&#039;&#039;&#039;&#039;&#039; in particular, will &#039;&#039;fail to provision new certificates if you&#039;re GeoIP restricting port 80 &amp;amp; 443 traffic to just the US.&#039;&#039;  At the time of this writing it will &#039;&#039;renew existing certificates&#039;&#039; with the GeoIP block in place, just not provision new ones.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=GeoIP_restriction_in_Linux_with_xtables&amp;diff=54</id>
		<title>GeoIP restriction in Linux with xtables</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=GeoIP_restriction_in_Linux_with_xtables&amp;diff=54"/>
		<updated>2025-01-25T19:49:51Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;lt;big&amp;gt;Original blog post: https://www.phreakmonkey.com/2022/01/howto-geoip-restrictions-for-amazon.html&amp;lt;/big&amp;gt;&amp;#039;&amp;#039;  == Background == I originally wrote about the process (above) for doing IPv4 GeoIP restriction to a host / service using [https://xtables-addons.sourceforge.net/ xtables-addons] and [https://www.maxmind.com/en/geoip-databases Maxmind&amp;#039;s GeoIP database] with Amazon Linux 2.  This approach worked but had the huge drawback of needing to update, compile, and insta...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&amp;lt;big&amp;gt;Original blog post: https://www.phreakmonkey.com/2022/01/howto-geoip-restrictions-for-amazon.html&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
I originally wrote about the process (above) for doing IPv4 GeoIP restriction to a host / service using [https://xtables-addons.sourceforge.net/ xtables-addons] and [https://www.maxmind.com/en/geoip-databases Maxmind&#039;s GeoIP database] with Amazon Linux 2.  This approach worked but had the huge drawback of needing to update, compile, and install xtables-addons manually &#039;&#039;every time there was a kernel update&#039;&#039;, which was easy to overlook - thereby leaving you suddenly with no GeoIP restrictions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Whether GeoIP restrictions are worth it at all is a subject of debate.  By and large I&#039;ve abandoned the approach, as they&#039;re super easy to circumvent for a dedicated attacker anyway, and how much value to you really get by limiting opportunistic attackers via geofencing?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That said, here&#039;s an amended, easier way to do GeoIP IPv4 with Debian:&lt;br /&gt;
&lt;br /&gt;
== Basic steps ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;apt get xtables-addons-common&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt get cpan&amp;lt;/code&amp;gt; &lt;br /&gt;
** &amp;lt;code&amp;gt;cpan install&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cpan Text::CSV Text::CSV_XS Net::CIDR::Lite&amp;lt;/code&amp;gt;&lt;br /&gt;
* Download a &amp;lt;code&amp;gt;Maxmind GeoLite2-Country-CSV&amp;lt;/code&amp;gt; database and extract it&lt;br /&gt;
* &amp;lt;code&amp;gt;mkdir /usr/share/xt_geoip&amp;lt;/code&amp;gt;&lt;br /&gt;
* from the extracted GeoLite2 database directory, run &amp;lt;code&amp;gt;/usr/libexec/xtables-addons/xt_geoip_build_maxmind -s&amp;lt;/code&amp;gt; to install the database where the kernel module can find it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If all goes well, now you&#039;re all set-up.  You can now use the &amp;lt;code&amp;gt;-m geoip&amp;lt;/code&amp;gt; directive in iptables rules.  E.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;# iptables -A INPUT -p tcp --dport 443 -m geoip ! --source-country US -j DROP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will drop all TCP port 443 packets that originate from outside the United States.&lt;br /&gt;
&lt;br /&gt;
== Warnings ==&lt;br /&gt;
&lt;br /&gt;
* Localhost (127.0.0.0/8) is outside any known geography.  Allow it before your GeoIP blocking rules&lt;br /&gt;
* Some remote services aren&#039;t GeoIP friendly.  &#039;&#039;&#039;LetsEncrypt / Acme Certificate Verficiation&#039;&#039;,&#039;&#039;&#039;&#039;&#039; in particular, will &#039;&#039;fail to provision new certificates if you&#039;re GeoIP restricting port 80 &amp;amp; 443 traffic to just the US.&#039;&#039;  At the time of this writing it will &#039;&#039;renew existing certificates&#039;&#039; with the GeoIP block in place, just not provision new ones.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Printrbot_3D_Printer&amp;diff=53</id>
		<title>Printrbot 3D Printer</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Printrbot_3D_Printer&amp;diff=53"/>
		<updated>2025-01-25T17:52:39Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Printbot-thomas-track.png|thumb|Printing a Thomas The Train track piece]]&lt;br /&gt;
I bought my first 3D printer in 2014, a &amp;quot;Printrbot Simple Metal&amp;quot;.  Naturally, the first thing I used it for was to make toy parts for my kid.  🤣&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Amazingly, as of 2025, this is still my only 3D Printer.  I&#039;ve converted it to a heated bed with the simple addition of an ATX power supply and a [https://www.amazon.com/gp/product/B08R19MH4V/ 150W Silicone Mat Heater], but other than that it&#039;s currently still stock.  I print primarily from PLA and PETG on it, though I&#039;ve printed some Nylon and &amp;quot;Wood / PLA&amp;quot; exotic filaments too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The printer lives in an enclosed cabinet in my garage, where it is controlled by a Raspberry Pi running [https://octoprint.org/ OctoPrint]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
My favorite filament brand is [https://www.hatchbox3d.com/ Hatchbox 3D], after having mixed / bad experiences with cheaper no-name / generic filament over the years.  I was surprised at how much a difference slightly higher quality filament makes in the print quality.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Printrbot_3D_Printer&amp;diff=52</id>
		<title>Printrbot 3D Printer</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Printrbot_3D_Printer&amp;diff=52"/>
		<updated>2025-01-25T17:50:48Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot;Printing a Thomas The Train track piece I bought my first 3D printer in 2014, a &amp;quot;Printrbot Simple Metal&amp;quot;.  Naturally, the first thing I used it for was to make toy parts for my kid.  🤣   Amazingly, as of 2025, this is still my only 3D Printer.  I&amp;#039;ve converted the bed to heated with the simple addition of an ATX power supply and a [https://www.amazon.com/gp/product/B08R19MH4V/ 150W Silicone Mat Heater], but other than that it&amp;#039;s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Printbot-thomas-track.png|thumb|Printing a Thomas The Train track piece]]&lt;br /&gt;
I bought my first 3D printer in 2014, a &amp;quot;Printrbot Simple Metal&amp;quot;.  Naturally, the first thing I used it for was to make toy parts for my kid.  🤣&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Amazingly, as of 2025, this is still my only 3D Printer.  I&#039;ve converted the bed to heated with the simple addition of an ATX power supply and a [https://www.amazon.com/gp/product/B08R19MH4V/ 150W Silicone Mat Heater], but other than that it&#039;s currently still stock.  I print primarily from PLA and PETG on it, though I&#039;ve printed some Nylon and &amp;quot;Wood / PLA&amp;quot; exotic filaments too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The printer lives in an enclosed cabinet in my garage, where it is controlled by a Raspberry Pi running [https://octoprint.org/ OctoPrint]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
My favorite filament brand is [https://www.hatchbox3d.com/ Hatchbox 3D], after having mixed / bad experiences with cheaper no-name / generic filament over the years.  I was surprised at how much a difference slightly higher quality filament makes in the print quality.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:Printbot-thomas-track.png&amp;diff=51</id>
		<title>File:Printbot-thomas-track.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:Printbot-thomas-track.png&amp;diff=51"/>
		<updated>2025-01-25T17:41:34Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Printing a Thomas The Train track piece with a Printrbot Simple Metal&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=50</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=50"/>
		<updated>2025-01-25T17:31:29Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
* Youtube: https://www.youtube.com/@phreakmonkey/videos &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On Content:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Have you noticed that there are topics here that aren&#039;t links?  Bear with me, I&#039;m just starting to fill this out, but I will randomly and sporadically add topics and pages.  A note on content:  &#039;&#039;Mostly, this is a repository to hold links, discoveries, and cheatsheets.&#039;&#039;  There&#039;s a balance between providing valuable information and &#039;&#039;needlessly repeating existing / available documentation&#039;&#039;, and for the most part I&#039;m going to err on the part of &#039;&#039;not repeating that which is widely available and/or obvious&#039;&#039;.   &lt;br /&gt;
&lt;br /&gt;
Some notable exceptions to this will be where I add things that I get frustrated searching for often, like &#039;&#039;pinout diagrams of common microcontrolers&#039;&#039; and &#039;&#039;tidbits of information that tend to be mostly available on ephemeral forums / blogs&#039;&#039;.  So, what you won&#039;t find here is a repeat of, say, algorithms that are in the famous &#039;&#039;CLRS Introduction to Algorithms Book&#039;&#039;, but you are likely to find &#039;&#039;tips for dealing with the eccentricities of a particular implementation of something in my environment&#039;&#039;.  Vague and subjective, I know, but hey - the world is both analog and chaotic.  :-P   &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* I&#039;m a licensed pilot and an aircraft owner.  [[Aviation|My Aviation page.]]&lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
* CAD / Maker / 3D Printing&lt;br /&gt;
** [[Printrbot 3D Printer]]&lt;br /&gt;
** OpenSCAD &amp;amp; designs&lt;br /&gt;
* Networking&lt;br /&gt;
** Adventures with IPv6&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=ESP8266&amp;diff=49</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=ESP8266&amp;diff=49"/>
		<updated>2025-01-24T18:47:58Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
The venerable Esprissif chip with wifi, and the foundation for &#039;&#039;&#039;&#039;&#039;so much Internet of Things shit&#039;&#039;&#039;&#039;&#039; &#039;&#039;in the world.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP-8266 is readily available in a dozen variants.  These are my notes for the ones I most often use:&lt;br /&gt;
[[File:Wemos D1 Mini Pinout.png|thumb|Wemos D1 Mini pinout ]]&lt;br /&gt;
[[File:NodeMCU v3 Pinout.png|thumb|NodeMCU v3 board and pinout]]&lt;br /&gt;
&lt;br /&gt;
== General ESP8266 notes ==&lt;br /&gt;
The ESP-8266 (and 8285 variant) is a 3v3 microcontroller.  The GPIO pins are 5V tolerant for binary inputs, but it&#039;s probably not a good idea to go throwing 5v data lines around with it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you&#039;re not using a DEV (Wemos / NodeMCU / etc) board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pull RST (reset) HIGH&#039;&#039;&#039; to keep it from floating.  (GND it to hw reboot)&lt;br /&gt;
* &#039;&#039;&#039;Pull EN (enable) HIGH&#039;&#039;&#039; to make device run.&lt;br /&gt;
&lt;br /&gt;
=== GPIO dragons ===&lt;br /&gt;
At first blush it looks like the ESP-8266 has lots of GPIOs, but in reality only about half a dozen are universally usable.  Common stumbling blocks / warnings:&lt;br /&gt;
&lt;br /&gt;
* The pin numbers on Wemos / NodeMCU / &amp;amp;etc &amp;quot;dev boards&amp;quot; don&#039;t match the ESP-8266 datasheet GPIO numbers.  Refer to the pinout diagrams to see the actual mappings.&lt;br /&gt;
* &#039;&#039;&#039;GPIO1&#039;&#039;&#039;, &#039;&#039;&#039;GPIO2&#039;&#039;&#039;, &#039;&#039;&#039;GPIO3&#039;&#039;&#039;, &#039;&#039;&#039;GPIO16&#039;&#039;&#039; all strobe HIGH at boot.   If you put a transistor or relay on them, be prepared for it to intermittently strobe high uncommanded every time the uC reboots. &lt;br /&gt;
* &#039;&#039;&#039;GPIO0&#039;&#039;&#039;, &#039;&#039;&#039;GPIO2&#039;&#039;&#039; are pulled-high, and &#039;&#039;&#039;device will not boot if they&#039;re pulled low.&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;GPIO1&#039;&#039;&#039; (TX) will cause device not to boot if &#039;&#039;&#039;pulled low&#039;&#039;&#039;. &lt;br /&gt;
* &#039;&#039;&#039;GPIO15&#039;&#039;&#039; is pulled low and &#039;&#039;&#039;device will not boot if pulled high&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;The raw A0 analog input pin is 0-1VDC.&#039;&#039;&#039;  The &amp;quot;dev boards&amp;quot; (NodeMCU, Wemos D1 &amp;amp;etc) all put a 3.3:1 voltage divider network in front of it.  So be aware of the specific implementation you&#039;re using&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Flashing&#039;&#039;&#039; ===&lt;br /&gt;
The default way to flash the program space in an ESP-8266 is to &#039;&#039;&#039;tie GPIO0 to GND during boot&#039;&#039;,&#039;&#039;&#039;&#039;&#039; this puts the device into firmware update mode.&lt;br /&gt;
&lt;br /&gt;
Modern dev boards can be reset and flashed via the USB port using the &#039;&#039;&#039;[https://github.com/espressif/esptool esptool.py]&#039;&#039;&#039; (which is also utilized by PlatformIO)&lt;br /&gt;
&lt;br /&gt;
Momentarily grounding RST will reset the device.  Tie RST high (if not already) the rest of the time to prevent it from floating.&lt;br /&gt;
&lt;br /&gt;
[[File:ESP-12F Module.png|thumb|ESP-12F Module and pinout]]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=T.O.W.L._-_A_Telemetry_project_using_an_ESP8266,_a_GPS_module,_and_WiFi_captive_portals&amp;diff=48</id>
		<title>T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=T.O.W.L._-_A_Telemetry_project_using_an_ESP8266,_a_GPS_module,_and_WiFi_captive_portals&amp;diff=48"/>
		<updated>2025-01-24T18:40:52Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Original blog post: https://www.phreakmonkey.com/2016/08/towl-telemetry-over-opportunistic-wifi.html&lt;br /&gt;
&lt;br /&gt;
=== Premise &amp;amp; Background ===&lt;br /&gt;
&#039;&#039;Can you build a &amp;quot;LoJack&amp;quot; style asset tracking capability using open WiFi hotspots?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The proliferation of cheap, lightweight WiFi embedded (&amp;quot;IoT&amp;quot;) devices made me wonder.  The WiFi association stack, DHCP client stack, et al. has to be incredibly lightweight and simple to fit in the firmware on, say, an ESP8266.  If you programmed one to scan, find an AP, associate, get an address, and send a single packet - would it be able to do it fast enough to report its location from a moving vehicle?&lt;br /&gt;
&lt;br /&gt;
[Aside: This is actually something I&#039;ve wondered about for years, but the IoT chips offered a unique and low-cost way to try it.]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;But wait,&amp;quot; you say, &amp;quot;there really aren&#039;t that many open APs these days.  Most of them are captive or paywall portals, or at least make you agree to some goofy ToS.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Right, but as has been pointed out multiple times by multiple people all the way back to Dan Kaminsky&#039;s DNS tunneling talk in 2004 - hotspots diligently resolve DNS queries.  All you have to do is base32 encode the data you want to send in the hostname of a valid DNS record request, and set up a DNS server for a subdomain (under a domain you own) to catch the queries.&lt;br /&gt;
&lt;br /&gt;
If it works, you get near real-time telemetry over opportunistic WiFi links using DNS recursion!  Think: &amp;quot;low cost LoJack with no data subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I originally used the Digistump Oak variant of the ESP8266 prototype boards.  I like the fact that it can be flashed OTA, which proves to be useful once the device is deployed in something like an automobile.  &#039;&#039;[N.B. 2025 - this didn&#039;t age well.  Use a generic ESP-8266 dev board and don&#039;t trust someone else&#039;s &amp;quot;cloud&amp;quot;]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In my testing, the complete chain from calling connectAP() to getting the DNS query response typically takes between 3 and 6 seconds, which is certainly fast enough from a slow moving vehicle.&lt;br /&gt;
&lt;br /&gt;
=== Device Output ===&lt;br /&gt;
The device stores the telemetry in a 16-byte struct consisting of:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct telem {&lt;br /&gt;
  uint32_t tstamp;  // GPS time in ctime format&lt;br /&gt;
  int32_t lat;      // Latitude * 1000000&lt;br /&gt;
  int32_t lon;      // Longitude * 1000000&lt;br /&gt;
  uint8_t spd;      // Speed in MPH&lt;br /&gt;
  uint8_t sats;     // Number of GPS satellites received&lt;br /&gt;
  uint8_t id;       // Arbitrary number for ACK&lt;br /&gt;
  uint8_t mode;     // Object state information&lt;br /&gt;
};  // 16 bytes total&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;The fields are largely self-explanatory.  You&#039;ll notice that I used an 8-bit number for speed, so the max speed it will report is 255 MPH.  Also, the 32-bit ctime field means it&#039;s vulnerable to the Year 2038 Problem.&lt;br /&gt;
&lt;br /&gt;
The field worth explanation is &amp;quot;mode&amp;quot;, which is set as follows:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Value |  Meaning&lt;br /&gt;
255   |  Startup position.&lt;br /&gt;
254   |  Live. Transmitted and ACKed in realtime&lt;br /&gt;
1-n   |  Stored position&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;The first few position observations are always flagged as mode 255, regardless of whether they&#039;re able to be transmitted live or not.  (This way you know where the device started.)&lt;br /&gt;
&lt;br /&gt;
The stored position value is simply the number of 10-second intervals since last transmission modulo the MAX_INTERVAL setting.  This is how the unit &amp;quot;downsamples&amp;quot; the stored waypoint resolution if the buffer fills up.&lt;br /&gt;
&lt;br /&gt;
So... how well does it work?&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a plot on OpenStreetMaps of me driving to work one morning.  The blue markers are live (mode 254) and the red markers are stored.&lt;br /&gt;
[[File:OpenStreetMap.png|center|frameless|480x480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Of note are the blue markers along the freeway.  I&#039;ve regularly observed this device successfully logging the telemetry data at speeds upward of 60 MPH!&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Technical Details ===&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;Digistump Oak&amp;lt;/s&amp;gt; Generic ESP-8266 dev board&lt;br /&gt;
* NMEA serial GPS module (e.g. uBlox or MTK)&lt;br /&gt;
&lt;br /&gt;
==== Software ====&lt;br /&gt;
The software for the Digistump Oak, as well as a PoC DNS server (in python) to log the output, is available here:  &lt;br /&gt;
&lt;br /&gt;
https://github.com/phreakmonkey/towl&lt;br /&gt;
&lt;br /&gt;
Check the README notes under both subdirectories for build dependencies / config notes.&lt;br /&gt;
&lt;br /&gt;
==== Setup ====&lt;br /&gt;
You&#039;ll need to host a custom nameserver on the Internet to receive the DNS queries.  You&#039;ll also need to control a domain so that you can designate your DNS query receiver as a subdomain. &lt;br /&gt;
&lt;br /&gt;
E.g. if you own the domain &amp;quot;MyDomain.com&amp;quot;, you could designate a server to receive the TOWL queries by creating a NS record for &amp;lt;code&amp;gt;TOWL.MyDomain.com&amp;lt;/code&amp;gt;, pointing at the server you intend to run the catcher on. If said server is at IP address 1.2.3.4, then that record looks something akin to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TOWL IN NS 1.2.3.4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the PoC code on the designated server. Be sure to configure both the TOWL devices and the server code for the &amp;quot;TOWL.MyDomain.com&amp;quot; domain name. (See README under each directory for instructions.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=T.O.W.L._-_A_Telemetry_project_using_an_ESP8266,_a_GPS_module,_and_WiFi_captive_portals&amp;diff=47</id>
		<title>T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=T.O.W.L._-_A_Telemetry_project_using_an_ESP8266,_a_GPS_module,_and_WiFi_captive_portals&amp;diff=47"/>
		<updated>2025-01-24T18:05:26Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== Premise &amp;amp; Background: ===&lt;br /&gt;
&#039;&#039;Can you build a &amp;quot;LoJack&amp;quot; style asset tracking capability using open WiFi hotspots?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The proliferation of cheap, lightweight WiFi embedded (&amp;quot;IoT&amp;quot;) devices made me wonder.  The WiFi association stack, DHCP client stack, et al. has to be incredibly lightweight and simple to fit in the firmware on, say, an ESP8266.  If you programmed one to scan, find an AP, associate, get an address, and send a single packet - would it be able to do it fast enough to report its location from a moving vehicle?&lt;br /&gt;
&lt;br /&gt;
[Aside: This is actually something I&#039;ve wondered about for years, but the IoT chips offered a unique and low-cost way to try it.]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;But wait,&amp;quot; you say, &amp;quot;there really aren&#039;t that many open APs these days.  Most of them are captive or paywall portals, or at least make you agree to some goofy ToS.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Right, but as has been pointed out multiple times by multiple people all the way back to Dan Kaminsky&#039;s DNS tunneling talk in 2004 - hotspots diligently resolve DNS queries.  All you have to do is base32 encode the data you want to send in the hostname of a valid DNS record request, and set up a DNS server for a subdomain (under a domain you own) to catch the queries.&lt;br /&gt;
&lt;br /&gt;
If it works, you get near real-time telemetry over opportunistic WiFi links using DNS recursion!  Think: &amp;quot;low cost LoJack with no data subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I originally used the Digistump Oak variant of the ESP8266 prototype boards.  I like the fact that it can be flashed OTA, which proves to be useful once the device is deployed in something like an automobile.  &#039;&#039;[N.B. 2025 - this didn&#039;t age well.  Use a generic ESP-8266 dev board and don&#039;t trust someone else&#039;s &amp;quot;cloud&amp;quot;]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In my testing, the complete chain from calling connectAP() to getting the DNS query response typically takes between 3 and 6 seconds, which is certainly fast enough from a slow moving vehicle.&lt;br /&gt;
&lt;br /&gt;
=== Device Output ===&lt;br /&gt;
The device stores the telemetry in a 16-byte struct consisting of:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct telem {&lt;br /&gt;
  uint32_t tstamp;  // GPS time in ctime format&lt;br /&gt;
  int32_t lat;      // Latitude * 1000000&lt;br /&gt;
  int32_t lon;      // Longitude * 1000000&lt;br /&gt;
  uint8_t spd;      // Speed in MPH&lt;br /&gt;
  uint8_t sats;     // Number of GPS satellites received&lt;br /&gt;
  uint8_t id;       // Arbitrary number for ACK&lt;br /&gt;
  uint8_t mode;     // Object state information&lt;br /&gt;
};  // 16 bytes total&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;The fields are largely self-explanatory.  You&#039;ll notice that I used an 8-bit number for speed, so the max speed it will report is 255 MPH.  Also, the 32-bit ctime field means it&#039;s vulnerable to the Year 2038 Problem.&lt;br /&gt;
&lt;br /&gt;
The field worth explanation is &amp;quot;mode&amp;quot;, which is set as follows:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Value |  Meaning&lt;br /&gt;
255   |  Startup position.&lt;br /&gt;
254   |  Live. Transmitted and ACKed in realtime&lt;br /&gt;
1-n   |  Stored position&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;The first few position observations are always flagged as mode 255, regardless of whether they&#039;re able to be transmitted live or not.  (This way you know where the device started.)&lt;br /&gt;
&lt;br /&gt;
The stored position value is simply the number of 10-second intervals since last transmission modulo the MAX_INTERVAL setting.  This is how the unit &amp;quot;downsamples&amp;quot; the stored waypoint resolution if the buffer fills up.&lt;br /&gt;
&lt;br /&gt;
So... how well does it work?&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a plot on OpenStreetMaps of me driving to work one morning.  The blue markers are live (mode 254) and the red markers are stored.&lt;br /&gt;
[[File:OpenStreetMap.png|center|frameless|480x480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Of note are the blue markers along the freeway.  I&#039;ve regularly observed this device successfully logging the telemetry data at speeds upward of 60 MPH!&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Technical Details ===&lt;br /&gt;
&lt;br /&gt;
==== Hardware: ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;Digistump Oak&amp;lt;/s&amp;gt; Generic ESP-8266 dev board&lt;br /&gt;
* NMEA serial GPS module (e.g. uBlox or MTK)&lt;br /&gt;
&lt;br /&gt;
==== Software: ====&lt;br /&gt;
The software for the Digistump Oak, as well as a PoC DNS server (in python) to log the output, is available here:  &lt;br /&gt;
&lt;br /&gt;
https://github.com/phreakmonkey/towl&lt;br /&gt;
&lt;br /&gt;
Check the README notes under both subdirectories for build dependencies / config notes.&lt;br /&gt;
&lt;br /&gt;
==== Setup: ====&lt;br /&gt;
You&#039;ll need to host a custom nameserver on the Internet to receive the DNS queries.  You&#039;ll also need to control a domain so that you can designate your DNS query receiver as a subdomain. &lt;br /&gt;
&lt;br /&gt;
E.g. if you own the domain &amp;quot;MyDomain.com&amp;quot;, you could designate a server to receive the TOWL queries by creating a NS record for &amp;lt;code&amp;gt;TOWL.MyDomain.com&amp;lt;/code&amp;gt;, pointing at the server you intend to run the catcher on. If said server is at IP address 1.2.3.4, then that record looks something akin to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TOWL IN NS 1.2.3.4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the PoC code on the designated server. Be sure to configure both the TOWL devices and the server code for the &amp;quot;TOWL.MyDomain.com&amp;quot; domain name. (See README under each directory for instructions.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=46</id>
		<title>Microcontrollers</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Microcontrollers&amp;diff=46"/>
		<updated>2025-01-24T17:52:42Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My first ever microcontroller was the Parallax Basic Stamp BS2SX, thanks to ads in the early-90s computer magazines I was reading at the time.  Thankfully, both I and the industry have come a long way since then, but the BS2SX is actually pretty neat.  I built a [[PocketDial|battery-powered wardialer]] using just it and some discrete components.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cheat sheets for my current favorite microcontrollers:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The [[BluePill|BluePill STM32F103CT8C6]] board.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Espressif notes / projects / links:&lt;br /&gt;
&lt;br /&gt;
* The venerable [[ESP8266]]&lt;br /&gt;
* [[T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals]]&lt;br /&gt;
* [https://tasmota.github.io/docs/ Tasmota] is my favorite home automation firmware.&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=T.O.W.L._-_A_Telemetry_project_using_an_ESP8266,_a_GPS_module,_and_WiFi_captive_portals&amp;diff=45</id>
		<title>T.O.W.L. - A Telemetry project using an ESP8266, a GPS module, and WiFi captive portals</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=T.O.W.L._-_A_Telemetry_project_using_an_ESP8266,_a_GPS_module,_and_WiFi_captive_portals&amp;diff=45"/>
		<updated>2025-01-24T17:51:29Z</updated>

		<summary type="html">&lt;p&gt;Kc: Created page with &amp;quot; === Premise &amp;amp; Background: === &amp;#039;&amp;#039;Can you build a &amp;quot;LoJack&amp;quot; style asset tracking capability using open WiFi hotspots?&amp;#039;&amp;#039;  The proliferation of cheap, lightweight WiFi embedded (&amp;quot;IoT&amp;quot;) devices made me wonder.  The WiFi association stack, DHCP client stack, et al. has to be incredibly lightweight and simple to fit in the firmware on, say, an ESP8266.  If you programmed one to scan, find an AP, associate, get an address, and send a single packet - would it be able to do it f...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== Premise &amp;amp; Background: ===&lt;br /&gt;
&#039;&#039;Can you build a &amp;quot;LoJack&amp;quot; style asset tracking capability using open WiFi hotspots?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The proliferation of cheap, lightweight WiFi embedded (&amp;quot;IoT&amp;quot;) devices made me wonder.  The WiFi association stack, DHCP client stack, et al. has to be incredibly lightweight and simple to fit in the firmware on, say, an ESP8266.  If you programmed one to scan, find an AP, associate, get an address, and send a single packet - would it be able to do it fast enough to report its location from a moving vehicle?&lt;br /&gt;
&lt;br /&gt;
[Aside: This is actually something I&#039;ve wondered about for years, but the IoT chips offered a unique and low-cost way to try it.]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;But wait,&amp;quot; you say, &amp;quot;there really aren&#039;t that many open APs these days.  Most of them are captive or paywall portals, or at least make you agree to some goofy ToS.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Right, but as has been pointed out multiple times by multiple people all the way back to Dan Kaminsky&#039;s DNS tunneling talk in 2004 - hotspots diligently resolve DNS queries.  All you have to do is base32 encode the data you want to send in the hostname of a valid DNS record request, and set up a DNS server for a subdomain (under a domain you own) to catch the queries.&lt;br /&gt;
&lt;br /&gt;
If it works, you get near real-time telemetry over opportunistic WiFi links using DNS recursion!  Think: &amp;quot;low cost LoJack with no data subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I originally used the Digistump Oak variant of the ESP8266 prototype boards.  I like the fact that it can be flashed OTA, which proves to be useful once the device is deployed in something like an automobile.  &#039;&#039;[N.B. 2025 - this didn&#039;t age well.  Use a generic ESP-8266 dev board and don&#039;t trust someone else&#039;s &amp;quot;cloud&amp;quot;]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In my testing, the complete chain from calling connectAP() to getting the DNS query response typically takes between 3 and 6 seconds, which is certainly fast enough from a slow moving vehicle.&lt;br /&gt;
&lt;br /&gt;
=== Device Output ===&lt;br /&gt;
The device stores the telemetry in a 16-byte struct consisting of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;struct telem {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  uint32_t tstamp;  // GPS time in ctime format&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  int32_t lat;      // Latitude * 1000000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  int32_t lon;      // Longitude * 1000000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  uint8_t spd;      // Speed in MPH&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  uint8_t sats;     // Number of GPS satellites received&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  uint8_t id;       // Arbitrary number for ACK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  uint8_t mode;     // Object state information&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;};  // 16 bytes total&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The fields are largely self-explanatory.  You&#039;ll notice that I used an 8-bit number for speed, so the max speed it will report is 255 MPH.  Also, the 32-bit ctime field means it&#039;s vulnerable to the Year 2038 Problem.&lt;br /&gt;
&lt;br /&gt;
The field worth explanation is &amp;quot;mode&amp;quot;, which is set as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Value |   Meaning&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;255  |  Startup position.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;254  |  Live. Transmitted and ACKed in realtime&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1-n  |  Stored position&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first few position observations are always flagged as mode 255, regardless of whether they&#039;re able to be transmitted live or not.  (This way you know where the device started.)&lt;br /&gt;
&lt;br /&gt;
The stored position value is simply the number of 10-second intervals since last transmission modulo the MAX_INTERVAL setting.  This is how the unit &amp;quot;downsamples&amp;quot; the stored waypoint resolution if the buffer fills up.&lt;br /&gt;
&lt;br /&gt;
So... how well does it work?&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a plot on OpenStreetMaps of me driving to work one morning.  The blue markers are live (mode 254) and the red markers are stored.&lt;br /&gt;
[[File:OpenStreetMap.png|center|frameless|480x480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Of note are the blue markers along the freeway.  I&#039;ve regularly observed this device successfully logging the telemetry data at speeds upward of 60 MPH!&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Technical Details ===&lt;br /&gt;
&lt;br /&gt;
==== Hardware: ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;Digistump Oak&amp;lt;/s&amp;gt; Generic ESP-8266 dev board&lt;br /&gt;
* NMEA serial GPS module (e.g. uBlox or MTK)&lt;br /&gt;
&lt;br /&gt;
==== Software: ====&lt;br /&gt;
The software for the Digistump Oak, as well as a PoC DNS server (in python) to log the output, is available here:  &lt;br /&gt;
&lt;br /&gt;
https://github.com/phreakmonkey/towl&lt;br /&gt;
&lt;br /&gt;
Check the README notes under both subdirectories for build dependencies / config notes.&lt;br /&gt;
&lt;br /&gt;
==== Setup: ====&lt;br /&gt;
You&#039;ll need to host a custom nameserver on the Internet to receive the DNS queries.  You&#039;ll also need to control a domain so that you can designate your DNS query receiver as a subdomain. &lt;br /&gt;
&lt;br /&gt;
E.g. if you own the domain &amp;quot;MyDomain.com&amp;quot;, you could designate a server to receive the TOWL queries by creating a NS record for &amp;lt;code&amp;gt;TOWL.MyDomain.com&amp;lt;/code&amp;gt;, pointing at the server you intend to run the catcher on. If said server is at IP address 1.2.3.4, then that record looks something akin to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TOWL IN NS 1.2.3.4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the PoC code on the designated server. Be sure to configure both the TOWL devices and the server code for the &amp;quot;TOWL.MyDomain.com&amp;quot; domain name. (See README under each directory for instructions.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:OpenStreetMap.png&amp;diff=44</id>
		<title>File:OpenStreetMap.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:OpenStreetMap.png&amp;diff=44"/>
		<updated>2025-01-24T17:50:51Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenStreetMap Image showing TOWL markers&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=ESP8266&amp;diff=43</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=ESP8266&amp;diff=43"/>
		<updated>2025-01-24T17:27:21Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
The venerable Esprissif chip with wifi, and the foundation for &#039;&#039;&#039;&#039;&#039;so much Internet of Things shit&#039;&#039;&#039;&#039;&#039; &#039;&#039;in the world.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP-8266 is readily available in a dozen variants.  These are my notes for the ones I most often use:&lt;br /&gt;
[[File:Wemos D1 Mini Pinout.png|thumb|Wemos D1 Mini pinout ]]&lt;br /&gt;
[[File:NodeMCU v3 Pinout.png|thumb|NodeMCU v3 board and pinout]]&lt;br /&gt;
&lt;br /&gt;
==== General ESP8266 notes ====&lt;br /&gt;
The ESP-8266 (and 8285 variant) is a 3v3 microcontroller.  The GPIO pins are 5V tolerant for binary inputs, but it&#039;s probably not a good idea to go throwing 5v data lines around with it.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you&#039;re not using a DEV (Wemos / NodeMCU / etc) board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pull RST (reset) HIGH&#039;&#039;&#039; to keep it from floating.  (GND it to hw reboot)&lt;br /&gt;
* &#039;&#039;&#039;Pull EN (enable) HIGH&#039;&#039;&#039; to make device run.&lt;br /&gt;
&lt;br /&gt;
===== GPIO dragons =====&lt;br /&gt;
At first blush it looks like the ESP-8266 has lots of GPIOs, but in reality only about half a dozen are universally usable.  Common stumbling blocks / warnings:&lt;br /&gt;
&lt;br /&gt;
* The pin numbers on Wemos / NodeMCU / &amp;amp;etc &amp;quot;dev boards&amp;quot; don&#039;t match the ESP-8266 datasheet GPIO numbers.  Refer to the pinout diagrams to see the actual mappings.&lt;br /&gt;
* &#039;&#039;&#039;GPIO1&#039;&#039;&#039;, &#039;&#039;&#039;GPIO2&#039;&#039;&#039;, &#039;&#039;&#039;GPIO3&#039;&#039;&#039;, &#039;&#039;&#039;GPIO16&#039;&#039;&#039; all strobe HIGH at boot.   If you put a transistor or relay on them, be prepared for it to intermittently strobe high uncommanded every time the uC reboots. &lt;br /&gt;
* &#039;&#039;&#039;GPIO0&#039;&#039;&#039;, &#039;&#039;&#039;GPIO2&#039;&#039;&#039; are pulled-high, and &#039;&#039;&#039;device will not boot if they&#039;re pulled low.&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;GPIO1&#039;&#039;&#039; (TX) will cause device not to boot if &#039;&#039;&#039;pulled low&#039;&#039;&#039;. &lt;br /&gt;
* &#039;&#039;&#039;GPIO15&#039;&#039;&#039; is pulled low and &#039;&#039;&#039;device will not boot if pulled high&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;The raw A0 analog input pin is 0-1VDC.&#039;&#039;&#039;  The &amp;quot;dev boards&amp;quot; (NodeMCU, Wemos D1 &amp;amp;etc) all put a 3.3:1 voltage divider network in front of it.  So be aware of the specific implementation you&#039;re using&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Flashing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The default way to flash the program space in an ESP-8266 is to &#039;&#039;&#039;tie GPIO0 to GND during boot&#039;&#039;,&#039;&#039;&#039;&#039;&#039; this puts the device into firmware update mode.&lt;br /&gt;
&lt;br /&gt;
Modern dev boards can be reset and flashed via the USB port using the &#039;&#039;&#039;[https://github.com/espressif/esptool esptool.py]&#039;&#039;&#039; (which is also utilized by PlatformIO)&lt;br /&gt;
&lt;br /&gt;
Momentarily grounding RST will reset the device.  Tie RST high (if not already) the rest of the time to prevent it from floating.&lt;br /&gt;
&lt;br /&gt;
[[File:ESP-12F Module.png|thumb|ESP-12F Module and pinout]]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=42</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=42"/>
		<updated>2025-01-24T16:10:11Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
* Youtube: https://www.youtube.com/@phreakmonkey/videos &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On Content:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Have you noticed that there are topics here that aren&#039;t links?  Bear with me, I&#039;m just starting to fill this out, but I will randomly and sporadically add topics and pages.  A note on content:  &#039;&#039;Mostly, this is a repository to hold links, discoveries, and cheatsheets.&#039;&#039;  There&#039;s a balance between providing valuable information and &#039;&#039;needlessly repeating existing / available documentation&#039;&#039;, and for the most part I&#039;m going to err on the part of &#039;&#039;not repeating that which is widely available and/or obvious&#039;&#039;.   &lt;br /&gt;
&lt;br /&gt;
Some notable exceptions to this will be where I add things that I get frustrated searching for often, like &#039;&#039;pinout diagrams of common microcontrolers&#039;&#039; and &#039;&#039;tidbits of information that tend to be mostly available on ephemeral forums / blogs&#039;&#039;.  So, what you won&#039;t find here is a repeat of, say, algorithms that are in the famous &#039;&#039;CLRS Introduction to Algorithms Book&#039;&#039;, but you are likely to find &#039;&#039;tips for dealing with the eccentricities of a particular implementation of something in my environment&#039;&#039;.  Vague and subjective, I know, but hey - the world is both analog and chaotic.  :-P   &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* I&#039;m a licensed pilot and an aircraft owner.  [[Aviation|My Aviation page.]]&lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
* CAD / Maker / 3D Printing&lt;br /&gt;
** Printrbot 3D Printer&lt;br /&gt;
** OpenSCAD &amp;amp; designs&lt;br /&gt;
* Networking&lt;br /&gt;
** Adventures with IPv6&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=ESP8266&amp;diff=41</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=ESP8266&amp;diff=41"/>
		<updated>2025-01-24T15:59:08Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
The venerable Esprissif chip with wifi, and the foundation for &#039;&#039;&#039;&#039;&#039;so much Internet of Things shit&#039;&#039;&#039;&#039;&#039; &#039;&#039;in the world.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP-8266 is readily available in a dozen variants.  These are my notes for the ones I most often use:&lt;br /&gt;
[[File:Wemos D1 Mini Pinout.png|thumb|Wemos D1 Mini pinout ]]&lt;br /&gt;
[[File:NodeMCU v3 Pinout.png|thumb|NodeMCU v3 board and pinout]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ESP-12F Module.png|thumb|ESP-12F Module and pinout]]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=ESP8266&amp;diff=40</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=ESP8266&amp;diff=40"/>
		<updated>2025-01-24T15:57:24Z</updated>

		<summary type="html">&lt;p&gt;Kc: Added common ESP8266 boards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
The venerable Esprissif chip with wifi, and the foundation for &#039;&#039;&#039;&#039;&#039;so much Internet of Things shit&#039;&#039;&#039;&#039;&#039; &#039;&#039;in the world.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ESP-8266 is readily available in a dozen variants.  These are my notes for the ones I most often use:&lt;br /&gt;
[[File:Wemos D1 Mini Pinout.png|thumb|Wemos D1 Mini pinout]]&lt;br /&gt;
[[File:NodeMCU v3 Pinout.png|thumb|NodeMCU v3 board and pinout]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ESP-12F Module.png|thumb|ESP-12F Module and pinout]]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:NodeMCU_v3_Pinout.png&amp;diff=39</id>
		<title>File:NodeMCU v3 Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:NodeMCU_v3_Pinout.png&amp;diff=39"/>
		<updated>2025-01-24T15:56:58Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NodeMCU v3 board and pinout&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:Wemos_D1_Mini_Pinout.png&amp;diff=38</id>
		<title>File:Wemos D1 Mini Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:Wemos_D1_Mini_Pinout.png&amp;diff=38"/>
		<updated>2025-01-24T15:55:43Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pinout of Wemos D1 Mini&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=File:ESP-12F_Module.png&amp;diff=37</id>
		<title>File:ESP-12F Module.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=File:ESP-12F_Module.png&amp;diff=37"/>
		<updated>2025-01-24T15:52:47Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ESP8266 12F module and pinout diagram&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=36</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=36"/>
		<updated>2024-11-07T16:28:19Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
* Youtube: https://www.youtube.com/@phreakmonkey/videos &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.] &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* I&#039;m a licensed pilot and an aircraft owner.  [[Aviation|My Aviation page.]]&lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=35</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=35"/>
		<updated>2024-11-07T16:11:19Z</updated>

		<summary type="html">&lt;p&gt;Kc: updating web presence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:kc+wiki@solace.net kc@solace.net]&lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* &amp;lt;s&amp;gt;Twitter&amp;lt;/s&amp;gt;: &amp;lt;s&amp;gt;https://twitter.com/phreakmonkey&amp;lt;/s&amp;gt;&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.] &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* I&#039;m a licensed pilot and an aircraft owner.  [[Aviation|My Aviation page.]]&lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
	<entry>
		<id>https://wiki.solace.net/index.php?title=Main_Page&amp;diff=34</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.solace.net/index.php?title=Main_Page&amp;diff=34"/>
		<updated>2023-11-08T20:13:36Z</updated>

		<summary type="html">&lt;p&gt;Kc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== &amp;lt;strong&amp;gt;Welcome to Solace.net&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
Greetings, traveler!  This is the wiki of K.C. Budd.  This will be a place to catalog projects, hobbies, technical tips and reminders, discoveries, and general information that doesn&#039;t have the ephemeral or temporal limitations of social media.    &lt;br /&gt;
&lt;br /&gt;
For starters, here&#039;s a rundown of my personal online presence: &lt;br /&gt;
&lt;br /&gt;
* Email: [mailto:phreakmonkey@gmail.com phreakmonkey@gmail.com] &lt;br /&gt;
* Blog: https://phreakmonkey.com/&lt;br /&gt;
* GitHub: https://github.com/phreakmonkey&lt;br /&gt;
* Twitter: https://twitter.com/phreakmonkey&lt;br /&gt;
* Mastodon: https://infosec.exchange/@phreakmonkey &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in my professional life, here&#039;s [https://linkedin.com/in/kenneth-budd-4010671/ my LinkedIn] and [https://wiki.solace.net/images/3/30/Kenneth_C._Budd_Resume_-_2023.pdf my current resume.] &lt;br /&gt;
&lt;br /&gt;
== Hobbies and Projects ==&lt;br /&gt;
&lt;br /&gt;
* I&#039;m a licensed pilot and an aircraft owner.  [[Aviation|My Aviation page.]]&lt;br /&gt;
* Hardware Hacking Topics:&lt;br /&gt;
** [[Microcontrollers|Microcontrollers / Arduino]]&lt;br /&gt;
** Drones&lt;br /&gt;
** SDR / RF / Radio&lt;br /&gt;
&lt;br /&gt;
== Photography Showcase ==&lt;br /&gt;
&lt;br /&gt;
* For a while I was into [https://www.flickr.com/photos/phreakmonkey/albums Urban Exploration and DSLR photography]&lt;/div&gt;</summary>
		<author><name>Kc</name></author>
	</entry>
</feed>