<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>John A Cairns</title><link href="https://2ad.com/" rel="alternate"/><link href="https://2ad.com/feeds/all.atom.xml" rel="self"/><id>https://2ad.com/</id><updated>2025-12-27T00:00:00-06:00</updated><subtitle>John A Cairns</subtitle><entry><title>Advent of Code 2025</title><link href="https://2ad.com/advent-of-code-2025.html" rel="alternate"/><published>2025-12-27T00:00:00-06:00</published><updated>2025-12-27T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-12-27:/advent-of-code-2025.html</id><summary type="html">&lt;p&gt;I am not committing to the &lt;a href="https://adventofcode.com/2025"&gt;Advent of Code 2025&lt;/a&gt; this year.  I'm working on too many side projects &lt;a href="https://github.com/jac18281828/checksmix"&gt;checksmix&lt;/a&gt;, &lt;a href="https://github.com/jac18281828/snipren"&gt;snipren&lt;/a&gt;, &lt;a href="https://github.com/jac18281828/emomtimer"&gt;emomtimer&lt;/a&gt;.  In fact I don't even have time to write this blog.   On the other hand, I used some holiday downtime to work through Day 1 Part 1 in …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I am not committing to the &lt;a href="https://adventofcode.com/2025"&gt;Advent of Code 2025&lt;/a&gt; this year.  I'm working on too many side projects &lt;a href="https://github.com/jac18281828/checksmix"&gt;checksmix&lt;/a&gt;, &lt;a href="https://github.com/jac18281828/snipren"&gt;snipren&lt;/a&gt;, &lt;a href="https://github.com/jac18281828/emomtimer"&gt;emomtimer&lt;/a&gt;.  In fact I don't even have time to write this blog.   On the other hand, I used some holiday downtime to work through Day 1 Part 1 in &lt;code&gt;MMIX&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Day 1 is about a safe dial with 100 increments.  The dial starts at 50, then processes a stream of rotations such as &lt;code&gt;L68&lt;/code&gt; or &lt;code&gt;R48&lt;/code&gt;. Each instruction moves the dial left or right by the given amount, wrapping modulo 100.  The idea is that directional, left or right, rotations are applied to the dial pointer using mod math.  The trick is that, while mod addition is no big deal, it will be obviously positive, modullo subtraction is a bit more complicated because the pointer could take a negative value.  In that case the pointer needs to be reset from the back (end - pointer) to determine the pointed value.&lt;/p&gt;
&lt;p&gt;Consider the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nf"&gt;RemEuclid&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;DIV&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;a&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;MUL&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;q&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;SUB&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;q&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;negative&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;BNN&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;RemDone&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;we&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="no"&gt;re&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;done&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;
&lt;span class="nf"&gt;RemDone&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that after the branch, &lt;code&gt;BNN&lt;/code&gt;, instruction a correction is applied to add the remainder to the max number of increments, in this case 100 to determine the correct offset, aka, Euclidean remainder.&lt;/p&gt;
&lt;p&gt;Here is my implementation of safe dial pointer in MMIX - I got my ⭐️.&lt;/p&gt;
&lt;h2&gt;Approach&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Parse the input as a null-terminated string containing &lt;code&gt;L&lt;/code&gt;/&lt;code&gt;R&lt;/code&gt; tokens separated by newlines.&lt;/li&gt;
&lt;li&gt;Convert each token into a signed direction (&lt;code&gt;-1&lt;/code&gt; for &lt;code&gt;L&lt;/code&gt;, &lt;code&gt;+1&lt;/code&gt; for &lt;code&gt;R&lt;/code&gt;) and a magnitude.&lt;/li&gt;
&lt;li&gt;Update the dial position by adding the signed delta and applying Euclidean remainder with divisor 100 to keep the value in &lt;code&gt;[0, 99]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Record a hit whenever the dial value becomes zero.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;InputPtr&lt;/code&gt; is a global register used as a moving pointer into the input string. &lt;code&gt;ParseRotations&lt;/code&gt; reads one token and returns the direction in &lt;code&gt;$2&lt;/code&gt; and the magnitude in &lt;code&gt;$3&lt;/code&gt;. &lt;code&gt;HandleRotation&lt;/code&gt; computes the signed move, updates the dial in &lt;code&gt;$10&lt;/code&gt;, wraps it with &lt;code&gt;RemEuclid&lt;/code&gt;, and increments the hit counter &lt;code&gt;$12&lt;/code&gt; when the dial reaches zero. The loop continues until a null terminator is encountered.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;RemEuclid&lt;/code&gt; is a small helper that mirrors Rust's &lt;code&gt;rem_euclid&lt;/code&gt; to avoid negative results after subtraction. The helper keeps the remainder non-negative by adding the divisor when needed; it uses &lt;code&gt;$2&lt;/code&gt; and &lt;code&gt;$3&lt;/code&gt; as scratch registers.&lt;/p&gt;
&lt;p&gt;Complexity is linear in the number of tokens. The program keeps all state in registers and a single input buffer in the data segment; no heap or I/O is involved beyond the initial static input.&lt;/p&gt;
&lt;p&gt;Input and code are embedded together below. The input matches the sample I used to validate the counting logic: the dial hits zero whenever a rotation lands exactly on that position after wrapping.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nf"&gt;DIAL_INCREMENTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LOC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;#100&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;point&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;GREG&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;
&lt;span class="nf"&gt;InputPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;GREG&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;register&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;pointer&lt;/span&gt;

&lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;LDA&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;MyInput&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;initialize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;pointer&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;setting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;pointer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;starts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;operations&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;handled&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;hit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;how&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;many&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;times&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;got&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nf"&gt;TokenLoop&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LDBI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;BEFORE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;parsing&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BZ&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Done&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;terminator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;done&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;PUSHJ&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;ParseRotations&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;PUSHJ&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;HandleRotation&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDUI&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;$11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;increment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;operations&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;processed&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;JMP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;TokenLoop&lt;/span&gt;


&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;HandleRotation&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;
&lt;span class="nf"&gt;HandleRotation&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;operation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;magnitude&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;MUL&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;temp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;operation&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;move&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;vector&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;temp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;temp.mod_euclid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DIAL_INCREMENTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;DIAL_INCREMENTS&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;PUSHJ&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;$4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;RemEuclid&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;temp&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SET&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BNZ&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;SkipCount&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;zero&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;increment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;hits&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDI&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nf"&gt;SkipCount&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;


&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;RemEuclid:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;rem_euclid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Input:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;dividend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;divisor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;must&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Output:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;remainder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Uses:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="nf"&gt;RemEuclid&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;DIV&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;a&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;MUL&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;q&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;SUB&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;q&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;negative&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;BNN&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;RemDone&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;we&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="no"&gt;re&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;done&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nf"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;m&lt;/span&gt;
&lt;span class="nf"&gt;RemDone&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ParseRotations&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Parse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;ONE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;rotation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Input:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;InputPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;pointer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;position&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;global&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Returns:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;updated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;pointer&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;Uses:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="no"&gt;$6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;digit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;scratch&lt;/span&gt;
&lt;span class="nf"&gt;ParseRotations&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LDBI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;load&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;first&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;char&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BZ&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;ParseEnd&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;terminator&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;CMPI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="no"&gt;L&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="no"&gt;L&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BZ&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;ParseL&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;CMPI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BZ&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;ParseR&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDUI&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;unknown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;char&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;early&lt;/span&gt;

&lt;span class="nf"&gt;ParseL&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;left&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;JMP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;ParseNumber&lt;/span&gt;
&lt;span class="nf"&gt;ParseR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;right&lt;/span&gt;

&lt;span class="nf"&gt;ParseNumber&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDUI&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;L&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;char&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;accumulator&lt;/span&gt;
&lt;span class="nf"&gt;DigitLoop&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LDBI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;load&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;next&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;char&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SUBI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;convert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;digit&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BN&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;EndNumber&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;CMPI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BNN&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;EndNumber&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;MULI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;digit&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDUI&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;JMP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;DigitLoop&lt;/span&gt;

&lt;span class="nf"&gt;EndNumber&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDUI&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;InputPtr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;newline&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="no"&gt;delimiter&lt;/span&gt;

&lt;span class="nf"&gt;ParseEnd&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nf"&gt;Done&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;TRAP&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Halt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LOC&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;Data_Segment&lt;/span&gt;

&lt;span class="nf"&gt;MyInput&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;BYTE&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L68&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L30&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;R48&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nf"&gt;BYTE&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L5&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;R60&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nf"&gt;BYTE&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L55&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L1&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L99&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nf"&gt;BYTE&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;R14&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;L82&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The this example input the program processes 10 operations, finishes at dial position 32, and records 3 zero hits in &lt;code&gt;$12&lt;/code&gt;.&lt;/p&gt;</content><category term="update"/><category term="rustlang"/><category term="mmix"/><category term="emulator"/><category term="assembler"/><category term="adventofcode"/></entry><entry><title>Checksmix - Blazing Fast MMIX</title><link href="https://2ad.com/checksmix-fast-mmix-emulator.html" rel="alternate"/><published>2025-12-26T00:00:00-06:00</published><updated>2025-12-26T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-12-26:/checksmix-fast-mmix-emulator.html</id><summary type="html">&lt;h1&gt;Blazing Fast MMIX Emulator&lt;/h1&gt;
&lt;p&gt;I like learning computer architectures by running code. MIX is good fun, but it’s dated and awkward for writing anything beyond small examples. MMIX, on the other hand, is a complete computer architecture—much closer to machines that were genuinely pleasant to program, like MIPS …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Blazing Fast MMIX Emulator&lt;/h1&gt;
&lt;p&gt;I like learning computer architectures by running code. MIX is good fun, but it’s dated and awkward for writing anything beyond small examples. MMIX, on the other hand, is a complete computer architecture—much closer to machines that were genuinely pleasant to program, like MIPS or DEC Alpha.&lt;/p&gt;
&lt;p&gt;For a while I was deeply obsessed with Alpha. Someone even gave me a &lt;code&gt;Decstation 5000&lt;/code&gt; that was headed to the dumpster to mess around with. I wanted to convert it from VMS to Unix but the tapes were prohibitively expensive.  Digital didn't seem to understand the idea of scavenged hardware and wouldn't take pity on a poor college kid.  I eventually switched to something designed in California—which, to be fair, is also expensive, but comes with better price for performance characteristics.   But that doesn't mean I still can't write code in a model RISC computer.&lt;/p&gt;
&lt;p&gt;Out of that latent interest came &lt;strong&gt;checksmix&lt;/strong&gt;: a Rust-based MMIX assembler and emulator that lets you assemble or execute &lt;code&gt;.mms&lt;/code&gt; source modules (or existing &lt;code&gt;.mmo&lt;/code&gt; objects). Legacy MIX is still partially supported, though it hasn’t been the focus in my last round of changes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Removing Friction from MMIX Experiments&lt;/h2&gt;
&lt;p&gt;The goal was simple: make MMIX feel accessible.&lt;/p&gt;
&lt;p&gt;That meant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An assembler (&lt;code&gt;mmixasm&lt;/code&gt;) that emits &lt;code&gt;.mmo&lt;/code&gt; in a simple and obvious way.&lt;/li&gt;
&lt;li&gt;An emulator (&lt;code&gt;checksmix&lt;/code&gt;) that can take raw &lt;code&gt;.mms&lt;/code&gt; and just run it via the assembler in memory.&lt;/li&gt;
&lt;li&gt;Clear register and memory dumps before and after execution so you can see exactly what changed.&lt;/li&gt;
&lt;li&gt;Enough TRAP support (notably &lt;code&gt;Halt&lt;/code&gt; and &lt;code&gt;Fputs&lt;/code&gt;) to print output and exit while experimenting with control flow and data structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Assemble or Run Directly&lt;/h2&gt;
&lt;p&gt;Run MMIX assembly without producing an object file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;checksmix&lt;span class="w"&gt; &lt;/span&gt;examples/hello_world.mms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you prefer to keep artifacts around, assemble first and then emulate:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mmixasm&lt;span class="w"&gt; &lt;/span&gt;examples/linked_list.mms&lt;span class="w"&gt; &lt;/span&gt;list.mmo
checksmix&lt;span class="w"&gt; &lt;/span&gt;list.mmo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For debugging, add:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;RUST_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;checksmix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This enables instruction decoding traces and TRAP handling logs.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;A Minimal Program (Hello, MMIX)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LOC&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;Data_Segment&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;GREG&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;
&lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;BYTE&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="no"&gt;Hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;world&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LOC&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;#100&lt;/span&gt;
&lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;LDA&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Text&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;TRAP&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Fputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;StdOut&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;TRAP&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Halt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Run it with &lt;code&gt;checksmix&lt;/code&gt; and you’ll see register state before and after execution, along with the printed string via &lt;code&gt;TRAP 0,Fputs,StdOut&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Under the Hood&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;256 general-purpose registers, 32 special registers, sparse 64-bit address space.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.mms&lt;/code&gt; parsing, encoding, and in-memory loading; &lt;code&gt;.mmo&lt;/code&gt; decoding with entry-point PC setup.&lt;/li&gt;
&lt;li&gt;TRAP handling for &lt;code&gt;Halt&lt;/code&gt; and &lt;code&gt;Fputs&lt;/code&gt;, so programs can print without extra tooling.&lt;/li&gt;
&lt;li&gt;Legacy MIX &lt;code&gt;.mix&lt;/code&gt; / &lt;code&gt;.mixal&lt;/code&gt; parsing if you want to compare architectures side by side.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Technical Discussion: From Grammar to Run Loop&lt;/h2&gt;
&lt;p&gt;The grammar in &lt;code&gt;mmixal.pest&lt;/code&gt; is intentionally literal. Tokens, expressions, directives, and opcodes map closely to Knuth’s notation—there is no “friendly” abstraction layer hiding the architecture. Pest gives byte spans, but we store source line and column on every error to keep diagnostics in the familiar &lt;code&gt;file:line:col: message&lt;/code&gt; format. The tradeoff is a slightly heavier parse path, but much better ergonomics while iterating.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mmixal.rs&lt;/code&gt; implements a two-pass assembler over the pest pairs. Labels are resolved, expressions folded, and instructions lowered into &lt;code&gt;MMixInstruction&lt;/code&gt; enums. Encoding happens exactly once. In &lt;code&gt;checksmix&lt;/code&gt;, the encoded bytes are dropped straight into memory; in &lt;code&gt;mmixasm&lt;/code&gt;, the same stream is wrapped with the MMO postamble and entry PC. Keeping this representation unified avoids two subtly different assemblers drifting apart over time.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MmoDecoder&lt;/code&gt; performs the inverse operation: it reads MMO sections and sparsely maps them into memory, returning the entry PC. Sparse loading via offsets keeps relocation handling honest without materializing gigabytes of zeroes. Malformed section headers are rejected early so an MMO can’t scribble over arbitrary addresses.&lt;/p&gt;
&lt;p&gt;The emulator core in &lt;code&gt;mmix.rs&lt;/code&gt; is table-driven. It fetches 4-byte words, splits opcode and operands, and dispatches through small macros covering arithmetic, logic, branches, and floating-point instructions. General-purpose and special registers live in fixed arrays for speed; memory is a hash map, so uninitialized addresses read as zero and we avoid allocating a 2⁶⁴-byte address space. The cost is extra lookups, but the REPL-style loop stays responsive without complex memory machinery.&lt;/p&gt;
&lt;p&gt;TRAP support is intentionally minimal. &lt;code&gt;TRAP 0,Halt,0&lt;/code&gt; exits; &lt;code&gt;TRAP 0,Fputs,StdOut&lt;/code&gt; walks a null-terminated string from &lt;code&gt;$0&lt;/code&gt; and writes it to stdout or stderr. Unknown traps simply advance the PC and continue. For exploratory work and porting snippets from richer simulators, this is usually more helpful than halting or panicking.&lt;/p&gt;
&lt;p&gt;Debugging relies on logs rather than a bespoke UI. With &lt;code&gt;RUST_LOG=checksmix=debug&lt;/code&gt;, you get decode and execute traces, PC movement, and TRAP calls. The binaries also dump registers before and after execution so you can diff machine state across runs. It’s a pragmatic compromise: enough visibility to reason about correctness without freezing the design around a particular debugger interface.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What You Get&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast feedback&lt;/strong&gt;: Edit → run → inspect registers and memory in seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confidence&lt;/strong&gt;: Deterministic load and execution with debug logging when needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower friction&lt;/strong&gt;: More time spent thinking about your code&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Project Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: https://github.com/jac18281828/checksmix&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crate&lt;/strong&gt;: https://crates.io/crates/checksmix&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run the machine, watch the registers move, and make MMIX feel connected.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Simple Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Fibonacci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Sequence&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;LOC&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;#100&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;point&lt;/span&gt;
&lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;compute&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;PUSHJ&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Fibonacci&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;call&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Fibonacci&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;JMP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;Done&lt;/span&gt;

&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Registers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;used&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;$0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;result&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;$2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;n-2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;$3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;n-1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;$4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;counter&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;$5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;temp&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;----------------------------------------------------&lt;/span&gt;

&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;
&lt;span class="nf"&gt;Fibonacci&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;CMPI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BN&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;TwoOrLess&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SETI&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nf"&gt;AddLoop&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;CMP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;BP&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;FibEnd&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDU&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SET&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SET&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$5&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;ADDUI&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;$4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;JMP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;AddLoop&lt;/span&gt;
&lt;span class="nf"&gt;FibEnd&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SET&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$3&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;caller&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;rJ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;TwoOrLess&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;SET&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;$1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;POP&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;caller&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;rJ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;Done&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;TRAP&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;Halt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="tech"/><category term="rustlang"/><category term="mmix"/><category term="emulator"/><category term="assembler"/></entry><entry><title>Rename the Way You Mean To</title><link href="https://2ad.com/snipren-deterministic-rename-utility.html" rel="alternate"/><published>2025-12-22T00:00:00-06:00</published><updated>2025-12-22T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-12-22:/snipren-deterministic-rename-utility.html</id><summary type="html">&lt;p&gt;I rename a lot of files. So do you.&lt;/p&gt;
&lt;p&gt;I respect the Unix way — &lt;code&gt;mv file1 file2&lt;/code&gt; — but in practice, &lt;code&gt;file1&lt;/code&gt; and &lt;code&gt;file2&lt;/code&gt; are usually the same name failing by one to three characters. Re-typing 97% of a filename feels ceremonial rather than intentional, especially when what I want is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I rename a lot of files. So do you.&lt;/p&gt;
&lt;p&gt;I respect the Unix way — &lt;code&gt;mv file1 file2&lt;/code&gt; — but in practice, &lt;code&gt;file1&lt;/code&gt; and &lt;code&gt;file2&lt;/code&gt; are usually the same name failing by one to three characters. Re-typing 97% of a filename feels ceremonial rather than intentional, especially when what I want is something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mv&lt;span class="w"&gt; &lt;/span&gt;server_log.log&lt;span class="w"&gt; &lt;/span&gt;server_log.bak
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That friction is persistent throughout your work day.&lt;/p&gt;
&lt;p&gt;I created a small rust utility to make renaming &lt;em&gt;mean what it looks like it means&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Idea: Renaming as Expansion&lt;/h2&gt;
&lt;p&gt;Instead of explicitly naming the source file, the tool infers it from the destination name using one constrained rule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The destination must be a strict expansion of the source.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, the new filename must contain the old filename intact, with extra characters added somewhere in the middle or at the edges — but never altered.&lt;/p&gt;
&lt;p&gt;This gives us two important properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intentionality&lt;/strong&gt;: you only specify what changed  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Determinism&lt;/strong&gt;: there is either exactly one valid source, or the command fails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So instead of writing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mv&lt;span class="w"&gt; &lt;/span&gt;server_log.log&lt;span class="w"&gt; &lt;/span&gt;server_log.bak
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You write:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rn&lt;span class="w"&gt; &lt;/span&gt;server_log.bak
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And the tool figures out the rest — or refuses to guess.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Core Algorithm: A Two-Pointer “Vice”&lt;/h2&gt;
&lt;p&gt;At the heart of the tool is a simple string-matching rule implemented as a two-pointer squeeze from both ends. Think of it as a vice that compresses inward until it proves the old name is fully contained in the new one.&lt;/p&gt;
&lt;p&gt;Here is the core function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;matches_expansion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;&lt;/span&gt;&lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;&lt;/span&gt;&lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// consume common prefix&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// consume common suffix without crossing prefix&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;j2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// valid iff the old name is fully consumed&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What matters is the invariant at the end:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the “vice” can fully consume the old name → it’s a valid expansion  &lt;/li&gt;
&lt;li&gt;If it can’t → it’s not a match  &lt;/li&gt;
&lt;li&gt;If &lt;em&gt;multiple&lt;/em&gt; files match → the tool errors and exits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No ambiguity.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;For a rename tool, correctness isn’t optional — it’s the entire product.&lt;/p&gt;
&lt;p&gt;This approach guarantees:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No silent ambiguity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No accidental mass renames&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No guessing when intent is unclear&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the rename is obvious, it works.&lt;br&gt;
If it isn’t, it fails.&lt;/p&gt;
&lt;p&gt;That’s the behavior I want from my work environment.&lt;/p&gt;
&lt;p&gt;In a small way, this fixes a long-standing Unix papercut: renaming files should express &lt;em&gt;change&lt;/em&gt;, not repetition.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Project Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href="https://github.com/jac18281828/snipren"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crate&lt;/strong&gt;: &lt;a href="https://crates.io/crates/snipren"&gt;crates.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rename the way you mean to.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rn&lt;span class="w"&gt; &lt;/span&gt;server_log.bak
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;rustlang #cli #algorithms #dx&lt;/h1&gt;</content><category term="tech"/><category term="rustlang"/><category term="cli"/><category term="algorithms"/><category term="dx"/><category term="unix"/></entry><entry><title>mastering mark in emacs</title><link href="https://2ad.com/emacs-mark-youtube-short.html" rel="alternate"/><published>2025-11-22T00:00:00-06:00</published><updated>2025-11-22T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-11-22:/emacs-mark-youtube-short.html</id><content type="html">&lt;p&gt;&lt;code&gt;C-x C-x&lt;/code&gt; is teleport for your mark.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;C-x h&lt;/code&gt; is “select literally everything right now”!&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/T_-Qg7jDe6s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="tech"/><category term="programming"/><category term="emacs"/><category term="productivity"/></entry><entry><title>Announcement rust:v1.91.1</title><link href="https://2ad.com/rust-v1.91.1.html" rel="alternate"/><published>2025-11-17T00:00:00-06:00</published><updated>2025-11-17T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-11-17:/rust-v1.91.1.html</id><summary type="html">&lt;h1&gt;Rust Dev v1.91.1&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.91.1. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Rust Dev v1.91.1&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.91.1. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/rust/pkgs/container/rust"&gt;Rust Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>c-style for loop in bash</title><link href="https://2ad.com/for-loop-youtube-short.html" rel="alternate"/><published>2025-11-14T00:00:00-06:00</published><updated>2025-11-14T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-11-14:/for-loop-youtube-short.html</id><content type="html">&lt;p&gt;How did i not know that you can make a c-style for loop in &lt;code&gt;bash&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&amp;lt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i++&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/HxN0Zlhvb5E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="tech"/><category term="programming"/><category term="rustlang"/><category term="c"/></entry><entry><title>Every Light Meter Tutorial on YouTube Is Wrong</title><link href="https://2ad.com/light-meter-tutorial-mistakes.html" rel="alternate"/><published>2025-11-14T00:00:00-06:00</published><updated>2025-11-14T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-11-14:/light-meter-tutorial-mistakes.html</id><content type="html">&lt;p&gt;How to use a lightmeter with your digital camera in 2025!&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/6Q6nfe3Z19E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="tech"/><category term="photography"/><category term="videography"/><category term="lighting"/></entry><entry><title>Parsm - an Everything Parser</title><link href="https://2ad.com/parsm-an-everything-parser.html" rel="alternate"/><published>2025-06-29T00:00:00-05:00</published><updated>2025-06-29T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-06-29:/parsm-an-everything-parser.html</id><summary type="html">&lt;h2&gt;Introducing Parsm: A Universal Structured Text Parser&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/jac18281828/parsm/main/eatcookie.jpg" alt="Eat More Cookie" width="25%" /&gt;&lt;/p&gt;
&lt;p&gt;When scientists and engineers created the UNIX system, they built utilities that each performed a specific task exceptionally well. Commands such as &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, and &lt;code&gt;sed&lt;/code&gt; have become the atoms of text and data processing workflows. However, today's computing landscape is dominated by …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Introducing Parsm: A Universal Structured Text Parser&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/jac18281828/parsm/main/eatcookie.jpg" alt="Eat More Cookie" width="25%" /&gt;&lt;/p&gt;
&lt;p&gt;When scientists and engineers created the UNIX system, they built utilities that each performed a specific task exceptionally well. Commands such as &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, and &lt;code&gt;sed&lt;/code&gt; have become the atoms of text and data processing workflows. However, today's computing landscape is dominated by structured data formats like JSON, YAML, CSV, and TOML.  In that context, many of these powerful utilities are less important.&lt;/p&gt;
&lt;p&gt;Recognizing this, I've developed &lt;strong&gt;parsm&lt;/strong&gt;: a parser specifically designed for the structured-data-rich era we inhabit today.   Parsm is better at understanding structured text than &lt;strong&gt;grep&lt;/strong&gt; or &lt;strong&gt;sed&lt;/strong&gt; while providing a more straightforward domain specific language with field selection than &lt;strong&gt;awk&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;What is Parsm?&lt;/h3&gt;
&lt;p&gt;Parsm is an "everything parser," a robust command-line utility explicitly engineered to handle multiple structured text formats seamlessly. Unlike traditional tools (&lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;), which primarily handle line-based text, parsm inherently understands structured data—automatically parsing JSON, YAML, TOML, CSV, and logfmt formats.  Parsm can even parse words from sentences.&lt;/p&gt;
&lt;h3&gt;Why Parsm?&lt;/h3&gt;
&lt;p&gt;Parsm simplifies workflows dramatically by intelligently detecting input formats and providing intuitive filtering and templating functionalities.   Parsm also works great in traditional UNIX style pipelined data streams.&lt;/p&gt;
&lt;p&gt;For example, here's how easily you can use parsm:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parsing and filtering JSON data:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[{&amp;quot;name&amp;quot;: &amp;quot;Alice&amp;quot;, &amp;quot;age&amp;quot;: 30},{&amp;quot;name&amp;quot;: &amp;quot;Bob&amp;quot;}]&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;parsm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;
Alice
Bob
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Filtering CSV data:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Alice,30,Engineer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;parsm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;field_0 ^= &amp;quot;A&amp;quot; {$field_0 is an $field_2}&amp;#39;&lt;/span&gt;
Alice&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;an&lt;span class="w"&gt; &lt;/span&gt;Engineer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Extracting from logfmt:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;level=info msg=&amp;quot;Service started&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;parsm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;msg&amp;#39;&lt;/span&gt;
Service&lt;span class="w"&gt; &lt;/span&gt;started
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Key Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic format detection&lt;/strong&gt;: Recognizes data formats instantly, minimizing setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified syntax&lt;/strong&gt;: One intuitive syntax across all supported formats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Powerful templating and filtering&lt;/strong&gt;: Effortlessly extract, filter, transform, and format data.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;Install parsm easily using Cargo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cargo&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;parsm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Explore and contribute to the project:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jac18281828/parsm"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://crates.io/crates/parsm"&gt;Crates IO&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Closing Thoughts&lt;/h3&gt;
&lt;p&gt;Parsm isn't about reinventing Unix utilities—it's about evolving them. With a nod to structured data and its main workflow, field selection, Parsm provides powerful and efficient way to interact with modern data. It's the Unix way adapted for your needs today.&lt;/p&gt;</content><category term="tech"/><category term="unix"/><category term="sed"/><category term="awk"/><category term="grep"/><category term="rustlang"/></entry><entry><title>History: Jesuit</title><link href="https://2ad.com/history-jesuit.html" rel="alternate"/><published>2025-04-20T00:00:00-05:00</published><updated>2025-04-20T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-04-20:/history-jesuit.html</id><summary type="html">&lt;p&gt;1491-
The Society of Jesus, or Jesuits, was
 founded by a Spanish nobleman, Ignatius of Loyola,
 1491-
1556.
 Loyola was in many ways the antithesis of
 Martin Luther. Though he believed in Luther's fundamental
 interpretation of church theology, his means to attain salvation was
 born out of absolute adherence to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1491-
The Society of Jesus, or Jesuits, was
 founded by a Spanish nobleman, Ignatius of Loyola,
 1491-
1556.
 Loyola was in many ways the antithesis of
 Martin Luther. Though he believed in Luther's fundamental
 interpretation of church theology, his means to attain salvation was
 born out of absolute adherence to church doctrine. The Jesuits
 preferred a highly disciplined devotion to scripture rather than the
 relaxed 'acceptance' doctrine espoused by the Lutherans. The
 Jesuits believed in strict papal supremacy, see Act of Supremacy.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="movement"/></entry><entry><title>History: CounterReformation</title><link href="https://2ad.com/history-counterreformation.html" rel="alternate"/><published>2025-04-13T00:00:00-05:00</published><updated>2025-04-13T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-04-13:/history-counterreformation.html</id><summary type="html">&lt;p&gt;1555-
Though many reforms had occurred
 in the Catholic church there were those who tried to impose a
 structure based on past ideals. Pope Paul IV, 1555-
1559&lt;/p&gt;
&lt;p&gt;was considered to be a counter-reformation pope because of his
 traditional interpretations of religious doctrine. Paul IV created
 the Papal Index
 and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1555-
Though many reforms had occurred
 in the Catholic church there were those who tried to impose a
 structure based on past ideals. Pope Paul IV, 1555-
1559&lt;/p&gt;
&lt;p&gt;was considered to be a counter-reformation pope because of his
 traditional interpretations of religious doctrine. Paul IV created
 the Papal Index
 and also vastly increased the power of
 the Inquisition, a move which threatened even the most powerful
 dissenters with torture or death. Though, Christian unity was a
 goal for some, the counter-reformation and the Council of Trent
 served to permanently solidify the divisions that had formed in the
 church.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="movement"/></entry><entry><title>History: Papal Index</title><link href="https://2ad.com/history-papal-index.html" rel="alternate"/><published>2025-04-06T00:00:00-05:00</published><updated>2025-04-06T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-04-06:/history-papal-index.html</id><summary type="html">&lt;p&gt;Pope Paul IV, see Counter Reformation
, set
 about to revert some of the changes of the various religious
 reformations and in so doing created a Papal Index of Forbidden
 Books. This Index listed books that Catholics were forbidden from
 reading. These books included Protestant works as well as works
 considered …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Pope Paul IV, see Counter Reformation
, set
 about to revert some of the changes of the various religious
 reformations and in so doing created a Papal Index of Forbidden
 Books. This Index listed books that Catholics were forbidden from
 reading. These books included Protestant works as well as works
 considered to be "unwholesome."&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Act of Supremacy</title><link href="https://2ad.com/history-act-of-supremacy.html" rel="alternate"/><published>2025-03-30T00:00:00-05:00</published><updated>2025-03-30T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-03-30:/history-act-of-supremacy.html</id><content type="html">&lt;p&gt;The Jesuit
 movement borrowed
 from Lutheranism in spirit, but fundamentally turned Martin~Luther's
 conclusions upside down. The Jesuits declared strict allegiance to
 the Pope. The Jesuits' absolute obedience became an organized
 extension of the popes authority.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Predestination</title><link href="https://2ad.com/history-predestination.html" rel="alternate"/><published>2025-03-23T00:00:00-05:00</published><updated>2025-03-23T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-03-23:/history-predestination.html</id><content type="html">&lt;p&gt;Predestination is the idea that God has
 predetermined the destiny of all souls, whether they be saved or
 damned, since God is all knowing and can foresee the future. This
 idea is usually associated with John Calvin, 1509-
1564.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Anabaptists</title><link href="https://2ad.com/history-anabaptists.html" rel="alternate"/><published>2025-03-16T00:00:00-05:00</published><updated>2025-03-16T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-03-16:/history-anabaptists.html</id><summary type="html">&lt;p&gt;1525-
Following the path paved by the
 Protestant Reforms the Anabaptists pushed for further reformation of
 church doctrine. Anabaptists tended to be peasants and working
 poor. The Anabaptists believed in adult baptism, rather than
 infant baptism, taking the approach that all believers were baptized
 into the church of their own …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1525-
Following the path paved by the
 Protestant Reforms the Anabaptists pushed for further reformation of
 church doctrine. Anabaptists tended to be peasants and working
 poor. The Anabaptists believed in adult baptism, rather than
 infant baptism, taking the approach that all believers were baptized
 into the church of their own accord and thus were conferred with the
 same rights and privileges. The Anabaptists attempted to live in
 accordance with early villages described in the New Testament, they
 organized democratic communities where each and every believer was
 seen as sharing the same rights. Further, the Anabaptists believed
 in secular government, they refused to hold political office or bear
 arms.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="movement"/></entry><entry><title>History: Peace of Augsburg</title><link href="https://2ad.com/history-peace-of-augsburg.html" rel="alternate"/><published>2025-03-09T00:00:00-06:00</published><updated>2025-03-09T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-03-09:/history-peace-of-augsburg.html</id><summary type="html">&lt;p&gt;1555-
The Protestant Reformation
 instigated a spate of religious turmoil and warfare throughout
 Europe, since few states and officials could agree on the fate of
 the two intertwined yet conflicting ecclesiastical disciplines. Wars
 between Italy, Spain, Germany and the Turks marked the period until
 the Peace of Augsburg. The Peace …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1555-
The Protestant Reformation
 instigated a spate of religious turmoil and warfare throughout
 Europe, since few states and officials could agree on the fate of
 the two intertwined yet conflicting ecclesiastical disciplines. Wars
 between Italy, Spain, Germany and the Turks marked the period until
 the Peace of Augsburg. The Peace of Augsburg granted Lutherans the
 same legal rights as Catholics and settled the disputes between the
 Lutheran Germans and other non-Lutherans. The Peace of Augsburg also
 cemented the independence of the German Princes who had eschewed the
 will of the Holy Roman Emperor and triumphed.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>History: Edict of Worms</title><link href="https://2ad.com/history-edict-of-worms.html" rel="alternate"/><published>2025-03-02T00:00:00-06:00</published><updated>2025-03-02T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-03-02:/history-edict-of-worms.html</id><summary type="html">&lt;h2&gt;1520&lt;/h2&gt;
&lt;p&gt;In response to Martin Luther's
 strong condemnation of church doctrine, Holy Roman Emperor
 Charles~V, 1519-
1556
 convened a meeting to force Luther to
 recant his heretical stance. Undaunted, Luther stood fast, and
 proclaimed that [paraphrase] he had arrived at his beliefs based on
 the word of God, and …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;1520&lt;/h2&gt;
&lt;p&gt;In response to Martin Luther's
 strong condemnation of church doctrine, Holy Roman Emperor
 Charles~V, 1519-
1556
 convened a meeting to force Luther to
 recant his heretical stance. Undaunted, Luther stood fast, and
 proclaimed that [paraphrase] he had arrived at his beliefs based on
 the word of God, and only the word of God would dissuade him. The
 Emperor, not being one to withstand such a rebuff, quickly issued the
 Edict of Worms, making Luther an outlaw and required Luther to be
 captured and his works to be burned.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>History: justification by faith</title><link href="https://2ad.com/history-justification-by-faith.html" rel="alternate"/><published>2025-02-23T00:00:00-06:00</published><updated>2025-02-23T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-02-23:/history-justification-by-faith.html</id><content type="html">&lt;p&gt;The justification by faith was the
 principal doctrine of the Protestant Reformation. The
 justification by faith says that humans can not achieve salvation
 through good deeds but by the grace of God, and that this was
 achieved through the sacrifice of Jesus.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>Programing like NASA, the Power of Ten</title><link href="https://2ad.com/power-of-ten.html" rel="alternate"/><published>2025-02-21T00:00:00-06:00</published><updated>2025-02-21T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-02-21:/power-of-ten.html</id><summary type="html">&lt;h2&gt;Should you program like NASA?&lt;/h2&gt;
&lt;p&gt;Programming is a discipline that requires both speed and integrity. The best developers balance rapid iteration with careful checking, ensuring that their code is robust, maintainable, and adaptable over time. That’s where structured coding principles—like those found in the Power of Ten—may …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Should you program like NASA?&lt;/h2&gt;
&lt;p&gt;Programming is a discipline that requires both speed and integrity. The best developers balance rapid iteration with careful checking, ensuring that their code is robust, maintainable, and adaptable over time. That’s where structured coding principles—like those found in the Power of Ten—may help.&lt;/p&gt;
&lt;p&gt;Originally developed for safety-critical systems, the Power of Ten outlines constraints that slow down the creation of code to help prevent issues or to allow static code analysis to find issues programmers don't.&lt;/p&gt;
&lt;p&gt;However, arbitrary restrictions often do not make sense. While some guidelines improve clarity and prevent common pitfalls, others can be overly pedantic, adding unnecessary friction without tangible benefits. In this video, I review how to pick and choose from the Power of Ten, adopting what helps while rejecting constraints that impose needless headaches.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/0vzD2-r7gGQ?si=FKwUnaKCTxpNLwq_" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="tech"/><category term="programming"/><category term="C++"/><category term="rustlang"/></entry><entry><title>History: Pluralism</title><link href="https://2ad.com/history-pluralism.html" rel="alternate"/><published>2025-02-16T00:00:00-06:00</published><updated>2025-02-16T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-02-16:/history-pluralism.html</id><content type="html">&lt;p&gt;Pluralism became a problem in the late middle
 ages, 1500.
 Many officials held two or more positions within
 the church at the same time, this allowed a single individual to
 reap the rewards of multiple positions while still performing the
 service of one.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Indulgences</title><link href="https://2ad.com/history-indulgences.html" rel="alternate"/><published>2025-02-09T00:00:00-06:00</published><updated>2025-02-09T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-02-09:/history-indulgences.html</id><summary type="html">&lt;p&gt;Indulgences were a common practice of Catholic
 church from before the middle ages through the sixteenth century.
 In particular, Pope Leo X granted a special jubilee indulgence to
 finance Saint Peter's Basilica in Rome. However, religious
 reformers such as Martin Luther openly criticized the practice of
 paying for penance. Indulgences …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Indulgences were a common practice of Catholic
 church from before the middle ages through the sixteenth century.
 In particular, Pope Leo X granted a special jubilee indulgence to
 finance Saint Peter's Basilica in Rome. However, religious
 reformers such as Martin Luther openly criticized the practice of
 paying for penance. Indulgences became a motivational force for
 religious reform, as they tended to underscore hypocrisy in the
 Catholic church.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Martin Luther</title><link href="https://2ad.com/history-martin-luther.html" rel="alternate"/><published>2025-02-02T00:00:00-06:00</published><updated>2025-02-02T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-02-02:/history-martin-luther.html</id><summary type="html">&lt;p&gt;1483-
1546
-
Martin Luther was an
 educated man who dedicated himself to monastic life at the age of
 twenty-two. Luther became obsessed with a simple question: What is
 the minimum one must do to attain salvation? Luther believed that
 church doctrine set an impossible task before anyone wishing to
 attain …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1483-
1546
-
Martin Luther was an
 educated man who dedicated himself to monastic life at the age of
 twenty-two. Luther became obsessed with a simple question: What is
 the minimum one must do to attain salvation? Luther believed that
 church doctrine set an impossible task before anyone wishing to
 attain salvation, and resolved to find a new interpretation of
 church doctrine that resolved the question. Luther's answer, known
 as the Protestant Reformation
 revolutionized the
 Christian religion and created a new church doctrine that was
 rapidly adopted. However, Luther's view was not accepted by all. The
 catholic church excommunicated him, and the Holy Roman Emperor made
 him an outlaw. Nonetheless, Luther's view had caught hold of the
 people, and attempts to stifle Luther couldn't stop the rapidly
 advancing religious reform.&lt;/p&gt;
&lt;p&gt;1466-
1536
-
Desiderius Erasmus was one of the
 most important Christian humanists. Erasmus was determined to
 reconcile faith and reason through the common themes of
 classical ethics and Christian morality. He published a book known
 as Handbook of the Christian Knight, in 1503.&lt;/p&gt;
&lt;p&gt;Erasmus' book espoused a 'philosophy of Christ' over restrictive
 church doctrine. Erasmus also published a revised and edited
 edition of the Bible in 1516.
 Though Erasmus' reforms did
 not become widely accepted, it is thought that these reforms paved
 the way for the Protestant Reformation.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Protestant Reformation</title><link href="https://2ad.com/history-protestant-reformation.html" rel="alternate"/><published>2025-01-26T00:00:00-06:00</published><updated>2025-01-26T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-01-26:/history-protestant-reformation.html</id><summary type="html">&lt;p&gt;1513-
Spearheaded by Martin Luther,
 the Protestant Reformation set about to answer the question about
 what one must do to attain salvation. Luther believed that church
 theology which included the seven sacraments set an
 impossible task before good people who might deserve salvation.
 Luther's idea was that the "justice of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1513-
Spearheaded by Martin Luther,
 the Protestant Reformation set about to answer the question about
 what one must do to attain salvation. Luther believed that church
 theology which included the seven sacraments set an
 impossible task before good people who might deserve salvation.
 Luther's idea was that the "justice of God" was not a punitive
 recounting of ones individual folly, but a merciful acceptance
 wrought out of the sacrifice of Jesus on the cross. The Reformation
 became very popular and spread rapidly, splintering the Catholic
 church into factions that exist to this day.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="movement"/></entry><entry><title>History: Julius II</title><link href="https://2ad.com/history-julius-ii.html" rel="alternate"/><published>2025-01-19T00:00:00-06:00</published><updated>2025-01-19T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-01-19:/history-julius-ii.html</id><content type="html">&lt;p&gt;1503-
1513
-
Julius II was a Renaissance
 Pope who was very involved in both war and politics. Julius is sometimes
 called the "warrior-pope," since he personally led armies.
 Many Christians criticized these activities.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Fall of Constantinople</title><link href="https://2ad.com/history-fall-of-constantinople.html" rel="alternate"/><published>2025-01-12T00:00:00-06:00</published><updated>2025-01-12T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-01-12:/history-fall-of-constantinople.html</id><content type="html">&lt;p&gt;1453-
The city of Constantinople fell
 to the Turks after being sieged for several months. This event and
 the rapid spread of the Turkish people throughout the east, allowed
 the Turks to exert considerable pressure on the western kingdoms.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>History: Habsburgs</title><link href="https://2ad.com/history-habsburgs.html" rel="alternate"/><published>2025-01-05T00:00:00-06:00</published><updated>2025-01-05T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-01-05:/history-habsburgs.html</id><summary type="html">&lt;p&gt;1438-
The Habsburg dynasty was the principal ruling
 dynasty in the "Holy Roman Empire" in the mid-fifteenth century.
 The Habsburgs were one of the largest land holders in the region. They
 cemented their success through a system of strategic marriages
 devised to maintain or increase power and influence over the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1438-
The Habsburg dynasty was the principal ruling
 dynasty in the "Holy Roman Empire" in the mid-fifteenth century.
 The Habsburgs were one of the largest land holders in the region. They
 cemented their success through a system of strategic marriages
 devised to maintain or increase power and influence over the region.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="dynasty"/></entry><entry><title>How to use ed - the original text editor</title><link href="https://2ad.com/how-to-use-ed-the-original-text-editor.html" rel="alternate"/><published>2025-01-03T00:00:00-06:00</published><updated>2025-01-03T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-01-03:/how-to-use-ed-the-original-text-editor.html</id><content type="html">&lt;iframe width="939" height="528" src="https://www.youtube.com/embed/o6XyxQhjDmM" title="How to use ed – the original unix text editor" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;How to use &lt;code&gt;ed&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ed file.txt
1,$p         # Print all lines.
3d           # Delete line 3.
$s/foo/bar/g # Replace &amp;quot;foo&amp;quot; with &amp;quot;bar&amp;quot; in all lines.
w            # Save changes.
q            # Quit the editor.
i            # insert previous line
a            # append next line
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="tech"/><category term="ed"/><category term="unix"/></entry><entry><title>Beans Test Kitchen - Panettone Taste Test</title><link href="https://2ad.com/beans-test-kitchen-panettone-taste-test.html" rel="alternate"/><published>2025-01-01T00:00:00-06:00</published><updated>2025-01-01T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2025-01-01:/beans-test-kitchen-panettone-taste-test.html</id><content type="html">&lt;p&gt;Beans Test Kitchen
Panettone Blind Taste Test&lt;/p&gt;
&lt;p&gt;Compared are
* Tre Marie
* Pisti - Il Panettone
* Bauducco&lt;/p&gt;
&lt;iframe width="395" height="703" src="https://www.youtube.com/embed/zXKj_7cFGjc" title="Beans Test Kitchen – Panettone Blind Taste Test   4K60" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="food"/><category term="panettone"/><category term="tastetest"/><category term="kitchen"/></entry><entry><title>History: Isabella and Ferdinand</title><link href="https://2ad.com/history-isabella-and-ferdinand.html" rel="alternate"/><published>2024-12-29T00:00:00-06:00</published><updated>2024-12-29T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-29:/history-isabella-and-ferdinand.html</id><summary type="html">&lt;h2&gt;1480&lt;/h2&gt;
&lt;p&gt;The marriage of Isabella
 of Castile, 1474-
1504,
 and Ferdinand of Aragon,
 1479-
1516,
 served to unify much of Christian and Muslim
 Spain. Though both kingdoms maintained separate governing
 institutions, the two rulers were able to strengthen the bond
 between the two kingdoms by strengthening their respective
 monarchies. Isabella …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;1480&lt;/h2&gt;
&lt;p&gt;The marriage of Isabella
 of Castile, 1474-
1504,
 and Ferdinand of Aragon,
 1479-
1516,
 served to unify much of Christian and Muslim
 Spain. Though both kingdoms maintained separate governing
 institutions, the two rulers were able to strengthen the bond
 between the two kingdoms by strengthening their respective
 monarchies. Isabella and Ferdinand built a national military with
 the purpose of controlling the aristocracy. They arranged with the
 pope to be able to appoint the top position in the Spanish church,
 and made other changes which strengthened the monarchy as a whole.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="persons"/></entry><entry><title>History: Henry VII Tudor</title><link href="https://2ad.com/history-henry-vii-tudor.html" rel="alternate"/><published>2024-12-22T00:00:00-06:00</published><updated>2024-12-22T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-22:/history-henry-vii-tudor.html</id><summary type="html">&lt;p&gt;1485-
1509
-
Henry VII defeated
 Richard III and established the Tudor dynasty. After the War of
 the Roses, much work was needed to unify the aristocracy, and Henry
 worked to quell dissension and build a strong monarchy. Henry
 eliminated the practice of wealthy families maintaining personal
 militaries. Henry also worked …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1485-
1509
-
Henry VII defeated
 Richard III and established the Tudor dynasty. After the War of
 the Roses, much work was needed to unify the aristocracy, and Henry
 worked to quell dissension and build a strong monarchy. Henry
 eliminated the practice of wealthy families maintaining personal
 militaries. Henry also worked to improve the English economy by
 encouraging businesses. As a result of these improvements, Henry's
 legacy was a stable and prosperous nation.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: War of the Roses</title><link href="https://2ad.com/history-war-of-the-roses.html" rel="alternate"/><published>2024-12-15T00:00:00-06:00</published><updated>2024-12-15T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-15:/history-war-of-the-roses.html</id><summary type="html">&lt;p&gt;1450-
1485
-
The War of the Roses was a civil war that
 broke out between English ducal houses. The house of Lancaster,
 whose symbol was a red rose, and the house of York, adopting the
 white rose. In the 1450's
 many aristocratic families were
 pitted against one another. Later, in …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1450-
1485
-
The War of the Roses was a civil war that
 broke out between English ducal houses. The house of Lancaster,
 whose symbol was a red rose, and the house of York, adopting the
 white rose. In the 1450's
 many aristocratic families were
 pitted against one another. Later, in 1485,
 Henry Tudor
 defeated the Yorkist king, Richard III and established the dynasty
 known as the Tudors.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>How to Debug Custom Errors in Ethereum Using Foundry and Forge</title><link href="https://2ad.com/ethereum-custom-error-debug.html" rel="alternate"/><published>2024-12-13T00:00:00-06:00</published><updated>2024-12-13T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-13:/ethereum-custom-error-debug.html</id><content type="html">&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Q3dPEYfbqcI?si=Np3p94_w3TBQbw-g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Debugging custom errors in Ethereum smart contracts using Foundry and Forge involves guessing, intuition and trial and error. Custom errors can provide clarity and save gas compared to traditional require statements. However, debugging them requires perseverance.&lt;/p&gt;</content><category term="tech"/><category term="programming"/><category term="solana"/><category term="solidity"/><category term="error"/></entry><entry><title>History: School of Athens</title><link href="https://2ad.com/history-school-of-athens.html" rel="alternate"/><published>2024-12-08T00:00:00-06:00</published><updated>2024-12-08T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-08:/history-school-of-athens.html</id><content type="html">&lt;p&gt;Raphael painted School of
 Athens after he arrived in Rome, 1510-
1511.
 The
 School of Athens depicts a gathering of ancient philosophers,
 including Plato, Aristotle, and Pythagoras. This work illustrates
 the revival of classical thought, especially pertaining to harmony
 and order, during the Italian Renaissance.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>Solana Anchor Build Setup Dockerfile</title><link href="https://2ad.com/solana-anchor.html" rel="alternate"/><published>2024-12-07T00:00:00-06:00</published><updated>2024-12-07T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-07:/solana-anchor.html</id><summary type="html">&lt;h2&gt;Anchor Build on Visual Studio Code&lt;/h2&gt;
&lt;p&gt;Solana Anchor with Docker ensures a consistent development environment, making it easier to manage dependencies and build processes.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Make sure you have the following installed on your machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docker.com"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com"&gt;VSCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dockerfile&lt;/h2&gt;
&lt;p&gt;Below is a Dockerfile for setting up the Solana Anchor environment within …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Anchor Build on Visual Studio Code&lt;/h2&gt;
&lt;p&gt;Solana Anchor with Docker ensures a consistent development environment, making it easier to manage dependencies and build processes.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Make sure you have the following installed on your machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docker.com"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com"&gt;VSCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dockerfile&lt;/h2&gt;
&lt;p&gt;Below is a Dockerfile for setting up the Solana Anchor environment within Visual Studio Code or Docker:&lt;/p&gt;
&lt;script src="https://gist.github.com/jac18281828/6ad66a078550d0843009c22e106469a2.js"&gt;&lt;/script&gt;

&lt;p&gt;Using Docker for your Solana Anchor project setup ensures that your development environment is consistent and reproducible. This setup can save you time and prevent issues related to dependency management. Happy coding!&lt;/p&gt;</content><category term="tech"/><category term="programming"/><category term="solana"/><category term="rust"/><category term="anchor"/></entry><entry><title>History: Johanne Gutenberg</title><link href="https://2ad.com/history-johanne-gutenberg.html" rel="alternate"/><published>2024-12-01T00:00:00-06:00</published><updated>2024-12-01T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-12-01:/history-johanne-gutenberg.html</id><summary type="html">&lt;h2&gt;1450&lt;/h2&gt;
&lt;p&gt;Gutenberg is the famous
 inventor of movable type machines. Around 1455
 Gutenberg
 produced a practical and inexpensive copy of the Bible. In the next
 century the technology exploded across Europe, from 1 to 100, to
 1000 printers across Europe. In the sixteenth century, Gutenberg's
 movable type apparatus, also coined …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;1450&lt;/h2&gt;
&lt;p&gt;Gutenberg is the famous
 inventor of movable type machines. Around 1455
 Gutenberg
 produced a practical and inexpensive copy of the Bible. In the next
 century the technology exploded across Europe, from 1 to 100, to
 1000 printers across Europe. In the sixteenth century, Gutenberg's
 movable type apparatus, also coined "printing press," had been
 used to produce more than 10 million copies of 40,000 titles.
 Printing became one of the largest industries in Europe, and has had
 a monumental impact on Western Civilization.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>const in rust - 3 essentials</title><link href="https://2ad.com/rust-const.html" rel="alternate"/><published>2024-11-29T00:00:00-06:00</published><updated>2024-11-29T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-29:/rust-const.html</id><summary type="html">&lt;p&gt;Unlock constants in Rust with these three essential tips! 🚀&lt;/p&gt;
&lt;iframe width="705" height="1254" src="https://www.youtube.com/embed/q4aXvWwY_6U" title="const in rust   3 essential tips" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/ifram&gt;

1️⃣ Static from Const: Rust 1.83+ lets you reference a static from a const—simplify and optimize your code

2️⃣ Compile-Time Precomputation: Use const for values computed at compile time, boosting performance

3️⃣ Const Generics for Arrays: Initialize arrays with …&lt;/iframe&gt;</summary><content type="html">&lt;p&gt;Unlock constants in Rust with these three essential tips! 🚀&lt;/p&gt;
&lt;iframe width="705" height="1254" src="https://www.youtube.com/embed/q4aXvWwY_6U" title="const in rust   3 essential tips" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/ifram&gt;

1️⃣ Static from Const: Rust 1.83+ lets you reference a static from a const—simplify and optimize your code

2️⃣ Compile-Time Precomputation: Use const for values computed at compile time, boosting performance

3️⃣ Const Generics for Arrays: Initialize arrays with const parameters and even precompute sequences like Fibonacci—just remember, loops aren’t allowed in const

Combine these techniques for clean, efficient, and precomputed logic in your Rust projects! 🦀</content><category term="tech"/><category term="programming"/><category term="rust"/></entry><entry><title>Advent of Code 2024</title><link href="https://2ad.com/advent-of-code-2024.html" rel="alternate"/><published>2024-11-25T00:00:00-06:00</published><updated>2024-11-25T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-25:/advent-of-code-2024.html</id><summary type="html">&lt;h2&gt;2024 Advent of Code Repository&lt;/h2&gt;
&lt;p&gt;I have created a repository for the &lt;a href="https://adventofcode.com/2023/"&gt;Advent of Code 2024&lt;/a&gt; challenges. You can find the repository &lt;a href="https://github.com/jac18281828/advent-of-code-2024"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This year I'll be coding in Rust.&lt;/p&gt;
&lt;p&gt;I'm using the basic setup as described in &lt;a href="https://www.youtube.com/watch?app=desktop&amp;amp;v=fEQv-cqzbPg"&gt;How to set up Rust for Advent of Code&lt;/a&gt; by Chris Biscardi …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;2024 Advent of Code Repository&lt;/h2&gt;
&lt;p&gt;I have created a repository for the &lt;a href="https://adventofcode.com/2023/"&gt;Advent of Code 2024&lt;/a&gt; challenges. You can find the repository &lt;a href="https://github.com/jac18281828/advent-of-code-2024"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This year I'll be coding in Rust.&lt;/p&gt;
&lt;p&gt;I'm using the basic setup as described in &lt;a href="https://www.youtube.com/watch?app=desktop&amp;amp;v=fEQv-cqzbPg"&gt;How to set up Rust for Advent of Code&lt;/a&gt; by Chris Biscardi.  Thanks Chris!  Along with my Visual Studio Code Rust Remote Container &lt;a href="https://github.com/jac18281828/rust"&gt;here&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>Debugging Smart Contracts with Foundry</title><link href="https://2ad.com/foundry-debug.html" rel="alternate"/><published>2024-11-24T00:00:00-06:00</published><updated>2024-11-24T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-24:/foundry-debug.html</id><summary type="html">&lt;h1&gt;Debugging in Foundry and Forge: Techniques for Solidity Developers&lt;/h1&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/SmSDBJ5S0KE?si=6K-fn4j_oB-qf1Ms" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;In this video, I walk through four essential debugging techniques in Foundry and Forge, as outlined in my &lt;a href="https://youtu.be/SmSDBJ5S0KE"&gt;YouTube video&lt;/a&gt;. These techniques include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Verbose Test Output&lt;/li&gt;
&lt;li&gt;Foundry Interactive Debugging&lt;/li&gt;
&lt;li&gt;Printf Debugging&lt;/li&gt;
&lt;li&gt;Event Logging&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1. Verbose Test Output&lt;/h2&gt;
&lt;p&gt;Verbose test output is …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Debugging in Foundry and Forge: Techniques for Solidity Developers&lt;/h1&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/SmSDBJ5S0KE?si=6K-fn4j_oB-qf1Ms" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;In this video, I walk through four essential debugging techniques in Foundry and Forge, as outlined in my &lt;a href="https://youtu.be/SmSDBJ5S0KE"&gt;YouTube video&lt;/a&gt;. These techniques include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Verbose Test Output&lt;/li&gt;
&lt;li&gt;Foundry Interactive Debugging&lt;/li&gt;
&lt;li&gt;Printf Debugging&lt;/li&gt;
&lt;li&gt;Event Logging&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1. Verbose Test Output&lt;/h2&gt;
&lt;p&gt;Verbose test output is your first step in gaining visibility into what’s happening during your tests. Foundry’s &lt;code&gt;forge&lt;/code&gt; command allows you to run tests with detailed output that includes stack traces, failing assertions, and function calls.&lt;/p&gt;
&lt;h3&gt;How to Use&lt;/h3&gt;
&lt;p&gt;Run the following command to enable verbose output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;forge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-vvvv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The -vvvv flag sets the verbosity level to maximum, providing comprehensive details about test execution. This helps you pinpoint the exact location and nature of a failure, especially in large test suites.&lt;/p&gt;
&lt;p&gt;Benefits&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Clear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;traces&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;tests&lt;/span&gt;.
•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Insight&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;into&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;contract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;calls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;execution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;flow&lt;/span&gt;.
•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Quick&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;failing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;assertions&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Verbose output is a great starting point when a test doesn’t behave as expected.&lt;/p&gt;
&lt;h2&gt;2. Foundry Interactive Debugging&lt;/h2&gt;
&lt;p&gt;Foundry offers an interactive debugging mode that allows you to step through transactions and examine state changes. This feature is invaluable for complex debugging scenarios where simple test outputs aren’t enough.&lt;/p&gt;
&lt;p&gt;How to Use&lt;/p&gt;
&lt;p&gt;Enable debugging with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;forge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When a failing test is encountered, the debugger will pause execution, letting you:
    •   Inspect variables and memory.
    •   Step through execution one instruction at a time.
    •   Evaluate expressions interactively.&lt;/p&gt;
&lt;p&gt;Benefits&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Detailed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;view&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;EVM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;during&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;execution&lt;/span&gt;.
•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Fine&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;grained&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;control&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;over&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;debugging&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;.
•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Ideal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;deep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dives&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;into&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;unexpected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;behavior&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Interactive debugging provides an advanced level of insight, making it perfect for diagnosing subtle issues.&lt;/p&gt;
&lt;h2&gt;3. Printf Debugging&lt;/h2&gt;
&lt;p&gt;Printf debugging is a simple yet effective approach where you insert logging statements into your contracts. Foundry supports emitting logs during test execution, which can help you trace execution flow and variable values.&lt;/p&gt;
&lt;p&gt;How to Use&lt;/p&gt;
&lt;p&gt;Add the following to your Solidity code:&lt;/p&gt;
&lt;p&gt;emit log_named_uint("Variable Name", variable);
emit log_named_address("Address", userAddress);&lt;/p&gt;
&lt;p&gt;Run your tests with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;forge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-vvv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The output will include your custom logs, helping you trace what’s happening in your contract.&lt;/p&gt;
&lt;p&gt;Benefits&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;Quick&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;implement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;easy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;understand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;Effective&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tracing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;specific&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;Can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;combined&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;other&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;debugging&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;techniques&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This method is great for quick checks when you suspect an issue with specific variables or functions.&lt;/p&gt;
&lt;h2&gt;4. Event Logging&lt;/h2&gt;
&lt;p&gt;Event logging leverages Solidity events to record significant occurrences in your contracts. Unlike printf debugging, events are a core feature of Solidity and can be used for debugging and production purposes.&lt;/p&gt;
&lt;p&gt;How to Use&lt;/p&gt;
&lt;p&gt;Define events in your contract:&lt;/p&gt;
&lt;p&gt;event DebugEvent(string message, uint256 value);&lt;/p&gt;
&lt;p&gt;function someFunction(uint256 value) public {
    emit DebugEvent("Value passed to function", value);
}&lt;/p&gt;
&lt;p&gt;Run your tests as usual, and the emitted events will appear in the output.&lt;/p&gt;
&lt;p&gt;Benefits&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Provides&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;structured&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;both&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;debugging&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;production&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;monitoring&lt;/span&gt;.
•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Easier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;analyze&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;than&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;raw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;especially&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;larger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;systems&lt;/span&gt;.
•&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;Useful&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;identifying&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;patterns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;anomalies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;contract&lt;/span&gt;’&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;behavior&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Events are a robust solution for debugging and monitoring deployed contracts.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;Debugging smart contracts is a critical skill, and Foundry and Forge provide a rich set of tools to help you identify and resolve issues efficiently. Whether you start with verbose test output or dive deep with interactive debugging, mastering these techniques will make you a more effective Solidity developer.&lt;/p&gt;
&lt;p&gt;If you’d like a more detailed walkthrough, check out my YouTube video where I demonstrate these techniques in action.&lt;/p&gt;
&lt;p&gt;What are your go-to debugging strategies in Solidity? Let me know in the comments or reach out on social media!&lt;/p&gt;</content><category term="tech"/><category term="programming"/><category term="solidity"/><category term="ethereum"/><category term="foundry"/><category term="forge"/><category term="debugging"/><category term="smart-contracts"/></entry><entry><title>History: Machiavelli</title><link href="https://2ad.com/history-machiavelli.html" rel="alternate"/><published>2024-11-24T00:00:00-06:00</published><updated>2024-11-24T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-24:/history-machiavelli.html</id><summary type="html">&lt;p&gt;1469-
1527
-
Niccolo Machiavelli was an
 Italian politician who's ideas have come to embody an ideal of
 political power. Machiavelli served as a secretary to the
 Florentine Council of Ten, and as a diplomat. When the Medici
 regained control of Florence in 1512,
 Machiavelli was forced
 into exile where his …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1469-
1527
-
Niccolo Machiavelli was an
 Italian politician who's ideas have come to embody an ideal of
 political power. Machiavelli served as a secretary to the
 Florentine Council of Ten, and as a diplomat. When the Medici
 regained control of Florence in 1512,
 Machiavelli was forced
 into exile where his political ambition shifted from participation
 to writing. In his master work, The Prince, Machiavelli
 explains techniques for achieving and expanding political power.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Civic humanism</title><link href="https://2ad.com/history-civic-humanism.html" rel="alternate"/><published>2024-11-17T00:00:00-06:00</published><updated>2024-11-17T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-17:/history-civic-humanism.html</id><summary type="html">&lt;p&gt;Civic humanism was an ideal that emerged in
 the Italian Renaissance, 1400.Many people believed that
 the only way to truly mature as an individual was to participate in
 the life of the state. They believed that the study of humanities
 could be used to ensure the overall wellbeing of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Civic humanism was an ideal that emerged in
 the Italian Renaissance, 1400.Many people believed that
 the only way to truly mature as an individual was to participate in
 the life of the state. They believed that the study of humanities
 could be used to ensure the overall wellbeing of the state.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Petrarch</title><link href="https://2ad.com/history-petrarch.html" rel="alternate"/><published>2024-11-10T00:00:00-06:00</published><updated>2024-11-10T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-10:/history-petrarch.html</id><summary type="html">&lt;p&gt;1304-
1374
-
Petrarch was a Florentine, though he
 primarily lived outside of Florence. Petrarch is attributed in the
 revival of the classics, and the foundation of Italian Renaissance
 humanism. He is considered one of the greatest lyric poets of the
 time, and many of his sonnets are inspired by his …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1304-
1374
-
Petrarch was a Florentine, though he
 primarily lived outside of Florence. Petrarch is attributed in the
 revival of the classics, and the foundation of Italian Renaissance
 humanism. He is considered one of the greatest lyric poets of the
 time, and many of his sonnets are inspired by his love for Laura, a
 married woman whom he met in 1327.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: House of Medici</title><link href="https://2ad.com/history-house-of-medici.html" rel="alternate"/><published>2024-11-03T00:00:00-05:00</published><updated>2024-11-03T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-11-03:/history-house-of-medici.html</id><summary type="html">&lt;p&gt;At it's height, in the fifteenth century the
 House of Medici was the most prominent banking family in Europe.
 Originally a cloth producer, the Medicis gained great power in
 commerce, real estate and finance that spread throughout northern
 Italy, France, and even into England. The Medici family's power
 declined after …&lt;/p&gt;</summary><content type="html">&lt;p&gt;At it's height, in the fifteenth century the
 House of Medici was the most prominent banking family in Europe.
 Originally a cloth producer, the Medicis gained great power in
 commerce, real estate and finance that spread throughout northern
 Italy, France, and even into England. The Medici family's power
 declined after a series of bad leaders and failed loans resulted in
 significant losses.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Hanseatic League</title><link href="https://2ad.com/history-hanseatic-league.html" rel="alternate"/><published>2024-10-27T00:00:00-05:00</published><updated>2024-10-27T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-27:/history-hanseatic-league.html</id><summary type="html">&lt;p&gt;The Hanseatic League was formed in the
 thirteenth century. Several German coastal towns, including
 L"ubeck, Hamburg, and Bremen formed a commercial and military
 league to obtain commercial breaks and to protect themselves from
 pirates. The League grew rapidly and by 1500
 it had grown to
 as many as eighty …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Hanseatic League was formed in the
 thirteenth century. Several German coastal towns, including
 L"ubeck, Hamburg, and Bremen formed a commercial and military
 league to obtain commercial breaks and to protect themselves from
 pirates. The League grew rapidly and by 1500
 it had grown to
 as many as eighty cities. The Hanseatic League maintained a
 monopoly on trade of vital goods in northern Europe for centuries.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>EMOM Timer - Rust + WebAssembly in Action</title><link href="https://2ad.com/emom-timer-update.html" rel="alternate"/><published>2024-10-20T00:00:00-05:00</published><updated>2024-10-20T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-20:/emom-timer-update.html</id><summary type="html">&lt;h3&gt;EMOM Timer - A Rust and Yew Application&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://emom-timer-us-east-2-504242000181.s3-website.us-east-2.amazonaws.com"&gt;&lt;img alt="EMOM Timer" src="https://2ad.com/images/2023/emomtimer103.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For those who are new to EMOM workouts, EMOM stands for "Every Minute on the Minute." It's a type of interval workout that pushes your limits by requiring you to complete an exercise at the start of each minute. The leftover time …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;EMOM Timer - A Rust and Yew Application&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://emom-timer-us-east-2-504242000181.s3-website.us-east-2.amazonaws.com"&gt;&lt;img alt="EMOM Timer" src="https://2ad.com/images/2023/emomtimer103.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For those who are new to EMOM workouts, EMOM stands for "Every Minute on the Minute." It's a type of interval workout that pushes your limits by requiring you to complete an exercise at the start of each minute. The leftover time in each minute is your recovery period. To make these workouts seamless, I built an &lt;strong&gt;EMOM Timer&lt;/strong&gt; using Rust and WebAssembly (Wasm), combining the performance of Rust with the portability of web technologies.&lt;/p&gt;
&lt;p&gt;In this post, I'll share updates to the EMOM Timer project, highlighting the benefits of Rust and Wasm for this type of application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Rust and Wasm?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust is known for its memory safety, performance, and concurrency support, all without a garbage collector. When combined with Wasm, you can run Rust code efficiently in a browser, creating a highly performant and portable web application. This EMOM timer leverages both, providing near-native performance for a smooth user experience.&lt;/p&gt;
&lt;p&gt;You can view the source code on GitHub &lt;a href="https://github.com/jac18281828/emomtimer?tab=readme-ov-file"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recent Updates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this version, I've made several enhancements to the timer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved Timer Logic&lt;/strong&gt;&lt;br&gt;
   The core timer logic has been reworked to ensure more precise synchronization with real-time intervals. This was done by implementing an optimized loop that works seamlessly with Rust’s multithreading model. Thanks to Rust's robust control over concurrency, the timer now handles overlapping instructions more effectively, reducing the jitter during transitions between exercises and rest periods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WebAssembly Bindgen Integration&lt;/strong&gt;&lt;br&gt;
   To further streamline the interaction between Rust and JavaScript in the browser, I improved the use of &lt;code&gt;wasm-bindgen&lt;/code&gt;. This allowed me to directly call Rust functions from JavaScript and manipulate the DOM without performance penalties. This means smoother UI transitions and more precise control over elements like the timer countdown and start/pause functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Customizable Workout Configurations&lt;/strong&gt;&lt;br&gt;
   Users can now fully customize their EMOM workouts. You can input the number of intervals, workout and rest durations, and even switch between time modes like stopwatch or countdown. This feature is made possible by Rust’s type system, which ensures that user inputs are validated, preventing errors during workout setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Responsive UI with WebAssembly&lt;/strong&gt;&lt;br&gt;
   While the previous version was more of a functional demo, I’ve now added a responsive design using &lt;code&gt;wasm-bindgen&lt;/code&gt; to manipulate CSS directly from Rust. The app adjusts seamlessly between mobile and desktop views, making it easier to use whether you’re at the gym with your phone or at home on your laptop.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Learning Points&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Throughout this project, I've learned a lot about combining the strengths of Rust with Wasm, especially when it comes to performance-critical applications like timers. Here are a few takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Concurrency Management in Rust&lt;/strong&gt;: Rust's ownership model makes managing concurrent tasks (like UI updates and timing functions) much safer and easier to debug compared to JavaScript's event loop model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance Gains&lt;/strong&gt;: Moving the heavy lifting (like timer calculations) to Rust results in noticeable performance improvements over traditional JavaScript timers, especially when run on lower-power devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wasm as a Future-Proofing Tool&lt;/strong&gt;: WebAssembly isn't just a tool for today; it’s part of a future where high-performance apps can be built in languages like Rust and run across different platforms with minimal overhead.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The combination of Rust and WebAssembly has allowed me to create a powerful, efficient, and customizable EMOM timer that outperforms similar JavaScript-only implementations. I’m excited to keep refining this project, and I hope you find it useful for your own fitness routines.&lt;/p&gt;
&lt;p&gt;You can check out the latest version of the EMOM Timer on GitHub &lt;a href="https://github.com/jac18281828/emomtimer?tab=readme-ov-file"&gt;here&lt;/a&gt;, and feel free to try it out in your browser!&lt;/p&gt;</content><category term="tech"/><category term="rustlang"/><category term="wasm"/></entry><entry><title>History: Dante</title><link href="https://2ad.com/history-dante.html" rel="alternate"/><published>2024-10-20T00:00:00-05:00</published><updated>2024-10-20T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-20:/history-dante.html</id><content type="html">&lt;p&gt;1265-
1321
-
Dante was a Florentine noble who
 was exiled from his political office. Dante is well known for his
 work the Divine Comedy which he wrote between
 1313-
1321,
 while in exile. Dante's work depicts the
 progression of a soul through the process of salvation.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Great Schism</title><link href="https://2ad.com/history-great-schism.html" rel="alternate"/><published>2024-10-13T00:00:00-05:00</published><updated>2024-10-13T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-13:/history-great-schism.html</id><summary type="html">&lt;p&gt;1377-
After determining that a decline
 in papal authority was due, at least in part, to an Avignon Papacy
,
 Pope Gregory XI returned the seat of papal power to Rome.
 Unfortunately, in 1378
 Gregory died, resulting in a new
 struggle for papal power. Many Roman cardinals feared that the
 powerful …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1377-
After determining that a decline
 in papal authority was due, at least in part, to an Avignon Papacy
,
 Pope Gregory XI returned the seat of papal power to Rome.
 Unfortunately, in 1378
 Gregory died, resulting in a new
 struggle for papal power. Many Roman cardinals feared that the
 powerful enclave of French cardinals would elect another French pope
 who would reestablish the Avignon Papacy. The Roman Cardinals
 threatened the French cardinals with death if they did so, and the
 Italian archbishop of Bari was elected and anointed Pope Urban~VI.
 However, the victory was temporary since five months later the
 French cardinals declared the election improper. The French
 cardinals elected Clement VII, a Frenchman to resume the Avignon
 Papacy and the resulting power struggle is known as the Great
 Schism. The division of the Papacy caused great turbulence in
 the Catholic church, damaged the faith of the believers, and
 resulted in increased taxes and corruption. Eventually the Papacy
 returned to Rome, but not before much damage was done to the church.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>Announcement tsdev:v22.9.0</title><link href="https://2ad.com/tsdev-v22.9.0.html" rel="alternate"/><published>2024-10-08T00:00:00-05:00</published><updated>2024-10-08T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-08:/tsdev-v22.9.0.html</id><summary type="html">&lt;h1&gt;tsdev 22.9.0&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 22.9.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;tsdev 22.9.0&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 22.9.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/tsdev/pkgs/container/tsdev/286103831?tag=v22.9.0"&gt;TS Dev Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: Avignon Papacy</title><link href="https://2ad.com/history-avignon-papacy.html" rel="alternate"/><published>2024-10-06T00:00:00-05:00</published><updated>2024-10-06T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-06:/history-avignon-papacy.html</id><summary type="html">&lt;p&gt;1305-
1377
-
Continuing his bid to quell
 papal power, Philip IV pressured French cardinals to elect a French
 pope in the wake of the death of Bonifice VIII. Clement~V,
 1305-
1314
 was elected and moved the seat of the Papacy to
 Avignon, southern France, citing political turmoil in Rome …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1305-
1377
-
Continuing his bid to quell
 papal power, Philip IV pressured French cardinals to elect a French
 pope in the wake of the death of Bonifice VIII. Clement~V,
 1305-
1314
 was elected and moved the seat of the Papacy to
 Avignon, southern France, citing political turmoil in Rome as the
 principal reason. The Avignon Papacy resulted in a decline in
 papal authority, essentially subordinating the Pope to the King of
 France.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>Announcement solana:v1.18.25</title><link href="https://2ad.com/solana-v1.18.25.html" rel="alternate"/><published>2024-10-04T00:00:00-05:00</published><updated>2024-10-04T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-10-04:/solana-v1.18.25.html</id><summary type="html">&lt;h1&gt;Solana 1.18.25&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.18.15. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Solana 1.18.25&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.18.15. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href=""&gt;Solana Dev Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: Unam Sanctam</title><link href="https://2ad.com/history-unam-sanctam.html" rel="alternate"/><published>2024-09-29T00:00:00-05:00</published><updated>2024-09-29T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-09-29:/history-unam-sanctam.html</id><content type="html">&lt;p&gt;1302
 -- The Unam Sanctam 
 was letter or "papal bull" written by Boniface~VIII to assert his
 authority to control taxation of the clergy. Boniface wrote that
 "if earthly power errs, it shall be judged by spiritual power,"
 with the obvious implication that Popes supersede kings in all
 matters.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Bonifice VIII</title><link href="https://2ad.com/history-bonifice-viii.html" rel="alternate"/><published>2024-09-22T00:00:00-05:00</published><updated>2024-09-22T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-09-22:/history-bonifice-viii.html</id><summary type="html">&lt;p&gt;1294-
1303
-
Pope Bonifice VIII was a
 controversial fourteenth century pope. When Philip IV intended to
 tax the clergy, Bonifice responded that clergy could not pay taxes
 in any state without papal consent. The power struggle underscored
 the inherent tension between the powerful European monarchs and the
 supreme papal authority …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1294-
1303
-
Pope Bonifice VIII was a
 controversial fourteenth century pope. When Philip IV intended to
 tax the clergy, Bonifice responded that clergy could not pay taxes
 in any state without papal consent. The power struggle underscored
 the inherent tension between the powerful European monarchs and the
 supreme papal authority. Bonifice wrote a series of letters to
 solidify his argument. One of them was the Unam Sanctam , see
 below, which he wrote in 1302.
 Bonifice intended to
 excommunicate Phillip, however Philip conspired to have the pope
 brought on charges of heresy. Eventually the pope was captured,
 freed again, and then killed by conspirators who were incited to the
 action by Philip.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Joan of Arc</title><link href="https://2ad.com/history-joan-of-arc.html" rel="alternate"/><published>2024-09-15T00:00:00-05:00</published><updated>2024-09-15T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-09-15:/history-joan-of-arc.html</id><summary type="html">&lt;p&gt;1412-
1431
-
Joan of Arc was the
 daughter of peasants from the village of Domr'emy in Champagne.
 Joan was deeply religious and is known to have experienced visions.
 She believed that several saints commanded her to free France
 and to return rule to the dauphin, or rightful heir. Joan of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1412-
1431
-
Joan of Arc was the
 daughter of peasants from the village of Domr'emy in Champagne.
 Joan was deeply religious and is known to have experienced visions.
 She believed that several saints commanded her to free France
 and to return rule to the dauphin, or rightful heir. Joan of Arc
 persuaded Charles, the dauphin, to allow her to accompany a French
 army to Orl'eans. The French armies seemed inspired by Joan of
 Arc's confidence and liberated Orl'eans. Soon the Loire valley was
 free and Charles was able to claim the monarchy in 1429.&lt;/p&gt;
&lt;p&gt;Unfortunately, Joan of Arc was captured shortly thereafter by the
 Burgundians, who were allies of England. Joan was turned over to the
 Inquisition on charges of witchcraft, because her visions were
 deemed to be satanic. The church condemned her as a witch and
 burned her at the stake. Ironically, Joan was sainted by the Roman
 Catholic church in 1920, about 500 years too late.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Agincourt</title><link href="https://2ad.com/history-agincourt.html" rel="alternate"/><published>2024-09-08T00:00:00-05:00</published><updated>2024-09-08T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-09-08:/history-agincourt.html</id><content type="html">&lt;p&gt;1415 -
Henry V, of England, renewed the
 Hundred Years' War
 at Agincourt. The French resistance
at Agincourt was decimated and more than 1500 nobles were killed.
Henry V was able to reconquer Normandy and gain the allegiance of
the Duke of Burgundy.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="battle"/></entry><entry><title>Announcement solc:v0.8.27</title><link href="https://2ad.com/solc-v0.8.27.html" rel="alternate"/><published>2024-09-04T00:00:00-05:00</published><updated>2024-09-04T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-09-04:/solc-v0.8.27.html</id><summary type="html">&lt;h1&gt;Solc 0.8.27&lt;/h1&gt;
&lt;p&gt;&lt;img alt="solc" src="https://2ad.com/images/universe/solc.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 0.8.27. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Solc 0.8.27&lt;/h1&gt;
&lt;p&gt;&lt;img alt="solc" src="https://2ad.com/images/universe/solc.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 0.8.27. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/solc/pkgs/container/solc/268596887?tag=v0.8.27"&gt;SOLC Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: Poitiers</title><link href="https://2ad.com/history-poitiers.html" rel="alternate"/><published>2024-09-01T00:00:00-05:00</published><updated>2024-09-01T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-09-01:/history-poitiers.html</id><summary type="html">&lt;p&gt;1356 -
During the Hundred Years' War
 King John II was
 captured at the Battle of Poitiers. This event largely signified the
 end of the first phase of the War. The English demanded a large
 ransom and territorial concession for John's release. In return, the
 English agreed to forsake any claim …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1356 -
During the Hundred Years' War
 King John II was
 captured at the Battle of Poitiers. This event largely signified the
 end of the first phase of the War. The English demanded a large
 ransom and territorial concession for John's release. In return, the
 English agreed to forsake any claim to the French throne.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="battle"/></entry><entry><title>History: Crecy</title><link href="https://2ad.com/history-crecy.html" rel="alternate"/><published>2024-08-25T00:00:00-05:00</published><updated>2024-08-25T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-08-25:/history-crecy.html</id><content type="html">&lt;p&gt;1346 -
The first decisive battle of the Hundred Years' War
 was at Crecy in northern France. Edward III of England
 soundly defeated Philip VI of France.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="battle"/></entry><entry><title>History: Hundred Years War</title><link href="https://2ad.com/history-hundred-years-war.html" rel="alternate"/><published>2024-08-18T00:00:00-05:00</published><updated>2024-08-18T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-08-18:/history-hundred-years-war.html</id><summary type="html">&lt;p&gt;1337-
 1461&lt;/p&gt;
&lt;p&gt;-
Growing
 tensions between the King of England, Edward III, and Philip VI of
 France resulted in a Hundred Years' War. Edward III was duke of
 Gascony, which meant he must swear allegiance as a vassal of the King
 of France, however, tensions between the two and political
 disagreements …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1337-
 1461&lt;/p&gt;
&lt;p&gt;-
Growing
 tensions between the King of England, Edward III, and Philip VI of
 France resulted in a Hundred Years' War. Edward III was duke of
 Gascony, which meant he must swear allegiance as a vassal of the King
 of France, however, tensions between the two and political
 disagreements over the fate of the territory of Gascony caused
 Edward to refuse allegiance and declare war on Phillip. The
 disputes waged on and off for more than one hundred years, until
 Joan of Arc intervened. Charles the dauphin, heir to the French
 Throne, was established as monarch in 1429
 and though the war
 waged on for two more decades, the tone for the conflict had been
 established and England was forced out of French territory by
 1461.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>History: Jacquerie</title><link href="https://2ad.com/history-jacquerie.html" rel="alternate"/><published>2024-08-11T00:00:00-05:00</published><updated>2024-08-11T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-08-11:/history-jacquerie.html</id><summary type="html">&lt;p&gt;The Jacquerie was a French peasant
 revolt which broke out in 1358.
 The peasants were frustrated
 with the turmoil that resulted from the Black Death
 and the
 Hundred Years' War. The peasants were persecuted by both Merchants, who
 lived off of peasant lands as they traveled, and the military who …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Jacquerie was a French peasant
 revolt which broke out in 1358.
 The peasants were frustrated
 with the turmoil that resulted from the Black Death
 and the
 Hundred Years' War. The peasants were persecuted by both Merchants, who
 lived off of peasant lands as they traveled, and the military who had
 deliberate policies to lay waste to peasant lands. Revolution was
 the natural result, however, the peasants were quickly quelled as
 the nobles exerted their power and authority, massacring and
 disbanding the rebels.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: EstatesGeneral</title><link href="https://2ad.com/history-estatesgeneral.html" rel="alternate"/><published>2024-08-04T00:00:00-05:00</published><updated>2024-08-04T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-08-04:/history-estatesgeneral.html</id><summary type="html">&lt;p&gt;The Estates-General or French Parliament was
 a political organization in the fourteenth century. The
 Estates-General was made up of representatives from clergy, nobility
 and the common people. The Estates-General did not hold significant
 power, and was mostly subordinate to the rule of the king. Since
 the burden of taxation weighted …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Estates-General or French Parliament was
 a political organization in the fourteenth century. The
 Estates-General was made up of representatives from clergy, nobility
 and the common people. The Estates-General did not hold significant
 power, and was mostly subordinate to the rule of the king. Since
 the burden of taxation weighted heavily on the French people, the
 Estates-General made a deal with the monarchy when an emergency
 increase in taxes was required to ransom King John II. The
 Estates-General acquiesced to the taxes, on condition that once the
 dauphin, John's son Charles, gained power, all taxation must be
 approved by the Estates-General. Though it was a valiant attempt,
 the political coalition eventually collapsed under the weight of the
 powerful monarch, Charles V.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Flagellant</title><link href="https://2ad.com/history-flagellant.html" rel="alternate"/><published>2024-07-28T00:00:00-05:00</published><updated>2024-07-28T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-07-28:/history-flagellant.html</id><summary type="html">&lt;p&gt;1348-
The Flagellant movement emerged as a
 result of the Black Death. The Flagellants believed that the Black
 Death was a punishment meted out by God to force atonement for the
 evils and sins of the European people. The Flagellant were
 especially popular in Germany. They wandered from town to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1348-
The Flagellant movement emerged as a
 result of the Black Death. The Flagellants believed that the Black
 Death was a punishment meted out by God to force atonement for the
 evils and sins of the European people. The Flagellant were
 especially popular in Germany. They wandered from town to town
 beating themselves with whips to win the forgiveness of God.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="movement"/></entry><entry><title>History: Black Death</title><link href="https://2ad.com/history-black-death.html" rel="alternate"/><published>2024-07-21T00:00:00-05:00</published><updated>2024-07-21T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-07-21:/history-black-death.html</id><content type="html">&lt;p&gt;The Black Death, 1350,
 was a devastating
 illness that spread rapidly through Europe resulting in millions of
 dead. The Black Death is estimated to have eliminated 25 to 50
 percent of the European population. The natural result was a
 economic, social, political and cultural calamity.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Alexander Nevsky</title><link href="https://2ad.com/history-alexander-nevsky.html" rel="alternate"/><published>2024-07-14T00:00:00-05:00</published><updated>2024-07-14T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-07-14:/history-alexander-nevsky.html</id><summary type="html">&lt;p&gt;1220-
1263
-
Russian prince of Novgorod,
 Alexander Nevsky, defeated a German invading army at Lake Peipus in
 northwestern Russia, 1242.
 Nevsky forged a political
 alliance with the Mongols and denounced his brother. The khan
 rewarded Nevsky by making him Grand Prince, later his descendants
 became the princes of Moscow and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1220-
1263
-
Russian prince of Novgorod,
 Alexander Nevsky, defeated a German invading army at Lake Peipus in
 northwestern Russia, 1242.
 Nevsky forged a political
 alliance with the Mongols and denounced his brother. The khan
 rewarded Nevsky by making him Grand Prince, later his descendants
 became the princes of Moscow and it's rulers.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Kievan Rus State</title><link href="https://2ad.com/history-kievan-rus-state.html" rel="alternate"/><published>2024-07-07T00:00:00-05:00</published><updated>2024-07-07T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-07-07:/history-kievan-rus-state.html</id><summary type="html">&lt;p&gt;The Kievan Rus state became formally
 Christian in 987 and prospered afterward. The Kievan society was
 dominated by a noble class of landowners. The noble population was made
 up of the Scandinavians, also known as the Rus, and the chiefs of
 the old Slavic Tribes. The Kievan Rus were free …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Kievan Rus state became formally
 Christian in 987 and prospered afterward. The Kievan society was
 dominated by a noble class of landowners. The noble population was made
 up of the Scandinavians, also known as the Rus, and the chiefs of
 the old Slavic Tribes. The Kievan Rus were free, however as in
 other regions, the peasant class had to endure hard labor and long hours.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Teutonic Knights</title><link href="https://2ad.com/history-teutonic-knights.html" rel="alternate"/><published>2024-06-30T00:00:00-05:00</published><updated>2024-06-30T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-30:/history-teutonic-knights.html</id><summary type="html">&lt;p&gt;The Teutonic Knights were established in the
 end of the twelfth century to protect the Christian Holy Land.
 These knights later used their military power to gain wealth
 by raiding and pillaging the Slavic nations in eastern Europe. The
 Teutonic Knights waged war on the Slavic peoples for thirty years …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Teutonic Knights were established in the
 end of the twelfth century to protect the Christian Holy Land.
 These knights later used their military power to gain wealth
 by raiding and pillaging the Slavic nations in eastern Europe. The
 Teutonic Knights waged war on the Slavic peoples for thirty years,
 until, by the end of the thirteenth century, most of the people of
 Prussia had been converted, killed or driven out by the knights.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>Announcement collectivexyz/foundry:v1.0.4</title><link href="https://2ad.com/collectivexyz-foundry-v1.0.4.html" rel="alternate"/><published>2024-06-28T00:00:00-05:00</published><updated>2024-06-28T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-28:/collectivexyz-foundry-v1.0.4.html</id><summary type="html">&lt;h1&gt;Collective Foundry v1.0.4&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.4. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Collective Foundry v1.0.4&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.4. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/collectivexyz/foundry/pkgs/container/foundry"&gt;Foundry Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: Magna Carta</title><link href="https://2ad.com/history-magna-carta.html" rel="alternate"/><published>2024-06-23T00:00:00-05:00</published><updated>2024-06-23T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-23:/history-magna-carta.html</id><summary type="html">&lt;h2&gt;1215&lt;/h2&gt;
&lt;p&gt;The Magna Carta was a great charter
 of feudal liberties. The Magna Carta was supported by the English
 nobility because it limited the power of the English monarchy. Much
 of the Magna Carta was aimed at preventing wrongful imprisonment,
 and to prevent the king from conducting executions or taking …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;1215&lt;/h2&gt;
&lt;p&gt;The Magna Carta was a great charter
 of feudal liberties. The Magna Carta was supported by the English
 nobility because it limited the power of the English monarchy. Much
 of the Magna Carta was aimed at preventing wrongful imprisonment,
 and to prevent the king from conducting executions or taking land,
 without sufficient reason. Some of these precepts survive to this day in
 modern constitutional law, including Amendment~4 in the
 United~States Constitution.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="writing"/></entry><entry><title>History: English parliament</title><link href="https://2ad.com/history-english-parliament.html" rel="alternate"/><published>2024-06-16T00:00:00-05:00</published><updated>2024-06-16T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-16:/history-english-parliament.html</id><summary type="html">&lt;p&gt;The English parliament established,
 1300,
 was one of the primarily democratizing influences in the
 English monarchy. Originally parliament was used to refer to the
 meeting of the kings council, however, Edward I invited two knights
 from every county and two representatives from each city and town
 to meet and consent …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The English parliament established,
 1300,
 was one of the primarily democratizing influences in the
 English monarchy. Originally parliament was used to refer to the
 meeting of the kings council, however, Edward I invited two knights
 from every county and two representatives from each city and town
 to meet and consent to new taxes.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>What if you get RIFed?</title><link href="https://2ad.com/terminated2024.html" rel="alternate"/><published>2024-06-10T00:00:00-05:00</published><updated>2024-06-10T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-10:/terminated2024.html</id><summary type="html">&lt;h2&gt;What to Do if You Get Terminated: Updated 2024&lt;/h2&gt;
&lt;p&gt;Facing termination can be one of the most challenging moments in your professional career. It's essential to approach this situation strategically and proactively to navigate your way to a new job successfully. Here’s a comprehensive guide on what to do …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;What to Do if You Get Terminated: Updated 2024&lt;/h2&gt;
&lt;p&gt;Facing termination can be one of the most challenging moments in your professional career. It's essential to approach this situation strategically and proactively to navigate your way to a new job successfully. Here’s a comprehensive guide on what to do if you find yourself terminated, specifically in the 2024 job market.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/ysfAFObjtJs?si=hscs1AKJr8mjWr3Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h3&gt;Do Everything&lt;/h3&gt;
&lt;p&gt;Don't wait.  Get out there!&lt;/p&gt;
&lt;h3&gt;Update Your CV&lt;/h3&gt;
&lt;p&gt;The first step is to update your CV. Ensure that it reflects your most recent experience, skills, and accomplishments. Tailor it to highlight the qualifications and expertise relevant to the jobs you're targeting.&lt;/p&gt;
&lt;h3&gt;Finalize Details with Your Previous Employer&lt;/h3&gt;
&lt;p&gt;Before moving forward, finalize all details with your previous employer:
- &lt;strong&gt;Signed Agreements:&lt;/strong&gt; Make sure all agreements, such as severance packages, are signed and documented.
- &lt;strong&gt;Expenses and Hardware:&lt;/strong&gt; Clear any outstanding expenses and return any company hardware or equipment.
- &lt;strong&gt;Share Once Finalized:&lt;/strong&gt; Wait until all details are finalized before sharing your departure with your network.&lt;/p&gt;
&lt;h3&gt;Invest in Yourself&lt;/h3&gt;
&lt;p&gt;Use this time to invest in your personal and professional growth:
- &lt;strong&gt;Learn New Skills:&lt;/strong&gt; Platforms like YouTube offer countless tutorials. Consider learning a new programming language or enhancing your current skill set.
- &lt;strong&gt;Study and Cram:&lt;/strong&gt; Deepen your knowledge of the languages and skills you already possess. This will help you during technical interviews.&lt;/p&gt;
&lt;h3&gt;Take Every Meeting&lt;/h3&gt;
&lt;p&gt;It's essential to attend every interview and meeting:
- &lt;strong&gt;Practice Makes Perfect:&lt;/strong&gt; Understand that you won’t get every job. However, each interview is a learning opportunity.
- &lt;strong&gt;Gain Experience:&lt;/strong&gt; The more interviews you attend, the better you become at presenting yourself and your skills.&lt;/p&gt;
&lt;h3&gt;Be in it for the Long Haul&lt;/h3&gt;
&lt;p&gt;Job hunting can be a marathon. Maybe it's even an ultra-marathon.  Be prepared for numerous interviews and applications before you secure the right position.&lt;/p&gt;
&lt;h3&gt;Clean Up Your Profiles&lt;/h3&gt;
&lt;p&gt;Your online presence matters:
- &lt;strong&gt;GitHub:&lt;/strong&gt; Ensure your GitHub profile is up-to-date with your latest projects and contributions.
- &lt;strong&gt;LinkedIn:&lt;/strong&gt; Update your LinkedIn profile to reflect your most recent experiences and skills.&lt;/p&gt;
&lt;h3&gt;Apply Directly to Employers You Want&lt;/h3&gt;
&lt;p&gt;Identify companies that align with your career goals and apply directly to them. Tailor your applications to demonstrate how you fit their specific needs.&lt;/p&gt;
&lt;h3&gt;Leverage AI for Custom Cover Letters&lt;/h3&gt;
&lt;p&gt;Use AI tools to create customized cover letters for each role you apply to. Tailor your CV to match the job descriptions and highlight relevant experience.&lt;/p&gt;
&lt;h3&gt;Work LinkedIn&lt;/h3&gt;
&lt;p&gt;LinkedIn is a powerful tool for job seekers:
- &lt;strong&gt;Daily Login:&lt;/strong&gt; Log in every day to stay updated and engaged.
- &lt;strong&gt;Engage:&lt;/strong&gt; Comment on posts and provide positive feedback to others in your network.&lt;/p&gt;
&lt;h3&gt;Work GitHub&lt;/h3&gt;
&lt;p&gt;Active participation on GitHub can enhance your visibility:
- &lt;strong&gt;Open Source Projects:&lt;/strong&gt; Create small open source projects to showcase your skills.
- &lt;strong&gt;Contributions:&lt;/strong&gt; Contribute to existing open source projects to demonstrate your expertise and collaborative abilities.&lt;/p&gt;
&lt;h3&gt;Talk to Good Recruiters&lt;/h3&gt;
&lt;p&gt;Good recruiters can be invaluable:
- &lt;strong&gt;Market Insight:&lt;/strong&gt; They have in-depth knowledge of the current job market and available opportunities.
- &lt;strong&gt;Industry Knowledge:&lt;/strong&gt; Leverage their expertise to gain intel on job openings and industry trends.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Getting terminated is a challenging experience, but it can also be a turning point in your career. By taking a comprehensive and proactive approach, updating your skills, leveraging your network, and staying persistent, you can navigate this period effectively and find new opportunities. Remember, it's about the long haul, so stay focused and motivated on your journey to your next role.&lt;/p&gt;</content><category term="tech"/></entry><entry><title>History: Frederick Barbarossa</title><link href="https://2ad.com/history-frederick-barbarossa.html" rel="alternate"/><published>2024-06-09T00:00:00-05:00</published><updated>2024-06-09T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-09:/history-frederick-barbarossa.html</id><summary type="html">&lt;p&gt;1152-
1190
-
Frederick Barbarossa,
 known as Fredrick I, was a powerful lord who was elected king in
 Central Europe. Frederick wanted to further incorporate Italy into
 the German kingdom to form a Holy Empire or Holy Roman Empire. The
 papal states and northern Italian cities resisted and Fredrick was
 defeated …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1152-
1190
-
Frederick Barbarossa,
 known as Fredrick I, was a powerful lord who was elected king in
 Central Europe. Frederick wanted to further incorporate Italy into
 the German kingdom to form a Holy Empire or Holy Roman Empire. The
 papal states and northern Italian cities resisted and Fredrick was
 defeated at Legnano in 1176.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Thomas Becket</title><link href="https://2ad.com/history-thomas-becket.html" rel="alternate"/><published>2024-06-02T00:00:00-05:00</published><updated>2024-06-02T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-06-02:/history-thomas-becket.html</id><summary type="html">&lt;h2&gt;1160&lt;/h2&gt;
&lt;p&gt;Thomas Becket was archbishop of
 Canterbury in the twelfth century. Becket was England's highest
 ranking cleric when he became embroiled in a political
 controversy. The powerful king, Henry II, 1154-
1189,
 wanted
 the right to punish clergy in the royal court. However, Becket
 resisted claiming that only the church …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;1160&lt;/h2&gt;
&lt;p&gt;Thomas Becket was archbishop of
 Canterbury in the twelfth century. Becket was England's highest
 ranking cleric when he became embroiled in a political
 controversy. The powerful king, Henry II, 1154-
1189,
 wanted
 the right to punish clergy in the royal court. However, Becket
 resisted claiming that only the church should have the right to
 punish clergy. Failing at compromise, the two officials struggled
 openly until Henry plead for someone to rid him of the archbishop.
 Four knights consented and assassinated Becket, resulting in a
 resolution to the controversy.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Domesday Book</title><link href="https://2ad.com/history-domesday-book.html" rel="alternate"/><published>2024-05-26T00:00:00-05:00</published><updated>2024-05-26T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-05-26:/history-domesday-book.html</id><content type="html">&lt;p&gt;1086-
The Domesday book listed the exact holdings
 of individual English families. The Domesday book allowed William
 of Normandy to take taxes based on each individuals wealth.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="writing"/></entry><entry><title>History: William of Normandy</title><link href="https://2ad.com/history-william-of-normandy.html" rel="alternate"/><published>2024-05-19T00:00:00-05:00</published><updated>2024-05-19T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-05-19:/history-william-of-normandy.html</id><summary type="html">&lt;p&gt;1066-
1087
-
William of Normandy
 defeated the English king Harold Godwinson at Hastings,
 October 14, 1066.
 William was crowned king of England, and
 proceeded to take control of the nation. William annexed large
 tracts of land on behalf of the Normans and became one of the
 largest holders of English …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1066-
1087
-
William of Normandy
 defeated the English king Harold Godwinson at Hastings,
 October 14, 1066.
 William was crowned king of England, and
 proceeded to take control of the nation. William annexed large
 tracts of land on behalf of the Normans and became one of the
 largest holders of English land. William commissioned a work known as the
 Domesday Book
 in 1086.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: troubadours</title><link href="https://2ad.com/history-troubadours.html" rel="alternate"/><published>2024-05-12T00:00:00-05:00</published><updated>2024-05-12T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-05-12:/history-troubadours.html</id><summary type="html">&lt;p&gt;A troubadour was a strolling minstrel or lyric
 poet. Troubadours were French, Italian and Spanish composers who
 sang and wrote about courtly love.&lt;/p&gt;
&lt;p&gt;Romanesque and Gothic
 cathedrals are typified by two distinct types of architecture. The
 Romanesque cathedral was usually a rectangular basilica style
 similar to a fortress or castle …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A troubadour was a strolling minstrel or lyric
 poet. Troubadours were French, Italian and Spanish composers who
 sang and wrote about courtly love.&lt;/p&gt;
&lt;p&gt;Romanesque and Gothic
 cathedrals are typified by two distinct types of architecture. The
 Romanesque cathedral was usually a rectangular basilica style
 similar to a fortress or castle. The Romanesque cathedral was
 limited in size because of the weaknesses of its rectangular,
 monolithic, construction.
 Gothic cathedrals superseded the limitations of the Romanesque
 cathedrals and could be built much taller.
 The Gothic cathedral is typified by spires, arched or domed ceilings
 and the architectural feature known as 'flying buttresses.' Flying
 buttresses supported the walls of the tallest cathedrals and
 allowed the cathedral to be built taller with thinner walls.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: universitas</title><link href="https://2ad.com/history-universitas.html" rel="alternate"/><published>2024-05-05T00:00:00-05:00</published><updated>2024-05-05T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-05-05:/history-universitas.html</id><content type="html">&lt;p&gt;Universitas is a Latin word which
 refereed to a corporation or guild of students or teachers. The
 univseritas evolved into our modern notion of the
 University. Universities developed in the middle ages, and several
 were established by the eleventh and twelve centuries.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: scholasticism</title><link href="https://2ad.com/history-scholasticism.html" rel="alternate"/><published>2024-04-28T00:00:00-05:00</published><updated>2024-04-28T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-28:/history-scholasticism.html</id><content type="html">&lt;p&gt;Scholasticism is the philosophical and
 theological system used in medieval schools. Scholasticism
 developed in the eleventh and twelfth centuries along with the
 university. One of the primary tenants of scholasticism was an
 attempt to reconcile faith and reason.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>Announcement collectivexyz/foundry:v1.0.2</title><link href="https://2ad.com/collectivexyz-foundry-v1.0.2.html" rel="alternate"/><published>2024-04-25T00:00:00-05:00</published><updated>2024-04-25T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-25:/collectivexyz-foundry-v1.0.2.html</id><summary type="html">&lt;h1&gt;Collective Foundry v1.0.2&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.2. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Collective Foundry v1.0.2&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.2. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/collectivexyz/foundry/pkgs/container/foundry"&gt;Foundry Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: burghers</title><link href="https://2ad.com/history-burghers.html" rel="alternate"/><published>2024-04-21T00:00:00-05:00</published><updated>2024-04-21T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-21:/history-burghers.html</id><content type="html">&lt;p&gt;A burgher is a member of the middle class in a
 European city, especially during the high middle ages, . The
 burgher class was principally composed of merchants and trades people.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>When should we heed warnings?</title><link href="https://2ad.com/when-should-we-heed-warnings.html" rel="alternate"/><published>2024-04-15T00:00:00-05:00</published><updated>2023-07-07T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-15:/when-should-we-heed-warnings.html</id><content type="html">&lt;p&gt;I believe Captain Smith should have heeded warnings about ice in the North Atlantic and slowed down or stopped the Titanic.   Don't you?&lt;/p&gt;</content><category term="update"/><category term="survival"/></entry><entry><title>Announcement collectivexyz/foundry:v1.0.1</title><link href="https://2ad.com/collectivexyz-foundry-v1.0.1.html" rel="alternate"/><published>2024-04-14T00:00:00-05:00</published><updated>2024-04-14T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-14:/collectivexyz-foundry-v1.0.1.html</id><summary type="html">&lt;h1&gt;Collective Foundry v1.0.1&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.1. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Collective Foundry v1.0.1&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.1. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/collectivexyz/foundry/pkgs/container/foundry"&gt;Foundry Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: guilds</title><link href="https://2ad.com/history-guilds.html" rel="alternate"/><published>2024-04-14T00:00:00-05:00</published><updated>2024-04-14T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-14:/history-guilds.html</id><summary type="html">&lt;p&gt;Craft guilds played a key role in the production of
 material goods in the middle ages, . Craft guilds established
 standards for production of goods and labor practices. Craft guilds
 also established fixed prices for the sale of goods. The guild
 process involved a training hierarchy where a person would start …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Craft guilds played a key role in the production of
 material goods in the middle ages, . Craft guilds established
 standards for production of goods and labor practices. Craft guilds
 also established fixed prices for the sale of goods. The guild
 process involved a training hierarchy where a person would start as
 an apprentice, later advance to become a journeyman, and finally
 finish a master work to become a master of their craft.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Charters of Liberties</title><link href="https://2ad.com/history-charters-of-liberties.html" rel="alternate"/><published>2024-04-07T00:00:00-05:00</published><updated>2024-04-07T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-04-07:/history-charters-of-liberties.html</id><content type="html">&lt;p&gt;Charters of liberties were legal
 documents which illustrated the relative freedoms of individuals.
 The Magna Carta
 is known as one of the greatest feudal
 charters of liberties.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Fairs of Champagne</title><link href="https://2ad.com/history-fairs-of-champagne.html" rel="alternate"/><published>2024-03-31T00:00:00-05:00</published><updated>2024-03-31T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-31:/history-fairs-of-champagne.html</id><content type="html">&lt;h2&gt;1100&lt;/h2&gt;
&lt;p&gt;The trading fairs of
 Champagne were the largest marketplaces in western Europe. Champagne
 hosted fairs annually as part of a French program to increase
 trade. Merchants were promised protection from harm and reduced
 taxes, while the state enjoyed increased commercial activity.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="event"/></entry><entry><title>History: Saladin</title><link href="https://2ad.com/history-saladin.html" rel="alternate"/><published>2024-03-24T00:00:00-05:00</published><updated>2024-03-24T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-24:/history-saladin.html</id><content type="html">&lt;p&gt;1169-
Saladin lead Sunni Muslims of Syria in an
 invasion of Egypt and ended the Fatimid caliphate. Saladin's
 forces also invaded Jerusalem, Palestine and Tripoli. The fall of
 Jerusalem led to a 'third crusade.'&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>History: Peasants Crusade</title><link href="https://2ad.com/history-peasants-crusade.html" rel="alternate"/><published>2024-03-17T00:00:00-05:00</published><updated>2024-03-17T00:00:00-05:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-17:/history-peasants-crusade.html</id><summary type="html">&lt;p&gt;After Pope Urban II called the people
 to arms against Infidels, Peter the Hermit, a man who had holy
 visions, incited a large mob to take up a crusade in eastern Europe.
 The mob was made up largely of the poor and thus was referred to as a
 "Peasant's Crusade …&lt;/p&gt;</summary><content type="html">&lt;p&gt;After Pope Urban II called the people
 to arms against Infidels, Peter the Hermit, a man who had holy
 visions, incited a large mob to take up a crusade in eastern Europe.
 The mob was made up largely of the poor and thus was referred to as a
 "Peasant's Crusade."&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Seljuk Turks</title><link href="https://2ad.com/history-seljuk-turks.html" rel="alternate"/><published>2024-03-10T00:00:00-06:00</published><updated>2024-03-10T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-10:/history-seljuk-turks.html</id><content type="html">&lt;p&gt;Central Asia-
The Seljuk turks were a people who
 converted to Islam. The Seljuk Turks were persecuted by Pope Urban
 II in a crusade. In the eleventh century the Seljuk turks took over
 the eastern provinces of the Abbasid empire. In 1055
 a
 Turkish leader captured Baghdad.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="people"/></entry><entry><title>Announcement cpp:v1.0.18</title><link href="https://2ad.com/cppdev-v1.0.18.html" rel="alternate"/><published>2024-03-05T00:00:00-06:00</published><updated>2024-03-05T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-05:/cppdev-v1.0.18.html</id><summary type="html">&lt;h1&gt;C++ Dev v1.0.18&lt;/h1&gt;
&lt;p&gt;&lt;img alt="C++" src="https://2ad.com/images/universe/c++.png"&gt;&lt;/p&gt;
&lt;h2&gt;cppdev is now simply cpp&lt;/h2&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.18. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;C++ Dev v1.0.18&lt;/h1&gt;
&lt;p&gt;&lt;img alt="C++" src="https://2ad.com/images/universe/c++.png"&gt;&lt;/p&gt;
&lt;h2&gt;cppdev is now simply cpp&lt;/h2&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.18. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/cpp/pkgs/container/cpp/187096789?tag=v1.0.18"&gt;C++ Dev Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: Pope Urban II</title><link href="https://2ad.com/history-pope-urban-ii.html" rel="alternate"/><published>2024-03-03T00:00:00-06:00</published><updated>2024-03-03T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-03:/history-pope-urban-ii.html</id><content type="html">&lt;p&gt;1088-
1099
-
At the Council of Clermont,
 Urban II urged Christians to take up weapons against infidels and
 to create a holy war against the Seljuk Turks.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>Hash It! - unix utilities that should exist</title><link href="https://2ad.com/hash-it.html" rel="alternate"/><published>2024-03-01T00:00:00-06:00</published><updated>2024-03-01T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-01:/hash-it.html</id><summary type="html">&lt;h1&gt;Introducing hashit: A Command-Line Utility for Hashing Text Columns&lt;/h1&gt;
&lt;p&gt;I'm excited to announce a new command line utility.  I was thinking of tools that should be part of unix but aren't already.  This lead me to thinking about hash functions and how to create hashes on lists of strings easily …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Introducing hashit: A Command-Line Utility for Hashing Text Columns&lt;/h1&gt;
&lt;p&gt;I'm excited to announce a new command line utility.  I was thinking of tools that should be part of unix but aren't already.  This lead me to thinking about hash functions and how to create hashes on lists of strings easily, thus: &lt;strong&gt;hashit&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;What is hashit?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;hashit&lt;/strong&gt; is a command-line utility designed to process columns of text into hash values, supporting both SHA3 and SHA256 algorithms. Developed with versatility and ease of use in mind, hashit offers an easy way to transform columns of data into columns of hashes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;hash columns of text using sha3 (default) or sha256

Usage: hashit [OPTIONS]

Options:
      --sha256   
  -v, --verbose  
  -h, --help     Print help
  -V, --version  Print version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Whether you're working on securing application data, verifying integrity, or simply need a quick way to hash information, hashit provides a robust toolset to meet your needs.   It is developed fully in Rust, therefore it has natural security and performance advantages.&lt;/p&gt;
&lt;h2&gt;Key Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support for SHA3 and SHA256:&lt;/strong&gt; Choose the hashing algorithm that best fits your requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command-Line Efficiency:&lt;/strong&gt; Process large volumes of text quickly and efficiently directly from your terminal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy Installation:&lt;/strong&gt; With Rust as its backbone, installing hashit is as simple as cloning the repository and using Cargo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting Started with hashit&lt;/h2&gt;
&lt;p&gt;To get started with hashit, visit our GitHub repository at &lt;a href="https://github.com/jac18281828/hashit"&gt;https://github.com/jac18281828/hashit&lt;/a&gt;. Here, you'll find all the information needed to install, build, and start using hashit in your projects.&lt;/p&gt;
&lt;p&gt;Installation is easy if you have Rust installed on your machine. If not, follow the instructions on the &lt;a href="https://www.rust-lang.org/tools/install"&gt;official Rust website&lt;/a&gt; to get set up. Once Rust is ready, clone the hashit repository, and you're just a few steps away from hashing your text data.&lt;/p&gt;
&lt;h2&gt;How Can You Contribute?&lt;/h2&gt;
&lt;p&gt;hashit is open to contributions! If you're interested in improving the tool, fixing bugs, adding features, or enhancing documentation, your contributions are welcome. We believe in the power of community-driven development to create more robust and versatile tools. Check out the contributing section in our repository for guidelines on how to make your mark on hashit.&lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;hashit is released under the &lt;a href="https://github.com/jac18281828/hashit/blob/main/LICENSE"&gt;BSD-3-Clause&lt;/a&gt;, promoting open usage and contribution.&lt;/p&gt;
&lt;h2&gt;Why hashit?&lt;/h2&gt;
&lt;p&gt;In the creation of hashit, my goal was to provide a simple, yet powerful tool that could be easily integrated into various workflows. In particular, it supports pipelines as are common in unix environments.  By offering support for popular hashing algorithms and ensuring a user-friendly experience, I'm confident that hashit will become a valueable command line tool&lt;/p&gt;
&lt;p&gt;I'm excited to see how hashit will be used and look forward to engaging with our users to continue improving and expanding its capabilities. Your feedback and contributions are what will make hashit truly great.&lt;/p&gt;
&lt;p&gt;Why wait? Head over to our &lt;a href="https://github.com/jac18281828/hashit"&gt;GitHub repository&lt;/a&gt;, give hashit a try, and start hashing it today!&lt;/p&gt;</content><category term="update"/></entry><entry><title>trimtrain - unix utilities that should exist</title><link href="https://2ad.com/trimtrain.html" rel="alternate"/><published>2024-03-01T00:00:00-06:00</published><updated>2024-03-01T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-03-01:/trimtrain.html</id><summary type="html">&lt;h1&gt;Introducing trimtrain: An Efficient Tool for Space Normalization&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;trimtrain&lt;/code&gt; allows you to clean and normalize a dataset so that all data is separated by single spaces for further text processing.&lt;/p&gt;
&lt;h3&gt;Key Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;: &lt;code&gt;trimtrain&lt;/code&gt; is designed with simplicity in mind. It does one thing and does it well - normalizing data …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Introducing trimtrain: An Efficient Tool for Space Normalization&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;trimtrain&lt;/code&gt; allows you to clean and normalize a dataset so that all data is separated by single spaces for further text processing.&lt;/p&gt;
&lt;h3&gt;Key Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;: &lt;code&gt;trimtrain&lt;/code&gt; is designed with simplicity in mind. It does one thing and does it well - normalizing data columns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Whether you're working with text files that have spaces or tabs as separators, &lt;code&gt;trimtrain&lt;/code&gt; seamlessly handles both, making your data uniformly spaced.   The output separator is configurable for different workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: Optimized for performance, &lt;code&gt;trimtrain&lt;/code&gt; can process large files quickly, making it a highly useful tool in your data processing toolkit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Getting Started with trimtrain&lt;/h3&gt;
&lt;p&gt;Getting &lt;code&gt;trimtrain&lt;/code&gt; up and running is straightforward. The utility is written in C++ and can be compiled and installed on any system with a few simple commands. Here's how to get started:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clone the repository&lt;/strong&gt;: First, clone the &lt;code&gt;trimtrain&lt;/code&gt; repository from GitHub:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/jac18281828/trimtrain.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trimtrain
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Build &lt;code&gt;trimtrain&lt;/code&gt;&lt;/strong&gt;: Compile the source code using the &lt;code&gt;make&lt;/code&gt; command:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;build
cmake&lt;span class="w"&gt; &lt;/span&gt;-H.&lt;span class="w"&gt; &lt;/span&gt;-Bbuild&lt;span class="w"&gt; &lt;/span&gt;-DPROJECT_NAME&lt;span class="o"&gt;=&lt;/span&gt;trimtrain&lt;span class="w"&gt; &lt;/span&gt;-DCMAKE_BUILD_TYPE&lt;span class="o"&gt;=&lt;/span&gt;RELEASE&lt;span class="w"&gt; &lt;/span&gt;-DCMAKE_VERBOSE_MAKEFILE&lt;span class="o"&gt;=&lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;-Wno-dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-GUnix Makefiles&amp;quot;&lt;/span&gt;
make&lt;span class="w"&gt; &lt;/span&gt;-j
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt;: Finally, install &lt;code&gt;trimtrain&lt;/code&gt; into your system's standard executable path:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once installed, using &lt;code&gt;trimtrain&lt;/code&gt; is as simple as piping input into it. For more detailed usage instructions, refer to the &lt;a href="https://github.com/jac18281828/trimtrain"&gt;README&lt;/a&gt; file in the GitHub repository.&lt;/p&gt;
&lt;h3&gt;Contributing to trimtrain&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;trimtrain&lt;/code&gt; is open-source and community-driven. Contributions are not only welcome but also encouraged. Whether you're interested in fixing bugs, suggesting enhancements, or adding new features, your input is valuable. &lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;trimtrain&lt;/code&gt; is a simple yet powerful utility for normalizing space separated data.&lt;/p&gt;</content><category term="update"/></entry><entry><title>Announcement collectivexyz/foundry:v1.0.0</title><link href="https://2ad.com/collectivexyz-foundry-v1.0.0.html" rel="alternate"/><published>2024-02-26T00:00:00-06:00</published><updated>2024-02-26T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-26:/collectivexyz-foundry-v1.0.0.html</id><summary type="html">&lt;h1&gt;Collective Foundry v1.0.0&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Collective Foundry v1.0.0&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Foundry" src="https://2ad.com/images/universe/foundry.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.0.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/collectivexyz/foundry/pkgs/container/foundry"&gt;Foundry Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>Create and Edit Hyperlinks in Emacs Org Mode</title><link href="https://2ad.com/org-hyperlinks.html" rel="alternate"/><published>2024-02-26T00:00:00-06:00</published><updated>2024-02-26T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-26:/org-hyperlinks.html</id><content type="html">&lt;p&gt;Create and &lt;a href="https://youtube.com/shorts/sJrFp_RYN8U"&gt;edit hyperlinks&lt;/a&gt; in Emacs Org Mode&lt;/p&gt;
&lt;iframe width="679" height="1207" src="https://www.youtube.com/embed/sJrFp_RYN8U" title="Edit Hyperlinks in Emacs Org Mode #Emacs #Org" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="update"/><category term="emacs"/><category term="org"/></entry><entry><title>Announcement rust:v1.76.0_1</title><link href="https://2ad.com/rust-v1.76.0_1.html" rel="alternate"/><published>2024-02-26T00:00:00-06:00</published><updated>2024-02-26T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-26:/rust-v1.76.0_1.html</id><summary type="html">&lt;h1&gt;Rust Dev v1.76.0&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.76.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Rust Dev v1.76.0&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.76.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/rust/pkgs/container/rust"&gt;Rust Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: Albignesians</title><link href="https://2ad.com/history-albignesians.html" rel="alternate"/><published>2024-02-25T00:00:00-06:00</published><updated>2024-02-25T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-25:/history-albignesians.html</id><content type="html">&lt;p&gt;The Albignesians were labeled heretics by Pope
 Innocent III in 1209. This began a bloody persecution of the people
 including the destruction of entire cities. Many Albignesian
 leaders were stripped of their land, and their people were sacrificed
 by Christian crusaders.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Dominicans</title><link href="https://2ad.com/history-dominicans.html" rel="alternate"/><published>2024-02-18T00:00:00-06:00</published><updated>2024-02-18T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-18:/history-dominicans.html</id><content type="html">&lt;p&gt;1215-
The Spanish priest, Dominic de Guzm'an,
 1170-
1221,
 established the order of the Dominicans. Dominic
 believed that monks should be educated to defend against the many
 heresies of the middle ages.&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="movement"/></entry><entry><title>History: Frances of Assisi</title><link href="https://2ad.com/history-frances-of-assisi.html" rel="alternate"/><published>2024-02-11T00:00:00-06:00</published><updated>2024-02-11T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-11:/history-frances-of-assisi.html</id><content type="html">&lt;p&gt;1182-
1226
-
Saint Francis of Assisi
 was an Italian man who abandoned his wealth and worldly possessions
 to preach in poverty. Frances' charm attracted many followers who
 took vows of poverty. Pope Innocent III established the group as
 the order of Franciscan Friars.&lt;/p&gt;
&lt;p&gt;monks, dynasty, people?&lt;/p&gt;</content><category term="history"/><category term="history"/><category term="person"/></entry><entry><title>Announcement rustdev:v1.76.0</title><link href="https://2ad.com/rustdev-v1.76.0.html" rel="alternate"/><published>2024-02-09T00:00:00-06:00</published><updated>2024-02-09T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-09:/rustdev-v1.76.0.html</id><summary type="html">&lt;h1&gt;Rust Dev v1.76.0&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Rust" src="https://www.rust-lang.org/static/images/rust-logo-blk.svg"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.76.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Rust Dev v1.76.0&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Rust" src="https://www.rust-lang.org/static/images/rust-logo-blk.svg"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 1.76.0. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/rustdev/pkgs/container/rustdev/177154577?tag=v1.76.0"&gt;Rust Dev Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>Announcement solc:v0.8.24</title><link href="https://2ad.com/solc-v0.8.24.html" rel="alternate"/><published>2024-02-09T00:00:00-06:00</published><updated>2024-02-09T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-09:/solc-v0.8.24.html</id><summary type="html">&lt;h1&gt;Solc 0.8.24&lt;/h1&gt;
&lt;p&gt;&lt;img alt="solc" src="https://2ad.com/images/universe/solc.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 0.8.24. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;Solc 0.8.24&lt;/h1&gt;
&lt;p&gt;&lt;img alt="solc" src="https://2ad.com/images/universe/solc.png"&gt;&lt;/p&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 0.8.24. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/solc/pkgs/container/solc/177129749?tag=v0.8.24"&gt;SOLC Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>Announcement tsdev:v20.11.0</title><link href="https://2ad.com/tsdev-v20.11.0.html" rel="alternate"/><published>2024-02-09T00:00:00-06:00</published><updated>2024-02-09T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-09:/tsdev-v20.11.0.html</id><summary type="html">&lt;h1&gt;tsdev 20.11.0&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 18.17.1. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1&gt;tsdev 20.11.0&lt;/h1&gt;
&lt;p&gt;Dear valued customers,&lt;/p&gt;
&lt;p&gt;We are pleased to announce the release of our new container version 18.17.1. This new version includes several new features and improvements that will make your container experience even better.&lt;/p&gt;
&lt;p&gt;Some of the new features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved security&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Enhanced reliability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have also made several improvements to the user interface, making it easier to use and more intuitive.&lt;/p&gt;
&lt;p&gt;We hope you enjoy using our new container release. If you have any questions or feedback, please don't hesitate to contact us.&lt;/p&gt;
&lt;p&gt;Best regards,
jac18281828&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/jac18281828/tsdev/pkgs/container/tsdev/177044008?tag=v20.11.0"&gt;TS Dev Release&lt;/a&gt;&lt;/p&gt;</content><category term="update"/></entry><entry><title>History: excommunicationinterdict</title><link href="https://2ad.com/history-excommunicationinterdict.html" rel="alternate"/><published>2024-02-04T00:00:00-06:00</published><updated>2024-02-04T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-02-04:/history-excommunicationinterdict.html</id><summary type="html">&lt;p&gt;Excommunication is the formal process of banning someone from attending
 church. Excommunication was seen as one of the severest penalties
 in the middle ages. Persons could be excommunicated for committing
 any of a number of sins, after which, a church official would
 formally forbid them from returning to the church …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Excommunication is the formal process of banning someone from attending
 church. Excommunication was seen as one of the severest penalties
 in the middle ages. Persons could be excommunicated for committing
 any of a number of sins, after which, a church official would
 formally forbid them from returning to the church. Interdict
 was a form of punishment for a people or nation. The people subject
 to interdict could not partake in several important sacraments.
 In accord with the common belief system, this would hold serious
 consequences in the afterlife.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: seven sacraments</title><link href="https://2ad.com/history-seven-sacraments.html" rel="alternate"/><published>2024-01-28T00:00:00-06:00</published><updated>2024-01-28T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-01-28:/history-seven-sacraments.html</id><content type="html">&lt;p&gt;The seven sacraments are important worldly
 symbols of ones faith and devotion to the Catholic church. The
 seven sacraments include baptism, marriage, and penance for ones
 sins.&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry><entry><title>History: Indulgences in the Middle Ages</title><link href="https://2ad.com/history-indulgences-in-the-middle-ages.html" rel="alternate"/><published>2024-01-21T00:00:00-06:00</published><updated>2024-01-21T00:00:00-06:00</updated><author><name>John A Cairns</name></author><id>tag:2ad.com,2024-01-21:/history-indulgences-in-the-middle-ages.html</id><summary type="html">&lt;p&gt;Indulgences were granted to persons who
 committed sins against the Catholic church. Indulgences were
 granted to allow an individual penance from their sins. All or a
 portion of the punishment the person would have received in the
 afterlife is waived in exchange for church contributions or good
 deeds. The practice …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Indulgences were granted to persons who
 committed sins against the Catholic church. Indulgences were
 granted to allow an individual penance from their sins. All or a
 portion of the punishment the person would have received in the
 afterlife is waived in exchange for church contributions or good
 deeds. The practice of granting indulgences became very popular in
 the high middle ages, .&lt;/p&gt;</content><category term="history"/><category term="definition"/><category term="dictionary"/></entry></feed>