<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Geeky Digital Nomadism on I Lost My Page</title>
    <link>https://ilostmypage.com/?gtm_referrer=rss</link>
    <description>Recent content in Geeky Digital Nomadism on I Lost My Page</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-gb</language>
    <lastBuildDate>Fri, 15 Dec 2023 12:00:00 +0000</lastBuildDate>
    
	<atom:link href="https://ilostmypage.com/index.xml?gtm_referrer=rss" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Quitting my job to travel the world (again)</title>
      <link>https://ilostmypage.com/posts/quitting-my-job-to-travel-the-world-again/?gtm_referrer=rss</link>
      <pubDate>Fri, 15 Dec 2023 12:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/quitting-my-job-to-travel-the-world-again/</guid>
      <description>&lt;p&gt;A few more years pass, another post about my next dramatic (to me at least) life change. I&amp;rsquo;m starting to think this is going to be a 5-yearly occurrence at this point. Better than a 7-year-itch I suppose.&lt;/p&gt;
&lt;h3 id=&#34;so-what-are-you-doing-jason&#34;&gt;So what are you doing Jason?&lt;/h3&gt;
&lt;p&gt;Technically, I&amp;rsquo;m airbnb-ing in Thailand for a few months. This so far has involved a fair bit of The Legend of Zelda, some beers and lots of scooting around. There has been a little bit of coding/general infrastructure upkeep in-between that, which I think will start increasing soon as it turns out I get bored quick. After this, I&amp;rsquo;ll likely continue on to do the same in Vietnam or Malaysia when the tourist visa&amp;rsquo;s run out. Maybe a cheeky Taiwan trip, who knows? Oh, and probably a few months stint back in blighty too.&lt;/p&gt;
&lt;h3 id=&#34;but-what-are-you-really-doing-like-with-your-life-bro&#34;&gt;But what are you really doing? Like, with your life bro?&lt;/h3&gt;
&lt;p&gt;Fuck knows. I mean, I&amp;rsquo;m meant to be figuring that out right. And I&amp;rsquo;m meant to be taking it easy and letting it come to me, not putting pressure on myself to start the next thing, or find some income stream or whatever. But&amp;hellip;. buuuuuut&amp;hellip; I&amp;rsquo;m less than a week in, and already I&amp;rsquo;m spinning out a bit. And, as above, I&amp;rsquo;m already starting to tinker. I dunno, I just like it I suppose.&lt;/p&gt;
&lt;h3 id=&#34;well-what-do-you-want-to-do&#34;&gt;Well, what do you want to do?&lt;/h3&gt;
&lt;p&gt;Definitely not rattle on in such self-serving wankery via a blog post. I mean, I&amp;rsquo;m typing these questions as well as the answers, aren&amp;rsquo;t I? I&amp;rsquo;m surely not fooling anyone here&amp;hellip; But, I don&amp;rsquo;t have anything better to do, do I? ¯\_(ツ)_/¯. Eh, it might help me work it out so fuck it: I want to &amp;ldquo;build my own thing&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not 100% sure what that means though&amp;hellip;&lt;/p&gt;
&lt;p&gt;Is it doing &amp;ldquo;a startup&amp;rdquo;? With all the silly VC-chasing and growth-growth-growth that comes with that? I&amp;rsquo;m really, really not sure that&amp;rsquo;s something I want to do. And nearly definitely not something I want to do on my own.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Or is it doing something &lt;a href=&#34;https://www.indiehackers.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IndieHackers&lt;/a&gt;-esque? &lt;a href=&#34;https://antiquoted.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Antiquoted&lt;/a&gt; might be just that, but can I really finish building something out like this? And even moreso, if I do, can I make any bloody money from it? And all on my own-ish? Ugh, such dilemma.&lt;/p&gt;
&lt;h3 id=&#34;anyways-now-youre-up-to-speed-at-least&#34;&gt;Anyways, now you&amp;rsquo;re up to speed at least&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s a bit of a conundrum eh. I reckon I&amp;rsquo;ll probably figure it out. I mean in a worst case scenario I&amp;rsquo;ll end up getting a job again halfway through next year. So like, from a super-privileged perspective, I&amp;rsquo;m fine. But, from a &amp;ldquo;WHAT THE FUCK AM I DOING WITH MY LIFE?&amp;quot;-perspective&amp;hellip; less so. Watch this space for my next &lt;del&gt;flounderings&lt;/del&gt; steps.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Testing out a new deployment system</title>
      <link>https://ilostmypage.com/posts/this-is-a-test/?gtm_referrer=rss</link>
      <pubDate>Tue, 03 May 2022 01:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/this-is-a-test/</guid>
      <description>&lt;p&gt;This is a test, please don&amp;rsquo;t ignore! Or well, you can, but it&amp;rsquo;s only a quick one, all about how I&amp;rsquo;m trying to hack together some static-site publishing from my ipad.&lt;/p&gt;
&lt;p&gt;What my previous static site deployment looked like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;d write the new post into my repo.&lt;/li&gt;
&lt;li&gt;Commit and push it just for safety/backup.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;d manually rsync the build folder up to my vps&lt;/li&gt;
&lt;li&gt;Hey-presto, new site was live.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What&amp;rsquo;s happening here? Well to get this post onto my website the following steps must have happened:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Github Actions workflow has ran, based on a manual trigger or me pushing master.&lt;/li&gt;
&lt;li&gt;The runner has pulled this file (and any other markdown files in the right directory) and place them into the /posts folder in my hugo repo.&lt;/li&gt;
&lt;li&gt;The runner has done the same for any static content, recursing down into sub-folders to keep the right structure.&lt;/li&gt;
&lt;li&gt;The runner performs a &lt;code&gt;hugo build&lt;/code&gt; and then archive&amp;rsquo;s the results.&lt;/li&gt;
&lt;li&gt;The runner triggers an AWS remote shell command on my VPS.&lt;/li&gt;
&lt;li&gt;The VPS uses a token it has to download the bundle from github and then unpacks it to the right nginx path.&lt;/li&gt;
&lt;li&gt;Hey-presto, new post is live.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main goal here was to enable me to &amp;ldquo;deploy&amp;rdquo; a static site using only &amp;lsquo;cloud-native&amp;rsquo; tooling so that I can update it from any device that I have access from. I&amp;rsquo;m in the process of automating and improving how I&amp;rsquo;ve been hosting more traditional (read static &amp;amp; WordPress) websites over the past month or so, hopefully I&amp;rsquo;ll be able to write more posts soon about how I&amp;rsquo;m doing it. Heck I might even share the code/config I have if it&amp;rsquo;ll be useful for others.&lt;/p&gt;
&lt;p&gt;Of course, if you&amp;rsquo;re not reading this, then it didn&amp;rsquo;t happen&amp;hellip; so I must have broken something somehow 🤔 and that tree probably didn&amp;rsquo;t make a sound. But you are, and it did, so woop. Here&amp;rsquo;s a random image to both celebrate and prove that the static image stuff is working too!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ilostmypage.com/img/memes/high-five.jpg&#34; alt=&#34;Two officey people high-fiving&#34; title=&#34;Glorious sunshine innit.&#34;&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Managing your terraform across multiple environments</title>
      <link>https://ilostmypage.com/posts/managing-terraform-per-environment/?gtm_referrer=rss</link>
      <pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/managing-terraform-per-environment/</guid>
      <description>&lt;p&gt;You&amp;rsquo;re managing your cloud infrastructure using Terraform. You&amp;rsquo;ve got your first environment up and running and you&amp;rsquo;re already reaping the benefits of a codified infrastructure. Changes are easy. But, now you need to set up a second environment (staging, prod, whatever) and you&amp;rsquo;re finding that managing this is not straight forward. There&amp;rsquo;s a bunch of arguments to remember every time you switch between environments, and your switching a lot because you want to keep them in sync. Because this is hard you tend to use auto-complete, but then sometimes you forget to change something and accidentally apply prods config to staging. Well, as in many occasions, a Makefile can probably help you there.&lt;/p&gt;
&lt;h2 id=&#34;i-think-im-with-you-but-do-i-really-need-this&#34;&gt;I think I&amp;rsquo;m with you, but do I really need this?&lt;/h2&gt;
&lt;p&gt;Terraform is a per-environment tool. i.e. you benefit from terraform by knowing that you&amp;rsquo;ve applied exactly the same configuration to each of your environments, and that this way you can always keep them in sync. This is benefit numero uno, but it means it&amp;rsquo;s down to you to figure out how to handle the dynamic parts yourself. Terraform helps at least a little by providing a way to pass in variables by environment variables, command line arguments or &lt;code&gt;tfvars&lt;/code&gt; files.&lt;/p&gt;
&lt;h2 id=&#34;ok-so-why-not-just-use-a-tfvars-file-for-each-environment&#34;&gt;Ok, so why not just use a &lt;code&gt;tfvars&lt;/code&gt; file for each environment?&lt;/h2&gt;
&lt;p&gt;Well &lt;em&gt;of course&lt;/em&gt; environment-based &lt;code&gt;tfvars&lt;/code&gt; files are a good idea, but the problem is that not all things can (or should) go in them.&lt;/p&gt;
&lt;p&gt;Some things that can&amp;rsquo;t:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;state-file backend information&lt;/li&gt;
&lt;li&gt;&amp;ldquo;dynamic&amp;rdquo; output from preceding non-terraform code&lt;/li&gt;
&lt;li&gt;&amp;ldquo;standard&amp;rdquo; CI environment variables that need some name-coercing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things that shouldn&amp;rsquo;t: &lt;strong&gt;!1!1!anything secret!1!1!&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s talk through an example of why it might be beneficial to wrap up our terraform commands in a Makefile to ensure our environments are kept both safe and distinct:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;include&lt;/span&gt;  &lt;span class=&#34;err&#34;&gt;../envs/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;stage&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;.env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  terraform init -reconfigure &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -backend-config&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;key=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;{TERRAFORM_STATE_FILE}&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -backend-config&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;bucket=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;{TERRAFORM_STATE_BUCKET_NAME}&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -backend-config&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;region=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;{TERRAFORM_STATE_REGION}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and our env file looks something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TERRAFORM_STATE_FILE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;project-name.dev.tfstate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TERRAFORM_STATE_BUCKET_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;project-name-state
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TERRAFORM_STATE_REGION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;eu-west-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we have an initialisation wrapper. This sets our backend-config based on environment variables stored in an &lt;code&gt;env&lt;/code&gt; file. If we have a different state bucket for our dev, staging &amp;amp; production environments, we can easily switch between each environment without the chance of getting anything wrong. Anything secret has to go into protected variables in our CI pipeline.&lt;/p&gt;
&lt;h2 id=&#34;why-not-just-put-all-of-this-out-into-one-big-state-file&#34;&gt;Why not just put all of this out into one big state file?&lt;/h2&gt;
&lt;p&gt;Well, you can&amp;rsquo;t really, otherwise you&amp;rsquo;re not applying the same Terraform resources to different environments. You &lt;em&gt;could&lt;/em&gt; put multiple state files in the same bucket, which avoids the &lt;code&gt;bucket_name&lt;/code&gt; &amp;amp; &lt;code&gt;region&lt;/code&gt; arguments above, but then you have to figure out how to ensure access to each place. If you are (probably wisely) running your production environments in a different AWS account, then you end up having to give some runners cross-account access. Don&amp;rsquo;t even start me on which way this access should flow&amp;hellip; Nah, just put them in their own buckets in their own environments and save yourself all of that headache. Dev runners access the dev bucket, prod runners access the prod bucket, etc.&lt;/p&gt;
&lt;h2 id=&#34;if-im-wrapping-init-like-this-should-i-do-it-for-other-commands-too&#34;&gt;If I&amp;rsquo;m wrapping init like this, should I do it for other commands too?&lt;/h2&gt;
&lt;p&gt;Up to you, but probably yes. Here&amp;rsquo;s how I&amp;rsquo;d set it up:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;tf_plan_args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-out=.terraform.tfplan -var-file=&amp;#34;$(stage).tfvars&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;ifdef&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;special_flag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nv&#34;&gt;tf_plan_args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-var=&amp;#34;special_flag=$(special_flag)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;plan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clear_plan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	terraform plan &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;tf_plan_args&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;apply&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clear_plan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	terraform apply .terraform.tfplan
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;clear_plan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	rm -f .terraform.tfplan
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This ends up with a few handy features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We clear the plan file after each plan/apply, meaning there&amp;rsquo;s no way to accidentally apply a stale plan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We get much nicer cli syntax like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;make stage=dev init&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;make stage=dev special_flag=73 plan&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;make stage=dev apply&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;a-slight-extension&#34;&gt;A slight extension&lt;/h2&gt;
&lt;p&gt;One pattern I&amp;rsquo;ve come across a few times now is where you need data in your terraform plan that isn&amp;rsquo;t managed by terraform. This could be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some environmental/system data.&lt;/li&gt;
&lt;li&gt;Output from legacy systems.&lt;/li&gt;
&lt;li&gt;Even something that simply can&amp;rsquo;t be terraform-controlled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this kind of scenario most things output as JSON, and &lt;code&gt;jq&lt;/code&gt; is a great tool to parse this output in your &lt;code&gt;Makefile&lt;/code&gt; to pass it into terraform. This is another great reason to codify your terraform commands: you can make sure that this stitching always works the same in all of the places. Here&amp;rsquo;s an example of how I&amp;rsquo;d change the Makefile to handle this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;ifndef&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;required_parameter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;You&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;must&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;specify&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;required&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;parameter&lt;/span&gt;.&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;tf_plan_args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-out=.terraform.tfplan -var-file=&amp;#34;$(stage).tfvars&amp;#34; -var=&amp;#34;required_parameter=$(required_parameter)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;ifdef&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;special_flag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nv&#34;&gt;tf_plan_args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-var=&amp;#34;special_flag=$(special_flag)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;plan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clear&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell ./go-get-extra-vars-as-json.sh &amp;gt; .extra_vars.json&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	terraform plan &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;tf_plan_args&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;  -var-file&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.extra_vars.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;clear&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	rm -f .terraform.tfplan .extra_vars.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Caveat: depending on your CI setup, the &lt;code&gt;extra_vars.json&lt;/code&gt; may simply be input from a previous step, so the file might just come in as an artifact from a previous step and then it&amp;rsquo;s down to any manual runs to provide this data manually. This obviously depends on the use-case, so take this as just one approach out of many.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;There are probably other ways to achieve the above. I&amp;rsquo;ve heard that &lt;a href=&#34;https://terragrunt.gruntwork.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Terragrunt&lt;/a&gt; is a thing, and whilst I haven&amp;rsquo;t dug into it I assume it&amp;rsquo;s going to solve these kinds of problems (I&amp;rsquo;ve avoided it because I dislike dependencies, and favour flexibility). To be honest, &lt;em&gt;how&lt;/em&gt; you decide to solve this issue is totally up to you, this is just one way of doing it. However, there are a few important things in my opinion that your solution should solve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Primarily: make sure that you &lt;strong&gt;do&lt;/strong&gt; solve this issue, and that you solve it well. I mean, you have to, but don&amp;rsquo;t end up picking a poor approach that loses out on the main reason to codify your infrastructure: ensuring it&amp;rsquo;s the same in all the places.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure that however you solve this, your solution lives in version control. This means that the way you interact with your environments evolves alongside your codebase and that all developers on the project run it in the same way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ideally this should be simple to write and simple to run everywhere. I chose &lt;code&gt;Makefiles&lt;/code&gt; because it&amp;rsquo;s a pretty ubiquitous technology, and it&amp;rsquo;s cleaner and clearer than writing pure bash. The next step up would be a scripting language like Python, or even a full tool like &lt;a href=&#34;https://terragrunt.gruntwork.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Terragrunt&lt;/a&gt; - these both have a higher barrier to entry (in dependencies and new-things-to-learn) and in Terragrunt&amp;rsquo;s case less flexibility.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;some-hints--tips&#34;&gt;Some hints &amp;amp; tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use the makefile commands in your CI too, this way they always stay up to date, and you avoid the &amp;ldquo;it works on my machine&amp;rdquo; kind of scenarios.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have new, even one off commands, add them to your makefile and run them through CI. This has a few benefits: it&amp;rsquo;ll run (and maybe break) in your dev environment first, and you have a version-controlled history of what ran when.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Having to repeat arguments like &lt;code&gt;stage=dev&lt;/code&gt; is annoying. I flip-flop between it being useful to remind you of what env you&amp;rsquo;re working on, and it being super tedious. You could make it go away with an &lt;code&gt;.init&lt;/code&gt; tempfile that gets created during the &lt;code&gt;init&lt;/code&gt; command. Just be sure to wipe it whenever you re-init (and be very sure what you&amp;rsquo;ve initialised when you want to before you run things).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;related-posts&#34;&gt;Related posts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ilostmypage.com/posts/minimum-viable-journaling/&#34;&gt;Minimal Viable Journaling&lt;/a&gt; - How to use &lt;code&gt;Makefiles&lt;/code&gt; to manage a simple journal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ilostmypage.com/posts/delivery-driven-developers/&#34;&gt;Delivery Driven Developers&lt;/a&gt; - The reason behind this kind of approach and the priority of delivery.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Minimum Viable Journaling</title>
      <link>https://ilostmypage.com/posts/minimum-viable-journaling/?gtm_referrer=rss</link>
      <pubDate>Tue, 28 Apr 2020 00:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/minimum-viable-journaling/</guid>
      <description>&lt;p&gt;Along with the million other things I&amp;rsquo;ve been trying over the past year of seeking self-improvement, journaling is one of the ones I&amp;rsquo;ve had partial success with (well, more than zero-success at least). Here&amp;rsquo;s some implementation detail on my setup and how I&amp;rsquo;ve kept it as bare-bones as possible, backed-up in the cloud and, most importantly for my tin-foil fetish, secure.&lt;/p&gt;
&lt;h2 id=&#34;the-concept&#34;&gt;The Concept&lt;/h2&gt;
&lt;p&gt;I want something easy to maintain &amp;amp; setup (ideally zero-maintenance) and I don&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; want to have to pay for it for the rest of my life. I want it to be future-proof, I don&amp;rsquo;t want to come back to this in a few years and find nothing supports it&amp;rsquo;s format. Oh and I also want it to be secure as heck. The goal here is to brain dump my day, including all the thoughts I&amp;rsquo;ve had about it. I don&amp;rsquo;t want it accidentally being accessed by some randoms, or even non-randoms, without my express permission. Simple enough right?&lt;/p&gt;
&lt;h2 id=&#34;the-approach&#34;&gt;The Approach&lt;/h2&gt;
&lt;p&gt;So, we want a simplistic file format. Any sort of proprietary format or under-popular open source one is only going to cause me pain in the future. This led me to a nice and obvious solution: Text files! They&amp;rsquo;re infintely interoperable, have been around forever, and will still be supported in a millionty years so it fits all the use-cases. For bonus points let&amp;rsquo;s make them markdown files (it&amp;rsquo;s just giving them &lt;code&gt;md&lt;/code&gt; file extensions after all), that way we can add in links or a bit of formatting if we want to later and it&amp;rsquo;ll be pretty easy to turn it into HTML in the future if we fancy that too.&lt;/p&gt;
&lt;p&gt;Ok, next up storage. Something like google drive or dropbox would work, but I don&amp;rsquo;t want these having to sit next to my other life-admin documents that I put in those kinda places. I also don&amp;rsquo;t want to accidentally delete this stuff, or parts of this stuff, when I&amp;rsquo;m tidying things up. Version control systems are good for making sure that&amp;rsquo;s very hard to do, and they come with free decentralized backing up on my machines if I&amp;rsquo;m into that. Git it is! Also, the interface to wherever I cloudify this stuff is completely interoprable and segmented into it&amp;rsquo;s own repository, so migration and organisation will be a breeze. Heck, I could even move them to something self-hosted if I cared enough (I probably don&amp;rsquo;t).&lt;/p&gt;
&lt;p&gt;Ok so, markdown files, stored in Git. So far so good, but what about security? This is a super-secret private Journal right? Well, the way I see it there are 2 main attack vectors: the files sat on my machine(s) and the files sat up in whatever cloud storage I put them in (I&amp;rsquo;m discounting in-transit because whatever I use will have ssl). My machine I worry less about, but the main issue is these pesky cloud providers. I just don&amp;rsquo;t trust that they keep this info as secure as I need it, which means that I need to figure out a way to encrypt it.&lt;/p&gt;
&lt;p&gt;Well, lucky for me, &lt;a href=&#34;https://www.pgp.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PGP&lt;/a&gt; is a thing :D A few simple commands can get me an encryption key that&amp;rsquo;s going to be pretty unbreakable for many years to come&lt;a href=&#34;#asterisks&#34;&gt;*&lt;/a&gt;. The one potential issue with this is that it&amp;rsquo;s not trivial to setup. With security, the biggest vulnerability is the squishy grey matter inside your head that regularly does stupid things (remember when you used to think shirts with flames on were cool&amp;hellip; ugh idiot). Encrypting things with a PGP key is by no means hard, but we want to reduce the chance of human error as much as possible here. Thankfully, I&amp;rsquo;m used to doing this kind of thing in my day job; automating all the repetitive stuff.  Should be a doozy.&lt;/p&gt;
&lt;h2 id=&#34;the-implementation&#34;&gt;The Implementation&lt;/h2&gt;
&lt;p&gt;So, we want some sort of scripting language, bash&amp;rsquo;ll do. But we want the interface with it to be as simple and clear as we can, so let&amp;rsquo;s not write it in raw bash, let&amp;rsquo;s use a &lt;code&gt;Makefile&lt;/code&gt;, they&amp;rsquo;re universal enough. Here&amp;rsquo;s how we get a simple &amp;ldquo;create today&amp;rsquo;s markdown entry&amp;rdquo; to keep things nice and organized, and we open&lt;a href=&#34;#asterisks&#34;&gt;**&lt;/a&gt; it up using whatever our system&amp;rsquo;s chosen markdown editor is (in my case I use &lt;a href=&#34;https://marktext.app/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Mark Text&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Set the entry to todays date if not specified.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ifndef&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;entry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;date +%F&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	open &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next up we want to be make sure this is easily encrypted. I haven&amp;rsquo;t gone so far here as to integrate with my editor to auto-encrypt it once it closes, but this feels like an integration too far. I&amp;rsquo;d be writing a lot of scripting just to work with an editor that might be dead in a few years. Instead we simply write ourselves a save method that generates an encrypted file and wipes any raw ones&lt;a href=&#34;#asterisks&#34;&gt;***&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	gpg --encrypt --recipient &lt;span class=&#34;nv&#34;&gt;$GPG_EMAIL&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;MAKE&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; clean
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;clean&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	rm *.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And last, but not least, we need to back this up on the interwebs. This is easy right, just create a new repository on your git-host of choice and then run the below in your journal folder.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add Makefile
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;Can&amp;#39;t forget to push this awesome Makefile I&amp;#39;m using.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add origin &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ADD YOUR URL HERE&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git push -u origin master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we just need to update our Makefile to push this up when we&amp;rsquo;re saving:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	gpg --encrypt --recipient &lt;span class=&#34;nv&#34;&gt;$GPG_EMAIL&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	git add &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;Saving &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.md.gpg to repo.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	git push
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;MAKE&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; clean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;the-outcome&#34;&gt;The Outcome&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve popped the file that I use for this in it&amp;rsquo;s entirety below, but I almost didn&amp;rsquo;t. I guess, the whole point of this rather simple post is that it&amp;rsquo;s so bloody simple. This is how I&amp;rsquo;m jounaling right now. It took me very little time to come up with and so far, zero time to maintain. It&amp;rsquo;s secure, robust, pretty (because of my editor) and it fits into my workflow easily.&lt;/p&gt;
&lt;p&gt;Often when we&amp;rsquo;re faced with a need these days we take the &amp;ldquo;don&amp;rsquo;t re-invent the wheel&amp;rdquo; mantra and hunt for the newest saas product that fills our need. But often, they&amp;rsquo;re selling you a swiss army knife, when all you need is a spork. This little script was a nice reminder that sometimes if you just use your brain a little, maybe you can build what you really need pretty easily. One less subscription fee to pay each month isn&amp;rsquo;t a bad outcome either.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Set the entry to todays date if not specified.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ifndef&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;entry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;date +%F&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.md.gpg&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	    &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; gpg &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md.gpg&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	    touch &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	open &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	gpg --encrypt --recipient &lt;span class=&#34;nv&#34;&gt;$GPG_EMAIL&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	git add &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.md.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;Saving &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;entry&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.md.gpg to repo.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	git push
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;MAKE&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; clean
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;clean&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	rm *.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id=&#34;asterisks&#34;&gt;Asterisks&lt;/h4&gt;
&lt;p&gt;* But not forever. Whilst you could publish your encrypted data, and no-one could really access it now, once it&amp;rsquo;s out there it&amp;rsquo;s out there for ever. Like EVER ever. Which means eventually, someone will be reading that info, and you&amp;rsquo;ll just be gambling that you&amp;rsquo;ve been dead long enough to not care. As such, I&amp;rsquo;d advise that you still put some practical preventions in place like sensible password protections on the cloud services you use to store this etc.&lt;/p&gt;
&lt;p&gt;** The &lt;code&gt;open&lt;/code&gt; command is mac specific, but swapping it for something that&amp;rsquo;ll run on your OS should be trivial.&lt;/p&gt;
&lt;p&gt;*** I&amp;rsquo;m too lazy to write a post on how to use gpg, &lt;a href=&#34;https://www.linuxbabe.com/security/a-practical-guide-to-gpg-part-1-generate-your-keypair&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&amp;rsquo;s&lt;/a&gt; one somebody else put way more effort into.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The easy way to view web certificate info (probably)</title>
      <link>https://ilostmypage.com/posts/the-easy-way-to-view-cert-info-probably/?gtm_referrer=rss</link>
      <pubDate>Tue, 24 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/the-easy-way-to-view-cert-info-probably/</guid>
      <description>&lt;p&gt;This is a quick little post about how I realised that there&amp;rsquo;s a nice and easy way to view detailed information about a web certificate available to most sensible people: &lt;a href=&#34;https://www.mozilla.org/en-GB/firefox/new/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Firefox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TL;DR: &lt;a href=&#34;#code-sample&#34;&gt;code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a built-in feature of firefox: click on the little padlock icon in the address bar when visiting any website using TLS, select the view cert info and a new tab will open displaying info about the cert. It&amp;rsquo;s pretty nice, they&amp;rsquo;ve moved away from the old menu-window interface and turned it into an actual web-rendered page. This has a few benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It looks nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can easily read all the info that can be contained in a cert, instead of it all being cramped in a little system window.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There&amp;rsquo;s, technically, an API interface to this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the last one is an odd one, but it&amp;rsquo;s actually the reason that I wanted to write this post. You see, I&amp;rsquo;ve been working a lot with the provisioning of keys &amp;amp; certs for infrastructure as of late, and it has lead to me needing to check the contents of certificates a fair bit to make sure they have the right information. This is easy once you have your infrastructure set up and everything works and you can connect to the bloody thing to check the cert by simply visiting the url, but that leaves you a bit out of luck when you&amp;rsquo;re not quite there yet. Or, as I found myself, when you&amp;rsquo;re debugging and testing scripting that you&amp;rsquo;re writing to try and automate this cert generation process. The only option available to me here was to either use &lt;code&gt;openssl&lt;/code&gt; to parse the cert and decipher the output from the console, or go hunting for a new 3rd-party tool to render all the details in a more human-readable manner.&lt;/p&gt;
&lt;p&gt;This is what lead me to my realisation: when firefox is displaying the cert, it&amp;rsquo;s doing so by simply parsing the base64 encoded certificate from the url of the page. This means that we can use firefox&amp;rsquo;s nice web-rendery view (yaaay, it&amp;rsquo;s already installed) to view certs stored locally. As such I wrote up the smallest Python script i could to read these files in a much nicer way*. I love automating the little things like this, it&amp;rsquo;s the best way to keep up productivity.&lt;/p&gt;
&lt;h3 id=&#34;code-sample&#34;&gt;Code Sample&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;urllib.parse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Need to pass file paths in as args.&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arg&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;lines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;---&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;param&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;urllib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;quote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;safe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;system&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/Applications/Firefox.app/Contents/MacOS/firefox about:certificate?cert=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;*caveat: Due to the file path used, this will only work on MacOS . That said, it would be trivial to switch the paths out to your system&amp;rsquo;s one, the executable should take the same arg.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hugo On Then, I&#39;ll find a better Static Site Generator</title>
      <link>https://ilostmypage.com/posts/hugo-on-then/?gtm_referrer=rss</link>
      <pubDate>Thu, 10 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/hugo-on-then/</guid>
      <description>&lt;p&gt;I recently changed this site generation from using &lt;a href=&#34;https://hexo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hexo&lt;/a&gt; (a JavaScript static site generator), to &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt; (a &lt;a href=&#34;https://golang.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Golang&lt;/a&gt;-based one) and it made me happy for quite a few reasons. Don&amp;rsquo;t get me wrong, Hugo ain&amp;rsquo;t perfect, but having a little less JavaScript in my life has made me a happy chappy.&lt;/p&gt;
&lt;p&gt;Well mostly, I&amp;rsquo;m still using it for my asset pipelines for now, so I haven&amp;rsquo;t yet gotten completely rid of JavaScript compilation, but at least it&amp;rsquo;s not a part of my content-generation flow any more. Anyways, here&amp;rsquo;s a roundup of the differences:&lt;/p&gt;
&lt;h2 id=&#34;the-good&#34;&gt;The Good:&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Simplicity:&lt;/strong&gt; Hexo, and specifically having a per-project installed JavaScript generator with LOTS of dependencies, made maintenance more messy than I wanted for a simple blog or content-based site. When someone decides to use a static site generator, it&amp;rsquo;s usually not because they can&amp;rsquo;t host something more complex (they&amp;rsquo;re all command-line tools after all, land of the developer), but instead because they want the easy life that a simpler setup provides. Hexo&amp;rsquo;s many dependencies that needed installing and updating, not to mention its mixed backward compatibility changes over time weren&amp;rsquo;t nice. I&amp;rsquo;d almost gotten to the point that the effort put me off wanting to write and publish at all, and that&amp;rsquo;s not a good thing for someone trying to start a blog.&lt;/p&gt;
&lt;p&gt;In contrast, Hugo is a simple, batteries included approach. The generation is a trivial command and everything just works. The standard templating is nice, easy to use and pretty powerful, without me needing to figure out plugins and extensions to make it nicer. Overall, it just works and I now don&amp;rsquo;t have to think about the technical aspects (JavaScript or Go) underlying the site to be able to write blog posts or even really edit themes.&lt;/p&gt;
&lt;p&gt;And, importantly, any updates are a simple &lt;code&gt;brew update&lt;/code&gt; away. A little better than JavaScript&amp;rsquo;s immature package management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt; They better. They supa dupa better. They&amp;rsquo;re not perfect as they&amp;rsquo;re a little hard to search through, but they are definitely a helluva lot more comprehensive than Hexo&amp;rsquo;s. And on top of that the community seems a lot more active as, so far, finding solutions to my theming problems (which admittedly were mostly &lt;a href=&#34;https://en.wikipedia.org/wiki/User_error&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEBKAC&lt;/a&gt;) was pretty straightforward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All of the batteries:&lt;/strong&gt; This is a clear improvement over Hexo. Even simple things like making a decent &lt;code&gt;sitemap.xml&lt;/code&gt; with my site structure work in hexo was annoying. Hugo has everything just working great out of the box. It handles all the little things I didn&amp;rsquo;t even think about, like tagging and rss feeds really well with, so far, no rough edges. Also, as it&amp;rsquo;s baked on top of Golang&amp;rsquo;s templating language (which seems pretty decent so far), it handles escaping/different types of outputting really nicely.&lt;/p&gt;
&lt;h2 id=&#34;the-meh&#34;&gt;The meh:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No &amp;lsquo;st&amp;rsquo;, &amp;rsquo;nd&amp;rsquo;, &amp;lsquo;rd&amp;rsquo; or &amp;rsquo;th&amp;rsquo; for date outputting. Why? This is an annoying little missing feature that I hope they add sooner than later (I&amp;rsquo;m trying to avoid figuring out an extension for this, but maybe it would be fun Go practice). There&amp;rsquo;s a &lt;a href=&#34;https://discourse.gohugo.io/t/solved-date-format-not-adding-ordinals/10944/9&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;workaround&lt;/a&gt; that I only just found when writing this, but it&amp;rsquo;s less than perfect and I need something to put here 😝&lt;/li&gt;
&lt;li&gt;Asset pipelines/image generation seem a little lackluster and unclear. I would love some sensible defaults to help me think a lot less about images I&amp;rsquo;m using in my blog (especially headers etc). A simple more/less quality option would be grand.&lt;/li&gt;
&lt;li&gt;&amp;hellip; yeah that&amp;rsquo;s all I got so far. It&amp;rsquo;s pretty rad&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-not-technically-relevant-but-changing-made-me-rethink-my-approach-thing&#34;&gt;The not-technically-relevant-but-changing-made-me-rethink-my-approach thing:&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Deployment:&lt;/strong&gt; As titled, this isn&amp;rsquo;t really relevant to which tool you&amp;rsquo;re using to generate your static site. But, the act of changing how I generated mine (along with probably some recent workplace devops adventures) lead me to rethink how I was deploying. You see, previously I was lazy. I would deploy the site by pulling the code from Git onto an EC2 instance. This was great in theory, as it meant that I could just checkout the source someone and then run a make script to generate the public output. But it was annoying, because everytime I wanted to publish content, I had to push it, then shell into my machine and pull/regenerate. As time dragged on and server migrations occurred, this became pretty frustrating.&lt;/p&gt;
&lt;p&gt;My solution? Rsync &amp;amp; other ancient unix commands! I was browsing Hugo&amp;rsquo;s docs and came across &lt;a href=&#34;https://gohugo.io/hosting-and-deployment/deployment-with-rsync/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;this&lt;/a&gt; pretty simplistic approach to getting my posts &amp;amp; theme changes deployed. I&amp;rsquo;ve even started making nginx changes by pushing them from my machine over ssh too. This probably isn&amp;rsquo;t the most repeatable manner when I change servers, and I haven&amp;rsquo;t yet had to figure out setting the server config up from scratch, but so far I think it&amp;rsquo;s a winner. Even if the setup is a little turns out to be a little bit more effort (though I doubt it in all honesty), I deploy changes orders of magnitude more frequently than I migrate servers/setup sites. The trade off is most definitely worth it as deploying is so easy now 😆&lt;/p&gt;
&lt;h2 id=&#34;things-i-want-to-try-out-next&#34;&gt;Things I want to try out next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hugo Pipes: I want to figure out a way to get all my assets generated in a nice hugo-y fashion. Sass -&amp;gt; CSS and JS minification would be nice, but I think the main time-win here would be the image compression. Going from full-fidelity image to web-perfect at the run of a build would be perfect.&lt;/li&gt;
&lt;li&gt;Comments: I don&amp;rsquo;t know if this is a terrible idea, or just a redundant one (I have like zero traffic so not sure if anyone will ever use them), but I do think it would be a fun project to implement. I&amp;rsquo;m not sure if this will be something I build myself, or a service/library I use/host, but we&amp;rsquo;ll see.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;More updates are definitely to come as I use the setup more, but I don&amp;rsquo;t think I&amp;rsquo;ll be going back any time soon (or looking for another generator for that matter). This (along with probably other more real-life-related things) has made writing blog posts seem fun and exciting again so, hopefully I can rave about some fun expansions to this site that I&amp;rsquo;ve made in upcoming posts 😁&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Delivery Driven Developers</title>
      <link>https://ilostmypage.com/posts/delivery-driven-developers/?gtm_referrer=rss</link>
      <pubDate>Sun, 22 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/delivery-driven-developers/</guid>
      <description>&lt;p&gt;&lt;em&gt;* Don&amp;rsquo;t worry, this isn&amp;rsquo;t another job title you&amp;rsquo;re going to have to add to your CV this year&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One thing that I&amp;rsquo;ve come to notice of late is that I&amp;rsquo;m a little different to a lot of developers that I meet. Many developers, seem to have a penchant for wanting to write code for the sake of writing code. To optimise, to agonise over, and ultimately to perfect the very specific piece of code that they&amp;rsquo;re working on, regardless of the bigger picture of the project. An old colleague of mine once described the in-depth discussion about low-value optimisations as &amp;ldquo;intellectual masturbation&amp;rdquo;, and I think the phrase suits this kind of thing well. I&amp;rsquo;m regularly surprised by the eagerness of developers to dive into these rabbit holes, while being oblivious (or maybe just uncaring) of how little value they hold. I just don&amp;rsquo;t get it.&lt;/p&gt;
&lt;p&gt;Admittedly, I&amp;rsquo;m not entirely devoid of a love of the &amp;ldquo;craft&amp;rdquo; of writing code. I do feel the joy of a really well optimised algorithm (jesus that sounds nerdy, even to me). I do find myself grinning at the end of working on a story, when I&amp;rsquo;ve refactored a bunch of the smells out of the code I&amp;rsquo;ve just written and halved its size and complexity. But, what really drives me is delivering changes into environments. To me, there&amp;rsquo;s no point in all the hard work and effort to make it &amp;ldquo;more perfect&amp;rdquo;, if it isn&amp;rsquo;t getting shipped. I could forgo all of the really stereotypical ego-phalating parts of developer life (time-complexity anyone?) if I got to slowly but steadily make the codebase better whilst delivering new features and functionality to it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not even that fussed about what the functionality is in all honesty. Most of the time it&amp;rsquo;s more the feeling of accomplishment that comes from getting work done and shipped. What I can&amp;rsquo;t stand, however, is writing code for the sake of writing code. It&amp;rsquo;s probably why I struggle so much finding a side project that I actually want to start. I need to have a &lt;strong&gt;reason&lt;/strong&gt; to develop software. Software, in and of itself, isn&amp;rsquo;t reason enough.&lt;/p&gt;
&lt;p&gt;I like to think that it&amp;rsquo;s a truly altruistic trait. The idea being that I want to do good things. To provide those good things to others and get all the &amp;ldquo;helping other people&amp;rdquo; good feels that you get from that. There&amp;rsquo;s definitely a bit of that maybe (along with the selfish power-trip side of things), but realistically there&amp;rsquo;s a large part that&amp;rsquo;s just plain boredom. You see, the thing I&amp;rsquo;ve come to realise is that maybe it&amp;rsquo;s not just that I&amp;rsquo;m a business-orientated developer. One who cares about the overall functionality/completeness of the product I&amp;rsquo;m building and is happy to sacrifice the minutiae of the craft for the greater good. Maybe it&amp;rsquo;s that I just get bored easily. After a while of working on the same story, i just want to get it shipped and move on to the next, and maybe I just hit sooner than others.&lt;/p&gt;
&lt;p&gt;Another thought that springs to mind, as it often seems to these days, is that this reflects the now age old &amp;ldquo;agile vs waterfall&amp;rdquo; conundrum. In this instance, it&amp;rsquo;s &amp;ldquo;make the code perfect&amp;rdquo; vs &amp;ldquo;get it shipped and make it better later&amp;rdquo;. The common refrain I hear is &amp;ldquo;oooh but we&amp;rsquo;ll never &lt;strong&gt;DO&lt;/strong&gt; it later and it&amp;rsquo;ll always be &lt;strong&gt;CRAPPY&lt;/strong&gt;&amp;rdquo;. Well, to that I say &amp;ldquo;GOOD!&amp;rdquo;. If we don&amp;rsquo;t get back to making it better, that means that it wasn&amp;rsquo;t worth the effort. Or that, more importantly, there are way more important things that &lt;strong&gt;are&lt;/strong&gt; worth the effort. In this case, I&amp;rsquo;m bloody glad we didn&amp;rsquo;t waste our time to make your algo use that little bit less memory when it&amp;rsquo;s parsing. Instead we shipped a new feature, wahoo!&lt;/p&gt;
&lt;p&gt;On balance, I think it&amp;rsquo;s important to remember to pinch a little bit from each camp. Constant rushing without good code leads to getting slowed down later with tech debt. Constant perfectionism leads to no traction at all and thus, no value. For me, I&amp;rsquo;ll always be a bit more of a delivery focussed developer and that&amp;rsquo;s alright with me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Should I go static? An argument for switching to a static site generator.</title>
      <link>https://ilostmypage.com/posts/should-i-go-static/?gtm_referrer=rss</link>
      <pubDate>Sun, 17 Mar 2019 17:20:17 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/should-i-go-static/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m planning to write a little guide on how you can host a static site effectively, but it got me thinking that first
I might wanna write about WHY you&amp;rsquo;d want to use a static site in the first place. Here goes!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;so-why-bother-with-static-isnt-wordpress-amazeballs&#34;&gt;So, why bother with static? Isn&amp;rsquo;t WordPress amazeballs?&lt;/h2&gt;
&lt;p&gt;SURE it is, half the internet runs on it, but that doesn&amp;rsquo;t mean it&amp;rsquo;s the best option for a lot of blogging use-cases. A
few reasons I think that WordPress is usually overkill for blogging:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It requires a database. This means you need to start caring about database backups
(you don&amp;rsquo;t wanna lose all your content one day do you?), which means either paying for automated tools to do this, or
figuring it out yourself. And sure, there are fully managed WordPress services these days, but this leads to both
more expense, lock-in and less flexibility.&lt;/li&gt;
&lt;li&gt;It requires more computing power (both RAM &amp;amp; CPU). Whilst most micro virtual private servers (VPSs) can handle
WordPress to some extent, it&amp;rsquo;s unlikely to be super-performant on the smallest servers.&lt;/li&gt;
&lt;li&gt;Which leads into scaling: Making your site able to handle a large number of page-views is going to be a LOT
more expensive with a dynamic solution like WordPress than a static one. Realistically you&amp;rsquo;re going to start
thinking about how you can cache things which also ends up leading to a more complex setup.&lt;/li&gt;
&lt;li&gt;Security: a simple Nginx install that only serves flat HTML is orders of magnitude more secure than a dynamic
program that does lots of complicated stuff with user input (WordPress has historically had issues in this areas, but
this applies to any dynamic application to be honest). Heck, you could even put the files on something dumb like S3
and host it from there. This way the security of your site is essentially as secure as your hosting platform (and
things like AWS are pretty good at security these days).&lt;/li&gt;
&lt;li&gt;Maintenance: If you&amp;rsquo;re running on a VPS, you&amp;rsquo;ll still need to think about OS upgrades, but gone are the
language/library upgrade issues (like upgrading to the new version of PHP that breaks your theme). Much simpler to
keep things technically healthy.&lt;/li&gt;
&lt;li&gt;Site speed: both in the time it takes to get all your content to your users, as well as the time it takes their
browser to churn it into what they see. Static sites will respond with their content way faster than dynamic ones,
and the normal plugin-generated WordPress solution is usually WAY more bloated than a simpler purpose-crafted
approach &lt;a href=&#34;#caveats&#34;&gt;*&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;but-i-dont-care-about-any-of-that-stuff-and-wordpress-seems-easier&#34;&gt;But I don&amp;rsquo;t care about any of that stuff, and WordPress seems easier.&lt;/h2&gt;
&lt;p&gt;So, WordPress is definitely easier to get setup. But as I just explained, it&amp;rsquo;s definitely not easier to operate.
Also, is it better for
your readers? They&amp;rsquo;re likely far more interested in a pleasant and fast reading experience than waiting for your
slow-as-hell blog to load. If you&amp;rsquo;re interested in having happy readers who want to come back, then you really want
to care about the experience they&amp;rsquo;re having on your blog.&lt;/p&gt;
&lt;p&gt;This is one reason I think static sites are better for readers. But I also think they&amp;rsquo;re better for writers.&lt;/p&gt;
&lt;p&gt;I mean what is blogging all about? As I see it, it&amp;rsquo;s writing content (probably quite a lot of it relatively often) for
easy consumption by a large number of people.&lt;/p&gt;
&lt;p&gt;Writing your words in a WYSIWYG editor in your web-browser is easy to get started with, but it often becomes
frustrating in no time at all, especially if you&amp;rsquo;re doing a lot of it. Think about some of the things that
anyone who has written web-content via their browser has had to suffer through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because browsers now use a millionty gigabytes of RAM, it randomly crashes out when swithing between tabs, losing
all the words you wrote since you last saved.&lt;/li&gt;
&lt;li&gt;The weird characters that you just copy/pasted in from word (where you probably do the real writing because you
don&amp;rsquo;t trust chrome) look super weird once you&amp;rsquo;ve published it, but you can&amp;rsquo;t figure out how to make them normal in
the WYSIWYG.&lt;/li&gt;
&lt;li&gt;That link that you&amp;rsquo;re trying to add ended up being an underlined space character but it was fine before you
published it and now you don&amp;rsquo;t know why.&lt;/li&gt;
&lt;li&gt;You have time to kill on the commute and you&amp;rsquo;re trying to write a post on the trian. And it looks like it&amp;rsquo;s worked,
but your connection just dropped when you hit publish and, once more, you end up having to re-write half of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are some of the problems that markdown-based static-sites solve. You can write it with a phone app, an app on
your laptop
or just with a plain text editor on your machine. It&amp;rsquo;s simple, it&amp;rsquo;s clear, it&amp;rsquo;s offline. And, as the normal approach
is to stick your static-site content in a version-control system like Git, then it&amp;rsquo;s also rock-solidly backed up.
You&amp;rsquo;re not going to lose it to some weird hosting error that happened one sunday night because the provider you
chose for cheapness (because performance issues remember) decided losing your database wasn&amp;rsquo;t a big deal when they
updated something.&lt;/p&gt;
&lt;p&gt;After moving to a
MarkDown-based writing setup a while
back, I find it a million times more
writer-friendly than CMS WYSIWYGs. And the upside of this is that a good writing experience is likely to lead to you
writing more. Which means more blog
content. Can&amp;rsquo;t be bad right?&lt;/p&gt;
&lt;h2 id=&#34;ok-so-im-keen-i-think-a-static-site-makes-sense-but-why-do-i-need-a-static-site-generator&#34;&gt;Ok, so I&amp;rsquo;m keen, I think a static site makes sense but why do I need a static-site generator?&lt;/h2&gt;
&lt;p&gt;Static sites CAN be as simple as some html/javascript/css that you modify manually and stick in some hosting
somewhere. I mean we did it that way in the 90&amp;rsquo;s and nothing went wrong right? And if your site is something
super-simple like a portfolio with 1 or 2 pages then this is very likely the right way to go.&lt;/p&gt;
&lt;p&gt;However, if you&amp;rsquo;re aiming for something like a blog with quite a bit of content, then it&amp;rsquo;s going to start getting
very tedious very quickly. You need to edit all your content in HTML for a start. This&amp;rsquo;ll make it hard to migrate in
the future as well as being far more laborious than normal text or markdown. You&amp;rsquo;re also going to need to think of
something like server-side includes to be
able to reuse bits of HTML like headers, footers, sidebars etc. And every time you add a new post you need to remember
all the places it needs to go: index page, any sort of blog-roll, category pages, sitemaps, and the list goes on.&lt;/p&gt;
&lt;p&gt;When you think about it, the ball-ache involved is going to get you quickly looking into how you can automate all
these annoyances. This automation is exactly what static-site generators are for. Problem solved :D&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;a-namecaveatsacaveats&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;Caveats&lt;/h4&gt;
&lt;p&gt;* This doesn&amp;rsquo;t mean that ALL static sites are better than ALL WordPress sites, or even that a WordPress site can&amp;rsquo;t
be configured to be almost as performant as a static-site alternative. I&amp;rsquo;m just pointing out the average output of
both these two tools, and it&amp;rsquo;s generally a LOT easier to get instant performance out of a static site than it is a
WordPress one.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The &#34;Don&#39;t be a Dick&#34; code</title>
      <link>https://ilostmypage.com/posts/the-dont-be-a-dick-code/?gtm_referrer=rss</link>
      <pubDate>Tue, 06 Nov 2018 21:17:29 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/the-dont-be-a-dick-code/</guid>
      <description>&lt;p&gt;After reading the recent &lt;a href=&#34;https://www.theregister.co.uk/2018/10/22/sqlite_code_of_conduct/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;reporting&lt;/a&gt; on the &lt;a href=&#34;https://www.sqlite.org/codeofethics.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SQLite code of conduct&lt;/a&gt; I thought it might be fun to take a punt at a code of conduct based around the &amp;ldquo;Don&amp;rsquo;t be a Dick&amp;rdquo; philosophy. Should be fun!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: I&amp;rsquo;m just doing this for fun. No &lt;a href=&#34;https://www.reddit.com/r/totallynotrobots/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;real human&lt;/a&gt; should consider this a sensible contribution to the CoC-making world. It&amp;rsquo;s just a nice thought-experiment.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;Sometimes people take things too seriously. Codes of conduct are just one potential example of where a group or business can &amp;ldquo;over formalise&amp;rdquo; their culture. Sometimes it might be really important to have a solid CoC, but sometimes something flexible and more ad-hoc might work way better. Do what works for you. Similar to the &lt;a href=&#34;http://agilemanifesto.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Agile Manifesto&lt;/a&gt;, a working but undocumented process is better than an out-of-sync documented one.&lt;/p&gt;
&lt;p&gt;One suggestion if you want to keep it MVP: trying something informal like this first to see if it fixes whatever problem has caused you to think of giving it a go in the first place. And if it doesn&amp;rsquo;t keep formalising it until it does.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;First of all. The code should have one, and only one, rule.&lt;/p&gt;
&lt;h2 id=&#34;dont-be-a-dick&#34;&gt;Don&amp;rsquo;t be a Dick*&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s the golden rule, and all discussion and arbitration of incidents should always be derived from it. Behaviour is considered to be contradicting the code of conduct if (and only if) &amp;ldquo;the group&amp;rdquo; considers it to be &amp;ldquo;dickish&amp;rdquo;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;strong&gt;Documented examples&lt;/strong&gt;: Whilst these shouldn&amp;rsquo;t just mirror different types of rules (because then you&amp;rsquo;re just doing a normal CoC), they should be clear and real-world examples of some things that are considered dickish/non-dickish behaviour. The key here is to have some clear lines drawn in examples that people can then extrapolate from.&lt;/p&gt;
&lt;p&gt;Some (admittedly silly) examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flagging issues &amp;amp; problems with peoples code is totally non-dickish behaviour. It&amp;rsquo;s the best way to learn from mistakes, just be sure to do it in a non-dickish way.&lt;/li&gt;
&lt;li&gt;Deploying to production and then clocking off for the day is 100% dickish behaviour. Don&amp;rsquo;t leave your potential mess for your teammates to pick up for you.&lt;/li&gt;
&lt;li&gt;If after-work drinks are occurring, all teammates have an open invite. You don&amp;rsquo;t need to go and specifically invite everyone, it&amp;rsquo;s a given, but it is dickish to make them feel unwelcome to join in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Regular retrospectives&lt;/strong&gt;: No sensible process survives without retrospectives. Groups change, circumstances change &amp;amp; environments change. This means that what your group considers to be ok and not ok will also change and evolve over time (especially if the group size grows). Pick a frequency that&amp;rsquo;s right for the group and see how it goes. If you need to do it more or less then change the frequency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t be a dick about people being a dick&lt;/strong&gt;: Despite all the steps in the process, it&amp;rsquo;s inevitable that someone will break the rule. The important thing is (just like any fuck-up) to not blame the person, blame the process. Unless the person is truly a dick (in which case kick them out of the group sharpish), the likelihood is that you didn&amp;rsquo;t retrospect/document well enough or often enough, meaning that some or all of your group are getting their dick-o-meters out of sync.&lt;/p&gt;
&lt;p&gt;Make sure to discuss it initially. Run a postmortem to work out how and why you got out of sync, and get a consensus from the group on any details needed to prevent the dickishness from reoccurring. Treat it as a learning opportunity, then move on and don&amp;rsquo;t dwell on it. Any mocking of the dick-ee should be light-hearted and last no longer than a week.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have a laugh about it&lt;/strong&gt;: The main benefit of being so foul-mouthed with the process is that it&amp;rsquo;ll encourage discourse in your group and bring peoples&amp;rsquo; guard down so that they&amp;rsquo;re more likely to discuss it openly. Proper discussion between peers about what could be really difficult issues is only ever a good thing. As such, if your group aren&amp;rsquo;t smiling and coming up with some silly examples of dickheadery then you&amp;rsquo;re probably doing it wrong.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;strong&gt;Large groups will never agree&lt;/strong&gt;, which means that you&amp;rsquo;ll never come to a consensus with any practical level of efficiency (just look at every political system ever :P). It&amp;rsquo;s likely that this will pan out at &amp;ldquo;tribe&amp;rdquo;-limits, so, depending on how homogenous the characters in your group are you&amp;rsquo;re looking at anywhere from 80-120 members max.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What the group considers to be dickish WILL change&lt;/strong&gt;. Even &lt;em&gt;if&lt;/em&gt; a group agrees now, all groups change over time (even if the members stay the same their environment definitely doesn&amp;rsquo;t). The &amp;ldquo;consensus&amp;rdquo; will need updating fairly regularly, and my guess is that frequency will increase exponentially with group size.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laws and the real world&lt;/strong&gt;: I really do think that this kind of code of conduct can be a good way for smaller groups to get the benefits of a CoC, without having to write a bunch of overly-verbose semi-legal waffle that&amp;rsquo;ll often get ignored. I also suspect that people like lawyers, employment tribunals, media organisations, funding groups and potential business partners are all very likely to disagree. Standard reminder that this is not advice, &lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/IANAL&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;I am not a lawyer&lt;/a&gt;&lt;/strong&gt; &amp;amp; these are just my thoughts on a fun thing to try.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;hr&gt;
&lt;p&gt;* I&amp;rsquo;ve chosen &amp;ldquo;dick&amp;rdquo; because I think it&amp;rsquo;s funny. You can replace it with any mildly offensive word that you want. It just has to be mildly offensive. Because it&amp;rsquo;s funny.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Reboot all the Things</title>
      <link>https://ilostmypage.com/posts/reboot-all-the-things/?gtm_referrer=rss</link>
      <pubDate>Mon, 29 Oct 2018 21:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/reboot-all-the-things/</guid>
      <description>&lt;p&gt;Nothing is new, everything is rebooted, cloned, redone, reimagined and generally rehashed a million billion times
until we stop noticing that it&amp;rsquo;s more of the same twaddle. Unfortunately, I quite like this domain so I figure that
I&amp;rsquo;ll just stick with it now that I&amp;rsquo;m giving blogging another go :D&lt;/p&gt;
&lt;p&gt;After my last jaunt traveling I kind of lost the drive to write any words. As an update, I got back from my euro-jaunt towards the end of 2017
and ended up re-settling in the UK again. I&amp;rsquo;ve been back here for a little over a year now and by Jove do I have itchy feet. As such, I&amp;rsquo;m off again!
In a few weeks, my wife and I fly to Singapore. I&amp;rsquo;ll be starting a new job as a Senior Dev by the end of November and hopefully settling in to be a long-term resident.&lt;/p&gt;
&lt;p&gt;In all honesty&amp;hellip; I&amp;rsquo;m bloody terrified.&lt;/p&gt;
&lt;p&gt;One thing that I did gain from the past year or so is that (I think) I know myself a bit better than I used to.
I&amp;rsquo;ve learned is that I&amp;rsquo;m definitely not a natural traveler. I&amp;rsquo;m not an explorer. James T. Kirk would be appalled at my adventure-introversion.
Picard&amp;hellip; well I&amp;rsquo;m sure we can guess &lt;a href=&#34;https://i.imgur.com/iWKad22.jpg&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;his thoughts&lt;/a&gt; on the matter.&lt;/p&gt;
&lt;p&gt;But I think I&amp;rsquo;ve come to accept this about myself. It&amp;rsquo;s maybe ok that I&amp;rsquo;m not like all the drop-shipping, full-moon-partying nomads on Reddit,
that can teach you the best way to travel if only you&amp;rsquo;ll like and subscribe using the links below.
As long as my slightly-less-galavanty version of globetrotting makes me happy, then gosh fuck it that&amp;rsquo;s what I&amp;rsquo;ll bloody well do.&lt;/p&gt;
&lt;p&gt;Anywho, this was rather a roundabout way of declaring this blog re-open. The theme won&amp;rsquo;t change: nerdiness, travel &amp;amp; some code, but I might focus a little more on
Singapore and expatting for a little while.&lt;/p&gt;
&lt;p&gt;That or &amp;ldquo;what to do when you get fired on your first day at a new job and are about to get thrown out of the country&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Wish me luck!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Growth the fuck up</title>
      <link>https://ilostmypage.com/posts/growth-the-fuck-up/?gtm_referrer=rss</link>
      <pubDate>Sat, 05 Aug 2017 18:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/growth-the-fuck-up/</guid>
      <description>&lt;p&gt;I recently read a &lt;a href=&#34;https://amzn.to/2ue7MhJ&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;“self-help” book&lt;/a&gt; entitled “Mindset: How You Can Fulfil Your Potential” - and trust me, this isn&amp;rsquo;t the kind of wanky bollocks that I&amp;rsquo;m normally keen on. If it lacks mages, spaceships or nerd humour I’m usually not interested but, on this instance a few factors came into play that made me give it a go (and, spoiler alert, it’s pretty damn good, so I’m glad that I did!).&lt;/p&gt;
&lt;p&gt;The first motivator (and probably the biggest) was that it was given to me by Hotjar&amp;rsquo;s CEO at their recent Marbella company retreat. David was keen for us all to give it a read and I rate him as a pretty clever chap so I figured I’d give it a go. This got me through the first chapter. This first chapter isn’t great. It reads a lot like “How to win friends and influence people”, a self-aggrandisement of why you should read the rest of the book, ramming down your throat the authors credentials (ok, it’s nowhere near that bad, but I think it’s safe to say that this kind of thing puts me off).&lt;/p&gt;
&lt;p&gt;Based on that, I probably wouldn’t have continued reading but, lucky for me, I was stuck on the plane back from said jaunt in the mediterranean so, on I delved into the next few chapters, and then the few after that. By the time I landed back in Blighty I was about a 3rd of the way through. My initial, pretty critical thoughts, were quashed and I was convinced. This was a good book. But now you’ve heard about how keen I am, here’s some more about the book itself. It’s premise is essentially, no brilliant person is really born brilliant. Sure, some have more innate talent than others, and that sure helps at becoming the best artist, scientist, musician. But really, the only true greats, or the majority at least are only there because of all the hard work that they’ve put into it on the way.&lt;/p&gt;
&lt;p&gt;And, probably more importantly, the people who are more successful are those who believed they could get better. This is the key premise, that there are 2 “mindsets”. The first, a fixed mindset where you assume you are as good as you are every going to be at things. Your talents are final and you’ll either be better than someone or worse and there’s little you can do to change that. The other mindset is the growth mindset. These guys think that their skills &amp;amp; intelligence aren’t limited. That with hard work and perseverance they can get better in the things they work at. The most surprising thing is that, even if these 2 people start off at exactly the same level of innate talent and ability, the one with the growth mindset will nearly always end up further/better/more successful than the fixed mindset guy.&lt;/p&gt;
&lt;p&gt;Personally, this was kind of a revelation to me. The person the book describes as the static mindset is/was me. I was the clever kid in school that didn’t really have to try hard to succeed (at first). I was the kid who was praised for being the talented top-of-the-class nerd and I was then the kid who eventually got too scared to try. Definitely the kid who didn’t want to try at something that he might fail at, so when he inevitably met other people who were better than him (usually because of all their hard work) he thought well, what’s the point? They’re better than me, and if I&amp;rsquo;m not the best person in the room when I try it I’ll just fail and look stupid, so why bother?&lt;/p&gt;
&lt;p&gt;Don’t get me wrong. I was also lazy. I preferred video games (there I tended to always be pretty awesome cause of all my practice :P) and I preferred drinking and smoking and generally achieving little. But as I look back on it, I definitely see a lot of the roots of my “laziness” in fear and ascertaining the dopamine rush of achievement from doing well, not from becoming better. I think this is key to any thoughts of “self-improvement” and (thank fuck!) something I got to later on in life. Nowadays, I love learning. I love getting better at things, and oddly, I really like helping other people get better too (sometimes even better than me). This kind-of-humility is hard, sometimes I struggle. Sometimes I have to force myself to ignore the fixed-mindset-demon in my head that gets his back up when someone critiques my work. But I do. I manage it, usually without much wasted time along the way. And because of that, I’ve gotten a lot better at a lot of things. I do a job I love at a place I consider to be at the top of my field. I work with super-talented people who I learn from all the time. I have a happy life with a lovely wife and we have a relationship that we work at daily, which makes it super-bloody-awesome.&lt;/p&gt;
&lt;p&gt;None of these things have been easy. But they’re worth it.&lt;/p&gt;
&lt;p&gt;So in all, this book didn’t really teach me to BE a growth mindset person. I’d already kind of figured that out. But this does help me name it, help me teach others about it and, importantly for me, it helps to remind myself every day, when I slip back into a fixed mindset from time to time, to steer back on course. Another added benefit I got from the book is that mindsets have categories. I’ve got a pretty growth mindset about coding and work and my relationship, but I’m still pretty fixed about art and music. I don’t think I have that aptitude and I now know that if I don’t think it’s possible, then it never will be. Maybe I should spend some time getting better at these things. Learning, working and forcing myself to grow in these directions. I strongly suspect I’d be a happier, healthier and more rounded person if I did so it’s something I plan to give a try.&lt;/p&gt;
&lt;p&gt;Anyways, &lt;a href=&#34;https://amzn.to/2ue7MhJ&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;go buy the book&lt;/a&gt;, read the book and then do the things the book tells you to do. Trust me, it helps and you’ll be glad you did it. Oh and, once you’ve read the book a few times and you’ve got the concepts to work on down, go give the book to someone else. Maybe someone you think might really benefit from it. I figure helping people is good self-medication too.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>7* Reasons Facebook is social cancer</title>
      <link>https://ilostmypage.com/posts/facebook-is-cancer/?gtm_referrer=rss</link>
      <pubDate>Sun, 09 Jul 2017 21:58:37 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/facebook-is-cancer/</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: there’s a lot of swearing in this post. Please add all of your complaints onto the first unrelated youtube video you can find - preferably something SJWy so you get the best trolls.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’ve finally gone and done it. That unconscionable, ruthless and nonsensical act tantamount to modern social suicide. I’ve deleted my Facebook account, and I do feel rather vitriolic about it :D.&lt;/p&gt;
&lt;p&gt;Backstory: Many moons back I avoided it like the plague but a pretty girl (my now wife) convinced me otherwise and for some time since having a Facebook account make sense to me. It kept me in touch with people I’d otherwise lose touch with and it gave me a good place to keep and share my pictures of things like this little self-indulgent life-journey I’m on. But recently, I&amp;rsquo;ve realised: that’s all complete and utter bollocks. So, I&amp;rsquo;ve gone ahead and deleted my Facebook account :D&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Side Note: I’ve had a range of reactions to this so far and I find the fact that anyone actually cares either way to be actually quite interesting, hence the rant.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here is why:&lt;/p&gt;
&lt;h2 id=&#34;white-noise&#34;&gt;White noise&lt;/h2&gt;
&lt;p&gt;My first facebook-is-bullshit inkling was the realisation: how many real friendships can one person foster? I simply don’t have the time or the ability to maintain a few hundred friendships, that’s ridiculous. And if the argument is “well Facebook friends are really just acquaintances, you don’t really act like they’re friends do you?”, then why the fuck do I want to know all the in’s and outs of these random fucking peoples lives? Just because we went to the same school or worked together for a few months in our first job? It feels like I know more about these chum(p)s than I do about the people I really should be spending my time focusing on. I know when they&amp;rsquo;ve gotten new jobs and how that tubby chap I care not-very-much about has managed to waddle his way to the end of a charity fun run. It&amp;rsquo;s info I don&amp;rsquo;t need and certainly don&amp;rsquo;t want at a volume that I simply can&amp;rsquo;t digest.&lt;/p&gt;
&lt;h2 id=&#34;keeping-in-touch&#34;&gt;Keeping in touch&lt;/h2&gt;
&lt;p&gt;And, for the actual people I do want to maintain ties with, Facebook sucks balls when it comes to maintaining a real friendship with these peeps. I’ve already read about their random lifetime achievements via their Facebook status so when it comes time to actually fucking talking to them, they&amp;rsquo;re telling me stuff I already knew. This means that conversations with people I’m supposed to care about bore me, as it&amp;rsquo;s now old news and getting through these chats is a repetitive chore that I have to sit through in the hopes of hearing something they didn&amp;rsquo;t put on their interweb feed.&lt;/p&gt;
&lt;p&gt;I’d posit that Facebook is actually a detriment to real friendships. It stops you talking to people, and I’ve started to think that being forced to speak to people, being forced to ask them about their lives, to form words that show caring and wanting to know about them is a part of forming that bond as well. They say that if you smile it makes you happy, because of the muscles in your face or something. Well maybe if you ask someone how they are and have an honest discourse about it, it’ll help you to care about them that little bit more too?&lt;/p&gt;
&lt;h2 id=&#34;getting-out-of-the-closet-no-not-like-that&#34;&gt;Getting out of the closet&amp;hellip;. no not like that&lt;/h2&gt;
&lt;p&gt;I guess this all kinda relates to the societal “bubble” issue we’re having of late and I think it kind of proves** how human social interactions need to be more complex than whatever Facebook’s news feed algorithms decide to tell you on the 32nd time you checked it today. We can&amp;rsquo;t and shouldn&amp;rsquo;t limit ourselves to the persona-buckets that it attempts to cram us into to fit its data/business-models and the more social communication we put through these heavily sorted channels the worse the problem is going to get.&lt;/p&gt;
&lt;h2 id=&#34;isnt-he-cuuuuute&#34;&gt;Isn&amp;rsquo;t he cuuuuute&lt;/h2&gt;
&lt;p&gt;And as for the photo-sharing thing, no-one really cares about your holiday/nomad/graduation/wedding/baby pictures, it’s just self-aggrandising. And if you still want to, go use one of the million better platforms to do it with all the other food-picture-wankers out there :D&lt;/p&gt;
&lt;h2 id=&#34;ltendrantgt&#34;&gt;&amp;lt;/endrant&amp;gt;&lt;/h2&gt;
&lt;p&gt;Anyways, back to normal scheduling next week***, I just felt like this little revelation I’d had was worth a ramble. There are many more eloquent and noble views on how naff Facebook is and how it’s fucking the internet. For info on that maybe try your internet search engine of choice. Hell, getting out of Facebook&amp;rsquo;s closed-internet hell-hole would probably be a good thing :P.&lt;/p&gt;
&lt;p&gt;* I may not be able/care to count… got you to click though eh? :P&lt;/p&gt;
&lt;p&gt;** Not actual proof in any way, I’m most likely waffling shit.&lt;/p&gt;
&lt;p&gt;*** Take that as whenever I get round to it :D.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Silence is golden; screaming children are hell</title>
      <link>https://ilostmypage.com/posts/silence-is-golden/?gtm_referrer=rss</link>
      <pubDate>Thu, 27 Apr 2017 21:30:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/silence-is-golden/</guid>
      <description>&lt;p&gt;Picked up a pair of &lt;a href=&#34;http://amzn.to/2p89D3u&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;noise cancelling headphones&lt;/a&gt; recently and life now contains significantly less of the mind-numbing drivel that I&amp;rsquo;m usually forced to put up with than it did before. Here&amp;rsquo;s some reasons why they&amp;rsquo;re a perfect fit for remote working &amp;amp; location independence.&lt;/p&gt;
&lt;p&gt;I guess the location that I&amp;rsquo;m writing this post in is perhaps influencing the amount of vitriol it contains. I&amp;rsquo;m in Barcelona airport after a short flight from &lt;a href=&#34;https://ilostmypage.com/lagos-portugal/&#34;&gt;Lagos&lt;/a&gt; and I can&amp;rsquo;t remember getting off a flight as chilled out as I feel right now (admittedly I&amp;rsquo;m halfway through a beer so that might help).&lt;/p&gt;
&lt;p&gt;The headphones in question are &lt;a href=&#34;http://amzn.to/2p89D3u&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Bose&amp;rsquo;s QuietComfort 20&amp;rsquo;s&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;First, the reasons that these headphones helped with my current state of chill (I think I&amp;rsquo;ll rate these with chill-factor from now on):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They cancel noise! Not all the noise, obviously, but a significant amount and, when listening to music, enough to get you past even the noisiest of environments like flights, buses, streets etc.&lt;/li&gt;
&lt;li&gt;The music in my ears sounds good. There&amp;rsquo;s a teensie bit of background hiss from the noise-cancelling but you can&amp;rsquo;t hear it at all when music is playing and barely otherwise.
And no, in case you haven&amp;rsquo;t guessed I&amp;rsquo;m not an &amp;ldquo;audiowanker&amp;rdquo;&lt;a href=&#34;#asterisks&#34;&gt;*&lt;/a&gt;, but i do like music that sounds not-shit. This music sounds not-shit. In fact it sounds pretty damn well good: good bass for in-ears and the sound quality is more than a match for my old bose over-ears. Which leads me to my next point.&lt;/li&gt;
&lt;li&gt;They&amp;rsquo;re in-ears! This makes them a butt-load easier to cart around in said plane-like environs and just for general wombling around. I&amp;rsquo;m not sure how comfy the &amp;ldquo;control-switch dangly bit&amp;rdquo;™ would be when exercising (and I&amp;rsquo;ll likely never know tubs), but for general plodding around town it&amp;rsquo;s perfectly fine. And not once have the buds felt anything other than suction-cupped into my ear-holes like the worms from &lt;a href=&#34;http://villains.wikia.com/wiki/Aliens_%28The_Faculty%29&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;The Faculty&lt;/a&gt;. It&amp;rsquo;s awesome. Begone over-ear head-sweat! #oversharer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, in summary, they are good headphones. I&amp;rsquo;d go as far as to say that they&amp;rsquo;re great headphones and, with built in microphone it makes the need for carrying a headset pretty redundant, meaning they&amp;rsquo;re ideal headphones for nomad-life. I use them daily for calls, travelling, coding and just about every moment of my life that I can in order to block out the monotony of others. Two thumbs up! 👍👍&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
    </item>
    
    <item>
      <title>The Algarve, Portugal</title>
      <link>https://ilostmypage.com/posts/lagos-portugal/?gtm_referrer=rss</link>
      <pubDate>Sat, 08 Apr 2017 12:30:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/lagos-portugal/</guid>
      <description>&lt;p&gt;So it turns out that the south of Portugal has beautiful coastlines, countryside, fishes, wine, sun, waves and even a nice southerly breeze. I&amp;rsquo;d ask you not to tell anyone but I think the cat&amp;rsquo;s already out of the bag&amp;hellip; fuckers.&lt;/p&gt;
&lt;p&gt;Well, I assume it is, otherwise why would there be so many &amp;ldquo;bloody foreigners&amp;rdquo; here? I use the phrase jovially but that was genuinely out of the mouth of some expat here when referring to all the tourists. Mad eh. (I think he voted UKIP&amp;hellip;)&lt;/p&gt;
&lt;p&gt;Anyways, in case you&amp;rsquo;ve missed the hint, the Algarve is Portugal&amp;rsquo;s worst-kept secret. It has all the requisite features to make hanging out with a beer outdoors an excellent experience, which is both excellent and dangerous as a place to work remotely from. I spent a month in Lagos, an expat/tourist-filled pretty little port town. I imagine it&amp;rsquo;s hell here in August but off-season it&amp;rsquo;s quiet enough to never worry about how busy a restaurant/bar is, the beach is empty, the tours are quiet and the sun is hot, but not that flay-your-skin kind of hot. There was admittedly a bit of rain for a few days, but meh, I barely noticed it in-between all the glorious sunshine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ilostmypage.com/img/lagos_sun_n_sea.jpg&#34; alt=&#34;A picture of the sea in Lagos&#34; title=&#34;Glorious sunshine innit.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Most of my time in Lagos was spent working or pootling around the town itself, and that&amp;rsquo;s not bad. Got &lt;a href=&#34;https://www.airbnb.com/c/jasonandkatiem&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;5 week&amp;rsquo;s of apartment&lt;/a&gt;* for ~900 Euro&amp;rsquo;s (by no means a huge place but the fiber was sweet and it had a cosy &amp;amp; quiet vibe) which was perfect for what I needed it for. The town is &amp;ldquo;Okay&amp;rdquo;. It&amp;rsquo;s very touristey and, no offence peeps, but the expats here are either 80 or that slightly-too-into-an-odd-combo-of-weed-and-buddhism side of hippy that makes for dreary and awkward pub-conversations. The restaurants and bars are decent. The food is worse than Lisbon but better than other places and the views are marina-filled and nice. All in all it&amp;rsquo;s average.&lt;/p&gt;
&lt;p&gt;But enough about the town, its brilliance comes from its &amp;lsquo;base&amp;rsquo;-ability (I should totes trademark that). For the first few weeks I didn&amp;rsquo;t get it. I stayed local. But then a buddy visited for a week and he hired a convertible**. Turns out the rest of the Algarve is excellent. It&amp;rsquo;s pretty sparsely laid out, there are beautiful coves, endless cliffs to walk along the top of, bits that are ace to wander up with a little bit of fear that the tide might not let you get down. Even the touristey lobster traps (get it, because they&amp;rsquo;re sun-burnt pink? &amp;hellip; like lobsters?  😛) such as &lt;a href=&#34;https://www.lonelyplanet.com/portugal/the-algarve/sagres&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sagres&lt;/a&gt; and &lt;a href=&#34;https://www.google.com/search?q=benagil&amp;amp;source=lnms&amp;amp;tbm=isch&amp;amp;sa=X&amp;amp;ved=0ahUKEwjRhbPz55TTAhXJvxQKHas9D1sQ_AUICSgC&amp;amp;biw=1680&amp;amp;bih=911&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Benagil&lt;/a&gt; are super-awesome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ilostmypage.com/img/convertible.jpg&#34; alt=&#34;A picture of 3 friends in a convertible&#34; title=&#34;Vrooooom and such funs.&#34;&gt;&lt;/p&gt;
&lt;p&gt;But, if an endless sea-scape isn&amp;rsquo;t your thing, the hills and forestey bits around here are superb. As a proud British northerner I tend to warble on about the brilliance of the North of England&amp;rsquo;s countryside (we got &lt;a href=&#34;http://www.visitlancashire.com/explore/west-pennine-moors&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;moors&lt;/a&gt; for days bruv). But today I know that we&amp;rsquo;ll never win when compared to the Algarve. Driving around the area on empty roads, singing terribly to 90&amp;rsquo;s britpop and soaking in the sights makes it impossible to keep up my usual grumpy frown. It&amp;rsquo;s like a sunny, better version of home.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ilostmypage.com/img/team-shot.jpg&#34; alt=&#34;A picture of 3 friends by a reservoir&#34; title=&#34;I&#39;m the one on the right whose almost smiling.&#34;&gt;&lt;/p&gt;
&lt;p&gt;So to summarise, I&amp;rsquo;m giving the Algarve a score of 347***&lt;/p&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Natural Coastal Beauty.&lt;/li&gt;
&lt;li&gt;Natural Non-Coastal Beauty.&lt;/li&gt;
&lt;li&gt;Some good historic-y tourist traps.&lt;/li&gt;
&lt;li&gt;Decent monthly-airbnb deals, especially if you avoid the peak seasons.&lt;/li&gt;
&lt;li&gt;Sun, Surf &amp;amp; Wine****&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fucktons of expats, either old-as-fuck or hippy-as-fuck.&lt;/li&gt;
&lt;li&gt;Food is mostly meh due to tourists.&lt;/li&gt;
&lt;li&gt;A Kayak bashed into my arm leaving a really big bruise which is something that could definitely happen to you too and so counts as a con&amp;hellip;. fuck kayaks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* Yes that&amp;rsquo;s my airbnb link, what of it? 😛&lt;/p&gt;
&lt;p&gt;** It wasn&amp;rsquo;t quite a &lt;a href=&#34;https://www.amazon.co.uk/gp/product/B00I954Q3A/ref=as_li_ss_tl?ie=UTF8&amp;amp;linkCode=ll1&amp;amp;tag=&amp;amp;linkId=517730e9d00ec6e5cda8c2ccd50679a8&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;big red shark&lt;/a&gt; but DAMN is it a fun way to get around a sunny country :D&lt;/p&gt;
&lt;p&gt;*** Scoring method yet to be decided.&lt;/p&gt;
&lt;p&gt;**** Seriously, I get the occasional Sangria but for more regular drinkings why not just stick to wine?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Lisbon, Portugal: First port of call</title>
      <link>https://ilostmypage.com/posts/lisbon/?gtm_referrer=rss</link>
      <pubDate>Thu, 16 Mar 2017 13:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/lisbon/</guid>
      <description>&lt;p&gt;Lisbon seems to be the western-european mecca for digital nomads at the minute so, to avoid using any brain-power
whatsoever, we made it our first stop. It was a good choice.&lt;/p&gt;
&lt;p&gt;We left Lisbon the weekend before last after a month there and I&amp;rsquo;ve finally gotten around to summing up my thoughts.
I think the most surprising thing about it is that it felt so comfortable after such a short period of time,
like a pair of comfy old shoes. The people are friendly, the food is plain but fresh &amp;amp; delicious and the weather,
for February, is a damn sight prettier than back home.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll admit, none of the above sounds like high praise, but Lisbon gives me the impression that it probably doesn&amp;rsquo;t
give a shit. That&amp;rsquo;s not to say that Lisbon isn&amp;rsquo;t worthy of high praise though. Far from it; from the Hipster-cool of
LX Factory, to the great drinking &amp;amp; eating around Cais do Sodré to the Basilica de Estrella - Lisbon really has some
excellent bits. But I found that while the &amp;ldquo;bits&amp;rdquo;, the neighbourhoods spread out and nestled in the bosom of Lisbon&amp;rsquo;s
many hills, are excellent, the part I loved was the in-between.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m definitely a fan of walking cities and Lisbon had me at hello on that point. On my first day in the city I was
wandering down alleys (always down or up Lisbon&amp;rsquo;s never-flat streets, never along), bumbling through gardens and coming across some
of the most excellent of vistas.
I think Lisbon mirrors San Francisco a lot (though probably the other way around) and
not just with &lt;a href=&#34;https://en.wikipedia.org/wiki/25_de_Abril_Bridge&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;the bridge thing&lt;/a&gt;. It has it&amp;rsquo;s different areas,
it has ridiculously steep hills and definitely has the beautiful watery vistas, but it exceeds it in the ability
to spend the day following your feet from neighbourhood to neighbourhood drinking in the sites and getting to
know the feel of the city. Drinking the excellent wine too, but then that&amp;rsquo;s a bit of a given.&lt;/p&gt;
&lt;p&gt;And neighbourhood isn&amp;rsquo;t a term to describe a set of blocks, or rough geographical approximation. These are actual
neighbourhoods. Locals heading down to their local bakery for a coffee, a snack and a loaf of bread for the day.
Family-run restaurants where regulars know they&amp;rsquo;re getting far tastier food for half the price as long as they don&amp;rsquo;t
mind putting up with a little less fancy of an affair.&lt;/p&gt;
&lt;p&gt;In retrospect, i think this is why I came to grips with Lisbon so quickly, or at least I think I did.
Each part of the city wears its heart on its sleeve and the character of the place shines through as soon as you plod
past it (have I mentioned all the walking, the comfy shoe thing is kinda relevant now huh 😊).
So even if parts are a bit touristy (though thankfully I missed most of that in Feb), the feeling is overwhelmingly
that of a thoroughly lived in and loved city, that knows and understands the rest of the world, but is pretty happy
sticking to the way the Portuguese do things.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty happy with that too I find. The food, the wine and the friendliness really make it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A Place Called Home</title>
      <link>https://ilostmypage.com/posts/a-place-called-home/?gtm_referrer=rss</link>
      <pubDate>Tue, 07 Mar 2017 22:30:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/a-place-called-home/</guid>
      <description>&lt;p&gt;One of the initial justifications for this international jaunt upon which I find myself was the goal of finding a new
forever home. A new place I can refer to myself as &amp;ldquo;being from&amp;rdquo; and somewhere that was empirically better than where
I&amp;rsquo;d been before.&lt;/p&gt;
&lt;p&gt;I tend to prefer innovation via trial-and-error in my professional life so surely the concept
would fit perfectly well when choosing where to eek out the rest of my years right?&lt;/p&gt;
&lt;p&gt;At a month in, I think I was, as per usual, rather naive. That&amp;rsquo;s not to say that I was wrong though. I do think that
this will be a damn good way to figure out the place, and probably more importantly the kind of place, that makes me
more happy. But I definitely don&amp;rsquo;t think it&amp;rsquo;s anywhere near as black and white as I thought it was. A lot of this isn&amp;rsquo;t
about finding happiness in a place, or maximising the number of daylight hours or minimising
living cost while maximising lifestyle. I think really the trick is to use the fun new experiences, events and
memories to help inform the kind of person I want to be and the lifestyle I want to have. I think in that way the
travelling is useful twofold: not only do I learn by having new experiences but it gives me an understanding of what
different parts of the world are like, and seeing how they&amp;rsquo;ll fit in with &amp;amp; support what is going to make me a
happier person.&lt;/p&gt;
&lt;p&gt;Now I realise, that this may sounds pretty fucking obvious to most. But I really did start out on this trip thinking
that it was a simple case of investigating the pros and cons, recording the HP, MP &amp;amp; DEX of all the places I go to and
using it all to work out the best of the top trump city cards to play for the next 50 years before I die. Thinking about
it now, that sounds bloody morbid doesn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;So, I &amp;rsquo;m going to crack on with mooching around the globe, seeing what bits of life keep the smiley face the right way
round and hopefully figuring out a bit more about what makes me tick.&lt;/p&gt;
&lt;p&gt;Heh, shit, maybe I just need a hobby? :D&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.giphy.com/media/HtejPDVCiBbAA/giphy.gif&#34; alt=&#34;A gif of a grumpy woman&#34; title=&#34;Grumpy April&#34;&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Hello World!</title>
      <link>https://ilostmypage.com/posts/hello-world/?gtm_referrer=rss</link>
      <pubDate>Wed, 15 Feb 2017 12:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/posts/hello-world/</guid>
      <description>&lt;p&gt;Here begins my blog. I&amp;rsquo;ve contemplated starting one of these for several years now but, like many things, I&amp;rsquo;ve only
just gotten around to actually doing it.&lt;/p&gt;
&lt;p&gt;As an introduction to me: I&amp;rsquo;m a British nerd from the internet, wot travels a bit. As such, a lot of the things I
write about will be nerdy, internety or experiences from the things I come across on my travels
(&lt;a href=&#34;https://ilostmypage.com/about&#34;&gt;more about me&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This blog is all about giving a more geeky/developerey/introverted viewpoint on the world of remote-working whilst
travelling the world (digital nomadism if you&amp;rsquo;re not afraid of labels). I&amp;rsquo;ll try and be useful where I can and,
where I can&amp;rsquo;t, I&amp;rsquo;ll at least try and keep it interesting.&lt;/p&gt;
&lt;p&gt;Anywho, that&amp;rsquo;s hello for now. If you have any thoughts, requests or suggestions then hit me up on
&lt;a href=&#34;https://twitter.com/chibette&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;twitter&lt;/a&gt; and hope this lil blog o&amp;rsquo; mine can be of some use.&lt;/p&gt;
&lt;p&gt;Happy Trails!&lt;/p&gt;
&lt;p&gt;- Jason&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>About</title>
      <link>https://ilostmypage.com/about/?gtm_referrer=rss</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://ilostmypage.com/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m Jason Kelly, a Software Developer from the wonderfully rainy city of Manchester, England. After far too long under the oppressive British gloom I&amp;rsquo;ve decided it&amp;rsquo;s time for a change and I&amp;rsquo;m using my freedom as a remote-worker to explore the world. As you probably assumed from &amp;ldquo;Software Developer&amp;rdquo;, I&amp;rsquo;m a pretty nerdy and introverted kinda guy but I&amp;rsquo;m using the excuse of worldwide travel to try and get as far out of my comfort zone as I can manage.&lt;/p&gt;
&lt;p&gt;On this blog you&amp;rsquo;ll find&amp;hellip; well I&amp;rsquo;m not 100% sure yet, but it&amp;rsquo;ll be part geek, part travel and hopefully a little bit interesting. If you have any hints, tips, konami codes, critiques or just down-right corrections then hit me up on &lt;a href=&#34;https://twitter.com/chibette&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;twitter&lt;/a&gt; and, in the meantime, hope you enjoy the blog ☺ (I&amp;rsquo;ll try and keep the emoji use to a minimum, I promise).&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>