<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Ty Sloane</title>
    <link rel="self" type="application/atom+xml" href="https://tysloane.ca/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://tysloane.ca"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-11-19T00:00:00+00:00</updated>
    <id>https://tysloane.ca/atom.xml</id>
    <entry xml:lang="en">
        <title>Frontend Performance Tuning</title>
        <published>2025-11-19T00:00:00+00:00</published>
        <updated>2025-11-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/frontend-performance-tuning/"/>
        <id>https://tysloane.ca/posts/frontend-performance-tuning/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/frontend-performance-tuning/">&lt;p&gt;I recently chatted with a potential client about some front-end work that I might be able to help them with. I was asked if I had any experience with front-end performance work, specifically with React. I chewed on this for a moment before answering that I didn&#x27;t.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s pretty rare that I&#x27;ve actually had the opportunity to work on a front-end where the actual performance was a pressing issue beyond anything else, where React and the UI is being pushed to its limits. The kind of situation where the UI&#x2F;UX is &lt;em&gt;so complex&lt;&#x2F;em&gt; that the UI chugs or is unresponsive—whether due to the sheer amount of data in the DOM or complex interactions etc..  But, nearly every time I&#x27;m working with React, performance is well above product requirements. Often, issues of performance are having to do with bottlenecks in backend service(s).&lt;&#x2F;p&gt;
&lt;p&gt;This realization made me feel a bit unchallenged and curious about what work I could find that might push this boundary for me. From observing some of the clients I&#x27;ve worked with (and other folks&#x27; experience on the teams I&#x27;ve been on), it seems that this kind of work appears more commonly for larger companies where they:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;a) might actually have front-end performance issues&lt;&#x2F;li&gt;
&lt;li&gt;b) have a budget to improve front-end performance, even if those changes would be (subjectively) negligible to users.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Note that this is just an observation I’ve had, working for client  companies ranging in size of 2 people to 3000 people (and plenty of legacy code).&lt;&#x2F;p&gt;
&lt;p&gt;Many years ago, my first boss at my first programming job said that most programming for the web is mostly building forms (and of course, displaying the data from those forms). He was being reductive to make a point—but at the end of the day, the statement did help me wrap my head around approaching web programming. As such, I think it&#x27;s pretty uncommon to find a user interface that isn&#x27;t related to form-esque CRUD operations, has a complex UI and user experience, and where performance is a problem. Web applications like Figma (and its use of web assembly) come to mind.&lt;&#x2F;p&gt;
&lt;p&gt;Another caveat in all this is that a lot of the time that I&#x27;m working on various front-ends, nobody, including myself, is testing for low-powered or lower-end devices. There&#x27;s a pretty evident bias as everyone working on the front end is usually working on some kind of high-powered MacBook Pro, and it&#x27;s altogether too easy to forget that many people are either on their phone or are likely on a much lower-powered device.&lt;&#x2F;p&gt;
&lt;p&gt;Even if performance is a problem, it is often forgotten (just like accessibility, unfortunately)—well, at least until a company has enough budget (or legal ramifications to deal with, in the case of accessibility) to sand down these rough edges. Perhaps this slow-to-move attitude is somewhat in line with the nature of developing for the browser—it&#x27;s easier to be reactive rather than proactive. The rigorousness of schemas and database security and other such things aren&#x27;t as pressing. Maybe there&#x27;s been a history of flexibility and leniency that puts performance in the backseat at times. I don&#x27;t know.&lt;&#x2F;p&gt;
&lt;p&gt;I hope I come across this sort of front-end work in the future, even if just for my curiousity’s sake. It might be more rare than I think.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Marvelous Programs: Syncthing</title>
        <published>2025-11-10T00:00:00+00:00</published>
        <updated>2025-11-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/marvelous-sync-thing/"/>
        <id>https://tysloane.ca/posts/marvelous-sync-thing/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/marvelous-sync-thing/">&lt;p&gt;I present to you a themed-blog-series called &lt;em&gt;Marvelous Programs&lt;&#x2F;em&gt;, in which I share various computer programs that make a big difference in my day to day life. &lt;a href=&quot;https:&#x2F;&#x2F;syncthing.net&#x2F;&quot;&gt;Syncthing&lt;&#x2F;a&gt; is a great one to pick as my inaugural post. I&#x27;ve used it on and off for probably six or seven years. More recently since setting up a new home server, it&#x27;s a mainstay in connecting several computers &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; together.&lt;&#x2F;p&gt;
&lt;p&gt;Following in the tradition of most Go programs, it works across multiple platforms as a single binary with everything contained. Using Syncthing is very similar to using a program like Dropbox. However, there isn&#x27;t necessarily a centralized UI that coordinates multiple computers so much as there are multiple computers all running their own instance of Syncthing.&lt;&#x2F;p&gt;
&lt;p&gt;I use Syncthing with the &quot;PARA&quot; methodology for organizing folders. I don’t sync my entire PARA folder-set so much as the projects I’m currently working on and any frequently accessed files. Syncthing is efficient enough that I can stop working on one computer and by the time I walk over to another it&#x27;s usually synced everything I need to continue whatever task I was working on.&lt;&#x2F;p&gt;
&lt;p&gt;Occasionally, while working in a git repository I will notice that I have a couple sync-thing conflict files but I haven&#x27;t looked into what&#x27;s causing this when it occurs as I&#x27;ve not actually encountered any corrupted files yet.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h4 id=&quot;footnotes&quot;&gt;Footnotes&lt;&#x2F;h4&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;At one point I was able to sync to my Android no problem, but when I switched to iOS, I did not have as much luck using syncthing, and have not been back to check how well it works on mobile since then.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>I miss Clojure</title>
        <published>2025-10-29T00:00:00+00:00</published>
        <updated>2025-10-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/i-miss-clojure/"/>
        <id>https://tysloane.ca/posts/i-miss-clojure/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/i-miss-clojure/">&lt;p&gt;I used to write Clojure for my day job. I worked on a contract for about 8 or 9 months where I had the pleasure of working in ClojureScript daily, both for building an API (yes, instead of using Clojure and the JVM) and for building a mobile app (this was well before shadow-cljs).&lt;&#x2F;p&gt;
&lt;p&gt;There were a lot of bumps along the way, and several strange bugs (I recall working with controlled inputs in re-frame on mobile to be particularly nasty), and yet it was one of the most delightful environments to be in. I was also using Emacs at the time, too. Paired with Clojure, I was working in the land of lisps. I loved the ability to evaluate code in a buffer and see the results pointed at by a nifty little ASCII arrow &lt;code&gt;=&amp;gt;&lt;&#x2F;code&gt;. In retrospect, this was the most niche set of tools I&#x27;ve ever used in my career. I&#x27;m glad for it not just for the sheer fun of writing Clojure code, but how much it taught about debugging my tools (for better or for worse).&lt;&#x2F;p&gt;
&lt;p&gt;Going to Clojure meetups and working with folks writing Clojure definitely changed my understanding of programming fundamentally—Lisps are known to do this. But as important (if not more important) as the tools were the people I had the pleasure of meeting and working with. It&#x27;s unfair of me to pigeon-hole a group of people based on their programming preferences, but I&#x27;m going to do that anyway—the folks I met who wrote Clojure were the most interesting programmers I&#x27;ve met—not just in their approachces to programming, but even their personal lives, as I got to know them.&lt;&#x2F;p&gt;
&lt;p&gt;The folks I met writing and reading Clojure were often the smartest people in the room. Whether by chance, luck, or circumstance—they were. I felt like I understood a fraction of what they did, but they were welcoming and happy to share their knowledge, even if I didn&#x27;t understanding everything on the first pass.&lt;&#x2F;p&gt;
&lt;p&gt;These days, if I&#x27;m working on any kind of full-stack project on my own, I almost always reach for Elixir and Phoenix. It has enough elements of Clojure but saves you the need to bolt together your web stack via a series of libraries. It is a powerful set of tools in its own right, and has its own unique communities, too. I like it a lot. I&#x27;ve read that Elixir took a lot of inspiration from Clojure. I can see that. But I haven&#x27;t yet had the joy of meeting many folks doing Elixir, and seeing their passion (I know they&#x27;re out there). I know that some of the things I&#x27;m sharing here are sentiments that others have felt in other programming languages—whether Go, Ruby, Rust, etc. It just happened, that for me, at the right time in my career and my personal life, it was Clojure.&lt;&#x2F;p&gt;
&lt;p&gt;This post&#x27;s title is true, I do miss Clojure. But I think I miss the people who used it, who got together to chat, share knowledge, and hangout more.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Impatienter and Dumberer</title>
        <published>2025-10-15T00:00:00+00:00</published>
        <updated>2025-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/dumberer/"/>
        <id>https://tysloane.ca/posts/dumberer/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/dumberer/">&lt;p&gt;Cheeky title aside, I&#x27;m going to contribute another take to the AI discourse. Useful or not, I can share my reflection that&#x27;s been running through my head lately.&lt;&#x2F;p&gt;
&lt;p&gt;I am noticing myself becoming more impatient and learning fewer programming-related-things due to my usage of LLMs.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s really not much more to say than that. What might have taken me more time and mental work in learning how to do something previously now simply doesn&#x27;t take any work at all. My brain is not learning new things. Not only that, when I try to stop and ask myself, &quot;Hey, would you like to try to learn this and actually read the documentation?&quot; I am too impatient to do so.&lt;&#x2F;p&gt;
&lt;p&gt;This is fine and good if your entire goal is to get that result. But as everyone and their cross-stitched pillow keeps telling me, it’s the journey that is more important than the destination. But I’m starting to not have a journey at all. I’m too impatient to even leave the house.&lt;&#x2F;p&gt;
&lt;p&gt;I sort of realized this as I took on setting up a home server, my first computer-y hobby project I’ve done in my free time in ages. You should see the long Claude conversations I had in order to orchestrate Docker, set up backup scripts, and learn enough about Arch Linux to be dangerous. But if you ask me how the nuanced parts work, I&#x27;d come up short. What&#x27;s more, nearing the end of theproject, I was growing so impatient to have my slick home server setup that I was barely reviewing the python code that Claude was spitting out. It may be a &lt;em&gt;me problem&lt;&#x2F;em&gt; but it&#x27;s still a problem.&lt;&#x2F;p&gt;
&lt;p&gt;Still, it was pretty amazing for me to be able to set up a home server with such little effort. I see now that with each project like this that I take on, there is an opportunity to assess: &lt;em&gt;is this one of those moments where I want to learn everything, you know, the old way?&lt;&#x2F;em&gt; or, &lt;em&gt;do I want to get results faster and risk getting impatienter and dumberer?&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Diving into self-hosting</title>
        <published>2025-10-03T00:00:00+00:00</published>
        <updated>2025-10-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/self-hosting/"/>
        <id>https://tysloane.ca/posts/self-hosting/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/self-hosting/">&lt;p&gt;I&#x27;ve tumbled deep down the rabbit hole of self-hosting&#x2F;home servers. As far as rabbit holes go (do they go on infinitely?), this has turned out to be an educational and fun one. What began with self-hosting our photos for our family has turned into an all-out slew of installing applications to try them out, explore, and come back with a cohesive system.&lt;&#x2F;p&gt;
&lt;p&gt;There are a lot of tutorials on getting started in this domain, so I won&#x27;t turn this post into that; more so, I&#x27;ll share what has been fun to explore and what tools I ended up using.&lt;&#x2F;p&gt;
&lt;p&gt;The current state of things ended up like this:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Running a Beelink SER8 with an added 1TB NVMe drive (for a total of 2TB internal space) running Arch Linux.&lt;&#x2F;li&gt;
&lt;li&gt;An external Samsung SSD I got on sale (2TB)&lt;&#x2F;li&gt;
&lt;li&gt;An external keyboard and monitor for when I don&#x27;t want to be using the CLI via SSH&lt;&#x2F;li&gt;
&lt;li&gt;The following programs:
&lt;ul&gt;
&lt;li&gt;Actual - Budgeting software&lt;&#x2F;li&gt;
&lt;li&gt;Audiobookshelf - Podcast and Audiobook manager&lt;&#x2F;li&gt;
&lt;li&gt;Booklore - Ebook manager&lt;&#x2F;li&gt;
&lt;li&gt;Bookstack - Low-resource wiki&lt;&#x2F;li&gt;
&lt;li&gt;Caddy - Router&lt;&#x2F;li&gt;
&lt;li&gt;Ghost - Blog&#x2F;CMS&lt;&#x2F;li&gt;
&lt;li&gt;Jellyfin - Media streaming&lt;&#x2F;li&gt;
&lt;li&gt;Paperless-NGX - Document management&lt;&#x2F;li&gt;
&lt;li&gt;Umami - Analytics for public sites&lt;&#x2F;li&gt;
&lt;li&gt;Homepage - Internal bookmarks for running programs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I use all of the above with varying degrees of frequency, with Immich, Actual, and Ghost being the most frequent. I really like Paperless-NGX—a program that allows you to scan, perform OCR, and tag and file away paper documents.&lt;&#x2F;p&gt;
&lt;p&gt;It took about a month of puttering on and off in the evenings to get things working. As is my custom with these kinds of tinkery projects, I just set sail with an idea and chase it across the horizon until everything works. Sometimes this would get frustrating, and other times it was surprisingly easy.&lt;&#x2F;p&gt;
&lt;p&gt;Along the way I learned more about Docker, which had previously been a black box, as well as &lt;code&gt;systemd&lt;&#x2F;code&gt; timers, &lt;code&gt;cloudflared&lt;&#x2F;code&gt;, and a backup program called &lt;a href=&quot;https:&#x2F;&#x2F;restic.net&#x2F;&quot;&gt;Restic&lt;&#x2F;a&gt;, which took some time to wrap my head around. Which leads me to backups:&lt;&#x2F;p&gt;
&lt;h2 id=&quot;backing-up&quot;&gt;Backing up&lt;&#x2F;h2&gt;
&lt;p&gt;Several weeks went by where I was actually using the above programs, filling them with data, before I thought about building a backup plan. This became a little scary, so I spent some time investigating Restic. In short, it allows you to sync files from Location A to another &quot;repository,&quot; Location Z. What&#x27;s more, you can remotely access those files by &quot;&lt;a href=&quot;https:&#x2F;&#x2F;forum.restic.net&#x2F;t&#x2F;can-someone-explain-fuse-and-mounting&#x2F;3988&quot;&gt;mounting&lt;&#x2F;a&gt;&quot; the repo, and then explore and interact with the directory as if it were locally available (it&#x27;s not). I think it can do a lot more, but I haven&#x27;t needed anything beyond what I&#x27;ve gotten set up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hobby-satisfaction&quot;&gt;Hobby Satisfaction&lt;&#x2F;h2&gt;
&lt;p&gt;There is undoubtedly a satisfaction to self-hosting. During my research, I occasionally came across people (usually on r&#x2F;self-hosted) asking how much time&#x2F;money people were saving running their own server. Most times the replies were along the lines of &quot;I have spent more time &amp;amp; money than I have saved.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Running your own server is undoubtedly a tinkerer&#x27;s wonderland. There&#x27;s no shortage of things to try and tune, as well as necessary tasks like keeping things up to date and being wary of falling behind on security updates.&lt;&#x2F;p&gt;
&lt;p&gt;With that said, I&#x27;ve managed to host two Ghost sites, which saves me paying $9 a month through Ghost&#x27;s hosting, or for a Hetzner or the like hosting option. If I continue using just Immich to host photos, I would be saving upward of ten to twenty dollars a month on something like iCloud storage or Google Storage.&lt;&#x2F;p&gt;
&lt;p&gt;That might seem insignificant to some (especially when contrasting it with the amount of time spent learning and setting up a home server), but saving somewhere around $50 or so dollars yet also understanding and operating the system that manages your own data is a sort of combined satisfaction that I haven&#x27;t really experienced before.&lt;&#x2F;p&gt;
&lt;p&gt;More important than any monetary savings is a satisfaction that comes with knowing how a system that benefits you (and a few friends and family perhaps) operates under the hood. I&#x27;ve figured out a few more things about Docker, systemd, Arch Linux along the way, also sparking curiosity about databases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-word-of-warning&quot;&gt;A word of warning&lt;&#x2F;h2&gt;
&lt;p&gt;As much as I’ve enjoyed this process, I’m aware of at least some of the risks. The reality is that I could lose all my data. I could even have a backup on Backblaze or Hetzner and that could disappear too. I can’t hold a candle to iCloud’s reliability. I could spill water on my server, have a power outage that zaps the computer into oblivion, so on and etc.&lt;&#x2F;p&gt;
&lt;p&gt;On top of that, exposing services to the internet is a bit scary if you don’t know the full expanse of what might be involved in securing a service. I felt I did my due diligence here, but I also imagine it won’t take much to prove me wrong there.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;returning-from-the-rabbit-hole&quot;&gt;Returning from the rabbit-hole&lt;&#x2F;h2&gt;
&lt;p&gt;There are a few avenues I still want to explore - a few apps I want to try and different Linux distributions. I’m very interested in nix&#x2F;os (but it seems I would need to divide myself in two so that one life can spend its waking hours comprehending that world) as well as several other programs I haven’t tried setting up (Vaultwarde, Forgejo, Komodo, Navidrome).&lt;&#x2F;p&gt;
&lt;p&gt;Moving on from this project is difficult—there’s a lot more I could do, a seemingly infinite number of tweaks and turns to dials and knobs. I’ve mostly left this working and abstained from installing more applications just because I (and the server) have the bandwidth to do it.&lt;&#x2F;p&gt;
&lt;p&gt;If you get a chance to run a home server, I’d recommend it. MiniPCs and Raspberry Pi’s are available and affordable. Understand the risks and do your due diligence. Information is widely accessible on how to get things set up. I used Claude plenty of times to help with learning how to dump databases, writing scripts to back things up (please, make sure you audit and review all code you use from LLMs) and to do general debugging when necessary.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Radio Silence - An Unfinished Playdate Game</title>
        <published>2025-06-12T00:00:00+00:00</published>
        <updated>2025-06-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/radio-silence/"/>
        <id>https://tysloane.ca/posts/radio-silence/</id>
        
        <summary type="html">&lt;p&gt;About 8 months ago, I started building my second game for the Playdate. The working title was &quot;Black Hole&quot; (later to be renamed &quot;Radio Silence&quot;) and the idea was simple: you are a crew member in a spaceship that needs to enter a black hole. And so you orbit around the black hole, collecting raw materials from space debris, which you then use to craft items to help you successfully enter and cross through a black hole without getting crushed (Yes, I know that it&#x27;s physically impossible to go through a black hole, but this is also a fictional game).&lt;&#x2F;p&gt;
&lt;p&gt;When I started this game, I was coming off the momentum of&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Exploring Zellij + Helix</title>
        <published>2025-01-11T00:00:00+00:00</published>
        <updated>2025-01-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/im-in-the-terminal-now/"/>
        <id>https://tysloane.ca/posts/im-in-the-terminal-now/</id>
        
        <summary type="html">&lt;p&gt;I have been exploring some new coding tools lately, specifically &lt;a href=&quot;https:&#x2F;&#x2F;helix-editor.com&#x2F;&quot;&gt;Helix&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;zellij.dev&#x2F;&quot;&gt;Zellij&lt;&#x2F;a&gt;. Before I dive into those, let&#x27;s talk about emacs. I&#x27;ve been an Emacs user for about seven or eight years, primarily using it as a GUI application rather than in the terminal. I love it – it&#x27;s incredibly powerful, and the key bindings are burned into my fingertips at this point. Emacs served as my one-stop solution for pretty much any programming language, and the addition of native compilation and LSP-related tooling made it even more capable. I particularly benefited from its rich ecosystem, saving countless hours with tools like Magit and Org Mode.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Electrolight Devlog</title>
        <published>2024-06-24T00:00:00+00:00</published>
        <updated>2024-06-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/electrolight-devlog/"/>
        <id>https://tysloane.ca/posts/electrolight-devlog/</id>
        
        <summary type="html">&lt;p&gt;What follows is the entire devlog for the first game I ever really finished — &lt;strong&gt;ElectroLight&lt;&#x2F;strong&gt; for the Playdate! Electrolight is &lt;a href=&quot;https:&#x2F;&#x2F;weakty.itch.io&#x2F;electrolight&quot;&gt;available on itch.io&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Pen Plotting Pals</title>
        <published>2024-05-22T00:00:00+00:00</published>
        <updated>2024-05-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/pen-plotting-pals/"/>
        <id>https://tysloane.ca/posts/pen-plotting-pals/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/pen-plotting-pals/">&lt;p&gt;This past weekend, I wrapped up a project I&#x27;ve been working on for a few months: making some pen plotter art for a friend as a surprise gift. Here&#x27;s the end result:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;pen-plotting-pals&#x2F;.&#x2F;02.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The three images above depict locations in Toronto (plotted in black) overlaid with the bike routes (plotted in orange pen) of my friend Chad, who does food bank deliveries through the Bike Brigade. I had a lot of fun making this—below I&#x27;ll walk through the process in more detail.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-lots-of-gpx-data&quot;&gt;Getting lots of GPX Data&lt;&#x2F;h2&gt;
&lt;p&gt;Earlier in the year, Chad shared some GPX data with me that were dumps from Ride With GPS, so I could move them into Strava via their API integrations. After helping with that, I had hundreds of GPX data files just sitting around doing nothing on my hard drive.&lt;&#x2F;p&gt;
&lt;p&gt;Around the same time, my friend Henry showed me a program called QGIS, and we hacked around with it a little bit during a side-project night. After digging into QGIS, I started to explore making a poster with the GPX data I had kicking around. I spent a few weeks noodling on this but ended up discarding an idea, not really being happy with the design that I created.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;accessing-the-pen-plotter&quot;&gt;Accessing the pen plotter&lt;&#x2F;h2&gt;
&lt;p&gt;A few months later I became acquainted with an Axidraw, which is a pen plotter tool. The Axidraw was made available in my co-working space thanks to a generous member who had brought it in, encouraging others to play around and learn how to use it.&lt;&#x2F;p&gt;
&lt;p&gt;During another side project night, Henry showed me how to use the pen plotter. And in the span of that night, we were able to draw a local map using QGIS, Inkscape, and the Axidraw. We watched, mesmerized, as the pen plotter plotted away.&lt;&#x2F;p&gt;
&lt;video width=&quot;100%&quot; height=&quot;240&quot; controls&gt;
  &lt;source src=&quot;.&#x2F;03.MOV&quot; type=&quot;video&#x2F;mp4&quot;&gt;
&lt;&#x2F;video&gt;
&lt;p&gt;With my poster idea in the project graveyard, using a pen plotter became an appealing alternative for making some art with the GPX data I had sitting around. After this most recent side project night, I had a rough idea of what the work would involve to do the same thing but with GPX data on top:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;(re-learn how to) pull down vector tile maps&lt;&#x2F;li&gt;
&lt;li&gt;overlay GPX data&lt;&#x2F;li&gt;
&lt;li&gt;figure out how to export separate layers and send them to Inkscape as SVGs&lt;&#x2F;li&gt;
&lt;li&gt;learn how to work with the AxisDraw with Inkscape.&lt;&#x2F;li&gt;
&lt;li&gt;use the AxisDraw, with a mixture of multiple inks, preferably.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;working-with-qgis-and-gpx-data&quot;&gt;Working with QGIS and GPX Data&lt;&#x2F;h2&gt;
&lt;p&gt;I began by making a new project in GPX and tried to find a way to batch import large quantities of GPX data. It turns out it&#x27;s not too difficult using a Batch GPX Importer &lt;a href=&quot;https:&#x2F;&#x2F;plugins.qgis.org&#x2F;plugins&#x2F;batch_gps_importer&#x2F;&quot;&gt;plugin&lt;&#x2F;a&gt; that I found through this GIS &lt;a href=&quot;https:&#x2F;&#x2F;gis.stackexchange.com&#x2F;questions&#x2F;159360&#x2F;how-to-bulk-import-gpx-files-to-qgis-and-merge-into-a-single-shapefile&quot;&gt;forum post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I also found a post getting into how to &lt;a href=&quot;https:&#x2F;&#x2F;wanderingcartographer.wordpress.com&#x2F;2021&#x2F;01&#x2F;09&#x2F;qgis-3-and-vector-map-tiles&#x2F;&quot;&gt;import vector map tiles&lt;&#x2F;a&gt;.  It would later turn out that I wouldn&#x27;t actually need this Vector Map tile, although it provided a useful base layer to then lay on top of the street lines and the GPX lines. Since I only really needed to draw lines to represent roads, Henry showed me a way to use something called &lt;a href=&quot;https:&#x2F;&#x2F;plugins.qgis.org&#x2F;plugins&#x2F;QuickOSM&#x2F;&quot;&gt;Quick OSM&lt;&#x2F;a&gt; to query for just the content that you want from OpenStreetMap. This allows you to, say, ask for highways or residential homes or other things you might find on a map without having to necessarily pull in everything.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;pen-plotting-pals&#x2F;.&#x2F;05.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Above is a screenshot of how the GPX data looks over top of the whole city.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;pen-plotting-pals&#x2F;.&#x2F;04.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Above screenshot demonstrates querying just street map lines and overlaying GPX data.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;preparing-a-test-print&quot;&gt;Preparing a test print&lt;&#x2F;h2&gt;
&lt;p&gt;Once the above was in place, I decided it was time to actually get plotting using the Axidraw. During this session, I read some documentation on the Axidraw and Inkscape, and found that it wasn&#x27;t too complicated. I had used Inkscape a lot when I was a teenager, and so I was still familiar with the interface, and honestly, it hasn&#x27;t changed a ton. I looked for some tips and people described, starting with a small test print. What I had above was far too complicated, so I decided to try and clip my SVG to just show a smaller section of the map and just print that.&lt;&#x2F;p&gt;
&lt;p&gt;Along the way, I learned about spatial bookmarks, which are a useful tool in QGIS. Basically, you can align your map the way you like, looking at a specific viewport of it, set a bookmark and then be able to return to that view at any time. This was useful as I started to set what I wanted to be the exact regions I would print.&lt;&#x2F;p&gt;
&lt;p&gt;Exporting SVGs from QGIS is a bit confusing, and I didn&#x27;t actually write down how to do it in my log for this project. Basically, there&#x27;s a canvas tool that allows you to create an export in QGIS, and then you can spit out an SVG or a PDF. Once I had an output, I tossed it into Inkscape and clipped it to a page size of 3.5 inches by 4.5 inches and decided to do a few different tests for the Axidraw.&lt;&#x2F;p&gt;
&lt;p&gt;First, I tried using a Platinum Preppy fountain pen. It&#x27;s a great pen, it&#x27;s cheap, and it&#x27;s very smooth. But I quickly learned that you should be using the same type of pen if you&#x27;re doing multiple colours, because the width of the pen in the holder is actually going to change where the ink comes in contact with the page. A bit obvious in retrospect. I also quickly realized that there were some parts of the GPX data that were tightly condensed and ended up tearing through the paper.&lt;&#x2F;p&gt;
&lt;p&gt;Next, I tried using microns. I had two in black and orange of the same size. I had read that they were great candidates for pen plotters; however, I didn&#x27;t have much success. They either got bent or became quite dry in the process of plotting.&lt;&#x2F;p&gt;
&lt;p&gt;Along the way, I found a great &lt;a href=&quot;https:&#x2F;&#x2F;www.dirtalleydesign.com&#x2F;blogs&#x2F;news&#x2F;favorite-pens-for-axidraw-plus-registering-multiple-layers-a-how-to&quot;&gt;blog post&lt;&#x2F;a&gt; about different pens to use with pen plotters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;three-completed-prints&quot;&gt;Three completed prints&lt;&#x2F;h2&gt;
&lt;p&gt;A few days later, I had a successful working session on this project. I returned to the co-working space with some new paper to test, some mixed media 100-pound 12 by 9 paper that I had bought a couple of years ago during the pandemic. I thought it would be stronger and hold up better than printer paper, which it did, but it still got torn by the pen plotter’s repeating strokes on very dense areas. So I did some more research and headed over to the art store to pick up some Bristol paper. &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then I tried printing using the Jelly Roll pens by Sakura, the same company that makes Microns. I found that the Jelly Roll 08 Orange and Black turned out to be far superior to the Microns. I was a little concerned that they might not have the same archival quality, but in the end, big shrug.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trimming-the-plots&quot;&gt;Trimming the plots&lt;&#x2F;h2&gt;
&lt;p&gt;The next day I got up early, made my breakfast, and dedicated about 45 minutes to chipping away at this. I trimmed the edges of the prints and had a good time doing that. It was actually very satisfying, although I did make a few mistakes. Not a big deal, though, because I&#x27;ll be using a mat to cover up the prints and uneven trimmings won&#x27;t show. I created a mock mat out of a thick piece of mixed media paper to see how it&#x27;d look with two images up, and I was pretty happy with it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;framing&quot;&gt;Framing&lt;&#x2F;h2&gt;
&lt;p&gt;I wasn&#x27;t sure what I would do for framing or for the mat. I didn&#x27;t really want to take it to a frame store because I knew it would be expensive. So I looked around a few thrift stores, but couldn&#x27;t find anything remotely useful.&lt;&#x2F;p&gt;
&lt;p&gt;Then, I happened to mention this project that I&#x27;ve been working on to a friend, and she quickly pointed out two respective websites for buying frames and buying custom mats &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. I was able to use the online web interface for the mat to request three cutouts, and it came to $15 or so, while the respective frame was around $60 for an 18 x 12.&lt;&#x2F;p&gt;
&lt;p&gt;Both the frame and the mat showed up in about 6 days. I was pleased with the look of both, although they are not the quality you would find in a frame shop. But for the price, it&#x27;s hard to make an argument otherwise, at least for a project like this. The frame didn&#x27;t come with real glass (well, maybe it&#x27;s plexiglass). You peel off two thin films on either side of it, and then you have this clear sheet of plastic, basically.&lt;&#x2F;p&gt;
&lt;p&gt;My partner, who has experience in custom framing, helped me mount the pieces on the mat, frame them, and stick it all together.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;&#x2F;h2&gt;
&lt;p&gt;This was a super fun project. It&#x27;s a bit of a strange one in that I started it nearly a year ago, but in a different way. Sometimes it can be hard to table ideas or give up on them completely. But this was a nice example of seeing something kind of come back from the dead a little bit. I really enjoyed working with the pen blotter. It satisfies the parts of my brain that want to create art, but also use code or other technical tools to make them.&lt;&#x2F;p&gt;
&lt;p&gt;I haven&#x27;t framed a piece of art either for myself or anyone else in a long time, but it creates a sort of finality around what you&#x27;ve done, which is really satisfying. I was surprised to find that I wasn&#x27;t really doting too much on the final appearance of this creation. The glass that came with the frame got a little bit scratched, the pen plots aren&#x27;t perfect, I tore the paper when cutting them by hand, but none of this really matters too much to me and none of it is really visible to the viewer. I&#x27;m learning to identify imperfections in whatever I&#x27;m working on and starting to see when they really matter vs when only &lt;em&gt;you&lt;&#x2F;em&gt; will know they exist.&lt;&#x2F;p&gt;
&lt;p&gt;This was also a great follow-up project to creating Electrolight and publishing it. I wanted a break from gamedev before embarking on another game. This project took about three months to execute, but that was spread out over only, say, six or seven actual sessions of focused work.&lt;&#x2F;p&gt;
&lt;p&gt;I look forward to coming back to the Axidraw, creating playful art for just myself, and seeing what I can come up with, maybe on different surfaces with different kinds of pens, or maybe something more experimental.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;footnotes&quot;&gt;Footnotes&lt;&#x2F;h2&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;Side note, I never really realized where the word Bristol board came from, but Bristol is kind of paper I guess. It&#x27;s often used for markers, making comics, or anything that needs a smooth tooth.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;Small lesson&#x2F;note to self: just tell your friends what you&#x27;re working on. If I hadn&#x27;t mentioned my search for a frame, I wouldn&#x27;t have gotten this helpful advice. I&#x27;ve been way too bashful to talk about my projects in the past.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The road to Half Marathon</title>
        <published>2024-05-22T00:00:00+00:00</published>
        <updated>2024-05-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/the-road-to-half-marathon/"/>
        <id>https://tysloane.ca/posts/the-road-to-half-marathon/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/the-road-to-half-marathon/">&lt;blockquote&gt;
&lt;p&gt;This past Sunday, I completed my first half-marathon race. It was an overwhelming success by my standards: good weather, good friends, good running. I have been training for this run since May of this year and I&#x27;m pleased with how it all went down. I decided to write a log as I trained. I kept going strong, logging entries after runs, all the way up to September. I&#x27;ll include the entirety of the log, some 5000 words below the race-day recap.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;the-race&quot;&gt;The Race&lt;&#x2F;h3&gt;
&lt;p&gt;For me, the race began the night before when nine of us got together to have dinner. Several of my friends had joined a running club back in the spring and had encouraged me to join the runs (and eventually, to sign up for the half-marathon). I wouldn&#x27;t have signed up without this encouragement (and partially the jealousy of missing out). Anyway, I&#x27;ve never been one for throwing parties, but having these friends over for dinner to celebrate our training (and to eat a lot of carbs) was such an obvious delight for me that we set to preparing the meal and making room for 9 people with glee.&lt;&#x2F;p&gt;
&lt;p&gt;For dinner we had: vegan pasta, spaghetti, a kale salad (with hunks of baguette croutons), 4 homemade pizzas, a homemade focaccia, and a bread cake. We ate, and we ate, and we ate.&lt;&#x2F;p&gt;
&lt;p&gt;Jeff, my oldest friend (and &lt;em&gt;newest&lt;&#x2F;em&gt; running mentor) stayed the night, visiting from out of town. We cleaned up after dinner and made our plan for the morning. Up at 5, out the door at 6:30. We both slept well enough, and got moving. I&#x27;m still getting used to how dark it is at this time of year. We made oats and then went for a walk in hopes of getting our stomachs moving. It was dark as the middle of the night as our footsteps echoed around the block.&lt;&#x2F;p&gt;
&lt;p&gt;We got back and got on our bikes and made our way down to Queen and University. It was fairly empty at 6:45 in the morning, compared to the absolute swarms of people who would show up in the next hour. We dropped off our bags and went looking for the washrooms. The line up for the main washrooms was unbelievably long, so we set off jogging to try to find an alternative. Just around the corner on Armoury st. we found what we were looking for. We stretched and warmed up.&lt;&#x2F;p&gt;
&lt;p&gt;Jeff and I set off to find our corrals. Jeff would be in the very first—aiming to be his personal best of 1:23:58(!). We hugged and wished each other good luck; I knew the race would be emotional for me at times, including in that moment—knowing the ambitions we had for ourselves. For me, Jeff had donated his time and advice generously, helping me prepare the way for first-time training for &lt;em&gt;anything&lt;&#x2F;em&gt;, and my first actual race.&lt;&#x2F;p&gt;
&lt;p&gt;I found my way to my corral, wandering through hordes of people, unsure of where I was supposed to be. Eventually I found the blue corral, got in and waited. It was at least 30 minutes between Jeff starting and my corral starting. I listened to music and tried to keep warm.&lt;&#x2F;p&gt;
&lt;p&gt;The race started off slow for me. I was trying a new feature on my Garmin running watch Jeff had shown me — a feature called &lt;em&gt;Pace Pro&lt;&#x2F;em&gt; that provides kilometer-by-kilometer pacing strategies. Unfortunately, using this new-to-me feature meant that my watch seemed computationally overloaded—it couldn&#x27;t play music at the same time as offering pacing instructions (which, writing this down now, feels absolutely absurd to me that a watch can do &lt;em&gt;any of this stuff&lt;&#x2F;em&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;So, I ran without music for the first 12 km. The first half of the half was great. It felt insignificant to what would come next. I ambled along between 5:30 and 6:00 per kilometre. I took in the signs of the cheering spectators and didn&#x27;t feel like I was pushing myself particularly hard. By the time I hit about 8 or 9km I started to feel a bit fatigued—but to my surprise, still fine. The only thing: I had to pee (of course). But I refused to stop and continued on, still taking water&#x2F;electrolyte-drinks passed out by volunteers at every opportunity. At this point, I didn&#x27;t feel the impact of the cheers, but I did appreciate the brass band on Bathurst!&lt;&#x2F;p&gt;
&lt;p&gt;Eventually, I hit Lakeshore. The sun was bright and on me. I felt some fatigue, but largely fine. I used an energy packet called a &quot;Gu&quot; at 12k. I didn&#x27;t much feel like eating it, but knew it would probably be for the best. I started to wonder when I&#x27;d arrive at the turn-around point to come back along Lakeshore—I watched impressive runners already coming back at high speed. Along Lakeshore were many bushes and trees, but I resisted the temptation.&lt;&#x2F;p&gt;
&lt;p&gt;Before long, I was at 14km. Here something strange happened to me. I think it was the music, which I tried to get working several times, and had finally stuck. I became possessed by a sleeping energy. I sped up. I really sped up. I was jumping up onto the curb to pass people in large swathes. My average pace went from 5:23 at 14km, to 5:07, to 5:00, to 4:54, to 4:32.&lt;&#x2F;p&gt;
&lt;p&gt;At several points during the race, I felt emotional. I couldn&#x27;t quite cry though, whether for focus, or my brain just going haywire. But I was running high at this point. A few tears leaked out, but I was probably also grinning like an idiot. Suddenly, the cheers from the spectators meant a lot more. I remember locking eyes with a woman giving out high fives. She pointed fiercely at me, her eyes determined as if to say &lt;em&gt;you! you&#x27;re giving me a high five!&lt;&#x2F;em&gt;, I returned the look, and ran by, fulfilling the contract, and speeding up for it.&lt;&#x2F;p&gt;
&lt;p&gt;The crowds of spectators and the sound of cheering got louder and louder as I approached the finish line. I saw my partner and Jeff cheering me on in the very last stretch. I was shocked out of my running reverie. Their cheers meant the world to me. I stopped and gave them both a hug, despite their cries to &lt;em&gt;keep going, keep going!&lt;&#x2F;em&gt;. What&#x27;s 5 seconds to give a hug to your people — I already knew I was well ahead of my goal—sub 2:00—thanks to my new pal &lt;em&gt;Pace Pro&lt;&#x2F;em&gt;. Everything was just gravy at this point.&lt;&#x2F;p&gt;
&lt;p&gt;The last kilometer got hard, though. Really hard. All of a sudden I felt like stopping. I &lt;em&gt;had to stop&lt;&#x2F;em&gt;—I had not walked yet, but suddenly it seemed like the safest thing to do. If I saw myself, I&#x27;d probably have looked paler than usual (if possible?). I was scared I was going to collapse. I had pushed too hard. My burst of speed had lasted up to the last 200 metres or so of the race—there was no keeping it up. As soon as my feet stopped to walk, I looked up—the finish line was right in front of me.&lt;&#x2F;p&gt;
&lt;p&gt;So, I trotted through to the end.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps stopping for the hug was part of it - my body came down in that moment, and trying to get it going again was a hard argument to make. Passing through the finish, I took several slow breaths, looking around somewhat frantically for water. I couldn&#x27;t believe how anxious I felt. I had been on top of the world for the last 20 minutes, but it just hadn&#x27;t lasted right to the end. This being my first race, I had no idea what kind of state I was putting myself into—I was just going along for the ride.&lt;&#x2F;p&gt;
&lt;p&gt;I ended up fine, in all respects. I found water, I found my friends, and I found some food. I could feel the emotions rising as I approached my partner and Jeff. I hugged them both, and cried a little. Jeff hit a new PB (1:20:31!), and came 98th out of &lt;em&gt;13,000&lt;&#x2F;em&gt; or so runners. I had finished sub 2:00. It was a good day. We waited in the sun for the rest of our group. The race was over. We got on our bikes and went home.&lt;&#x2F;p&gt;
&lt;!--

&lt;details&gt;
&lt;summary&gt;Log&lt;&#x2F;summary&gt;


## 2024-05-22

There&#x27;s a huge moon tonight, but I only noticed it toward the end of the run. It&#x27;s been another sweltering day at the end of May. I had a long day of running around to get prepared for camping, but I&#x27;m able to squeeze in another run. This is my second run in my first week of a training course that I signed up for. I found the course through Garmin by way of purchasing a GPS watch with dozens of features, not limited to training courses.

But let me back up some more since this is officially the first entry in the long running log of my journey toward a half marathon race in October. I wish I could capture some of the thoughts that I have while running because my head is in a swirl of so many things that all feel so good: I&#x27;m in the moment of trying to keep a steady pace, I&#x27;m getting into the music that I&#x27;m listening to, I have creative thoughts, I have totally pragmatic planning thoughts. All of it feels welcome. I feel like I can simultaneously write poetry, plan the next week of work, and push myself to go at a pace that I find challenging all at the same time.

And then I come home covered in sweat, down a glass of water, and jump in the shower. Before long, I start to lose some of that high. And here I am trying to write it out before it completely disappears before I go to sleep.

Tonight I grooved out to the same old playlist. _Dimed Out_ by Titus Andronicus always gets me fired up and I feel like I could bend open the bars of a jail cell. Then some Teen Daze came on. I finished off my run listening to Emperor X. 

This first week of runs is pretty simple. Run a 5-minute warm-up, 10 minutes at a steady pace between 6:05ish to 5:45ish, I think. I have a hard time not going faster, especially when the music is good. Tonight&#x27;s run was smooth. I had some knee pain at the start, but the warm-up took care of that, and then before long I was going. I hit a small stumbling block when I stopped after 20 minutes to take a look at a semi-pro baseball game I passed by , finding myself with a cramp after I got going again. I&#x27;m not sure where the training plan goes next, but I look forward to pushing into longer runs.

There’s so much I want to write about that I’ve been feeling while running. I want to write about this running watch and how much I already love it, nerd that I am. I want to write about the way music feels while running, about how keeping a steady pace really is the epitome of the cliché _it’s a marathon nor a sprint_, and so on.

See you next time.

## 2024-05-28

I&#x27;ve had about four days off from running thanks to a semi-relaxing camping trip (so, so many bugs).  I got back yesterday, showered off the smell of smoke, unpacked, made a quick ramen for dinner, cleaned more, and then went for a run with a friend. It was our first time running together, and it was pleasant, save for a car who nearly hit us rolling through a stop sign (I was wearing a _very bright_ headlamp, too). A quick lesson in defensive running. I was at least proud of myself—the dude apologized profusely and I was civil about it. 

Running with a friend, and at night, meant compromising pace a little bit. But as I told my pal, _friends&gt; pace_. I&#x27;ll use my rest-day runs for this kind of thing. In reality, any other training run will require finding a partner who&#x27;s pretty much at the same pace as me. 

Tonight, I&#x27;ll run another &quot;easy run&quot;, which is 20 minutes at 5:56 - 6:33, bookended by 5-minute warm-ups. 

## 2024-05-30

Today was the first official &quot;long run&quot; from the Garmin Training Plan that I&#x27;ve been doing for the half marathon. It was set for 50 minutes and within the window of 5:55 to 6:15 or so for my pace. Usually with these runs I want to go much faster and have to keep holding myself back, but with a longer run like this it&#x27;s actually a pretty good pace for me. Still, I struggled to stay in that window, often speeding up when the music was just right. 

I also had a nice moment when I was running along Harbord where I saw a large caravan of cyclists, I think parents and children mostly, riding in the bike lane. There were some cops marshalling them so I suppose it was some kind of event, but that coupled with the right song at the right time made me tear up a little bit. I always laugh at myself when I mention that I sometimes cry while running, but something about running just unlocks tiny bits of emotions along with the dopamine. It’s a beautiful thing. 


## 2024-06-05

Another long run in the books. I could have gone for an optional 30 minutes. But today—no, not going to happen. I had to call it at 50 minutes, totalling 10km on the dot. Pretty good for me. 

I think my control over my pace is slipping from me. This was supposed to be an easy run. But I was more interested in keeping my pace at the very edge of what the watch was telling me to keep it at (5:40). If I had gone slower I would have probably been able to do the extra 30 minutes.

---

## 2024-06-07

Today featured a new type of training run called “stride repeats”. This features running a 10-minute warm-up, then intervals of sprinting and jogging. 20 seconds sprinting, 45 seconds cool-down. Repeat that 8 times. I had the foresight to bike to a track near my place and run there. I absolutely could not do sprinting intervals on the city streets. 

Overall it was simultaneously great and torturous, just my kind of fun, it seems.

## 2024-06-09

Today I swam in an Olympic pool for the first time with my friend Jeff. Like running, I have recently rediscovered swimming, and am learning to thoroughly enjoy it. It serves as great cross-training and lets my mind wander while focusing on technique (and not drowning).

I usually swim in an 18.5-metre pool, so the jump to 50 metres was significant. It meant more continuous swimming, fewer turns, and less bumping into others. I could just swim and watch my thoughts float by like clouds.

Pacing became more important in the 50-metre pool. Unlike the smaller pool where I can frequently touch the bottom, here I had to manage my energy better. As I swam, I realized how much I struggle with pacing in many things across my life.

On the rare occasions I play tennis, I give it my all on my first few games. Everything after that is sloppy and slow.

I probably hated running as a kid because I started too fast and then struggled along, choking for breath.

At work, I lose the most steam when pull requests linger and go on, forever iterating and not merging.

When I find something new I’m passionate about, I give it 150%, until that energy fizzles out and the best I can do is 50%. 

Thoughts like these buoyed up from my mind and floated behind me in my wake. I have been struggling to keep in the predetermined pace window for my runs, chomping at the bit to go faster. It seems this lesson is going to take a while to sink in.

## 2024-06-11

Not my favourite run. For not the first time, I accidentally advanced through a pre-planned workout on my running watch. This means I lose things like automatically advancing through stages (warm up, pace A, pace B, cool down etc), but also I lose the audio cues telling me when I’m going too fast &#x2F; slow (let me take a second to marvel at how cool that is…).

Anyway, I was a bit frustrated because it was my fiddling with the watch, trying to turn on its flashlight (yes, it has a flashlight, yes, it is useful, and yes, I am a nerd) and accidentally advancing the workout.

Anyway.

Today was supposed to be a &quot;progressive run&quot;. Two main stages, one around 5:30 for 20 minutes and another at 4:30 for 10 minutes. I was feeling a bit nervous I wouldn’t be able to keep up the 4:30 for 10 minutes. But, I surprised myself and pulled it off, and felt pretty great, actually. 

So yeah, what am I complaining about?

## 2024-06-15

Today&#x27;s run was called a &quot;goal pace run&quot;. The idea being that I was to spend some time running at the pace that I&#x27;m hoping to run the entire half marathon at. For me that&#x27;s about four minutes and 50 seconds, getting my time in the half-marathon down to 1:46. Today I had to run a 15-minute warm-up, then 15 minutes at my goal pace with an optional five more minutes, and then a 15-minute cooldown. I was able to get to the nearby track in the 15-minute warm-up and then I found I was pushing myself fairly hard to keep the race pace going. 

With that said, I thought it would be more torturous . The idea of going that fast for a consistent amount of time made me think of running in middle school when it always felt like I was going too fast and I would often struggle to breathe.

## 2024-06-18

Heat wave this week in Toronto. Got up at 5:30 to run the track to do Stride Repeats. Nope. Got rained out.

Back to bed (and then rock climbing). Tonight I will try again.

## 2024-06-21

It&#x27;s been a long week for running. Most days this week were well over 30, close to 40 with the humidex. That meant I could either get up early and run or run late at night.  

On Wednesday I was supposed to do a long run for about 75 minutes and I just had to conk out at just over an hour. It was a little disappointing. Without getting into it too much, I supposedly have IBS[^1] and it seems to be flaring up lately. 

Tonight&#x27;s run was an easy run for 45 minutes. After having done a 5x5 workout this morning, I didn&#x27;t feel like leaving, but I still got outside and it turned out to be a fantastic run. The music was right and I felt like I was just falling forward the whole time in the best way possible. I was also able to stay within the suggested page range and got an execution score of 83%. Very satisfying. 

When I got home I checked out the Garmin Connect app and looked at my heart rate data for the last 4 weeks since I got the watch. My resting heart rate has dropped by 5-10 BPM, which really surprises me, but I was delighted to see that. Frankly, I don&#x27;t really know what the direct benefits of this are, but I vaguely know that it&#x27;s a good thing. I can&#x27;t really see a downward trend in the spikes of heart rate data from workouts because the workouts vary so much, but it seems like it&#x27;s trending in the right direction.


## 2024-06-23

I did another round of speed repeats tonight, although the timing and pacing was different from the last instance. Around 9 p.m., I ran to the track for my warm-up and then I hit the speed repeats. Today, I had to run for five minutes at around 4:25 and then jog for three minutes. This happened three times and then it switched over to a set of six where I would run for 30 seconds at 4:20 and then jog. Then I ran home.

It&#x27;s wild to sum up tonight&#x27;s run like in a few sentences. It did not *feel like a few sentences* in the running world. I was against a heavy headwind on one half of the track and it was late and I was full of good food from a family gathering. But with that said, I actually managed to stay relatively close to that range and I felt really good. 

I might have already said this somewhere in this log, but running at a sub-five-minute pace feels like a Herculean task. To do it for more than five minutes at intervals, say to do it for 30 minutes straight, let alone a half marathon, is hard to imagine. But I have to stop trying to imagine things, and I just have to do them. Again, I&#x27;ll credit using this running watch for helping me achieve any of this. There isn&#x27;t really a lot of time to think about what you can or can&#x27;t do. The watch ticks on, and then it tells you when to start running faster, so you start running faster. When it tells you to slow down, you slow down. I just have to try. And that, I think, is a marvellous thing.

## 2024-06-27

Last night I did a progression run. This involved a five-minute warm-up, 20-minute run at 5:50~&#x2F;km, and then I had to sustain running at 4:25&#x2F;km for ten minutes. I was able to keep this up for about 7 minutes before I started lagging down to 4:35 with occasional bursts of speed back into the pace range. It was challenging. This was the first run I had to mark as extremely hard. Still, it was a cool night, and I felt good. 

I really need to update my music, though—the watch can load Spotify playlists, and my running playlist of 70 songs is starting to get a bit repetitive.

## 2024-07-01

Today was another day of progress run. However, I ran during the day, which made everything a lot harder. I was, however, able to hit an execution score of 73% and was able to do the entire 10 minutes at a pace of 4.25. Difficult? Yes. Done? Yes.
## 2024-07-07

Today was speed repeats. I thought to myself, *hey, this will be easy, when you did your progress run, you ran for 10 minutes at 4:25!*. Nah. It was hard. Not sure why. I think part of it was the heat, for sure, but maybe the start&#x2F;stop of speed&#x2F;jog makes it harder? 

Today, my friend Jeff did his triathlon that he&#x27;s been training for for months. Seriously impressive stuff. Jeff is an inspiration for me — I admire his hard work and his humbleness; he&#x27;s always happy to share what he knows and has answered plenty of questions I have about running (even when I forget the definition of certain terms again and again). Way to go, pal.

## 2024-07-13

Today&#x27;s run was pretty hot. I got out around 9, maybe 9:30, but it was already, well, around 24 degrees. I felt pretty good though. The plan today was to run for an hour at about 5:30 to 6:10, and then after that I was supposed to progress to 10 minutes of around 4:30 and then 5 minutes around 4:10 max, which is pretty fast. I kind of ran out of time and had to skip ahead to be able to say goodbye to a house guest, but in the end it was still a good run. I was pretty pleased to find myself not short of breath in any way. In fact, I was feeling totally calm and able to take full breaths in while running the first hour. If anything, it was the heat that got to me.

## 2024-07-14

I had an &quot;easy run&quot; today that was terrible. I ran too soon after eating (again) and I was surprised to find that I had to stop more than once to just... take a break. No cramps, no urges to puke, but I just felt gross: super sweaty and my battery was just drained. 

## 2024-07-19

Just completed my first long run in a while. The last two I had to end early, either because of stomach problems or just being too gassed. This run was slated to be 1:35 minutes of running, plus an additional 15 minutes *if you&#x27;re feeling it.* It seems that 8 or 9km into a long run, I start to think *I could make this into a half, what’s another few km?* . But now that I have so many more stats, I know pretty well *what another few km is*. In this case, it would have been another 40 minutes. 

It was for the best I didn&#x27;t do it. My watch froze up just before the 1:35-minute window finished. I hit pause at a stoplight, and something about that just froze the whole thing. I was frustrated at the idea of losing a tracked run (_what a hold collecting data has on me, eh?_). I walked the rest of the way home, some five minutes. When I came in, the watch came unstuck, restarted, and launched back into the recording! As a software developer, I&#x27;m thinking about whomever built the functionality of saving the current activity before the watch has a firmware panic!

Anyway, the run was good. The first 8km were a breeze. Then I had some knee and ankle pain, which disappeared by 12 or 13. I&#x27;m sitting at home now feeling pretty dead tired, having drank five glasses of water (half filled with ice cubes, to be fair) and had a refreshing shower. Now it&#x27;s off to try a new restaurant and replenish all those burned calories (and more, presumably).

## 2024-07-21

Today&#x27;s run was brutal. I took off after a bagel and cream cheese around 12:30 and ran to the track. The plan was to do speed repeats of 800 m at around 4:30 and then 400 m at whatever pace needed. I was able to do two repeats before I crashed; nothing was particularly wrong—no pain, no stomach issues— but the prospect of just doing six more repeats was too much. I&#x27;d like to blame the heat, a 40km bike ride yesterday, but I also think the pace might just be too fast. I bailed and had to stand in the shade for a minute or two before jog-walking home. I think I might have been in pretty rough shape if I had forced myself to do the whole thing— it still turned out to be 6.3km. If I had been able to do the run, that would have been another 7km, nearly 5 of it at 4:30. 

The next speed repeat I will do will be at night, from now on.  I will probably try dropping the pace by five seconds at the suggestion of my friend (and running mentor), Jeff.

## 2024-07-24

Two runs in two days; speed repeats yesterday and an easy run today. Yesterday&#x27;s was sloppy. I had two pieces of pizza that still weren&#x27;t digested by the time I hit the track. On the bright side, I tried my new running shoes and they feel great.

Tonight&#x27;s run was a minimum of 20 minutes. I was AMPED UP. I added new songs to my running playlist and the weather was right. Everything was perfect. I let myself speed up to 5:00&#x2F;km by the end. In these moments my brain is a field in which flowers blossom rapidly. Ideas, poetry, and good feelings are abound. I&#x27;ll take it. 

## 2024-07-31

This morning&#x27;s run was trash. I slept four and a half hours. I was supposed to do a progression run. I had to give up after one or two loops at the track. I think I might have been able to do it, but the nail in the coffin was accidentally hitting the lap button on the Garmin Connect. When you do that, it advances you to the next stage of your run. This is probably my biggest pet peeve of the Garmin, although I haven&#x27;t looked if there&#x27;s a way around it. Nonetheless, I came home early. I was sweaty as hell despite not finishing the run, and it still being early in the day. Bummer!

## 2024-08-02

I did a half today. Well, actually, I learned that 21km (right on the dot), is not a half. *_21.0975_* is a half marathon. So, when I stopped my running watch right when it hit 21km, it didn&#x27;t recognize it as a half marathon. I was a bit annoyed—I&#x27;d like to be able to see all my half-marathon times, over time, to see how my efforts change. Anyway. I ran it in 2:06:14. Slower than the one I did in May! This surprises me. It&#x27;s possible that the other app I was using (*Outrun*) to measure my run was less accurate than the Garmin. It&#x27;s also possible that I&#x27;m saying *that* because after 10 weeks of training I&#x27;d have hoped for a better result.

I think I set my goal pace to be 5:20 for the half in October. I was running around 5:40-6:10 today. Shaving off 20-50 seconds sounds like a big leap, but I think if I push it a bit harder each week, I&#x27;ll get closer to it.

## 2024-08-13

It&#x27;s been a while since I&#x27;ve checked in. Tonight&#x27;s run was incredible. I was supposed to do a 45-minute easy run, but once I put on my (new) kicks, I couldn&#x27;t stop myself from speeding up. I maintained the upper limit of the suggested pace of 5:30 for the entire run, something I&#x27;ve never done, and my overall average time was 5.25 for 7k. I haven&#x27;t had a runner&#x27;s high in a while; this one made me feel so capable and happy. It felt like my body was giving me confirmation that the self-work I&#x27;m doing is going in the right direction, and that my confidence and willingness to be myself are somewhere inside me, locked up, and were revealed by running.

Life is weird.

## 2024-08-27

Just got back from a race pace run. It wasn&#x27;t a super long one. It came to about 45 minutes. I was pleased with how it went despite the fact that it is 32 degrees again. The humidity is back.

Right now, I am trying to find the metaphor to describe how I feel about running. In general, it feels more monotonous, but not in a bad way. Whereas in earlier runs in this training, I would have runner’s highs. I would think of poetry in my mind. I would feel meaningful emotions. Whereas today, I just had to run. It was just my feet hitting the ground and my music in my ears. That&#x27;s it. Now, I don&#x27;t expect myself to have meaningful emotions and powerful epiphanies every time I go for a run. But I&#x27;m surprised at the diversity in experience I can have while doing this sport. Today&#x27;s run was about 7.5km. It was a race pace. So that means I spent 15 minutes warming up, 15 minutes running at 4.50 to five, and then 15 minutes cooling down.  Most of the time, I was just trying to push through the humidity. I managed to do this okay. 

Realistically, I can&#x27;t have huge rushes of endorphins every time I run. And while I want to blame the muggy weather for not having such high highs, I&#x27;m also really starting to see training as an ongoing process. There isn&#x27;t really a summit that you hit and then you&#x27;re done; where you&#x27;ve arrived. Instead, it&#x27;s day in, day out. With rest days in between, of course. This is a literal and metaphorical mileage. It&#x27;s not glamorous. The shine wears off. And then it&#x27;s just you slapping your feet on a muggy pavement when you&#x27;d rather just crawl into bed early, or go do some other hobby.

## 2024-09-03 

Had a great run this morning. The kids are going back to school and it&#x27;s funny to see that there are cracked, dry leaves on the ground already, although the trees are still green. I ran to the track today and did a tempo run. That meant a 15-minute warm-up and then 20 minutes of running at about 5 minutes a kilometre. Pretty hard but managed to make it 17 or 18 minutes before feeling like garbage. Had to walk for a bit when I finished and then headed home. On the way back I saw three people I knew out and about, and that put a smile on my face.

I&#x27;m coming to the end of the 16-week plan that the Garmin watch has provided me. That means I&#x27;ll need to come up with some kind of plan for myself leading up to the half marathon on October 20th. I feel that I&#x27;ve plateaued over the past few weeks but today I did have a good runner’s high for the first time in a while — I think I was pushing past the plateau.

## 2024-09-29

Has it been this long since writing? Life got busy there, for a second. I went away for three weekends in a row, and I haven&#x27;t run more than 10km in probably 2 weeks. Doesn&#x27;t feel great. What&#x27;s more - I haven&#x27;t even written in this log *unless* I&#x27;ve just finished a run. Next post will come after doing a 10k, I think. I might be able to squeeze one in now. I have an hour, maybe I should do that instead of playing another game of Risk of Rain...

---

OK, I went, and I went *fast.*

## 2024-10-06

On Friday, I did my first long run in a while. I went with my pal Sean. We ran 15km. I felt pretty good, save for the massive hill in High Park that nearly killed me.

But here&#x27;s why I felt pretty good. I&#x27;ve sort of tapered off my runs. Prematurely, of course, because the race is in two weeks from today, and I did my first long run in probably two weeks just two days ago. And I went fast. I wasn&#x27;t entirely surprised by this because a few short runs from this past week have all been fast. [The taper is real](https:&#x2F;&#x2F;www.runnersworld.com&#x2F;training&#x2F;a20814390&#x2F;how-to-taper-correctly&#x2F;).

But yeah, the race is in 2 weeks. I haven&#x27;t felt any anxiety about it. I feel no pressure about doing it a *certain way*. Well, I&#x27;d like to get sub-2 hours. But I&#x27;m pretty confident that with a taper + the race day energy that will be possible. As long as I don&#x27;t start too fast.

## 2024-10-18

The race is in two days. I biked down to the Enercare centre and picked up my and my pal Jeff&#x27;s bib. Between the seriously beautiful weather today and the prospect of running the half, I felt pretty damn good. I&#x27;m not feeling nerves about whether I&#x27;ll go fast or slow, but if anything, I have a bit of nerves around the logistics - getting to the race, finding where to go. 

It&#x27;s been over 4 months since I started this log. It feels good to see it still going. But the end is coming soon, which is sad *and* good. I started off strong—I signed up for a 16-week (or was it 18?) week program through my Garmin watch and I think I did every single run (one or maybe two might have slipped by due to some circumstance). I should clarify—yes, every day that I saw the notification to run, I did. But did I complete every recommended distance *for* those runs? Nope. I hit the suggested duration maybe about 75% of the time. The runs in the heat of the summer (especially those attempted too soon after a meal) definitely didn&#x27;t get completed. And then there were the days where I was just too exhausted to finish a run at all, especially when I slept poorly.

What a journey it&#x27;s been!

The journey also changed dramatically once the program on my watch ended. Suddenly, I was running much less frequently—maybe 2 times a week rather than 4 or even 5 times. In a sense, I feel like I let myself down. I should have either started another program, or just started the one I did a few weeks later so that it would line up with race day. I was really leaning on the watch—if it told me to run, I ran. Once that ended, suddenly I was immediately drawn to cycling more, and climbing instead. 

A good lesson.

Anyway, I&#x27;ve got some preparing to do. Tomorrow, all my pals who are running the race are coming over for dinner for a little pre-race meal (and birthday celebration for one of the runners). I am very stoked.

-- end of log --&lt;

&lt;&#x2F;details&gt;

--&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Processing Hack Night</title>
        <published>2024-03-22T00:00:00+00:00</published>
        <updated>2024-03-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/processing-hack-night/"/>
        <id>https://tysloane.ca/posts/processing-hack-night/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/processing-hack-night/">&lt;p&gt;I attended a Processing Jam this week!&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Processing is a flexible software sketchbook and a language for learning how to code. Since 2001, Processing has promoted software literacy within the visual arts and visual literacy within technology. There are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning and prototyping.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I haven’t used Processing since around 2020, when I created &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;construction&#x2F;&quot;&gt;a few sketches&lt;&#x2F;a&gt; as an homage to an exhibit I saw at the AGO of Margaret Priest’s construction series. I’ve long been inspired by people like &lt;a href=&quot;https:&#x2F;&#x2F;tylerxhobbs.com&#x2F;work&quot;&gt;Tyler Hobbs&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;www.mattdesl.com&#x2F;&quot;&gt;Matt Deslauriers&lt;&#x2F;a&gt; who are making some pretty wild, cool stuff with code.&lt;&#x2F;p&gt;
&lt;p&gt;It was fun to crack open Processing again — in my case, I use a wrapper around Processing in Clojure called &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quil&#x2F;quil&quot;&gt;quil&lt;&#x2F;a&gt;. After looking up quil again, other than a few threads that asked &quot;is quil still being maintained,&quot; etc., I got it working with no problems.&lt;&#x2F;p&gt;
&lt;p&gt;I started by drawing a few ideas in my sketchbook to see what I could come up with. Then I hacked away at rendering a bunch of circles on the screen. Here’s how it came out:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;processing-hack-night&#x2F;attachments&#x2F;1da4b7fb2629c67bf4a3cd5834a57ee2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Most of this came as a result of mashing code until it came together. I had some help from a friend at the gathering to center everything (I always trip over centering things in Processing).&lt;&#x2F;p&gt;
&lt;p&gt;I’d like to do more creative coding, but it’ll have to get in line behind the game I’m building (which is sufficiently creative-coding already).&lt;&#x2F;p&gt;
&lt;p&gt;Find the code below! It was fun to write Clojure again; I kind of forgot how expressive it is.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;clojure&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-clojure &quot;&gt;&lt;code class=&quot;language-clojure&quot; data-lang=&quot;clojure&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ns&lt;&#x2F;span&gt;&lt;span&gt; mar-20.core
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:require &lt;&#x2F;span&gt;&lt;span&gt;[quil.core &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:as&lt;&#x2F;span&gt;&lt;span&gt; q]
&lt;&#x2F;span&gt;&lt;span&gt;            [quil.middleware &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:as&lt;&#x2F;span&gt;&lt;span&gt; m]))
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;w &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4500&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;h &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4500&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;defn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;setup &lt;&#x2F;span&gt;&lt;span&gt;[]
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;frame-rate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;30&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:angle 0&lt;&#x2F;span&gt;&lt;span&gt;})
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;defn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;update-state &lt;&#x2F;span&gt;&lt;span&gt;[state]
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;; Update sketch state by changing circle colour and position.
&lt;&#x2F;span&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:angle &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:angle&lt;&#x2F;span&gt;&lt;span&gt; state) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1.1&lt;&#x2F;span&gt;&lt;span&gt;)})
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;defn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;rnd-col &lt;&#x2F;span&gt;&lt;span&gt;[]
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;fill
&lt;&#x2F;span&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;random &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;120 255&lt;&#x2F;span&gt;&lt;span&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;random &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;120 255&lt;&#x2F;span&gt;&lt;span&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;random &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;120 255&lt;&#x2F;span&gt;&lt;span&gt;)))
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;defn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;draw-state &lt;&#x2F;span&gt;&lt;span&gt;[state]
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;[margin-pc         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0.1
&lt;&#x2F;span&gt;&lt;span&gt;        width-for-circles (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; w (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt; margin-pc)))
&lt;&#x2F;span&gt;&lt;span&gt;        margin            (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; w margin-pc)
&lt;&#x2F;span&gt;&lt;span&gt;        num-circ          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;20
&lt;&#x2F;span&gt;&lt;span&gt;        circle-max-size   (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; width-for-circles num-circ)
&lt;&#x2F;span&gt;&lt;span&gt;        circle-shrink-px  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; circle-max-size &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0.1&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;        num-rows          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;smooth&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;no-loop&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;background &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;250&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;doseq &lt;&#x2F;span&gt;&lt;span&gt;[hloop (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;range&lt;&#x2F;span&gt;&lt;span&gt; num-rows)
&lt;&#x2F;span&gt;&lt;span&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:let  &lt;&#x2F;span&gt;&lt;span&gt;[h-offset          (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; h (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;inc&lt;&#x2F;span&gt;&lt;span&gt; num-rows))
&lt;&#x2F;span&gt;&lt;span&gt;                 circ-y            (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; hloop &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;) h-offset))]]
&lt;&#x2F;span&gt;&lt;span&gt;    (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;doseq &lt;&#x2F;span&gt;&lt;span&gt;[iloop (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;range &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;)]
&lt;&#x2F;span&gt;&lt;span&gt;      (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;doseq &lt;&#x2F;span&gt;&lt;span&gt;[jloop (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;range&lt;&#x2F;span&gt;&lt;span&gt; num-circ)
&lt;&#x2F;span&gt;&lt;span&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:let  &lt;&#x2F;span&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;                     circle-size       (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; circle-max-size (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;random &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;3 &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; circle-max-size (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; circle-max-size &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;))) circle-shrink-px)
&lt;&#x2F;span&gt;&lt;span&gt;                     circle-diff       (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; circle-max-size circle-size)
&lt;&#x2F;span&gt;&lt;span&gt;                     circ-x            (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; jloop circle-max-size) margin (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; circle-max-size &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;                     ]
&lt;&#x2F;span&gt;&lt;span&gt;              ]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;        (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;stroke-weight &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; w  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0.002&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;        (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rnd-col&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;        (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;ellipse&lt;&#x2F;span&gt;&lt;span&gt; circ-x circ-y circle-size circle-size)))))
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;save &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;test.png&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q&#x2F;defsketch&lt;&#x2F;span&gt;&lt;span&gt; mar-20
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:title &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:size &lt;&#x2F;span&gt;&lt;span&gt;[w h]
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:setup&lt;&#x2F;span&gt;&lt;span&gt; setup
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:update&lt;&#x2F;span&gt;&lt;span&gt; update-state
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:draw&lt;&#x2F;span&gt;&lt;span&gt; draw-state
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:features &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:keep-on-top&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;:middleware &lt;&#x2F;span&gt;&lt;span&gt;[m&#x2F;fun-mode])
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A break from side-project hacking</title>
        <published>2023-04-18T00:00:00+00:00</published>
        <updated>2023-04-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-break-from-side-project-hacking/"/>
        <id>https://tysloane.ca/posts/a-break-from-side-project-hacking/</id>
        
        <summary type="html">&lt;p&gt;The other day a friend asked me what I was working on, programming-wise. To my surprise, the answer was: &lt;em&gt;nothing&lt;&#x2F;em&gt;. Pretty much since I started learning to program in 2015 I have almost always had &lt;em&gt;some&lt;&#x2F;em&gt; kind of programming-oriented project going on (while also working).&lt;&#x2F;p&gt;
&lt;p&gt;Now, to be fair, this non-programming has only been going on for about 3 or 4 weeks. I &lt;em&gt;was&lt;&#x2F;em&gt; making videos for a game I started on the TIC-80, but I fell off of it  . And while I intend to do more, I&#x27;m delightfully surprised to see myself absolutely fine about falling off an idea so quickly and not pursuing any side-project programming.&lt;&#x2F;p&gt;
&lt;p&gt;Of course, I&#x27;ve got other new and persisting interests. I continue to practice&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>How should a blog be?</title>
        <published>2023-03-26T00:00:00+00:00</published>
        <updated>2023-03-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/how-should-a-blog-be/"/>
        <id>https://tysloane.ca/posts/how-should-a-blog-be/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;m having a nice, slow Sunday evening where I&#x27;ve decided to revisit this little blog here and putter on its design a bit.&lt;&#x2F;p&gt;
&lt;p&gt;It would be fair to say that I seem to be in a perpetual state of mediocre satisfaction with this thing. While poking at some Tailwind styles, I started wondering &lt;em&gt;what a blog should be&lt;&#x2F;em&gt; (somewhat facetiously). I have some ideas, but I think I might have more ideas of what it shouldn&#x27;t be, for me.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Mark the days when something &#x27;clicks&#x27;</title>
        <published>2023-01-17T00:00:00+00:00</published>
        <updated>2023-01-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/mark-the-days-when-something-clicks/"/>
        <id>https://tysloane.ca/posts/mark-the-days-when-something-clicks/</id>
        
        <summary type="html">&lt;p&gt;For the past few months, I&#x27;ve been practicing figure drawing in the mornings before work. Today, something &lt;em&gt;clicked&lt;&#x2F;em&gt;. Suddenly, it seemed like I was better proportioning heads, arms, and legs, picking up on how to lay down shadows with the charcoal, and I was moving faster and more confidently. Simply, each drawing, from the 1-minute quick-draws to the 10-minute drawing at the end of the session, was &lt;em&gt;better&lt;&#x2F;em&gt;.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>How doth I read a technical book?</title>
        <published>2022-11-23T00:00:00+00:00</published>
        <updated>2022-11-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/how-valuable-are-technical-books-for-me/"/>
        <id>https://tysloane.ca/posts/how-valuable-are-technical-books-for-me/</id>
        
        <summary type="html">&lt;blockquote&gt;
&lt;p&gt;With all that in mind, it’s questionable how far you can get just by book learning. Before my first child was born, I read all the &lt;em&gt;How To&lt;&#x2F;em&gt; books, and still felt like a clueless novice. 30 months later, when my second child was due, did I go back to the books for a refresher? No. Instead, I relied on my personal experience, which turned out to be far more useful and reassuring to me than the thousands of pages written by experts.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;A quote from &quot;&lt;a href=&quot;https:&#x2F;&#x2F;norvig.com&#x2F;21-days.html&quot;&gt;Learn to program in 10 years&lt;&#x2F;a&gt;&quot;&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A sync is a sync, until it&#x27;s not</title>
        <published>2022-11-12T00:00:00+00:00</published>
        <updated>2022-11-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-sync-is-a-sync-until-it-s-not/"/>
        <id>https://tysloane.ca/posts/a-sync-is-a-sync-until-it-s-not/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;ve been writing Elixir at work for a few weeks. Yesterday I dove into a friend’s JS codebase and immediately got confused by the async stuff. While I used to write JS full time, the past 6 months I&#x27;ve spent in Elixir-land has really spoiled me.&lt;&#x2F;p&gt;
&lt;p&gt;I haven&#x27;t written a lot of async&#x2F;await code. It&#x27;s supposed to be simpler than &lt;em&gt;Promises&lt;&#x2F;em&gt;, which are also simpler than callback-soup.&lt;&#x2F;p&gt;
&lt;p&gt;Right.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a bit embarrassing, but after all these years of writing JavaScript code - I still trip over async stuff. Sometimes I&#x27;m hard on myself - mostly my interior dialogue thinks: &lt;em&gt;You haven&#x27;t written enough JS to have it be second nature.&lt;&#x2F;em&gt; That might be true, but there might also be more to it.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A Moment with Helix</title>
        <published>2022-11-10T00:00:00+00:00</published>
        <updated>2022-11-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-moment-with-helix/"/>
        <id>https://tysloane.ca/posts/a-moment-with-helix/</id>
        
        <summary type="html">&lt;p&gt;I had some free time to play around with the Helix editor (again) yesterday. It&#x27;s very cool, but I quickly realized that I was useless trying to navigate the editor&#x27;s functions; my fingers have some serious muscle memory from Doom Emacs at this point. After using it for 10~ minutes, I noted several features that I need access to (I&#x27;ll get to that later).&lt;&#x2F;p&gt;
&lt;p&gt;(To be fair, this isn&#x27;t me slamming Helix; if anything, I&#x27;d like to use Helix more so that I can have a quick go-to editor to use in a pinch when emacs isn&#x27;t available (ie, I broke it) or I only need to edit a few small files.)&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Learning About Streams in Elixir</title>
        <published>2022-10-31T00:00:00+00:00</published>
        <updated>2022-10-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/learning-about-streams-in-elixir/"/>
        <id>https://tysloane.ca/posts/learning-about-streams-in-elixir/</id>
        
        <summary type="html">&lt;p&gt;Note: This post was originally called &quot;Why not use Elixir Streams all the time?&quot; Half-way through the writing of that post, I started googling this question and realized that there was already some research done and I quickly got a variety of good answers. With that said, I think I&#x27;ll leave this post up, as it was fun to write (and it might be fun to read if you enjoy seeing someone think-out-loud-on-paper about new topics)!&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Another quarter rolls in</title>
        <published>2022-10-06T00:00:00+00:00</published>
        <updated>2022-10-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/another-quarter-rolls-in/"/>
        <id>https://tysloane.ca/posts/another-quarter-rolls-in/</id>
        
        <summary type="html">&lt;p&gt;It&#x27;s time for another post to update on my year of quarterly projects. I wrapped up the previous quarter and managed to successfully finish six paintings, as I planned. I hit the goal hard at the beginning of the quarter, completing 3 paintings in the span of one month. I mostly worked on a set of arches 7 x 10 paper, although I did also experiment using clayboard. I&#x27;m happy with the results and I&#x27;ll post some photos in this post when I get a chance. I started to run out of steam after the first month as I quickly became interested in comics. Before I knew it I had dozens of comics out from the library and was reading how to make comics by Scott McCloud. So my focus was split.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Summer and Winter</title>
        <published>2022-08-29T00:00:00+00:00</published>
        <updated>2022-08-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/summer-and-winter/"/>
        <id>https://tysloane.ca/posts/summer-and-winter/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;m writing to you from a windy summer night in Toronto. Summer has flown by. I looked up at the calendar, and it was August 29th. So, time flies, what else is new?&lt;&#x2F;p&gt;
&lt;p&gt;The last two months have been interesting. I started a new job at the end of June, I slackened on my goals (sort of), and I have just been living life. This is the way of summer.&lt;&#x2F;p&gt;
&lt;p&gt;The way of winter is one of planning and diligence. It is the way of making New Year’s resolutions and then going at them eagerly.&lt;&#x2F;p&gt;
&lt;p&gt;Then, summer rolls around. People are out. Things happen more spontaneously, and at the end of the day, I want to spend less time in front of a computer (doubly so, with the new job).&lt;&#x2F;p&gt;
&lt;p&gt;So what have the last two months brought me?&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Baby&#x27;s First Genserver</title>
        <published>2022-08-04T00:00:00+00:00</published>
        <updated>2022-08-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/first-genserver/"/>
        <id>https://tysloane.ca/posts/first-genserver/</id>
        
        <summary type="html">&lt;p&gt;In this post, I walk through learning about and creating my first GenServer for &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;galley&quot;&gt;Galley&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While on vacation, I was able to return to Galley and work on a feature that I&#x27;ve been wanting to do for a while - adding countdown timers to recipes. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;arisgarden&quot;&gt;Ari&#x27;s Garden&lt;&#x2F;a&gt; originally implemented this feature in JavaScript using a &lt;code&gt;setInterval&lt;&#x2F;code&gt;, and because it was a static site, I couldn&#x27;t really persist these timers for users .&lt;&#x2F;p&gt;
&lt;p&gt;When I started out working on Galley, I knew I&#x27;d be able to leverage having a server to make this feature work properly. I didn&#x27;t know anything about GenServer at the time&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Some thoughts on imposter syndrome</title>
        <published>2022-07-31T00:00:00+00:00</published>
        <updated>2022-07-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/some-thoughts-on-imposter-syndrome/"/>
        <id>https://tysloane.ca/posts/some-thoughts-on-imposter-syndrome/</id>
        
        <summary type="html">&lt;p&gt;Hi there 👋,&lt;&#x2F;p&gt;
&lt;p&gt;Today I&#x27;m writing from a cottage patio, taking my first stretch of summer vacation. I have five full days off, plus some weekend time. It feels great so far. It has been a hectic month starting a new job, and now I have some time to decompress and let some thoughts unfold. Seems like a good time to write and reflect a bit, I&#x27;d say.&lt;&#x2F;p&gt;
&lt;p&gt;One topic that has surfaced a few times over the month is imposter syndrome. It is a commonly written-about topic in my field, so I won&#x27;t be adding anything new to the literature, save for my personal experience. But, in the spirit of working on my &lt;em&gt;transparency and openness initiatives&lt;&#x2F;em&gt;, I think I better write about it!&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Refactoring Ecto queries with reduce</title>
        <published>2022-07-08T00:00:00+00:00</published>
        <updated>2022-07-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/refactoring-ecto-queries-with-reduce/"/>
        <id>https://tysloane.ca/posts/refactoring-ecto-queries-with-reduce/</id>
        
        <summary type="html">&lt;p&gt;Today I want to share a fun refactor that finally &quot;clicked&quot; for me (and it was right there in plain view for quite some time!). Let me set the stage.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>First week of professional elixir</title>
        <published>2022-07-03T00:00:00+00:00</published>
        <updated>2022-07-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/first-week-of-professional-elixir/"/>
        <id>https://tysloane.ca/posts/first-week-of-professional-elixir/</id>
        
        <summary type="html">&lt;p&gt;I get to write Elixir at my new job! This is my first time writing it in a professional setting. I &lt;em&gt;have&lt;&#x2F;em&gt; written Clojure for work and while Clojure and Elixir share quite a few similarities, I am learning lots of new things. Most of my learnings are around Elixir idioms and growing my knowledge of the concepts that the syntax of the language wraps around.&lt;&#x2F;p&gt;
&lt;p&gt;In a sense, this post is sort of a follow up to my post on side projects vs work for learning. The previous post is pretty... vague and hand-wavey, but this one will be a bit more concrete on some of the things I&#x27;ve learned. Let&#x27;s jump into it.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Thank you, blog</title>
        <published>2022-07-01T00:00:00+00:00</published>
        <updated>2022-07-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/thank-you-blog/"/>
        <id>https://tysloane.ca/posts/thank-you-blog/</id>
        
        <summary type="html">&lt;p&gt;Today I&#x27;m writing a small post to thank my blog (and circuitously myself, I suppose) for helping me find work I&#x27;m interested in doing.&lt;&#x2F;p&gt;
&lt;p&gt;I started a new job last week at a software consultancy. The consultancy places consultants at different clients in pairs or small groups. The clients could have any range of challenges or technical problems, using any variety of languages&#x2F;tech stacks. And so, when joining, the consultancy tries to find a best fit between the consultant and client based on technology and interest.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A naive mini parser</title>
        <published>2022-06-30T00:00:00+00:00</published>
        <updated>2022-06-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-naive-mini-parser/"/>
        <id>https://tysloane.ca/posts/a-naive-mini-parser/</id>
        
        <summary type="html">&lt;p&gt;At the end of last week, I had a bit of fun approaching how to migrate recipes from &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;arisgarden&quot;&gt;Ari&#x27;s Garden&lt;&#x2F;a&gt; to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;galley&quot;&gt;Galley&lt;&#x2F;a&gt; The high-level problem is that Ari&#x27;s Garden is an elm application that consumes a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theiceshelf&#x2F;arisgarden&#x2F;blob&#x2F;master&#x2F;src&#x2F;scripts&#x2F;db.json&quot;&gt;big JSON file&lt;&#x2F;a&gt; whereas Galley needs recipe data to be input by form.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Finishing Galley</title>
        <published>2022-06-14T00:00:00+00:00</published>
        <updated>2022-06-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/finishing-galley/"/>
        <id>https://tysloane.ca/posts/finishing-galley/</id>
        
        <summary type="html">&lt;p&gt;Today I&#x27;m delighted to say that I&#x27;ve deployed Galley, making it the first project of my &quot;4-projects-a-year&quot; that has been completed (and with 2 weeks to spare). In this post, I&#x27;ll write about why I think I was able to complete this project and about deployment. Let&#x27;s start with the latter.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Image Uploading in Galley</title>
        <published>2022-06-09T00:00:00+00:00</published>
        <updated>2022-06-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/image-uploading-in-galley/"/>
        <id>https://tysloane.ca/posts/image-uploading-in-galley/</id>
        
        <summary type="html">&lt;p&gt;Oh, hello again. It&#x27;s the 9th of June already. How did that happen? I&#x27;m blaming part of the haze of the last few days of a bad chest cold I got that drowned me in a sea of Nyquil + sleeping + reading.&lt;&#x2F;p&gt;
&lt;p&gt;I have until the end of June until I move on to my next project. Galley is almost done; its MVP - what remains is to set up an email system and to import some recipes. I&#x27;ve been putting off setting up the email system because I know it will have to cover a lot - user registration and confirmation, email and password changes, as well as other stuff I&#x27;m sure. From my brief scanning, the Elixir libraries for email management have definitely improved since I last perused them sometime in 2018.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Conditionals in Ecto Queries</title>
        <published>2022-05-15T00:00:00+00:00</published>
        <updated>2022-05-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/conditionals-in-ecto-queries/"/>
        <id>https://tysloane.ca/posts/conditionals-in-ecto-queries/</id>
        
        <summary type="html">&lt;p&gt;I had a fairly productive refactoring session on a small function that I thought I would write about. In Galley, my recipe&#x2F;cooking application, I have a home &#x2F; index page where users can search and view recipes. At the current state, a user can search by recipe name and can filter by all recipes or &lt;em&gt;their&lt;&#x2F;em&gt; recipes. At the moment I am building out a &lt;em&gt;tagging&lt;&#x2F;em&gt; functionality such that a user can search by tags shared between recipes such as &lt;em&gt;spicy&lt;&#x2F;em&gt;, &lt;em&gt;salad&lt;&#x2F;em&gt;, or &lt;em&gt;easy&lt;&#x2F;em&gt;, for example.&lt;&#x2F;p&gt;
&lt;p&gt;With these three sources of permutation, I need to account for a database query that could have a mixed bag of search queries, tags, and filters.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Dynamic Liveview Forms</title>
        <published>2022-05-03T00:00:00+00:00</published>
        <updated>2022-05-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/dynamic-liveview-forms/"/>
        <id>https://tysloane.ca/posts/dynamic-liveview-forms/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;m back with another post on Elixir. This one is about working with LiveView and building dynamic forms. When I talk about dynamic forms I&#x27;m referring to the ability to add or remove any number of form fields for a &quot;embeds_many&quot; data type. In the case of Galley, the &lt;em&gt;recipe form&lt;&#x2F;em&gt; has many parts to it, the pertinent ones here being the &lt;em&gt;ingredients&lt;&#x2F;em&gt; and the &lt;em&gt;steps&lt;&#x2F;em&gt;. Any recipe has a variable number of ingredients and instructional steps. I needed to enable users to add and&#x2F;or delete form fields to fit their recipes.&lt;&#x2F;p&gt;
&lt;p&gt;This turned out to be a bit harder than I thought, as I waded into the world of LiveView &lt;em&gt;and&lt;&#x2F;em&gt; the mechanics of Ecto and Phoenix at the same time.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A few weeks at Alchemy Camp</title>
        <published>2022-04-24T00:00:00+00:00</published>
        <updated>2022-04-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-few-weeks-at-alchemy-camp/"/>
        <id>https://tysloane.ca/posts/a-few-weeks-at-alchemy-camp/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;m back with a post with some thoughts on Elixir &amp;amp; Phoenix after using it for a few weeks. It&#x27;s been really fun. I&#x27;m using Elixir &amp;amp; Phoenix to build &quot;Galley,&quot; a web app for storing recipes.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Brewing Elixirs in the Galley</title>
        <published>2022-04-14T00:00:00+00:00</published>
        <updated>2022-04-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/brewing-elixirs-in-the-galley/"/>
        <id>https://tysloane.ca/posts/brewing-elixirs-in-the-galley/</id>
        
        <summary type="html">&lt;p&gt;It&#x27;s a new quarter, so I&#x27;m working on a new project. This one will be a rebuilding of my old cooking site, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;arisgarden&quot;&gt;Ari&#x27;s Garden&lt;&#x2F;a&gt;. The new project is tentatively called &quot;Galley&quot;. This post is a bit of a long-winded ramble about what I would like Galley to be, the tech it would use, and how it will be different.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>2021&#x27;s Picks</title>
        <published>2022-01-02T00:00:00+00:00</published>
        <updated>2022-01-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/2021-s-picks/"/>
        <id>https://tysloane.ca/posts/2021-s-picks/</id>
        
        <summary type="html">&lt;p&gt;I don&#x27;t have an extensive list for things I discovered, watched, read, or listened to in 2021, but here are some standouts:&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>2021 - New Year’s Reflections</title>
        <published>2021-12-31T00:00:00+00:00</published>
        <updated>2021-12-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/2021-in-review/"/>
        <id>https://tysloane.ca/posts/2021-in-review/</id>
        
        <summary type="html">&lt;p&gt;The year whipped by. It was a big year for me, in many ways. I turned 30. I achieved a goal I have had for quite some time - to live in a new place( see: &lt;a href=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;2021-in-review&#x2F;notes&#x2F;montreal.md&quot;&gt;Montreal&lt;&#x2F;a&gt;). I spent a lot of time drawing and toward the end of the year - painting. I have many things to be grateful for here (and for those who are reading this that know me personally, I&#x27;m certainly grateful for you :) ).&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A few quick thoughts on Swift</title>
        <published>2021-12-05T00:00:00+00:00</published>
        <updated>2021-12-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-few-quick-thoughts-on-swift/"/>
        <id>https://tysloane.ca/posts/a-few-quick-thoughts-on-swift/</id>
        
        <summary type="html">&lt;p&gt;What&#x27;s this? I&#x27;m reading up on yet ANOTHER programming language?&lt;&#x2F;p&gt;
&lt;p&gt;Yeah, yeah, yeah. This was a bit of a while coming. I&#x27;ve been wanting to rebuild &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teesloane&#x2F;laundromat&quot;&gt;laundromat&lt;&#x2F;a&gt; and some other MIDI sequencers for a while. Originally, I thought it might be fun to build them with SDL and a tool like C, but a combination of different factors made me think that I should just build for iOS (although I have mixed feelings about building in the Apple ecosystem).&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A few quick thoughts on Zig</title>
        <published>2021-12-05T00:00:00+00:00</published>
        <updated>2021-12-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/a-few-quick-thoughts-on-zig/"/>
        <id>https://tysloane.ca/posts/a-few-quick-thoughts-on-zig/</id>
        
        <summary type="html">&lt;p&gt;I love to jump from programming language to programming language whenever I feel I need a jolt in my world(view) of programming. This time I did not stay in the world of Zig long enough to build anything with it, but I&#x27;m glad that I stopped in and had tea, so to speak. The last month or so that I have spent working in Rust in my spare time has given me a bit more confidence in the idea of systems programming, and so I took a quick detour to consume some articles, podcasts, and talks about Zig.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Re-writing Firn in rust - pt. 2</title>
        <published>2021-11-11T00:00:00+00:00</published>
        <updated>2021-11-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/re-writing-firn-in-rust-pt-2/"/>
        <id>https://tysloane.ca/posts/re-writing-firn-in-rust-pt-2/</id>
        
        <content type="html" xml:base="https://tysloane.ca/posts/re-writing-firn-in-rust-pt-2/">&lt;p&gt;Well, I did end up starting a re-write of firn. I&#x27;m having a pretty good time! I&#x27;d say I&#x27;m about 30-40% done and have probably spent about ... 35 hours on it? It seems like a lot for a project (and I suppose it is), but the learning curve for rust has been steep. I am moving faster and faster with each commit, however, and I suspect it will certainly not take as long to complete the re-write as the original took. After all, I&#x27;m mostly porting old features from clojure to rust - I don&#x27;t have to do any experimentation with the actual infrastructure of how the program works. All in all, this has been a good way to learn a new language. At the end of the experience I&#x27;ll have acquired some new skills and knowledge and will also, arguably, have a better&#x2F;faster product too.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m happy I wrote the original version of Firn in Clojure - at the time, I had been taking a break from programming and it was the right way to get back into the world of it - I still loved Clojure, and I knew I could get back into the swing of building things quickly with it. Getting re-acquainted with Clojure would later also gave me the momentum to launch into building &lt;a href=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;re-writing-firn-in-rust-pt-2&#x2F;projects&#x2F;Trunk.md&quot;&gt;Trunk&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Now, Clojure wouldn&#x27;t be my first pick anymore for building a CLI tool such as Firn. I want&#x2F;ed Firn to be an easily distributable binary; and from that I found that I was challenged by the use of GraalVM. I was originally excited at the idea of being able to build native-binaries in clojure (it still is very cool), but the workflow for creating and testing artifacts just wasn&#x27;t optimal. Compile times were long and the system felt complex. The technology is new and there was limited documentation that I could find. Further, I was using Clojure to talk to Rust and embedding all of that in a binary - again, a formidable technological feat but I felt like I was stacking tools on top of tools.&lt;&#x2F;p&gt;
&lt;p&gt;Speaking of stacking tools on tools and layers of technology, I am reminded of the talk &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=pW-SOdj4Kkk&quot;&gt;Preventing the Collapse of Civilization&lt;&#x2F;a&gt; by Jonathan Blow - which was particularly eye-opening for me (not just regarding programming but regarding history and the &quot;losing of history&quot; as a whole). But programming wise, I have been thinking more and more about layers of abstraction and complexity in the tools we use and going forward I&#x27;d like to be a bit more careful when I&#x27;m walking into a project that involves more layers than I&#x27;d like (or are necessary). A part of this discussion deserves its own post, but largely I think that I see this shift as one that simply comes with time and experience.&lt;&#x2F;p&gt;
&lt;p&gt;Firn should have been written in Rust from the beginning as the core library that parses org content (Orgize) was written in Rust. All Firn really does is wrap that functionality in a way that 1) reads org files into memory, 2) call to orgize and pull out metadata &#x2F; content 3) render content&#x2F;metadata with a templating system (with extra niceties for &quot;prebuilt renderers&quot;) and 4) write the output to a file.&lt;&#x2F;p&gt;
&lt;p&gt;All of the above can simply be done in Rust. At the time I didn&#x27;t have the energy to learn Rust when I built Firn. But, switching over now there is plenty of simplification as a result (I think I listed these in a previous post when considering doing the re-write.):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;using only a single language:
&lt;ul&gt;
&lt;li&gt;not gluing two languages together with some kind of interop.&lt;&#x2F;li&gt;
&lt;li&gt;only one set of packages to manage.&lt;&#x2F;li&gt;
&lt;li&gt;easier for contributors to pick up.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Faster compile times (2 seconds vs 5 minutes).&lt;&#x2F;li&gt;
&lt;li&gt;Easier (read: more documentation) for cross compilation.&lt;&#x2F;li&gt;
&lt;li&gt;Smaller binary size.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Another benefit is that I&#x27;m learning enough rust that I could fork the Orgize parser and vendor it if I need to have better customization over the tool, or make contributions upstream. I&#x27;m sure there are some smaller other benefits that are coming from simplifying Firn that I will discover over time.&lt;&#x2F;p&gt;
&lt;p&gt;As for progress, here&#x27;s where I&#x27;m at in development:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
CLI prompt&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
&lt;code&gt;firn new&lt;&#x2F;code&gt; command built&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
parsing of content, collecting of tags, links and logbooks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
implementation of templating system (handlebars)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
writing to file.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
Build support for partials&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;&#x2F;&gt;
Development server&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Handle movement of attachments (images, etc)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Build renderers:
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
sitemap&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
table of contents&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
backlinks&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Logbook stuff&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Figure out cross compilation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Update docs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Possible new features I&#x27;d consider building:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
Theme support, as in Hugo&lt;&#x2F;li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
A blog&#x2F;posts feature that better suits chonolgoical content &#x2F; has it&#x27;s own tagging system.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Looking at that list - there is still a fair bit of work to do. However, I&#x27;ve become more confident in using Rust. The first 20 hours might have moved me forward 5%, but the next 20 hours will probably move me forward 20%.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ll see in a future update I suppose.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>See ya, async!</title>
        <published>2021-09-17T00:00:00+00:00</published>
        <updated>2021-09-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/see-ya-async/"/>
        <id>https://tysloane.ca/posts/see-ya-async/</id>
        
        <summary type="html">&lt;h2 id=&quot;the-discussion-evolves&quot;&gt;The discussion evolves&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m back with another report on investigating core.async in Trunk. My thread on &lt;a href=&quot;https:&#x2F;&#x2F;clojureverse.org&#x2F;t&#x2F;how-to-avoid-sqlite-callbacks-with-core-async&#x2F;&quot;&gt;clojureverse&lt;&#x2F;a&gt; has evolved quite a bit, with interested contributions, including some from the prolific and prodigious&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Core Async Returns</title>
        <published>2021-09-11T00:00:00+00:00</published>
        <updated>2021-09-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/core-async-returns/"/>
        <id>https://tysloane.ca/posts/core-async-returns/</id>
        
        <summary type="html">&lt;p&gt;After fuddling about with Core.async in &lt;a href=&quot;https:&#x2F;&#x2F;tysloane.ca&#x2F;posts&#x2F;core-async-returns&#x2F;projects&#x2F;Trunk.md&quot;&gt;Trunk&lt;&#x2F;a&gt; I decided it was time to reach out for some input. It was a good thing I did; I had reached a point where I was mostly poking at the functions I &lt;em&gt;thought&lt;&#x2F;em&gt; I understood in core.async, and wasn&#x27;t really reading their API.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Re-writing Firn in Rust - pt. 1</title>
        <published>2021-09-07T00:00:00+00:00</published>
        <updated>2021-09-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/re-writing-firn-in-rust-pt-1/"/>
        <id>https://tysloane.ca/posts/re-writing-firn-in-rust-pt-1/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;m thinking about re-writing my static site generator for Org-mode (Firn) from Clojure to Rust. I&#x27;m not sure if I will do it, but I&#x27;ve been thinking about some of the more fundamental design decisions that I want to consider when building software. Firn is built in Clojure, with a touch of Rust for the Org-mode parser, and then is all compiled down to a binary using GraalVM&#x27;s native-image tool. It&#x27;s working, so why re-write it?&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Exploring Core Async</title>
        <published>2021-09-06T00:00:00+00:00</published>
        <updated>2021-09-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://tysloane.ca/posts/exploring-core-async/"/>
        <id>https://tysloane.ca/posts/exploring-core-async/</id>
        
        <summary type="html">&lt;p&gt;I would really like to better understand Core Async with Clojure; specifically, I want to remove myself from callback hell to see if I can make my Clojurescript backend for a new project a bit clearer.&lt;&#x2F;p&gt;</summary>
        
    </entry>
</feed>
