<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Rusty.Pro</title>
    
    
    
    <link>https://rusty.pro/posts/</link>
    <description>Recent content in Posts on Rusty.Pro</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sat, 01 Jul 2023 17:36:22 +0100</lastBuildDate>
    
	<atom:link href="https://rusty.pro/posts/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Fixing RSS</title>
      <link>https://rusty.pro/2023/fixing-rss/</link>
      <pubDate>Sat, 01 Jul 2023 17:36:22 +0100</pubDate>
      
      <guid>https://rusty.pro/2023/fixing-rss/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2023/fixing-rss/2023-07-01-fixing-rss.webp&#34;/&gt;
          
        
        
        &lt;p&gt;One of the unintended effects of &lt;a href=&#34;https://rusty.pro/2023/publishing-new-posts-to-mastodon&#34;&gt;automating the posting of blog post links&lt;/a&gt; to Mastodon has led to the fix of a long standing issue I had with my RSS feed. As seems to be a recurring theme with running this blog, the fix was very simple, taught me more about the way Hugo works, and has delivered other benefits too.&lt;/p&gt;
&lt;p&gt;While trying to get &lt;a href=&#34;https://mastofeed.org/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Mastofeed&lt;/a&gt; to pick up my new posts, it reported that there were no links in my RSS entries. This was somewhat confusing because I have my feed enabled in &lt;a href=&#34;https://netnewswire.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;NetNewsWire&lt;/a&gt; and posts with the correct links appear just fine. That being said, the cover images for my posts in NetNewsWire did not appear and displayed as broken images, suggesting something janky was happening with links in general.&lt;/p&gt;
&lt;h2 id=&#34;in-search-of-answers&#34;&gt;
  In Search Of Answers
  &lt;a href=&#34;#in-search-of-answers&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I used &lt;code&gt;curl&lt;/code&gt; to examine my &lt;a href=&#34;https://rusty.pro/index.xml&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;RSS XML&lt;/a&gt; directly, taking specific note of the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; value for an item. Here&amp;rsquo;s a snippet of the output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;channel&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Rusty.Pro&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;link&amp;gt;&lt;/span&gt;https://rusty.pro/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Publishing New Posts to Mastodon&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;link&amp;gt;&lt;/span&gt;/publishing-new-posts-to-mastodon/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/channel&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hmmm&amp;hellip; that doesn&amp;rsquo;t look quite right. I&amp;rsquo;d expected the item link to be the full URL to the post, and not simply the path without the domain name. My assumption is that NetNewsWire is smart enough to know how to build the full URL by combining the channel link and the item link, but Mastofeed (and possibly other software) cannot.&lt;/p&gt;
&lt;p&gt;Time to go spelunking in the RSS generation code in &lt;code&gt;/themes/hello-friend/layouts/_default/rss.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&amp;gt;{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;&amp;gt;{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Permalink&lt;/span&gt; }}&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;link&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This tells me that the link value should be coming from Hugo&amp;rsquo;s &lt;code&gt;.Permalink&lt;/code&gt; value for the post. It&amp;rsquo;s hard to find &lt;a href=&#34;https://gohugo.io/content-management/urls/#permalinks&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;documentation&lt;/a&gt; to say exactly how permalink values are generated, but brief searching suggested they are supposed to be the full URL. Which defies what I see in the rendered RSS. So what is the missing link?&lt;/p&gt;
&lt;h2 id=&#34;im-all-about-that-base-url&#34;&gt;
  I&amp;rsquo;m All About That Base (URL)
  &lt;a href=&#34;#im-all-about-that-base-url&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The missing piece is the &lt;code&gt;baseURL&lt;/code&gt; config parameter. Hugo takes this value, appends the URL path and BOOM - that&amp;rsquo;s your permalink value.&lt;/p&gt;
&lt;p&gt;When I set up my site config originally, I copied the one offered in the hello-friend theme readme, which sets &lt;code&gt;baseURL = /&lt;/code&gt;. This is why my &lt;code&gt;.Permalinks&lt;/code&gt; are generating the link above of &lt;code&gt;/publishing-new-posts-to-mastodon/&lt;/code&gt; - I&amp;rsquo;d pretty much told Hugo that my domain name is &amp;ldquo;/&amp;rdquo; 🤦‍♂️.&lt;/p&gt;
&lt;p&gt;The fix then becomes very simple. The &lt;code&gt;baseURL&lt;/code&gt; value should be set to &lt;strong&gt;the absolute URL (protocol, host, path, and trailing slash) of your published site&lt;/strong&gt;. Updating my config to set &lt;code&gt;baseURL = &amp;quot;https://rusty.pro/&amp;quot;&lt;/code&gt; changed the item links in my RSS feed to the full URL as required:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Publishing New Posts to Mastodon&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;link&amp;gt;&lt;/span&gt;https://rusty.pro/2023/publishing-new-posts-to-mastodon/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As a result, Mastofeed is now able to detect links to my new posts and publish them to Mastodon!&lt;/p&gt;
&lt;h2 id=&#34;bonus-prizes&#34;&gt;
  Bonus Prizes
  &lt;a href=&#34;#bonus-prizes&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Changing &lt;code&gt;baseURL&lt;/code&gt; has had other unintended improvements. The cover image now appears in NetNewsWire where it just displayed the broken image before.&lt;/p&gt;
&lt;p&gt;It seems that while NetNewsWire was able to construct the full links to my posts with the previously incorrect config, it could not do the same for images in the &lt;code&gt;description&lt;/code&gt; field. Now images have their full path and show as intended!&lt;/p&gt;
&lt;p&gt;I had worried that by hardcoding the &lt;code&gt;baseURL&lt;/code&gt; in my config to the value of the public DNS name of the site, it would cause local testing to break in some way. In actual fact, Hugo is smart enough to replace the domain and port with &lt;code&gt;localhost:1313&lt;/code&gt; when running &lt;code&gt;hugo server&lt;/code&gt; on my computer so all links work locally as expected. It even displays the correct link in the terminal so I can click on to open the site in my browser!&lt;/p&gt;
&lt;h2 id=&#34;learnings&#34;&gt;
  Learnings
  &lt;a href=&#34;#learnings&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;What turned out to be a simple configuration change has had a &amp;ldquo;ripple&amp;rdquo; effect of touching upon a few areas of this website. Although this site is relatively simple, I realise that Hugo is a powerful tool that needs care and attention to work as desired.&lt;/p&gt;
&lt;p&gt;Slowly I am converging on a setup that works well for my needs, and had fun learning more about Hugo along the way!&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-jackson-simmerhttpsunsplashcomsimmerdownjpg-on-unsplashhttpsunsplashcomphotosvqg809b-sre&#34;&gt;
  Cover photo by &lt;a href=&#34;https://unsplash.com/@simmerdownjpg&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Jackson Simmer&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/Vqg809B-SrE&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Unsplash&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-jackson-simmerhttpsunsplashcomsimmerdownjpg-on-unsplashhttpsunsplashcomphotosvqg809b-sre&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Publishing New Posts to Mastodon</title>
      <link>https://rusty.pro/2023/publishing-new-posts-to-mastodon/</link>
      <pubDate>Fri, 30 Jun 2023 18:14:19 +0100</pubDate>
      
      <guid>https://rusty.pro/2023/publishing-new-posts-to-mastodon/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2023/publishing-new-posts-to-mastodon/2023-06-30-publishing-new-posts-to-mastodon.webp&#34;/&gt;
          
        
        
        &lt;p&gt;An thought struck me when browsing Mastodon yesterday - how can I automate the posting of a link to my new blog posts on my Mastodon account? While this took me on something of a journey to find what options exist, the actual solution I landed upon is very straightforward.&lt;/p&gt;
&lt;h2 id=&#34;the-challenge&#34;&gt;
  The Challenge
  &lt;a href=&#34;#the-challenge&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The idea I wanted to implement was simple. Every time I publish a new post on this blog, automatically post a message with its title and link to my Mastodon account. My desire to do this is almost entirely technical - satisfying my problem solving needs - more than any social media strategy I may have.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve used &lt;a href=&#34;https://ifttt.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;IFTTT&lt;/a&gt; in the past to achieve similar things. IFTTT used to be entirely free, and while there is still a free tier, it is severely limited in the number of automations you can have. I looked to see if there were any alternative well-known services  that had a more generous free tier, but if anything it was worse. &lt;a href=&#34;https://zapier.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Zapier&lt;/a&gt; is the other big name in this space, and their Webhooks service is classified as Premium which means on their free tier, it would not be available. My needs are meagre, so to pay to use a fraction of what these services offer doesn&amp;rsquo;t seem worth it.&lt;/p&gt;
&lt;p&gt;Continuing to look for alternatives, I stumbled across &lt;a href=&#34;https://actionsflow.github.io&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Actionflows&lt;/a&gt; that uses GitHub Actions to create automated workflows. It&amp;rsquo;s something I would like to explore more, but there is lots to learn and consider, and given my use case is quite simple, I decided to keep looking.&lt;/p&gt;
&lt;p&gt;The last option I considered was to write something myself and run it locally on my laptop. The &lt;a href=&#34;https://docs.joinmastodon.org/client/intro/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Mastodon API&lt;/a&gt; is well documented with good examples, but this feels quite manual and brittle. I don&amp;rsquo;t want to have to think about running an additional job when creating a post.&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;
  The Solution
  &lt;a href=&#34;#the-solution&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Close to the point I was about to give up, I saw mention of &lt;a href=&#34;https://mastofeed.org&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Mastofeed&lt;/a&gt;. This is a web service that does one thing - take new items discovered in a specified RSS feed and post them to your Mastodon account. Perfect!&lt;/p&gt;
&lt;p&gt;Having found the perfect solution, I was a bit hesitant to use it. The homepage for the service is devoid of any information about who created the service. I was again about to give up when I happened to stumble across a link to a Mastodon post from it&amp;rsquo;s creator &lt;a href=&#34;https://mastodon.social/@barredo&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Alex Barredo&lt;/a&gt;. A little further digging and I discovered this &lt;a href=&#34;https://mastofeed.org/?s=about&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;About&lt;/a&gt; page that you wouldn&amp;rsquo;t normally find until you had logged in.&lt;/p&gt;
&lt;p&gt;I plan to contact Alex with some feedback on how to improve the service, as while niche, I can see it being very useful to others!&lt;/p&gt;
&lt;h2 id=&#34;the-proof-of-the-pudding&#34;&gt;
  The Proof Of The Pudding
  &lt;a href=&#34;#the-proof-of-the-pudding&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;With my account set up, I&amp;rsquo;ve written this post with the sole purpose to test how well it works as soon as I publish it! Wish me luck! 🤞&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-markus-winklerhttpsunsplashcommarkuswinkler-on-unsplashhttpsunsplashcomphotos5ofa31fpkyy&#34;&gt;
  Cover photo by &lt;a href=&#34;https://unsplash.com/@markuswinkler&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Markus Winkler&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/5ofa31FPKYY&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Unsplash&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-markus-winklerhttpsunsplashcommarkuswinkler-on-unsplashhttpsunsplashcomphotos5ofa31fpkyy&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Goodbye Friend</title>
      <link>https://rusty.pro/2023/goodbye-friend/</link>
      <pubDate>Sun, 25 Jun 2023 20:37:46 +0100</pubDate>
      
      <guid>https://rusty.pro/2023/goodbye-friend/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2023/goodbye-friend/2023-06-25-goodbye-friend.webp&#34;/&gt;
          
        
        
        &lt;p&gt;I discovered that the &lt;a href=&#34;https://github.com/panr/hugo-theme-hello-friend&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Hello Friend&lt;/a&gt; theme I am currently using will no longer be maintained. The repository was archived on 10 June 2023. This leaves me with a decision to make.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using the Hello Friend theme since I had some time to myself during the Christmas break last year to refresh the site. I was impressed with the cleanness of the theme and that it was receiving regular updates. Given Hugo is updated frequently, sometimes with &lt;a href=&#34;https://gohugo.io/content-management/multilingual/#changes-in-hugo-01120&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;breaking changes&lt;/a&gt;, it&amp;rsquo;s good if the theme can keep up with it.&lt;/p&gt;
&lt;p&gt;Given this change, I have a few options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continue to use the theme as-is and hope nothing breaks&lt;/li&gt;
&lt;li&gt;Fork the code and maintain it myself&lt;/li&gt;
&lt;li&gt;Move to a new theme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, option 1 is the most appealing. I don&amp;rsquo;t update the site very often, and so hopefully won&amp;rsquo;t run into issues any time soon. If I do, hopefully they are simple enough such that I can fix them in my own fork.&lt;/p&gt;
&lt;p&gt;The idea of finding a new theme doesn&amp;rsquo;t really appeal. It&amp;rsquo;s hard to find something I like and there&amp;rsquo;s always something that&amp;rsquo;s not quite to my taste even with the best of themes.&lt;/p&gt;
&lt;p&gt;There is another option - create my own theme. I&amp;rsquo;d love to learn HTML and (S)CSS and make something that is totally what I want. This is the least likely to happen sadly, but if I get another quiet Christmas, never say never&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-jan-tinneberghttpsunsplashcomescraft_ear-on-unsplashhttpsunsplashcomphotosgjjhg4gm7na&#34;&gt;
  Cover photo by &lt;a href=&#34;https://unsplash.com/es/@craft_ear&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Jan Tinneberg&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/gJJhG4gM7NA&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Unsplash&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-jan-tinneberghttpsunsplashcomescraft_ear-on-unsplashhttpsunsplashcomphotosgjjhg4gm7na&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Verification on Mastodon</title>
      <link>https://rusty.pro/2023/verification-on-mastodon/</link>
      <pubDate>Sat, 28 Jan 2023 17:11:36 +0000</pubDate>
      
      <guid>https://rusty.pro/2023/verification-on-mastodon/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2023/verification-on-mastodon/2023-01-28-verification-on-mastodon.webp&#34;/&gt;
          
        
        
        &lt;p&gt;With the demise of 3rd party Twitter clients such as &lt;a href=&#34;https://tapbots.com/tweetbot/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Tweetbot&lt;/a&gt; (and with it my use of Twitter itself), I&amp;rsquo;ve started using &lt;a href=&#34;https://joinmastodon.org&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Mastodon&lt;/a&gt; as an alternative. One of the capabilities it offers is verification of links added to your profile. There are a couple of ways to do this, and I&amp;rsquo;ve settled on what I think is a nice clean method.&lt;/p&gt;
&lt;p&gt;Mastodon itself recommends the use of anchor tags such as &lt;code&gt;&amp;lt;a rel=&amp;quot;me&amp;quot; href=&amp;quot;https://mas.to/@rustypro&amp;quot;&amp;gt;Mastodon&amp;lt;/a&amp;gt;&lt;/code&gt; on the page you want to verify. This would require adding a link on my homepage. I could add it without text, or by using a non-breaking space, but that feels hacky.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://barrd.dev/article/add-a-verified-website-to-your-mastodon-account-using-link-tag/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Dave Barr&lt;/a&gt; I discovered you can use a &lt;code&gt;link&lt;/code&gt; tag instead to achieve the same verifying effect without cluttering up a page with a hyperlink.&lt;/p&gt;
&lt;p&gt;It then became a simple matter of adding &lt;code&gt;&amp;lt;link rel=&amp;quot;me&amp;quot; href=&amp;quot;https://mas.to/@rustypro&amp;quot;&amp;gt;&lt;/code&gt; to &lt;code&gt;layouts/partials/extended_head.html&lt;/code&gt; in my site code and now I have a lovely checkmark on Mastodon to verify ownership of this site!&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-battenhallhttpsunsplashcombattenhall-on-unsplashhttpsunsplashcomphotosbqrqxz7mze4&#34;&gt;
  Cover photo by &lt;a href=&#34;https://unsplash.com/@battenhall&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Battenhall&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/bQRqXz7mZe4&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Unsplash&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-battenhallhttpsunsplashcombattenhall-on-unsplashhttpsunsplashcomphotosbqrqxz7mze4&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>GoatCounter</title>
      <link>https://rusty.pro/2023/goatcounter/</link>
      <pubDate>Mon, 02 Jan 2023 14:59:28 +0000</pubDate>
      
      <guid>https://rusty.pro/2023/goatcounter/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2023/goatcounter/2023-01-02-goatcounter.webp&#34;/&gt;
          
        
        
        &lt;p&gt;I haven&amp;rsquo;t really told anyone about this blog as it&amp;rsquo;s more of a project to give me somewhere to do something technical rather than a place I want to drive traffic to. Even so, as I write more content, it would be nice to see more traffic  arrive organically at the site. To track how this grows over time, I&amp;rsquo;ve enabled &lt;a href=&#34;https://www.goatcounter.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;GoatCounter&lt;/a&gt; on the site&amp;hellip;&lt;/p&gt;
&lt;p&gt;Besides having a great name, I am a fan of &lt;a href=&#34;https://www.goatcounter.com/why&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;why&lt;/a&gt; it was created. Google Analytics is the most popular tool in this space, but its overkill for my needs, as well as having concerns around privacy. GoatCounter is much simpler and has enough information for me to track how traffic to the site is growing.&lt;/p&gt;
&lt;p&gt;Most free tools require you to self-host and maintain the server component, which I want to avoid. Most hosted SaaS tools have paid-for entry tiers that are expensive for a tiny site like this one. GoatCounter is offered as SaaS that is free for non-commercial use. It is the perfect combination!&lt;/p&gt;
&lt;p&gt;To add it to the site, I needed to add a small piece of code to every page:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data-goatcounter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://rustypro.goatcounter.com/count&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;//gc.zgo.at/count.js&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thankfully the &lt;code&gt;hello-friend&lt;/code&gt; theme makes it very simple to add this code by placing it in the &lt;code&gt;/layouts/partials/extended_footer.html&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Easy as that!&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-goatcounterhttpswwwgoatcountercom&#34;&gt;
  Cover photo by &lt;a href=&#34;https://www.goatcounter.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;GoatCounter&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-goatcounterhttpswwwgoatcountercom&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Font Awesome</title>
      <link>https://rusty.pro/2023/font-awesome/</link>
      <pubDate>Mon, 02 Jan 2023 11:03:13 +0000</pubDate>
      
      <guid>https://rusty.pro/2023/font-awesome/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2023/font-awesome/2023-01-02-font-awesome.webp&#34;/&gt;
          
        
        
        &lt;p&gt;While in the process of writing my (currently unpublished) &lt;a href=&#34;https://rusty.pro/about/&#34;&gt;About&lt;/a&gt; page, one of the things I wanted to add were icons for the links to my various social media profiles. I could add these as images, but I figured it might be cool to add &lt;a href=&#34;https://fontawesome.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Font Awesome&lt;/a&gt; to the blog. Turns out it&amp;rsquo;s actually very simple to do&amp;hellip;&lt;/p&gt;
&lt;p&gt;A quick online search led me to a few articles on how to do this. The implementation I favoured was from Michael Ryan on &lt;a href=&#34;https://somethingstrange.com/posts/hugo-with-fontawesome/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Something Strange&lt;/a&gt; as it doesn&amp;rsquo;t modify the theme files directly, and has support for colours, sizes and opacity.&lt;/p&gt;
&lt;p&gt;Copying from Michael&amp;rsquo;s post, the shortcode syntax to use it is as follows:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{&amp;lt; &amp;lt;style-shortcode&amp;gt; &amp;lt;icon&amp;gt; [color] [size] &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;style-shortcode&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of the Font Awesome shortcodes: &lt;code&gt;fab&lt;/code&gt;, &lt;code&gt;fad&lt;/code&gt;, &lt;code&gt;fal&lt;/code&gt;, &lt;code&gt;far&lt;/code&gt;, or &lt;code&gt;fas&lt;/code&gt;. (Unlike Michael, I am using the free version, so only &lt;code&gt;fab&lt;/code&gt;, &lt;code&gt;far&lt;/code&gt;, and &lt;code&gt;fas&lt;/code&gt; are available).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;icon&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Font Awesome icon code such as &lt;code&gt;rocket-launch&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[color]&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A color pattern, which may include a single color value using standard CSS color notation: &lt;code&gt;[color]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;orange&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#ffa500&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rgb(255, 165, 0)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hsl(39, 100%, 50%)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A color and an opacity: &lt;code&gt;[color][/&amp;lt;opacity&amp;gt;]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;orange / 50%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#ffa500 / 0.5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Two colors with optional opacity: &lt;code&gt;[color][/&amp;lt;opacity&amp;gt;];[color][/&amp;lt;opacity&amp;gt;]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;orange / 50% ; blue / 100%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#ffa500 / 0.5 ; #00f / 1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;To set opacity without affecting color, leave the color value blank or set it to currentColor:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/ 50%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;currentColor / 0.5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;To set secondary color without affecting the primary, leave the primary color value blank or set it to currentColor:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;; blue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;currentColor ; #00f&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&#34;line-height:1em; vertical-align:middle;&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34; style=&#34;height:1em; width:1em&#34;&gt;&lt;path fill=&#34;currentColor&#34; opacity=&#34;1.0&#34; d=&#34;M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480H40c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24V296c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224c0-17.7-14.3-32-32-32s-32 14.3-32 32s14.3 32 32 32s32-14.3 32-32z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;
  
 If the value includes any non-alphanumeric characters, wrap it in quotes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[size]&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The size value using standard CSS length notation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&#34;line-height:1em; vertical-align:middle;&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34; style=&#34;height:1em; width:1em&#34;&gt;&lt;path fill=&#34;currentColor&#34; opacity=&#34;1.0&#34; d=&#34;M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480H40c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24V296c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224c0-17.7-14.3-32-32-32s-32 14.3-32 32s14.3 32 32 32s32-14.3 32-32z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;
  
 If the value includes any non-alphanumeric characters, wrap it in quotes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Awesome! &lt;span style=&#34;line-height:1em; vertical-align:middle;&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34; style=&#34;height:1em; width:1em&#34;&gt;&lt;path fill=&#34;gold&#34; opacity=&#34;1.0&#34; d=&#34;M448 48V384c-63.1 22.5-82.3 32-119.5 32c-62.8 0-86.6-32-149.3-32c-20.6 0-36.6 3.6-51.2 8.2v-64c14.6-4.6 30.6-8.2 51.2-8.2c62.7 0 86.5 32 149.3 32c20.4 0 35.6-3 55.5-9.3v-208c-19.9 6.3-35.1 9.3-55.5 9.3c-62.8 0-86.6-32-149.3-32c-50.8 0-74.9 20.6-115.2 28.7V448c0 17.7-14.3 32-32 32s-32-14.3-32-32V64C0 46.3 14.3 32 32 32s32 14.3 32 32V76.7c40.3-8 64.4-28.7 115.2-28.7c62.7 0 86.5 32 149.3 32c37.1 0 56.4-9.5 119.5-32z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;h5 id=&#34;cover-photo-by-font-awesomehttpsfontawesomecom&#34;&gt;
  Cover photo by &lt;a href=&#34;https://fontawesome.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Font Awesome&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-font-awesomehttpsfontawesomecom&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Archetypes Are Really Useful</title>
      <link>https://rusty.pro/2022/archetypes-are-really-useful/</link>
      <pubDate>Mon, 26 Dec 2022 10:04:00 +0000</pubDate>
      
      <guid>https://rusty.pro/2022/archetypes-are-really-useful/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2022/archetypes-are-really-useful/2022-12-26-archetypes-are-really-useful.webp&#34;/&gt;
          
        
        
        &lt;p&gt;One of the reasons I feel have failed to blog at all over the past 4 years is that the barrier to entry was too high. Rather than focusing on writing content, I would spend lots of time trying to remember how to use the tools, get frustrated, and give up. Some of this friction can be removed with a handy Hugo feature called Archetypes.&lt;/p&gt;
&lt;p&gt;There are many pages that describe the benefits and how to use archetypes so I won&amp;rsquo;t try to cover them again here. One page that I found that really helped me to understand how they worked was written by &lt;a href=&#34;https://cloudcannon.com/blog/maximizing-the-convenience-factor-archetypes-in-hugo/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Bruce Wray on CloudCannon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By creating an archetype, it makes it easier and faster for me to get the outline of a post ready to go, and then I can focus more of my time on writing the actual content.&lt;/p&gt;
&lt;p&gt;A couple of things I needed to be mindful of when creating my archetype were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I am using &lt;a href=&#34;https://gohugo.io/content-management/page-bundles/#leaf-bundles&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Leaf Bundles&lt;/a&gt; for my pages&lt;/li&gt;
&lt;li&gt;My folder/file naming structure uses the format &lt;code&gt;posts/yyyy/yyyy-MM-dd-page-title&lt;/code&gt;, whereas the title should appear using the format &lt;code&gt;Page Title&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first is easy enough to deal with. Hugo has support for &lt;a href=&#34;https://gohugo.io/content-management/archetypes/#directory-based-archetypes&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;directory based archetypes&lt;/a&gt;, so I just made sure to save my file with the path &lt;code&gt;/archetypes/posts/index.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The second is a little more involved, but also relatively simple once you realise Hugo supports a number of functions that can be linked together to manipulate text. I used &lt;a href=&#34;https://gohugo.io/functions/slicestr/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;&lt;code&gt;slicestr&lt;/code&gt;&lt;/a&gt; to remove the 11 character date portion from the &lt;code&gt;.Name&lt;/code&gt;, &lt;a href=&#34;https://gohugo.io/functions/humanize/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;&lt;code&gt;humanize&lt;/code&gt;&lt;/a&gt; to turn the hyphens into spaces, and finally &lt;a href=&#34;https://gohugo.io/functions/title/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;&lt;code&gt;title&lt;/code&gt;&lt;/a&gt; to convert the text to title case.&lt;/p&gt;
&lt;p&gt;As I post more, I&amp;rsquo;ll learn what I need (and what I don&amp;rsquo;t) in my archetype but here&amp;rsquo;s what I settled on for now.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;: {{ &lt;span style=&#34;color:#a6e22e&#34;&gt;slicestr&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt; | &lt;span style=&#34;color:#a6e22e&#34;&gt;humanize&lt;/span&gt; | &lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;: {{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Date&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;tags&lt;/span&gt;: [ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hugo&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;website&amp;#34;&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;cover&lt;/span&gt;: {{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt; }}.&lt;span style=&#34;color:#a6e22e&#34;&gt;webp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;coverAlt&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;Cover&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Alt&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;coverCaption&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;Cover&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;useRelativeCover&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;draft&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#####&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Cover&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;photo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this in place, the command I used to create this post was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;hugo new posts/2022/2022-12-26-archetypes-are-really-useful&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This resulted in this ready to edit file being created with most of the boilerplate stuff in place:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Archetypes&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Are&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Really&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Useful&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;2022-12-26T10:04:00Z&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;tags&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hugo&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;website&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;cover&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2022-12-26&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;-archetypes-are-really-useful&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;webp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;coverAlt&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Cover&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Alt&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;coverCaption&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Cover&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;useRelativeCover&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;##### Cover photo by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This should dramatically speed up the initial part of the blog writing process, and hopefully lead to more posts!&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-nicole-michalouhttpswwwpexelscomphotoperson-using-a-cookie-cutter-6061742&#34;&gt;
  Cover photo by &lt;a href=&#34;https://www.pexels.com/photo/person-using-a-cookie-cutter-6061742/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Nicole Michalou&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-nicole-michalouhttpswwwpexelscomphotoperson-using-a-cookie-cutter-6061742&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Sweating the Small Stuff - Part 1</title>
      <link>https://rusty.pro/2022/sweating-the-small-stuff-part-1/</link>
      <pubDate>Sun, 25 Dec 2022 17:55:47 +0000</pubDate>
      
      <guid>https://rusty.pro/2022/sweating-the-small-stuff-part-1/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2022/sweating-the-small-stuff-part-1/2022-12-25-sweating-the-small-stuff-part-1.webp&#34;/&gt;
          
        
        
        &lt;p&gt;I am much more enthusiastic about this site since the theme change! I would say it satisfies about 95% of what I would have created myself had I the skills to do so!&lt;/p&gt;
&lt;p&gt;There are a few things I would like to change to take care of that final 5%. Here&amp;rsquo;s how I tackled a couple of them.&lt;/p&gt;
&lt;h2 id=&#34;post-excerpts&#34;&gt;
  Post Excerpts
  &lt;a href=&#34;#post-excerpts&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The first is how excerpts for posts are created on list pages. The &lt;a href=&#34;https://github.com/panr/hugo-theme-hello-friend/blob/95a746521aa4b445dd0a6dfd9750e8e04fbeff6a/layouts/_default/list.html#L41-L49&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;code&lt;/a&gt; used for this is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;post-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#a6e22e&#34;&gt;with&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ . | &lt;span style=&#34;color:#a6e22e&#34;&gt;markdownify&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Truncated&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Summary&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code relies on at least one of two things being true to show a post excerpt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The post has a &lt;code&gt;Description&lt;/code&gt; in its front matter&lt;/li&gt;
&lt;li&gt;The post is longer than &lt;a href=&#34;https://gohugo.io/getting-started/configuration/#summarylength&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;&lt;code&gt;summaryLength&lt;/code&gt;&lt;/a&gt; (which is 70 words by default)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are several ways Hugo &lt;a href=&#34;https://gohugo.io/content-management/summaries/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;generates a summary&lt;/a&gt;, but for really short posts without a description, the excerpt will not be displayed as the post will be shorter than the &lt;code&gt;.Truncated&lt;/code&gt; length.&lt;/p&gt;
&lt;p&gt;I am not sure of the original thought process behind the code above, but I want to ensure a summary will be displayed in all cases, especially as writing a &lt;code&gt;Description&lt;/code&gt; for all posts feels like it could be a duplication of effort.&lt;/p&gt;
&lt;p&gt;The fix is actually quite simple — remove the check for &lt;code&gt;.Truncated&lt;/code&gt; in the code so either a description or summary are always displayed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;post-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#a6e22e&#34;&gt;with&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ . | &lt;span style=&#34;color:#a6e22e&#34;&gt;markdownify&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Summary&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;While the code change itself is simple, implementing it comes with a couple of challenges. One way to implement the change, is to modify the code in the original theme that is referenced in my GitHub repository (this was added as a git submodule).&lt;/p&gt;
&lt;p&gt;I prefer to keep the original theme as is and I don&amp;rsquo;t want to manage my own fork of the code. So I&amp;rsquo;m going to use a feature of Hugo that allows me to keep the original theme unmodified while implementing my own changes.&lt;/p&gt;
&lt;p&gt;Hugo uses a specific &lt;a href=&#34;https://gohugo.io/templates/lookup-order/#hugo-layouts-lookup-rules-with-theme&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;lookup order&lt;/a&gt; for layouts, and so I can create a copy of the files I need to change, namely &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;list.html&lt;/code&gt;, modify them with the above code, and place them in &lt;code&gt;/layouts/_default&lt;/code&gt;. Hugo will use those in place of the corresponding files in my theme directory, while any files other than those two, will continue to be used from the theme directory.&lt;/p&gt;
&lt;p&gt;The downside to this approach is that while I don&amp;rsquo;t have a full code fork to maintain, I will need to maintain any upstream changes to these two files. As the theme doesn&amp;rsquo;t change that often, hopefully it is not too onerous. I will look at ways to better tackle this in the future, such as attempting to raise a Feature Request for the original theme, or by creating a patch/diff that I can reapply as needed.&lt;/p&gt;
&lt;h2 id=&#34;the-read-more-button&#34;&gt;
  The Read More button
  &lt;a href=&#34;#the-read-more-button&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Right next to the code I modified above is another change I&amp;rsquo;d like to make. The &lt;code&gt;Read More&lt;/code&gt; button is displayed on every post by default. It can be hidden on a post by post basis by using &lt;code&gt;hideReadMore: true&lt;/code&gt; in the post&amp;rsquo;s front matter.&lt;/p&gt;
&lt;p&gt;However for really short posts that are not truncated, there is no need for the button to appear as there is nothing more to read!&lt;/p&gt;
&lt;p&gt;Let see how to fix this. The original &lt;a href=&#34;https://github.com/panr/hugo-theme-hello-friend/blob/95a746521aa4b445dd0a6dfd9750e8e04fbeff6a/layouts/_default/list.html#L50-L56&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;code&lt;/a&gt; to display the &lt;code&gt;Read More&lt;/code&gt; button looks like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;not&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;hideReadMore&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read-more button&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{{ .RelPermalink }}&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Site&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ReadMore&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Read more&amp;#34;&lt;/span&gt; }} &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;→&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The change we have to make is quite simple — we only want to show the button on the post if the front matter has &lt;code&gt;.hideReadMore&lt;/code&gt; as false (which is the default when it&amp;rsquo;s not set) &lt;strong&gt;and&lt;/strong&gt; the post is &lt;code&gt;.Truncated&lt;/code&gt;. Hugo has &lt;a href=&#34;https://gohugo.io/templates/introduction/#conditionals&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Conditionals&lt;/a&gt; that allow us to do this easily.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;and&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Truncated&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;not&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;hideReadMore&lt;/span&gt;) }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read-more button&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{{ .RelPermalink }}&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Site&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ReadMore&lt;/span&gt; | &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Read more&amp;#34;&lt;/span&gt; }} &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;→&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Implementing this is the same as before - this code is added to the modified copies of &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;list.html&lt;/code&gt; that are kept in &lt;code&gt;/layouts/_default&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;end-of-part-1&#34;&gt;
  End of Part 1
  &lt;a href=&#34;#end-of-part-1&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;In this post, I showed how you can improve excerpts to ensure they are displayed in almost every case as well as how to only show the &lt;code&gt;Read More&lt;/code&gt; button when there is more to read!&lt;/p&gt;
&lt;p&gt;There are more changes I want to make but as this post is getting a little long, I&amp;rsquo;ll continue them in a new post soon.&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id=&#34;cover-photo-by-claudio-schwarzhttpsunsplashcompurzlbaum-on-unsplashhttpsunsplashcomphotoswdxv6ivxiy8&#34;&gt;
  Cover photo by &lt;a href=&#34;https://unsplash.com/@purzlbaum&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Claudio Schwarz&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/wdXv6IVXIy8&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Unsplash&lt;/a&gt;
  &lt;a href=&#34;#cover-photo-by-claudio-schwarzhttpsunsplashcompurzlbaum-on-unsplashhttpsunsplashcomphotoswdxv6ivxiy8&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h5&gt;
        
        </description>
    </item>
    
    <item>
      <title>Site Updates</title>
      <link>https://rusty.pro/2022/site-updates/</link>
      <pubDate>Sat, 24 Dec 2022 16:39:57 +0000</pubDate>
      
      <guid>https://rusty.pro/2022/site-updates/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;It&amp;rsquo;s been a long time since I updated this site! Almost exactly 4 years in fact. I wasn&amp;rsquo;t totally happy with how the site looked which lead to a bizarre case of not really wanting to update it at all. I&amp;rsquo;ve finally had a little downtime to perform some updates and I&amp;rsquo;m much happier! Here&amp;rsquo;s what I changed&amp;hellip;&lt;/p&gt;
&lt;p&gt;The most obvious change is that I&amp;rsquo;ve updated the theme of this blog to use &lt;a href=&#34;https://github.com/panr/hugo-theme-hello-friend&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;hello-friend&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/panr&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;panr&lt;/a&gt;. I think it&amp;rsquo;s a really clean theme and has support for light and dark modes (you can toggle between them with the button in the top right corner).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve added a blank &lt;a href=&#34;https://rusty.pro/about/&#34;&gt;About Me&lt;/a&gt; page that I will look to fill in at some point with, unsurprisingly, more details about me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve removed Disqus as I don&amp;rsquo;t really see the need for it. I&amp;rsquo;ve also moved away from Mailgun since they removed their free tier, and now use &lt;a href=&#34;https://improvmx.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;ImprovMX&lt;/a&gt; for email redirection.&lt;/p&gt;
&lt;p&gt;My next step is to make it as easy as possible to write posts. In order to do so, I plan to write myself a &amp;ldquo;playbook&amp;rdquo; of sorts to make it as frictionless as possible and not have to relearn the steps every single time. I&amp;rsquo;ll write a post on it sometime soon!&lt;/p&gt;
        
        </description>
    </item>
    
    <item>
      <title>Consul B-Sides - powerful features you might not have heard of</title>
      <link>https://rusty.pro/2018/consul-b-sides-powerful-features-you-might-not-have-heard-of/</link>
      <pubDate>Fri, 14 Dec 2018 15:17:56 +0000</pubDate>
      
      <guid>https://rusty.pro/2018/consul-b-sides-powerful-features-you-might-not-have-heard-of/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;&lt;a href=&#34;https://www.consul.io&#34; title=&#34;HashiCorp Consul&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Consul&lt;/a&gt; is widely known as a service discovery tool but has many more features that make it a &amp;ldquo;Swiss Army Knife&amp;rdquo; when it comes to connecting and configuring services across different runtime platforms, and both public and private clouds. I recorded a webinar that explored some of the lesser known features including blocking queries, watches, locks and remote execution.&lt;/p&gt;
&lt;p&gt;Check it out on the &lt;a href=&#34;https://www.hashicorp.com/resources/consul-b-sides-exploring-powerful-features&#34; title=&#34;Consul B-Sides: Exploring The Powerful Features of Consul You Might Not Have Heard Of&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;HashiCorp website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I prepared a series of bash scripts (&lt;a href=&#34;https://gist.github.com/russparsloe/aee8d9ca05a1aceffc963b86928bab1d&#34; title=&#34;Gist containing demo bash scripts&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;gist&lt;/a&gt;) to help prevent typos under pressure whilst running a live demo.&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/russparsloe/aee8d9ca05a1aceffc963b86928bab1d.js&#34;&gt;&lt;/script&gt;

&lt;p&gt;Funny fact - notice the change in lighting between the presentation and demo, and the Q&amp;amp;A sections. The original webinar ended abruptly before I managed to get all of the questions answered, so I had to come back and re-record them one evening a couple of days later!&lt;/p&gt;
        
        </description>
    </item>
    
    <item>
      <title>Talk4Nerds</title>
      <link>https://rusty.pro/2018/talk4nerds/</link>
      <pubDate>Mon, 12 Nov 2018 14:57:55 +0000</pubDate>
      
      <guid>https://rusty.pro/2018/talk4nerds/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;I was invited to speak at the R+V Talk4Nerds event in Frankfurt, to give 2 talks - one on &lt;a href=&#34;https://www.terraform.io&#34; title=&#34;HashiCorp Terraform&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Terraform&lt;/a&gt; and the other on &lt;a href=&#34;https://www.vaultproject.io&#34; title=&#34;HashiCorp Vault&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Vault&lt;/a&gt; to an audience of around 100 people. Both talks were recorded and are available on Youtube.&lt;/p&gt;
&lt;p&gt;My first talk of the day was on the use of Terraform to provision into multiple clouds, or more generally to deploy and config anything with an API.&lt;/p&gt;


    
    &lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/g_70X2ZNnAc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;
      &gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I closed up the day with a talk on how Vault allows you to manage secrets and protect sensitive data.&lt;/p&gt;


    
    &lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/hT8UGBYq7XU?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;
      &gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;For a moment of humour when disaster strikes, check out the Vault video around the &lt;a href=&#34;https://youtu.be/hT8UGBYq7XU?t=1678&#34; title=&#34;When live demos go bad&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;28 minute mark&lt;/a&gt;.&lt;/p&gt;
        
        </description>
    </item>
    
    <item>
      <title>The Clapham 10k</title>
      <link>https://rusty.pro/2018/the-clapham-10k/</link>
      <pubDate>Fri, 22 Jun 2018 21:50:52 +0100</pubDate>
      
      <guid>https://rusty.pro/2018/the-clapham-10k/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;I&amp;rsquo;ve not set out to create a blog about running, but so far that&amp;rsquo;s all I seem to be writing about! It&amp;rsquo;s not even something I&amp;rsquo;m particularly good at.&lt;/p&gt;
&lt;p&gt;To improve, I simply need to do it more often, and on a regular basis. Running at a Parkrun each weekend is a good way to help build up the habit. To get good at it though, I needed to set myself a challenge that made me push myself outside of my comfort zone and improve as a runner.&lt;/p&gt;
&lt;p&gt;My friend messaged me today to ask if I wanted to join him in the Clapham 10k run taking place in September. It was a really nice thought, and not something I could turn down. We both signed up straight away!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve run 10k only once before in my life, at the Derby 10k back in April 2011. My goal that time was simply to try and complete the course without stopping to walk. I managed exactly that in a time of 1h:05m:27s. This time around I know I can do better. I&amp;rsquo;ll be looking to complete the course and break the 1 hour mark.&lt;/p&gt;
&lt;p&gt;To get to this level I need to be disciplined and train regularly. At a minimum I need to run twice a week. With Parkrun on Saturdays fulfilling one of those runs, I will also run once or twice during the week, especially as I not only need to increase my speed, but also to run longer distances. This is likely to mean waking up early when I can, putting my trainers on and heading out there while the rest of London sleeps!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m really looking forward to this. It&amp;rsquo;s going to be a great event I&amp;rsquo;m sure and gives me a specific goal with a defined end date I can really push for!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signup link&lt;/strong&gt; - If you&amp;rsquo;d like to join us and get £5 off, &lt;a href=&#34;https://endurancecui.active.com/event-reg/select-race?e=53718152&amp;amp;rc=X-1VD2DKKT&amp;amp;rf=dedcdef2054b4965aafa79a6b7de485b&#34; title=&#34;Clapham 10k signup page&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;visit this page&lt;/a&gt;&lt;/p&gt;
        
        </description>
    </item>
    
    <item>
      <title>Parkrun PB</title>
      <link>https://rusty.pro/2018/parkrun-pb/</link>
      <pubDate>Sun, 22 Apr 2018 21:54:03 +0100</pubDate>
      
      <guid>https://rusty.pro/2018/parkrun-pb/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2018/parkrun-pb/2018-04-22-parkrun-pb.webp&#34;/&gt;
          
        
        
        &lt;p&gt;Continuing with the Parkrun theme, yesterday morning I attended Hampstead Heath along with 448 other runners. It was an amazing day for running - beautiful sunny sky, warm but not too hot, and the Heath is such a beautiful place to be whatever the occasion.&lt;/p&gt;
&lt;p&gt;My previous best time on this particular course was 31:37. Early in the run, I knew I was going faster that usual, and was just hoping I could keep the pace up. Many times my body was telling me to slow down, particularly on the long uphill sections, but I knew that I needed to push through the discomfort and try to go as fast as possible.&lt;/p&gt;
&lt;p&gt;This last point is important - it&amp;rsquo;s tempting to ease off when things get more difficult, but there was no physical reason why I needed to (pushing through discomfort is one thing - pushing through pain and causing damage is not a good idea). I&amp;rsquo;m suffering no ill effects from the run and know growth in all its forms comes when we are outside of our comfort zone.&lt;/p&gt;
&lt;p&gt;I knew when I finished I&amp;rsquo;d posted my best time, but had to wait for the official result to come through to see exactly what it would be. I managed to master those hills in 29:57, over a minute and a half better than my previous best, and just under that magic 30 minute mark!&lt;/p&gt;
&lt;p&gt;If I&amp;rsquo;d slowed down or stopped even for a couple of seconds, I would have been disappointed in myself not to have broken that barrier. As such, it&amp;rsquo;s spurred me on to do even better next time, with a goal to get under the 25 minute mark by the end of the year. Although there will come a point when I can&amp;rsquo;t make such impressive gains and my speed starts to level off, I&amp;rsquo;ve confidence in myself to achieve that target much sooner.&lt;/p&gt;
        
        </description>
    </item>
    
    <item>
      <title>Parkrun</title>
      <link>https://rusty.pro/2018/parkrun/</link>
      <pubDate>Sat, 14 Apr 2018 23:54:27 +0100</pubDate>
      
      <guid>https://rusty.pro/2018/parkrun/</guid>
      <description>
        
          &lt;img src=&#34;https://rusty.pro/2018/parkrun/2018-04-14-parkrun.webp&#34;/&gt;
          
        
        
        &lt;p&gt;This morning I headed over to Markeaton Park, and joined 372 other people to take part in one of many Parkruns taking place around the country.&lt;/p&gt;
&lt;p&gt;To quote the &lt;a href=&#34;http://www.parkrun.org.uk/&#34; title=&#34;Free, weekly, 5km timed runs around the world&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Parkrun&lt;/a&gt; website:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;parkrun organise free, weekly, 5km timed runs around the world. They are open to everyone, free, and are safe and easy to take part in.&lt;/p&gt;
&lt;/blockquote&gt;

  &lt;figure class=&#34;center&#34; &gt;
    &lt;img src=&#34;2018-04-14-parkrun-2.webp&#34;  alt=&#34;Parkrun locations across the UK&#34;   style=&#34;border-radius: 8px;&#34;  /&gt;
    
      &lt;figcaption class=&#34;center&#34; &gt;Parkrun locations across the UK&lt;/figcaption&gt;
    
  &lt;/figure&gt;


&lt;p&gt;As you can see from the map in the image, there are hundreds of locations where you can take part in a fun 5k run every week. The process is very simple and best of all, it&amp;rsquo;s free:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&#34;http://www.parkrun.org.uk/&#34; title=&#34;Free, weekly, 5km timed runs around the world&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;http://www.parkrun.org.uk/&lt;/a&gt;, register and receive your unique barcode&lt;/li&gt;
&lt;li&gt;Print your barcode (the barcode readers don&amp;rsquo;t work on phone screens sadly) and have it ready to take it with you on the day of the run&lt;/li&gt;
&lt;li&gt;Find a location and time from the Parkrun website and just turn up - no need to book!&lt;/li&gt;
&lt;li&gt;Shortly before the run begins, the race marshall will explain some safety and housekeeping rules&lt;/li&gt;
&lt;li&gt;Run 5k following the great signposting, and volunteers pointing out the route along the way&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll be handed a finish token once you run through the finish line&lt;/li&gt;
&lt;li&gt;Find one of the volunteers with a barcode scanner, hand over your finish token and the barcode you printed to be scanned&lt;/li&gt;
&lt;li&gt;Done! You&amp;rsquo;ll typically get your results later in the day - and then you can pat yourself on the bag for a job well done!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ve run around 10 times, but didn&amp;rsquo;t get an official time on two occassions when I forgot my barcode. To combat that, I bought a &lt;a href=&#34;https://parkrun-barcode.com/&#34; title=&#34;Buy a Parkrun barcode&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;plastic tag&lt;/a&gt; that I threaded onto my running shoes!&lt;/p&gt;
&lt;p&gt;My average time for the 5k is around 32 minutes, although I hope to go more regularly, and have a sub 25 minute time in my sights!&lt;/p&gt;
&lt;p&gt;Go take a look, sign up and enjoy!&lt;/p&gt;
        
        </description>
    </item>
    
    <item>
      <title>Rusty.Pro - or how I host a robust, cutting edge website for just $2</title>
      <link>https://rusty.pro/2018/rusty-pro/</link>
      <pubDate>Thu, 12 Apr 2018 21:29:01 +0100</pubDate>
      
      <guid>https://rusty.pro/2018/rusty-pro/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Welcome to my tiny corner of the web! I&amp;rsquo;ve wanted a place to put my learnings online for a good while, and with time on my hands to finally do it, this is the outcome.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t had a website for over a decade, and so with a blank slate I looked at the current options available. I&amp;rsquo;ve used &lt;a href=&#34;https://wordpress.org&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Wordpress&lt;/a&gt; in the past with it&amp;rsquo;s famous 5 minute install. Although it&amp;rsquo;s a great platform, it feels a little &amp;ldquo;heavy&amp;rdquo; for a tiny site like mine. Managing version updates, plugins, and a database would add management overhead that I just don&amp;rsquo;t have time for. Also Wordpress is a dynamic site, meaning content has to be pulled from the database and generated on the fly for every page view, which creates a performance hit. There are some mitigation strategies such as using caching plugins, but this is yet another thing to manage.&lt;/p&gt;
&lt;p&gt;While dynamic website have their place, there is a growing tendancy to switch back to static webpages, that are pre-generated, making them fast to load (it&amp;rsquo;s just plain HTML and Javascript). And there are mature tools which allow you to create a template, and merge it with content, which gives you many of the benefits of dynamic sites without many of the drawbacks.&lt;/p&gt;
&lt;p&gt;After looking at many of the options available today, enter &lt;a href=&#34;https://gohugo.io&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Hugo&lt;/a&gt;. Written in Go from the ground up, Hugo is a fast and flexible static site generator, and while newer than some alternatives, has developed a large community and a has large number of themes available. Content can be written into plaintext files in &lt;a href=&#34;https://en.wikipedia.org/wiki/Markdown&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Markdown&lt;/a&gt;, which can then be version controlled in Git.&lt;/p&gt;
&lt;p&gt;After going backwards and forwards for an age, I settled on the theme &lt;a href=&#34;https://github.com/ribice/kiss/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Kiss&lt;/a&gt; by &lt;a href=&#34;https://www.ribice.ba/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Emir Ribic&lt;/a&gt;. I even spotted an issue, raised a PR on GitHub and I&amp;rsquo;m now officially a contributor!&lt;/p&gt;
&lt;p&gt;Now I had the ability to create a site, I needed a way to host it online. Here are the steps I took to make that happen, and for almost zero cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Domain name&lt;/strong&gt; - Namecheap ($2)&lt;/p&gt;
&lt;p&gt;One of the hardest parts of this whole endeavour was choosing a suitable domain name! I wanted it to be short enough to remember, easy to spell, and of course, it had to be witty. I think I hit 2 out of 3 and Rusty.Pro describes me pretty well! I&amp;rsquo;d heard good things about &lt;a href=&#34;https://www.namecheap.com/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Namecheap&lt;/a&gt; and for the princely sum of $2, I got the domain for a year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hosting&lt;/strong&gt; - Netlify (Free)&lt;/p&gt;
&lt;p&gt;I originally considered using &lt;a href=&#34;https://pages.github.com/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;GitHub pages&lt;/a&gt;, especially as the source code for the site lives in GitHub. This would mean pulling code from GitHub, building the site locally, and then re-pushing the branch back with the static HTML in the correct directory. There was also a few caveats to this, so I carried on my search and discovered the incredible &lt;a href=&#34;https://netlify.com&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Netlify&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Netlify allow you to connect to a git repository on GitHub, and every time a new change is pushed to the repo, Netlify will invoke Hugo, build the site, and then host it for you on their CDN network. They can generate a SSL certificate so people can browse your site securely and they also manage your DNS records for you. And they have a free plan for all of this. It&amp;rsquo;s truly incredible!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Email&lt;/strong&gt; - Mailgun (Free)&lt;/p&gt;
&lt;p&gt;The only thing that Netlify don&amp;rsquo;t offer, is any kind of email management. This is something you need to provide yourself. I considered a number of free email hosts, or even a Google Apps account, but having another email system to manage is something I wanted to avoid. Enter Mailgun. Using their servers, you can create mail routes to forward email to an existing account. They offer powerful routing to create different rules for different email aliases, as well as a catch all option. The account is free for up to 10,000 emails per month, overkill for my site. My experience using them so far has been excellent, and the support I received for a couple of minor issues I had has been first rate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comments&lt;/strong&gt; - Disqus (Free)&lt;/p&gt;
&lt;p&gt;Although I don&amp;rsquo;t expect (m)any comments on this site, one of the things that is more challenging with static pages, is the ability to provide a function for people to leave comments. Fortunalely Hugo provides first rate support for &lt;a href=&#34;https://disqus.com/&#34; target=&#34;_blank&#34; rel=&#34;nofollow noopener noreferrer&#34; &gt;Disqus&lt;/a&gt;, the most popular comment plug-in available. They offer a couple of free options. For small, ad-free, non-commercial sites such as mine, they offer a generous &amp;ldquo;Plus&amp;rdquo; plan for free. It&amp;rsquo;s got some really nice features, and I no longer have to worry about managing comments.&lt;/p&gt;
&lt;p&gt;So there you have it. By leveraging some really great online services, I have a robust, fast and modern website for minimal cost. Leave a comment below if there&amp;rsquo;s anything else you&amp;rsquo;d like to know, and welcome!&lt;/p&gt;
        
        </description>
    </item>
    
  </channel>
</rss>