jverkamp.comhttps://blog.jverkamp.com/Recent content on jverkamp.comHugo -- gohugo.ioen-usMon, 07 Oct 2024 00:00:00 +0000Ludum Dare(ish) 56: BugShinehttps://blog.jverkamp.com/2024/10/07/ludum-dareish-56-bugshine/Mon, 07 Oct 2024 00:00:00 +0000https://blog.jverkamp.com/2024/10/07/ludum-dareish-56-bugshine/<p><a href="https://blog.jverkamp.com/series/ludum-dare/">Ludum Dare</a>? That&rsquo;s been a while!</p> <p>I didn&rsquo;t actually enter the game jam. Honestly, I wasn&rsquo;t sure I was going to write anything. But I had a bit of an idea and spent a few hours only on Sunday hammering something out:</p> <p><video width=100% controls src="https://blog.jverkamp.com/embeds/games/ludum-dare/56/bugshine.mp4"></video></p> <p>Yeah, I did another cellular automata thing 😄</p> <p>It&rsquo;s not at all complete, but the basic idea is:</p> <ul> <li>Generate a random level</li> <li>See it with multiple players (colonies of bugs)</li> <li>Each bug will send out waves of &lsquo;shine&rsquo;, expanding their territory</li> <li>Take over the map to win</li> </ul> <p>It&rsquo;s sort of got that?</p> <p>I&rsquo;m using Rust as I&rsquo;ve been doing a lot recently.</p> <p>The main libraries are:</p> <ul> <li><a href="https://docs.rs/pixels/latest/pixels/" target="_blank" rel="noopener">pixels</a> for the rendering; it gives me direct access to a pixel buffer, which is my favorite</li> <li><a href="https://docs.rs/winit/latest/winit/" target="_blank" rel="noopener">winit</a> for windowing; this did require the feature <code>rwh_05</code> to be properly compatible with <code>pixels</code>, which took a minute to track down</li> </ul> <p>Other than, that, it&rsquo;s straight custom code which you can see in it&rsquo;s entirety on <a href="https://github.com/jpverkamp/bug-shine" target="_blank" rel="noopener">my github</a>.</p> <ul> <li><a href="https://github.com/jpverkamp/bug-shine/blob/main/src/main.rs" target="_blank" rel="noopener">main.rs</a> - creates the window and handles input</li> <li><a href="https://github.com/jpverkamp/bug-shine/blob/main/src/world.rs" target="_blank" rel="noopener">world.rs</a> - runs the simulation mostly in an <code>update</code> function; with generation in <code>new</code></li> </ul> <p>I think that perhaps the only really interesting bit about the code is how the &lsquo;shine waves&rsquo; work. Basically, I have a grid of the state of each cell, but I also have a <code>Vec</code> that tracks &lsquo;active&rsquo; pixels. Those are the only ones that can update&ndash;which both helps performance and makes the simulation appear the way it does.</p> <p>Overall, a nice quick project. More than anything, it actually convinced me to try setting up something that can render pixel buffers on Rust. And with a (very minimal) GUI, too! Both things I&rsquo;ve been meaning to learn.</p> <p>I probably won&rsquo;t do anything more with this code, but it&rsquo;s got the seeds of something more interesting. Keep an eye out. 😄</p> <p>Onward!</p> <figure><img src="https://blog.jverkamp.com/embeds/games/ludum-dare/56/bugshine.png"/> </figure>Finish Myself a Grephttps://blog.jverkamp.com/2024/10/05/finish-myself-a-grep/Sat, 05 Oct 2024 00:00:00 +0000https://blog.jverkamp.com/2024/10/05/finish-myself-a-grep/<p>Hey, I said that I would follow up on my post about <a href="https://blog.jverkamp.com/2024/08/28/codecrafters-build-myself-a-grep/">Building Myself a Grep</a>&hellip; well here it is!</p> <p>And I&rsquo;m actually surprised with myself in how far I actually made it!</p> <p>You can see the current state of my code <a href="https://github.com/jpverkamp/jp-grep" target="_blank" rel="noopener">on Github</a>. You can install it from that repo (checked out) with <code>cargo install --path .</code></p> <p>I mostly worked off the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions" target="_blank" rel="noopener">MDN documentation</a>:</p> <h2 id="details">Details</h2> <nav id="TableOfContents"> <ul> <li><a href="#details">Details</a></li> <li><a href="#supported-regex-features">Supported Regex Features</a></li> <li><a href="#unsupported-regex-features-so-far">Unsupported Regex Features (so far!)</a></li> <li><a href="#supported-cli-flags">Supported CLI flags</a></li> <li><a href="#unsupported-cli-flags">Unsupported CLI flags</a></li> <li><a href="#error-handling">Error handling</a></li> <li><a href="#expanding-past-codecrafters">Expanding past CodeCrafters</a></li> <li><a href="#collecting-files">Collecting files</a></li> <li><a href="#printing-lines">Printing lines</a></li> </ul> </nav> <h2 id="supported-regex-features">Supported Regex Features</h2> <ul> <li> <p>Assertions:</p> <ul> <li><code>^</code> and <code>$</code> for entire patterns</li> <li>Parsing look head/behind (not matched)</li> </ul> </li> <li> <p>Character classes</p> <ul> <li>Single characters: <code>[abc]</code></li> <li>Ranges: <code>[a-z]</code></li> <li>Negated classes: <code>[^abc]</code></li> <li>Wildcards: <code>.</code></li> <li>Classes: <code>\d</code>/<code>\D</code> for digits, <code>\w</code>/<code>\W</code> for &lsquo;words&rsquo;, and <code>\s</code>/<code>\S</code> for whitespace</li> <li>Escape characters: <code>\t\r\n\v\f</code></li> <li>Control characters: <code>\cX</code> (I&rsquo;ve never used these)</li> <li>Hex and unicode literals: <code>\hXX</code> and <code>\uXXXX</code></li> <li>Disjunction: <code>|</code> (both in capture groups and not)</li> </ul> </li> <li> <p>Groups and back references</p> <ul> <li>Capture groups: <code>(abc)</code></li> <li>Named capture groups: <code>(?&lt;name&gt;abc)</code></li> <li>Non-capturing groups: <code>(?:abc)</code></li> <li>Flags: <code>(?ims-ims:abc)</code> <ul> <li>Both enabling and disabling</li> <li><code>i</code> and <code>s</code> but not <code>m</code></li> </ul> </li> <li>Backreferences: <code>\n</code></li> <li>Named backreferences: <code>\k&lt;name&gt;</code></li> </ul> </li> <li> <p>Quantifiers</p> <ul> <li><code>*</code> for zero or more</li> <li><code>+</code> for one or more</li> <li><code>?</code> for zero or one</li> <li><code>*?</code>, <code>+?</code>, and <code>??</code> for lazy / non-greedy matches</li> <li><code>abc{n}</code> exactly n matches</li> <li><code>abc{n,}</code> at least n matches</li> <li><code>abc{,m}</code> up to m matches</li> <li><code>abc{n,m}</code> at least n and up to m matches (inclusive)</li> <li>Lazy matches for all of those</li> </ul> </li> </ul> <p>Most of those were fairly straight forward extensions of previous code. In think the most interesting ones were handling the parsing of all the different things that can go in groups (including flags).</p> <p>For each of them, you can check my <a href="https://github.com/jpverkamp/jp-grep/commits/main/" target="_blank" rel="noopener">git commit history</a> to see how I implemented specific things. It&rsquo;s mostly one commit per feature, but not always.</p> <h2 id="unsupported-regex-features-so-far">Unsupported Regex Features (so far!)</h2> <ul> <li> <p>Assertions:</p> <ul> <li>Word boundaries (<code>\b</code> and <code>\B</code>)</li> <li>Look ahead/behind (parsed but not matched)</li> </ul> </li> <li> <p>Character classes</p> <ul> <li><code>[\b]</code> for backspace characters</li> <li>Long unicode format: <code>\u{XXXXX}</code></li> <li>Unicode properties: <code>\p{...}</code>/<code>\P{...}</code></li> </ul> </li> <li> <p>Groups and back references:</p> <ul> <li><code>m</code> flag / mode: multiline matches</li> </ul> </li> </ul> <p>The look ahead/behind is the one I&rsquo;m most interested in supporting. I don&rsquo;t even think it will be that hard, I just honestly missed it.</p> <p>The more interesting one will be the <code>m</code> flag. Currently, I only match lines, so that will be a decently large restructuring. We&rsquo;ll see.</p> <h2 id="supported-cli-flags">Supported CLI flags</h2> <p>I&rsquo;ve made an awful lot of progress on this one too!</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ jp-grep --help </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>A custom grep implementation; always behaves as egrep </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Usage: jp-grep <span style="color:#f92672">[</span>OPTIONS<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>PATTERN<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>PATHS<span style="color:#f92672">]</span>... </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Arguments: </span></span><span style="display:flex;"><span> <span style="color:#f92672">[</span>PATTERN<span style="color:#f92672">]</span> The regular expression to evaluate; may also be specified with -e </span></span><span style="display:flex;"><span> <span style="color:#f92672">[</span>PATHS<span style="color:#f92672">]</span>... Paths to search <span style="color:#66d9ef">for</span> matches; <span style="color:#66d9ef">if</span> none are provided read from stdin </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Options: </span></span><span style="display:flex;"><span> -A, --after-context &lt;AFTER_CONTEXT&gt; </span></span><span style="display:flex;"><span> Lines of context to print after each match </span></span><span style="display:flex;"><span> -B, --before-context &lt;BEFORE_CONTEXT&gt; </span></span><span style="display:flex;"><span> Lines of context to print before each match </span></span><span style="display:flex;"><span> -C, --context &lt;CONTEXT&gt; </span></span><span style="display:flex;"><span> Lines to print both before and after </span></span><span style="display:flex;"><span> -c, --count </span></span><span style="display:flex;"><span> Only print the matching count </span></span><span style="display:flex;"><span> -E, --extended-regexp </span></span><span style="display:flex;"><span> Extended regex mode <span style="color:#f92672">(</span>egrep<span style="color:#f92672">)</span>; this option is ignored <span style="color:#f92672">(</span>always true<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span> -e, --regexp &lt;ADDITIONAL_PATTERNS&gt; </span></span><span style="display:flex;"><span> Additional patterns, will <span style="color:#66d9ef">return</span> a line <span style="color:#66d9ef">if</span> any match </span></span><span style="display:flex;"><span> -h, --no-filename </span></span><span style="display:flex;"><span> Never print filenames </span></span><span style="display:flex;"><span> --help </span></span><span style="display:flex;"><span> Display this help message </span></span><span style="display:flex;"><span> -i, --ignore-case </span></span><span style="display:flex;"><span> Default to <span style="color:#66d9ef">case</span> insensitive match </span></span><span style="display:flex;"><span> -n, --line-number </span></span><span style="display:flex;"><span> Print line numbers before matches and context </span></span><span style="display:flex;"><span> -r, --recursive </span></span><span style="display:flex;"><span> Recursively add any directories <span style="color:#f92672">(</span>-R also works<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span> -v, --invert-match </span></span><span style="display:flex;"><span> Invert the match; only print lines that don<span style="color:#960050;background-color:#1e0010">&#39;</span>t match any pattern </span></span><span style="display:flex;"><span> -V, --version </span></span><span style="display:flex;"><span> Print version </span></span></code></pre></div><p>Of those, the context flags (<code>-A</code>, <code>-B</code>, and <code>-C</code>) were probably the most tricky, since I basically had to implement a <a href="https://en.wikipedia.org/wiki/circular%20buffer">circular buffer</a> for them. I could have just read the entire file into memory, but from the beginning, I didn&rsquo;t want to do that.</p> <p><code>-E</code> is a little silly, since that&rsquo;s the only <code>grep</code> pattern I support (and the only one I actually use in <code>grep</code>, so that&rsquo;s fair).</p> <p>So far as supporting multiple files, recursive search, and stdin, read the section on <a href="#collecting-files">collecting files</a> later.</p> <p>So far as printing (handling line numbers and file names), read the section on <a href="#printing-lines">printing lines</a>.</p> <p>Overall, pretty fun code.</p> <h2 id="unsupported-cli-flags">Unsupported CLI flags</h2> <p>So far, there are a bunch of flags that I don&rsquo;t support for grep. Of those, there are a bunch that I don&rsquo;t intend to support (like built in compression support and properly dealing with symlinks).</p> <p>The things that I would still like to support though are:</p> <ul> <li> <p>Input options:</p> <ul> <li><code>-f file</code>/<code>--file=file</code> - Read patterns from file</li> </ul> </li> <li> <p>Output options:</p> <ul> <li><code>-a</code>/<code>--text</code> - Currently I always have this set; I don&rsquo;t treat binary files differently</li> <li><code>-L</code>/<code>--files-without-match</code> - only print files that don&rsquo;t match</li> <li><code>-o</code>/<code>--only-matching</code> - only print the matching groups; I have the groups for backreferences, use them!</li> </ul> </li> <li> <p>File filtering - files to include/exclude (useful with recursive matches):</p> <ul> <li><code>--exclude pattern</code></li> <li><code>--exclude-dir pattern</code></li> <li><code>--include pattern</code></li> <li><code>--include-dir pattern</code></li> </ul> </li> </ul> <p>That&rsquo;s not too bad, all things consider.</p> <h2 id="error-handling">Error handling</h2> <p>One thing that I actually played a bit with this time around was custom error handling in the parser. Rather than just returning <code>&amp;str</code> all over the place for <code>Err</code> types, I made my own:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span><span style="color:#75715e">#[derive(Debug, Clone, Copy, PartialEq, Eq)]</span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">pub</span>(<span style="color:#66d9ef">crate</span>) <span style="color:#66d9ef">enum</span> <span style="color:#a6e22e">ParserError</span> { </span></span><span style="display:flex;"><span> RemainingInput, </span></span><span style="display:flex;"><span> UnexpectedEnd, </span></span><span style="display:flex;"><span> InvalidCharacter(<span style="color:#66d9ef">char</span>, <span style="color:#f92672">&amp;</span>&#39;static <span style="color:#66d9ef">str</span>), </span></span><span style="display:flex;"><span> InvalidUnicodeCodePoint(<span style="color:#66d9ef">u32</span>), </span></span><span style="display:flex;"><span> InvalidRange(<span style="color:#66d9ef">char</span>, <span style="color:#66d9ef">char</span>), </span></span><span style="display:flex;"><span> InvalidRepeatRange(<span style="color:#66d9ef">u32</span>, <span style="color:#66d9ef">u32</span>), </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">impl</span> std::fmt::Display <span style="color:#66d9ef">for</span> ParserError { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">fmt</span>(<span style="color:#f92672">&amp;</span>self, f: <span style="color:#66d9ef">&amp;</span><span style="color:#a6e22e">mut</span> std::fmt::Formatter<span style="color:#f92672">&lt;</span>&#39;_<span style="color:#f92672">&gt;</span>) -&gt; <span style="color:#a6e22e">std</span>::fmt::Result { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">match</span> self { </span></span><span style="display:flex;"><span> ParserError::RemainingInput <span style="color:#f92672">=&gt;</span> write!(f, <span style="color:#e6db74">&#34;Unexpected input after parsing&#34;</span>), </span></span><span style="display:flex;"><span> ParserError::UnexpectedEnd <span style="color:#f92672">=&gt;</span> write!(f, <span style="color:#e6db74">&#34;Unexpected end of input&#34;</span>), </span></span><span style="display:flex;"><span> ParserError::InvalidCharacter(c, expected) <span style="color:#f92672">=&gt;</span> { </span></span><span style="display:flex;"><span> write!(f, <span style="color:#e6db74">&#34;Invalid character &#39;{}&#39;, expected {}&#34;</span>, c, expected) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> ParserError::InvalidUnicodeCodePoint(code_point) <span style="color:#f92672">=&gt;</span> { </span></span><span style="display:flex;"><span> write!(f, <span style="color:#e6db74">&#34;Invalid unicode code point: {}&#34;</span>, code_point) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> ParserError::InvalidRange(start, end) <span style="color:#f92672">=&gt;</span> { </span></span><span style="display:flex;"><span> write!(f, <span style="color:#e6db74">&#34;Invalid range: {}-{}&#34;</span>, start, end) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> ParserError::InvalidRepeatRange(start, end) <span style="color:#f92672">=&gt;</span> { </span></span><span style="display:flex;"><span> write!(f, <span style="color:#e6db74">&#34;Invalid range: {}-{}&#34;</span>, start, end) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">#[derive(Debug, Clone, Copy, PartialEq, Eq)]</span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">pub</span>(<span style="color:#66d9ef">crate</span>) <span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">ParserErrorWithPosition</span> { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">pub</span> position: <span style="color:#66d9ef">usize</span>, </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">pub</span> error: <span style="color:#a6e22e">ParserError</span>, </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p>The <code>WithPosition</code> type also lets me pinpoint exactly where in a pattern I failed:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span>jp<span style="color:#f92672">-</span>grep <span style="color:#a6e22e">&#39;this</span> is some long complicated pattern, <span style="color:#960050;background-color:#1e0010">\</span>hXX see<span style="color:#f92672">?</span><span style="color:#a6e22e">&#39;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Error parsing regex: <span style="color:#a6e22e">Invalid</span> character <span style="color:#e6db74">&#39;X&#39;</span>, expected hex digit </span></span><span style="display:flex;"><span><span style="color:#f92672">|</span> this is some long complicated pattern, <span style="color:#960050;background-color:#1e0010">\</span>hXX see<span style="color:#f92672">?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">|</span> <span style="color:#f92672">^</span> </span></span></code></pre></div><p>That&rsquo;s pretty neat and I hope helpful! 😄</p> <h2 id="expanding-past-codecrafters">Expanding past CodeCrafters</h2> <p>Overall, I&rsquo;m pretty happy with this project. It&rsquo;s got a pretty decent chunk of code, including&hellip;</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ jp-grep -c -v -e <span style="color:#e6db74">&#39;//&#39;</span> -e <span style="color:#e6db74">&#39;^\s*$&#39;</span> **/*.rs </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#ae81ff">1241</span> </span></span></code></pre></div><p>&hellip;over 1000 lines of Rust code, including tests but not blank lines or comments. 😄</p> <p>I&rsquo;ll probably pick this up at least once more.</p> <p>Now&hellip; will I actually use this? Probably not. But it was certainly interesting to write.</p> <p>Other than that, was CodeCrafters actually helpful for this? Middling. It was the kick I needed to actually do it (I&rsquo;ve been meaning to write this for <em>years</em> at this point) and once I was started, I could finish it. On the other hand, the output format they require was a bit annoying at times, I&rsquo;ve mostly moved away from that.</p> <p>Still, worth I think. I&rsquo;ll probably continue to do their free programs. Kafka is up next. Whee servers!</p>Perdido Street Stationhttps://blog.jverkamp.com/2024/10/04/perdido-street-station/Fri, 04 Oct 2024 00:00:00 +0000https://blog.jverkamp.com/2024/10/04/perdido-street-station/<blockquote> <p>Its substance was known to me. The crawling infinity of colours, the chaos of textures that went into each strand of that eternally complex tapestry
each one resonated under the step of the dancing mad god, vibrating and sending little echoes of bravery, or hunger, or architecture, or argument, or cabbage or murder or concrete across the aether. The weft of starlings’ motivations connected to the thick, sticky strand of a young thief’s laugh. The fibres stretched taut and glued themselves solidly to a third line, its silk made from the angles of seven flying buttresses to a cathedral roof. The plait disappeared into the enormity of possible spaces.</p> </blockquote> <p>Any time you ask about modern &lsquo;weird fiction&rsquo; / weird ecologies / weird cities. China MiĂ©ville and Perdido Street Station almost always come up. Turns out&hellip; that&rsquo;s for a good reason. Why in the world did I take so long to read this book?</p> <p>Overall, this book really shines when it comes to weird<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> worldbuilding. Half-bird, half-human creature? Not that weird. Half-bug creatures? Where the women have a scarab beetle instead of ahead and the males are non-sapient grubs? Weird. Frog people? Re-animates and constructs? Plant people? All living together in a grimy steam-powered, airship and tech and magic driven mess of a metropolis?</p> <p>Weird<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p> <p>And wonderful.</p> <p>Overall, this was exactly the sort of book that I love and I&rsquo;m glad to see there are other books in the same world, if not with the same characters. I want more!</p> <p>Conversely, if you&rsquo;re not into weird fiction, more than a touch of body horror, or a book where everyone necessarily get a happy ending (or even survive the story)&hellip; maybe skip this one. It&rsquo;s dark. And that&rsquo;s sort of the point.</p> <p>Side note: I listened to this on audiobook and I loved the narration. Perhaps my favorite thing? Whenever the narrator said Issac&rsquo;s full name. Grimnebulin! 😄</p> <blockquote> <p>Art is something you choose to make&hellip; it&rsquo;s a bringing together of&hellip; of everything around you into something that makes you more human, more khepri, whatever. More of a person.</p> </blockquote>Chaos: Making a New Sciencehttps://blog.jverkamp.com/2024/09/26/chaos-making-a-new-science/Thu, 26 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/26/chaos-making-a-new-science/<blockquote> <p>Nature forms patterns. Some are orderly in space but disorderly in time, others orderly in time but disorderly in space. Some patterns are fractal, exhibiting structures self-similar in scale. Others give rise to steady states or oscillating ones. Pattern formation has become a branch of physics and of materials science, allowing scientists to model the aggregation of particles into clusters, the fractured spread of electrical discharges, and the growth of crystals in ice and metal alloys. The dynamics seem so basic—shapes changing in space and time—yet only now are the tools available to understand them.</p> </blockquote> <p>Chaos is the study of non-linear systems. Of fractals. Of &hellip; chaos. It takes the world we know it and proves that, at some level, we don&rsquo;t know anything. We can simulate the world to ever increasing levels of accuracy and at some point, things just blow up.</p> <p>It&rsquo;s a neat idea, not nearly as weird as it was 40 years ago when this was written (and even then, three years before Jurassic Park made it really <em>cool</em>). I&rsquo;ve messed with <a href="https://blog.jverkamp.com/programming/topics/fractals/">fractals</a> more than a bit and studied quite a bit of higher level math in school, so little of this is particularly new to me&ndash;so I&rsquo;m probably ont the target audience.</p> <p>Overall, this book is really more about the history and discovery of chaos, rather than necessarily digging into the math and how it really works (when we even know). It&rsquo;s interesting, but not what I was expecting.</p> <p>So&hellip; I&rsquo;m glad enough that I read it, but probably wouldn&rsquo;t strongly recommended it. So it goes.</p>It's A Wonderful Midlife Crisishttps://blog.jverkamp.com/2024/09/23/its-a-wonderful-midlife-crisis/Mon, 23 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/23/its-a-wonderful-midlife-crisis/<p>As someone quickly approaching 40 with a penchant for urban fantasy, this book should have been right up my alley. Except&hellip; the plot is weak, the world building is lazy, and the romance doesn&rsquo;t <em>really</em> make sense.</p> <p>I think the book sums itself up well.</p> <blockquote> <p>“Oh God, Daisy,” ***** said, letting her head fall to her chest. “You have it all wrong.”</p> <p>“Have what wrong?” I asked as a feeling of dread washed over me.</p> <p>“Every good story has a major plot twist,” she said slowly, growing more agitated with each word.</p> </blockquote> <p>This is on page <em>155</em> of 164. Daisy (our MC) is finally <em>finally</em> learning&hellip; and still got it wrong. And it&rsquo;s not even (in my opinion) that sensible a plot twist. And then the book ends. It&rsquo;s very much set up for a sequel; without which, it doesn&rsquo;t really stand alone.</p> <p>So&hellip; despite this being an oddly well reviewed book in general, it&rsquo;s just really <em>not</em> my cup of tea. Perhaps you&rsquo;d like it more. Perhaps it gets better.</p> <p>Onward.</p>Happy Birthday, Mrs. Piggle-Wigglehttps://blog.jverkamp.com/2024/09/18/happy-birthday-mrs.-piggle-wiggle/Wed, 18 Sep 2024 00:00:05 +0000https://blog.jverkamp.com/2024/09/18/happy-birthday-mrs.-piggle-wiggle/<p>And so it ends&hellip; 50 years later.</p> <p>This is an interesting one. Apparently, it was largely written by the original author&rsquo;s daughter with the first story an unpublished original and the rest based on &rsquo;notes among her mother&rsquo;s possessions&rsquo;. For the most part, it fits. And ending it all with a party celebrating the titular Mrs. Piggle-Wiggle?</p> <p>I like it.</p>Hello, Mrs. Piggle-Wigglehttps://blog.jverkamp.com/2024/09/18/hello-mrs.-piggle-wiggle/Wed, 18 Sep 2024 00:00:04 +0000https://blog.jverkamp.com/2024/09/18/hello-mrs.-piggle-wiggle/<p>Somehow, Mrs. Piggle-Returned. And the complete lack of any mention of her farm is just about as weird as when Star Wars did it. Add to that another complete reliance on random magical pills and powders&hellip; this one is also not my favorite, although I prefer it slightly to [[Mrs. Piggle-Wiggle&rsquo;s Magic]].</p> <p>See <a href="https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggle/">Mrs. Piggle-Wiggle</a> for my thoughts for the series as a whole.</p>Mrs. Piggle-Wiggle's Farmhttps://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggles-farm/Wed, 18 Sep 2024 00:00:03 +0000https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggles-farm/<p>My thoughts for the series as a whole are on the review for <a href="https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggle/">Mrs. Piggle-Wiggle</a>.</p> <p>For &hellip; reasons, Mrs. Piggle-Wiggle has moved out of town to a farm. Here, she takes the problem children and uses (farm style) household chores in order to help them be better.</p> <p>It actually really works&ndash;and is so much less likely than [[Mrs. Piggle-Wiggle&rsquo;s Magic]]. I think this might actually be my favorite. It&rsquo;s weird, writing this out, to realize how relatively few stories this one had though.</p>Mrs. Piggle-Wiggle's Magichttps://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggles-magic/Wed, 18 Sep 2024 00:00:02 +0000https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggles-magic/<p>My thoughts for the series as a whole are on the review for <a href="https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggle/">Mrs. Piggle-Wiggle</a>. Really, if I&rsquo;d only read that book and this one, I don&rsquo;t know if I would have continued the series.</p> <p>In the first, we have fairly mundane and reasonable solutions to realistic childhood issues. In this one&ndash;straight out magic. I&rsquo;m not a huge fan, especially with the tonal shift. But I do really like <a href="https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggles-farm/">Mrs. Piggle-Wiggle&#39;s Farm</a> and (perhaps surprisingly) <a href="https://blog.jverkamp.com/2024/09/18/happy-birthday-mrs.-piggle-wiggle/">Happy Birthday, Mrs. Piggle-Wiggle</a>, so I&rsquo;m glad I continued.</p> <p>That being said, this one does have some fun moments (the Tattletales, Lester the pig with his table manners), so it&rsquo;s not all bad!</p>Mrs. Piggle-Wigglehttps://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggle/Wed, 18 Sep 2024 00:00:01 +0000https://blog.jverkamp.com/2024/09/18/mrs.-piggle-wiggle/<p>The Mrs. Piggle-Wiggle books are an interesting sort of children&rsquo;s tales. Throughout the books, we&rsquo;re introduced to familys with strange names, where always and without fail, the children are in some way, shape, or form misbehaving. One thing leads to another, their mother<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> is at her wit&rsquo;s end, and&hellip; they call Mrs. Piggle-Wiggle and she saves the day.</p> <p>Originally published 1947-1957, the first four books are very much a product of their times. The family dynamics, the problems the children have, and even some of the (less magical) solutions. Yet a lot of the problems ring true, even today.</p> <p>We&rsquo;ve been listening to the 4 of the 5 books we&rsquo;ve found audiobooks for in a somewhat random order. Mostly, the order doesn&rsquo;t matter. Each story is fairly self contained&ndash;with the exception of book 3: Mrs. Piggle-Wiggle&rsquo;s farm, in which she&rsquo;s moved out of town. Except in book 4, she&rsquo;s back and no mention is made ever again. Anyways.</p> <p>The last, published in book 5, actually fits fairly well with the first 4, despite the fact that it was published 50 years later by MacDonald&rsquo;s daughter. Honestly, on just listening to them, it didn&rsquo;t feel all that different.</p> <p>I think the main decider on if I&rsquo;d like a particular story or not depended entirely on how magical the solution was. While they&rsquo;re all somewhat unbelievable (a day or two staying up late curing a TV addiction? sure), I like the ones with a practical solution. In particular, Mrs. Piggle-Wiggle (1), her Farm (3), and Happy Birthday (5) are my favorites. Conversely, her Magic (2) and Hello (4) are much more about magical pills and tonics that miraculously solve problems&ndash;not particularly applicable that, even if they are fun to read about.</p> <p>Overall, they&rsquo;re a lot of fun to read/listen to and I don&rsquo;t expect they&rsquo;ll go away any time soon.</p>The Ballad of Black Tomhttps://blog.jverkamp.com/2024/09/15/the-ballad-of-black-tom/Sun, 15 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/15/the-ballad-of-black-tom/<blockquote> <p>Walking through Harlem first thing in the morning was like being a single drop of blood inside an enormous body that was waking up. Brick and mortar, elevated train tracks, and miles of underground pipe, this city lived; day and night it thrived.</p> </blockquote> <p>At first, it&rsquo;s a story about a black man in the boroughs of New York in the 1920s. A gritty world, but somehow <em>alive</em>, dripping with some wonderfully written descriptions of the people and places of the time.</p> <p>And then&hellip;</p> <blockquote> <p>The Sleeping King is dead but dreaming.</p> </blockquote> <p>Things take a somewhat supernatural turn.</p> <p>This is another of those cases where I put a book on my &rsquo;to read&rsquo; list because it looked interesting and, before getting around to it, completely forgot it was going to be about.</p> <p>By the end&hellip; that took a much <em>darker</em> track than I was expecting<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>&hellip; and that&rsquo;s starting from the point of view of racial disparity and violence in the 1920s.</p> <p>And then&hellip; things get even darker. But I&rsquo;ll leave that for you to read.</p> <blockquote> <p>Nobody ever thinks of himself as a villain, does he? Even monsters hold high opinions of themselves.</p> </blockquote> <p>Overall, it&rsquo;s short. ~150 pages or a few hours audio. But I think it does a good job of hitting hard without overstaying it&rsquo;s welcome. If you&rsquo;re a fan of cosmic horror / weird fiction, I think you&rsquo;ll like it. I certainly did.</p> <p>Onward!</p>The Islands of the Blessedhttps://blog.jverkamp.com/2024/09/11/the-islands-of-the-blessed/Wed, 11 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/11/the-islands-of-the-blessed/<p>Here we go again, dealing once again with bad decisions made long ago coming back to bite those who made them&hellip; and anyone else that might be standing nearby.</p> <p>Of course it&rsquo;s up to Jack and Thorgil to go on ANOTHER QUEST. And once again, save the day.</p> <blockquote> <p>I&rsquo;d guess that you have some purpose to fulfill and that is why you were saved. But don&rsquo;t get a swelled head over it. A cabbage has a purpose when someone needs to make soup.</p> </blockquote> <p>We get all sorts of interesting new beasties, friends, and enemies (sometimes all three). Chief among them are the Mermen and Mermaids, but also more half-trolls and even (perhaps) a god along the way, which was a take I&rsquo;ve seen before, but interesting to see here.</p> <blockquote> <p>Gods, if they&rsquo;re neglected, tend to fall asleep, but they never really go away.</p> </blockquote> <p>The cultural classes and worldbuilding, being based on our own (messy) world and history are interesting gone truly magical are still interesting and (so far as I know anyways) well researched. A joy to read.</p> <p>I like seeing more of what happens to our characters, even if the ending is a bit bittersweet.</p> <blockquote> <p>I remembered what Olaf always said: You must never give up, even if you&rsquo;re falling off a cliff. You never know what might happen on the way down.</p> </blockquote> <p>Overall, I&rsquo;d say it&rsquo;s stronger than the <a href="https://blog.jverkamp.com/2024/09/08/the-land-of-the-silver-apples/">second</a>, but not quite up to the level of the <a href="https://blog.jverkamp.com/2024/09/01/the-sea-of-trolls/">first</a> in the series. Overall, I enjoyed the series and hope to share it with my children, perhaps in a few years.</p> <p>Onward!</p>Sideways Stories from Wayside Schoolhttps://blog.jverkamp.com/2024/09/08/sideways-stories-from-wayside-school/Sun, 08 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/08/sideways-stories-from-wayside-school/This book contains thirty stories about the children and teachers at Wayside School. But before we get to them, there is something you ought to know so that you don’t get confused. Wayside School was accidentally built sideways. It was supposed to be only one story high, with thirty classrooms all in a row. Instead it is thirty stories high, with one classroom on each story. The builder said he was very sorry.The Land of the Silver Appleshttps://blog.jverkamp.com/2024/09/08/the-land-of-the-silver-apples/Sun, 08 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/08/the-land-of-the-silver-apples/<blockquote> <p>“You&rsquo;d better tell me about that lie, Giles,&quot; said the old man, massaging his forehead. &ldquo;From all the sin you keep going on about, I&rsquo;m sure it&rsquo;s going to be spectacular.”</p> </blockquote> <p>Well&hellip; when you put it that way.</p> <p>A year has passed. Jack learns family secrets and has to go on ANOTHER QUEST. I&rsquo;m actually curious to see if the backstory we get here was planned all along or developed from clues in the first book only when a second was need. It really could go either way.</p> <p>This time, we see elves (meh) and hobgoblins (lots of fun). Along the way, we end up with another new main character: Pega. Former slave, freed by Jack, and fond of commenting on &lsquo;how it all could be worse&rsquo;. She&rsquo;s fine&hellip; but not as interesting as Thorgil, personally. (We get both though!)</p> <p>It&rsquo;s another adventure through the magical land of alt ~800 AD British Isles. Weaker than the first, but still absolutely solid enough that I enjoyed reading it. Onward to the thrilling (I hope!) conclusion in <a href="https://blog.jverkamp.com/2024/09/11/the-islands-of-the-blessed/">The Islands of the Blessed</a>!</p>Kitty Friendshttps://blog.jverkamp.com/2024/09/05/kitty-friends/Thu, 05 Sep 2024 12:02:21 +0000https://blog.jverkamp.com/2024/09/05/kitty-friends/<p>Kitties over the years.</p> <div class="imageGallery2"> <a data-fancybox="gallery" data-fancybox-index="0" data-caption="New kitty friends!" data-flickr="https://www.flickr.com/photos/jpverkamp/53973221741" href="https://farm66.staticflickr.com/65535/53973221741_5a1f5152b6_b.jpg"> <img class="img-rounded" src="https://farm66.staticflickr.com/65535/53973221741_5a1f5152b6_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="1" data-caption="Day 220: Cat" data-flickr="https://www.flickr.com/photos/jpverkamp/24367432793" href="https://farm2.staticflickr.com/1565/24367432793_713256f266_b.jpg"> <img class="img-rounded" src="https://farm2.staticflickr.com/1565/24367432793_713256f266_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="2" data-caption="A cat named Squeaker. Because he doesn&#39;t meow. He squeaks. Who&#39;da thunk." data-flickr="https://www.flickr.com/photos/jpverkamp/6044110215" href="https://farm7.staticflickr.com/6087/6044110215_c7e6cf468d_b.jpg"> <img class="img-rounded" src="https://farm7.staticflickr.com/6087/6044110215_c7e6cf468d_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="3" data-caption="She&#39;s a rather cute kitten (is there any other kind), although she looks really funny after being partially shaved when we sent her to be fixed." data-flickr="https://www.flickr.com/photos/jpverkamp/4747252473" href="https://farm5.staticflickr.com/4121/4747252473_801e4d3dde_b.jpg"> <img class="img-rounded" src="https://farm5.staticflickr.com/4121/4747252473_801e4d3dde_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="4" data-caption="Long photoshoot, must have worn him out." data-flickr="https://www.flickr.com/photos/jpverkamp/4903154095" href="https://farm5.staticflickr.com/4139/4903154095_e63410ff6b_b.jpg"> <img class="img-rounded" src="https://farm5.staticflickr.com/4139/4903154095_e63410ff6b_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="5" data-caption="Sprawled in a laundry basket." data-flickr="https://www.flickr.com/photos/jpverkamp/4903729694" href="https://farm5.staticflickr.com/4102/4903729694_093fe72d1f_b.jpg"> <img class="img-rounded" src="https://farm5.staticflickr.com/4102/4903729694_093fe72d1f_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="6" data-caption="I think he&#39;s not amused any more." data-flickr="https://www.flickr.com/photos/jpverkamp/4903150219" href="https://farm5.staticflickr.com/4141/4903150219_d9c785c081_b.jpg"> <img class="img-rounded" src="https://farm5.staticflickr.com/4141/4903150219_d9c785c081_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="7" data-caption="I have no idea what he&#39;s thinking." data-flickr="https://www.flickr.com/photos/jpverkamp/4903152181" href="https://farm5.staticflickr.com/4135/4903152181_a4caf39932_b.jpg"> <img class="img-rounded" src="https://farm5.staticflickr.com/4135/4903152181_a4caf39932_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="8" data-caption="Seconds after he was nosing my camera." data-flickr="https://www.flickr.com/photos/jpverkamp/4903148709" href="https://farm5.staticflickr.com/4137/4903148709_e1b4ae86cd_b.jpg"> <img class="img-rounded" src="https://farm5.staticflickr.com/4137/4903148709_e1b4ae86cd_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="9" data-caption="Might be a cat" data-flickr="https://www.flickr.com/photos/jpverkamp/53973270436" href="https://farm66.staticflickr.com/65535/53973270436_d567e7a3e8_b.jpg"> <img class="img-rounded" src="https://farm66.staticflickr.com/65535/53973270436_d567e7a3e8_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="10" data-caption="Dangerously" data-flickr="https://www.flickr.com/photos/jpverkamp/53973590629" href="https://farm66.staticflickr.com/65535/53973590629_435c18512d_b.jpg"> <img class="img-rounded" src="https://farm66.staticflickr.com/65535/53973590629_435c18512d_m.jpg" /> </a> <a data-fancybox="gallery" data-fancybox-index="11" data-caption="And a comfy chair." data-flickr="https://www.flickr.com/photos/jpverkamp/53973702820" href="https://farm66.staticflickr.com/65535/53973702820_91aa91090f_b.jpg"> <img class="img-rounded" src="https://farm66.staticflickr.com/65535/53973702820_91aa91090f_m.jpg" /> </a> </div> <div class="viewOnFlicker"> <a href="https://flickr.com/photos/jpverkamp/sets/72177720320086341">View on Flickr</a> </div>CodeCrafters: Build Myself an Interpreterhttps://blog.jverkamp.com/2024/09/04/codecrafters-build-myself-an-interpreter/Wed, 04 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/04/codecrafters-build-myself-an-interpreter/Didn&rsquo;t I just do one of these? Well, yes. Yes I did. But I love building compilers and interpreters, so when I saw this one was in beta (and thus free 😉), I had to try it! It&rsquo;s directly an implemention of the Lox languages from the Crafting Interpreters website / book (my review), if incomplete. By the end of the lesson, we&rsquo;ll have: A tokenizer that handles parentheses, braces, operators (single and multiple character), whitespace, identifiers, string literals, numeric literals, and keywords A parser that can take those tokens and build an abstract syntax tree using recursive descent parsing A simple tree walking interpreter for some subset of the language It doesn&rsquo;t handle all of the syntax (yet).Solving Cosmic Expresshttps://blog.jverkamp.com/2024/09/02/solving-cosmic-express/Mon, 02 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/02/solving-cosmic-express/<p>Another <a href="https://blog.jverkamp.com/series/rust-solvers/">Rust Solvers</a> puzzle: <a href="https://store.steampowered.com/app/583270/Cosmic_Express/" target="_blank" rel="noopener">Cosmic Express</a>. Basically, it&rsquo;s a routefinding puzzle. You have a train that needs a track from entrance to exit, picking up and dropping off cargo on the way.</p> <p>It&rsquo;s actual a relatively simple puzzle, so far as things go, but one thing that&rsquo;s interesting from a solving perspective is that branching paths <em>really</em> don&rsquo;t work great with my solver code. Paths just have a crazy branching factor when compared to (for example) <a href="https://blog.jverkamp.com/2024/06/17/the-golf-peaks-of-solving/">playing one of a handful of cards</a>.</p> <p>But it&rsquo;s still an interesting puzzle!</p>The Sea of Trollshttps://blog.jverkamp.com/2024/09/01/the-sea-of-trolls/Sun, 01 Sep 2024 00:00:00 +0000https://blog.jverkamp.com/2024/09/01/the-sea-of-trolls/<p>Well that&rsquo;s a surprisingly fun book!</p> <p>In a nutshell:</p> <blockquote> <p>The year is A.D. 793; Jack and his sister have been kidnapped by Vikings and taken to the court of Ivar the Boneless and his terrifying half-troll wife; but things get even worse when Jack finds himself on a dangerous quest to find the magical Mimir&rsquo;s Well in a far-off land, with his sister&rsquo;s life forfeit if he fails.</p> </blockquote> <p>I started out reading this since it&rsquo;s a great (and rare) fit for the <a href="https://blog.jverkamp.com/bingo/2024-book-bingo/">2024 Book Bingo</a> &lsquo;Bard&rsquo; square, since both Jack and his mentor are explicitly called &lsquo;Bards&rsquo; (even if, interestingly music is a relatively small part of their training), but it ends up being so much more.</p> <p>It&rsquo;s got Vikings&ndash;including digging into what makes them who they are and how they think differently from the people Jack grew up with.</p> <blockquote> <p>Just say no to pillaging.</p> </blockquote> <p>It&rsquo;s got monsters&ndash;the Vikings for one, along with Trolls (sometimes more human that anyone), dragons, ravens, and giant spiders.</p> <blockquote> <p>“Norns keep the tree Yggdrassil alive. Without them, nothing would exist
 They show up when you&rsquo;re born and decide what kind of life you&rsquo;re going to have.&quot;<br> &ldquo;I guess they were in a rotten mood when I came along,&rdquo; Jack said. He loaded up the water bag and supplies.<br> &ldquo;Me too,&rdquo; Thorgil said gravely.</p> </blockquote> <blockquote> <p>Look around you&hellip;Feel the wind, smell the air. Listen to the birds and watch the sky. Tell me what&rsquo;s happening in the wide world.</p> </blockquote> <p>It&rsquo;s got magic. Bardic magic. Shapeshifting. Talking to animals. Calling up / banishing storms. Norse mythology. Norns. Yggdrasil.</p> <blockquote> <p>“It&rsquo;s my fault,&quot; said Rune. &ldquo;He&rsquo;s untrained and likely to overdo things.&rdquo;<br> &ldquo;Like turning the queen bald. That was a good trick, though.&rdquo; Olaf smiled.”</p> </blockquote> <p>I&rsquo;ve absolutely no idea if it&rsquo;s particularly historically accurate (barring the above of course :)), but it&rsquo;s a fun read and I greatly enjoyed it. Now I really want to know what happens next!</p> <p>Side note: Great fun for an audiobook, lightly accented. Just enough to get into the feel of the book all the more!</p> <p>Second side note: I totally caught the <span class="spoiler">Jack and Jill</span> reference from when we first learned her birth name. But man. Them just outright using that as an in universe poem was fun.</p>CodeCrafters: Build Myself a Grephttps://blog.jverkamp.com/2024/08/28/codecrafters-build-myself-a-grep/Wed, 28 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/28/codecrafters-build-myself-a-grep/<p>I recently stumbled across <a href="https://codecrafters.io/" target="_blank" rel="noopener">CodeCrafters</a> again<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. In a nutshell, they give a number of &lsquo;Build Your Own&hellip;&rsquo; courses, each of which will automatically create a repo for you, guide you through solving the program step by step, and provide some feedback on the way.</p> <p>On one hand, it&rsquo;s a freemium (one problem a month is free) / paid service. I wish they had tiers. I really think their monthly fee is a bit steep for what they offer (we&rsquo;ll come back to that). But on the other hand, it&rsquo;s a neat tool and I&rsquo;ve been wanting some more larger programming projects to learn more Rust on, so away we go!</p> <p>First up, <a href="https://en.wikipedia.org/wiki/grep">grep</a>!</p>The Night Masqueradehttps://blog.jverkamp.com/2024/08/24/the-night-masquerade/Sat, 24 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/24/the-night-masquerade/<p>The Night Masquerade really continues the story of <a href="https://blog.jverkamp.com/2024/08/22/home/">Home</a>. If you enjoyed that story, you&rsquo;ll enjoy this one as well. If you read the &lsquo;Binti Trilogy&rsquo; binding all three, it fits as the conclusion to the story.</p>Homehttps://blog.jverkamp.com/2024/08/22/home/Thu, 22 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/22/home/<blockquote> <p>Change was constant. Change was my destiny. Growth.</p> </blockquote> <p>After all the events of <a href="https://blog.jverkamp.com/2024/08/20/binti/">the first story</a>, Binti&rsquo;s finally at Uni, learning about the magical sort of math that&rsquo;s mostly been hinted at up until then&ndash;and dealing with more than a touch of PTSD. So of course she decides to return home to her people for a pilgrimage&ndash;and Okwu the Meduse will come along.</p> <blockquote> <p>Nothing was asked of Okwu and Okwu was pleased, preferring to menacingly loom in the background behind me. Okwu was happiest around human beings when it was menacingly looming.</p> </blockquote> <p>What could possibly go wrong?</p>Bintihttps://blog.jverkamp.com/2024/08/20/binti/Tue, 20 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/20/binti/<p>I quite enjoy this book. It&rsquo;s got some fascinating worldbuilding, interesting characters. It&rsquo;s a bit hampered by being a novella&ndash;there are a few threads that I really could have used more of. Well worth the read.</p> <p>One warning: the story takes a turn towards the more &lsquo;horror&rsquo; (or at least thriller) side of sci-fi part of the way through. I was not expecting that&ndash;I enjoy that sort of thing, but be warned if that&rsquo;s not your sort of story.</p>TestIT - Integration Testing for My Rust Solvershttps://blog.jverkamp.com/2024/08/19/testit-integration-testing-for-my-rust-solvers/Mon, 19 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/19/testit-integration-testing-for-my-rust-solvers/<p>One of the problems (of a sorts) I&rsquo;ve been having with my series on <a href="https://blog.jverkamp.com/series/rust-solvers/">Rust Solvers</a> is that, for each input puzzle, I need a way to save one or more &lsquo;known good&rsquo; solutions so that when I change and add new functionality, I can verify that I&rsquo;ve either not changed the solution or found another valid one.</p> <p><a href="https://en.wikipedia.org/wiki/Integration%20tests">Integration tests</a> as it were.</p> <p>So far, I&rsquo;d been building this <a href="https://github.com/jpverkamp/rust-solvers/blob/ab65482417d0edfb9f24887d41ba3c724e4346e3/src/bin/golf-peaks.rs#L1064-L1202" target="_blank" rel="noopener">into each solution</a>. While this worked perfectly fine, it&rsquo;s a bit annoying to copy and paste to each binary, and then have to edit each test case with the answers.</p> <nav id="TableOfContents"> <ul> <li><a href="#an-example-run">An example run</a></li> <li><a href="#command-line-options">Command line options</a></li> <li><a href="#test-file-collection">Test file collection</a></li> <li><a href="#parallel-execution--building-the-command">Parallel Execution + Building the Command</a></li> <li><a href="#running-each-command-with-a-timeout">Running each command with a timeout</a></li> <li><a href="#collecting-the-results">Collecting the results</a></li> <li><a href="#summary">Summary</a></li> </ul> </nav> <h2 id="an-example-run">An example run</h2> <p>Enter: <a href="https://github.com/jpverkamp/testit" target="_blank" rel="noopener">testit</a>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># First run, without --db/--save for previous runs</span> </span></span><span style="display:flex;"><span>$ testit <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --command <span style="color:#e6db74">&#34;./target/release/golf-peaks&#34;</span> <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --files <span style="color:#e6db74">&#34;data/golf-peaks/**/*.txt&#34;</span> <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --timeout <span style="color:#ae81ff">60</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>data/golf-peaks/1-1.txt: New success: </span></span><span style="display:flex;"><span>1-↗ </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">===</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>data/golf-peaks/1-10.txt: New success: </span></span><span style="display:flex;"><span>1-↘ 3-↙ 2-↘ </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">===</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>... </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>data/golf-peaks/9-8.txt: New success: </span></span><span style="display:flex;"><span>1/3-↘ 1/2-↖ 1/↗ 2/1-↖ 1/1-↗ </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">===</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>data/golf-peaks/9-9.txt: New success: </span></span><span style="display:flex;"><span>1-↗ 1/↘ 1-↘ 4-↗ 3-↘ 1/1-↗ </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">===</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>data/golf-peaks/Credits.txt: New success: </span></span><span style="display:flex;"><span>4-↖ 5-↗ 3-↗ 6-↘ </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">===</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Summary: </span></span><span style="display:flex;"><span> Successes: <span style="color:#ae81ff">121</span> <span style="color:#f92672">(</span><span style="color:#ae81ff">121</span> new<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span> Failures: <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span> Timeouts: <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Later runs</span> </span></span><span style="display:flex;"><span>$ testit <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --command <span style="color:#e6db74">&#34;./target/release/golf-peaks&#34;</span> <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --files <span style="color:#e6db74">&#34;data/golf-peaks/**/*.txt&#34;</span> <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --timeout <span style="color:#ae81ff">60</span> <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --db testit/golf-peaks.json <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --save </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Summary: </span></span><span style="display:flex;"><span> Successes: <span style="color:#ae81ff">121</span> <span style="color:#f92672">(</span><span style="color:#ae81ff">0</span> new<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span> Failures: <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span> Timeouts: <span style="color:#ae81ff">0</span> </span></span></code></pre></div><p>Pretty cool, I do think. 😄</p>Jonathan Strange & Mr Norrellhttps://blog.jverkamp.com/2024/08/17/jonathan-strange-mr-norrell/Sat, 17 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/17/jonathan-strange-mr-norrell/<p>That one has been on my list for years now. It&rsquo;s just got such a <em>fun</em> title!</p> <blockquote> <p>“Can a magician kill a man by magic?” Lord Wellington asked Strange.<br> Strange frowned. He seemed to dislike the question. “I suppose a magician might,” he admitted, “but a gentleman never could.”</p> </blockquote> <p>Now, having read it&hellip; I <em>think</em> that I enjoyed it?</p>Providencehttps://blog.jverkamp.com/2024/08/16/providence/Fri, 16 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/16/providence/<p>That is quite a ride.</p> <p>At it&rsquo;s core, it&rsquo;s a fairly standard military sci story: the aliens attacked and now we&rsquo;re going out to get them back.</p> <p>And then you peel back a layer and you have the development of AI&ndash;all the more relevant with the recent developments in LLMs. Now, you don&rsquo;t even <em>need</em> humanity to fight the war. But true to form, if you don&rsquo;t need people to fight, it&rsquo;s all the harder to convince those back home to care. (Read: $$$)</p>For All Mankind: Season 3https://blog.jverkamp.com/2024/08/15/for-all-mankind-season-3/Thu, 15 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/15/for-all-mankind-season-3/<p>To MARS!</p> <p>It&rsquo;s great seeing how the world is diverging from our own, with another Great Space Race to MARS! This time, not just the US and USSR, but also the private sector (Helios) getting involved, which just manages to make everything more complicated.</p> <p>And even with some things so far ahead&hellip; it&rsquo;s still the (fictional) 90s. US/USSR tensions are still high. There are still plenty of hidden secrets just waiting to come out at the right moment.</p> <p>As we jump another decade forward, our original cast (those that have survived at least) are getting older, but still perfectly capable of causing all sorts of chaos. We have a few new faces as well, but I&rsquo;ll admit, less than I expected. There&rsquo;s no way that&rsquo;s sustainable&hellip;</p> <p>Overall, another wonderful season. Man the reviews for this one makes it look worse than it is. It&rsquo;s a show about the space race&hellip; but not just about space. It&rsquo;s also a show about the people <em>going to space</em>, and some people miss that.</p> <p>Quite enjoyed it. Looking forward to season 4!</p>Electric Stormhttps://blog.jverkamp.com/2024/08/11/electric-storm/Sun, 11 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/11/electric-storm/<p>Did you know they made Magic School bus chapter books? (And did you know my son randomly chose #14 to start at?)</p> <p>They&rsquo;re basically those vibrant kids&rsquo; science books, writ large. Still with plenty of illustrations, scientific asides, and more child endangerment than you can shake a lightning bolt at.</p> <p>This time around (as one might expect 😄), the Friz and class end up getting swept up into a lightning storm, shrink down to the size of electrons, and <em>become lightning</em>.</p> <p>How cool.</p> <p>It&rsquo;s a quick read, a fun adventure, and I have no problems with the science presented. I&rsquo;m going to have to find a few more of these to read with my son!</p> <p>Onward!</p>Journey to the Center of the Earthhttps://blog.jverkamp.com/2024/08/11/journey-to-the-center-of-the-earth/Sun, 11 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/11/journey-to-the-center-of-the-earth/<blockquote> <p>We are of opinion that instead of letting books grow moldy behind an iron grating, far from the vulgar gaze, it is better to let them wear out by being read.</p> </blockquote> <p>This year <a href="https://blog.jverkamp.com/bingo/2024-book-bingo/">book bingo</a> has a &lsquo;Underground&rsquo; category&ndash;and I&rsquo;ve been meaning to actually go back and read more Verne. Seemed like a great chance to check out Journey to the Center of the Earth!</p> <p>In a nutshell, it&rsquo;s a quintessential Jules Verne adventure. A student and professor find an old manuscript purporting to describe a path to the very center of the Earth&hellip; and off they go to SnĂŠfellsjökull (Icelandic is such a lovely language) and down into the Earth.</p> <p>From that, it&rsquo;s one adventure after another. Down caves, running out of food and water, nearly dying&ndash;and all manner of completely scientifically improbable findings along the way.</p> <blockquote> <p>Science, my boy, is made up of mistakes, but they are mistakes which it is useful to make, because they lead little by little to the truth.</p> </blockquote> <p>I think the biggest difficulty in this book is probably entirely tied up with the fact that it&rsquo;s 160 years old. It&rsquo;s just written in a very different style. People just &hellip; don&rsquo;t talk like that. But it does make it feel amusingly old-timey, which I actually like. (I wonder how much of that is the translation?)</p> <p>Worth a read. Going to have to read a few more of these!</p>Taskmaster NZ: Series 3https://blog.jverkamp.com/2024/08/11/taskmaster-nz-series-3/Sun, 11 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/11/taskmaster-nz-series-3/<p>Now that I&rsquo;ve caught up with <a href="https://blog.jverkamp.com/reviews/series/taskmaster/">Taskmaster</a> (for now/barring specials)&hellip; well there&rsquo;s the whole world of INTERNATIONAL TASKMASTER.</p> <p>First up, New Zealand! And because&hellip; well, I have no justification. I&rsquo;m starting with season 3 because that&rsquo;s the one that is coming out on YouTube around now.</p> <p>It&rsquo;s a bit weird watching a new Taskmaster and assistant after so many seasons, but so far I really like Jeremy Wells and Paul Williams. They don&rsquo;t try to copy Greg Davis and Alex Horne (entirely), but rather build their own thing.</p> <p>Contestantwise, they&rsquo;re all fun this series (I think I always say that). I think my favorite this series was either Chris Parker or Josh Thompson. Either such chaotic energy or generally playing it straight &hellip; until doing something absolutely bonkers.</p> <p>Love it.</p> <p>Onward!</p>Gods of Jade and Shadowhttps://blog.jverkamp.com/2024/08/04/gods-of-jade-and-shadow/Sun, 04 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/04/gods-of-jade-and-shadow/She was but a girl from nowhere. Let the heroes save the world, save kings who must regain their crowns. Live, live, she wanted to live, and there was a way. Casiopea is a young woman stuck as the looked down upon, basically a servant cousin of her family. So when, one day, she opens a mysterious chest in her grandfather&rsquo;s room only to find a pile of bones&hellip;Ponyohttps://blog.jverkamp.com/2024/08/04/ponyo/Sun, 04 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/04/ponyo/<p>That is a strange movie.</p> <p>It&rsquo;s slower movie, with a magical style to the animation that&rsquo;s both truly beautiful and surprisingly terrifying at times. The plot is somewhere between simple and mostly absent and the characters are mostly&ndash;there?</p> <p>Overall, it was fascinating to catch in theaters as part of the <a href="https://gkids.com/ghiblifest/" target="_blank" rel="noopener">Studio Ghibli Fest 2024</a>&hellip; but not really something I&rsquo;d ever choose to watch again.</p> <p>Such is life.</p>Doctor Who: Season 1https://blog.jverkamp.com/2024/08/02/doctor-who-season-1/Fri, 02 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/02/doctor-who-season-1/<p>I&rsquo;ve watched through modern Doctor Who a few times, but it&rsquo;s been a while. I haven&rsquo;t actually caught the 13th Doctor yet, let alone 14 and 15&hellip; Now, with the new &lsquo;reboot&rsquo;, it&rsquo;s about time to give it another go. And a good time to review them this time around!</p> <p>Oh, I love this show. It&rsquo;s wacky and cheap looking at times. Tonally, we&rsquo;re all over the place, from farting aliens right up to the borders (if not more so) of horror with The Empty Child. Callbacks to the old show (which I still haven&rsquo;t watched, one day) and all new friends.</p> <p>I do wish we&rsquo;d gotten more of Eccelston, I forgot how much I liked his Doctor. But still, it&rsquo;s good to have what we have!</p> <p>Onward.</p>Spider-Man 2099 Classic, Vol. 2https://blog.jverkamp.com/2024/08/02/spider-man-2099-classic-vol.-2/Fri, 02 Aug 2024 00:00:00 +0000https://blog.jverkamp.com/2024/08/02/spider-man-2099-classic-vol.-2/<p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-man-2099-v2-textbundle-be7453.jpeg" alt=""></p> <p>Eugenics man? <a href="https://en.wikipedia.org/wiki/Lamarckism">Lamarckism</a> Guy?</p> <p>Or Mutagen I suppose.</p> <p>Bent on eradicating genetic diseases
 somewhat directly. With the power to adapt quickly to any threat. Interesting enough villain!</p> <p>Plus we get an issue or two each with SIEGE (Iron Man as a cop?) and <a href="https://en.wikipedia.org/wiki/Thanatos">Thanatos</a> (certainly seems to believe himself to be anyways).</p> <p>There’s a lot of chaos in this volume, but it’s enjoyable. I&rsquo;m not a <em>huge</em> fan of the older style&hellip; and this has decades over the very beginning of comics. We&rsquo;ll see where we go next. But for now, more Spider-Man!</p> <p>Side note:</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-man-2099-v2-textbundle-ce5296.jpeg" alt=""></p> <p>Convenient that.</p>Winter Losthttps://blog.jverkamp.com/2024/07/24/winter-lost/Wed, 24 Jul 2024 00:00:00 +0000https://blog.jverkamp.com/2024/07/24/winter-lost/<blockquote> <p>One of the first things he’d noticed about Mercy was that she understood people. She really knew how to get under their skin. Under his skin.</p> </blockquote> <p>It&rsquo;s time for my every year or two re-read of the <a href="https://blog.jverkamp.com/reviews/series/mercy-thompson/">Mercy Thompson</a> books, especially with a new one out! That&rsquo;s getting longer and longer each year, and I&rsquo;m <em>here</em> for it. I think these two series (including <a href="https://blog.jverkamp.com/reviews/series/alpha-omega/">Alpha &amp; Omega</a>) are now my favorite Urban Fantasy series, beating out even the Dresden Files (although it is close).</p> <p>Now, specifically for this book&hellip;</p> <p>Man, we&rsquo;ve come some ways. The last few books have gone thoroughly into &lsquo;woo woo&rsquo; territory (as Mercy increasingly calls it), with Mercy learning and gaining all sorts of new and interesting powers over the dead (<a href="https://blog.jverkamp.com/2021/05/31/storm-cursed/">Storm Cursed</a>), learning more than she&rsquo;d likely ever wanted about Wulfe (<a href="https://blog.jverkamp.com/2021/06/03/smoke-bitten/">Smoke Bitten</a>), and even <em>more</em> powers and Fae artifacts (<a href="https://blog.jverkamp.com/2022/09/05/soul-taken/">Soul Taken</a>).</p> <blockquote> <p>With Mercy, everything that can be worse is. Always.</p> </blockquote> <p>Things have gotten so <em>big</em>, so it&rsquo;s nice to have what actually turns out to be a relatively self contained book in Winter Lost. For the most part, we have almost a closed house murder mystery. Just Mercy, Adam, and a handful of other wild and strange folk stuck at a lodge in a winter storm.</p> <blockquote> <p>She was staring at him.</p> <p>“I could not live with losing you,” he told her, his throat tight. “There are times when I have had to let you go out into danger without me. More times when I haven’t known about threats to your life until they were long past. But this time
 this time I have the privilege of being backup while you head out to see if we can rescue your brother.”</p> </blockquote> <p>I love the focus this brings the book. And it really does give the two a chance, I hope, to love and trust each other. Adam has got some severe baggage from those witches <a href="https://blog.jverkamp.com/2021/05/31/storm-cursed/">a few books back</a> (plus all his other baggage I suppose) and Mercy has some serious wounds to deal with. This gives them that time. With a wild story that at once feels huge and world ending&ndash;and at the same time snug.</p> <p>I love it.</p> <p>We do also get a few fun peeks into what else is going on on the Mercyverse, primarily through flashbacks and asides told from a bunch of other points of view, which makes this structurally more interesting than any of the other books thus far.</p> <p>I&rsquo;m really looking forward to what comes next! (Although I&rsquo;m personally hoping for an <a href="https://blog.jverkamp.com/reviews/series/alpha-omega/">Alpha &amp; Omega</a> book next! What the cliffhanger).</p> <p>Onward!</p>Turning Darkness Into Lighthttps://blog.jverkamp.com/2024/07/06/turning-darkness-into-light/Sat, 06 Jul 2024 00:00:00 +0000https://blog.jverkamp.com/2024/07/06/turning-darkness-into-light/<blockquote> <p>Maybe you’re right about the past. But the stories we choose to tell—those matter. It’s important that the Anevrai told a story about harmony, that they went to the effort of writing it on finely made tablets with gold at their heart. Sacred tablets. That says it was an ideal. And even when we fall short of ideals, that doesn’t mean we should give up striving for them.</p> </blockquote> <p>And so, an extra book! We&rsquo;ve finished the main series that follows the eponymous Lady Trent, so now we get a book from the point of view of her granddaughter. On top of that, we&rsquo;re going full on epistolary format&ndash;it&rsquo;s told through diary entries, letters, and the text of in universe books.</p> <p>It&rsquo;s an interesting style and I think it gives a lot to the book. It&rsquo;s also non-linear, but not egregiously so.</p> <p>Overall, I think it&rsquo;s weaker than the first five Lady Trent books, but there&rsquo;s a bit more depth to the Draconean history we didn&rsquo;t quite get to in those books, which I appreciated. If that&rsquo;s something you were left wanting more of, go for it!</p> <hr>Black Mirror: Season 6https://blog.jverkamp.com/2024/07/05/black-mirror-season-6/Fri, 05 Jul 2024 00:00:00 +0000https://blog.jverkamp.com/2024/07/05/black-mirror-season-6/<p>Oh hey, I&rsquo;m all caught up!</p> <p>I actually watched <em>Joan is Awful</em> on accident a while back and that&rsquo;s really the highlight of the season. The problems with generative AI written perhaps a little too large, but that&rsquo;s what Black Mirror <em>does</em>.</p> <p>Other than that, this is really getting more into horror anthology territory, which I&rsquo;m not sure what to think about. I&rsquo;ll still catch Season 7 if/when it&rsquo;s out, but it&rsquo;s a bit less sure than I used to be.</p> <hr>The City of Brasshttps://blog.jverkamp.com/2024/07/05/the-city-of-brass/Fri, 05 Jul 2024 00:00:00 +0000https://blog.jverkamp.com/2024/07/05/the-city-of-brass/<p>18th Century Cairo. Street living, mixed with all manner of quasi magical cons (palm readings, faking healings). And then &hellip; one accidental summoning later and you&rsquo;re off swept into the magical world of childhood stories.</p> <p>The world building is really interesting. You get a touch of the Arabic world mixed with a straight up Arabic inspired fantasy world full of djinn in all manner of shapes and sizes&hellip; even at the end of the story, I&rsquo;m not actually 100% sure what all the differences are.</p> <p>Characterwise, I&rsquo;m not sure I ever quite got around to liking Nahri. I was rooting for her before she took off, but I&rsquo;m not thrilled where she ended up.</p> <blockquote> <p>“You&rsquo;re some kind of thief, then?&quot;<br> &ldquo;That a very narrow-minded way of looking at it. I prefer to think of myself as a merchant of delicate tasks.”</p> </blockquote> <p>Ali and Dara though, I quite like the both of them&ndash;surprisingly for roughly the same reasons. They are trying to do the &lsquo;right thing&rsquo;, just with rather opposing ways of going about that.</p> <blockquote> <p>“To keep walking a path between loyalty to your family and loyalty to what you know is right. One of these days, you’re going to have to make a choice.”</p> </blockquote> <p>Overall, I&rsquo;m looking forward to the second book. Onward!</p>Spider-Man 2099 Classic, Vol. 1https://blog.jverkamp.com/2024/07/02/spider-man-2099-classic-vol.-1/Tue, 02 Jul 2024 00:00:00 +0000https://blog.jverkamp.com/2024/07/02/spider-man-2099-classic-vol.-1/<p>Spider-Man!</p> <p>In a somewhat less far future than when this super was first written
 30 years ago.</p> <p>A future with no super heroes. Only the memory of those like Thor
</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-man-2099-v1-textbundle-88b003.jpeg" alt=""></p> <p>As a sort of religion? It’s an interesting bit of world building. I fully expect Spiderlings before the end of this volume
 (so close!)</p> <p>And an origin story. A new Spider-Man—Miguel O’Hara. Created in a lab “accident” after trying to quit a twisted bio engineering project.</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-man-2099-v1-textbundle-6bc6e9.jpeg" alt=""></p> <p>He said the line!</p> <p>Baddies? We have a forgettable cyborg. And one
 somewhat less forgettable. A samurai, possibly from 
 Stark-Fujikawa? A mysterious shadowy—very large—boss in the shadows. The Vulture. Downtown Freakers. Hints at even more.</p> <p>It’s quite an origin story. I’m enjoying jumping into another new world so far!</p> <p>Onward!</p>The Golf (Peaks) of Solvinghttps://blog.jverkamp.com/2024/06/17/the-golf-peaks-of-solving/Mon, 17 Jun 2024 00:00:00 +0000https://blog.jverkamp.com/2024/06/17/the-golf-peaks-of-solving/<p>Another day (week? month?), another puzzle game.</p> <p>This time around, we&rsquo;re going to solve <a href="https://store.steampowered.com/app/923260/Golf_Peaks/" target="_blank" rel="noopener">Golf Peaks</a>. I picked this up a while ago on iOS, but only recently on Steam. It&rsquo;s a cute little puzzle game themed around minigolf.</p> <p><img src="1.7-slopes.png" alt=""></p> <p>Basically, you&rsquo;re on a grid and you have to get the ball (in the bottom in that screenshot above) to the flag (currently at the top). You have a set list of moves you can take, styled as cards&ndash;all of which either move a certain number of tiles in a specific direction or possibly jump into the air (and fly over obstacles).</p> <p>It gets more complicated from there, but hopefully you have the basic idea. 😄</p>Final Heirhttps://blog.jverkamp.com/2024/06/11/final-heir/Tue, 11 Jun 2024 00:00:00 +0000https://blog.jverkamp.com/2024/06/11/final-heir/<p>And so it ends. With a bang <em>and</em> with a whimper.</p> <p>On one hand, the stakes (heh (yes, I know I just did that joke)) couldn&rsquo;t be higher. The Heir is coming. All the threads and mysteries of 15 books (that haven&rsquo;t otherwise been killed already) are coming back to rear their ugly heads.</p> <p>On the other hand, it doesn&rsquo;t quite land? You have literal angels and demons, but they&rsquo;re in far less of the book than would have made an impact. You have the big bad evil skinwalkers hinted at from the very beginning, but no real direct interactions with them. And you have vampire politics&hellip; but the Heir was never as interesting as the Sons of Judas.</p> <p>On the other other hand (I know), as a final book in the series, it does work. You get a decent bit of closure for most the main characters (that have survived thus far). The world has changed, almost certainly for the better&ndash;and if not, certainly the more interesting. And Jane finally seems happy.</p> <p>Was the series worth the read? Absolutely.</p> <p>Would I have preferred that the series went a different direction about when the whole &lsquo;Dark Queen&rsquo; idea was introduced? Probably.</p> <p>Was the whole deal with time fascinating&hellip; and then ultimately less used than it could have been. Yup.</p> <p>Overall, worth the read but I&rsquo;m also ready to move on to other things.</p> <p>Onward!</p>Within the Sanctuary of Wingshttps://blog.jverkamp.com/2024/06/10/within-the-sanctuary-of-wings/Mon, 10 Jun 2024 00:00:00 +0000https://blog.jverkamp.com/2024/06/10/within-the-sanctuary-of-wings/<p>And so it ends (sort of).</p> <p>Much like the previous books, it&rsquo;s an adventure to somewhere new and far off, this time deep into the mountains (once again) of totally-not-the-Himalayas!</p>Taskmaster: Series 16https://blog.jverkamp.com/2024/06/07/taskmaster-series-16/Fri, 07 Jun 2024 00:00:00 +0000https://blog.jverkamp.com/2024/06/07/taskmaster-series-16/<p>Another season, we&rsquo;re on a roll!</p> <p>Another great cast, and I absolutely enjoyed them all, although I didn&rsquo;t have a favorite stand out quite so much as did in the previous seasons.</p> <p>Poor Lucy through so many of those tasks, but she took it in stride. The Sues were great, especially together. Julian&ndash;so gay. And Sam Campbell was just a lot of fun&ndash;and that hair the last episode. O.o</p> <p>Onward to one more (for now)!</p> <p>And then of course&hellip; all of the other regional Taskmasters as well.</p>A Million Worlds with Youhttps://blog.jverkamp.com/2024/05/31/a-million-worlds-with-you/Fri, 31 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/31/a-million-worlds-with-you/<blockquote> <p>Fate doesn’t guarantee us a happy ending. We’re not promised to be together no matter what. But in dimension after dimension, world after world, fate gives us a <em>chance</em>. Our destiny isn’t some kind of mystical prophecy. Our destiny is what we do with that chance.</p> </blockquote> <p><a href="https://blog.jverkamp.com/2024/05/05/a-thousand-pieces-of-you/">A Thousand Pieces of You</a> introduced us to the multiverse and <a href="https://blog.jverkamp.com/2024/05/22/ten-thousand-skies-above-you/">Ten Thousand Skies Above You</a> brought it to the brink of war. Now, in A Million Worlds with You, the fighting is <em>on</em>.</p> <p>The core of the story comes in two parts:</p> <p>For one, we have Marguerite chasing a twisted echo of herself (who she names Wicked; I do enjoy how everyone just goes with her names throughout the book). The entire idea that Marguerite can&rsquo;t jump into the same world as Wicked and has to trail behind, digging herselves out of any trouble Wicked gets them into is fascinating. But by itself, entirely reactive.</p> <p>So for two, we have a war between dimensions. We have some worlds that were already aware of parallel realities, but now, finally, they are beginning to work together and push back against the Triad.</p> <p>To war!</p> <p>I do love the premise. It&rsquo;s solidly written and a worthwhile finish to the trilogy (although now I want more! what happens between all the worlds next?!). It &hellip; was rough to start it, mostly due to all the damage Marguerite and especially Paul went through last book, but that&rsquo;s sort of the the point.</p> <p>Well worth the read.</p>Spider-Man: Across the Spider-Versehttps://blog.jverkamp.com/2024/05/30/spider-man-across-the-spider-verse/Thu, 30 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/30/spider-man-across-the-spider-verse/<p>I still think the first one was the better movie, but man I still enjoyed this one. Biggest negative: I&rsquo;d totally forgotten this is a part one / to be continued. That was&hellip; not fun to find out right at the end with no current release date for the next sequel!</p> <p>Overall, it&rsquo;s a great film. I love seeing more of Miles and Gwen, especially a couple of years later. I love the introduction to even more Spider-People (and not-people even, oh Peter Parkedcar) and the introduction of even more multiverse concepts that brings to mind. And the idea that there are fixed points in each Spider&rsquo;s story that makes them who they are is great fuel, both for this and I hope the eventual sequel.</p> <p>Visually, this story once again shines. I love seeing all the different styles, especially when you have more than one on screen at once.</p> <p>And now, on seeing this, I learn that Marvel 2099 with more Miguel O&rsquo;Hara is a thing. I should read that next!</p> <p>Onward! (And hopefully not too long to a sequel.)</p>Taskmaster: Series 15https://blog.jverkamp.com/2024/05/29/taskmaster-series-15/Wed, 29 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/29/taskmaster-series-15/<p>We&rsquo;re almost caught up to the present day! And what a crew to catch up on.</p> <p>Mae Martin I think was my favorite, followed closely by Ivo Graham. Ironic given the final scores. 😄</p> <p>I did love Jenny Eclair&rsquo;s energy throughou the tasks though. And both Frankie and Kiell were a delight to watch as well. Really, I loved the entire cast.</p> <p>Favorite task of the season? Wayne. The flail&rsquo;y man.</p> <p>Go watch it and find out why. 😄</p>For All Mankind: Season 2https://blog.jverkamp.com/2024/05/28/for-all-mankind-season-2/Tue, 28 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/28/for-all-mankind-season-2/<p>Well that got away from me for a bit.</p> <p>After the explosive introduction that was <a href="https://blog.jverkamp.com/2024/01/16/for-all-mankind-season-1/">For All Mankind: Season 1</a>, with the Soviets beating the US to the moon and all that changed through that&hellip; no we&rsquo;re a decade in the future and things <em>continue to change</em>!</p> <p>It&rsquo;s fascinating to see Jamestown grow to a crew of around 20. The Baldwins have adapted a daughter. The chaos of escalating tensions, both on the moon and also back on Earth&ndash;and all the perils of space travel, even without that. And Gordo, Danielle, and Ed, back to space.</p> <p>And that&rsquo;s all in the first part of the week.</p> <p>Man this is a good show.</p> <p>And next season, with another time skip we may very well be going to Mars!</p> <p>Onward!</p>Ten Thousand Skies Above Youhttps://blog.jverkamp.com/2024/05/22/ten-thousand-skies-above-you/Wed, 22 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/22/ten-thousand-skies-above-you/<p><a href="https://blog.jverkamp.com/2024/05/05/a-thousand-pieces-of-you/">A Thousand Pieces of You</a> introduced us to the multiverse&ndash;and sent us on adventure across the worlds in a desperate gamble for revenge&hellip; Or perhaps to save a life. Or perhaps even to fall in love.</p> <blockquote> <p>The multiverse is infinite. So, yeah, we go through some terrible things together, and I’ve seen versions of you who are darker, and damaged, and I don’t care. I want you even when you’re broken. I want you no matter what. Your darkness, your anger, whatever it is you fear inside yourself—it doesn’t matter. I love you completely, don’t you see? I even want the worst of you because it’s <em>still a part of you</em>.</p> </blockquote> <p>Ten Thousand Skies Above You takes that idea and expands upon it in a fascinating way. Now, it&rsquo;s not just searching through the multiverse, it&rsquo;s the early stages of a war between realities. Once again, it&rsquo;s about saving a life, but this time, it&rsquo;s less a puzzle and more a scavenger hunt, with some <em>serious</em> repercussions if you don&rsquo;t find all of the pieces.</p> <p>Other than a cliffhanger ending (we&rsquo;ll come back to that&hellip;), it&rsquo;s really quite a good sequel. If anything, I think I enjoyed it even more than the first.</p>The Mysterious Benedict Society and the Prisoner's Dilemmahttps://blog.jverkamp.com/2024/05/20/the-mysterious-benedict-society-and-the-prisoners-dilemma/Mon, 20 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/20/the-mysterious-benedict-society-and-the-prisoners-dilemma/<p>Oh, that&rsquo;s a long book to read for a half a chapter a night (and not even every night). I enjoyed it, but I think I&rsquo;ve been enjoying each book in the series a little less.</p> <p>The first book, the kids were brilliant and that was the core of the story. They could think their way out of any wacky mystery they get into. Here, we have Constance literally reading minds and Reynie with his sixth sense for danger. Sticky with his perfect memory, reading just &hellip; everything in the house. Even Kate&rsquo;s magical bucket&ndash;nah, I still enjoy that one.</p> <p>On the other hand, there was a lot of action and for the most part, the kids are still working their way out of trouble all by themselves&ndash;even when a rescue is under way&ndash;and I enjoyed that. The plot itself didn&rsquo;t go to quite as adventurous destinations as the first two, which I missed.</p> <p>I still do really enjoy the found family aspects of the story on all levels. The kids themselves are great together and there are some really humorous points. And they&rsquo;re extended family all together, especially with Mr. Benedict, I really did enjoy that. They do get quite the sense of closure towards the end.</p> <p>Although there&rsquo;s apparently a 4th and a prequel, I think it&rsquo;s time to move on to something else.</p> <p>Onward!</p>In the Labyrinth of Drakeshttps://blog.jverkamp.com/2024/05/18/in-the-labyrinth-of-drakes/Sat, 18 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/18/in-the-labyrinth-of-drakes/<p>We&rsquo;ve been to the mountains, a swamp/rainforest, and on the ocean. What&rsquo;s next? To the desert!</p> <p>It&rsquo;s another book much like the first three: a bit of set up and lamenting the not-British society of the time, then off on an adventure! This time, as mentioned, to the deserts of Akhia.</p> <p>The inciting incident this time is that the military is trying to breed dragons&ndash;either to harvest them for bones or train them for war&ndash;is interesting enough and sure to appeal to Isabella. The whole how do dragons breed / how did we get such variety has been a question for a long time now, and I&rsquo;m just as curious as Isabella is to dig into it.</p> <p>Characterwise, it&rsquo;s a welcome delight to see Suhail again. I do quite enjoy seeing Isabella and Suhail&rsquo;s relationship develop and this book certainly doesn&rsquo;t slouch in that regard.</p> <blockquote> <p>I sometimes imagine there is a clerk behind a desk situated between the brain and the mouth. It is his job to examine utterances on their way out, and stamp them with approval or send them back for reconsideration. If such a clerk exists, mine must be very harried and overworked; and on occasion he puts his head down on the desk in despair, letting things pass without so much as a second glance.</p> </blockquote> <p>Oh they&rsquo;re fun.</p> <p>I will admit, after actually getting Jake at least somewhat in <a href="https://blog.jverkamp.com/2024/04/07/the-voyage-of-the-basilisk/">The Voyage of the Basilisk</a>, it&rsquo;s <em>weird</em> that he&rsquo;s just completely ignored again for the most part here.</p> <blockquote> <p>(Indeed, a female desert drake makes me look like a doting mother by comparison.)</p> </blockquote> <p>You&rsquo;re not wrong.</p> <p>Overall, if you&rsquo;ve enjoyed the books up to now, you&rsquo;ll almost certainly enjoy this one.</p> <p>Onward!</p> <p>(And only one left!)</p>S.H.I.E.L.D., Volume 1: Perfect Bulletshttps://blog.jverkamp.com/2024/05/17/s.h.i.e.l.d.-volume-1-perfect-bullets/Fri, 17 May 2024 00:00:00 +0000https://blog.jverkamp.com/2024/05/17/s.h.i.e.l.d.-volume-1-perfect-bullets/<p>Well that was a weird, wild, and chaotic ride. More than most comics even, this volume didn&rsquo;t feel like a volume so much as a series of vaguely connected issues. It&rsquo;s fun to see Coulson and S.H.I.E.L.D. doing their thing, but I honestly couldn&rsquo;t really get into the story before off we go again.</p>